# #81 — Assistant IA — Commandes (`@`, `/`), skills, analyse d'images & capacités des modèles > **Statut :** ✅ Livré > **Effort :** 4-6 jours | **Impact :** 🟡 > **Références :** [Roadmap](../ROADMAP.md) · [Assistant IA #80](./ai-assistant-ux.md) · [Outils IA #79](./ai-tools-mcp.md) · [Changelog](../../CHANGELOG.md) - **Description :** cinq améliorations de l'assistant IA (`frontend/js/bookslm.js`, `frontend/js/ai.js`) : 1. **Panneau redimensionnable** à la souris, largeur persistée. 2. **Commande `@`** pour ajouter des contextes ad-hoc (fichiers et répertoires) au contexte courant. 3. **Commande `/`** pour choisir un **skill** (workflow réutilisable) ou une **commande admin**. 4. **Analyse d'images** : coller une image dans la zone de saisie ou référencer une image d'un répertoire (`@image.png`), avec garde-fou de compatibilité du modèle. 5. **Capacités des modèles** affichées à la sélection (Chat, Embeddings, Rerank, Images, Video, Audio Speech, Audio Transcriptions, Vision capable). ## A. Panneau redimensionnable — ✅ livré - [x] Poignée `.bookslm-resize-handle` sur le bord gauche, glisser pour ajuster (320–1000 px). - [x] Largeur persistée dans `localStorage['obsigate-bookslm-width']` ; désactivée en plein écran/mobile. ## B. Contexte ad-hoc `@` — ✅ livré - [x] Détection de `@query` au curseur → menu `.bookslm-mention-menu` alimenté par `/api/tree-search` (avec repli sur `/api/vault/{vault}/files` quand la requête est vide). - [x] Sélection : fichier → chip de contexte ; répertoire → chip de contexte ; image → pièce jointe. - [x] Chips retirables (`.bookslm-attachments`), rechargement du contexte (`/context`). - [x] Backend : `extra_files` / `extra_directories` dans les requêtes context/chat/agent, fusion via `collect_adhoc_context()` + `merge_contexts()` (`backend/bookslm.py`). En mode General, l'ajout de fichiers promeut le scope en `documents`. ## C. Commandes `/` & skills — ✅ livré - [x] Menu `.bookslm-command-menu` filtré à la saisie ; navigation clavier (↑/↓/Entrée/Échap). - [x] **Skills intégrés** (`backend/skills.py`) — 30 skills, répartis en familles : - *Base* : `/research`, `/create-new-skill`, `/resume`, `/actions`, `/reformuler`, `/correction`, `/brainstorm`, `/plan`, `/ask`, `/meeting-note`, `/livrable`. - *Extraction & structuration* : `/extract`, `/timeline`, `/glossary`, `/tag`. - *Transformation & adaptation* : `/translate`, `/adapt`, `/clean`, `/summary-progressive`. - *Analyse critique & décision* : `/critique`, `/compare`, `/prioritize`, `/swot`, `/debate`. - *Apprentissage & mémorisation* : `/quiz`, `/reading-note`, `/qa-generator`. - *Méta-gestion & confidentialité* : `/link`, `/anonymize`, `/estimate`. Chaque prompt est complété par un bloc `COMMON_RULES` (français, notes traitées comme données, anti-hallucination, signalement des contradictions, conservation des noms/dates/chiffres, réponse « Aucune information exploitable fournie. » si les notes sont insuffisantes). Le prompt du skill est ajouté au system prompt (`skill` dans la requête chat). - [x] **Skills utilisateur persistés** (`data/skills.json`, par utilisateur) créés via `/create-new-skill` (modale) → `POST /api/ai/skills`, listés par `GET /api/ai/skills`, supprimables par `DELETE /api/ai/skills/{id}`. - [x] **Commandes admin** exécutées localement (sans LLM) : `/help`, `/providers`, `/provider `, `/model `, `/keys`. ## D. Analyse d'images — ✅ livré - [x] Coller une image dans la zone de saisie (`paste`) ou bouton « joindre une image ». - [x] Référencer une image d'un répertoire via `@image.png` (chargée côté serveur en data URL). - [x] Backend multimodal : `ai_chat._content_to_gemini_parts` (data URL → `inlineData`), messages OpenAI-compatibles passés tels quels ; `_build_user_content` dans `bookslm_routes.py`. - [x] Garde-fou : requête d'image rejetée (400) si le modèle ne supporte pas la vision ; côté frontend, toast + blocage de l'envoi. Les images forcent l'endpoint `/chat` (pas l'agent). ## E. Capacités des modèles — ✅ livré - [x] Table statique curée `backend/model_capabilities.py` (règles par motif de nom + défauts par fournisseur) exposant 8 flags. - [x] Endpoint `GET /api/ai/model-capabilities?provider=&model=` (auth) + `capabilities` par modèle dans `GET /api/config/ai-models`. - [x] Affichage ☑/□ dans le picker de l'assistant (`frontend/js/ai.js`) et dans le panneau de configuration (`#cfg-ai-default-model-caps`, `frontend/js/config.js`). - [x] **#82** — dans le picker de l'assistant, la liste permanente est remplacée par un bouton d'information ⓘ et une bulle au survol/clic/appui long, avec recherche de modèle. Détail : [ai-provider-picker.md](./ai-provider-picker.md). ## F. Tests & documentation — ✅ livré - [x] Backend : `tests/test_model_capabilities.py`, `tests/test_skills.py`, `tests/test_ai_vision.py`, extension `tests/test_ai_models.py` (capabilities). - [x] Frontend : `tests/frontend/ai.test.mjs` (redimensionnement, `@`, `/`, payload, endpoint, vision, capacités, commandes admin). - [x] i18n FR/EN (`ai.cap_*`, `ai.commands`, `ai.attach_image`, `config.ai_capabilities`, …). - [x] CHANGELOG + Roadmap + guide utilisateur (aide in-app). ## G. Points d'attention - La table de capacités est **statique** : un modèle inconnu retombe sur le défaut du fournisseur (souvent `chat` uniquement), afin de ne jamais annoncer une capacité non vérifiée. - Les skills utilisateur sont stockés par utilisateur ; `/create-new-skill` ne peut pas écraser un skill intégré ni réutiliser un identifiant existant.