From 3368284b2a94b9bf621a5e51b5d1937791c947de Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 13 Jan 2026 06:49:26 +0000 Subject: [PATCH] fix: per-agent model fallbacks (#583) (thanks @mitschabaude-bot) --- CHANGELOG.md | 1 + src/agents/model-fallback.test.ts | 2 +- src/auto-reply/reply/agent-runner.ts | 2 +- src/auto-reply/reply/directive-handling.ts | 4 +--- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 179c404cb..f9a52a764 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Cron: accept ISO timestamps for one-shot schedules (UTC) and allow optional delete-after-run; wired into CLI + macOS editor. - Gateway: add Tailscale binary discovery, custom bind mode, and probe auth retry for password changes. (#740 — thanks @jeffersonwarrior) - Agents: add compaction mode config with optional safeguard summarization for long histories. (#700 — thanks @thewilloftheshadow) +- Agents: support per-agent model fallbacks via `agents.list[].model`. (#583 — thanks @mitschabaude-bot) - Tools: add tool profiles plus group shorthands for tool policy allow/deny (global, per-agent, sandbox). ### Fixes diff --git a/src/agents/model-fallback.test.ts b/src/agents/model-fallback.test.ts index a3db38ac5..ea846eabb 100644 --- a/src/agents/model-fallback.test.ts +++ b/src/agents/model-fallback.test.ts @@ -177,7 +177,7 @@ describe("runWithModelFallback", () => { run: async (provider, model) => { calls.push({ provider, model }); if (provider === "anthropic") { - throw new Error("primary failed"); + throw Object.assign(new Error("nope"), { status: 401 }); } if (provider === "openai" && model === "gpt-4.1") { return "ok"; diff --git a/src/auto-reply/reply/agent-runner.ts b/src/auto-reply/reply/agent-runner.ts index 771b111c9..a25c55d92 100644 --- a/src/auto-reply/reply/agent-runner.ts +++ b/src/auto-reply/reply/agent-runner.ts @@ -1,8 +1,8 @@ import crypto from "node:crypto"; import fs from "node:fs"; +import { resolveAgentModelFallbacksOverride } from "../../agents/agent-scope.js"; import { runCliAgent } from "../../agents/cli-runner.js"; import { getCliSessionId, setCliSessionId } from "../../agents/cli-session.js"; -import { resolveAgentModelFallbacksOverride } from "../../agents/agent-scope.js"; import { lookupContextTokens } from "../../agents/context.js"; import { DEFAULT_CONTEXT_TOKENS } from "../../agents/defaults.js"; import { resolveModelAuthMode } from "../../agents/model-auth.js"; diff --git a/src/auto-reply/reply/directive-handling.ts b/src/auto-reply/reply/directive-handling.ts index 9b1748324..95345e116 100644 --- a/src/auto-reply/reply/directive-handling.ts +++ b/src/auto-reply/reply/directive-handling.ts @@ -1,10 +1,8 @@ -import { resolveClawdbotAgentDir } from "../../agents/agent-paths.js"; import { - resolveAgentConfig, resolveAgentDir, + resolveAgentModelPrimary, resolveDefaultAgentId, resolveSessionAgentId, - resolveAgentModelPrimary, } from "../../agents/agent-scope.js"; import { isProfileInCooldown,