feat(ai): commandes @/ & skills, analyse d'images et capacites des modeles (#81)
This commit is contained in:
@@ -297,6 +297,30 @@ Pour répondre au besoin de cibler un fournisseur/modèle sans dépendre uniquem
|
||||
|
||||
---
|
||||
|
||||
## 6bis. Skills, commandes, vision & capacités (#81)
|
||||
|
||||
- **Skills & commandes `/`** — `backend/skills.py` définit les skills intégrés (id, icône, description,
|
||||
prompt) et les métadonnées des commandes admin. Les skills utilisateur sont persistés par
|
||||
utilisateur dans `data/skills.json`. Endpoints : `GET/POST /api/ai/skills`,
|
||||
`DELETE /api/ai/skills/{id}`. Le champ `skill` d'une requête chat/agent injecte le prompt du skill
|
||||
dans le system prompt (`_resolve_system_prompt`). Les commandes admin (`/help`, `/providers`,
|
||||
`/provider`, `/model`, `/keys`) sont exécutées côté client.
|
||||
- **Contexte ad-hoc `@`** — champs `extra_files` / `extra_directories` sur les requêtes
|
||||
context/chat/agent ; collecte et fusion par `collect_adhoc_context()` + `merge_contexts()`
|
||||
(`backend/bookslm.py`).
|
||||
- **Vision** — les messages peuvent porter un contenu multimodal (tableau OpenAI
|
||||
`text` + `image_url`). `backend/ai_chat.py` convertit les data URLs en `inlineData` Gemini
|
||||
(`_content_to_gemini_parts`) ; l'OpenAI-compatible passe le tableau tel quel. Les images viennent
|
||||
d'un copier-coller (base64) ou d'un fichier de vault (data URL chargée par
|
||||
`load_vault_image_data_url`). Garde-fou : `_validate_vision_support` rejette (400) une requête
|
||||
d'image si le modèle n'est pas vision.
|
||||
- **Capacités** — table statique curée `backend/model_capabilities.py` (8 flags : chat, embeddings,
|
||||
rerank, images, video, audio_speech, audio_transcription, vision). Exposée par
|
||||
`GET /api/ai/model-capabilities` et par le champ `capabilities` de `GET /api/config/ai-models` ;
|
||||
affichée dans le picker de l'assistant et le panneau de configuration.
|
||||
|
||||
---
|
||||
|
||||
## 7. Plan par phases
|
||||
|
||||
| Phase | Contenu | Livrable |
|
||||
|
||||
+2
-1
@@ -94,6 +94,7 @@
|
||||
| 62 | Collaboration temps réel — Édition simultanée (Yjs/CRDT, WebSocket, awareness) | 2.3.0 | [features/collaboration.md](./features/collaboration.md) |
|
||||
| 79 | Assistant IA — Outils (function calling) & serveur MCP | 2.3.0 | [features/ai-tools-mcp.md](./features/ai-tools-mcp.md) |
|
||||
| 80 | Assistant IA — Rendu Markdown, liens fichiers/paths & sessions | 2.3.0 | [features/ai-assistant-ux.md](./features/ai-assistant-ux.md) |
|
||||
| 81 | Assistant IA — Commandes (`@`, `/`), skills, images & capacités des modèles | 2.3.0 | [features/ai-assistant-commands.md](./features/ai-assistant-commands.md) |
|
||||
| 69 | Éditeur mobile natif — Interface tactile optimisée | 2.3.0 | [features/mobile-editor.md](./features/mobile-editor.md) |
|
||||
| 70 | Recherche sémantique — Embeddings vectoriels (hybride TF-IDF + RRF) | 2.3.0 | [features/semantic-search.md](./features/semantic-search.md) |
|
||||
| 77 | Application Desktop native — Tauri | 🔵 en cours | [features/desktop-tauri.md](./features/desktop-tauri.md) |
|
||||
@@ -104,7 +105,7 @@
|
||||
|
||||
| Priorité | Items | Effort total estimé |
|
||||
|---|---|---|
|
||||
| ✅ Complété | #1 → #59, #61–72, #74–76, #78–80 | ~103 jours réalisés |
|
||||
| ✅ Complété | #1 → #59, #61–72, #74–76, #78–81 | ~107 jours réalisés |
|
||||
| 🔵 P2 restant | #77 Desktop : signature de code (non retenue), 6 tests E2E **manuels** ([protocole](./DESKTOP_E2E_CHECKLIST.md)) | ~0,5-1 jour |
|
||||
| ⚪ P4 restant | #73 Sync (6-8j) | 6-8 jours |
|
||||
| **Total restant** | **2 items + finitions** | **~7-10 jours** |
|
||||
|
||||
@@ -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