feat(ai): services partages A2 + SSE streaming B4 + confirmations UI B5 (#79)
CI / lint (push) Successful in 58s
CI / security (push) Successful in 40s
CI / test (push) Successful in 1m15s
CI / build (push) Successful in 37s
CI / e2e (push) Successful in 10m15s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s
CI / lint (push) Successful in 58s
CI / security (push) Successful in 40s
CI / test (push) Successful in 1m15s
CI / build (push) Successful in 37s
CI / e2e (push) Successful in 10m15s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s
This commit is contained in:
@@ -82,7 +82,7 @@ ObsiGate possède aujourd'hui **deux sous-systèmes IA** qui partagent la même
|
||||
|
||||
1. **Pas de tool calling** : parsing regex fragile, pas de résultats structurés, pas de multi-étapes.
|
||||
2. **2 actions seulement** (`create_file`, `create_directory`) ; ni lecture active, ni recherche, ni édition, ni suppression exposées au modèle.
|
||||
3. **SSE non réellement streaming** : la réponse complète est envoyée en un seul événement — `backend/bookslm_routes.py:211`.
|
||||
3. **SSE** : ~~non réellement streaming~~ → **corrigé** (B4) : `ai_chat.stream_completion` alimente `/api/ai/bookslm/chat` token par token ; le tool-calling (`/agent`) reste non-streaming (les appels d'outils exigent la réponse complète).
|
||||
4. **`PROVIDERS` chargé une seule fois** : les modèles par défaut ne sont modifiables que par variables d'environnement (pas de persistance UI).
|
||||
|
||||
---
|
||||
@@ -93,6 +93,22 @@ ObsiGate possède aujourd'hui **deux sous-systèmes IA** qui partagent la même
|
||||
|
||||
Extraire la logique métier des routes de `backend/main.py` vers des fonctions réutilisables (services). Les routes REST, l'agent in-app et le serveur MCP appellent ces mêmes services.
|
||||
|
||||
**Nouveau module `backend/services/` (A2 — lecture/recherche) :**
|
||||
|
||||
```
|
||||
backend/services/
|
||||
├── errors.py # ServiceError (code + status HTTP)
|
||||
├── paths.py # resolve_safe_path (anti path-traversal, source unique)
|
||||
├── vaults.py # list_accessible_vaults, browse_directory, get_vault_root
|
||||
├── files.py # read_raw_file, read_file_text (redaction + quota)
|
||||
└── search.py # search_vaults (pagination), list_tags
|
||||
```
|
||||
|
||||
Les routes `/api/vaults`, `/api/browse/{vault}`, `/api/file/{vault}/raw`, `/api/search` et
|
||||
`/api/tags` en sont de simples wrappers, tout comme les outils `list_vaults`, `list_directory`,
|
||||
`read_file`, `search_fulltext` et `list_tags`. Un `ServiceError` est traduit en `HTTPException`
|
||||
(handler global de `backend/main.py`) ou en `ToolError` (`backend/tools/registry.py`).
|
||||
|
||||
**Nouveau module `backend/tools/` :**
|
||||
|
||||
```
|
||||
@@ -129,7 +145,9 @@ boucle (max N itérations):
|
||||
```
|
||||
|
||||
- Fallback protocole texte (`obsigate-action`) si le modèle ne supporte pas les tools.
|
||||
- SSE réellement streaming.
|
||||
- SSE réellement streaming sur `/chat` (`ai_chat.stream_completion`) ; `/agent` reste buffered
|
||||
(les appels d'outils exigent la réponse complète avant exécution). Confirmations UI en deux temps
|
||||
(`confirmation` → `confirm`/`confirm_messages`).
|
||||
|
||||
### 3.4 Couche 4 — Serveur MCP
|
||||
|
||||
@@ -288,7 +306,8 @@ Voir `docs/ROADMAP.md` (item dédié) pour le détail des activités.
|
||||
## 9. Références
|
||||
|
||||
- `backend/ai.py`, `backend/ai_routes.py` — couche fournisseurs + actions éditeur
|
||||
- `backend/ai_chat.py` — chat completion provider-agnostique avec tool calling (OpenAI-compat + Gemini)
|
||||
- `backend/services/` — logique métier partagée (vaults, files, search) consommée par les routes et les outils
|
||||
- `backend/ai_chat.py` — chat completion provider-agnostique avec tool calling et streaming (OpenAI-compat + Gemini)
|
||||
- `backend/agent/loop.py` — agent loop in-app (multi-étapes, LLM injectable)
|
||||
- `backend/bookslm.py`, `backend/bookslm_routes.py` — assistant contextuel (+ endpoint `/agent`)
|
||||
- `frontend/js/ai.js`, `frontend/js/bookslm.js` — UI IA
|
||||
|
||||
Reference in New Issue
Block a user