From 9c0c4f50ec391c07f9734fb93218ecedae51749f Mon Sep 17 00:00:00 2001 From: Gregor's Bot Date: Fri, 9 Jan 2026 16:10:53 +0100 Subject: [PATCH] Agents: test per-agent model fallbacks override --- src/agents/model-fallback.test.ts | 68 +++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/agents/model-fallback.test.ts b/src/agents/model-fallback.test.ts index 097044754..a3db38ac5 100644 --- a/src/agents/model-fallback.test.ts +++ b/src/agents/model-fallback.test.ts @@ -156,6 +156,74 @@ describe("runWithModelFallback", () => { ]); }); + it("uses fallbacksOverride instead of agents.defaults.model.fallbacks", async () => { + const cfg = { + agents: { + defaults: { + model: { + fallbacks: ["openai/gpt-5.2"], + }, + }, + }, + } as ClawdbotConfig; + + const calls: Array<{ provider: string; model: string }> = []; + + const res = await runWithModelFallback({ + cfg, + provider: "anthropic", + model: "claude-opus-4-5", + fallbacksOverride: ["openai/gpt-4.1"], + run: async (provider, model) => { + calls.push({ provider, model }); + if (provider === "anthropic") { + throw new Error("primary failed"); + } + if (provider === "openai" && model === "gpt-4.1") { + return "ok"; + } + throw new Error(`unexpected candidate: ${provider}/${model}`); + }, + }); + + expect(res.result).toBe("ok"); + expect(calls).toEqual([ + { provider: "anthropic", model: "claude-opus-4-5" }, + { provider: "openai", model: "gpt-4.1" }, + ]); + }); + + it("treats an empty fallbacksOverride as disabling global fallbacks", async () => { + const cfg = { + agents: { + defaults: { + model: { + fallbacks: ["openai/gpt-5.2"], + }, + }, + }, + } as ClawdbotConfig; + + const calls: Array<{ provider: string; model: string }> = []; + + await expect( + runWithModelFallback({ + cfg, + provider: "anthropic", + model: "claude-opus-4-5", + fallbacksOverride: [], + run: async (provider, model) => { + calls.push({ provider, model }); + throw new Error("primary failed"); + }, + }), + ).rejects.toThrow("primary failed"); + + expect(calls).toEqual([ + { provider: "anthropic", model: "claude-opus-4-5" }, + ]); + }); + it("falls back on missing API key errors", async () => { const cfg = makeCfg(); const run = vi