





























@@ -1,6 +1,7 @@
11import fs from "node:fs";
22import type { Command } from "commander";
33import JSON5 from "json5";
4+import { normalizeConfiguredProviderCatalogModelId } from "../agents/model-ref-shared.js";
45import { readConfigFileSnapshot, replaceConfigFile } from "../config/config.js";
56import { AUTO_MANAGED_CONFIG_META_PATHS } from "../config/io.meta.js";
67import { formatConfigIssueLines, normalizeConfigIssues } from "../config/issue-format.js";
@@ -116,30 +117,136 @@ function normalizeAgentDefaultModelValueForConfigMutation(value: unknown): unkno
116117return next;
117118}
118119120+function normalizeAgentListModelRefsForConfigMutation(value: unknown): unknown {
121+if (!Array.isArray(value)) {
122+return value;
123+}
124+125+let mutated = false;
126+const next = value.map((agent) => {
127+if (!isPlainRecord(agent)) {
128+return agent;
129+}
130+131+let nextAgent = agent;
132+if (Object.prototype.hasOwnProperty.call(agent, "model")) {
133+const model = normalizeAgentDefaultModelValueForConfigMutation(agent.model);
134+if (model !== agent.model) {
135+nextAgent = { ...nextAgent, model };
136+mutated = true;
137+}
138+}
139+if (isPlainRecord(agent.models)) {
140+const models = normalizeAgentModelMapForConfig(agent.models);
141+if (models !== agent.models) {
142+nextAgent = { ...nextAgent, models };
143+mutated = true;
144+}
145+}
146+return nextAgent;
147+});
148+149+return mutated ? next : value;
150+}
151+152+function normalizeProviderCatalogModelsForConfigMutation(
153+provider: string,
154+models: unknown,
155+): unknown {
156+if (!Array.isArray(models)) {
157+return models;
158+}
159+160+let mutated = false;
161+const next = models.map((model) => {
162+if (!isPlainRecord(model) || typeof model.id !== "string") {
163+return model;
164+}
165+const trimmed = model.id.trim();
166+if (!trimmed) {
167+return model;
168+}
169+const id = normalizeConfiguredProviderCatalogModelId(provider, trimmed);
170+if (id === model.id) {
171+return model;
172+}
173+mutated = true;
174+return { ...model, id };
175+});
176+177+return mutated ? next : models;
178+}
179+180+function normalizeModelProviderRefsForConfigMutation(
181+providers: NonNullable<OpenClawConfig["models"]>["providers"] | undefined,
182+): unknown {
183+if (!isPlainRecord(providers)) {
184+return providers;
185+}
186+187+let mutated = false;
188+const nextProviders: Record<string, unknown> = { ...providers };
189+for (const [provider, providerConfig] of Object.entries(providers)) {
190+if (!isPlainRecord(providerConfig)) {
191+continue;
192+}
193+const models = normalizeProviderCatalogModelsForConfigMutation(provider, providerConfig.models);
194+if (models === providerConfig.models) {
195+continue;
196+}
197+nextProviders[provider] = { ...providerConfig, models };
198+mutated = true;
199+}
200+201+return mutated ? nextProviders : providers;
202+}
203+119204function normalizeConfigMutationModelRefs(cfg: OpenClawConfig): OpenClawConfig {
120205const defaults = cfg.agents?.defaults;
121-if (!defaults) {
122-return cfg;
123-}
206+const agentList = cfg.agents?.list;
207+const providers = cfg.models?.providers;
208+const normalizedAgentList = normalizeAgentListModelRefsForConfigMutation(agentList);
209+const normalizedProviders = normalizeModelProviderRefsForConfigMutation(providers) as
210+| typeof providers
211+| undefined;
124212125213return {
126214 ...cfg,
127-agents: {
128- ...cfg.agents,
129-defaults: {
130- ...defaults,
131- ...(defaults.model !== undefined
132- ? {
133-model: normalizeAgentDefaultModelValueForConfigMutation(
134-defaults.model,
135-) as typeof defaults.model,
136-}
137- : undefined),
138- ...(defaults.models !== undefined
139- ? { models: normalizeAgentModelMapForConfig(defaults.models) }
140- : undefined),
141-},
142-},
215+ ...(defaults || normalizedAgentList !== agentList
216+ ? {
217+agents: {
218+ ...cfg.agents,
219+ ...(defaults
220+ ? {
221+defaults: {
222+ ...defaults,
223+ ...(defaults.model !== undefined
224+ ? {
225+model: normalizeAgentDefaultModelValueForConfigMutation(
226+defaults.model,
227+) as typeof defaults.model,
228+}
229+ : undefined),
230+ ...(defaults.models !== undefined
231+ ? { models: normalizeAgentModelMapForConfig(defaults.models) }
232+ : undefined),
233+},
234+}
235+ : undefined),
236+ ...(normalizedAgentList !== agentList
237+ ? { list: normalizedAgentList as typeof agentList }
238+ : undefined),
239+},
240+}
241+ : undefined),
242+ ...(normalizedProviders !== providers
243+ ? {
244+models: {
245+ ...cfg.models,
246+providers: normalizedProviders,
247+},
248+}
249+ : undefined),
143250};
144251}
145252此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。