81 lines
5.7 KiB
Markdown
81 lines
5.7 KiB
Markdown
# #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 <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`).
|
||
- [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.
|