From 00475ce2b5059023ece9e1823ae84ccf46f4f962 Mon Sep 17 00:00:00 2001 From: Haze <709547807@qq.com> Date: Fri, 6 Feb 2026 03:26:39 +0800 Subject: [PATCH] fix(auth): configure OpenClaw default model when saving provider - Add setOpenClawDefaultModel() to write the correct model to ~/.openclaw/openclaw.json based on the selected provider - Maps: openrouter -> openrouter/anthropic/claude-sonnet-4, anthropic -> anthropic/claude-sonnet-4, etc. - Call setOpenClawDefaultModel on provider:save IPC handler - Fixes "No API key found for provider anthropic" when user configured OpenRouter (wrong default model was being used) --- electron/main/ipc-handlers.ts | 9 ++++- electron/utils/openclaw-auth.ts | 58 +++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/electron/main/ipc-handlers.ts b/electron/main/ipc-handlers.ts index e17640aa9..5002ca3fd 100644 --- a/electron/main/ipc-handlers.ts +++ b/electron/main/ipc-handlers.ts @@ -21,7 +21,7 @@ import { } from '../utils/secure-storage'; import { getOpenClawStatus } from '../utils/paths'; import { getSetting } from '../utils/store'; -import { saveProviderKeyToOpenClaw } from '../utils/openclaw-auth'; +import { saveProviderKeyToOpenClaw, setOpenClawDefaultModel } from '../utils/openclaw-auth'; /** * Register all IPC handlers @@ -228,6 +228,13 @@ function registerProviderHandlers(): void { } } + // Set the default model in OpenClaw config based on provider type + try { + setOpenClawDefaultModel(config.type); + } catch (err) { + console.warn('Failed to set OpenClaw default model:', err); + } + return { success: true }; } catch (error) { return { success: false, error: String(error) }; diff --git a/electron/utils/openclaw-auth.ts b/electron/utils/openclaw-auth.ts index f05fdafdf..0cc6d6156 100644 --- a/electron/utils/openclaw-auth.ts +++ b/electron/utils/openclaw-auth.ts @@ -161,3 +161,61 @@ export function buildProviderEnvVars(providers: Array<{ type: string; apiKey: st return env; } + +/** + * Provider type to default model mapping + * Used to set the gateway's default model when the user selects a provider + */ +const PROVIDER_DEFAULT_MODELS: Record = { + anthropic: 'anthropic/claude-sonnet-4-20250514', + openai: 'openai/gpt-4o', + google: 'google/gemini-2.5-pro-preview-06-05', + openrouter: 'openrouter/anthropic/claude-sonnet-4', +}; + +/** + * Update the OpenClaw config to use the given provider and model + * Writes to ~/.openclaw/openclaw.json + */ +export function setOpenClawDefaultModel(provider: string): void { + const configPath = join(homedir(), '.openclaw', 'openclaw.json'); + + let config: Record = {}; + + try { + if (existsSync(configPath)) { + config = JSON.parse(readFileSync(configPath, 'utf-8')); + } + } catch (err) { + console.warn('Failed to read openclaw.json, creating fresh config:', err); + } + + const model = PROVIDER_DEFAULT_MODELS[provider]; + if (!model) { + console.warn(`No default model mapping for provider "${provider}"`); + return; + } + + // Set the default model for the agents + const agents = (config.agents || {}) as Record; + const defaults = (agents.defaults || {}) as Record; + defaults.model = model; + agents.defaults = defaults; + config.agents = agents; + + // Ensure gateway mode is set + const gateway = (config.gateway || {}) as Record; + if (!gateway.mode) { + gateway.mode = 'local'; + } + config.gateway = gateway; + + // Ensure directory exists + const dir = join(configPath, '..'); + if (!existsSync(dir)) { + mkdirSync(dir, { recursive: true }); + } + + writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8'); + console.log(`Set OpenClaw default model to "${model}" for provider "${provider}"`); +}