From ed060c142f9afdb31766a347df4310ca28fd59c4 Mon Sep 17 00:00:00 2001 From: Haze <709547807@qq.com> Date: Fri, 6 Feb 2026 04:02:07 +0800 Subject: [PATCH] fix(auth): register models.providers for OpenRouter and other providers OpenClaw's model resolution checks cfg.models.providers[provider] for baseUrl and API type. Without this config entry, any model for that provider returns "Unknown model" even if the API key is correct. - Reverted model names back to user-specified versions - Added PROVIDER_CONFIGS with baseUrl, api type, and env var name - setOpenClawDefaultModel() now writes models.providers.openrouter (and other providers) to openclaw.json so model resolution works - Config format: { models: { providers: { openrouter: { baseUrl: "https://openrouter.ai/api/v1", api: "openai-completions", apiKey: "OPENROUTER_API_KEY" } } } } --- electron/utils/openclaw-auth.ts | 54 ++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/electron/utils/openclaw-auth.ts b/electron/utils/openclaw-auth.ts index 3494394b7..e275e6e6d 100644 --- a/electron/utils/openclaw-auth.ts +++ b/electron/utils/openclaw-auth.ts @@ -167,10 +167,34 @@ export function buildProviderEnvVars(providers: Array<{ type: string; apiKey: st * Used to set the gateway's default model when the user selects a provider */ const PROVIDER_DEFAULT_MODELS: Record = { - anthropic: 'anthropic/claude-opus-4-5', - openai: 'openai/gpt-5', - google: 'google/gemini-2.5-pro-preview', - openrouter: 'openrouter/auto', + anthropic: 'anthropic/claude-opus-4-6', + openai: 'openai/gpt-5.2', + google: 'google/gemini-3-pro-preview', + openrouter: 'openrouter/anthropic/claude-opus-4.6', +}; + +/** + * Provider configurations needed for model resolution. + * OpenClaw resolves models by checking cfg.models.providers[provider]. + * Without this, any model for the provider returns "Unknown model". + */ +const PROVIDER_CONFIGS: Record = { + openrouter: { + baseUrl: 'https://openrouter.ai/api/v1', + api: 'openai-completions', + apiKeyEnv: 'OPENROUTER_API_KEY', + }, + openai: { + baseUrl: 'https://api.openai.com/v1', + api: 'openai-responses', + apiKeyEnv: 'OPENAI_API_KEY', + }, + google: { + baseUrl: 'https://generativelanguage.googleapis.com/v1beta', + api: 'google', + apiKeyEnv: 'GEMINI_API_KEY', + }, + // anthropic is built-in to OpenClaw's model registry, no provider config needed }; /** @@ -204,6 +228,28 @@ export function setOpenClawDefaultModel(provider: string): void { agents.defaults = defaults; config.agents = agents; + // Configure models.providers for providers that need explicit registration + // Without this, OpenClaw returns "Unknown model" because it can't resolve + // the provider's baseUrl and API type + const providerCfg = PROVIDER_CONFIGS[provider]; + if (providerCfg) { + const models = (config.models || {}) as Record; + const providers = (models.providers || {}) as Record; + + // Only set if not already configured + if (!providers[provider]) { + providers[provider] = { + baseUrl: providerCfg.baseUrl, + api: providerCfg.api, + apiKey: providerCfg.apiKeyEnv, + }; + console.log(`Configured models.providers.${provider} with baseUrl=${providerCfg.baseUrl}`); + } + + models.providers = providers; + config.models = models; + } + // Ensure gateway mode is set const gateway = (config.gateway || {}) as Record; if (!gateway.mode) {