feat(ai): commandes @/ & skills, analyse d'images et capacites des modeles (#81)
This commit is contained in:
@@ -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.
|
||||
Reference in New Issue
Block a user