diff --git a/src/agents/pi-embedded-runner/extra-params.ts b/src/agents/pi-embedded-runner/extra-params.ts index 47b678b60..60a30973d 100644 --- a/src/agents/pi-embedded-runner/extra-params.ts +++ b/src/agents/pi-embedded-runner/extra-params.ts @@ -4,6 +4,11 @@ import { streamSimple } from "@mariozechner/pi-ai"; import type { OpenClawConfig } from "../../config/config.js"; import { log } from "./logger.js"; +const OPENROUTER_APP_HEADERS: Record = { + "HTTP-Referer": "https://openclaw.ai", + "X-Title": "OpenClaw", +}; + /** * Resolve provider-specific extra params from model config. * Used to pass through stream params like temperature/maxTokens. @@ -96,8 +101,25 @@ function createStreamFnWithExtraParams( return wrappedStreamFn; } +/** + * Create a streamFn wrapper that adds OpenRouter app attribution headers. + * These headers allow OpenClaw to appear on OpenRouter's leaderboard. + */ +function createOpenRouterHeadersWrapper(baseStreamFn: StreamFn | undefined): StreamFn { + const underlying = baseStreamFn ?? streamSimple; + return (model, context, options) => + underlying(model as Model, context, { + ...options, + headers: { + ...OPENROUTER_APP_HEADERS, + ...options?.headers, + }, + }); +} + /** * Apply extra params (like temperature) to an agent's streamFn. + * Also adds OpenRouter app attribution headers when using the OpenRouter provider. * * @internal Exported for testing */ @@ -126,4 +148,9 @@ export function applyExtraParamsToAgent( log.debug(`applying extraParams to agent streamFn for ${provider}/${modelId}`); agent.streamFn = wrappedStreamFn; } + + if (provider === "openrouter") { + log.debug(`applying OpenRouter app attribution headers for ${provider}/${modelId}`); + agent.streamFn = createOpenRouterHeadersWrapper(agent.streamFn); + } }