fix(model): claw-x header (#198)

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Haze <hazeone@users.noreply.github.com>
This commit is contained in:
Haze
2026-02-26 22:57:59 +08:00
committed by GitHub
Unverified
parent 2a50aea448
commit 87616b4250
4 changed files with 21 additions and 13 deletions

View File

@@ -122,16 +122,6 @@ async function initialize(): Promise<void> {
// Create system tray // Create system tray
createTray(mainWindow); 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 // Override security headers ONLY for the OpenClaw Gateway Control UI
session.defaultSession.webRequest.onHeadersReceived((details, callback) => { session.defaultSession.webRequest.onHeadersReceived((details, callback) => {
const isGatewayUrl = details.url.includes('127.0.0.1:18789') || details.url.includes('localhost:18789'); const isGatewayUrl = details.url.includes('127.0.0.1:18789') || details.url.includes('localhost:18789');

View File

@@ -878,6 +878,7 @@ function registerProviderHandlers(gatewayManager: GatewayManager): void {
baseUrl: config.baseUrl || meta?.baseUrl, baseUrl: config.baseUrl || meta?.baseUrl,
api, api,
apiKeyEnv: meta?.apiKeyEnv, apiKeyEnv: meta?.apiKeyEnv,
headers: meta?.headers,
}); });
if (config.type === 'custom' || config.type === 'ollama') { if (config.type === 'custom' || config.type === 'ollama') {
@@ -1003,6 +1004,7 @@ function registerProviderHandlers(gatewayManager: GatewayManager): void {
baseUrl: nextConfig.baseUrl || meta?.baseUrl, baseUrl: nextConfig.baseUrl || meta?.baseUrl,
api, api,
apiKeyEnv: meta?.apiKeyEnv, apiKeyEnv: meta?.apiKeyEnv,
headers: meta?.headers,
}); });
if (nextConfig.type === 'custom' || nextConfig.type === 'ollama') { if (nextConfig.type === 'custom' || nextConfig.type === 'ollama') {

View File

@@ -396,13 +396,17 @@ export function setOpenClawDefaultModel(provider: string, modelOverride?: string
mergedModels.push({ id: modelId, name: modelId }); mergedModels.push({ id: modelId, name: modelId });
} }
providers[provider] = { const providerEntry: Record<string, unknown> = {
...existingProvider, ...existingProvider,
baseUrl: providerCfg.baseUrl, baseUrl: providerCfg.baseUrl,
api: providerCfg.api, api: providerCfg.api,
apiKey: providerCfg.apiKeyEnv, apiKey: providerCfg.apiKeyEnv,
models: mergedModels, 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}`); console.log(`Configured models.providers.${provider} with baseUrl=${providerCfg.baseUrl}, model=${modelId}`);
models.providers = providers; models.providers = providers;
@@ -442,6 +446,7 @@ interface RuntimeProviderConfigOverride {
baseUrl?: string; baseUrl?: string;
api?: string; api?: string;
apiKeyEnv?: string; apiKeyEnv?: string;
headers?: Record<string, string>;
} }
/** /**
@@ -481,6 +486,9 @@ export function syncProviderConfigToOpenClaw(
if (override.apiKeyEnv) { if (override.apiKeyEnv) {
nextProvider.apiKey = override.apiKeyEnv; nextProvider.apiKey = override.apiKeyEnv;
} }
if (override.headers && Object.keys(override.headers).length > 0) {
nextProvider.headers = override.headers;
}
providers[provider] = nextProvider; providers[provider] = nextProvider;
models.providers = providers; models.providers = providers;
@@ -562,6 +570,9 @@ export function setOpenClawDefaultModelWithOverride(
if (override.apiKeyEnv) { if (override.apiKeyEnv) {
nextProvider.apiKey = override.apiKeyEnv; nextProvider.apiKey = override.apiKeyEnv;
} }
if (override.headers && Object.keys(override.headers).length > 0) {
nextProvider.headers = override.headers;
}
providers[provider] = nextProvider; providers[provider] = nextProvider;
models.providers = providers; models.providers = providers;

View File

@@ -34,6 +34,7 @@ interface ProviderBackendMeta {
api: string; api: string;
apiKeyEnv: string; apiKeyEnv: string;
models?: ProviderModelEntry[]; models?: ProviderModelEntry[];
headers?: Record<string, string>;
}; };
} }
@@ -65,6 +66,10 @@ const REGISTRY: Record<string, ProviderBackendMeta> = {
baseUrl: 'https://openrouter.ai/api/v1', baseUrl: 'https://openrouter.ai/api/v1',
api: 'openai-completions', api: 'openai-completions',
apiKeyEnv: 'OPENROUTER_API_KEY', apiKeyEnv: 'OPENROUTER_API_KEY',
headers: {
'HTTP-Referer': 'https://claw-x.com',
'X-Title': 'ClawX',
},
}, },
}, },
moonshot: { moonshot: {
@@ -135,10 +140,10 @@ export function getProviderDefaultModel(type: string): string | undefined {
return REGISTRY[type]?.defaultModel; 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( export function getProviderConfig(
type: string type: string
): { baseUrl: string; api: string; apiKeyEnv: string; models?: ProviderModelEntry[] } | undefined { ): { baseUrl: string; api: string; apiKeyEnv: string; models?: ProviderModelEntry[]; headers?: Record<string, string> } | undefined {
return REGISTRY[type]?.providerConfig; return REGISTRY[type]?.providerConfig;
} }