Files
ObsiGate/docs/features/ai-provider-picker.md
T
bruno 7f0e34d318
CI / lint (push) Successful in 1m9s
CI / security (push) Successful in 43s
CI / test (push) Successful in 1m58s
CI / build (push) Successful in 41s
CI / e2e (push) Successful in 10m31s
fix(ai): liste de modeles corrompue et cles i18n brutes (BUG-009)
Locales chargees en cache no-store + SW_VERSION v4 pour eviter les cles brutes (fr.json obsolete). Picker : styles critiques en ligne (popover/liste/options), plafond de 200 modeles avec indicateur, et non-chevauchement entre la liste de modeles et la bulle de capacites.
2026-09-12 13:15:27 -04:00

51 lines
3.3 KiB
Markdown

# #82 — Assistant IA — Section « Fournisseur & modèle » compacte
> **Statut :** ✅ Livré (en attente de validation utilisateur)
> **Effort :** 1 jour | **Impact :** 🟢
> **Références :** [Roadmap](../ROADMAP.md) · [Assistant IA #81](./ai-assistant-commands.md) · [Changelog](../../CHANGELOG.md)
- **Description :** rendre la barre de sélection du modèle de l'assistant IA **plus discrète** tout
en conservant les informations utiles :
1. **Capacités via bulle** — la liste complète des types d'endpoints (Chat, Embeddings, Rerank,
Images, Video, Audio Speech, Audio Transcriptions, Vision) n'est plus affichée en permanence.
Un bouton **ⓘ** révèle une bulle d'information au **survol**, au **clic** ou par **appui long**
(mobile).
2. **Recherche de modèle** — le `<select>` natif est remplacé par une liste déroulante compacte
dotée d'un **champ de recherche** qui filtre les modèles en tapant (insensible à la casse et
aux accents).
3. **Compatibilité** — un `<select class="ai-picker-model">` masqué reste présent (source de
vérité) pour les commandes admin `/model` et l'état persisté `obsigate_ai_picker`.
## A. Picker partagé — ✅ livré
- [x] `frontend/js/ai.js` : `buildAIPickerUI()` réécrit (provider compact + combobox modèle + bulle
capacités). Le picker reste partagé par l'assistant (`bookslm.js`) et la barre d'édition IA.
- [x] `renderCapabilityList()` conservé et affiché dans la bulle (le panneau de configuration
`#cfg-ai-default-model-caps` continue de l'utiliser directement).
- [x] Fermeture des popovers au clic extérieur via un unique listener délégué (pas de fuite).
- [x] i18n FR/EN (`ai.model_search`, `ai.model_info`).
## B. Correctifs associés — ✅ livré
- [x] **BUG-007** — détection `/` et `@` Unicode + filtrage insensible aux accents + navigation
clavier ↑/↓ fiabilisée (jeton de séquence, `scrollIntoView`).
- [x] **BUG-008** — contexte ad-hoc `@` pris en compte en mode Général côté backend
(`backend/bookslm_routes.py`) et recherche de mention sur `vault=all` sans vault courant.
## C. Tests — ✅ livré
- [x] `tests/frontend/ai.test.mjs` : filtrage accentué, mentions accentuées, navigation ↑/↓,
recherche de modèle + bulle de capacités, plafonnement des longues listes (OpenRouter).
- [x] `tests/test_bookslm.py` : contexte ad-hoc en mode Général (`/chat`).
## D. Durcissement anti-cache (BUG-009) — ✅ livré
- [x] Locales chargées avec `cache: 'no-store'` (`frontend/js/i18n.js`) : plus de clés brutes
affichées à cause d'un `fr.json` obsolète en cache HTTP.
- [x] `SW_VERSION` incrémenté (`frontend/sw.js`) pour purger les caches du service worker.
- [x] Styles critiques du picker appliqués **en ligne** (popover absolu, liste en colonne, options
`display:block`) pour rester corrects même si `style.css` est servi depuis un cache.
- [x] Rendu plafonné à 200 modèles (`MODEL_RENDER_LIMIT`) + indicateur `ai.model_more`.
## E. 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.
- Le select masqué est conservé uniquement pour la rétro-compatibilité ; ne pas le supprimer sans
migrer `_cmdSwitchModel` / `_applyPickerSelection` dans `frontend/js/bookslm.js`.