export class FakeLLMClient { constructor(opts = {}) { this.delayMs = opts.delayMs ?? 10; this.plan = opts.plan ?? []; // suite d'événements: 'ok' | {err:{statusCode:429|500|...}} | fn this.calls = []; this._i = 0; this.defaultUsage = { prompt_tokens: 100, completion_tokens: 150 }; this.prefix = opts.prefix ?? 'FAKE'; } async invoke(input, { model='fake-1' } = {}) { this.calls.push({ input, model, t: Date.now() }); await new Promise(r => setTimeout(r, this.delayMs)); const step = this.plan[this._i++] ?? 'ok'; if (typeof step === 'function') return step(input, {model}); if (step?.err) { const e = new Error(`fake error ${step.err.statusCode}`); e.statusCode = step.err.statusCode; throw e; } const text = typeof input === 'string' ? input : JSON.stringify(input); return { completion: `${this.prefix}[${model}]::` + text.slice(0, 80), usage: this.defaultUsage }; } }