feat(ai): commandes @/ & skills, analyse d'images et capacites des modeles (#81)
CI / lint (push) Successful in 1m10s
CI / security (push) Successful in 43s
CI / test (push) Successful in 2m34s
CI / build (push) Successful in 43s
CI / e2e (push) Successful in 10m59s

This commit is contained in:
2026-09-12 11:38:46 -04:00
parent 88bb817a62
commit f049e208b6
25 changed files with 2581 additions and 31 deletions
+68
View File
@@ -0,0 +1,68 @@
# #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`) : `/research`, `/create-new-skill`, `/resume`,
`/actions`, `/reformuler`, `/correction`, `/brainstorm`, `/plan`, `/ask`, `/meeting-note`,
`/livrable`. 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 <nom>`,
`/model <nom>`, `/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`).
## 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.