fix(ai): la liste des fournisseurs de l'assistant suit la configuration (BUG-043)
Le picker lit /api/ai/status une seule fois, à sa construction, et le panneau de l'assistant est un singleton monté pour toute la session : ajouter ou supprimer une clé API dans la configuration du projet laissait la liste des fournisseurs figée jusqu'à un rechargement de page. - ai.js : nouveau refreshAIPickers() qui reconstruit chaque picker monté dans son emplacement .ai-picker-slot (constante PICKER_SLOT_CLASS) ; le slot est conservé même sans fournisseur configuré, donc le premier fournisseur ajouté s'y monte aussi ; une sélection persistée dont le fournisseur n'est plus configuré est purgée de obsigate_ai_picker (retour au défaut, plus de modèle fantôme dans le déclencheur). - bookslm.js : l'emplacement .bookslm-picker-host porte la classe ai-picker-slot et reste dans la barre (replaceChildren au lieu de replaceWith). - config.js : refreshAIPickers() après saveAIKeys() et deleteAIKey(). - tests : +4 tests JSDOM (ajout/retrait dans la barre, premier montage dans un slot vide, purge de la sélection orpheline, câblage save/delete). Vérifié : tests frontend 66/66 (IA) + 9 suites JSDOM, validate-imports 36 modules, pytest 963 passed / 6 skipped, ruff 0, et contrôle navigateur (Playwright) sur l'instance de test — ajout de nvidia visible sans rechargement, retrait effectif + sélection réinitialisée.
This commit is contained in:
@@ -95,6 +95,23 @@
|
||||
barre latérale désormais que le bouton ⓘ est en tête de groupe.
|
||||
- [x] Test JSDOM : l'ordre des trois contrôles visibles est vérifié (`tests/frontend/ai.test.mjs`).
|
||||
|
||||
## K. Synchronisation de la liste des fournisseurs (BUG-043) — ✅ livré
|
||||
- [x] `frontend/js/ai.js` : nouveau `refreshAIPickers()` — reconstruit chaque picker
|
||||
monté dans son emplacement `.ai-picker-slot` (constante `PICKER_SLOT_CLASS`).
|
||||
Le slot est conservé même quand aucun picker ne peut être construit (aucun
|
||||
fournisseur configuré), donc le **premier** fournisseur ajouté s'y monte aussi.
|
||||
- [x] `frontend/js/bookslm.js` : l'emplacement du picker (`span.bookslm-picker-host`)
|
||||
porte la classe `ai-picker-slot` et **reste dans la barre** — le picker est monté
|
||||
à l'intérieur au lieu de remplacer le host (`replaceChildren`).
|
||||
- [x] `frontend/js/config.js` : `refreshAIPickers()` appelé après l'enregistrement
|
||||
(`saveAIKeys()`) et la suppression (`deleteAIKey()`) d'une clé API.
|
||||
- [x] Une sélection persistée dont le fournisseur n'est plus configuré est purgée de
|
||||
`obsigate_ai_picker` (fournisseur **et** modèle effacés → retour au défaut, plus
|
||||
de nom de modèle fantôme dans le déclencheur).
|
||||
- [x] Tests JSDOM : ajout/retrait d'un fournisseur dans la barre de l'assistant,
|
||||
montage du premier fournisseur dans un slot vide, purge de la sélection orpheline,
|
||||
et garde-fou sur le câblage `saveAIKeys`/`deleteAIKey` (`tests/frontend/ai.test.mjs`).
|
||||
|
||||
## I. Points d'attention
|
||||
- La table de capacités reste **statique** (`backend/model_capabilities.py`) : un modèle inconnu
|
||||
retombe sur le défaut du fournisseur.
|
||||
|
||||
Reference in New Issue
Block a user