diff --git a/electron/main/index.ts b/electron/main/index.ts index 7ea78987e..2861e4fc1 100644 --- a/electron/main/index.ts +++ b/electron/main/index.ts @@ -122,16 +122,6 @@ async function initialize(): Promise { // Create system tray createTray(mainWindow); - // Inject OpenRouter site headers (HTTP-Referer & X-Title) for rankings on openrouter.ai - session.defaultSession.webRequest.onBeforeSendHeaders( - { urls: ['https://openrouter.ai/*'] }, - (details, callback) => { - details.requestHeaders['HTTP-Referer'] = 'https://claw-x.com'; - details.requestHeaders['X-Title'] = 'ClawX'; - callback({ requestHeaders: details.requestHeaders }); - }, - ); - // Override security headers ONLY for the OpenClaw Gateway Control UI session.defaultSession.webRequest.onHeadersReceived((details, callback) => { const isGatewayUrl = details.url.includes('127.0.0.1:18789') || details.url.includes('localhost:18789'); diff --git a/electron/main/ipc-handlers.ts b/electron/main/ipc-handlers.ts index a2857a2ea..ad27e45a2 100644 --- a/electron/main/ipc-handlers.ts +++ b/electron/main/ipc-handlers.ts @@ -878,6 +878,7 @@ function registerProviderHandlers(gatewayManager: GatewayManager): void { baseUrl: config.baseUrl || meta?.baseUrl, api, apiKeyEnv: meta?.apiKeyEnv, + headers: meta?.headers, }); if (config.type === 'custom' || config.type === 'ollama') { @@ -1003,6 +1004,7 @@ function registerProviderHandlers(gatewayManager: GatewayManager): void { baseUrl: nextConfig.baseUrl || meta?.baseUrl, api, apiKeyEnv: meta?.apiKeyEnv, + headers: meta?.headers, }); if (nextConfig.type === 'custom' || nextConfig.type === 'ollama') { diff --git a/electron/utils/openclaw-auth.ts b/electron/utils/openclaw-auth.ts index 7c95834be..e4a255a70 100644 --- a/electron/utils/openclaw-auth.ts +++ b/electron/utils/openclaw-auth.ts @@ -396,13 +396,17 @@ export function setOpenClawDefaultModel(provider: string, modelOverride?: string mergedModels.push({ id: modelId, name: modelId }); } - providers[provider] = { + const providerEntry: Record = { ...existingProvider, baseUrl: providerCfg.baseUrl, api: providerCfg.api, apiKey: providerCfg.apiKeyEnv, models: mergedModels, }; + if (providerCfg.headers && Object.keys(providerCfg.headers).length > 0) { + providerEntry.headers = providerCfg.headers; + } + providers[provider] = providerEntry; console.log(`Configured models.providers.${provider} with baseUrl=${providerCfg.baseUrl}, model=${modelId}`); models.providers = providers; @@ -442,6 +446,7 @@ interface RuntimeProviderConfigOverride { baseUrl?: string; api?: string; apiKeyEnv?: string; + headers?: Record; } /** @@ -481,6 +486,9 @@ export function syncProviderConfigToOpenClaw( if (override.apiKeyEnv) { nextProvider.apiKey = override.apiKeyEnv; } + if (override.headers && Object.keys(override.headers).length > 0) { + nextProvider.headers = override.headers; + } providers[provider] = nextProvider; models.providers = providers; @@ -562,6 +570,9 @@ export function setOpenClawDefaultModelWithOverride( if (override.apiKeyEnv) { nextProvider.apiKey = override.apiKeyEnv; } + if (override.headers && Object.keys(override.headers).length > 0) { + nextProvider.headers = override.headers; + } providers[provider] = nextProvider; models.providers = providers; diff --git a/electron/utils/provider-registry.ts b/electron/utils/provider-registry.ts index fc6de6f82..a45f5c58f 100644 --- a/electron/utils/provider-registry.ts +++ b/electron/utils/provider-registry.ts @@ -34,6 +34,7 @@ interface ProviderBackendMeta { api: string; apiKeyEnv: string; models?: ProviderModelEntry[]; + headers?: Record; }; } @@ -65,6 +66,10 @@ const REGISTRY: Record = { baseUrl: 'https://openrouter.ai/api/v1', api: 'openai-completions', apiKeyEnv: 'OPENROUTER_API_KEY', + headers: { + 'HTTP-Referer': 'https://claw-x.com', + 'X-Title': 'ClawX', + }, }, }, moonshot: { @@ -135,10 +140,10 @@ export function getProviderDefaultModel(type: string): string | undefined { return REGISTRY[type]?.defaultModel; } -/** Get the OpenClaw provider config (baseUrl, api, apiKeyEnv, models) */ +/** Get the OpenClaw provider config (baseUrl, api, apiKeyEnv, models, headers) */ export function getProviderConfig( type: string -): { baseUrl: string; api: string; apiKeyEnv: string; models?: ProviderModelEntry[] } | undefined { +): { baseUrl: string; api: string; apiKeyEnv: string; models?: ProviderModelEntry[]; headers?: Record } | undefined { return REGISTRY[type]?.providerConfig; }