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.
This commit is contained in:
קרמבוט 2026-01-29 17:22:54 +02:00
parent 5f4715acfc
commit c3e4426a27
2 changed files with 31 additions and 5 deletions

View File

@ -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<string, { alias?: string }> = {
...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;
}

View File

@ -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: {