From ee26a90bf56de425fa8f22bb82f190265501fc03 Mon Sep 17 00:00:00 2001 From: SidQin-cyber Date: Thu, 26 Feb 2026 15:19:39 +0800 Subject: [PATCH] fix(config): preserve agent-level apiKey/baseUrl during models.json merge When ensureOpenClawModelsJson runs in merge mode, the shallow merge { ...existingProviders, ...providers } causes the main config to overwrite agent-level models.json entries entirely. This drops any apiKey or baseUrl that the user set specifically for an agent. Preserve existing agent-level apiKey and baseUrl when merging, while still accepting all other updates (model catalog, api type, etc.) from the newly computed provider config. Closes #27243 --- src/agents/models-config.ts | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/agents/models-config.ts b/src/agents/models-config.ts index 4b38b824398..3b02737eb4c 100644 --- a/src/agents/models-config.ts +++ b/src/agents/models-config.ts @@ -142,7 +142,30 @@ export async function ensureOpenClawModelsJson( string, NonNullable[string] >; - mergedProviders = { ...existingProviders, ...providers }; + mergedProviders = {}; + for (const [key, entry] of Object.entries(existingProviders)) { + mergedProviders[key] = entry; + } + for (const [key, newEntry] of Object.entries(providers)) { + const existing = existingProviders[key] as + | (NonNullable[string] & { + apiKey?: string; + baseUrl?: string; + }) + | undefined; + if (existing) { + const preserved: Record = {}; + if (typeof existing.apiKey === "string" && existing.apiKey) { + preserved.apiKey = existing.apiKey; + } + if (typeof existing.baseUrl === "string" && existing.baseUrl) { + preserved.baseUrl = existing.baseUrl; + } + mergedProviders[key] = { ...newEntry, ...preserved }; + } else { + mergedProviders[key] = newEntry; + } + } } }