import { describe, it, expect } from 'vitest'; import { runAgent } from '../src/agent'; const PROVIDER = (process.env.PROVIDER as 'deepseek' | 'openai') ?? 'deepseek'; const MODEL = process.env.MODEL ?? 'deepseek-v4-flash'; const CFG = { provider: PROVIDER, model: MODEL, maxSteps: 6 }; const TIMEOUT = 90000; describe('Omniloq spike — tests d\'acceptation (AI SDK + MCP fictif)', () => { it('1. "Bonjour" → réponse directe, 0 tool call', async () => { const r = await runAgent('Bonjour', CFG); expect(r.text.trim().length).toBeGreaterThan(0); expect(r.toolCalls.length).toBe(0); }, TIMEOUT); it('2. "Quel est mon solde ?" → choisit get_balance → réponse finale', async () => { const r = await runAgent('Quel est mon solde ?', CFG); expect(r.toolCalls.some((t) => t.name === 'get_balance')).toBe(true); expect(r.text).toMatch(/150|solde/i); }, TIMEOUT); it('3. Deux tools successifs → boucle multi-step correcte', async () => { const r = await runAgent( 'Liste les créneaux disponibles le 2026-09-23, puis réserve le créneau de 14:00.', CFG ); expect(r.toolCalls.length).toBeGreaterThanOrEqual(2); expect(r.steps).toBeGreaterThanOrEqual(2); }, TIMEOUT); it('4. MCP renvoie une erreur → l\'agent ne fabrique PAS un succès', async () => { const r = await runAgent('Réserve-moi un rendez-vous le 2026-09-23 à 16:00.', CFG); expect(r.text.toLowerCase()).toMatch(/déjà|erreur|pris|indisponible|pas disponible/i); }, TIMEOUT); it('5. maxSteps atteint → arrêt propre, pas de boucle infinie', async () => { const r = await runAgent( 'Fais tout : vérifie mon solde, liste les créneaux, réserve un rendez-vous, re-vérifie le solde.', { ...CFG, maxSteps: 2 } ); expect(r.steps).toBeLessThanOrEqual(2); }, TIMEOUT); it('6. Sortie = final answer + métadonnées, jamais de champ reasoning', async () => { const r = await runAgent('Quel est mon solde ?', CFG); const keys = Object.keys(r).sort(); expect(keys).toEqual(['finishReason', 'steps', 'text', 'toolCalls', 'usage'].sort()); expect(r.text).not.toMatch(/wait|let me|hmm|je vais réfléchir|raisonnement/i); }, TIMEOUT); });