



















@@ -89,12 +89,86 @@ function mergeConfigPatch<T>(base: T, patch: unknown): T {
8989return next as T;
9090}
919192+function normalizeAgentModelConfigForWrite(value: unknown): unknown {
93+if (typeof value === "string") {
94+return normalizeAgentModelRefForConfig(value);
95+}
96+if (!isPlainRecord(value)) {
97+return value;
98+}
99+100+const next: Record<string, unknown> = { ...value };
101+if (typeof next.primary === "string") {
102+next.primary = normalizeAgentModelRefForConfig(next.primary);
103+}
104+if (Array.isArray(next.fallbacks)) {
105+next.fallbacks = next.fallbacks.map((fallback) =>
106+typeof fallback === "string" ? normalizeAgentModelRefForConfig(fallback) : fallback,
107+);
108+}
109+return next;
110+}
111+112+function mergeModelEntryConfig(existing: unknown, incoming: unknown): unknown {
113+if (!isPlainRecord(existing) || !isPlainRecord(incoming)) {
114+return incoming;
115+}
116+117+const existingParams = isPlainRecord(existing.params) ? existing.params : undefined;
118+const incomingParams = isPlainRecord(incoming.params) ? incoming.params : undefined;
119+return {
120+ ...existing,
121+ ...incoming,
122+ ...(existingParams || incomingParams
123+ ? { params: { ...existingParams, ...incomingParams } }
124+ : undefined),
125+};
126+}
127+128+function normalizeAgentModelMapForWrite(value: unknown): unknown {
129+if (!isPlainRecord(value)) {
130+return value;
131+}
132+133+const next: Record<string, unknown> = {};
134+for (const [key, entry] of Object.entries(value)) {
135+const normalizedKey = normalizeAgentModelRefForConfig(key);
136+next[normalizedKey] = mergeModelEntryConfig(next[normalizedKey], entry);
137+}
138+return next;
139+}
140+141+function normalizeConfigModelRefsForWrite(cfg: OpenClawConfig): OpenClawConfig {
142+const defaults = cfg.agents?.defaults;
143+if (!defaults) {
144+return cfg;
145+}
146+147+const nextDefaults: NonNullable<NonNullable<OpenClawConfig["agents"]>["defaults"]> = {
148+ ...defaults,
149+};
150+if (defaults.model !== undefined) {
151+nextDefaults.model = normalizeAgentModelConfigForWrite(defaults.model) as typeof defaults.model;
152+}
153+if (defaults.models !== undefined) {
154+nextDefaults.models = normalizeAgentModelMapForWrite(defaults.models) as typeof defaults.models;
155+}
156+157+return {
158+ ...cfg,
159+agents: {
160+ ...cfg.agents,
161+defaults: nextDefaults,
162+},
163+};
164+}
165+92166export function applyProviderAuthConfigPatch(
93167cfg: OpenClawConfig,
94168patch: unknown,
95169options?: { replaceDefaultModels?: boolean },
96170): OpenClawConfig {
97-const merged = mergeConfigPatch(cfg, patch);
171+const merged = normalizeConfigModelRefsForWrite(mergeConfigPatch(cfg, patch));
98172if (!options?.replaceDefaultModels || !isPlainRecord(patch)) {
99173return merged;
100174}
@@ -105,7 +179,7 @@ export function applyProviderAuthConfigPatch(
105179return merged;
106180}
107181108-return {
182+return normalizeConfigModelRefsForWrite({
109183 ...merged,
110184agents: {
111185 ...merged.agents,
@@ -117,7 +191,7 @@ export function applyProviderAuthConfigPatch(
117191>["models"],
118192},
119193},
120-};
194+});
121195}
122196123197export function applyDefaultModel(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。