From c3e4426a274528a5e94dd60ee26067e478804875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D7=A7=D7=A8=D7=9E=D7=91=D7=95=D7=98?= Date: Thu, 29 Jan 2026 17:22:54 +0200 Subject: [PATCH] fix: apply default model aliases even when no user models configured Previously, applyModelDefaults would return early if cfg.agents.defaults.models was empty, which meant the DEFAULT_MODEL_ALIASES (opus, sonnet, gpt, etc.) were never added to the config. This caused isolated cron sessions to fail with 'Unknown model' errors when using aliases like 'sonnet'. Now we always iterate through DEFAULT_MODEL_ALIASES and add them to the config, creating model entries if they don't exist. --- src/config/defaults.ts | 8 +++---- src/config/model-alias-defaults.test.ts | 28 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/config/defaults.ts b/src/config/defaults.ts index 82aada474..c21022aae 100644 --- a/src/config/defaults.ts +++ b/src/config/defaults.ts @@ -211,18 +211,16 @@ export function applyModelDefaults(cfg: MoltbotConfig): MoltbotConfig { } const existingAgent = nextCfg.agents?.defaults; - if (!existingAgent) return mutated ? nextCfg : cfg; - const existingModels = existingAgent.models ?? {}; - if (Object.keys(existingModels).length === 0) return mutated ? nextCfg : cfg; + const existingModels = existingAgent?.models ?? {}; const nextModels: Record = { ...existingModels, }; + // Always apply default model aliases, creating entries if they don't exist for (const [alias, target] of Object.entries(DEFAULT_MODEL_ALIASES)) { const entry = nextModels[target]; - if (!entry) continue; - if (entry.alias !== undefined) continue; + if (entry?.alias !== undefined) continue; // User already defined an alias nextModels[target] = { ...entry, alias }; mutated = true; } diff --git a/src/config/model-alias-defaults.test.ts b/src/config/model-alias-defaults.test.ts index 5b6863aba..1bfc5975e 100644 --- a/src/config/model-alias-defaults.test.ts +++ b/src/config/model-alias-defaults.test.ts @@ -4,6 +4,34 @@ import { applyModelDefaults } from "./defaults.js"; import type { MoltbotConfig } from "./types.js"; describe("applyModelDefaults", () => { + it("adds default aliases even when no user models are configured", () => { + // Regression test: previously applyModelDefaults returned early when + // agents.defaults.models was empty, causing cron jobs using aliases + // like "sonnet" to fail with "Unknown model" errors. + const cfg = {} satisfies MoltbotConfig; + const next = applyModelDefaults(cfg); + + expect(next.agents?.defaults?.models?.["anthropic/claude-opus-4-5"]?.alias).toBe("opus"); + expect(next.agents?.defaults?.models?.["anthropic/claude-sonnet-4-5"]?.alias).toBe("sonnet"); + expect(next.agents?.defaults?.models?.["openai/gpt-5.2"]?.alias).toBe("gpt"); + expect(next.agents?.defaults?.models?.["openai/gpt-5-mini"]?.alias).toBe("gpt-mini"); + expect(next.agents?.defaults?.models?.["google/gemini-3-pro-preview"]?.alias).toBe("gemini"); + expect(next.agents?.defaults?.models?.["google/gemini-3-flash-preview"]?.alias).toBe( + "gemini-flash", + ); + }); + + it("adds default aliases when agents.defaults exists but models is empty", () => { + const cfg = { + agents: { + defaults: {}, + }, + } satisfies MoltbotConfig; + const next = applyModelDefaults(cfg); + + expect(next.agents?.defaults?.models?.["anthropic/claude-sonnet-4-5"]?.alias).toBe("sonnet"); + }); + it("adds default aliases when models are present", () => { const cfg = { agents: {