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}"`); +}