# Omniloq — Spike Phase 0 (résultats) Date : 22 sept 2026 · Runtime : Vercel AI SDK 7 (`ai@7.0.110`, `@ai-sdk/mcp@2.0.55`, `@modelcontextprotocol/sdk@1.30.0`) ## Objectif Répondre à UNE question : **AI SDK peut-il être le petit moteur fiable entre un message, un LLM et des tools MCP ?** Sans aucune dépendance à Nchargi ni à la DB. Le MCP de test est un « garage » fictif (get_balance, list_available_slots, book_appointment). ## Résultat : ✅ VALIDÉ ### 6/6 tests d'acceptation passent avec DeepSeek (`deepseek-v4-flash`) | # | Test | Résultat | Latence | |---|---|---|---| | 1 | « Bonjour » → réponse directe, 0 tool call | ✅ | 1,5 s | | 2 | « Quel est mon solde ? » → get_balance → réponse | ✅ | 2,9 s | | 3 | Deux tools successifs → boucle multi-step | ✅ | 4,1 s | | 4 | MCP renvoie une erreur → pas de succès fabriqué | ✅ | 3,2 s | | 5 | maxSteps atteint → arrêt propre, pas de boucle infinie | ✅ | 3,5 s | | 6 | Sortie = final answer + métadonnées, jamais de reasoning | ✅ | 2,2 s | Total : 17,9 s (6 tests). ### Provider/model interchangeable (par design, pas par accident) - Le runtime prend `runAgent(message, { provider, model, maxSteps })` — le provider est une **config**, pas du code hardcodé. - **Config-swap démontré** : `deepseek-v4-flash` → `deepseek-v4-pro` → même code, réponse correcte (« Votre solde est de 150,00 DH »). - **OpenAI** : le runtime a basculé vers `@ai-sdk/openai` sans aucune modification, l'appel est parti correctement vers l'API OpenAI — mais la **clé OpenAI est inactive** (`Your account is not active, please check your billing details`). Bloqué par le billing, **pas par le runtime**. → Pour un test 2e-provider réel, fournir une clé OpenAI active (ou OpenRouter/Groq). ## ⚠️ Découverte technique importante (piège AI SDK 7) En **AI SDK 7**, `maxSteps` est **supprimé**. Le code compile, mais la boucle multi-step ne s'exécute pas : `finishReason: "tool-calls"` après 1 seul step, `text` vide. Le bon paramètre est : ```typescript import { generateText, stepCountIs } from 'ai'; generateText({ model, tools, stopWhen: stepCountIs(N), // ← pas maxSteps ... }); ``` Sans `stepCountIs`, l'agent s'arrête après le 1er tool call (texte vide). C'est le bug qui a fait échouer 3 tests au premier run, et qu'il faut documenter pour la Phase 1. ## Fichiers ``` packages/core/ ├── src/mock-mcp-server.ts # MCP fictif stdio (garage de démo, 3 tools) ├── src/agent.ts # runAgent() : boucle AI SDK + MCP + stopWhen ├── src/spike.ts # CLI (message + PROVIDER/MODEL/MAX_STEPS en env) └── test/acceptance.test.ts # les 6 tests d'acceptation (paramétrables par env) ``` ## Verdict **Oui, AI SDK 7 peut porter le runtime Omniloq.** Les deux hypothèses centrales sont confirmées : 1. AI SDK porte la boucle agent (tool calling, multi-step, erreurs, maxSteps). 2. Provider interchangeable par config (démontré par config-swap ; le test OpenAI est bloqué par une clé inactive, pas par le runtime). Prochaine étape : **Phase 0.5** (AgentRevision, AgentRun, ToolCall, vraie structure Message) puis **Phase 1** (socle données + les 3 corrections de la revue : lease persistant, dédup DB-unique, nettoyage relations Prisma).