feat: connecteurs Discord/Telegram/MCP + outils MCP dynamiques au registre (v7.57.0)
- presets Discord / Telegram : colonnes kind + auth (bearer/bot/none) sur
agent_connectors (migration 34) ; Discord envoie le jeton préfixé dans
l'en-tête d'autorisation, Telegram le place dans l'URL via le substitut
{secret} remplacé à l'appel — jamais stocké en clair
- Teams : scope ChannelMessage.Read.All ajouté aux Graph scopes M365
- app/services/mcp_client.py : handshake initialize → notifications/initialized
→ tools/list → tools/call (JSON-RPC 2.0, réponse JSON ou premier data: d'un
text/event-stream), garde SSRF, outils cachés en base (tools_json) —
le bouton « Tester » rejoue le handshake
- ToolRegistry._all() merge le cache MCP à chaque run : outils exposés au LLM
sous mcp_<serveur>_<outil> avec leur inputSchema, dispatch tools/call ;
serveur désactivé → outil absent du schéma, échec réseau → ToolResult(error)
- menu + : champ Type dans le formulaire connecteur (preset URL + auth),
badge « · N outil(s) » sur la fiche d'un serveur MCP
- tests : tests/test_v757_mcp_discord.py (12 tests, 0 appel réseau réel) ;
suite complète 1331 verts, ruff 0, eslint 0
- livraison : VERSION + app/main = 7.57.0, OpenAPI 523 chemins, CHANGELOG,
ROADMAP phase 7 cochée, avenant phase 7 dans docs/V74_Agent_Plus_Menu.md
This commit is contained in:
@@ -202,6 +202,27 @@ transaction par migration — A31).
|
||||
Chaque phase se clôt par : `ruff` + suite verte, bump de version, CHANGELOG, ROADMAP
|
||||
à jour, tag.
|
||||
|
||||
## 9bis. Avenant phase 7 (v7.57.0) — décisions livrées
|
||||
|
||||
- **D5 (`probe/list_sources/fetch` par adapter) écartée** : 1 switch sur
|
||||
`agent_connectors.kind` dans `probe()` / `connector_fetch()` — une interface
|
||||
à 3 méthodes pour 4 kinds tordrait plus qu'elle ne simplifie ; ajouter un
|
||||
kind = 1 branche de plus dans le même switch.
|
||||
- **Discord / Telegram = presets du socle**, pas 3 adapters dédiés : le champ
|
||||
**Type** du formulaire pré-remplit l'URL + le schéma d'auth
|
||||
(`bearer`/`bot`/`none`). La Bot API de Telegram impose le jeton **dans l'URL**
|
||||
→ substitut `{secret}` remplacé à l'appel (`connectors._with_secret`),
|
||||
stockage = motif seul, test « le jeton n'est jamais en base ».
|
||||
- **MCP : outils dynamiques sans état** — `ToolRegistry._all()` relit le cache
|
||||
`tools_json` à chaque run (rien à invalider, « Tester » suffit) ; nom LLM
|
||||
`mcp_<serveur>_<outil>` (slug sans double soulignement) ; dispatch
|
||||
`tools/call` dans `McpTool.execute()`. Serveur désactivé → outil **absent du
|
||||
schéma**, échec réseau → `ToolResult(error)` : le run continue toujours.
|
||||
- **Pas de client SSE à l'état** : `parse_body()` lit le JSON direct ou le
|
||||
premier `data:` d'un `text/event-stream`, ce qui couvre
|
||||
`initialize` / `tools/list` / `tools/call` des serveurs streamables courants.
|
||||
Upgrade : client SSE persistant si un serveur ne répond qu'en flux.
|
||||
|
||||
## 10. Hors périmètre
|
||||
|
||||
- Écriture dans les sources distantes (Google Docs, Slack…) — lecture seule au départ.
|
||||
|
||||
Reference in New Issue
Block a user