From b4e2c254edcf918e5d028215063104d6d89d16c0 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 12 Nov 2025 21:35:55 +0000 Subject: [PATCH] =?UTF-8?q?Feature:=20Recherche=20et=20mod=C3=A8le=20par?= =?UTF-8?q?=20d=C3=A9faut=20dans=20l'assistant=20IA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Améliorations du chatbox IA: Système de recherche: - Ajout d'un champ de recherche pour filtrer les modèles par nom ou ID - Filtre en temps réel pendant la saisie - Interface avec liste scrollable des modèles (max-h-32) Système de modèle par défaut: - Possibilité de définir un modèle comme favori (étoile ★) - Sauvegarde du modèle par défaut dans localStorage - Chargement automatique du modèle par défaut à l'ouverture du chatbox - Indication visuelle: étoile jaune pleine (★) pour le modèle par défaut, étoile vide (☆) pour les autres Interface améliorée: - Remplacement du select natif par une liste interactive - Highlighting du modèle sélectionné (bg-accent) - Hover effect sur les modèles - Bouton étoile cliquable sans sélectionner le modèle (stopPropagation) L'utilisateur peut maintenant facilement trouver et définir son modèle préféré qui sera automatiquement sélectionné à chaque ouverture. --- src/pages/Index.tsx | 92 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 75 insertions(+), 17 deletions(-) diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index 47fd352..67714b3 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -96,6 +96,8 @@ const Index = () => { const [chatInput, setChatInput] = useState(""); const [chatLoading, setChatLoading] = useState(false); const [selectedModel, setSelectedModel] = useState(""); + const [defaultModel, setDefaultModel] = useState(""); + const [modelSearchQuery, setModelSearchQuery] = useState(""); // Debounce timer for auto-save const saveTimerRef = useRef(null); @@ -527,6 +529,14 @@ const Index = () => { chatEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [chatMessages]); + // Load default model from localStorage on mount + useEffect(() => { + const savedDefaultModel = localStorage.getItem('defaultAiModel'); + if (savedDefaultModel) { + setDefaultModel(savedDefaultModel); + } + }, []); + // Load models when chatbox opens useEffect(() => { if (chatOpen && openRouterModels.length === 0) { @@ -537,9 +547,22 @@ const Index = () => { // Set default model when models are loaded useEffect(() => { if (openRouterModels.length > 0 && !selectedModel) { - setSelectedModel(openRouterModels[0].id); + // If there's a default model saved, use it + if (defaultModel && openRouterModels.find(m => m.id === defaultModel)) { + setSelectedModel(defaultModel); + } else { + // Otherwise use the first model + setSelectedModel(openRouterModels[0].id); + } } - }, [openRouterModels, selectedModel]); + }, [openRouterModels, selectedModel, defaultModel]); + + // Save default model to localStorage + const handleSetDefaultModel = (modelId: string) => { + setDefaultModel(modelId); + localStorage.setItem('defaultAiModel', modelId); + showSuccess("Modèle par défaut défini"); + }; const confirmAddUser = async (username: string, password: string, isAdmin: boolean) => { try { @@ -2266,25 +2289,60 @@ const Index = () => { -
- setModelSearchQuery(e.target.value)} + className="text-xs h-8" + disabled={loadingModels} + /> + + {/* Models list */} +
{loadingModels ? ( - +
+ Chargement des modèles... +
) : openRouterModels.length === 0 ? ( - +
+ Aucun modèle disponible +
) : ( - openRouterModels.map(model => ( - - )) + openRouterModels + .filter(model => + model.name.toLowerCase().includes(modelSearchQuery.toLowerCase()) || + model.id.toLowerCase().includes(modelSearchQuery.toLowerCase()) + ) + .map(model => ( +
setSelectedModel(model.id)} + > + {model.name} + +
+ )) )} - +