diff --git a/src/commands/models/set-image.ts b/src/commands/models/set-image.ts index 0b15ff5e6..920418e4f 100644 --- a/src/commands/models/set-image.ts +++ b/src/commands/models/set-image.ts @@ -1,34 +1,10 @@ import type { RuntimeEnv } from "../../runtime.js"; import { logConfigUpdated } from "../../config/logging.js"; -import { - mergePrimaryFallbackConfig, - type PrimaryFallbackConfig, - resolveModelTarget, - updateConfig, -} from "./shared.js"; +import { applyDefaultModelPrimaryUpdate, updateConfig } from "./shared.js"; export async function modelsSetImageCommand(modelRaw: string, runtime: RuntimeEnv) { const updated = await updateConfig((cfg) => { - const resolved = resolveModelTarget({ raw: modelRaw, cfg }); - const key = `${resolved.provider}/${resolved.model}`; - const nextModels = { ...cfg.agents?.defaults?.models }; - if (!nextModels[key]) { - nextModels[key] = {}; - } - return { - ...cfg, - agents: { - ...cfg.agents, - defaults: { - ...cfg.agents?.defaults, - imageModel: mergePrimaryFallbackConfig( - cfg.agents?.defaults?.imageModel as unknown as PrimaryFallbackConfig | undefined, - { primary: key }, - ), - models: nextModels, - }, - }, - }; + return applyDefaultModelPrimaryUpdate({ cfg, modelRaw, field: "imageModel" }); }); logConfigUpdated(runtime); diff --git a/src/commands/models/set.ts b/src/commands/models/set.ts index a6291f726..d0506acbd 100644 --- a/src/commands/models/set.ts +++ b/src/commands/models/set.ts @@ -1,34 +1,10 @@ import type { RuntimeEnv } from "../../runtime.js"; import { logConfigUpdated } from "../../config/logging.js"; -import { - mergePrimaryFallbackConfig, - type PrimaryFallbackConfig, - resolveModelTarget, - updateConfig, -} from "./shared.js"; +import { applyDefaultModelPrimaryUpdate, updateConfig } from "./shared.js"; export async function modelsSetCommand(modelRaw: string, runtime: RuntimeEnv) { const updated = await updateConfig((cfg) => { - const resolved = resolveModelTarget({ raw: modelRaw, cfg }); - const key = `${resolved.provider}/${resolved.model}`; - const nextModels = { ...cfg.agents?.defaults?.models }; - if (!nextModels[key]) { - nextModels[key] = {}; - } - return { - ...cfg, - agents: { - ...cfg.agents, - defaults: { - ...cfg.agents?.defaults, - model: mergePrimaryFallbackConfig( - cfg.agents?.defaults?.model as unknown as PrimaryFallbackConfig | undefined, - { primary: key }, - ), - models: nextModels, - }, - }, - }; + return applyDefaultModelPrimaryUpdate({ cfg, modelRaw, field: "model" }); }); logConfigUpdated(runtime); diff --git a/src/commands/models/shared.ts b/src/commands/models/shared.ts index 9f65eebf8..64439ef60 100644 --- a/src/commands/models/shared.ts +++ b/src/commands/models/shared.ts @@ -169,6 +169,37 @@ export function mergePrimaryFallbackConfig( return next; } +export function applyDefaultModelPrimaryUpdate(params: { + cfg: OpenClawConfig; + modelRaw: string; + field: "model" | "imageModel"; +}): OpenClawConfig { + const resolved = resolveModelTarget({ raw: params.modelRaw, cfg: params.cfg }); + const key = `${resolved.provider}/${resolved.model}`; + + const nextModels = { ...params.cfg.agents?.defaults?.models }; + if (!nextModels[key]) { + nextModels[key] = {}; + } + + const defaults = params.cfg.agents?.defaults ?? {}; + const existing = (defaults as Record)[params.field] as + | PrimaryFallbackConfig + | undefined; + + return { + ...params.cfg, + agents: { + ...params.cfg.agents, + defaults: { + ...defaults, + [params.field]: mergePrimaryFallbackConfig(existing, { primary: key }), + models: nextModels, + }, + }, + }; +} + export { modelKey }; export { DEFAULT_MODEL, DEFAULT_PROVIDER };