This commit is contained in:
Maxim Veksler 2026-01-30 17:05:38 +05:30 committed by GitHub
commit 1468315935
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 31 additions and 5 deletions

View File

@ -211,18 +211,16 @@ export function applyModelDefaults(cfg: OpenClawConfig): OpenClawConfig {
} }
const existingAgent = nextCfg.agents?.defaults; const existingAgent = nextCfg.agents?.defaults;
if (!existingAgent) return mutated ? nextCfg : cfg; const existingModels = existingAgent?.models ?? {};
const existingModels = existingAgent.models ?? {};
if (Object.keys(existingModels).length === 0) return mutated ? nextCfg : cfg;
const nextModels: Record<string, { alias?: string }> = { const nextModels: Record<string, { alias?: string }> = {
...existingModels, ...existingModels,
}; };
// Always apply default model aliases, creating entries if they don't exist
for (const [alias, target] of Object.entries(DEFAULT_MODEL_ALIASES)) { for (const [alias, target] of Object.entries(DEFAULT_MODEL_ALIASES)) {
const entry = nextModels[target]; const entry = nextModels[target];
if (!entry) continue; if (entry?.alias !== undefined) continue; // User already defined an alias
if (entry.alias !== undefined) continue;
nextModels[target] = { ...entry, alias }; nextModels[target] = { ...entry, alias };
mutated = true; mutated = true;
} }

View File

@ -4,6 +4,34 @@ import { applyModelDefaults } from "./defaults.js";
import type { OpenClawConfig } from "./types.js"; import type { OpenClawConfig } from "./types.js";
describe("applyModelDefaults", () => { 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", () => { it("adds default aliases when models are present", () => {
const cfg = { const cfg = {
agents: { agents: {