@absolutejs/ai 0.0.50 → 0.0.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +22 -12
  2. package/dist/ai/client/index.js +30 -1
  3. package/dist/ai/client/index.js.map +5 -5
  4. package/dist/ai/index.js +531 -56
  5. package/dist/ai/index.js.map +15 -15
  6. package/dist/ai/providers/anthropic.js +100 -25
  7. package/dist/ai/providers/anthropic.js.map +5 -5
  8. package/dist/ai/providers/gemini.js +5 -2
  9. package/dist/ai/providers/gemini.js.map +4 -4
  10. package/dist/ai/providers/ollama.js +5 -2
  11. package/dist/ai/providers/ollama.js.map +4 -4
  12. package/dist/ai/providers/openai.js +56 -10
  13. package/dist/ai/providers/openai.js.map +5 -5
  14. package/dist/ai/providers/openaiCompatible.js +56 -10
  15. package/dist/ai/providers/openaiCompatible.js.map +5 -5
  16. package/dist/ai/providers/openaiResponses.js +100 -16
  17. package/dist/ai/providers/openaiResponses.js.map +5 -5
  18. package/dist/ai/providers/openrouter.js +888 -38
  19. package/dist/ai/providers/openrouter.js.map +10 -9
  20. package/dist/angular/ai/index.js +30 -1
  21. package/dist/angular/ai/index.js.map +5 -5
  22. package/dist/react/ai/index.js +30 -1
  23. package/dist/react/ai/index.js.map +5 -5
  24. package/dist/src/ai/client/actions.d.ts +53 -0
  25. package/dist/src/ai/errors/providerError.d.ts +3 -0
  26. package/dist/src/ai/index.d.ts +2 -2
  27. package/dist/src/ai/providers/openrouter.d.ts +46 -2
  28. package/dist/src/ai/providers/openrouterClient.d.ts +132 -3
  29. package/dist/src/ai/streamAIWithTools.d.ts +6 -0
  30. package/dist/svelte/ai/index.js +30 -1
  31. package/dist/svelte/ai/index.js.map +5 -5
  32. package/dist/types/ai.d.ts +54 -3
  33. package/dist/types/anthropic.d.ts +13 -5
  34. package/dist/vue/ai/index.js +30 -1
  35. package/dist/vue/ai/index.js.map +5 -5
  36. package/package.json +1 -1
@@ -1,17 +1,18 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/ai/errors/providerError.ts", "../src/ai/resilience.ts", "../src/ai/providers/instrumentation.ts", "../src/ai/providers/reasoning.ts", "../src/ai/providers/openai.ts", "../src/ai/providers/openaiResponses.ts", "../src/ai/providers/openrouterClient.ts", "../src/ai/providers/openrouter.ts"],
3
+ "sources": ["../src/ai/errors/providerError.ts", "../src/ai/resilience.ts", "../src/ai/providers/instrumentation.ts", "../src/ai/providers/reasoning.ts", "../src/ai/providers/openai.ts", "../src/ai/providers/openaiResponses.ts", "../src/ai/providers/anthropic.ts", "../src/ai/providers/openrouterClient.ts", "../src/ai/providers/openrouter.ts"],
4
4
  "sourcesContent": [
5
- "// Structured provider error. Replaces the previous `throw new Error(\"Anthropic\n// API error 529: ...\")` strings so consumers can classify outages\n// programmatically (retryable? which provider? what status?) instead of parsing\n// message text. Surfaced both by the retry/circuit-breaker layer and to end\n// callers via `instanceof ProviderError`.\n\n// Public status pages (also serve the Atlassian Statuspage JSON API at\n// /api/v2/*), keyed by the provider name passed to the factories. Anthropic\n// moved theirs to status.claude.com — status.anthropic.com only HTTP-redirects,\n// which breaks JSON polling, so we point at the canonical host.\nexport const PROVIDER_STATUS_PAGES: Record<string, string> = {\n anthropic: \"https://status.claude.com\",\n gemini: \"https://status.cloud.google.com\",\n google: \"https://status.cloud.google.com\",\n openai: \"https://status.openai.com\",\n openrouter: \"https://status.openrouter.ai\",\n};\n\n// HTTP statuses that mean \"the provider is unavailable / overloaded / rate\n// limited\", i.e. retrying later may succeed — NOT a malformed request. 529 is\n// Anthropic's \"overloaded\". 4xx auth/validation (400/401/403/404/422) are\n// deliberately excluded: those are the caller's fault and never self-heal.\nconst RETRYABLE_STATUSES = new Set([\n 408, 409, 425, 429, 500, 502, 503, 504, 529,\n]);\n\n// Connection-level failure fingerprints (fetch rejects before any HTTP status).\nconst CONNECTION_ERROR_PATTERNS = [\n \"econnreset\",\n \"econnrefused\",\n \"etimedout\",\n \"enotfound\",\n \"eai_again\",\n \"socket hang up\",\n \"fetch failed\",\n \"network\",\n \"terminated\",\n \"timed out\",\n \"timeout\",\n \"and not retryable\",\n \"no response body\",\n];\n\nconst isAbortError = (err: unknown): boolean =>\n err instanceof Error &&\n (err.name === \"AbortError\" || /\\babort(ed)?\\b/i.test(err.message));\n\n/** Public status page for a provider, or null when we don't track one. */\nexport const providerStatusPage = (provider: string): string | null =>\n PROVIDER_STATUS_PAGES[provider] ?? null;\n\nexport type ProviderErrorInit = {\n provider: string;\n message: string;\n status?: number | null;\n /** Provider-specific error type, e.g. Anthropic's \"overloaded_error\". */\n type?: string | null;\n retryable: boolean;\n cause?: unknown;\n};\n\nexport class ProviderError extends Error {\n readonly provider: string;\n /** HTTP status when the failure carried one; null for connection errors. */\n readonly status: number | null;\n readonly type: string | null;\n /** Whether retrying the same request later could plausibly succeed. */\n readonly retryable: boolean;\n /** Provider status page, when known — for surfacing \"is it them?\" to users. */\n readonly statusPageUrl: string | null;\n\n constructor(init: ProviderErrorInit) {\n super(\n init.message,\n init.cause === undefined ? undefined : { cause: init.cause },\n );\n this.name = \"ProviderError\";\n this.provider = init.provider;\n this.status = init.status ?? null;\n this.type = init.type ?? null;\n this.retryable = init.retryable;\n this.statusPageUrl = providerStatusPage(init.provider);\n }\n\n /** Build from a non-2xx HTTP response (status + body text are known). */\n static fromResponse(\n provider: string,\n status: number,\n body: string,\n type?: string | null,\n ): ProviderError {\n return new ProviderError({\n message: `${capitalize(provider)} API error ${status}: ${body}`,\n provider,\n retryable: RETRYABLE_STATUSES.has(status),\n status,\n type: type ?? null,\n });\n }\n\n /**\n * Normalize any thrown value into a ProviderError. Passes existing\n * ProviderErrors through unchanged; classifies connection errors and\n * status-bearing message strings; rethrows aborts to the caller (an aborted\n * request is the caller's intent, never a provider outage).\n */\n static from(err: unknown, provider: string): ProviderError {\n if (err instanceof ProviderError) return err;\n if (isAbortError(err)) throw err;\n\n const rawMessage = err instanceof Error ? err.message : String(err ?? \"\");\n const lower = rawMessage.toLowerCase();\n\n const statusMatch = lower.match(/api error\\s+(\\d{3})/);\n const status = statusMatch ? Number(statusMatch[1]) : null;\n\n const retryable =\n (status !== null && RETRYABLE_STATUSES.has(status)) ||\n (status === null &&\n CONNECTION_ERROR_PATTERNS.some((pattern) => lower.includes(pattern)));\n\n return new ProviderError({\n cause: err,\n message: rawMessage || `${capitalize(provider)} request failed`,\n provider,\n retryable,\n status,\n });\n }\n}\n\nconst capitalize = (value: string): string =>\n value.charAt(0).toUpperCase() + value.slice(1);\n",
6
- "import type {\n AIChunk,\n AIProviderConfig,\n AIProviderStreamParams,\n} from \"../../types/ai\";\nimport { ProviderError, providerStatusPage } from \"./errors/providerError\";\n\n// Resilience layer wrapped around every provider (via instrumentAIProvider).\n// Two behaviours, both automatic:\n//\n// 1. Bounded retry with exponential backoff on TRANSIENT failures that happen\n// before any chunk is emitted (connection drops, 429/5xx/529). Retrying is\n// only safe pre-first-chunk — once text has streamed to the consumer a retry\n// would duplicate output, so mid-stream failures are surfaced, never retried.\n//\n// 2. A per-provider circuit breaker. After enough consecutive request failures\n// the circuit OPENS and further calls fail fast (no hammering a provider\n// that's down) until a cooldown elapses, then a single half-open probe\n// decides whether to close. State is exposed via getProviderHealth().\n//\n// NOTE: state is per-process. Across multiple server instances each process\n// keeps its own view — this is best-effort local protection, not a distributed\n// breaker. Authoritative \"is the provider down\" should come from their status\n// page; this just stops one process from flogging a dead endpoint.\n\nexport type ResilienceConfig = {\n /** Max retry attempts AFTER the first try (so total tries = maxRetries + 1). */\n maxRetries: number;\n baseDelayMs: number;\n maxDelayMs: number;\n /** Consecutive failed requests before the circuit opens. */\n failureThreshold: number;\n /** How long the circuit stays open before allowing a half-open probe. */\n openMs: number;\n};\n\nconst DEFAULT_CONFIG: ResilienceConfig = {\n baseDelayMs: 500,\n failureThreshold: 4,\n maxDelayMs: 8000,\n maxRetries: 2,\n openMs: 30_000,\n};\n\nlet config: ResilienceConfig = { ...DEFAULT_CONFIG };\n\n/** Override the global resilience defaults (retry counts, breaker thresholds). */\nexport const configureProviderResilience = (\n partial: Partial<ResilienceConfig>,\n): void => {\n config = { ...config, ...partial };\n};\n\ntype CircuitState = \"closed\" | \"open\" | \"half-open\";\n\n// Externally-supplied availability (e.g. from a status-page monitor). When a\n// provider's API is reported down, the breaker trips PROACTIVELY — no warmup of\n// real user-facing failures needed.\ntype ExternalStatus = {\n available: boolean;\n /** Statuspage indicator, e.g. \"major_outage\" | \"operational\" | \"unknown\". */\n indicator: string;\n reason: string;\n checkedAt: number;\n};\n\ntype HealthRecord = {\n state: CircuitState;\n consecutiveFailures: number;\n lastFailureAt: number | null;\n lastSuccessAt: number | null;\n nextProbeAt: number | null;\n lastError: {\n status: number | null;\n type: string | null;\n message: string;\n } | null;\n external: ExternalStatus | null;\n};\n\nconst health = new Map<string, HealthRecord>();\n\nconst recordFor = (provider: string): HealthRecord => {\n const existing = health.get(provider);\n if (existing) return existing;\n const fresh: HealthRecord = {\n consecutiveFailures: 0,\n external: null,\n lastError: null,\n lastFailureAt: null,\n lastSuccessAt: null,\n nextProbeAt: null,\n state: \"closed\",\n };\n health.set(provider, fresh);\n\n return fresh;\n};\n\n/**\n * Feed externally-observed provider availability (typically from a status-page\n * monitor) into the breaker. A report of `available: false` makes the provider\n * fail fast immediately; `available: true` clears the external block (the\n * reactive breaker still governs real failures).\n */\nexport const setProviderAvailability = (\n provider: string,\n status: { available: boolean; indicator?: string; reason?: string },\n): void => {\n const record = recordFor(provider);\n record.external = {\n available: status.available,\n checkedAt: Date.now(),\n indicator:\n status.indicator ?? (status.available ? \"operational\" : \"unknown\"),\n reason: status.reason ?? \"\",\n };\n};\n\nconst noteSuccess = (provider: string): void => {\n const record = recordFor(provider);\n record.state = \"closed\";\n record.consecutiveFailures = 0;\n record.nextProbeAt = null;\n record.lastError = null;\n record.lastSuccessAt = Date.now();\n};\n\nconst noteFailure = (provider: string, error: ProviderError): void => {\n const record = recordFor(provider);\n record.consecutiveFailures += 1;\n record.lastFailureAt = Date.now();\n record.lastError = {\n message: error.message,\n status: error.status,\n type: error.type,\n };\n if (record.consecutiveFailures >= config.failureThreshold) {\n record.state = \"open\";\n record.nextProbeAt = Date.now() + config.openMs;\n }\n};\n\nexport type ProviderHealth = {\n provider: string;\n /**\n * True when the provider is usable: circuit closed AND not reported down by\n * an external status monitor.\n */\n healthy: boolean;\n state: CircuitState;\n consecutiveFailures: number;\n lastFailureAt: number | null;\n lastSuccessAt: number | null;\n /** When the breaker will next allow a probe (epoch ms), if open. */\n nextRetryAt: number | null;\n lastError: {\n status: number | null;\n type: string | null;\n message: string;\n } | null;\n statusPageUrl: string | null;\n /** Latest externally-observed status (e.g. status page), if any. */\n external: ExternalStatus | null;\n};\n\nconst snapshot = (provider: string, record: HealthRecord): ProviderHealth => ({\n consecutiveFailures: record.consecutiveFailures,\n external: record.external,\n healthy: record.state === \"closed\" && record.external?.available !== false,\n lastError: record.lastError,\n lastFailureAt: record.lastFailureAt,\n lastSuccessAt: record.lastSuccessAt,\n nextRetryAt: record.nextProbeAt,\n provider,\n state: record.state,\n statusPageUrl: providerStatusPage(provider),\n});\n\n/**\n * Inspect provider health as tracked by the circuit breaker. Pass a provider\n * name for one snapshot, or omit to get every provider seen this process.\n */\nexport function getProviderHealth(provider: string): ProviderHealth;\nexport function getProviderHealth(): ProviderHealth[];\nexport function getProviderHealth(\n provider?: string,\n): ProviderHealth | ProviderHealth[] {\n if (provider !== undefined) return snapshot(provider, recordFor(provider));\n\n return [...health.entries()].map(([name, record]) => snapshot(name, record));\n}\n\nconst backoffDelay = (attempt: number): number => {\n const exponential = config.baseDelayMs * 2 ** attempt;\n const capped = Math.min(exponential, config.maxDelayMs);\n // Full jitter: spread retries so concurrent callers don't reconnect in lockstep.\n return Math.round(capped / 2 + (Math.random() * capped) / 2);\n};\n\nconst sleep = (ms: number, signal?: AbortSignal): Promise<void> =>\n new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new Error(\"aborted\"));\n\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal?.reason ?? new Error(\"aborted\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n\nconst circuitOpen = (provider: string): ProviderError | null => {\n const record = recordFor(provider);\n\n // Proactive trip: an external monitor (status page) reported the API down, so\n // fail fast without waiting to accumulate real user-facing failures.\n if (record.external && !record.external.available) {\n return new ProviderError({\n message: `${provider} API is reported down${record.external.reason ? `: ${record.external.reason}` : \"\"}`,\n provider,\n retryable: true,\n status: null,\n type: record.external.indicator,\n });\n }\n\n if (record.state !== \"open\") return null;\n if (record.nextProbeAt !== null && Date.now() >= record.nextProbeAt) {\n // Cooldown elapsed: allow a single probe through.\n record.state = \"half-open\";\n\n return null;\n }\n const detail = record.lastError?.message ?? \"recent failures\";\n\n return new ProviderError({\n message: `${provider} is temporarily unavailable (circuit open after ${record.consecutiveFailures} failures): ${detail}`,\n provider,\n retryable: true,\n status: record.lastError?.status ?? null,\n type: record.lastError?.type ?? null,\n });\n};\n\n/**\n * Wrap a provider with retry + circuit-breaker behaviour. The returned config\n * has the same `stream(params) => AsyncIterable<AIChunk>` shape.\n */\nexport const withResilience = (\n provider: AIProviderConfig,\n providerName = \"unknown\",\n): AIProviderConfig => {\n const attempt = async function* (\n params: AIProviderStreamParams,\n attemptNo: number,\n ): AsyncIterable<AIChunk> {\n let yielded = false;\n try {\n for await (const chunk of provider.stream(params)) {\n yielded = true;\n yield chunk;\n }\n noteSuccess(providerName);\n } catch (err) {\n // Aborts are the caller's intent — propagate without touching health.\n const providerError = ProviderError.from(err, providerName);\n const canRetry =\n !yielded &&\n providerError.retryable &&\n attemptNo < config.maxRetries &&\n !params.signal?.aborted;\n\n if (canRetry) {\n await sleep(backoffDelay(attemptNo), params.signal);\n yield* attempt(params, attemptNo + 1);\n\n return;\n }\n\n noteFailure(providerName, providerError);\n throw providerError;\n }\n };\n\n return {\n stream: (params: AIProviderStreamParams) => {\n // Fail fast while the breaker is open — don't count this as a new failure\n // (no request was made); nextProbeAt already governs the cooldown.\n const tripped = circuitOpen(providerName);\n if (tripped) {\n return (async function* () {\n throw tripped;\n })();\n }\n\n return attempt(params, 0);\n },\n };\n};\n",
5
+ "// Structured provider error. Replaces the previous `throw new Error(\"Anthropic\n// API error 529: ...\")` strings so consumers can classify outages\n// programmatically (retryable? which provider? what status?) instead of parsing\n// message text. Surfaced both by the retry/circuit-breaker layer and to end\n// callers via `instanceof ProviderError`.\n\n// Public status pages (also serve the Atlassian Statuspage JSON API at\n// /api/v2/*), keyed by the provider name passed to the factories. Anthropic\n// moved theirs to status.claude.com — status.anthropic.com only HTTP-redirects,\n// which breaks JSON polling, so we point at the canonical host.\nexport const PROVIDER_STATUS_PAGES: Record<string, string> = {\n anthropic: \"https://status.claude.com\",\n gemini: \"https://status.cloud.google.com\",\n google: \"https://status.cloud.google.com\",\n openai: \"https://status.openai.com\",\n openrouter: \"https://status.openrouter.ai\",\n};\n\n// HTTP statuses that mean \"the provider is unavailable / overloaded / rate\n// limited\", i.e. retrying later may succeed — NOT a malformed request. 529 is\n// Anthropic's \"overloaded\". 4xx auth/validation (400/401/403/404/422) are\n// deliberately excluded: those are the caller's fault and never self-heal.\nconst RETRYABLE_STATUSES = new Set([\n 408, 409, 425, 429, 500, 502, 503, 504, 529,\n]);\n\n// Connection-level failure fingerprints (fetch rejects before any HTTP status).\nconst CONNECTION_ERROR_PATTERNS = [\n \"econnreset\",\n \"econnrefused\",\n \"etimedout\",\n \"enotfound\",\n \"eai_again\",\n \"socket hang up\",\n \"fetch failed\",\n \"network\",\n \"terminated\",\n \"timed out\",\n \"timeout\",\n \"and not retryable\",\n \"no response body\",\n];\n\nconst isAbortError = (err: unknown): boolean =>\n err instanceof Error &&\n (err.name === \"AbortError\" || /\\babort(ed)?\\b/i.test(err.message));\n\n/** Public status page for a provider, or null when we don't track one. */\nexport const providerStatusPage = (provider: string): string | null =>\n PROVIDER_STATUS_PAGES[provider] ?? null;\n\nexport type ProviderErrorInit = {\n provider: string;\n message: string;\n status?: number | null;\n /** Provider-specific error type, e.g. Anthropic's \"overloaded_error\". */\n type?: string | null;\n retryable: boolean;\n cause?: unknown;\n /** Provider-native structured details, when the response exposes them. */\n metadata?: Record<string, unknown>;\n};\n\nexport class ProviderError extends Error {\n readonly provider: string;\n /** HTTP status when the failure carried one; null for connection errors. */\n readonly status: number | null;\n readonly type: string | null;\n /** Whether retrying the same request later could plausibly succeed. */\n readonly retryable: boolean;\n readonly metadata: Record<string, unknown> | undefined;\n /** Provider status page, when known — for surfacing \"is it them?\" to users. */\n readonly statusPageUrl: string | null;\n\n constructor(init: ProviderErrorInit) {\n super(\n init.message,\n init.cause === undefined ? undefined : { cause: init.cause },\n );\n this.name = \"ProviderError\";\n this.provider = init.provider;\n this.status = init.status ?? null;\n this.type = init.type ?? null;\n this.retryable = init.retryable;\n this.metadata = init.metadata;\n this.statusPageUrl = providerStatusPage(init.provider);\n }\n\n /** Build from a non-2xx HTTP response (status + body text are known). */\n static fromResponse(\n provider: string,\n status: number,\n body: string,\n type?: string | null,\n ): ProviderError {\n return new ProviderError({\n message: `${capitalize(provider)} API error ${status}: ${body}`,\n provider,\n retryable: RETRYABLE_STATUSES.has(status),\n status,\n type: type ?? null,\n });\n }\n\n /**\n * Normalize any thrown value into a ProviderError. Passes existing\n * ProviderErrors through unchanged; classifies connection errors and\n * status-bearing message strings; rethrows aborts to the caller (an aborted\n * request is the caller's intent, never a provider outage).\n */\n static from(err: unknown, provider: string): ProviderError {\n if (err instanceof ProviderError) return err;\n if (isAbortError(err)) throw err;\n\n const rawMessage = err instanceof Error ? err.message : String(err ?? \"\");\n const lower = rawMessage.toLowerCase();\n\n const statusMatch = lower.match(/api error\\s+(\\d{3})/);\n const status = statusMatch ? Number(statusMatch[1]) : null;\n\n const retryable =\n (status !== null && RETRYABLE_STATUSES.has(status)) ||\n (status === null &&\n CONNECTION_ERROR_PATTERNS.some((pattern) => lower.includes(pattern)));\n\n return new ProviderError({\n cause: err,\n message: rawMessage || `${capitalize(provider)} request failed`,\n provider,\n retryable,\n status,\n });\n }\n}\n\nconst capitalize = (value: string): string =>\n value.charAt(0).toUpperCase() + value.slice(1);\n",
6
+ "import type {\n AIChunk,\n AIProviderConfig,\n AIProviderStreamParams,\n} from \"../../types/ai\";\nimport { ProviderError, providerStatusPage } from \"./errors/providerError\";\n\n// Resilience layer wrapped around every provider (via instrumentAIProvider).\n// Two behaviours, both automatic:\n//\n// 1. Bounded retry with exponential backoff on TRANSIENT failures that happen\n// before any chunk is emitted (connection drops, 429/5xx/529). Retrying is\n// only safe pre-first-chunk — once text has streamed to the consumer a retry\n// would duplicate output, so mid-stream failures are surfaced, never retried.\n//\n// 2. A per-provider circuit breaker. After enough consecutive request failures\n// the circuit OPENS and further calls fail fast (no hammering a provider\n// that's down) until a cooldown elapses, then a single half-open probe\n// decides whether to close. State is exposed via getProviderHealth().\n//\n// NOTE: state is per-process. Across multiple server instances each process\n// keeps its own view — this is best-effort local protection, not a distributed\n// breaker. Authoritative \"is the provider down\" should come from their status\n// page; this just stops one process from flogging a dead endpoint.\n\nexport type ResilienceConfig = {\n /** Max retry attempts AFTER the first try (so total tries = maxRetries + 1). */\n maxRetries: number;\n baseDelayMs: number;\n maxDelayMs: number;\n /** Consecutive failed requests before the circuit opens. */\n failureThreshold: number;\n /** How long the circuit stays open before allowing a half-open probe. */\n openMs: number;\n};\n\nconst DEFAULT_CONFIG: ResilienceConfig = {\n baseDelayMs: 500,\n failureThreshold: 4,\n maxDelayMs: 8000,\n maxRetries: 2,\n openMs: 30_000,\n};\n\nlet config: ResilienceConfig = { ...DEFAULT_CONFIG };\n\n/** Override the global resilience defaults (retry counts, breaker thresholds). */\nexport const configureProviderResilience = (\n partial: Partial<ResilienceConfig>,\n): void => {\n config = { ...config, ...partial };\n};\n\ntype CircuitState = \"closed\" | \"open\" | \"half-open\";\n\n// Externally-supplied availability (e.g. from a status-page monitor). When a\n// provider's API is reported down, the breaker trips PROACTIVELY — no warmup of\n// real user-facing failures needed.\ntype ExternalStatus = {\n available: boolean;\n /** Statuspage indicator, e.g. \"major_outage\" | \"operational\" | \"unknown\". */\n indicator: string;\n reason: string;\n checkedAt: number;\n};\n\ntype HealthRecord = {\n state: CircuitState;\n consecutiveFailures: number;\n lastFailureAt: number | null;\n lastSuccessAt: number | null;\n nextProbeAt: number | null;\n lastError: {\n status: number | null;\n type: string | null;\n message: string;\n } | null;\n external: ExternalStatus | null;\n};\n\nconst health = new Map<string, HealthRecord>();\n\nconst recordFor = (provider: string): HealthRecord => {\n const existing = health.get(provider);\n if (existing) return existing;\n const fresh: HealthRecord = {\n consecutiveFailures: 0,\n external: null,\n lastError: null,\n lastFailureAt: null,\n lastSuccessAt: null,\n nextProbeAt: null,\n state: \"closed\",\n };\n health.set(provider, fresh);\n\n return fresh;\n};\n\n/**\n * Feed externally-observed provider availability (typically from a status-page\n * monitor) into the breaker. A report of `available: false` makes the provider\n * fail fast immediately; `available: true` clears the external block (the\n * reactive breaker still governs real failures).\n */\nexport const setProviderAvailability = (\n provider: string,\n status: { available: boolean; indicator?: string; reason?: string },\n): void => {\n const record = recordFor(provider);\n record.external = {\n available: status.available,\n checkedAt: Date.now(),\n indicator:\n status.indicator ?? (status.available ? \"operational\" : \"unknown\"),\n reason: status.reason ?? \"\",\n };\n};\n\nconst noteSuccess = (provider: string): void => {\n const record = recordFor(provider);\n record.state = \"closed\";\n record.consecutiveFailures = 0;\n record.nextProbeAt = null;\n record.lastError = null;\n record.lastSuccessAt = Date.now();\n};\n\nconst noteFailure = (provider: string, error: ProviderError): void => {\n const record = recordFor(provider);\n record.consecutiveFailures += 1;\n record.lastFailureAt = Date.now();\n record.lastError = {\n message: error.message,\n status: error.status,\n type: error.type,\n };\n if (record.consecutiveFailures >= config.failureThreshold) {\n record.state = \"open\";\n record.nextProbeAt = Date.now() + config.openMs;\n }\n};\n\nexport type ProviderHealth = {\n provider: string;\n /**\n * True when the provider is usable: circuit closed AND not reported down by\n * an external status monitor.\n */\n healthy: boolean;\n state: CircuitState;\n consecutiveFailures: number;\n lastFailureAt: number | null;\n lastSuccessAt: number | null;\n /** When the breaker will next allow a probe (epoch ms), if open. */\n nextRetryAt: number | null;\n lastError: {\n status: number | null;\n type: string | null;\n message: string;\n } | null;\n statusPageUrl: string | null;\n /** Latest externally-observed status (e.g. status page), if any. */\n external: ExternalStatus | null;\n};\n\nconst snapshot = (provider: string, record: HealthRecord): ProviderHealth => ({\n consecutiveFailures: record.consecutiveFailures,\n external: record.external,\n healthy: record.state === \"closed\" && record.external?.available !== false,\n lastError: record.lastError,\n lastFailureAt: record.lastFailureAt,\n lastSuccessAt: record.lastSuccessAt,\n nextRetryAt: record.nextProbeAt,\n provider,\n state: record.state,\n statusPageUrl: providerStatusPage(provider),\n});\n\n/**\n * Inspect provider health as tracked by the circuit breaker. Pass a provider\n * name for one snapshot, or omit to get every provider seen this process.\n */\nexport function getProviderHealth(provider: string): ProviderHealth;\nexport function getProviderHealth(): ProviderHealth[];\nexport function getProviderHealth(\n provider?: string,\n): ProviderHealth | ProviderHealth[] {\n if (provider !== undefined) return snapshot(provider, recordFor(provider));\n\n return [...health.entries()].map(([name, record]) => snapshot(name, record));\n}\n\nconst backoffDelay = (attempt: number): number => {\n const exponential = config.baseDelayMs * 2 ** attempt;\n const capped = Math.min(exponential, config.maxDelayMs);\n // Full jitter: spread retries so concurrent callers don't reconnect in lockstep.\n return Math.round(capped / 2 + (Math.random() * capped) / 2);\n};\n\nconst sleep = (ms: number, signal?: AbortSignal): Promise<void> =>\n new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new Error(\"aborted\"));\n\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal?.reason ?? new Error(\"aborted\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n\nconst circuitOpen = (provider: string): ProviderError | null => {\n const record = recordFor(provider);\n\n // Proactive trip: an external monitor (status page) reported the API down, so\n // fail fast without waiting to accumulate real user-facing failures.\n if (record.external && !record.external.available) {\n return new ProviderError({\n message: `${provider} API is reported down${record.external.reason ? `: ${record.external.reason}` : \"\"}`,\n provider,\n retryable: true,\n status: null,\n type: record.external.indicator,\n });\n }\n\n if (record.state !== \"open\") return null;\n if (record.nextProbeAt !== null && Date.now() >= record.nextProbeAt) {\n // Cooldown elapsed: allow a single probe through.\n record.state = \"half-open\";\n\n return null;\n }\n const detail = record.lastError?.message ?? \"recent failures\";\n\n return new ProviderError({\n message: `${provider} is temporarily unavailable (circuit open after ${record.consecutiveFailures} failures): ${detail}`,\n provider,\n retryable: true,\n status: record.lastError?.status ?? null,\n type: record.lastError?.type ?? null,\n });\n};\n\n/**\n * Wrap a provider with retry + circuit-breaker behaviour. The returned config\n * has the same `stream(params) => AsyncIterable<AIChunk>` shape.\n */\nexport const withResilience = (\n provider: AIProviderConfig,\n providerName = \"unknown\",\n): AIProviderConfig => {\n const attempt = async function* (\n params: AIProviderStreamParams,\n attemptNo: number,\n ): AsyncIterable<AIChunk> {\n let yielded = false;\n try {\n for await (const chunk of provider.stream(params)) {\n yielded = true;\n yield chunk;\n }\n noteSuccess(providerName);\n } catch (err) {\n // Aborts are the caller's intent — propagate without touching health.\n const providerError = ProviderError.from(err, providerName);\n const canRetry =\n !yielded &&\n providerError.retryable &&\n attemptNo < config.maxRetries &&\n !params.signal?.aborted;\n\n if (canRetry) {\n await sleep(backoffDelay(attemptNo), params.signal);\n yield* attempt(params, attemptNo + 1);\n\n return;\n }\n\n // A circuit breaker represents provider availability. Local validation,\n // authentication, and other non-retryable request errors do not indicate\n // an outage and must not poison health shared by later requests.\n if (providerError.retryable) noteFailure(providerName, providerError);\n throw providerError;\n }\n };\n\n return {\n stream: (params: AIProviderStreamParams) => {\n // Fail fast while the breaker is open — don't count this as a new failure\n // (no request was made); nextProbeAt already governs the cooldown.\n const tripped = circuitOpen(providerName);\n if (tripped) {\n return (async function* () {\n throw tripped;\n })();\n }\n\n return attempt(params, 0);\n },\n };\n};\n",
7
7
  "import type {\n AIChunk,\n AIProviderConfig,\n AIProviderStreamParams,\n AIUsage,\n} from \"../../../types/ai\";\nimport { withResilience } from \"../resilience\";\n\n// Every provider factory routes through here, so this is also where the\n// automatic retry + circuit-breaker layer is applied — wrapping the raw provider\n// BENEATH the usage/span tap so onUsage/onSpan fire once, for the attempt that\n// actually streamed.\nexport const instrumentAIProvider = (\n provider: AIProviderConfig,\n providerName?: string,\n): AIProviderConfig => {\n const resilient = withResilience(provider, providerName);\n\n return {\n stream: (params: AIProviderStreamParams) => {\n if (!params.onUsage && !params.onSpan) {\n return resilient.stream(params);\n }\n return tapStream(resilient.stream(params), params, providerName);\n },\n };\n};\n\nasync function* tapStream(\n source: AsyncIterable<AIChunk>,\n params: AIProviderStreamParams,\n providerName?: string,\n): AsyncIterable<AIChunk> {\n const startedAt = Date.now();\n let lastUsage: AIUsage | undefined;\n try {\n for await (const chunk of source) {\n if (chunk.type === \"done\" && chunk.usage) {\n lastUsage = chunk.usage;\n }\n yield chunk;\n }\n } finally {\n if (lastUsage && params.onUsage) {\n try {\n params.onUsage({\n ...lastUsage,\n model: params.model,\n provider: providerName,\n });\n } catch {\n // operator-supplied callback errors must not affect stream consumers\n }\n }\n if (params.onSpan) {\n try {\n params.onSpan({\n durationMs: Date.now() - startedAt,\n model: params.model,\n provider: providerName,\n usage: lastUsage,\n });\n } catch {\n // same\n }\n }\n }\n}\n",
8
8
  "// Provider-agnostic reasoning translation. Consumers set one portable knob —\n// `reasoning: { effort }` — and each provider maps it to the wire shape the\n// NAMED MODEL accepts. This is where the per-model API divergence lives:\n//\n// - Modern Anthropic (Opus 4.5–4.8, Sonnet 4.6, Fable/Mythos 5): adaptive\n// thinking + `output_config.effort`. `budget_tokens` 400s here.\n// - Haiku 4.5: adaptive thinking only (no `effort`).\n// - Legacy Anthropic (Sonnet 4.5/4, Opus 4/4.1, 3.7 Sonnet): extended\n// thinking with `budget_tokens`. `output_config.effort` 400s here.\n// - OpenAI reasoning models (o-series, GPT-5): `reasoning.effort`. Non-reasoning\n// models (gpt-4.1, gpt-4o) have no effort dial — ignored.\n// - Gemini 2.5: `thinkingConfig.thinkingBudget`.\n//\n// Model classification is by ID pattern (a Models-API capability lookup would be\n// a network round-trip per request). THIS TABLE IS THE MAINTENANCE POINT — add\n// new model families here as they ship.\n\nimport type { ReasoningConfig, ReasoningEffort } from \"../../../types/ai\";\n\nconst EFFORT_ORDER: ReasoningEffort[] = [\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"max\",\n];\n\n// Anthropic models that take adaptive thinking + output_config.effort.\nconst ANTHROPIC_EFFORT = [/opus-4-[5-8]/, /sonnet-4-6/, /fable-5/, /mythos-5/];\n// Anthropic models with adaptive thinking but NO effort parameter. Reserved:\n// only add a model here once it's CONFIRMED to accept adaptive thinking without\n// `output_config.effort`. Unconfirmed models fall through to \"none\" (no-op) so\n// we never risk a 400 — Haiku 4.5, for instance, rejects `effort` and is not\n// confirmed for adaptive, so it stays out.\nconst ANTHROPIC_ADAPTIVE_ONLY: RegExp[] = [];\n// Anthropic models that use legacy extended thinking (budget_tokens).\nconst ANTHROPIC_LEGACY_THINKING = [\n /sonnet-4-5/,\n /sonnet-4-0/,\n /sonnet-4-2025/,\n /opus-4-0/,\n /opus-4-1/,\n /opus-4-2025/,\n /3-7-sonnet/,\n];\n// Anthropic models that REMOVED temperature/top_p/top_k (sending them 400s).\nconst ANTHROPIC_NO_SAMPLING = [/opus-4-[78]/, /fable-5/, /mythos-5/];\n// Anthropic models that support the `max` effort tier (others clamp max→high).\nconst ANTHROPIC_MAX_EFFORT = [\n /opus-4-[678]/,\n /sonnet-4-6/,\n /fable-5/,\n /mythos-5/,\n];\n// OpenAI reasoning models (effort-capable); everything else ignores effort.\nconst OPENAI_REASONING = [/(^|[^a-z])o[1345](-|$)/, /gpt-5/];\n// OpenAI reasoning models that support the `minimal` tier (others clamp →low).\nconst OPENAI_MINIMAL_EFFORT = [/gpt-5/];\n\nconst matches = (model: string, patterns: RegExp[]) =>\n patterns.some((pattern) => pattern.test(model));\n\nexport type AnthropicReasoningMode = \"effort\" | \"adaptive\" | \"legacy\" | \"none\";\n\nexport const anthropicReasoningMode = (\n model: string,\n): AnthropicReasoningMode => {\n if (matches(model, ANTHROPIC_EFFORT)) return \"effort\";\n if (matches(model, ANTHROPIC_ADAPTIVE_ONLY)) return \"adaptive\";\n if (matches(model, ANTHROPIC_LEGACY_THINKING)) return \"legacy\";\n\n return \"none\";\n};\n\n/** Modern Anthropic + Fable/Mythos reject temperature/top_p/top_k entirely. */\nexport const anthropicSupportsSampling = (model: string) =>\n !matches(model, ANTHROPIC_NO_SAMPLING);\n\nexport const isOpenAIReasoningModel = (model: string) =>\n matches(model, OPENAI_REASONING);\n\n// effort → legacy thinking budget (tokens). Kept under typical max_tokens; the\n// Anthropic provider raises max_tokens to fit when thinking is enabled.\nconst EFFORT_BUDGET: Record<ReasoningEffort, number> = {\n high: 16384,\n low: 2048,\n max: 32768,\n medium: 8192,\n minimal: 1024,\n};\n\n// budget tokens → nearest effort (when a caller gave only budgetTokens but the\n// target model is effort-based).\nconst budgetToEffort = (budget: number): ReasoningEffort => {\n if (budget <= 2048) return \"low\";\n if (budget <= 8192) return \"medium\";\n if (budget <= 16384) return \"high\";\n\n return \"max\";\n};\n\n/** The portable effort a config asks for, deriving from budgetTokens if needed. */\nexport const resolveEffort = (\n reasoning: ReasoningConfig,\n): ReasoningEffort | null => {\n if (reasoning.effort) return reasoning.effort;\n if (typeof reasoning.budgetTokens === \"number\") {\n return budgetToEffort(reasoning.budgetTokens);\n }\n\n return null;\n};\n\n/** The budget a config asks for, deriving from effort if needed. */\nexport const resolveBudgetTokens = (\n reasoning: ReasoningConfig,\n): number | null => {\n if (typeof reasoning.budgetTokens === \"number\") return reasoning.budgetTokens;\n if (reasoning.effort) return EFFORT_BUDGET[reasoning.effort];\n\n return null;\n};\n\nconst clampEffort = (\n effort: ReasoningEffort,\n allowed: ReasoningEffort[],\n): ReasoningEffort => {\n if (allowed.includes(effort)) return effort;\n // Walk DOWN the order to the nearest allowed tier (never silently escalate).\n const idx = EFFORT_ORDER.indexOf(effort);\n for (let lower = idx - 1; lower >= 0; lower -= 1) {\n const candidate = EFFORT_ORDER[lower];\n if (candidate && allowed.includes(candidate)) return candidate;\n }\n\n return allowed[0] ?? effort;\n};\n\n/** Anthropic `output_config.effort` value for an effort-capable model, or null. */\nexport const anthropicEffortValue = (\n model: string,\n reasoning: ReasoningConfig,\n) => {\n const effort = resolveEffort(reasoning);\n if (!effort) return null;\n const allowed: ReasoningEffort[] = matches(model, ANTHROPIC_MAX_EFFORT)\n ? [\"low\", \"medium\", \"high\", \"max\"]\n : [\"low\", \"medium\", \"high\"];\n\n return clampEffort(effort, allowed);\n};\n\n/** OpenAI `reasoning.effort` value for a reasoning model, or null. */\nexport const openaiEffortValue = (\n model: string,\n reasoning: ReasoningConfig,\n) => {\n if (!isOpenAIReasoningModel(model)) return null;\n const effort = resolveEffort(reasoning);\n if (!effort) return null;\n const allowed: ReasoningEffort[] = matches(model, OPENAI_MINIMAL_EFFORT)\n ? [\"minimal\", \"low\", \"medium\", \"high\"]\n : [\"low\", \"medium\", \"high\"];\n // OpenAI has no `max`; clamp it to `high`.\n const requested = effort === \"max\" ? \"high\" : effort;\n\n return clampEffort(requested, allowed);\n};\n",
9
- "import type {\n AIProviderConfig,\n AIProviderContentBlock,\n AIProviderMessage,\n AIProviderStreamParams,\n AIProviderToolDefinition,\n AIResponseMetadata,\n AIUsage,\n} from \"../../../types/ai\";\n\n// Opportunistic HTTP/2 multiplexing for outbound HTTPS (Bun 1.3.14+).\n// The `protocol` option lands in @types/bun 1.3.14; widen locally for now.\nimport { instrumentAIProvider } from \"./instrumentation\";\nimport { ProviderError } from \"../errors/providerError\";\nimport { isOpenAIReasoningModel, openaiEffortValue } from \"./reasoning\";\n// Hard-skip on non-HTTPS — Bun's h2 client throws HTTP2Unsupported on h2c.\ntype H2Init = RequestInit & { protocol?: \"http2\" };\nconst h2IfHttps = (url: string): H2Init =>\n url.startsWith(\"https://\") ? { protocol: \"http2\" } : {};\n\nexport type OpenAIConfig = {\n apiKey?: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n headers?:\n | HeadersInit\n | ((params: AIProviderStreamParams) => HeadersInit | Promise<HeadersInit>);\n modelForCapabilities?: (model: string) => string;\n providerName?: string;\n tokenSource?: () => Promise<string> | string;\n transformRequestBody?: (\n body: Record<string, unknown>,\n params: AIProviderStreamParams,\n ) => Record<string, unknown>;\n};\n\ntype OpenAIMessage = {\n content: string | Array<Record<string, unknown>> | null;\n role: \"user\" | \"assistant\" | \"system\" | \"tool\";\n tool_call_id?: string;\n tool_calls?: Array<{\n function: { arguments: string; name: string };\n id: string;\n type: \"function\";\n }>;\n};\n\ntype PendingToolCall = {\n arguments: string;\n id: string;\n name: string;\n};\n\ntype UsageRef = {\n current: AIUsage | undefined;\n};\n\ntype MetadataRef = {\n current: AIResponseMetadata | undefined;\n};\n\ntype StreamState = {\n buffer: string;\n metadataRef: MetadataRef;\n pendingToolCalls: Map<number, PendingToolCall>;\n usageRef: UsageRef;\n};\n\nconst DEFAULT_BASE_URL = \"https://api.openai.com\";\nconst SSE_DATA_PREFIX_LENGTH = 6;\nconst DONE_SENTINEL = \"[DONE]\";\nconst NOT_FOUND = -1;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst isRecordArray = (\n value: unknown,\n): value is Array<Record<string, unknown>> =>\n Array.isArray(value) && value.length > 0 && isRecord(value[0]);\n\nconst hasArrayContent = (\n msg: AIProviderMessage,\n): msg is AIProviderMessage & { content: AIProviderContentBlock[] } =>\n typeof msg.content !== \"string\" && Array.isArray(msg.content);\n\nconst buildToolMessages = (blocks: AIProviderContentBlock[]) => {\n const toolUseBlocks = blocks.filter((block) => block.type === \"tool_use\");\n const toolResultBlocks = blocks.filter(\n (block) => block.type === \"tool_result\",\n );\n const messages: OpenAIMessage[] = [];\n\n if (toolUseBlocks.length > 0) {\n messages.push({\n content: null,\n role: \"assistant\",\n tool_calls: toolUseBlocks.map((block) => ({\n function: {\n arguments:\n typeof block.input === \"string\"\n ? block.input\n : JSON.stringify(block.input),\n name: block.name,\n },\n id: block.id,\n type: \"function\" as const,\n })),\n });\n }\n\n for (const result of toolResultBlocks) {\n messages.push({\n content: typeof result.content === \"string\" ? result.content : \"\",\n role: \"tool\",\n tool_call_id: result.tool_use_id,\n });\n }\n\n return messages;\n};\n\nconst processMessageAtIndex = (\n result: OpenAIMessage[],\n msg: AIProviderMessage,\n idx: number,\n) => {\n if (!hasArrayContent(msg)) {\n return;\n }\n\n const hasToolBlocks = msg.content.some(\n (block) => block.type === \"tool_use\" || block.type === \"tool_result\",\n );\n\n if (!hasToolBlocks) {\n return;\n }\n\n const toolMessages = buildToolMessages(msg.content);\n result.splice(idx, 1, ...toolMessages);\n};\n\nconst convertSingleMessage = (\n result: OpenAIMessage[],\n msg: AIProviderMessage | undefined,\n idx: number,\n) => {\n if (!msg) {\n return;\n }\n\n processMessageAtIndex(result, msg, idx);\n};\n\nconst convertToolResultMessages = (\n messages: OpenAIMessage[],\n params: AIProviderStreamParams,\n) => {\n const result = [...messages];\n\n for (let idx = 0; idx < params.messages.length; idx++) {\n convertSingleMessage(result, params.messages[idx], idx);\n }\n\n return result;\n};\n\nconst mapToolDefinitions = (tools: AIProviderToolDefinition[]) =>\n tools.map((tool) => ({\n function: {\n description: tool.description,\n name: tool.name,\n parameters: tool.input_schema,\n },\n type: \"function\",\n }));\n\nconst mapContentBlockToOpenAI = (block: AIProviderContentBlock) => {\n if (block.type === \"image\") {\n return {\n image_url: {\n url:\n block.source.type === \"url\"\n ? block.source.url\n : `data:${block.source.media_type};base64,${block.source.data}`,\n },\n type: \"image_url\",\n };\n }\n\n if (block.type === \"document\") {\n return {\n file: {\n file_data:\n block.source.type === \"url\"\n ? block.source.url\n : `data:${block.source.media_type};base64,${block.source.data}`,\n filename: block.name ?? \"document.pdf\",\n },\n type: \"file\",\n };\n }\n\n if (block.type === \"audio\") {\n return {\n input_audio: { data: block.source.data, format: block.source.format },\n type: \"input_audio\",\n };\n }\n\n if (block.type === \"video\") {\n return {\n type: \"video_url\",\n video_url: {\n url:\n block.source.type === \"url\"\n ? block.source.url\n : `data:${block.source.media_type};base64,${block.source.data}`,\n },\n };\n }\n\n if (block.type === \"text\") {\n return { text: block.content, type: \"text\" };\n }\n\n return null;\n};\n\nconst mapOpenAIContent = (msg: AIProviderStreamParams[\"messages\"][number]) => {\n if (typeof msg.content === \"string\") {\n return msg.content;\n }\n\n const hasMedia = msg.content.some(\n (block) =>\n block.type === \"image\" ||\n block.type === \"document\" ||\n block.type === \"audio\" ||\n block.type === \"video\",\n );\n\n if (!hasMedia) {\n return null;\n }\n\n return msg.content\n .map(mapContentBlockToOpenAI)\n .filter((mapped) => mapped !== null);\n};\n\nconst buildRequestBody = (\n params: AIProviderStreamParams,\n capabilityModel = params.model,\n) => {\n const messages = convertToolResultMessages(\n params.messages.map((msg) => ({\n content: mapOpenAIContent(msg),\n role: msg.role,\n })),\n params,\n );\n\n const body: Record<string, unknown> = {\n messages,\n model: params.model,\n stream: true,\n stream_options: { include_usage: true },\n };\n\n if (params.tools && params.tools.length > 0) {\n body.tools = mapToolDefinitions(params.tools);\n if (\n params.toolChoice === \"auto\" ||\n params.toolChoice === \"none\" ||\n params.toolChoice === \"required\"\n ) {\n body.tool_choice = params.toolChoice;\n } else if (params.toolChoice && typeof params.toolChoice === \"object\") {\n body.tool_choice = {\n function: { name: params.toolChoice.name },\n type: \"function\",\n };\n }\n if (typeof params.parallelToolCalls === \"boolean\") {\n body.parallel_tool_calls = params.parallelToolCalls;\n }\n }\n\n // Reasoning models (o-series, GPT-5) reject temperature/top_p and use\n // `max_completion_tokens`; they take a `reasoning_effort` dial instead. Other\n // models take the usual sampling params and ignore reasoning.\n if (isOpenAIReasoningModel(capabilityModel)) {\n if (typeof params.maxTokens === \"number\") {\n body.max_completion_tokens = params.maxTokens;\n }\n if (params.reasoning) {\n const effort = openaiEffortValue(capabilityModel, params.reasoning);\n if (effort) body.reasoning_effort = effort;\n }\n } else {\n if (typeof params.temperature === \"number\") {\n body.temperature = params.temperature;\n }\n if (typeof params.topP === \"number\") body.top_p = params.topP;\n if (typeof params.maxTokens === \"number\")\n body.max_tokens = params.maxTokens;\n }\n if (params.stopSequences && params.stopSequences.length > 0)\n body.stop = params.stopSequences;\n if (typeof params.seed === \"number\") body.seed = params.seed;\n if (typeof params.frequencyPenalty === \"number\")\n body.frequency_penalty = params.frequencyPenalty;\n if (typeof params.presencePenalty === \"number\")\n body.presence_penalty = params.presencePenalty;\n\n if (params.responseFormat) {\n if (\n params.responseFormat.type === \"text\" ||\n params.responseFormat.type === \"json_object\"\n ) {\n body.response_format = { type: params.responseFormat.type };\n } else if (params.responseFormat.type === \"json_schema\") {\n body.response_format = {\n json_schema: {\n name: params.responseFormat.name,\n schema: params.responseFormat.schema,\n strict: params.responseFormat.strict ?? true,\n },\n type: \"json_schema\",\n };\n }\n }\n\n return body;\n};\n\nconst parseToolInput = (rawArguments: string) => {\n try {\n return JSON.parse(rawArguments);\n } catch {\n return rawArguments;\n }\n};\n\nconst flushPendingToolCalls = function* (\n pendingToolCalls: Map<number, PendingToolCall>,\n) {\n for (const [, tool] of pendingToolCalls) {\n const input = parseToolInput(tool.arguments);\n yield {\n id: tool.id,\n input,\n name: tool.name,\n type: \"tool_use\" as const,\n };\n }\n\n pendingToolCalls.clear();\n};\n\nconst extractUsage = (\n parsedUsage: Partial<Record<string, number>>,\n): AIUsage => {\n const prompt = parsedUsage.prompt_tokens ?? 0;\n const cached = parsedUsage.cached_tokens ?? 0;\n\n // OpenAI's prompt_tokens INCLUDES cached input tokens. Split the cached\n // portion out (as cacheReadInputTokens) and report only the uncached part as\n // inputTokens — mirroring Anthropic, where input_tokens excludes cache. This\n // lets a cache-aware consumer discount cached input (~10% of full price)\n // instead of billing it at the full input rate.\n return {\n cacheReadInputTokens: cached,\n cacheWriteInputTokens: parsedUsage.cache_write_tokens || undefined,\n costCredits: parsedUsage.cost,\n inputTokens: Math.max(0, prompt - cached),\n outputTokens: parsedUsage.completion_tokens ?? 0,\n reasoningTokens: parsedUsage.reasoning_tokens || undefined,\n upstreamInferenceCostCredits:\n parsedUsage.upstream_inference_cost || undefined,\n };\n};\n\nconst resolveToolCallIndex = (toolCall: Record<string, unknown>) => {\n const raw = typeof toolCall.index === \"number\" ? toolCall.index : NOT_FOUND;\n\n return raw < 0 ? undefined : raw;\n};\n\nconst initPendingToolCall = (\n toolCall: Record<string, unknown>,\n func: Record<string, unknown> | null,\n index: number,\n pendingToolCalls: Map<number, PendingToolCall>,\n) => {\n if (pendingToolCalls.has(index)) {\n return;\n }\n\n const toolId = typeof toolCall.id === \"string\" ? toolCall.id : \"\";\n const toolName = func && typeof func.name === \"string\" ? func.name : \"\";\n\n pendingToolCalls.set(index, {\n arguments: \"\",\n id: toolId,\n name: toolName,\n });\n};\n\nconst updatePendingToolCall = (\n toolCall: Record<string, unknown>,\n func: Record<string, unknown> | null,\n pending: PendingToolCall,\n) => {\n if (typeof toolCall.id === \"string\") {\n pending.id = toolCall.id;\n }\n\n if (func && typeof func.name === \"string\") {\n pending.name = func.name;\n }\n\n if (func && typeof func.arguments === \"string\") {\n pending.arguments += func.arguments;\n }\n};\n\nconst processToolCallDelta = (\n toolCall: Record<string, unknown>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) => {\n const index = resolveToolCallIndex(toolCall);\n if (index === undefined) {\n return;\n }\n\n const func = isRecord(toolCall.function) ? toolCall.function : null;\n initPendingToolCall(toolCall, func, index, pendingToolCalls);\n\n const pending = pendingToolCalls.get(index);\n if (!pending) {\n return;\n }\n\n updatePendingToolCall(toolCall, func, pending);\n};\n\nconst processToolCallDeltas = (\n toolCalls: Array<Record<string, unknown>>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) => {\n for (const toolCall of toolCalls) {\n processToolCallDelta(toolCall, pendingToolCalls);\n }\n};\n\nconst processDelta = function* (\n delta: Record<string, unknown>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) {\n if (typeof delta.content === \"string\") {\n yield { content: delta.content, type: \"text\" as const };\n }\n\n if (isRecordArray(delta.tool_calls)) {\n processToolCallDeltas(delta.tool_calls, pendingToolCalls);\n }\n\n if (Array.isArray(delta.annotations)) {\n for (const annotation of delta.annotations) {\n if (!isRecord(annotation) || annotation.type !== \"url_citation\") continue;\n const citation = isRecord(annotation.url_citation)\n ? annotation.url_citation\n : annotation;\n if (typeof citation.url !== \"string\") continue;\n yield {\n content:\n typeof citation.content === \"string\" ? citation.content : undefined,\n endIndex:\n typeof citation.end_index === \"number\"\n ? citation.end_index\n : undefined,\n startIndex:\n typeof citation.start_index === \"number\"\n ? citation.start_index\n : undefined,\n title: typeof citation.title === \"string\" ? citation.title : undefined,\n type: \"citation\" as const,\n url: citation.url,\n };\n }\n }\n};\n\nconst narrowResponseMetadata = (\n parsed: Record<string, unknown>,\n): AIResponseMetadata | undefined => {\n const providerMetadata = isRecord(parsed.openrouter_metadata)\n ? parsed.openrouter_metadata\n : undefined;\n const generationId = typeof parsed.id === \"string\" ? parsed.id : undefined;\n const model = typeof parsed.model === \"string\" ? parsed.model : undefined;\n const serviceTier =\n typeof parsed.service_tier === \"string\" ? parsed.service_tier : undefined;\n const selected =\n providerMetadata && isRecord(providerMetadata.endpoints)\n ? providerMetadata.endpoints.available\n : undefined;\n const selectedEndpoint = Array.isArray(selected)\n ? selected.find((entry) => isRecord(entry) && entry.selected === true)\n : undefined;\n const provider =\n isRecord(selectedEndpoint) && typeof selectedEndpoint.provider === \"string\"\n ? selectedEndpoint.provider\n : undefined;\n if (!providerMetadata && !generationId && !model && !serviceTier) return;\n\n return { generationId, model, provider, providerMetadata, serviceTier };\n};\n\nconst processChoice = function* (\n choice: Record<string, unknown>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) {\n const delta = isRecord(choice.delta) ? choice.delta : null;\n if (delta) {\n yield* processDelta(delta, pendingToolCalls);\n }\n\n if (choice.finish_reason === \"tool_calls\") {\n yield* flushPendingToolCalls(pendingToolCalls);\n }\n};\n\nconst narrowUsageRecord = (parsed: Record<string, unknown>) => {\n if (!isRecord(parsed.usage)) {\n return undefined;\n }\n\n const { usage } = parsed;\n const promptTokens =\n typeof usage.prompt_tokens === \"number\" ? usage.prompt_tokens : 0;\n const completionTokens =\n typeof usage.completion_tokens === \"number\" ? usage.completion_tokens : 0;\n const cachedTokens =\n isRecord(usage.prompt_tokens_details) &&\n typeof usage.prompt_tokens_details.cached_tokens === \"number\"\n ? usage.prompt_tokens_details.cached_tokens\n : 0;\n const cacheWriteTokens =\n isRecord(usage.prompt_tokens_details) &&\n typeof usage.prompt_tokens_details.cache_write_tokens === \"number\"\n ? usage.prompt_tokens_details.cache_write_tokens\n : 0;\n const reasoningTokens =\n isRecord(usage.completion_tokens_details) &&\n typeof usage.completion_tokens_details.reasoning_tokens === \"number\"\n ? usage.completion_tokens_details.reasoning_tokens\n : 0;\n const cost = typeof usage.cost === \"number\" ? usage.cost : undefined;\n const upstreamInferenceCost =\n isRecord(usage.cost_details) &&\n typeof usage.cost_details.upstream_inference_cost === \"number\"\n ? usage.cost_details.upstream_inference_cost\n : undefined;\n\n const normalized = extractUsage({\n cache_write_tokens: cacheWriteTokens,\n cached_tokens: cachedTokens,\n completion_tokens: completionTokens,\n cost,\n prompt_tokens: promptTokens,\n reasoning_tokens: reasoningTokens,\n upstream_inference_cost: upstreamInferenceCost,\n });\n if (isRecord(usage.server_tool_use)) {\n normalized.serverToolUse = Object.fromEntries(\n Object.entries(usage.server_tool_use).filter(\n (entry): entry is [string, number] => typeof entry[1] === \"number\",\n ),\n );\n }\n\n return normalized;\n};\n\nconst processSSELine = function* (\n line: string,\n pendingToolCalls: Map<number, PendingToolCall>,\n) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith(\"data: \")) {\n return;\n }\n\n const data = trimmed.slice(SSE_DATA_PREFIX_LENGTH);\n if (data === DONE_SENTINEL) {\n yield* flushPendingToolCalls(pendingToolCalls);\n\n return;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(data);\n } catch {\n return;\n }\n\n const usageUpdate = narrowUsageRecord(parsed);\n if (usageUpdate) {\n yield { type: \"usage_update\" as const, usage: usageUpdate };\n }\n\n const metadata = narrowResponseMetadata(parsed);\n if (metadata) {\n yield { metadata, type: \"response_metadata\" as const };\n }\n\n const { choices } = parsed;\n if (!isRecordArray(choices)) {\n return;\n }\n\n const [firstChoice] = choices;\n if (!firstChoice) {\n return;\n }\n\n yield* processChoice(firstChoice, pendingToolCalls);\n};\n\nconst isUsageUpdate = (chunk: {\n type: string;\n usage?: AIUsage;\n}): chunk is { type: \"usage_update\"; usage: AIUsage } =>\n chunk.type === \"usage_update\";\n\nconst collectYieldableChunks = (\n line: string,\n pendingToolCalls: Map<number, PendingToolCall>,\n usageRef: UsageRef,\n metadataRef: MetadataRef,\n) => {\n const allChunks = Array.from(processSSELine(line, pendingToolCalls));\n const usageChunks = allChunks.filter(isUsageUpdate);\n const lastUsage = usageChunks.at(NOT_FOUND);\n\n if (lastUsage) {\n usageRef.current = lastUsage.usage;\n }\n\n const metadataChunks = allChunks.filter(\n (chunk) => chunk.type === \"response_metadata\",\n );\n const lastMetadata = metadataChunks.at(NOT_FOUND);\n if (lastMetadata && \"metadata\" in lastMetadata) {\n metadataRef.current = {\n ...metadataRef.current,\n ...lastMetadata.metadata,\n providerMetadata: {\n ...metadataRef.current?.providerMetadata,\n ...lastMetadata.metadata.providerMetadata,\n },\n };\n }\n\n return allChunks.filter(\n (chunk) => !isUsageUpdate(chunk) && chunk.type !== \"response_metadata\",\n );\n};\n\nconst processSSELines = function* (\n lines: string[],\n pendingToolCalls: Map<number, PendingToolCall>,\n usageRef: UsageRef,\n metadataRef: MetadataRef,\n) {\n for (const line of lines) {\n yield* collectYieldableChunks(\n line,\n pendingToolCalls,\n usageRef,\n metadataRef,\n );\n }\n};\n\nconst processStreamValue = (\n value: Uint8Array,\n decoder: TextDecoder,\n state: StreamState,\n) => {\n state.buffer += decoder.decode(value, { stream: true });\n const lines = state.buffer.split(\"\\n\");\n state.buffer = lines.pop() ?? \"\";\n\n return lines;\n};\n\nconst drainReader = async function* (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: StreamState,\n signal?: AbortSignal,\n) {\n /* eslint-disable no-await-in-loop */\n for (\n let result = await reader.read();\n !result.done && !signal?.aborted;\n result = await reader.read()\n ) {\n /* eslint-enable no-await-in-loop */\n const lines = processStreamValue(result.value, decoder, state);\n yield* processSSELines(\n lines,\n state.pendingToolCalls,\n state.usageRef,\n state.metadataRef,\n );\n }\n};\n\nconst parseSSEStream = async function* (\n body: ReadableStream<Uint8Array>,\n initialMetadata?: AIResponseMetadata,\n signal?: AbortSignal,\n) {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const state: StreamState = {\n buffer: \"\",\n metadataRef: { current: initialMetadata },\n pendingToolCalls: new Map<number, PendingToolCall>(),\n usageRef: { current: undefined },\n };\n\n try {\n yield* drainReader(reader, decoder, state, signal);\n yield {\n metadata: state.metadataRef.current,\n type: \"done\" as const,\n usage: state.usageRef.current,\n };\n } finally {\n reader.releaseLock();\n }\n};\n\nconst fetchOpenAIStream = async function* (\n baseUrl: string,\n apiKey: string,\n body: Record<string, unknown>,\n fetchImpl: typeof globalThis.fetch,\n headers: HeadersInit,\n providerName: string,\n signal?: AbortSignal,\n) {\n const target = `${baseUrl}/v1/chat/completions`;\n const requestHeaders = new Headers(headers);\n requestHeaders.set(\"Authorization\", `Bearer ${apiKey}`);\n requestHeaders.set(\"Content-Type\", \"application/json\");\n const response = await fetchImpl(target, {\n ...h2IfHttps(target),\n body: JSON.stringify(body),\n headers: requestHeaders,\n method: \"POST\",\n signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw ProviderError.fromResponse(providerName, response.status, errorText);\n }\n\n if (!response.body) {\n throw new ProviderError({\n message: `${providerName} API returned no response body`,\n provider: providerName,\n retryable: true,\n });\n }\n\n yield* parseSSEStream(\n response.body,\n {\n generationId: response.headers.get(\"X-Generation-Id\") ?? undefined,\n providerMetadata: {\n cacheAge: response.headers.get(\"X-OpenRouter-Cache-Age\") ?? undefined,\n cacheSourceId:\n response.headers.get(\"X-OpenRouter-Cache-Source-Id\") ?? undefined,\n cacheStatus:\n response.headers.get(\"X-OpenRouter-Cache-Status\") ?? undefined,\n cacheTtl: response.headers.get(\"X-OpenRouter-Cache-TTL\") ?? undefined,\n },\n },\n signal,\n );\n};\n\nexport const openai = (config: OpenAIConfig): AIProviderConfig => {\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n const fetchImpl = config.fetch ?? globalThis.fetch;\n const providerName = config.providerName ?? \"openai\";\n if (!config.apiKey && !config.tokenSource) {\n throw new Error(\"openai() requires either apiKey or tokenSource\");\n }\n const resolveKey = async () => {\n if (config.tokenSource) {\n return await Promise.resolve(config.tokenSource());\n }\n return config.apiKey!;\n };\n const resolveHeaders = async (params: AIProviderStreamParams) =>\n typeof config.headers === \"function\"\n ? await config.headers(params)\n : (config.headers ?? {});\n\n return instrumentAIProvider(\n {\n stream: (params: AIProviderStreamParams) => {\n const openaiBody = buildRequestBody(\n params,\n config.modelForCapabilities?.(params.model) ?? params.model,\n );\n const body = config.transformRequestBody\n ? config.transformRequestBody(openaiBody, params)\n : openaiBody;\n return (async function* () {\n const [apiKey, headers] = await Promise.all([\n resolveKey(),\n resolveHeaders(params),\n ]);\n yield* fetchOpenAIStream(\n baseUrl,\n apiKey,\n body,\n fetchImpl,\n headers,\n providerName,\n params.signal,\n );\n })();\n },\n },\n providerName,\n );\n};\n",
10
- "import type {\n AIProviderConfig,\n AIProviderContentBlock,\n AIProviderMessage,\n AIProviderStreamParams,\n AIProviderToolDefinition,\n AIUsage,\n} from \"../../../types/ai\";\nimport { instrumentAIProvider } from \"./instrumentation\";\nimport { ProviderError } from \"../errors/providerError\";\nimport { isOpenAIReasoningModel, openaiEffortValue } from \"./reasoning\";\n\n// Opportunistic HTTP/2 multiplexing for outbound HTTPS (Bun 1.3.14+).\n// The `protocol` option lands in @types/bun 1.3.14; widen locally for now.\n// Hard-skip on non-HTTPS — Bun's h2 client throws HTTP2Unsupported on h2c.\ntype H2Init = RequestInit & { protocol?: \"http2\" };\nconst h2IfHttps = (url: string): H2Init =>\n url.startsWith(\"https://\") ? { protocol: \"http2\" } : {};\n\nexport type OpenAIResponsesConfig = {\n apiKey?: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n headers?:\n | HeadersInit\n | ((params: AIProviderStreamParams) => HeadersInit | Promise<HeadersInit>);\n imageModels?: Set<string> | string[];\n modelForCapabilities?: (model: string) => string;\n providerName?: string;\n tokenSource?: () => Promise<string> | string;\n transformRequestBody?: (\n body: Record<string, unknown>,\n params: AIProviderStreamParams,\n ) => Record<string, unknown>;\n};\n\ntype PendingFunctionCall = {\n callId: string;\n name: string;\n arguments: string;\n};\n\ntype StreamState = {\n buffer: string;\n currentEvent: string;\n pendingCalls: Map<string, PendingFunctionCall>;\n usage: AIUsage | undefined;\n};\n\nconst DEFAULT_BASE_URL = \"https://api.openai.com\";\nconst EVENT_PREFIX_LENGTH = 7;\nconst DATA_PREFIX_LENGTH = 6;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst isRecordArray = (\n value: unknown,\n): value is Array<Record<string, unknown>> =>\n Array.isArray(value) && value.length > 0 && isRecord(value[0]);\n\n/* ─── Message conversion ─── */\n\nconst mapBlockToResponsesFormat = (block: AIProviderContentBlock) => {\n if (block.type === \"text\") {\n return { text: block.content, type: \"input_text\" };\n }\n\n if (block.type === \"image\") {\n return {\n image_url: {\n url:\n block.source.type === \"url\"\n ? block.source.url\n : `data:${block.source.media_type};base64,${block.source.data}`,\n },\n type: \"input_image\",\n };\n }\n\n if (block.type === \"document\") {\n return {\n file: {\n file_data:\n block.source.type === \"url\"\n ? block.source.url\n : `data:${block.source.media_type};base64,${block.source.data}`,\n filename: block.name ?? \"document.pdf\",\n },\n type: \"input_file\",\n };\n }\n\n if (block.type === \"audio\") {\n return {\n input_audio: { data: block.source.data, format: block.source.format },\n type: \"input_audio\",\n };\n }\n\n if (block.type === \"video\") {\n return {\n type: \"input_video\",\n video_url:\n block.source.type === \"url\"\n ? block.source.url\n : `data:${block.source.media_type};base64,${block.source.data}`,\n };\n }\n\n return null;\n};\n\nconst mapContentToResponsesFormat = (\n content: string | AIProviderContentBlock[],\n) => {\n if (typeof content === \"string\") {\n return content;\n }\n\n const parts = content\n .map(mapBlockToResponsesFormat)\n .filter((mapped) => mapped !== null);\n\n return parts.length > 0 ? parts : \"\";\n};\n\nconst hasToolBlocks = (content: AIProviderContentBlock[]) =>\n content.some(\n (block) => block.type === \"tool_use\" || block.type === \"tool_result\",\n );\n\nconst convertToolBlock = (block: AIProviderContentBlock) => {\n if (block.type === \"tool_use\") {\n return {\n arguments:\n typeof block.input === \"string\"\n ? block.input\n : JSON.stringify(block.input),\n call_id: block.id,\n name: block.name,\n type: \"function_call\",\n };\n }\n\n if (block.type === \"tool_result\") {\n return {\n call_id: block.tool_use_id,\n output: typeof block.content === \"string\" ? block.content : \"\",\n type: \"function_call_output\",\n };\n }\n\n return null;\n};\n\nconst convertToolBlocks = (content: AIProviderContentBlock[]) =>\n content.map(convertToolBlock).filter((converted) => converted !== null);\n\nconst convertMessage = (msg: AIProviderMessage) => {\n if (\n typeof msg.content !== \"string\" &&\n Array.isArray(msg.content) &&\n hasToolBlocks(msg.content)\n ) {\n return convertToolBlocks(msg.content);\n }\n\n const content = mapContentToResponsesFormat(msg.content);\n\n return [\n {\n content,\n role: msg.role === \"system\" ? \"developer\" : msg.role,\n type: \"message\",\n },\n ];\n};\n\nconst buildInput = (messages: AIProviderMessage[]) => {\n const input: Array<Record<string, unknown>> = [];\n\n for (const msg of messages) {\n input.push(...convertMessage(msg));\n }\n\n return input;\n};\n\nconst mapToolDefinition = (tool: AIProviderToolDefinition) => ({\n description: tool.description,\n name: tool.name,\n parameters: tool.input_schema,\n type: \"function\",\n});\n\nconst buildTools = (\n tools: AIProviderToolDefinition[] | undefined,\n isImageModel: boolean,\n) => {\n const mapped = tools ? tools.map(mapToolDefinition) : [];\n const result: Array<Record<string, unknown>> = [...mapped];\n\n if (isImageModel) {\n result.push({ type: \"image_generation\" });\n }\n\n return result.length > 0 ? result : undefined;\n};\n\nconst buildRequestBody = (\n params: AIProviderStreamParams,\n isImageModel: boolean,\n capabilityModel = params.model,\n) => {\n const body: Record<string, unknown> = {\n input: buildInput(params.messages),\n model: params.model,\n stream: true,\n };\n\n if (params.systemPrompt) {\n body.instructions = params.systemPrompt;\n }\n\n const tools = buildTools(params.tools, isImageModel);\n\n if (tools) {\n body.tools = tools;\n if (\n params.toolChoice === \"auto\" ||\n params.toolChoice === \"none\" ||\n params.toolChoice === \"required\"\n ) {\n body.tool_choice = params.toolChoice;\n } else if (params.toolChoice && typeof params.toolChoice === \"object\") {\n body.tool_choice = {\n name: params.toolChoice.name,\n type: \"function\",\n };\n }\n if (typeof params.parallelToolCalls === \"boolean\") {\n body.parallel_tool_calls = params.parallelToolCalls;\n }\n }\n\n if (typeof params.temperature === \"number\")\n body.temperature = params.temperature;\n if (typeof params.topP === \"number\") body.top_p = params.topP;\n if (typeof params.maxTokens === \"number\")\n body.max_output_tokens = params.maxTokens;\n if (params.stopSequences && params.stopSequences.length > 0)\n body.stop = params.stopSequences;\n if (typeof params.seed === \"number\") body.seed = params.seed;\n if (typeof params.frequencyPenalty === \"number\")\n body.frequency_penalty = params.frequencyPenalty;\n if (typeof params.presencePenalty === \"number\")\n body.presence_penalty = params.presencePenalty;\n\n if (params.responseFormat) {\n if (\n params.responseFormat.type === \"text\" ||\n params.responseFormat.type === \"json_object\"\n ) {\n body.text = { format: { type: params.responseFormat.type } };\n } else if (params.responseFormat.type === \"json_schema\") {\n body.text = {\n format: {\n name: params.responseFormat.name,\n schema: params.responseFormat.schema,\n strict: params.responseFormat.strict ?? true,\n type: \"json_schema\",\n },\n };\n }\n }\n\n // Reasoning models take a `reasoning.effort` dial; non-reasoning models ignore\n // it. Effort comes from the portable `reasoning` knob, mapped per model.\n if (params.reasoning && isOpenAIReasoningModel(capabilityModel)) {\n const effort = openaiEffortValue(capabilityModel, params.reasoning);\n if (effort) {\n body.reasoning = {\n effort,\n summary: \"auto\",\n };\n }\n }\n\n return body;\n};\n\n/* ─── SSE parsing ─── */\n\nconst parseJSON = (data: string) => {\n try {\n return JSON.parse(data);\n } catch {\n return null;\n }\n};\n\nconst parseToolInput = (rawArguments: string) => {\n try {\n return JSON.parse(rawArguments);\n } catch {\n return rawArguments;\n }\n};\n\nconst extractUsage = (response: Record<string, unknown>) => {\n if (!isRecord(response.usage)) {\n return undefined;\n }\n\n const { usage } = response;\n const input = typeof usage.input_tokens === \"number\" ? usage.input_tokens : 0;\n // input_tokens INCLUDES cached input; split it out so the cached portion is\n // discounted (mirrors Anthropic) instead of billed at the full input rate.\n const cached =\n isRecord(usage.input_tokens_details) &&\n typeof usage.input_tokens_details.cached_tokens === \"number\"\n ? usage.input_tokens_details.cached_tokens\n : 0;\n\n return {\n cacheReadInputTokens: cached,\n inputTokens: Math.max(0, input - cached),\n outputTokens:\n typeof usage.output_tokens === \"number\" ? usage.output_tokens : 0,\n };\n};\n\nconst extractMimeFormat = (mimeType: unknown) => {\n if (typeof mimeType !== \"string\") {\n return \"png\";\n }\n\n if (mimeType.includes(\"jpeg\")) return \"jpeg\";\n if (mimeType.includes(\"webp\")) return \"webp\";\n\n return \"png\";\n};\n\nconst processTextDelta = function* (parsed: Record<string, unknown>) {\n if (typeof parsed.delta === \"string\") {\n yield { content: parsed.delta, type: \"text\" as const };\n }\n};\n\nconst processPartialImage = function* (parsed: Record<string, unknown>) {\n const itemId =\n typeof parsed.item_id === \"string\" ? parsed.item_id : undefined;\n const b64 =\n typeof parsed.partial_image_b64 === \"string\"\n ? parsed.partial_image_b64\n : undefined;\n\n if (b64) {\n yield {\n data: b64,\n format: \"png\",\n imageId: itemId,\n isPartial: true,\n type: \"image\" as const,\n };\n }\n};\n\nconst processFunctionCallArgumentsDelta = (\n parsed: Record<string, unknown>,\n pendingCalls: Map<string, PendingFunctionCall>,\n) => {\n const itemId = typeof parsed.item_id === \"string\" ? parsed.item_id : \"\";\n const callId = typeof parsed.call_id === \"string\" ? parsed.call_id : \"\";\n const delta =\n typeof parsed.arguments_delta === \"string\" ? parsed.arguments_delta : \"\";\n\n const existing = pendingCalls.get(itemId);\n\n if (existing) {\n existing.arguments += delta;\n } else {\n pendingCalls.set(itemId, {\n arguments: delta,\n callId,\n name: \"\",\n });\n }\n};\n\nconst processFunctionCallArgumentsDone = function* (\n parsed: Record<string, unknown>,\n pendingCalls: Map<string, PendingFunctionCall>,\n) {\n const itemId = typeof parsed.item_id === \"string\" ? parsed.item_id : \"\";\n const callId = typeof parsed.call_id === \"string\" ? parsed.call_id : \"\";\n const fullArgs = typeof parsed.arguments === \"string\" ? parsed.arguments : \"\";\n\n const pending = pendingCalls.get(itemId);\n const name = pending?.name ?? \"\";\n const args = fullArgs || pending?.arguments || \"\";\n\n pendingCalls.delete(itemId);\n\n yield {\n id: callId || pending?.callId || itemId,\n input: parseToolInput(args),\n name,\n type: \"tool_use\" as const,\n };\n};\n\nconst processOutputItemAdded = (\n parsed: Record<string, unknown>,\n pendingCalls: Map<string, PendingFunctionCall>,\n) => {\n if (!isRecord(parsed.item)) {\n return;\n }\n\n const { item } = parsed;\n const itemId = typeof item.id === \"string\" ? item.id : \"\";\n const itemType = typeof item.type === \"string\" ? item.type : \"\";\n\n if (itemType !== \"function_call\") {\n return;\n }\n\n const callId = typeof item.call_id === \"string\" ? item.call_id : \"\";\n const name = typeof item.name === \"string\" ? item.name : \"\";\n\n pendingCalls.set(itemId, {\n arguments: \"\",\n callId,\n name,\n });\n};\n\nconst isCompletedImageGeneration = (item: Record<string, unknown>) =>\n item.type === \"image_generation_call\" &&\n item.status === \"completed\" &&\n typeof item.result === \"string\" &&\n item.result !== \"\";\n\nconst buildImageChunk = (item: Record<string, unknown>) => ({\n data: typeof item.result === \"string\" ? item.result : \"\",\n format: extractMimeFormat(item.output_format),\n imageId: typeof item.id === \"string\" ? item.id : undefined,\n isPartial: false,\n revisedPrompt:\n typeof item.revised_prompt === \"string\" ? item.revised_prompt : undefined,\n type: \"image\" as const,\n});\n\nconst extractImageFromOutput = function* (\n output: Array<Record<string, unknown>>,\n) {\n const completedImages = output.filter(isCompletedImageGeneration);\n\n for (const item of completedImages) {\n yield buildImageChunk(item);\n }\n};\n\nconst processCompleted = function* (parsed: Record<string, unknown>) {\n if (!isRecord(parsed.response)) {\n yield { type: \"done\" as const, usage: undefined };\n\n return;\n }\n\n const { response } = parsed;\n const usage = extractUsage(response);\n\n if (isRecordArray(response.output)) {\n yield* extractImageFromOutput(response.output);\n }\n\n yield { type: \"done\" as const, usage };\n};\n\nconst processSSEEvent = function* (\n eventType: string,\n parsed: Record<string, unknown>,\n pendingCalls: Map<string, PendingFunctionCall>,\n) {\n switch (eventType) {\n case \"response.reasoning_summary_text.delta\": {\n const delta = typeof parsed.delta === \"string\" ? parsed.delta : \"\";\n if (!delta) break;\n\n yield {\n content: delta,\n type: \"thinking\" as const,\n };\n\n break;\n }\n\n case \"response.output_text.delta\":\n yield* processTextDelta(parsed);\n break;\n\n case \"response.image_generation_call.partial_image\":\n yield* processPartialImage(parsed);\n break;\n\n case \"response.output_item.added\":\n processOutputItemAdded(parsed, pendingCalls);\n break;\n\n case \"response.function_call_arguments.delta\":\n processFunctionCallArgumentsDelta(parsed, pendingCalls);\n break;\n\n case \"response.function_call_arguments.done\":\n yield* processFunctionCallArgumentsDone(parsed, pendingCalls);\n break;\n\n case \"response.completed\":\n yield* processCompleted(parsed);\n break;\n\n case \"response.failed\":\n case \"response.incomplete\": {\n const respObj = isRecord(parsed.response) ? parsed.response : parsed;\n const errMsg =\n isRecord(respObj.error) && typeof respObj.error.message === \"string\"\n ? respObj.error.message\n : `OpenAI Responses API: ${eventType}`;\n throw new Error(errMsg);\n }\n }\n};\n\nconst flushSSEBuffer = function* (state: StreamState) {\n if (!state.currentEvent || !state.buffer) {\n return;\n }\n\n const parsed = parseJSON(state.buffer);\n\n if (parsed) {\n yield* processSSEEvent(state.currentEvent, parsed, state.pendingCalls);\n }\n\n state.currentEvent = \"\";\n state.buffer = \"\";\n};\n\nconst parseSSELine = (trimmed: string, state: StreamState) => {\n if (trimmed.startsWith(\"event: \")) {\n state.currentEvent = trimmed.slice(EVENT_PREFIX_LENGTH);\n } else if (trimmed.startsWith(\"data: \")) {\n state.buffer = trimmed.slice(DATA_PREFIX_LENGTH);\n }\n};\n\nconst processSSELine = function* (line: string, state: StreamState) {\n const trimmed = line.trim();\n\n if (trimmed) {\n parseSSELine(trimmed, state);\n\n return;\n }\n\n yield* flushSSEBuffer(state);\n};\n\nconst processSSELines = function* (lines: string[], state: StreamState) {\n for (const line of lines) {\n yield* processSSELine(line, state);\n }\n};\n\nconst drainReader = async function* (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: StreamState,\n signal?: AbortSignal,\n) {\n let textBuffer = \"\";\n\n for (\n let result = await reader.read();\n !result.done && !signal?.aborted;\n // eslint-disable-next-line no-await-in-loop\n result = await reader.read()\n ) {\n textBuffer += decoder.decode(result.value, { stream: true });\n const lines = textBuffer.split(\"\\n\");\n textBuffer = lines.pop() ?? \"\";\n\n yield* processSSELines(lines, state);\n }\n\n if (textBuffer.trim()) {\n yield* processSSELines([textBuffer, \"\"], state);\n }\n};\n\nconst parseSSEStream = async function* (\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n) {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const state: StreamState = {\n buffer: \"\",\n currentEvent: \"\",\n pendingCalls: new Map(),\n usage: undefined,\n };\n\n try {\n yield* drainReader(reader, decoder, state, signal);\n } finally {\n reader.releaseLock();\n }\n};\n\nconst fetchResponsesStream = async function* (\n baseUrl: string,\n apiKey: string,\n body: Record<string, unknown>,\n fetchImpl: typeof globalThis.fetch,\n headers: HeadersInit,\n providerName: string,\n signal?: AbortSignal,\n) {\n const target = `${baseUrl}/v1/responses`;\n const requestHeaders = new Headers(headers);\n requestHeaders.set(\"Authorization\", `Bearer ${apiKey}`);\n requestHeaders.set(\"Content-Type\", \"application/json\");\n const response = await fetchImpl(target, {\n ...h2IfHttps(target),\n body: JSON.stringify(body),\n headers: requestHeaders,\n method: \"POST\",\n signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw ProviderError.fromResponse(providerName, response.status, errorText);\n }\n\n if (!response.body) {\n throw new ProviderError({\n message: `${providerName} Responses API returned no response body`,\n provider: providerName,\n retryable: true,\n });\n }\n\n yield* parseSSEStream(response.body, signal);\n};\n\nconst resolveImageModels = (\n imageModels: Set<string> | string[] | undefined,\n) => {\n if (!imageModels) {\n return new Set<string>();\n }\n\n if (imageModels instanceof Set) {\n return imageModels;\n }\n\n return new Set(imageModels);\n};\n\nexport const openaiResponses = (config: OpenAIResponsesConfig) => {\n if (!config.apiKey && !config.tokenSource)\n throw new Error(\"openaiResponses() requires either apiKey or tokenSource\");\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n const fetchImpl = config.fetch ?? globalThis.fetch;\n const imageModels = resolveImageModels(config.imageModels);\n const providerName = config.providerName ?? \"openai-responses\";\n const resolveKey = async () =>\n config.tokenSource\n ? await Promise.resolve(config.tokenSource())\n : config.apiKey!;\n const resolveHeaders = async (params: AIProviderStreamParams) =>\n typeof config.headers === \"function\"\n ? await config.headers(params)\n : (config.headers ?? {});\n\n return instrumentAIProvider(\n {\n stream: (params: AIProviderStreamParams) => {\n const isImageModel = imageModels.has(params.model);\n const builtBody = buildRequestBody(\n params,\n isImageModel,\n config.modelForCapabilities?.(params.model) ?? params.model,\n );\n const body = config.transformRequestBody\n ? config.transformRequestBody(builtBody, params)\n : builtBody;\n return (async function* () {\n const [apiKey, headers] = await Promise.all([\n resolveKey(),\n resolveHeaders(params),\n ]);\n yield* fetchResponsesStream(\n baseUrl,\n apiKey,\n body,\n fetchImpl,\n headers,\n providerName,\n params.signal,\n );\n })();\n },\n } satisfies AIProviderConfig,\n providerName,\n );\n};\n",
11
- "import { ProviderError } from \"../errors/providerError\";\n\nexport type OpenRouterClientConfig = {\n allowedModels?: readonly string[];\n apiKey?: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);\n tokenSource?: () => Promise<string> | string;\n};\n\nexport type OpenRouterModel = {\n id: string;\n name?: string;\n description?: string;\n context_length?: number;\n architecture?: Record<string, unknown>;\n pricing?: Record<string, string>;\n supported_parameters?: string[] | Record<string, unknown>;\n [field: string]: unknown;\n};\n\nexport type OpenRouterModelList = { data: OpenRouterModel[] };\n\nexport type OpenRouterEmbeddingRequest = {\n model: string;\n input: string | string[] | number[] | number[][];\n dimensions?: number;\n encoding_format?: \"float\" | \"base64\";\n provider?: Record<string, unknown>;\n user?: string;\n};\n\nexport type OpenRouterEmbeddingResponse = {\n data: Array<{ embedding: number[] | string; index: number; object: string }>;\n model: string;\n object: string;\n usage?: { prompt_tokens: number; total_tokens: number; cost?: number };\n};\n\nexport type OpenRouterRerankRequest = {\n model: string;\n query: string;\n documents: Array<string | { text: string }>;\n top_n?: number;\n return_documents?: boolean;\n};\n\nexport type OpenRouterRerankResponse = {\n id?: string;\n model?: string;\n results: Array<{\n document?: { text: string };\n index: number;\n relevance_score: number;\n }>;\n usage?: Record<string, number>;\n};\n\nexport type OpenRouterImageRequest = {\n model: string;\n prompt: string;\n n?: number;\n resolution?: string;\n aspect_ratio?: string;\n size?: string;\n quality?: \"auto\" | \"low\" | \"medium\" | \"high\";\n output_format?: \"png\" | \"jpeg\" | \"webp\" | \"svg\";\n background?: \"auto\" | \"transparent\" | \"opaque\";\n output_compression?: number;\n seed?: number;\n input_references?: Array<Record<string, unknown>>;\n provider?: Record<string, unknown>;\n};\n\nexport type OpenRouterImageResponse = {\n created: number;\n data: Array<{ b64_json: string; media_type?: string }>;\n usage?: Record<string, number>;\n};\n\nexport type OpenRouterResponsesRequest = Record<string, unknown> & {\n input: unknown;\n model: string;\n stream?: boolean;\n};\n\nexport type OpenRouterSpeechRequest = Record<string, unknown> & {\n input: string;\n model: string;\n voice: string;\n};\n\nexport type OpenRouterTranscriptionRequest = Record<string, unknown> & {\n model: string;\n};\n\nexport type OpenRouterVideoRequest = Record<string, unknown> & {\n model: string;\n prompt: string;\n};\n\nexport type OpenRouterHttpRequestOptions = Omit<\n RequestInit,\n \"body\" | \"headers\"\n> & {\n body?: unknown;\n headers?: HeadersInit;\n query?: Record<string, boolean | number | string | undefined>;\n};\n\nexport type OpenRouterClient = ReturnType<typeof createOpenRouterClient>;\n\nconst DEFAULT_BASE_URL = \"https://openrouter.ai/api/v1\";\n\nconst withoutLatestPrefix = (model: string) =>\n model.startsWith(\"~\") ? model.slice(1) : model;\n\nexport const openRouterModelMatchesRule = (model: string, rule: string) => {\n const normalizedModel = withoutLatestPrefix(model);\n const normalizedRule = withoutLatestPrefix(rule);\n return normalizedRule.endsWith(\"/*\")\n ? normalizedModel.startsWith(normalizedRule.slice(0, -1))\n : normalizedModel === normalizedRule;\n};\n\nconst assertAllowedModel = (\n model: string,\n allowedModels: readonly string[] | undefined,\n) => {\n if (!allowedModels) return;\n if (allowedModels.some((rule) => openRouterModelMatchesRule(model, rule)))\n return;\n throw new Error(`OpenRouter model \"${model}\" is not allowed`);\n};\n\nconst normalizePath = (path: string) =>\n path.startsWith(\"/\") ? path : `/${path}`;\n\nconst encodeModelPath = (model: string) =>\n model.split(\"/\").map(encodeURIComponent).join(\"/\");\n\nconst withQuery = (\n url: string,\n query: OpenRouterHttpRequestOptions[\"query\"],\n) => {\n if (!query) return url;\n const result = new URL(url);\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) result.searchParams.set(key, String(value));\n }\n return result.toString();\n};\n\nexport const createOpenRouterClient = (config: OpenRouterClientConfig) => {\n if (!config.apiKey && !config.tokenSource)\n throw new Error(\n \"createOpenRouterClient() requires either apiKey or tokenSource\",\n );\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n const fetchImpl = config.fetch ?? globalThis.fetch;\n const allowedModels = config.allowedModels\n ? [...config.allowedModels]\n : undefined;\n\n const requestRaw = async (\n path: string,\n options: OpenRouterHttpRequestOptions = {},\n ) => {\n const token = config.tokenSource\n ? await Promise.resolve(config.tokenSource())\n : config.apiKey!;\n const suppliedHeaders =\n typeof config.headers === \"function\"\n ? await config.headers()\n : (config.headers ?? {});\n const headers = new Headers(suppliedHeaders);\n new Headers(options.headers).forEach((value, key) =>\n headers.set(key, value),\n );\n headers.set(\"Authorization\", `Bearer ${token}`);\n let body: BodyInit | undefined;\n if (options.body instanceof FormData || options.body instanceof Blob) {\n body = options.body;\n } else if (options.body !== undefined) {\n headers.set(\"Content-Type\", \"application/json\");\n body = JSON.stringify(options.body);\n }\n const { query, ...requestInit } = options;\n const response = await fetchImpl(\n withQuery(`${baseUrl}${normalizePath(path)}`, options.query),\n { ...requestInit, body, headers },\n );\n if (!response.ok) {\n throw ProviderError.fromResponse(\n \"openrouter\",\n response.status,\n await response.text(),\n );\n }\n return response;\n };\n\n const request = async <T>(\n path: string,\n options: OpenRouterHttpRequestOptions = {},\n ): Promise<T> => (await requestRaw(path, options)).json() as Promise<T>;\n\n const listModels = async (\n query?: OpenRouterHttpRequestOptions[\"query\"],\n ): Promise<OpenRouterModelList> => {\n const result = await request<OpenRouterModelList>(\"/models\", { query });\n if (!allowedModels) return result;\n return {\n ...result,\n data: result.data.filter((model) =>\n allowedModels.some((rule) =>\n openRouterModelMatchesRule(model.id, rule),\n ),\n ),\n };\n };\n\n const filterModelList = (result: OpenRouterModelList) => {\n if (!allowedModels) return result;\n return {\n ...result,\n data: result.data.filter((model) =>\n allowedModels.some((rule) =>\n openRouterModelMatchesRule(model.id, rule),\n ),\n ),\n };\n };\n\n return {\n cancelBatch: (id: string) =>\n request<Record<string, unknown>>(\n `/batches/${encodeURIComponent(id)}/cancel`,\n {\n method: \"POST\",\n },\n ),\n createBatch: (body: Record<string, unknown>) =>\n request<Record<string, unknown>>(\"/batches\", { body, method: \"POST\" }),\n createEmbedding: (body: OpenRouterEmbeddingRequest) => {\n assertAllowedModel(body.model, allowedModels);\n return request<OpenRouterEmbeddingResponse>(\"/embeddings\", {\n body,\n method: \"POST\",\n });\n },\n generateImage: (body: OpenRouterImageRequest) => {\n assertAllowedModel(body.model, allowedModels);\n return request<OpenRouterImageResponse>(\"/images\", {\n body,\n method: \"POST\",\n });\n },\n generateVideo: (body: OpenRouterVideoRequest) => {\n assertAllowedModel(body.model, allowedModels);\n return request<Record<string, unknown>>(\"/videos\", {\n body,\n method: \"POST\",\n });\n },\n getBatch: (id: string) =>\n request<Record<string, unknown>>(`/batches/${encodeURIComponent(id)}`),\n getCredits: () => request<{ data: Record<string, number> }>(\"/credits\"),\n getCurrentKey: () => request<{ data: Record<string, unknown> }>(\"/key\"),\n getGeneration: (id: string) =>\n request<{ data: Record<string, unknown> }>(\"/generation\", {\n query: { id },\n }),\n getModelEndpoints: (model: string) => {\n assertAllowedModel(model, allowedModels);\n return request<Record<string, unknown>>(\n `/models/${encodeModelPath(model)}/endpoints`,\n );\n },\n getVideo: (id: string) =>\n request<Record<string, unknown>>(`/videos/${encodeURIComponent(id)}`),\n listImageModels: async () =>\n filterModelList(await request<OpenRouterModelList>(\"/images/models\")),\n listModels,\n listPresets: (offset = 0, limit = 100) =>\n request<{ data: Record<string, unknown>[]; total_count: number }>(\n \"/presets\",\n { query: { limit, offset } },\n ),\n listProviders: () =>\n request<{ data: Record<string, unknown>[] }>(\"/providers\"),\n listRerankModels: async () =>\n filterModelList(await request<OpenRouterModelList>(\"/rerank/models\")),\n listVideoModels: async () =>\n filterModelList(await request<OpenRouterModelList>(\"/videos/models\")),\n request,\n requestRaw,\n respond: (body: OpenRouterResponsesRequest) => {\n assertAllowedModel(body.model, allowedModels);\n return body.stream\n ? requestRaw(\"/responses\", { body, method: \"POST\" })\n : request<Record<string, unknown>>(\"/responses\", {\n body,\n method: \"POST\",\n });\n },\n rerank: (body: OpenRouterRerankRequest) => {\n assertAllowedModel(body.model, allowedModels);\n return request<OpenRouterRerankResponse>(\"/rerank\", {\n body,\n method: \"POST\",\n });\n },\n speak: (body: OpenRouterSpeechRequest) => {\n assertAllowedModel(body.model, allowedModels);\n return requestRaw(\"/audio/speech\", { body, method: \"POST\" });\n },\n transcribe: (body: OpenRouterTranscriptionRequest | FormData) => {\n if (body instanceof FormData) {\n const model = body.get(\"model\");\n if (typeof model !== \"string\")\n throw new Error(\"OpenRouter transcription FormData requires model\");\n assertAllowedModel(model, allowedModels);\n } else {\n assertAllowedModel(body.model, allowedModels);\n }\n return request<Record<string, unknown>>(\"/audio/transcriptions\", {\n body,\n method: \"POST\",\n });\n },\n };\n};\n",
12
- "import type {\n AIProviderConfig,\n AIProviderStreamParams,\n} from \"../../../types/ai\";\nimport { openai } from \"./openai\";\nimport { openaiResponses } from \"./openaiResponses\";\n\nexport type OpenRouterDataCollection = \"allow\" | \"deny\";\nexport type OpenRouterQuantization =\n | \"bf16\"\n | \"fp4\"\n | \"fp6\"\n | \"fp8\"\n | \"fp16\"\n | \"fp32\"\n | \"int4\"\n | \"int8\"\n | \"unknown\";\nexport type OpenRouterSortStrategy = \"latency\" | \"price\" | \"throughput\";\nexport type OpenRouterSort =\n | OpenRouterSortStrategy\n | {\n by: OpenRouterSortStrategy;\n partition?: \"model\" | \"none\";\n };\nexport type OpenRouterPerformancePreference =\n | number\n | {\n p50?: number;\n p75?: number;\n p90?: number;\n p99?: number;\n };\nexport type OpenRouterMaxPrice = {\n /** Maximum completion-token price in USD per million tokens. */\n completion?: number;\n /** Maximum price in USD per image. */\n image?: number;\n /** Maximum prompt-token price in USD per million tokens. */\n prompt?: number;\n /** Maximum price in USD per request. */\n request?: number;\n};\n\nexport type OpenRouterProviderRouting = {\n allowFallbacks?: boolean;\n dataCollection?: OpenRouterDataCollection;\n enforceDistillableText?: boolean;\n ignore?: readonly string[];\n maxPrice?: OpenRouterMaxPrice;\n only?: readonly string[];\n order?: readonly string[];\n preferredMaxLatency?: OpenRouterPerformancePreference;\n preferredMinThroughput?: OpenRouterPerformancePreference;\n quantizations?: readonly OpenRouterQuantization[];\n requireParameters?: boolean;\n sort?: OpenRouterSort;\n zdr?: boolean;\n};\n\nexport type OpenRouterServiceTier =\n | \"auto\"\n | \"default\"\n | \"flex\"\n | \"priority\"\n | \"fast\";\n\nexport type OpenRouterResponseCache = {\n clear?: boolean;\n enabled: boolean;\n /** OpenRouter response-cache TTL in seconds (1-86400). */\n ttlSeconds?: number;\n};\n\nexport type OpenRouterPlugin = {\n id: string;\n [option: string]: unknown;\n};\n\nexport type OpenRouterServerTool = {\n type:\n | \"openrouter:web_search\"\n | \"openrouter:web_fetch\"\n | \"openrouter:datetime\"\n | \"openrouter:image_generation\"\n | \"openrouter:apply_patch\"\n | \"openrouter:shell\"\n | \"openrouter:fusion\"\n | \"openrouter:advisor\"\n | \"openrouter:subagent\"\n | \"openrouter:experimental__search_models\";\n parameters?: Record<string, unknown>;\n};\n\nexport type OpenRouterRequestOptions = {\n /** Future OpenRouter fields. Security-sensitive routing fields are rejected. */\n extraBody?: Record<string, unknown>;\n fallbackModels?: readonly string[];\n includeReasoning?: boolean;\n maxToolCalls?: number;\n plugins?: readonly OpenRouterPlugin[];\n preset?: string;\n responseCache?: OpenRouterResponseCache;\n routerMetadata?: boolean;\n routing?: OpenRouterProviderRouting;\n serverTools?: readonly OpenRouterServerTool[];\n serviceTier?: OpenRouterServiceTier;\n sessionId?: string;\n stopServerToolsWhen?: readonly Record<string, unknown>[];\n transforms?: readonly string[];\n user?: string;\n verbosity?: \"low\" | \"medium\" | \"high\";\n};\n\nexport type OpenRouterConfig = {\n /**\n * Local model policy. Entries are exact model IDs or namespace wildcards such\n * as `anthropic/*`. Requests outside the list fail before network access.\n */\n allowedModels?: readonly string[];\n /** Preset slugs deliberately approved for use with this provider. */\n allowedPresets?: readonly string[];\n /**\n * Inference-provider policy sent as OpenRouter's `provider.only`. When\n * `routing.only` is also set, every entry must be allowed by this policy.\n */\n allowedProviders?: readonly string[];\n apiKey?: string;\n /** Up to two OpenRouter marketplace categories. */\n appCategories?: readonly string[];\n /** Public application name used for optional OpenRouter attribution. */\n appName?: string;\n /** Public application URL used for optional OpenRouter attribution. */\n appUrl?: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);\n /** Default OpenRouter request options, overridable per call. */\n requestOptions?: OpenRouterRequestOptions;\n routing?: OpenRouterProviderRouting;\n tokenSource?: () => Promise<string> | string;\n};\n\nconst DEFAULT_BASE_URL = \"https://openrouter.ai/api\";\nconst MAX_APP_CATEGORIES = 2;\n\nconst withoutLatestPrefix = (model: string) =>\n model.startsWith(\"~\") ? model.slice(1) : model;\n\nconst modelForOpenAICapabilities = (model: string) => {\n const normalized = withoutLatestPrefix(model);\n return normalized.startsWith(\"openai/\")\n ? normalized.slice(\"openai/\".length)\n : normalized;\n};\n\nconst modelMatchesRule = (model: string, rule: string) => {\n const normalizedModel = withoutLatestPrefix(model);\n const normalizedRule = withoutLatestPrefix(rule);\n if (normalizedRule.endsWith(\"/*\")) {\n return normalizedModel.startsWith(normalizedRule.slice(0, -1));\n }\n\n return normalizedModel === normalizedRule;\n};\n\nconst providerMatchesRule = (provider: string, rule: string) =>\n provider === rule || provider.startsWith(`${rule}/`);\n\nconst assertNonEmptyPolicy = (\n label: string,\n value: readonly string[] | undefined,\n) => {\n if (value && value.length === 0) {\n throw new Error(`openrouter() ${label} must not be empty`);\n }\n};\n\nconst assertRoutingPolicy = (config: OpenRouterConfig) => {\n assertNonEmptyPolicy(\"allowedProviders\", config.allowedProviders);\n assertNonEmptyPolicy(\"routing.only\", config.routing?.only);\n assertNonEmptyPolicy(\"allowedPresets\", config.allowedPresets);\n if (\n config.appCategories &&\n config.appCategories.length > MAX_APP_CATEGORIES\n ) {\n throw new Error(\"openrouter() appCategories supports at most 2 entries\");\n }\n if (!config.allowedProviders) return;\n const selected = [\n ...(config.routing?.only ?? []),\n ...(config.routing?.order ?? []),\n ];\n const denied = selected.find(\n (provider) =>\n !config.allowedProviders!.some((rule) =>\n providerMatchesRule(provider, rule),\n ),\n );\n if (denied) {\n throw new Error(\n `openrouter() provider \"${denied}\" is outside allowedProviders`,\n );\n }\n};\n\nconst assertRequestRoutingPolicy = (\n routing: OpenRouterProviderRouting | undefined,\n allowedProviders: readonly string[] | undefined,\n) => {\n assertRoutingPolicy({\n allowedProviders,\n apiKey: \"policy-validation\",\n routing,\n });\n};\n\nconst mapRouting = (\n routing: OpenRouterProviderRouting | undefined,\n allowedProviders: readonly string[] | undefined,\n) => {\n const only = routing?.only ?? allowedProviders;\n const wire: Record<string, unknown> = {};\n if (typeof routing?.allowFallbacks === \"boolean\")\n wire.allow_fallbacks = routing.allowFallbacks;\n if (routing?.dataCollection) wire.data_collection = routing.dataCollection;\n if (typeof routing?.enforceDistillableText === \"boolean\")\n wire.enforce_distillable_text = routing.enforceDistillableText;\n if (routing?.ignore) wire.ignore = [...routing.ignore];\n if (routing?.maxPrice) wire.max_price = { ...routing.maxPrice };\n if (only) wire.only = [...only];\n if (routing?.order) wire.order = [...routing.order];\n if (routing?.preferredMaxLatency !== undefined)\n wire.preferred_max_latency = routing.preferredMaxLatency;\n if (routing?.preferredMinThroughput !== undefined)\n wire.preferred_min_throughput = routing.preferredMinThroughput;\n if (routing?.quantizations) wire.quantizations = [...routing.quantizations];\n if (typeof routing?.requireParameters === \"boolean\")\n wire.require_parameters = routing.requireParameters;\n if (routing?.sort) wire.sort = routing.sort;\n if (typeof routing?.zdr === \"boolean\") wire.zdr = routing.zdr;\n\n return wire;\n};\n\nconst requestOptionsFor = (\n params: AIProviderStreamParams,\n defaults: OpenRouterRequestOptions | undefined,\n) => {\n const supplied = params.providerOptions?.openrouter;\n if (supplied !== undefined && (typeof supplied !== \"object\" || !supplied)) {\n throw new Error(\"providerOptions.openrouter must be an object\");\n }\n\n return {\n ...defaults,\n ...(supplied as OpenRouterRequestOptions | undefined),\n };\n};\n\nconst resolveAttributionHeaders = async (\n config: OpenRouterConfig,\n params: AIProviderStreamParams,\n) => {\n const supplied =\n typeof config.headers === \"function\"\n ? await config.headers()\n : (config.headers ?? {});\n const headers = new Headers(supplied);\n if (config.appUrl) headers.set(\"HTTP-Referer\", config.appUrl);\n if (config.appName) headers.set(\"X-OpenRouter-Title\", config.appName);\n if (config.appCategories?.length) {\n headers.set(\"X-OpenRouter-Categories\", config.appCategories.join(\",\"));\n }\n const options = requestOptionsFor(params, config.requestOptions);\n if (options.routerMetadata ?? true)\n headers.set(\"X-OpenRouter-Metadata\", \"enabled\");\n if (options.sessionId) headers.set(\"X-Session-Id\", options.sessionId);\n if (options.responseCache) {\n headers.set(\n \"X-OpenRouter-Cache\",\n options.responseCache.enabled ? \"true\" : \"false\",\n );\n if (options.responseCache.ttlSeconds !== undefined)\n headers.set(\n \"X-OpenRouter-Cache-TTL\",\n String(options.responseCache.ttlSeconds),\n );\n if (options.responseCache.clear)\n headers.set(\"X-OpenRouter-Cache-Clear\", \"true\");\n }\n\n return headers;\n};\n\nconst SECURITY_SENSITIVE_EXTRA_BODY_FIELDS = new Set([\n \"messages\",\n \"model\",\n \"models\",\n \"plugins\",\n \"preset\",\n \"provider\",\n \"stream\",\n \"tools\",\n]);\n\nconst assertAllowedPreset = (\n preset: string | undefined,\n allowedPresets: readonly string[] | undefined,\n) => {\n if (!preset) return;\n if (allowedPresets?.includes(preset)) return;\n throw new Error(`OpenRouter preset \"${preset}\" is not allowed`);\n};\n\nconst assertIndirectModels = (\n value: unknown,\n allowedModels: readonly string[] | undefined,\n key = \"\",\n) => {\n if (key === \"model\" && typeof value === \"string\")\n assertAllowedModel(value, allowedModels);\n if (key === \"models\" && Array.isArray(value)) {\n for (const model of value) {\n if (typeof model === \"string\") assertAllowedModel(model, allowedModels);\n }\n }\n if (Array.isArray(value)) {\n for (const item of value) assertIndirectModels(item, allowedModels);\n } else if (value && typeof value === \"object\") {\n for (const [childKey, child] of Object.entries(value))\n assertIndirectModels(child, allowedModels, childKey);\n }\n};\n\nconst assertRequestOptions = (\n options: OpenRouterRequestOptions,\n allowedModels: readonly string[] | undefined,\n allowedPresets: readonly string[] | undefined,\n allowedProviders: readonly string[] | undefined,\n) => {\n assertAllowedPreset(options.preset, allowedPresets);\n assertRequestRoutingPolicy(options.routing, allowedProviders);\n if (options.sessionId && options.sessionId.length > 256)\n throw new Error(\"OpenRouter sessionId must be at most 256 characters\");\n const ttl = options.responseCache?.ttlSeconds;\n if (ttl !== undefined && (!Number.isInteger(ttl) || ttl < 1 || ttl > 86400))\n throw new Error(\"OpenRouter response-cache TTL must be 1-86400 seconds\");\n if (options.responseCache?.clear && !options.responseCache.enabled)\n throw new Error(\"OpenRouter cache clear requires response caching enabled\");\n if (options.fallbackModels) {\n if (options.fallbackModels.length === 0)\n throw new Error(\"OpenRouter fallbackModels must not be empty\");\n for (const model of options.fallbackModels)\n assertAllowedModel(model, allowedModels);\n }\n assertIndirectModels(options.serverTools, allowedModels);\n assertIndirectModels(options.plugins, allowedModels);\n if (options.extraBody) {\n const unsafe = Object.keys(options.extraBody).find((key) =>\n SECURITY_SENSITIVE_EXTRA_BODY_FIELDS.has(key),\n );\n if (unsafe)\n throw new Error(`OpenRouter extraBody cannot override \"${unsafe}\"`);\n }\n};\n\nconst assertAllowedModel = (\n model: string,\n allowedModels: readonly string[] | undefined,\n) => {\n if (!allowedModels) return;\n if (allowedModels.some((rule) => modelMatchesRule(model, rule))) return;\n throw new Error(`OpenRouter model \"${model}\" is not allowed`);\n};\n\nconst snapshotPolicy = (config: OpenRouterConfig) => ({\n allowedModels: config.allowedModels ? [...config.allowedModels] : undefined,\n allowedPresets: config.allowedPresets\n ? [...config.allowedPresets]\n : undefined,\n});\n\nconst transformOpenRouterRequest = (\n config: OpenRouterConfig,\n allowedModels: readonly string[] | undefined,\n allowedPresets: readonly string[] | undefined,\n body: Record<string, unknown>,\n params: AIProviderStreamParams,\n) => {\n const options = requestOptionsFor(params, config.requestOptions);\n assertRequestOptions(\n options,\n allowedModels,\n allowedPresets,\n config.allowedProviders,\n );\n const transformed = { ...body, ...options.extraBody };\n if (params.reasoning?.budgetTokens !== undefined) {\n transformed.reasoning = { max_tokens: params.reasoning.budgetTokens };\n delete transformed.reasoning_effort;\n } else if (params.reasoning?.effort) {\n transformed.reasoning = { effort: params.reasoning.effort };\n delete transformed.reasoning_effort;\n }\n const routing = mapRouting(\n { ...config.routing, ...options.routing },\n config.allowedProviders,\n );\n if (Object.keys(routing).length > 0) transformed.provider = routing;\n if (options.fallbackModels) transformed.models = [...options.fallbackModels];\n if (options.includeReasoning !== undefined)\n transformed.include_reasoning = options.includeReasoning;\n if (options.maxToolCalls !== undefined)\n transformed.max_tool_calls = options.maxToolCalls;\n if (options.plugins) transformed.plugins = [...options.plugins];\n if (options.preset) transformed.preset = options.preset;\n if (options.serverTools) {\n transformed.tools = [\n ...(Array.isArray(transformed.tools) ? transformed.tools : []),\n ...options.serverTools,\n ];\n }\n if (options.serviceTier) transformed.service_tier = options.serviceTier;\n if (options.sessionId) transformed.session_id = options.sessionId;\n if (options.stopServerToolsWhen)\n transformed.stop_server_tools_when = options.stopServerToolsWhen;\n if (options.transforms) transformed.transforms = [...options.transforms];\n if (options.user) transformed.user = options.user;\n if (options.verbosity) transformed.verbosity = options.verbosity;\n\n return transformed;\n};\n\nconst withOpenRouterPolicy = (\n provider: AIProviderConfig,\n allowedModels: readonly string[] | undefined,\n allowedPresets: readonly string[] | undefined,\n): AIProviderConfig => ({\n stream: (params) => {\n if (params.model.startsWith(\"@preset/\")) {\n assertAllowedPreset(\n params.model.slice(\"@preset/\".length),\n allowedPresets,\n );\n } else {\n const presetSeparator = params.model.indexOf(\"@preset/\");\n if (presetSeparator >= 0) {\n assertAllowedModel(\n params.model.slice(0, presetSeparator),\n allowedModels,\n );\n assertAllowedPreset(\n params.model.slice(presetSeparator + \"@preset/\".length),\n allowedPresets,\n );\n } else {\n assertAllowedModel(params.model, allowedModels);\n }\n }\n return provider.stream(params);\n },\n});\n\n/**\n * OpenRouter provider for the shared AbsoluteJS AI contract.\n *\n * Uses the existing OpenAI-compatible streaming implementation while adding\n * OpenRouter attribution, typed provider routing, local model policy, provider\n * allowlists, cost metadata, and OpenRouter-specific error attribution.\n */\nexport const openrouter = (config: OpenRouterConfig): AIProviderConfig => {\n assertRoutingPolicy(config);\n // Snapshot policy at construction so later mutation of a caller-owned array\n // cannot silently broaden a long-lived provider instance.\n const { allowedModels, allowedPresets } = snapshotPolicy(config);\n const provider = openai({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n fetch: config.fetch,\n headers: (params) => resolveAttributionHeaders(config, params),\n modelForCapabilities: modelForOpenAICapabilities,\n providerName: \"openrouter\",\n tokenSource: config.tokenSource,\n transformRequestBody: (body, params) =>\n transformOpenRouterRequest(\n config,\n allowedModels,\n allowedPresets,\n body,\n params,\n ),\n });\n return withOpenRouterPolicy(provider, allowedModels, allowedPresets);\n};\n\n/** OpenRouter's stateless OpenAI-compatible Responses API provider skin. */\nexport const openrouterResponses = (\n config: OpenRouterConfig,\n): AIProviderConfig => {\n assertRoutingPolicy(config);\n const { allowedModels, allowedPresets } = snapshotPolicy(config);\n const provider = openaiResponses({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n fetch: config.fetch,\n headers: (params) => resolveAttributionHeaders(config, params),\n modelForCapabilities: modelForOpenAICapabilities,\n providerName: \"openrouter\",\n tokenSource: config.tokenSource,\n transformRequestBody: (body, params) =>\n transformOpenRouterRequest(\n config,\n allowedModels,\n allowedPresets,\n body,\n params,\n ),\n });\n return withOpenRouterPolicy(provider, allowedModels, allowedPresets);\n};\n\nexport {\n createOpenRouterClient,\n openRouterModelMatchesRule,\n} from \"./openrouterClient\";\nexport type {\n OpenRouterClient,\n OpenRouterClientConfig,\n OpenRouterEmbeddingRequest,\n OpenRouterEmbeddingResponse,\n OpenRouterHttpRequestOptions,\n OpenRouterImageRequest,\n OpenRouterImageResponse,\n OpenRouterModel,\n OpenRouterModelList,\n OpenRouterRerankRequest,\n OpenRouterRerankResponse,\n OpenRouterResponsesRequest,\n OpenRouterSpeechRequest,\n OpenRouterTranscriptionRequest,\n OpenRouterVideoRequest,\n} from \"./openrouterClient\";\n"
9
+ "import type {\n AIProviderConfig,\n AIProviderContentBlock,\n AIProviderMessage,\n AIProviderStreamParams,\n AIProviderToolDefinition,\n AIResponseMetadata,\n AIUsage,\n} from \"../../../types/ai\";\n\n// Opportunistic HTTP/2 multiplexing for outbound HTTPS (Bun 1.3.14+).\n// The `protocol` option lands in @types/bun 1.3.14; widen locally for now.\nimport { instrumentAIProvider } from \"./instrumentation\";\nimport { ProviderError } from \"../errors/providerError\";\nimport { isOpenAIReasoningModel, openaiEffortValue } from \"./reasoning\";\n// Hard-skip on non-HTTPS — Bun's h2 client throws HTTP2Unsupported on h2c.\ntype H2Init = RequestInit & { protocol?: \"http2\" };\nconst h2IfHttps = (url: string): H2Init =>\n url.startsWith(\"https://\") ? { protocol: \"http2\" } : {};\n\nexport type OpenAIConfig = {\n apiKey?: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n headers?:\n | HeadersInit\n | ((params: AIProviderStreamParams) => HeadersInit | Promise<HeadersInit>);\n modelForCapabilities?: (model: string) => string;\n providerName?: string;\n tokenSource?: () => Promise<string> | string;\n transformRequestBody?: (\n body: Record<string, unknown>,\n params: AIProviderStreamParams,\n ) => Record<string, unknown>;\n};\n\ntype OpenAIMessage = {\n content: string | Array<Record<string, unknown>> | null;\n role: \"user\" | \"assistant\" | \"system\" | \"tool\";\n tool_call_id?: string;\n tool_calls?: Array<{\n function: { arguments: string; name: string };\n id: string;\n type: \"function\";\n }>;\n};\n\ntype PendingToolCall = {\n arguments: string;\n id: string;\n name: string;\n};\n\ntype UsageRef = {\n current: AIUsage | undefined;\n};\n\ntype MetadataRef = {\n current: AIResponseMetadata | undefined;\n};\n\ntype StreamState = {\n buffer: string;\n metadataRef: MetadataRef;\n pendingToolCalls: Map<number, PendingToolCall>;\n providerName: string;\n usageRef: UsageRef;\n};\n\nconst DEFAULT_BASE_URL = \"https://api.openai.com\";\nconst SSE_DATA_PREFIX_LENGTH = 6;\nconst DONE_SENTINEL = \"[DONE]\";\nconst NOT_FOUND = -1;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst isRecordArray = (\n value: unknown,\n): value is Array<Record<string, unknown>> =>\n Array.isArray(value) && value.length > 0 && isRecord(value[0]);\n\nconst hasArrayContent = (\n msg: AIProviderMessage,\n): msg is AIProviderMessage & { content: AIProviderContentBlock[] } =>\n typeof msg.content !== \"string\" && Array.isArray(msg.content);\n\nconst buildToolMessages = (blocks: AIProviderContentBlock[]) => {\n const toolUseBlocks = blocks.filter((block) => block.type === \"tool_use\");\n const toolResultBlocks = blocks.filter(\n (block) => block.type === \"tool_result\",\n );\n const messages: OpenAIMessage[] = [];\n\n if (toolUseBlocks.length > 0) {\n messages.push({\n content: null,\n role: \"assistant\",\n tool_calls: toolUseBlocks.map((block) => ({\n function: {\n arguments:\n typeof block.input === \"string\"\n ? block.input\n : JSON.stringify(block.input),\n name: block.name,\n },\n id: block.id,\n type: \"function\" as const,\n })),\n });\n }\n\n for (const result of toolResultBlocks) {\n messages.push({\n content: typeof result.content === \"string\" ? result.content : \"\",\n role: \"tool\",\n tool_call_id: result.tool_use_id,\n });\n }\n\n return messages;\n};\n\nconst processMessageAtIndex = (\n result: OpenAIMessage[],\n msg: AIProviderMessage,\n idx: number,\n) => {\n if (!hasArrayContent(msg)) {\n return;\n }\n\n const hasToolBlocks = msg.content.some(\n (block) => block.type === \"tool_use\" || block.type === \"tool_result\",\n );\n\n if (!hasToolBlocks) {\n return;\n }\n\n const toolMessages = buildToolMessages(msg.content);\n result.splice(idx, 1, ...toolMessages);\n};\n\nconst convertSingleMessage = (\n result: OpenAIMessage[],\n msg: AIProviderMessage | undefined,\n idx: number,\n) => {\n if (!msg) {\n return;\n }\n\n processMessageAtIndex(result, msg, idx);\n};\n\nconst convertToolResultMessages = (\n messages: OpenAIMessage[],\n params: AIProviderStreamParams,\n) => {\n const result = [...messages];\n\n for (let idx = 0; idx < params.messages.length; idx++) {\n convertSingleMessage(result, params.messages[idx], idx);\n }\n\n return result;\n};\n\nconst mapToolDefinitions = (tools: AIProviderToolDefinition[]) =>\n tools.map((tool) => ({\n function: {\n description: tool.description,\n name: tool.name,\n parameters: tool.input_schema,\n },\n type: \"function\",\n }));\n\nconst mapContentBlockToOpenAI = (block: AIProviderContentBlock) => {\n if (block.type === \"image\") {\n return {\n image_url: {\n url:\n block.source.type === \"url\"\n ? block.source.url\n : `data:${block.source.media_type};base64,${block.source.data}`,\n },\n type: \"image_url\",\n };\n }\n\n if (block.type === \"document\") {\n return {\n file: {\n file_data:\n block.source.type === \"url\"\n ? block.source.url\n : `data:${block.source.media_type};base64,${block.source.data}`,\n filename: block.name ?? \"document.pdf\",\n },\n type: \"file\",\n };\n }\n\n if (block.type === \"audio\") {\n return {\n input_audio: { data: block.source.data, format: block.source.format },\n type: \"input_audio\",\n };\n }\n\n if (block.type === \"video\") {\n return {\n type: \"video_url\",\n video_url: {\n url:\n block.source.type === \"url\"\n ? block.source.url\n : `data:${block.source.media_type};base64,${block.source.data}`,\n },\n };\n }\n\n if (block.type === \"text\") {\n return { text: block.content, type: \"text\" };\n }\n\n return null;\n};\n\nconst mapOpenAIContent = (msg: AIProviderStreamParams[\"messages\"][number]) => {\n if (typeof msg.content === \"string\") {\n return msg.content;\n }\n\n const hasMedia = msg.content.some(\n (block) =>\n block.type === \"image\" ||\n block.type === \"document\" ||\n block.type === \"audio\" ||\n block.type === \"video\",\n );\n\n if (!hasMedia) {\n return null;\n }\n\n return msg.content\n .map(mapContentBlockToOpenAI)\n .filter((mapped) => mapped !== null);\n};\n\nconst buildRequestBody = (\n params: AIProviderStreamParams,\n capabilityModel = params.model,\n) => {\n const messages = convertToolResultMessages(\n params.messages.map((msg) => ({\n content: mapOpenAIContent(msg),\n role: msg.role,\n })),\n params,\n );\n\n if (params.systemPrompt) {\n messages.unshift({ content: params.systemPrompt, role: \"system\" });\n }\n\n const body: Record<string, unknown> = {\n messages,\n model: params.model,\n stream: true,\n stream_options: { include_usage: true },\n };\n\n if (params.tools && params.tools.length > 0) {\n body.tools = mapToolDefinitions(params.tools);\n if (\n params.toolChoice === \"auto\" ||\n params.toolChoice === \"none\" ||\n params.toolChoice === \"required\"\n ) {\n body.tool_choice = params.toolChoice;\n } else if (params.toolChoice && typeof params.toolChoice === \"object\") {\n body.tool_choice = {\n function: { name: params.toolChoice.name },\n type: \"function\",\n };\n }\n if (typeof params.parallelToolCalls === \"boolean\") {\n body.parallel_tool_calls = params.parallelToolCalls;\n }\n }\n\n // Reasoning models (o-series, GPT-5) reject temperature/top_p and use\n // `max_completion_tokens`; they take a `reasoning_effort` dial instead. Other\n // models take the usual sampling params and ignore reasoning.\n if (isOpenAIReasoningModel(capabilityModel)) {\n if (typeof params.maxTokens === \"number\") {\n body.max_completion_tokens = params.maxTokens;\n }\n if (params.reasoning) {\n const effort = openaiEffortValue(capabilityModel, params.reasoning);\n if (effort) body.reasoning_effort = effort;\n }\n } else {\n if (typeof params.temperature === \"number\") {\n body.temperature = params.temperature;\n }\n if (typeof params.topP === \"number\") body.top_p = params.topP;\n if (typeof params.maxTokens === \"number\")\n body.max_tokens = params.maxTokens;\n }\n if (params.stopSequences && params.stopSequences.length > 0)\n body.stop = params.stopSequences;\n if (typeof params.seed === \"number\") body.seed = params.seed;\n if (typeof params.frequencyPenalty === \"number\")\n body.frequency_penalty = params.frequencyPenalty;\n if (typeof params.presencePenalty === \"number\")\n body.presence_penalty = params.presencePenalty;\n\n if (params.responseFormat) {\n if (\n params.responseFormat.type === \"text\" ||\n params.responseFormat.type === \"json_object\"\n ) {\n body.response_format = { type: params.responseFormat.type };\n } else if (params.responseFormat.type === \"json_schema\") {\n body.response_format = {\n json_schema: {\n name: params.responseFormat.name,\n schema: params.responseFormat.schema,\n strict: params.responseFormat.strict ?? true,\n },\n type: \"json_schema\",\n };\n }\n }\n\n return body;\n};\n\nconst parseToolInput = (rawArguments: string) => {\n try {\n return JSON.parse(rawArguments);\n } catch {\n return rawArguments;\n }\n};\n\nconst flushPendingToolCalls = function* (\n pendingToolCalls: Map<number, PendingToolCall>,\n) {\n for (const [, tool] of pendingToolCalls) {\n const input = parseToolInput(tool.arguments);\n yield {\n id: tool.id,\n input,\n name: tool.name,\n type: \"tool_use\" as const,\n };\n }\n\n pendingToolCalls.clear();\n};\n\nconst extractUsage = (\n parsedUsage: Partial<Record<string, number>>,\n): AIUsage => {\n const prompt = parsedUsage.prompt_tokens ?? 0;\n const cached = parsedUsage.cached_tokens ?? 0;\n\n // OpenAI's prompt_tokens INCLUDES cached input tokens. Split the cached\n // portion out (as cacheReadInputTokens) and report only the uncached part as\n // inputTokens — mirroring Anthropic, where input_tokens excludes cache. This\n // lets a cache-aware consumer discount cached input (~10% of full price)\n // instead of billing it at the full input rate.\n return {\n cacheReadInputTokens: cached,\n cacheWriteInputTokens: parsedUsage.cache_write_tokens || undefined,\n costCredits: parsedUsage.cost,\n inputTokens: Math.max(0, prompt - cached),\n outputTokens: parsedUsage.completion_tokens ?? 0,\n reasoningTokens: parsedUsage.reasoning_tokens || undefined,\n upstreamInferenceCostCredits:\n parsedUsage.upstream_inference_cost || undefined,\n };\n};\n\nconst resolveToolCallIndex = (toolCall: Record<string, unknown>) => {\n const raw = typeof toolCall.index === \"number\" ? toolCall.index : NOT_FOUND;\n\n return raw < 0 ? undefined : raw;\n};\n\nconst initPendingToolCall = (\n toolCall: Record<string, unknown>,\n func: Record<string, unknown> | null,\n index: number,\n pendingToolCalls: Map<number, PendingToolCall>,\n) => {\n if (pendingToolCalls.has(index)) {\n return;\n }\n\n const toolId = typeof toolCall.id === \"string\" ? toolCall.id : \"\";\n const toolName = func && typeof func.name === \"string\" ? func.name : \"\";\n\n pendingToolCalls.set(index, {\n arguments: \"\",\n id: toolId,\n name: toolName,\n });\n};\n\nconst updatePendingToolCall = (\n toolCall: Record<string, unknown>,\n func: Record<string, unknown> | null,\n pending: PendingToolCall,\n) => {\n if (typeof toolCall.id === \"string\") {\n pending.id = toolCall.id;\n }\n\n if (func && typeof func.name === \"string\") {\n pending.name = func.name;\n }\n\n if (func && typeof func.arguments === \"string\") {\n pending.arguments += func.arguments;\n }\n};\n\nconst processToolCallDelta = (\n toolCall: Record<string, unknown>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) => {\n const index = resolveToolCallIndex(toolCall);\n if (index === undefined) {\n return;\n }\n\n const func = isRecord(toolCall.function) ? toolCall.function : null;\n initPendingToolCall(toolCall, func, index, pendingToolCalls);\n\n const pending = pendingToolCalls.get(index);\n if (!pending) {\n return;\n }\n\n updatePendingToolCall(toolCall, func, pending);\n};\n\nconst processToolCallDeltas = (\n toolCalls: Array<Record<string, unknown>>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) => {\n for (const toolCall of toolCalls) {\n processToolCallDelta(toolCall, pendingToolCalls);\n }\n};\n\nconst processDelta = function* (\n delta: Record<string, unknown>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) {\n if (typeof delta.content === \"string\") {\n yield { content: delta.content, type: \"text\" as const };\n }\n\n if (isRecord(delta.audio)) {\n const audio = delta.audio;\n if (\n typeof audio.data === \"string\" ||\n typeof audio.transcript === \"string\"\n ) {\n yield {\n audioId: typeof audio.id === \"string\" ? audio.id : undefined,\n data: typeof audio.data === \"string\" ? audio.data : \"\",\n format: typeof audio.format === \"string\" ? audio.format : \"pcm16\",\n transcript:\n typeof audio.transcript === \"string\" ? audio.transcript : undefined,\n type: \"audio\" as const,\n };\n }\n }\n\n if (isRecordArray(delta.tool_calls)) {\n processToolCallDeltas(delta.tool_calls, pendingToolCalls);\n }\n\n if (Array.isArray(delta.annotations)) {\n for (const annotation of delta.annotations) {\n if (!isRecord(annotation) || annotation.type !== \"url_citation\") continue;\n const citation = isRecord(annotation.url_citation)\n ? annotation.url_citation\n : annotation;\n if (typeof citation.url !== \"string\") continue;\n yield {\n content:\n typeof citation.content === \"string\" ? citation.content : undefined,\n endIndex:\n typeof citation.end_index === \"number\"\n ? citation.end_index\n : undefined,\n startIndex:\n typeof citation.start_index === \"number\"\n ? citation.start_index\n : undefined,\n title: typeof citation.title === \"string\" ? citation.title : undefined,\n type: \"citation\" as const,\n url: citation.url,\n };\n }\n }\n};\n\nconst narrowResponseMetadata = (\n parsed: Record<string, unknown>,\n): AIResponseMetadata | undefined => {\n const providerMetadata = isRecord(parsed.openrouter_metadata)\n ? parsed.openrouter_metadata\n : undefined;\n const generationId = typeof parsed.id === \"string\" ? parsed.id : undefined;\n const model = typeof parsed.model === \"string\" ? parsed.model : undefined;\n const serviceTier =\n typeof parsed.service_tier === \"string\" ? parsed.service_tier : undefined;\n const selected =\n providerMetadata && isRecord(providerMetadata.endpoints)\n ? providerMetadata.endpoints.available\n : undefined;\n const selectedEndpoint = Array.isArray(selected)\n ? selected.find((entry) => isRecord(entry) && entry.selected === true)\n : undefined;\n const provider =\n isRecord(selectedEndpoint) && typeof selectedEndpoint.provider === \"string\"\n ? selectedEndpoint.provider\n : undefined;\n if (!providerMetadata && !generationId && !model && !serviceTier) return;\n\n return { generationId, model, provider, providerMetadata, serviceTier };\n};\n\nconst processChoice = function* (\n choice: Record<string, unknown>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) {\n const delta = isRecord(choice.delta) ? choice.delta : null;\n if (delta) {\n yield* processDelta(delta, pendingToolCalls);\n }\n\n if (choice.finish_reason === \"tool_calls\") {\n yield* flushPendingToolCalls(pendingToolCalls);\n }\n};\n\nconst narrowUsageRecord = (parsed: Record<string, unknown>) => {\n if (!isRecord(parsed.usage)) {\n return undefined;\n }\n\n const { usage } = parsed;\n const promptTokens =\n typeof usage.prompt_tokens === \"number\" ? usage.prompt_tokens : 0;\n const completionTokens =\n typeof usage.completion_tokens === \"number\" ? usage.completion_tokens : 0;\n const cachedTokens =\n isRecord(usage.prompt_tokens_details) &&\n typeof usage.prompt_tokens_details.cached_tokens === \"number\"\n ? usage.prompt_tokens_details.cached_tokens\n : 0;\n const cacheWriteTokens =\n isRecord(usage.prompt_tokens_details) &&\n typeof usage.prompt_tokens_details.cache_write_tokens === \"number\"\n ? usage.prompt_tokens_details.cache_write_tokens\n : 0;\n const reasoningTokens =\n isRecord(usage.completion_tokens_details) &&\n typeof usage.completion_tokens_details.reasoning_tokens === \"number\"\n ? usage.completion_tokens_details.reasoning_tokens\n : 0;\n const cost = typeof usage.cost === \"number\" ? usage.cost : undefined;\n const upstreamInferenceCost =\n isRecord(usage.cost_details) &&\n typeof usage.cost_details.upstream_inference_cost === \"number\"\n ? usage.cost_details.upstream_inference_cost\n : undefined;\n\n const normalized = extractUsage({\n cache_write_tokens: cacheWriteTokens,\n cached_tokens: cachedTokens,\n completion_tokens: completionTokens,\n cost,\n prompt_tokens: promptTokens,\n reasoning_tokens: reasoningTokens,\n upstream_inference_cost: upstreamInferenceCost,\n });\n if (isRecord(usage.server_tool_use)) {\n normalized.serverToolUse = Object.fromEntries(\n Object.entries(usage.server_tool_use).filter(\n (entry): entry is [string, number] => typeof entry[1] === \"number\",\n ),\n );\n }\n\n return normalized;\n};\n\nconst processSSELine = function* (\n line: string,\n pendingToolCalls: Map<number, PendingToolCall>,\n providerName: string,\n) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith(\"data: \")) {\n return;\n }\n\n const data = trimmed.slice(SSE_DATA_PREFIX_LENGTH);\n if (data === DONE_SENTINEL) {\n yield* flushPendingToolCalls(pendingToolCalls);\n\n return;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(data);\n } catch {\n return;\n }\n\n if (isRecord(parsed.error)) {\n const error = parsed.error;\n const metadata = isRecord(error.metadata) ? error.metadata : undefined;\n const status = typeof error.code === \"number\" ? error.code : null;\n const type =\n metadata && typeof metadata.error_type === \"string\"\n ? metadata.error_type\n : typeof error.error_type === \"string\"\n ? error.error_type\n : null;\n throw new ProviderError({\n message:\n typeof error.message === \"string\"\n ? error.message\n : \"OpenRouter stream failed\",\n metadata,\n provider: providerName,\n retryable:\n status === 408 ||\n status === 409 ||\n status === 425 ||\n status === 429 ||\n (status !== null && status >= 500),\n status,\n type,\n });\n }\n\n const usageUpdate = narrowUsageRecord(parsed);\n if (usageUpdate) {\n yield { type: \"usage_update\" as const, usage: usageUpdate };\n }\n\n const metadata = narrowResponseMetadata(parsed);\n if (metadata) {\n yield { metadata, type: \"response_metadata\" as const };\n }\n\n const { choices } = parsed;\n if (!isRecordArray(choices)) {\n return;\n }\n\n const [firstChoice] = choices;\n if (!firstChoice) {\n return;\n }\n\n if (isRecord(firstChoice.error)) {\n const error = firstChoice.error;\n const metadata = isRecord(error.metadata) ? error.metadata : undefined;\n const status = typeof error.code === \"number\" ? error.code : null;\n throw new ProviderError({\n message:\n typeof error.message === \"string\"\n ? error.message\n : \"OpenRouter stream failed\",\n metadata,\n provider: providerName,\n retryable: status === 429 || (status !== null && status >= 500),\n status,\n type:\n metadata && typeof metadata.error_type === \"string\"\n ? metadata.error_type\n : null,\n });\n }\n\n yield* processChoice(firstChoice, pendingToolCalls);\n};\n\nconst isUsageUpdate = (chunk: {\n type: string;\n usage?: AIUsage;\n}): chunk is { type: \"usage_update\"; usage: AIUsage } =>\n chunk.type === \"usage_update\";\n\nconst collectYieldableChunks = (\n line: string,\n pendingToolCalls: Map<number, PendingToolCall>,\n usageRef: UsageRef,\n metadataRef: MetadataRef,\n providerName: string,\n) => {\n const allChunks = Array.from(\n processSSELine(line, pendingToolCalls, providerName),\n );\n const usageChunks = allChunks.filter(isUsageUpdate);\n const lastUsage = usageChunks.at(NOT_FOUND);\n\n if (lastUsage) {\n usageRef.current = lastUsage.usage;\n }\n\n const metadataChunks = allChunks.filter(\n (chunk) => chunk.type === \"response_metadata\",\n );\n const lastMetadata = metadataChunks.at(NOT_FOUND);\n if (lastMetadata && \"metadata\" in lastMetadata) {\n metadataRef.current = {\n ...metadataRef.current,\n ...lastMetadata.metadata,\n providerMetadata: {\n ...metadataRef.current?.providerMetadata,\n ...lastMetadata.metadata.providerMetadata,\n },\n };\n }\n\n return allChunks.filter(\n (chunk) => !isUsageUpdate(chunk) && chunk.type !== \"response_metadata\",\n );\n};\n\nconst processSSELines = function* (\n lines: string[],\n pendingToolCalls: Map<number, PendingToolCall>,\n usageRef: UsageRef,\n metadataRef: MetadataRef,\n providerName: string,\n) {\n for (const line of lines) {\n yield* collectYieldableChunks(\n line,\n pendingToolCalls,\n usageRef,\n metadataRef,\n providerName,\n );\n }\n};\n\nconst processStreamValue = (\n value: Uint8Array,\n decoder: TextDecoder,\n state: StreamState,\n) => {\n state.buffer += decoder.decode(value, { stream: true });\n const lines = state.buffer.split(\"\\n\");\n state.buffer = lines.pop() ?? \"\";\n\n return lines;\n};\n\nconst drainReader = async function* (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: StreamState,\n signal?: AbortSignal,\n) {\n /* eslint-disable no-await-in-loop */\n for (\n let result = await reader.read();\n !result.done && !signal?.aborted;\n result = await reader.read()\n ) {\n /* eslint-enable no-await-in-loop */\n const lines = processStreamValue(result.value, decoder, state);\n yield* processSSELines(\n lines,\n state.pendingToolCalls,\n state.usageRef,\n state.metadataRef,\n state.providerName,\n );\n }\n};\n\nconst parseSSEStream = async function* (\n body: ReadableStream<Uint8Array>,\n initialMetadata?: AIResponseMetadata,\n providerName = \"openai\",\n signal?: AbortSignal,\n) {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const state: StreamState = {\n buffer: \"\",\n metadataRef: { current: initialMetadata },\n pendingToolCalls: new Map<number, PendingToolCall>(),\n providerName,\n usageRef: { current: undefined },\n };\n\n try {\n yield* drainReader(reader, decoder, state, signal);\n yield {\n metadata: state.metadataRef.current,\n type: \"done\" as const,\n usage: state.usageRef.current,\n };\n } finally {\n reader.releaseLock();\n }\n};\n\nconst fetchOpenAIStream = async function* (\n baseUrl: string,\n apiKey: string,\n body: Record<string, unknown>,\n fetchImpl: typeof globalThis.fetch,\n headers: HeadersInit,\n providerName: string,\n signal?: AbortSignal,\n) {\n const target = `${baseUrl}/v1/chat/completions`;\n const requestHeaders = new Headers(headers);\n requestHeaders.set(\"Authorization\", `Bearer ${apiKey}`);\n requestHeaders.set(\"Content-Type\", \"application/json\");\n const response = await fetchImpl(target, {\n ...h2IfHttps(target),\n body: JSON.stringify(body),\n headers: requestHeaders,\n method: \"POST\",\n signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw ProviderError.fromResponse(providerName, response.status, errorText);\n }\n\n if (!response.body) {\n throw new ProviderError({\n message: `${providerName} API returned no response body`,\n provider: providerName,\n retryable: true,\n });\n }\n\n yield* parseSSEStream(\n response.body,\n {\n generationId: response.headers.get(\"X-Generation-Id\") ?? undefined,\n providerMetadata: {\n cacheAge: response.headers.get(\"X-OpenRouter-Cache-Age\") ?? undefined,\n cacheSourceId:\n response.headers.get(\"X-OpenRouter-Cache-Source-Id\") ?? undefined,\n cacheStatus:\n response.headers.get(\"X-OpenRouter-Cache-Status\") ?? undefined,\n cacheTtl: response.headers.get(\"X-OpenRouter-Cache-TTL\") ?? undefined,\n },\n },\n providerName,\n signal,\n );\n};\n\nexport const openai = (config: OpenAIConfig): AIProviderConfig => {\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n const fetchImpl = config.fetch ?? globalThis.fetch;\n const providerName = config.providerName ?? \"openai\";\n if (!config.apiKey && !config.tokenSource) {\n throw new Error(\"openai() requires either apiKey or tokenSource\");\n }\n const resolveKey = async () => {\n if (config.tokenSource) {\n return await Promise.resolve(config.tokenSource());\n }\n return config.apiKey!;\n };\n const resolveHeaders = async (params: AIProviderStreamParams) =>\n typeof config.headers === \"function\"\n ? await config.headers(params)\n : (config.headers ?? {});\n\n return instrumentAIProvider(\n {\n stream: (params: AIProviderStreamParams) => {\n const openaiBody = buildRequestBody(\n params,\n config.modelForCapabilities?.(params.model) ?? params.model,\n );\n const body = config.transformRequestBody\n ? config.transformRequestBody(openaiBody, params)\n : openaiBody;\n return (async function* () {\n const [apiKey, headers] = await Promise.all([\n resolveKey(),\n resolveHeaders(params),\n ]);\n yield* fetchOpenAIStream(\n baseUrl,\n apiKey,\n body,\n fetchImpl,\n headers,\n providerName,\n params.signal,\n );\n })();\n },\n },\n providerName,\n );\n};\n",
10
+ "import type {\n AIProviderConfig,\n AIProviderContentBlock,\n AIProviderMessage,\n AIProviderStreamParams,\n AIProviderToolDefinition,\n AIUsage,\n AIResponseMetadata,\n} from \"../../../types/ai\";\nimport { instrumentAIProvider } from \"./instrumentation\";\nimport { ProviderError } from \"../errors/providerError\";\nimport { isOpenAIReasoningModel, openaiEffortValue } from \"./reasoning\";\n\n// Opportunistic HTTP/2 multiplexing for outbound HTTPS (Bun 1.3.14+).\n// The `protocol` option lands in @types/bun 1.3.14; widen locally for now.\n// Hard-skip on non-HTTPS — Bun's h2 client throws HTTP2Unsupported on h2c.\ntype H2Init = RequestInit & { protocol?: \"http2\" };\nconst h2IfHttps = (url: string): H2Init =>\n url.startsWith(\"https://\") ? { protocol: \"http2\" } : {};\n\nexport type OpenAIResponsesConfig = {\n apiKey?: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n headers?:\n | HeadersInit\n | ((params: AIProviderStreamParams) => HeadersInit | Promise<HeadersInit>);\n imageModels?: Set<string> | string[];\n modelForCapabilities?: (model: string) => string;\n providerName?: string;\n tokenSource?: () => Promise<string> | string;\n transformRequestBody?: (\n body: Record<string, unknown>,\n params: AIProviderStreamParams,\n ) => Record<string, unknown>;\n};\n\ntype PendingFunctionCall = {\n callId: string;\n name: string;\n arguments: string;\n providerData?: Record<string, unknown>;\n};\n\ntype StreamState = {\n buffer: string;\n currentEvent: string;\n pendingCalls: Map<string, PendingFunctionCall>;\n usage: AIUsage | undefined;\n providerName: string;\n};\n\nconst DEFAULT_BASE_URL = \"https://api.openai.com\";\nconst EVENT_PREFIX_LENGTH = 7;\nconst DATA_PREFIX_LENGTH = 6;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst isRecordArray = (\n value: unknown,\n): value is Array<Record<string, unknown>> =>\n Array.isArray(value) && value.length > 0 && isRecord(value[0]);\n\n/* ─── Message conversion ─── */\n\nconst mapBlockToResponsesFormat = (block: AIProviderContentBlock) => {\n if (block.type === \"text\") {\n return { text: block.content, type: \"input_text\" };\n }\n\n if (block.type === \"image\") {\n return {\n image_url: {\n url:\n block.source.type === \"url\"\n ? block.source.url\n : `data:${block.source.media_type};base64,${block.source.data}`,\n },\n type: \"input_image\",\n };\n }\n\n if (block.type === \"document\") {\n return {\n file: {\n file_data:\n block.source.type === \"url\"\n ? block.source.url\n : `data:${block.source.media_type};base64,${block.source.data}`,\n filename: block.name ?? \"document.pdf\",\n },\n type: \"input_file\",\n };\n }\n\n if (block.type === \"audio\") {\n return {\n input_audio: { data: block.source.data, format: block.source.format },\n type: \"input_audio\",\n };\n }\n\n if (block.type === \"video\") {\n return {\n type: \"input_video\",\n video_url:\n block.source.type === \"url\"\n ? block.source.url\n : `data:${block.source.media_type};base64,${block.source.data}`,\n };\n }\n\n return null;\n};\n\nconst mapContentToResponsesFormat = (\n content: string | AIProviderContentBlock[],\n) => {\n if (typeof content === \"string\") {\n return content;\n }\n\n const parts = content\n .map(mapBlockToResponsesFormat)\n .filter((mapped) => mapped !== null);\n\n return parts.length > 0 ? parts : \"\";\n};\n\nconst hasToolBlocks = (content: AIProviderContentBlock[]) =>\n content.some(\n (block) => block.type === \"tool_use\" || block.type === \"tool_result\",\n );\n\nconst convertToolBlock = (block: AIProviderContentBlock) => {\n if (block.type === \"provider_data\" && block.provider === \"openrouter\") {\n return { ...block.data };\n }\n\n if (block.type === \"tool_use\") {\n if (block.providerData) return { ...block.providerData };\n return {\n arguments:\n typeof block.input === \"string\"\n ? block.input\n : JSON.stringify(block.input),\n call_id: block.id,\n name: block.name,\n type: \"function_call\",\n };\n }\n\n if (block.type === \"tool_result\") {\n return {\n call_id: block.tool_use_id,\n output: typeof block.content === \"string\" ? block.content : \"\",\n type: \"function_call_output\",\n };\n }\n\n return null;\n};\n\nconst convertToolBlocks = (content: AIProviderContentBlock[]) =>\n content.map(convertToolBlock).filter((converted) => converted !== null);\n\nconst convertMessage = (msg: AIProviderMessage) => {\n if (\n typeof msg.content !== \"string\" &&\n Array.isArray(msg.content) &&\n hasToolBlocks(msg.content)\n ) {\n return convertToolBlocks(msg.content);\n }\n\n const content = mapContentToResponsesFormat(msg.content);\n\n return [\n {\n content,\n role: msg.role === \"system\" ? \"developer\" : msg.role,\n type: \"message\",\n },\n ];\n};\n\nconst buildInput = (messages: AIProviderMessage[]) => {\n const input: Array<Record<string, unknown>> = [];\n\n for (const msg of messages) {\n input.push(...convertMessage(msg));\n }\n\n return input;\n};\n\nconst mapToolDefinition = (tool: AIProviderToolDefinition) => ({\n description: tool.description,\n name: tool.name,\n parameters: tool.input_schema,\n type: \"function\",\n});\n\nconst buildTools = (\n tools: AIProviderToolDefinition[] | undefined,\n isImageModel: boolean,\n) => {\n const mapped = tools ? tools.map(mapToolDefinition) : [];\n const result: Array<Record<string, unknown>> = [...mapped];\n\n if (isImageModel) {\n result.push({ type: \"image_generation\" });\n }\n\n return result.length > 0 ? result : undefined;\n};\n\nconst buildRequestBody = (\n params: AIProviderStreamParams,\n isImageModel: boolean,\n capabilityModel = params.model,\n) => {\n const body: Record<string, unknown> = {\n input: buildInput(params.messages),\n model: params.model,\n stream: true,\n };\n\n if (params.systemPrompt) {\n body.instructions = params.systemPrompt;\n }\n\n const tools = buildTools(params.tools, isImageModel);\n\n if (tools) {\n body.tools = tools;\n if (\n params.toolChoice === \"auto\" ||\n params.toolChoice === \"none\" ||\n params.toolChoice === \"required\"\n ) {\n body.tool_choice = params.toolChoice;\n } else if (params.toolChoice && typeof params.toolChoice === \"object\") {\n body.tool_choice = {\n name: params.toolChoice.name,\n type: \"function\",\n };\n }\n if (typeof params.parallelToolCalls === \"boolean\") {\n body.parallel_tool_calls = params.parallelToolCalls;\n }\n }\n\n if (typeof params.temperature === \"number\")\n body.temperature = params.temperature;\n if (typeof params.topP === \"number\") body.top_p = params.topP;\n if (typeof params.maxTokens === \"number\")\n body.max_output_tokens = params.maxTokens;\n if (params.stopSequences && params.stopSequences.length > 0)\n body.stop = params.stopSequences;\n if (typeof params.seed === \"number\") body.seed = params.seed;\n if (typeof params.frequencyPenalty === \"number\")\n body.frequency_penalty = params.frequencyPenalty;\n if (typeof params.presencePenalty === \"number\")\n body.presence_penalty = params.presencePenalty;\n\n if (params.responseFormat) {\n if (\n params.responseFormat.type === \"text\" ||\n params.responseFormat.type === \"json_object\"\n ) {\n body.text = { format: { type: params.responseFormat.type } };\n } else if (params.responseFormat.type === \"json_schema\") {\n body.text = {\n format: {\n name: params.responseFormat.name,\n schema: params.responseFormat.schema,\n strict: params.responseFormat.strict ?? true,\n type: \"json_schema\",\n },\n };\n }\n }\n\n // Reasoning models take a `reasoning.effort` dial; non-reasoning models ignore\n // it. Effort comes from the portable `reasoning` knob, mapped per model.\n if (params.reasoning && isOpenAIReasoningModel(capabilityModel)) {\n const effort = openaiEffortValue(capabilityModel, params.reasoning);\n if (effort) {\n body.reasoning = {\n effort,\n summary: \"auto\",\n };\n }\n }\n\n return body;\n};\n\n/* ─── SSE parsing ─── */\n\nconst parseJSON = (data: string) => {\n try {\n return JSON.parse(data);\n } catch {\n return null;\n }\n};\n\nconst parseToolInput = (rawArguments: string) => {\n try {\n return JSON.parse(rawArguments);\n } catch {\n return rawArguments;\n }\n};\n\nconst extractUsage = (response: Record<string, unknown>) => {\n if (!isRecord(response.usage)) {\n return undefined;\n }\n\n const { usage } = response;\n const input = typeof usage.input_tokens === \"number\" ? usage.input_tokens : 0;\n // input_tokens INCLUDES cached input; split it out so the cached portion is\n // discounted (mirrors Anthropic) instead of billed at the full input rate.\n const cached =\n isRecord(usage.input_tokens_details) &&\n typeof usage.input_tokens_details.cached_tokens === \"number\"\n ? usage.input_tokens_details.cached_tokens\n : 0;\n\n const outputDetails = isRecord(usage.output_tokens_details)\n ? usage.output_tokens_details\n : undefined;\n const inputDetails = isRecord(usage.input_tokens_details)\n ? usage.input_tokens_details\n : undefined;\n const costDetails = isRecord(usage.cost_details)\n ? usage.cost_details\n : undefined;\n const normalized: AIUsage = {\n cacheReadInputTokens: cached,\n cacheWriteInputTokens:\n inputDetails && typeof inputDetails.cache_write_tokens === \"number\"\n ? inputDetails.cache_write_tokens\n : undefined,\n costCredits: typeof usage.cost === \"number\" ? usage.cost : undefined,\n inputTokens: Math.max(0, input - cached),\n outputTokens:\n typeof usage.output_tokens === \"number\" ? usage.output_tokens : 0,\n reasoningTokens:\n outputDetails && typeof outputDetails.reasoning_tokens === \"number\"\n ? outputDetails.reasoning_tokens\n : undefined,\n upstreamInferenceCostCredits:\n costDetails && typeof costDetails.upstream_inference_cost === \"number\"\n ? costDetails.upstream_inference_cost\n : undefined,\n };\n if (isRecord(usage.server_tool_use)) {\n normalized.serverToolUse = Object.fromEntries(\n Object.entries(usage.server_tool_use).filter(\n (entry): entry is [string, number] => typeof entry[1] === \"number\",\n ),\n );\n }\n\n return normalized;\n};\n\nconst extractResponseMetadata = (\n response: Record<string, unknown>,\n): AIResponseMetadata | undefined => {\n const providerMetadata = isRecord(response.openrouter_metadata)\n ? response.openrouter_metadata\n : undefined;\n const generationId = typeof response.id === \"string\" ? response.id : undefined;\n const model = typeof response.model === \"string\" ? response.model : undefined;\n const provider =\n typeof response.provider === \"string\" ? response.provider : undefined;\n const serviceTier =\n typeof response.service_tier === \"string\"\n ? response.service_tier\n : undefined;\n if (!providerMetadata && !generationId && !model && !provider && !serviceTier)\n return;\n return { generationId, model, provider, providerMetadata, serviceTier };\n};\n\nconst extractMimeFormat = (mimeType: unknown) => {\n if (typeof mimeType !== \"string\") {\n return \"png\";\n }\n\n if (mimeType.includes(\"jpeg\")) return \"jpeg\";\n if (mimeType.includes(\"webp\")) return \"webp\";\n\n return \"png\";\n};\n\nconst processTextDelta = function* (parsed: Record<string, unknown>) {\n if (typeof parsed.delta === \"string\") {\n yield { content: parsed.delta, type: \"text\" as const };\n }\n};\n\nconst processPartialImage = function* (parsed: Record<string, unknown>) {\n const itemId =\n typeof parsed.item_id === \"string\" ? parsed.item_id : undefined;\n const b64 =\n typeof parsed.partial_image_b64 === \"string\"\n ? parsed.partial_image_b64\n : undefined;\n\n if (b64) {\n yield {\n data: b64,\n format: \"png\",\n imageId: itemId,\n isPartial: true,\n type: \"image\" as const,\n };\n }\n};\n\nconst processFunctionCallArgumentsDelta = (\n parsed: Record<string, unknown>,\n pendingCalls: Map<string, PendingFunctionCall>,\n) => {\n const itemId = typeof parsed.item_id === \"string\" ? parsed.item_id : \"\";\n const callId = typeof parsed.call_id === \"string\" ? parsed.call_id : \"\";\n const delta =\n typeof parsed.arguments_delta === \"string\" ? parsed.arguments_delta : \"\";\n\n const existing = pendingCalls.get(itemId);\n\n if (existing) {\n existing.arguments += delta;\n } else {\n pendingCalls.set(itemId, {\n arguments: delta,\n callId,\n name: \"\",\n });\n }\n};\n\nconst processFunctionCallArgumentsDone = function* (\n parsed: Record<string, unknown>,\n pendingCalls: Map<string, PendingFunctionCall>,\n) {\n const itemId = typeof parsed.item_id === \"string\" ? parsed.item_id : \"\";\n const callId = typeof parsed.call_id === \"string\" ? parsed.call_id : \"\";\n const fullArgs = typeof parsed.arguments === \"string\" ? parsed.arguments : \"\";\n\n const pending = pendingCalls.get(itemId);\n const name = pending?.name ?? \"\";\n const args = fullArgs || pending?.arguments || \"\";\n\n pendingCalls.delete(itemId);\n\n yield {\n id: callId || pending?.callId || itemId,\n input: parseToolInput(args),\n name,\n providerData: pending?.providerData\n ? { ...pending.providerData, arguments: args }\n : undefined,\n type: \"tool_use\" as const,\n };\n};\n\nconst processOutputItemAdded = (\n parsed: Record<string, unknown>,\n pendingCalls: Map<string, PendingFunctionCall>,\n) => {\n if (!isRecord(parsed.item)) {\n return;\n }\n\n const { item } = parsed;\n const itemId = typeof item.id === \"string\" ? item.id : \"\";\n const itemType = typeof item.type === \"string\" ? item.type : \"\";\n\n if (itemType !== \"function_call\") {\n return;\n }\n\n const callId = typeof item.call_id === \"string\" ? item.call_id : \"\";\n const name = typeof item.name === \"string\" ? item.name : \"\";\n\n pendingCalls.set(itemId, {\n arguments: \"\",\n callId,\n name,\n providerData: { ...item },\n });\n};\n\nconst processOutputItemDone = function* (parsed: Record<string, unknown>) {\n if (!isRecord(parsed.item) || typeof parsed.item.type !== \"string\") return;\n if (!parsed.item.type.startsWith(\"openrouter:\")) return;\n yield {\n data: { ...parsed.item },\n provider: \"openrouter\",\n type: \"provider_event\" as const,\n };\n};\n\nconst isCompletedImageGeneration = (item: Record<string, unknown>) =>\n item.type === \"image_generation_call\" &&\n item.status === \"completed\" &&\n typeof item.result === \"string\" &&\n item.result !== \"\";\n\nconst buildImageChunk = (item: Record<string, unknown>) => ({\n data: typeof item.result === \"string\" ? item.result : \"\",\n format: extractMimeFormat(item.output_format),\n imageId: typeof item.id === \"string\" ? item.id : undefined,\n isPartial: false,\n revisedPrompt:\n typeof item.revised_prompt === \"string\" ? item.revised_prompt : undefined,\n type: \"image\" as const,\n});\n\nconst extractImageFromOutput = function* (\n output: Array<Record<string, unknown>>,\n) {\n const completedImages = output.filter(isCompletedImageGeneration);\n\n for (const item of completedImages) {\n yield buildImageChunk(item);\n }\n};\n\nconst extractCitationsFromOutput = function* (\n output: Array<Record<string, unknown>>,\n) {\n for (const item of output) {\n if (!isRecordArray(item.content)) continue;\n for (const content of item.content) {\n if (!Array.isArray(content.annotations)) continue;\n for (const annotation of content.annotations) {\n if (!isRecord(annotation) || annotation.type !== \"url_citation\")\n continue;\n if (typeof annotation.url !== \"string\") continue;\n yield {\n content:\n typeof annotation.content === \"string\"\n ? annotation.content\n : undefined,\n endIndex:\n typeof annotation.end_index === \"number\"\n ? annotation.end_index\n : undefined,\n startIndex:\n typeof annotation.start_index === \"number\"\n ? annotation.start_index\n : undefined,\n title:\n typeof annotation.title === \"string\"\n ? annotation.title\n : undefined,\n type: \"citation\" as const,\n url: annotation.url,\n };\n }\n }\n }\n};\n\nconst processCompleted = function* (parsed: Record<string, unknown>) {\n if (!isRecord(parsed.response)) {\n yield { type: \"done\" as const, usage: undefined };\n\n return;\n }\n\n const { response } = parsed;\n const usage = extractUsage(response);\n const metadata = extractResponseMetadata(response);\n\n if (isRecordArray(response.output)) {\n yield* extractCitationsFromOutput(response.output);\n yield* extractImageFromOutput(response.output);\n }\n\n yield { metadata, type: \"done\" as const, usage };\n};\n\nconst responseFailure = (\n eventType: string,\n parsed: Record<string, unknown>,\n providerName: string,\n) => {\n const response = isRecord(parsed.response) ? parsed.response : parsed;\n const error = isRecord(response.error) ? response.error : undefined;\n const type =\n typeof response.error_type === \"string\"\n ? response.error_type\n : error && typeof error.code === \"string\"\n ? error.code\n : eventType;\n return new ProviderError({\n message:\n error && typeof error.message === \"string\"\n ? error.message\n : `OpenRouter Responses API: ${eventType}`,\n metadata: response,\n provider: providerName,\n retryable:\n type === \"rate_limit_exceeded\" ||\n type === \"provider_overloaded\" ||\n type === \"provider_unavailable\" ||\n type === \"server\",\n type,\n });\n};\n\nconst processSSEEvent = function* (\n eventType: string,\n parsed: Record<string, unknown>,\n pendingCalls: Map<string, PendingFunctionCall>,\n providerName: string,\n) {\n switch (eventType) {\n case \"response.reasoning_summary_text.delta\": {\n const delta = typeof parsed.delta === \"string\" ? parsed.delta : \"\";\n if (!delta) break;\n\n yield {\n content: delta,\n type: \"thinking\" as const,\n };\n\n break;\n }\n\n case \"response.output_text.delta\":\n yield* processTextDelta(parsed);\n break;\n\n case \"response.image_generation_call.partial_image\":\n yield* processPartialImage(parsed);\n break;\n\n case \"response.output_item.added\":\n processOutputItemAdded(parsed, pendingCalls);\n break;\n\n case \"response.output_item.done\":\n yield* processOutputItemDone(parsed);\n break;\n\n case \"response.function_call_arguments.delta\":\n processFunctionCallArgumentsDelta(parsed, pendingCalls);\n break;\n\n case \"response.function_call_arguments.done\":\n yield* processFunctionCallArgumentsDone(parsed, pendingCalls);\n break;\n\n case \"response.completed\":\n yield* processCompleted(parsed);\n break;\n\n case \"response.failed\":\n case \"response.incomplete\":\n case \"response.error\":\n case \"error\":\n throw responseFailure(eventType, parsed, providerName);\n }\n};\n\nconst flushSSEBuffer = function* (state: StreamState) {\n if (!state.currentEvent || !state.buffer) {\n return;\n }\n\n const parsed = parseJSON(state.buffer);\n\n if (parsed) {\n yield* processSSEEvent(\n state.currentEvent,\n parsed,\n state.pendingCalls,\n state.providerName,\n );\n }\n\n state.currentEvent = \"\";\n state.buffer = \"\";\n};\n\nconst parseSSELine = (trimmed: string, state: StreamState) => {\n if (trimmed.startsWith(\"event: \")) {\n state.currentEvent = trimmed.slice(EVENT_PREFIX_LENGTH);\n } else if (trimmed.startsWith(\"data: \")) {\n state.buffer = trimmed.slice(DATA_PREFIX_LENGTH);\n }\n};\n\nconst processSSELine = function* (line: string, state: StreamState) {\n const trimmed = line.trim();\n\n if (trimmed) {\n parseSSELine(trimmed, state);\n\n return;\n }\n\n yield* flushSSEBuffer(state);\n};\n\nconst processSSELines = function* (lines: string[], state: StreamState) {\n for (const line of lines) {\n yield* processSSELine(line, state);\n }\n};\n\nconst drainReader = async function* (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: StreamState,\n signal?: AbortSignal,\n) {\n let textBuffer = \"\";\n\n for (\n let result = await reader.read();\n !result.done && !signal?.aborted;\n // eslint-disable-next-line no-await-in-loop\n result = await reader.read()\n ) {\n textBuffer += decoder.decode(result.value, { stream: true });\n const lines = textBuffer.split(\"\\n\");\n textBuffer = lines.pop() ?? \"\";\n\n yield* processSSELines(lines, state);\n }\n\n if (textBuffer.trim()) {\n yield* processSSELines([textBuffer, \"\"], state);\n }\n};\n\nconst parseSSEStream = async function* (\n body: ReadableStream<Uint8Array>,\n providerName: string,\n signal?: AbortSignal,\n) {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const state: StreamState = {\n buffer: \"\",\n currentEvent: \"\",\n pendingCalls: new Map(),\n usage: undefined,\n providerName,\n };\n\n try {\n yield* drainReader(reader, decoder, state, signal);\n yield* flushSSEBuffer(state);\n } finally {\n reader.releaseLock();\n }\n};\n\nconst fetchResponsesStream = async function* (\n baseUrl: string,\n apiKey: string,\n body: Record<string, unknown>,\n fetchImpl: typeof globalThis.fetch,\n headers: HeadersInit,\n providerName: string,\n signal?: AbortSignal,\n) {\n const target = `${baseUrl}/v1/responses`;\n const requestHeaders = new Headers(headers);\n requestHeaders.set(\"Authorization\", `Bearer ${apiKey}`);\n requestHeaders.set(\"Content-Type\", \"application/json\");\n const response = await fetchImpl(target, {\n ...h2IfHttps(target),\n body: JSON.stringify(body),\n headers: requestHeaders,\n method: \"POST\",\n signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw ProviderError.fromResponse(providerName, response.status, errorText);\n }\n\n if (!response.body) {\n throw new ProviderError({\n message: `${providerName} Responses API returned no response body`,\n provider: providerName,\n retryable: true,\n });\n }\n\n yield* parseSSEStream(response.body, providerName, signal);\n};\n\nconst resolveImageModels = (\n imageModels: Set<string> | string[] | undefined,\n) => {\n if (!imageModels) {\n return new Set<string>();\n }\n\n if (imageModels instanceof Set) {\n return imageModels;\n }\n\n return new Set(imageModels);\n};\n\nexport const openaiResponses = (config: OpenAIResponsesConfig) => {\n if (!config.apiKey && !config.tokenSource)\n throw new Error(\"openaiResponses() requires either apiKey or tokenSource\");\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n const fetchImpl = config.fetch ?? globalThis.fetch;\n const imageModels = resolveImageModels(config.imageModels);\n const providerName = config.providerName ?? \"openai-responses\";\n const resolveKey = async () =>\n config.tokenSource\n ? await Promise.resolve(config.tokenSource())\n : config.apiKey!;\n const resolveHeaders = async (params: AIProviderStreamParams) =>\n typeof config.headers === \"function\"\n ? await config.headers(params)\n : (config.headers ?? {});\n\n return instrumentAIProvider(\n {\n stream: (params: AIProviderStreamParams) => {\n const isImageModel = imageModels.has(params.model);\n const builtBody = buildRequestBody(\n params,\n isImageModel,\n config.modelForCapabilities?.(params.model) ?? params.model,\n );\n const body = config.transformRequestBody\n ? config.transformRequestBody(builtBody, params)\n : builtBody;\n return (async function* () {\n const [apiKey, headers] = await Promise.all([\n resolveKey(),\n resolveHeaders(params),\n ]);\n yield* fetchResponsesStream(\n baseUrl,\n apiKey,\n body,\n fetchImpl,\n headers,\n providerName,\n params.signal,\n );\n })();\n },\n } satisfies AIProviderConfig,\n providerName,\n );\n};\n",
11
+ "import type {\n AIChunk,\n AIProviderConfig,\n AIProviderContentBlock,\n AIProviderMessage,\n AIProviderStreamParams,\n AIProviderToolDefinition,\n AIUsage,\n} from \"../../../types/ai\";\nimport type {\n AnthropicConfig,\n AnthropicMessage,\n AnthropicSSEState,\n} from \"../../../types/anthropic\";\n\n// Opportunistic HTTP/2 multiplexing for outbound HTTPS (Bun 1.3.14+).\n// The `protocol` option lands in @types/bun 1.3.14; widen locally for now.\n// Hard-skip on non-HTTPS — Bun's h2 client throws HTTP2Unsupported on h2c.\ntype H2Init = RequestInit & { protocol?: \"http2\" };\nconst h2IfHttps = (url: string): H2Init =>\n url.startsWith(\"https://\") ? { protocol: \"http2\" } : {};\n\nimport { instrumentAIProvider } from \"./instrumentation\";\nimport { ProviderError } from \"../errors/providerError\";\nimport {\n anthropicEffortValue,\n anthropicReasoningMode,\n anthropicSupportsSampling,\n resolveBudgetTokens,\n} from \"./reasoning\";\n\nconst DEFAULT_BASE_URL = \"https://api.anthropic.com\";\nconst API_VERSION = \"2023-06-01\";\nconst DEFAULT_MAX_TOKENS = 32000;\nconst EVENT_PREFIX_LENGTH = 7;\nconst DATA_PREFIX_LENGTH = 6;\n\nconst EMPTY_CHUNKS: AIChunk[] = [];\n\nconst isRecord = (val: unknown): val is Record<string, unknown> =>\n typeof val === \"object\" && val !== null;\n\nconst mapContentBlock = (block: AIProviderContentBlock) => {\n if (block.type === \"thinking\") {\n return {\n signature: block.signature,\n thinking: block.thinking,\n type: \"thinking\",\n };\n }\n\n if (block.type === \"image\") {\n return {\n source: block.source,\n type: \"image\",\n };\n }\n\n if (block.type === \"document\") {\n return {\n source: block.source,\n type: \"document\",\n };\n }\n\n if (block.type === \"tool_result\") {\n return {\n content: block.content,\n tool_use_id: block.tool_use_id,\n type: \"tool_result\",\n };\n }\n\n if (block.type === \"tool_use\") {\n if (block.providerData) return { ...block.providerData };\n return {\n id: block.id,\n input: block.input,\n name: block.name,\n type: \"tool_use\",\n };\n }\n\n if (block.type === \"audio\" || block.type === \"video\") {\n throw new Error(`Anthropic does not support ${block.type} content blocks`);\n }\n\n if (block.type === \"provider_data\") {\n return { ...block.data };\n }\n\n return { text: block.content, type: \"text\" };\n};\n\nconst mapMessage = (msg: AIProviderMessage): AnthropicMessage => ({\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map(mapContentBlock),\n role: msg.role === \"system\" ? \"user\" : msg.role,\n});\n\nconst mapToolDefinition = (tool: AIProviderToolDefinition) => ({\n description: tool.description,\n input_schema: tool.input_schema,\n name: tool.name,\n});\n\n// Attach an ephemeral cache breakpoint to the final content block of a message.\n// `content` may be a bare string (collapse to a single cached text block) or an\n// array of blocks (clone the last block and tag it). Returns a new message; the\n// input is left untouched.\nconst cacheLastContentBlock = (msg: AnthropicMessage): AnthropicMessage => {\n const cacheControl = { type: \"ephemeral\" };\n\n if (typeof msg.content === \"string\") {\n return {\n content: [\n { cache_control: cacheControl, text: msg.content, type: \"text\" },\n ],\n role: msg.role,\n };\n }\n\n if (msg.content.length === 0) return msg;\n\n const blocks = [...msg.content];\n blocks[blocks.length - 1] = {\n ...blocks[blocks.length - 1],\n cache_control: cacheControl,\n };\n\n return { content: blocks, role: msg.role };\n};\n\nconst buildRequestBody = (\n params: AIProviderStreamParams,\n configuredMax: number,\n configCaching: boolean,\n) => {\n // Per-call override wins over the provider default, so a caller can opt a\n // known one-shot out of the 1.25x cache-write (or force caching on).\n const caching = params.promptCaching ?? configCaching;\n // The system block specifically can be overridden by the legacy\n // `cacheSystemPrompt` (tri-state: true/false force it; undefined follows the\n // effective `caching`).\n const cacheSystem = params.cacheSystemPrompt ?? caching;\n\n const messages: AnthropicMessage[] = params.messages\n .filter((msg) => msg.role !== \"system\")\n .map(mapMessage);\n\n // Rolling prefix breakpoint: when there is prior history, mark the final\n // content block of the last message so the next turn reads this turn's\n // prefix from cache. Skipped on the first turn (nothing to reuse yet).\n if (caching && messages.length > 1) {\n const last = messages[messages.length - 1];\n if (last) {\n messages[messages.length - 1] = cacheLastContentBlock(last);\n }\n }\n\n // Per-call `params.maxTokens` wins over the per-provider configured default.\n const max =\n typeof params.maxTokens === \"number\" ? params.maxTokens : configuredMax;\n\n const body: Record<string, unknown> = {\n max_tokens: max,\n messages,\n model: params.model,\n stream: true,\n };\n\n if (params.systemPrompt) {\n body.system = cacheSystem\n ? [\n {\n cache_control: { type: \"ephemeral\" },\n text: params.systemPrompt,\n type: \"text\",\n },\n ]\n : params.systemPrompt;\n }\n\n if (params.tools && params.tools.length > 0) {\n const tools: Array<Record<string, unknown>> =\n params.tools.map(mapToolDefinition);\n // Tool schemas are the most stable prefix — cache them whenever enabled.\n if (caching) {\n tools[tools.length - 1] = {\n ...tools[tools.length - 1],\n cache_control: { type: \"ephemeral\" },\n };\n }\n body.tools = tools;\n if (params.toolChoice === \"auto\" || params.toolChoice === \"none\") {\n body.tool_choice = { type: params.toolChoice };\n } else if (params.toolChoice === \"required\") {\n body.tool_choice = { type: \"any\" };\n } else if (params.toolChoice && typeof params.toolChoice === \"object\") {\n body.tool_choice = { name: params.toolChoice.name, type: \"tool\" };\n }\n }\n\n if (params.stopSequences && params.stopSequences.length > 0) {\n body.stop_sequences = params.stopSequences;\n }\n\n const mode = params.reasoning ? anthropicReasoningMode(params.model) : \"none\";\n const thinkingActive = mode !== \"none\";\n\n // Sampling params (temperature/top_p) are rejected outright by Opus 4.7/4.8 and\n // Fable/Mythos, and conflict with thinking on the models that do accept them —\n // so only send them when the model allows sampling AND thinking is off.\n if (!thinkingActive && anthropicSupportsSampling(params.model)) {\n if (typeof params.temperature === \"number\") {\n body.temperature = params.temperature;\n }\n if (typeof params.topP === \"number\") body.top_p = params.topP;\n }\n\n if (mode === \"effort\" || mode === \"adaptive\") {\n body.thinking = { type: \"adaptive\" };\n if (mode === \"effort\" && params.reasoning) {\n const effort = anthropicEffortValue(params.model, params.reasoning);\n if (effort) body.output_config = { effort };\n }\n } else if (mode === \"legacy\" && params.reasoning) {\n const budget = resolveBudgetTokens(params.reasoning);\n if (budget) {\n body.thinking = { budget_tokens: budget, type: \"enabled\" };\n // Extended thinking requires headroom: budget tokens + room to answer.\n body.max_tokens = Math.max(max, budget + max);\n }\n }\n\n return body;\n};\n\nconst classifyLine = (line: string) => {\n if (line.startsWith(\"event: \")) {\n return {\n field: \"event\" as const,\n value: line.slice(EVENT_PREFIX_LENGTH),\n };\n }\n\n if (line.startsWith(\"data: \")) {\n return {\n field: \"data\" as const,\n value: line.slice(DATA_PREFIX_LENGTH),\n };\n }\n\n return undefined;\n};\n\nconst applyClassified = (\n acc: { eventData: string; eventType: string },\n classified: { field: \"event\" | \"data\"; value: string } | undefined,\n) => {\n if (!classified) {\n return acc;\n }\n\n if (classified.field === \"event\") {\n return { eventData: acc.eventData, eventType: classified.value };\n }\n\n return { eventData: classified.value, eventType: acc.eventType };\n};\n\nconst parseEventLines = (event: string) =>\n event\n .split(\"\\n\")\n .reduce((acc, line) => applyClassified(acc, classifyLine(line)), {\n eventData: \"\",\n eventType: \"\",\n });\n\nconst safeParse = (text: string) => {\n try {\n const result: unknown = JSON.parse(text);\n\n return result;\n } catch {\n return undefined;\n }\n};\n\nconst tryParseJson = (text: string) => {\n const result = safeParse(text);\n\n if (isRecord(result)) {\n return result;\n }\n\n return undefined;\n};\n\nconst getRecord = (obj: Record<string, unknown>, key: string) => {\n const val = obj[key];\n\n if (isRecord(val)) {\n return val;\n }\n\n return undefined;\n};\n\nconst getString = (obj: Record<string, unknown>, key: string) => {\n const val = obj[key];\n\n if (typeof val === \"string\") {\n return val;\n }\n\n return \"\";\n};\n\nconst getNumber = (obj: Record<string, unknown>, key: string) => {\n const val = obj[key];\n\n if (typeof val === \"number\") {\n return val;\n }\n\n return 0;\n};\n\nconst handleContentBlockStart = (\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n const block = getRecord(parsed, \"content_block\");\n\n if (block && block.type === \"tool_use\") {\n state.currentToolId = getString(block, \"id\");\n state.currentToolName = getString(block, \"name\");\n state.toolInputJson = \"\";\n state.isThinkingBlock = false;\n state.currentProviderBlock = undefined;\n } else if (block && block.type === \"thinking\") {\n state.isThinkingBlock = true;\n state.thinkingSignature = \"\";\n state.currentProviderBlock = undefined;\n } else {\n state.isThinkingBlock = false;\n state.currentProviderBlock =\n block && block.type !== \"text\" ? { ...block } : undefined;\n state.providerBlockInputJson = \"\";\n }\n};\n\nconst handleContentBlockDelta = (\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n const delta = getRecord(parsed, \"delta\");\n\n if (!delta) {\n return undefined;\n }\n\n if (delta.type === \"thinking_delta\") {\n return {\n content: getString(delta, \"thinking\"),\n type: \"thinking\",\n } satisfies AIChunk;\n }\n\n if (delta.type === \"text_delta\") {\n return {\n content: getString(delta, \"text\"),\n type: \"text\",\n } satisfies AIChunk;\n }\n\n if (delta.type === \"input_json_delta\") {\n if (state.currentProviderBlock) {\n state.providerBlockInputJson += getString(delta, \"partial_json\");\n } else {\n state.toolInputJson += getString(delta, \"partial_json\");\n }\n }\n\n if (delta.type === \"signature_delta\") {\n state.thinkingSignature += getString(delta, \"signature\");\n }\n\n return undefined;\n};\n\nconst handleContentBlockStop = (state: AnthropicSSEState) => {\n // Emit thinking signature when thinking block completes\n if (state.isThinkingBlock && state.thinkingSignature) {\n state.isThinkingBlock = false;\n const signature = state.thinkingSignature;\n state.thinkingSignature = \"\";\n\n return {\n content: \"\",\n signature,\n type: \"thinking\",\n } satisfies AIChunk;\n }\n\n if (state.currentProviderBlock) {\n const data = { ...state.currentProviderBlock };\n if (state.providerBlockInputJson) {\n data.input =\n tryParseJson(state.providerBlockInputJson) ??\n state.providerBlockInputJson;\n }\n state.currentProviderBlock = undefined;\n state.providerBlockInputJson = \"\";\n return {\n data,\n provider: state.providerName,\n type: \"provider_event\",\n } satisfies AIChunk;\n }\n\n if (!state.currentToolId) {\n return undefined;\n }\n\n const input = tryParseJson(state.toolInputJson) ?? state.toolInputJson;\n\n const chunk: AIChunk = {\n id: state.currentToolId,\n input,\n name: state.currentToolName,\n type: \"tool_use\",\n };\n\n state.currentToolId = \"\";\n state.currentToolName = \"\";\n state.toolInputJson = \"\";\n\n return chunk;\n};\n\nconst extractUsage = (\n usageRecord: Record<string, unknown> | undefined,\n existingUsage: AIUsage | undefined,\n) => {\n if (!usageRecord) {\n return existingUsage;\n }\n\n const normalized: AIUsage = {\n cacheReadInputTokens:\n getNumber(usageRecord, \"cache_read_input_tokens\") ||\n existingUsage?.cacheReadInputTokens ||\n 0,\n cacheWriteInputTokens:\n getNumber(usageRecord, \"cache_creation_input_tokens\") ||\n existingUsage?.cacheWriteInputTokens ||\n 0,\n inputTokens:\n getNumber(usageRecord, \"input_tokens\") || existingUsage?.inputTokens || 0,\n outputTokens:\n getNumber(usageRecord, \"output_tokens\") ||\n existingUsage?.outputTokens ||\n 0,\n costCredits:\n getNumber(usageRecord, \"cost\") || existingUsage?.costCredits,\n reasoningTokens:\n getNumber(usageRecord, \"reasoning_tokens\") ||\n existingUsage?.reasoningTokens,\n upstreamInferenceCostCredits:\n getNumber(getRecord(usageRecord, \"cost_details\") ?? {}, \"upstream_inference_cost\") ||\n existingUsage?.upstreamInferenceCostCredits,\n };\n const serverToolUse = getRecord(usageRecord, \"server_tool_use\");\n if (serverToolUse) {\n normalized.serverToolUse = Object.fromEntries(\n Object.entries(serverToolUse).filter(\n (entry): entry is [string, number] => typeof entry[1] === \"number\",\n ),\n );\n }\n\n return normalized;\n};\n\nconst mergeMetadata = (\n source: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n const providerMetadata = getRecord(source, \"openrouter_metadata\");\n const generationId = getString(source, \"id\") || undefined;\n const model = getString(source, \"model\") || undefined;\n const provider = getString(source, \"provider\") || undefined;\n const serviceTier = getString(source, \"service_tier\") || undefined;\n if (!providerMetadata && !generationId && !model && !provider && !serviceTier)\n return;\n state.metadata = {\n ...state.metadata,\n generationId: generationId ?? state.metadata?.generationId,\n model: model ?? state.metadata?.model,\n provider: provider ?? state.metadata?.provider,\n providerMetadata: {\n ...state.metadata?.providerMetadata,\n ...providerMetadata,\n },\n serviceTier: serviceTier ?? state.metadata?.serviceTier,\n };\n};\n\nconst handleMessageDelta = (\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n const deltaUsage = getRecord(parsed, \"usage\");\n state.usage = extractUsage(deltaUsage, state.usage);\n\n const delta = getRecord(parsed, \"delta\");\n const stopReason = delta ? getString(delta, \"stop_reason\") : \"\";\n if (stopReason) state.stopReason = stopReason;\n};\n\nconst handleMessageStart = (\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n const message = getRecord(parsed, \"message\");\n\n if (!message) {\n return;\n }\n\n const startUsage = getRecord(message, \"usage\");\n state.usage = extractUsage(startUsage, state.usage);\n mergeMetadata(message, state);\n};\n\nconst handleError = (\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n const error = getRecord(parsed, \"error\");\n const errorMessage = error ? getString(error, \"message\") : \"\";\n const nativeErrorType = error ? getString(error, \"type\") : \"\";\n const errorType = error\n ? getString(error, \"error_type\") || nativeErrorType\n : \"\";\n\n // Mid-stream error events (e.g. \"overloaded_error\") — overloaded/rate-limit\n // types are retryable; everything else is treated as a hard failure.\n const retryable =\n errorType === \"provider_overloaded\" ||\n errorType === \"rate_limit_exceeded\" ||\n errorType === \"provider_unavailable\" ||\n errorType === \"server\" ||\n nativeErrorType === \"overloaded_error\" ||\n nativeErrorType === \"rate_limit_error\" ||\n nativeErrorType === \"api_error\";\n\n throw new ProviderError({\n message: errorMessage || \"Anthropic API error\",\n metadata: error,\n provider: state.providerName,\n retryable,\n type: errorType || null,\n });\n};\n\nconst processEvent = (\n eventType: string,\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n switch (eventType) {\n case \"content_block_start\": {\n handleContentBlockStart(parsed, state);\n\n return undefined;\n }\n\n case \"content_block_delta\": {\n return handleContentBlockDelta(parsed, state);\n }\n\n case \"content_block_stop\": {\n return handleContentBlockStop(state);\n }\n\n case \"message_delta\": {\n handleMessageDelta(parsed, state);\n mergeMetadata(parsed, state);\n\n return undefined;\n }\n\n case \"message_start\": {\n handleMessageStart(parsed, state);\n\n return undefined;\n }\n\n case \"message_stop\": {\n mergeMetadata(parsed, state);\n return {\n stopReason: state.stopReason,\n metadata: state.metadata,\n type: \"done\" as const,\n usage: state.usage,\n };\n }\n\n case \"error\": {\n handleError(parsed, state);\n\n return undefined;\n }\n\n default: {\n return undefined;\n }\n }\n};\n\nconst processSingleEvent = (event: string, state: AnthropicSSEState) => {\n if (!event.trim()) {\n return undefined;\n }\n\n const { eventData, eventType } = parseEventLines(event);\n\n if (!eventData) {\n return undefined;\n }\n\n const parsed = tryParseJson(eventData);\n\n if (!parsed) {\n return undefined;\n }\n\n return processEvent(eventType, parsed, state);\n};\n\nconst collectChunk = (event: string, state: AnthropicSSEState) => {\n const chunk = processSingleEvent(event, state);\n\n return chunk ? [chunk] : [];\n};\n\nconst processBufferedEvents = (\n eventsText: string,\n state: AnthropicSSEState,\n) => {\n const events = eventsText.split(\"\\n\\n\");\n state.buffer = events.pop() ?? \"\";\n\n return events.flatMap((event) => collectChunk(event, state));\n};\n\nconst readNextChunks = async (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: AnthropicSSEState,\n signal?: AbortSignal,\n) => {\n if (signal?.aborted) {\n return { chunks: EMPTY_CHUNKS, done: true };\n }\n\n const { done, value } = await reader.read();\n\n if (done) {\n return { chunks: EMPTY_CHUNKS, done: true };\n }\n\n const rawText = state.buffer + decoder.decode(value, { stream: true });\n const chunks = processBufferedEvents(rawText, state);\n\n return { chunks, done: false };\n};\n\nconst findDoneChunk = (chunks: AIChunk[]) =>\n chunks.findIndex((c) => c.type === \"done\");\n\nconst sseStreamLoop = async (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: AnthropicSSEState,\n signal?: AbortSignal,\n) => {\n const result = await readNextChunks(reader, decoder, state, signal);\n\n if (result.done) {\n return { chunks: result.chunks, finished: true };\n }\n\n const doneIdx = findDoneChunk(result.chunks);\n\n if (doneIdx >= 0) {\n return { chunks: result.chunks.slice(0, doneIdx + 1), finished: true };\n }\n\n return { chunks: result.chunks, finished: false };\n};\n\n// eslint-disable-next-line func-style\nasync function* streamChunks(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: AnthropicSSEState,\n signal?: AbortSignal,\n) {\n let finished = false;\n\n while (!finished) {\n // eslint-disable-next-line no-await-in-loop\n const result = await sseStreamLoop(reader, decoder, state, signal);\n ({ finished } = result);\n yield* result.chunks;\n }\n}\n\n// eslint-disable-next-line func-style\nasync function* parseSSEStream(\n body: ReadableStream<Uint8Array>,\n providerName: string,\n signal?: AbortSignal,\n) {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n\n const state: AnthropicSSEState = {\n buffer: \"\",\n currentToolId: \"\",\n currentToolName: \"\",\n isThinkingBlock: false,\n stopReason: \"\",\n thinkingSignature: \"\",\n toolInputJson: \"\",\n usage: undefined,\n providerName,\n providerBlockInputJson: \"\",\n };\n\n try {\n yield* streamChunks(reader, decoder, state, signal);\n } finally {\n reader.releaseLock();\n }\n}\n\nconst fetchAndStream = async function* (\n baseUrl: string,\n config: AnthropicConfig,\n params: AIProviderStreamParams,\n configuredMax: number,\n promptCaching: boolean,\n providerName: string,\n) {\n const builtBody = buildRequestBody(params, configuredMax, promptCaching);\n const body = config.transformRequestBody\n ? config.transformRequestBody(builtBody, params)\n : builtBody;\n\n const target = `${baseUrl}/v1/messages`;\n const fetchImpl = config.fetch ?? fetch;\n const token = config.tokenSource\n ? await Promise.resolve(config.tokenSource())\n : config.apiKey!;\n const suppliedHeaders =\n typeof config.headers === \"function\"\n ? await config.headers(params)\n : (config.headers ?? {});\n const requestHeaders = new Headers(suppliedHeaders);\n requestHeaders.set(\"Content-Type\", \"application/json\");\n if (config.authStyle === \"bearer\") {\n requestHeaders.set(\"Authorization\", `Bearer ${token}`);\n } else {\n requestHeaders.set(\"anthropic-version\", API_VERSION);\n requestHeaders.set(\"x-api-key\", token);\n }\n const response = await fetchImpl(target, {\n ...h2IfHttps(target),\n body: JSON.stringify(body),\n headers: requestHeaders,\n method: \"POST\",\n signal: params.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n throw ProviderError.fromResponse(providerName, response.status, errorText);\n }\n\n if (!response.body) {\n throw new ProviderError({\n message: `${providerName} Messages API returned no response body`,\n provider: providerName,\n retryable: true,\n });\n }\n\n yield* parseSSEStream(response.body, providerName, params.signal);\n};\n\nexport const anthropic = (config: AnthropicConfig): AIProviderConfig => {\n if (!config.apiKey && !config.tokenSource)\n throw new Error(\"anthropic() requires either apiKey or tokenSource\");\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n const configuredMax = config.maxTokens ?? DEFAULT_MAX_TOKENS;\n const promptCaching = config.promptCaching ?? true;\n const providerName = config.providerName ?? \"anthropic\";\n\n return instrumentAIProvider(\n {\n stream: (params: AIProviderStreamParams) =>\n fetchAndStream(\n baseUrl,\n config,\n params,\n configuredMax,\n promptCaching,\n providerName,\n ),\n },\n providerName,\n );\n};\n",
12
+ "import { ProviderError } from \"../errors/providerError\";\n\nexport type OpenRouterClientConfig = {\n allowedModels?: readonly string[];\n apiKey?: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);\n tokenSource?: () => Promise<string> | string;\n};\n\nexport type OpenRouterModel = {\n id: string;\n name?: string;\n description?: string;\n context_length?: number;\n architecture?: Record<string, unknown>;\n pricing?: Record<string, string>;\n supported_parameters?: string[] | Record<string, unknown>;\n [field: string]: unknown;\n};\n\nexport type OpenRouterModelList = { data: OpenRouterModel[] };\n\nexport type OpenRouterModelQuery = {\n arch?: string;\n context?: number;\n distillable?: \"false\" | \"true\";\n input_modalities?: string;\n max_price?: number;\n min_price?: number;\n model_authors?: string;\n output_modalities?: string;\n providers?: string;\n q?: string;\n region?: \"eu\";\n supported_parameters?: string;\n sort?:\n | \"pricing-low-to-high\"\n | \"pricing-high-to-low\"\n | \"context-high-to-low\"\n | \"throughput-high-to-low\"\n | \"latency-low-to-high\"\n | \"most-popular\"\n | \"top-weekly\"\n | \"newest\"\n | \"intelligence-high-to-low\"\n | \"design-arena-elo-high-to-low\";\n zdr?: \"true\";\n};\n\nexport type OpenRouterEmbeddingRequest = {\n model: string;\n input: string | string[] | number[] | number[][];\n dimensions?: number;\n encoding_format?: \"float\" | \"base64\";\n provider?: Record<string, unknown>;\n user?: string;\n};\n\nexport type OpenRouterEmbeddingResponse = {\n data: Array<{ embedding: number[] | string; index: number; object: string }>;\n model: string;\n object: string;\n usage?: { prompt_tokens: number; total_tokens: number; cost?: number };\n};\n\nexport type OpenRouterRerankRequest = {\n model: string;\n query: string;\n documents: Array<string | { text: string }>;\n top_n?: number;\n return_documents?: boolean;\n};\n\nexport type OpenRouterRerankResponse = {\n id?: string;\n model?: string;\n results: Array<{\n document?: { text: string };\n index: number;\n relevance_score: number;\n }>;\n usage?: Record<string, number>;\n};\n\nexport type OpenRouterImageRequest = {\n model: string;\n prompt: string;\n n?: number;\n resolution?: string;\n aspect_ratio?: string;\n size?: string;\n quality?: \"auto\" | \"low\" | \"medium\" | \"high\";\n output_format?: \"png\" | \"jpeg\" | \"webp\" | \"svg\";\n background?: \"auto\" | \"transparent\" | \"opaque\";\n output_compression?: number;\n seed?: number;\n input_references?: Array<Record<string, unknown>>;\n provider?: Record<string, unknown>;\n stream?: boolean;\n};\n\nexport type OpenRouterImageResponse = {\n created: number;\n data: Array<{ b64_json: string; media_type?: string }>;\n usage?: Record<string, number>;\n};\n\nexport type OpenRouterImageModelEndpoint = {\n allowed_passthrough_parameters: string[];\n pricing: Array<{\n billable: string;\n cost_usd: number;\n unit: \"image\" | \"megapixel\" | \"token\" | string;\n variant?: string;\n }>;\n provider_name: string;\n provider_slug: string;\n provider_tag: string | null;\n supported_parameters: Record<string, unknown>;\n supports_streaming: boolean;\n};\n\nexport type OpenRouterImageModelEndpoints = {\n endpoints: OpenRouterImageModelEndpoint[];\n id: string;\n};\n\nexport type OpenRouterResponsesRequest = Record<string, unknown> & {\n input: unknown;\n model: string;\n stream?: boolean;\n};\n\nexport type OpenRouterSpeechRequest = Record<string, unknown> & {\n input: string;\n model: string;\n voice: string;\n};\n\nexport type OpenRouterTranscriptionRequest = Record<string, unknown> & {\n model: string;\n};\n\nexport type OpenRouterVideoRequest = Record<string, unknown> & {\n model: string;\n prompt: string;\n};\n\nexport type OpenRouterImageStreamEvent = Record<string, unknown> & {\n type: string;\n b64_json?: string;\n media_type?: string;\n partial_image_index?: number;\n usage?: Record<string, number>;\n};\n\nexport type OpenRouterFile = {\n created_at: string;\n downloadable: boolean;\n filename: string;\n id: string;\n mime_type: string;\n size_bytes: number;\n type: \"file\";\n};\n\nexport type OpenRouterFileList = {\n cursor: string | null;\n data: OpenRouterFile[];\n first_id: string | null;\n has_more: boolean;\n last_id: string | null;\n};\n\nexport type OpenRouterVideoJob = {\n error?: string;\n generation_id?: string | null;\n id: string;\n polling_url?: string;\n status: \"pending\" | \"in_progress\" | \"completed\" | \"failed\" | \"cancelled\" | \"expired\";\n unsigned_urls?: string[];\n usage?: { cost?: number; is_byok?: boolean };\n};\n\nexport type OpenRouterVideoWebhookEvent = {\n created_at: string;\n data: OpenRouterVideoJob & { model?: string | null };\n type:\n | \"video.generation.completed\"\n | \"video.generation.failed\"\n | \"video.generation.cancelled\"\n | \"video.generation.expired\";\n};\n\nexport type OpenRouterZdrEndpoint = Record<string, unknown> & {\n context_length: number;\n model_id: string;\n model_name: string;\n name: string;\n pricing: Record<string, string>;\n provider_name: string;\n supported_parameters: string[];\n tag: string;\n};\n\nexport type OpenRouterHttpRequestOptions = Omit<\n RequestInit,\n \"body\" | \"headers\"\n> & {\n body?: unknown;\n headers?: HeadersInit;\n query?: Record<string, boolean | number | string | undefined>;\n};\n\nexport type OpenRouterClient = ReturnType<typeof createOpenRouterClient>;\n\nconst DEFAULT_BASE_URL = \"https://openrouter.ai/api/v1\";\n\nconst withoutLatestPrefix = (model: string) =>\n model.startsWith(\"~\") ? model.slice(1) : model;\n\nexport const openRouterModelMatchesRule = (model: string, rule: string) => {\n const normalizedModel = withoutLatestPrefix(model);\n const normalizedRule = withoutLatestPrefix(rule);\n return normalizedRule.endsWith(\"/*\")\n ? normalizedModel.startsWith(normalizedRule.slice(0, -1))\n : normalizedModel === normalizedRule;\n};\n\nconst assertAllowedModel = (\n model: string,\n allowedModels: readonly string[] | undefined,\n) => {\n if (!allowedModels) return;\n if (allowedModels.some((rule) => openRouterModelMatchesRule(model, rule)))\n return;\n throw new Error(`OpenRouter model \"${model}\" is not allowed`);\n};\n\nconst normalizePath = (path: string) =>\n path.startsWith(\"/\") ? path : `/${path}`;\n\nconst encodeModelPath = (model: string) =>\n model.split(\"/\").map(encodeURIComponent).join(\"/\");\n\nconst withQuery = (\n url: string,\n query: OpenRouterHttpRequestOptions[\"query\"],\n) => {\n if (!query) return url;\n const result = new URL(url);\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) result.searchParams.set(key, String(value));\n }\n return result.toString();\n};\n\nconst parseImageSSE = async function* (\n response: Response,\n): AsyncGenerator<OpenRouterImageStreamEvent> {\n if (!response.body) throw new Error(\"OpenRouter image stream has no body\");\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\n for (;;) {\n // eslint-disable-next-line no-await-in-loop\n const result = await reader.read();\n buffer += decoder.decode(result.value, { stream: !result.done });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const data = line.slice(6);\n if (data === \"[DONE]\") return;\n try {\n const parsed: unknown = JSON.parse(data);\n if (parsed && typeof parsed === \"object\" && \"type\" in parsed)\n yield parsed as OpenRouterImageStreamEvent;\n } catch {\n // Ignore malformed keepalive/event lines; a later valid event can continue.\n }\n }\n if (result.done) break;\n }\n if (buffer.startsWith(\"data: \")) {\n const parsed: unknown = JSON.parse(buffer.slice(6));\n if (parsed && typeof parsed === \"object\" && \"type\" in parsed)\n yield parsed as OpenRouterImageStreamEvent;\n }\n } finally {\n reader.releaseLock();\n }\n};\n\nconst toBytes = (value: string | Uint8Array) =>\n typeof value === \"string\" ? new TextEncoder().encode(value) : value;\n\nconst hexToBytes = (hex: string) => {\n if (!/^[0-9a-f]+$/iu.test(hex) || hex.length % 2 !== 0) return;\n const bytes = new Uint8Array(hex.length / 2);\n for (let index = 0; index < bytes.length; index += 1) {\n bytes[index] = Number.parseInt(hex.slice(index * 2, index * 2 + 2), 16);\n }\n return bytes;\n};\n\nconst constantTimeEqual = (left: Uint8Array, right: Uint8Array) => {\n if (left.length !== right.length) return false;\n let mismatch = 0;\n for (let index = 0; index < left.length; index += 1)\n mismatch |= (left[index] ?? 0) ^ (right[index] ?? 0);\n return mismatch === 0;\n};\n\n/** Verify `X-OpenRouter-Signature` against the exact raw webhook bytes. */\nexport const verifyOpenRouterWebhookSignature = async (options: {\n body: string | Uint8Array;\n header: string;\n secret: string;\n nowSeconds?: number;\n toleranceSeconds?: number;\n}) => {\n const fields = new Map(\n options.header.split(\",\").map((part) => {\n const [key, ...rest] = part.trim().split(\"=\");\n return [key, rest.join(\"=\")];\n }),\n );\n const timestamp = fields.get(\"t\");\n const supplied = fields.get(\"v1\");\n if (!timestamp || !supplied) return false;\n const timestampNumber = Number(timestamp);\n const now = options.nowSeconds ?? Math.floor(Date.now() / 1000);\n const tolerance = options.toleranceSeconds ?? 300;\n if (\n !Number.isFinite(timestampNumber) ||\n Math.abs(now - timestampNumber) > tolerance\n )\n return false;\n const key = await crypto.subtle.importKey(\n \"raw\",\n Uint8Array.from(toBytes(options.secret)).buffer,\n { hash: \"SHA-256\", name: \"HMAC\" },\n false,\n [\"sign\"],\n );\n const prefix = new TextEncoder().encode(`${timestamp},`);\n const body = toBytes(options.body);\n const payload = new Uint8Array(prefix.length + body.length);\n payload.set(prefix);\n payload.set(body, prefix.length);\n const expected = new Uint8Array(\n await crypto.subtle.sign(\"HMAC\", key, payload.buffer),\n );\n const suppliedBytes = hexToBytes(supplied);\n return suppliedBytes ? constantTimeEqual(expected, suppliedBytes) : false;\n};\n\nexport const createOpenRouterClient = (config: OpenRouterClientConfig) => {\n if (!config.apiKey && !config.tokenSource)\n throw new Error(\n \"createOpenRouterClient() requires either apiKey or tokenSource\",\n );\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n const fetchImpl = config.fetch ?? globalThis.fetch;\n const allowedModels = config.allowedModels\n ? [...config.allowedModels]\n : undefined;\n\n const requestRaw = async (\n path: string,\n options: OpenRouterHttpRequestOptions = {},\n ) => {\n const token = config.tokenSource\n ? await Promise.resolve(config.tokenSource())\n : config.apiKey!;\n const suppliedHeaders =\n typeof config.headers === \"function\"\n ? await config.headers()\n : (config.headers ?? {});\n const headers = new Headers(suppliedHeaders);\n new Headers(options.headers).forEach((value, key) =>\n headers.set(key, value),\n );\n headers.set(\"Authorization\", `Bearer ${token}`);\n let body: BodyInit | undefined;\n if (options.body instanceof FormData || options.body instanceof Blob) {\n body = options.body;\n } else if (options.body !== undefined) {\n headers.set(\"Content-Type\", \"application/json\");\n body = JSON.stringify(options.body);\n }\n const { query, ...requestInit } = options;\n const response = await fetchImpl(\n withQuery(`${baseUrl}${normalizePath(path)}`, options.query),\n { ...requestInit, body, headers },\n );\n if (!response.ok) {\n throw ProviderError.fromResponse(\n \"openrouter\",\n response.status,\n await response.text(),\n );\n }\n return response;\n };\n\n const request = async <T>(\n path: string,\n options: OpenRouterHttpRequestOptions = {},\n ): Promise<T> => (await requestRaw(path, options)).json() as Promise<T>;\n\n const listModels = async (\n query?: OpenRouterModelQuery,\n ): Promise<OpenRouterModelList> => {\n const result = await request<OpenRouterModelList>(\"/models\", { query });\n if (!allowedModels) return result;\n return {\n ...result,\n data: result.data.filter((model) =>\n allowedModels.some((rule) =>\n openRouterModelMatchesRule(model.id, rule),\n ),\n ),\n };\n };\n\n const filterModelList = (result: OpenRouterModelList) => {\n if (!allowedModels) return result;\n return {\n ...result,\n data: result.data.filter((model) =>\n allowedModels.some((rule) =>\n openRouterModelMatchesRule(model.id, rule),\n ),\n ),\n };\n };\n\n return {\n cancelBatch: (id: string) =>\n request<Record<string, unknown>>(\n `/batches/${encodeURIComponent(id)}/cancel`,\n {\n method: \"POST\",\n },\n ),\n createBatch: (body: Record<string, unknown>) =>\n request<Record<string, unknown>>(\"/batches\", { body, method: \"POST\" }),\n createEmbedding: (body: OpenRouterEmbeddingRequest) => {\n assertAllowedModel(body.model, allowedModels);\n return request<OpenRouterEmbeddingResponse>(\"/embeddings\", {\n body,\n method: \"POST\",\n });\n },\n generateImage: (body: OpenRouterImageRequest) => {\n assertAllowedModel(body.model, allowedModels);\n return request<OpenRouterImageResponse>(\"/images\", {\n body,\n method: \"POST\",\n });\n },\n deleteFile: (id: string, workspaceId?: string) =>\n request<{ id: string; type: \"file_deleted\" }>(\n `/files/${encodeURIComponent(id)}`,\n { method: \"DELETE\", query: { workspace_id: workspaceId } },\n ),\n downloadFile: (id: string, workspaceId?: string) =>\n requestRaw(`/files/${encodeURIComponent(id)}/content`, {\n query: { workspace_id: workspaceId },\n }),\n downloadVideo: (id: string, index = 0) =>\n requestRaw(`/videos/${encodeURIComponent(id)}/content`, {\n query: { index },\n }),\n generateVideo: (body: OpenRouterVideoRequest) => {\n assertAllowedModel(body.model, allowedModels);\n return request<OpenRouterVideoJob>(\"/videos\", {\n body,\n method: \"POST\",\n });\n },\n getBatch: (id: string) =>\n request<Record<string, unknown>>(`/batches/${encodeURIComponent(id)}`),\n getCredits: () => request<{ data: Record<string, number> }>(\"/credits\"),\n getCurrentKey: () => request<{ data: Record<string, unknown> }>(\"/key\"),\n getFile: (id: string, workspaceId?: string) =>\n request<OpenRouterFile>(`/files/${encodeURIComponent(id)}`, {\n query: { workspace_id: workspaceId },\n }),\n getGeneration: (id: string) =>\n request<{ data: Record<string, unknown> }>(\"/generation\", {\n query: { id },\n }),\n getModelEndpoints: (model: string) => {\n assertAllowedModel(model, allowedModels);\n return request<Record<string, unknown>>(\n `/models/${encodeModelPath(model)}/endpoints`,\n );\n },\n getModel: (model: string) => {\n assertAllowedModel(model, allowedModels);\n return request<{ data: OpenRouterModel }>(\n `/model/${encodeModelPath(model)}`,\n );\n },\n getImageModelEndpoints: (model: string) => {\n assertAllowedModel(model, allowedModels);\n return request<OpenRouterImageModelEndpoints>(\n `/images/models/${encodeModelPath(model)}/endpoints`,\n );\n },\n getVideo: (id: string) =>\n request<OpenRouterVideoJob>(`/videos/${encodeURIComponent(id)}`),\n listImageModels: async () =>\n filterModelList(await request<OpenRouterModelList>(\"/images/models\")),\n listFiles: (query?: {\n cursor?: string;\n limit?: number;\n workspace_id?: string;\n }) => request<OpenRouterFileList>(\"/files\", { query }),\n listModels,\n listUserModels: async () =>\n filterModelList(await request<OpenRouterModelList>(\"/models/user\")),\n listZdrEndpoints: async () => {\n const result = await request<{ data: OpenRouterZdrEndpoint[] }>(\n \"/endpoints/zdr\",\n );\n if (!allowedModels) return result;\n return {\n ...result,\n data: result.data.filter((endpoint) =>\n allowedModels.some((rule) =>\n openRouterModelMatchesRule(endpoint.model_id, rule),\n ),\n ),\n };\n },\n countModels: (outputModalities?: string) =>\n request<{ data: { count: number } }>(\"/models/count\", {\n query: { output_modalities: outputModalities },\n }),\n listPresets: (offset = 0, limit = 100) =>\n request<{ data: Record<string, unknown>[]; total_count: number }>(\n \"/presets\",\n { query: { limit, offset } },\n ),\n listPresetVersions: (slug: string, offset = 0, limit = 100) =>\n request<{ data: Record<string, unknown>[]; total_count: number }>(\n `/presets/${encodeURIComponent(slug)}/versions`,\n { query: { limit, offset } },\n ),\n listProviders: () =>\n request<{ data: Record<string, unknown>[] }>(\"/providers\"),\n listRerankModels: async () =>\n filterModelList(await request<OpenRouterModelList>(\"/rerank/models\")),\n listVideoModels: async () =>\n filterModelList(await request<OpenRouterModelList>(\"/videos/models\")),\n request,\n requestRaw,\n streamImage: async function* (\n body: Omit<OpenRouterImageRequest, \"stream\">,\n options: Omit<OpenRouterHttpRequestOptions, \"body\" | \"method\"> = {},\n ) {\n assertAllowedModel(body.model, allowedModels);\n const response = await requestRaw(\"/images\", {\n ...options,\n body: { ...body, stream: true },\n method: \"POST\",\n });\n yield* parseImageSSE(response);\n },\n respond: (body: OpenRouterResponsesRequest) => {\n assertAllowedModel(body.model, allowedModels);\n return body.stream\n ? requestRaw(\"/responses\", { body, method: \"POST\" })\n : request<Record<string, unknown>>(\"/responses\", {\n body,\n method: \"POST\",\n });\n },\n rerank: (body: OpenRouterRerankRequest) => {\n assertAllowedModel(body.model, allowedModels);\n return request<OpenRouterRerankResponse>(\"/rerank\", {\n body,\n method: \"POST\",\n });\n },\n speak: (body: OpenRouterSpeechRequest) => {\n assertAllowedModel(body.model, allowedModels);\n return requestRaw(\"/audio/speech\", { body, method: \"POST\" });\n },\n transcribe: (body: OpenRouterTranscriptionRequest | FormData) => {\n if (body instanceof FormData) {\n const model = body.get(\"model\");\n if (typeof model !== \"string\")\n throw new Error(\"OpenRouter transcription FormData requires model\");\n assertAllowedModel(model, allowedModels);\n } else {\n assertAllowedModel(body.model, allowedModels);\n }\n return request<Record<string, unknown>>(\"/audio/transcriptions\", {\n body,\n method: \"POST\",\n });\n },\n uploadFile: (\n file: Blob,\n options: { filename?: string; workspaceId?: string } = {},\n ) => {\n const body = new FormData();\n if (options.filename) body.append(\"file\", file, options.filename);\n else body.append(\"file\", file);\n return request<OpenRouterFile>(\"/files\", {\n body,\n method: \"POST\",\n query: { workspace_id: options.workspaceId },\n });\n },\n };\n};\n",
13
+ "import type {\n AIProviderConfig,\n AIProviderStreamParams,\n} from \"../../../types/ai\";\nimport { openai } from \"./openai\";\nimport { openaiResponses } from \"./openaiResponses\";\nimport { anthropic } from \"./anthropic\";\n\nexport type OpenRouterDataCollection = \"allow\" | \"deny\";\nexport type OpenRouterQuantization =\n | \"bf16\"\n | \"fp4\"\n | \"fp6\"\n | \"fp8\"\n | \"fp16\"\n | \"fp32\"\n | \"int4\"\n | \"int8\"\n | \"unknown\";\nexport type OpenRouterSortStrategy = \"latency\" | \"price\" | \"throughput\";\nexport type OpenRouterSort =\n | OpenRouterSortStrategy\n | {\n by: OpenRouterSortStrategy;\n partition?: \"model\" | \"none\";\n };\nexport type OpenRouterPerformancePreference =\n | number\n | {\n p50?: number;\n p75?: number;\n p90?: number;\n p99?: number;\n };\nexport type OpenRouterMaxPrice = {\n /** Maximum completion-token price in USD per million tokens. */\n completion?: number;\n /** Maximum price in USD per image. */\n image?: number;\n /** Maximum prompt-token price in USD per million tokens. */\n prompt?: number;\n /** Maximum price in USD per request. */\n request?: number;\n};\n\nexport type OpenRouterProviderRouting = {\n allowFallbacks?: boolean;\n dataCollection?: OpenRouterDataCollection;\n enforceDistillableText?: boolean;\n ignore?: readonly string[];\n maxPrice?: OpenRouterMaxPrice;\n only?: readonly string[];\n order?: readonly string[];\n preferredMaxLatency?: OpenRouterPerformancePreference;\n preferredMinThroughput?: OpenRouterPerformancePreference;\n quantizations?: readonly OpenRouterQuantization[];\n requireParameters?: boolean;\n sort?: OpenRouterSort;\n zdr?: boolean;\n};\n\nexport type OpenRouterServiceTier =\n | \"auto\"\n | \"default\"\n | \"flex\"\n | \"priority\"\n | \"fast\";\n\nexport type OpenRouterResponseCache = {\n clear?: boolean;\n enabled: boolean;\n /** OpenRouter response-cache TTL in seconds (1-86400). */\n ttlSeconds?: number;\n};\n\nexport type OpenRouterCacheControl = {\n type: \"ephemeral\";\n ttl?: \"5m\" | \"1h\";\n};\n\nexport type OpenRouterPromptCacheOptions = {\n mode: \"explicit\";\n ttl?: string;\n};\n\nexport type OpenRouterReasoning = {\n context?: \"all_turns\" | \"auto\" | \"current_turn\";\n effort?: \"minimal\" | \"low\" | \"medium\" | \"high\" | \"max\" | \"xhigh\";\n enabled?: boolean;\n exclude?: boolean;\n maxTokens?: number;\n mode?: \"pro\";\n summary?: \"auto\" | \"concise\" | \"detailed\";\n};\n\nexport type OpenRouterTrace = Record<string, unknown> & {\n generation_name?: string;\n parent_span_id?: string;\n span_name?: string;\n trace_id?: string;\n trace_name?: string;\n};\n\nexport type OpenRouterAudioOutput = {\n format: \"wav\" | \"mp3\" | \"flac\" | \"opus\" | \"pcm16\";\n voice: string;\n};\n\nexport type OpenRouterPlugin = {\n id: string;\n [option: string]: unknown;\n};\n\nexport type OpenRouterServerTool = {\n type:\n | \"openrouter:web_search\"\n | \"openrouter:web_fetch\"\n | \"openrouter:datetime\"\n | \"openrouter:image_generation\"\n | \"openrouter:apply_patch\"\n | \"openrouter:shell\"\n | \"openrouter:fusion\"\n | \"openrouter:advisor\"\n | \"openrouter:subagent\"\n | \"openrouter:experimental__search_models\";\n parameters?: Record<string, unknown>;\n};\n\nexport type OpenRouterRequestOptions = {\n /** Stream text and synthesized audio from an audio-output chat model. */\n audioOutput?: OpenRouterAudioOutput;\n /** Automatic top-level prompt caching, including optional Anthropic TTL. */\n cacheControl?: OpenRouterCacheControl;\n /** Future OpenRouter fields. Security-sensitive routing fields are rejected. */\n extraBody?: Record<string, unknown>;\n fallbackModels?: readonly string[];\n includeReasoning?: boolean;\n maxToolCalls?: number;\n /** Native `/messages` server-tool definitions and replayable tool shapes. */\n messagesTools?: readonly Record<string, unknown>[];\n plugins?: readonly OpenRouterPlugin[];\n /** Stable cache identity used by compatible OpenAI-family models. */\n promptCacheKey?: string;\n /** OpenAI explicit-cache mode and TTL. */\n promptCacheOptions?: OpenRouterPromptCacheOptions;\n preset?: string;\n responseCache?: OpenRouterResponseCache;\n /** OpenRouter-native reasoning controls beyond the portable effort knob. */\n reasoning?: OpenRouterReasoning;\n routerMetadata?: boolean;\n routing?: OpenRouterProviderRouting;\n serverTools?: readonly OpenRouterServerTool[];\n serviceTier?: OpenRouterServiceTier;\n sessionId?: string;\n stopServerToolsWhen?: readonly Record<string, unknown>[];\n /** Metadata forwarded to configured OpenRouter Broadcast destinations. */\n trace?: OpenRouterTrace;\n transforms?: readonly string[];\n user?: string;\n verbosity?: \"low\" | \"medium\" | \"high\";\n};\n\nexport type OpenRouterConfig = {\n /**\n * Local model policy. Entries are exact model IDs or namespace wildcards such\n * as `anthropic/*`. Requests outside the list fail before network access.\n */\n allowedModels?: readonly string[];\n /** Preset slugs deliberately approved for use with this provider. */\n allowedPresets?: readonly string[];\n /**\n * Inference-provider policy sent as OpenRouter's `provider.only`. When\n * `routing.only` is also set, every entry must be allowed by this policy.\n */\n allowedProviders?: readonly string[];\n apiKey?: string;\n /** Up to two OpenRouter marketplace categories. */\n appCategories?: readonly string[];\n /** Public application name used for optional OpenRouter attribution. */\n appName?: string;\n /** Public application URL used for optional OpenRouter attribution. */\n appUrl?: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);\n /** Default OpenRouter request options, overridable per call. */\n requestOptions?: OpenRouterRequestOptions;\n routing?: OpenRouterProviderRouting;\n tokenSource?: () => Promise<string> | string;\n};\n\nconst DEFAULT_BASE_URL = \"https://openrouter.ai/api\";\nconst MAX_APP_CATEGORIES = 2;\n\nconst withoutLatestPrefix = (model: string) =>\n model.startsWith(\"~\") ? model.slice(1) : model;\n\nconst modelForOpenAICapabilities = (model: string) => {\n const normalized = withoutLatestPrefix(model);\n return normalized.startsWith(\"openai/\")\n ? normalized.slice(\"openai/\".length)\n : normalized;\n};\n\nconst modelMatchesRule = (model: string, rule: string) => {\n const normalizedModel = withoutLatestPrefix(model);\n const normalizedRule = withoutLatestPrefix(rule);\n if (normalizedRule.endsWith(\"/*\")) {\n return normalizedModel.startsWith(normalizedRule.slice(0, -1));\n }\n\n return normalizedModel === normalizedRule;\n};\n\nconst providerMatchesRule = (provider: string, rule: string) =>\n provider === rule || provider.startsWith(`${rule}/`);\n\nconst assertNonEmptyPolicy = (\n label: string,\n value: readonly string[] | undefined,\n) => {\n if (value && value.length === 0) {\n throw new Error(`openrouter() ${label} must not be empty`);\n }\n};\n\nconst assertRoutingPolicy = (config: OpenRouterConfig) => {\n assertNonEmptyPolicy(\"allowedProviders\", config.allowedProviders);\n assertNonEmptyPolicy(\"routing.only\", config.routing?.only);\n assertNonEmptyPolicy(\"allowedPresets\", config.allowedPresets);\n if (\n config.appCategories &&\n config.appCategories.length > MAX_APP_CATEGORIES\n ) {\n throw new Error(\"openrouter() appCategories supports at most 2 entries\");\n }\n if (!config.allowedProviders) return;\n const selected = [\n ...(config.routing?.only ?? []),\n ...(config.routing?.order ?? []),\n ];\n const denied = selected.find(\n (provider) =>\n !config.allowedProviders!.some((rule) =>\n providerMatchesRule(provider, rule),\n ),\n );\n if (denied) {\n throw new Error(\n `openrouter() provider \"${denied}\" is outside allowedProviders`,\n );\n }\n};\n\nconst assertRequestRoutingPolicy = (\n routing: OpenRouterProviderRouting | undefined,\n allowedProviders: readonly string[] | undefined,\n) => {\n assertRoutingPolicy({\n allowedProviders,\n apiKey: \"policy-validation\",\n routing,\n });\n};\n\nconst mapRouting = (\n routing: OpenRouterProviderRouting | undefined,\n allowedProviders: readonly string[] | undefined,\n) => {\n const only = routing?.only ?? allowedProviders;\n const wire: Record<string, unknown> = {};\n if (typeof routing?.allowFallbacks === \"boolean\")\n wire.allow_fallbacks = routing.allowFallbacks;\n if (routing?.dataCollection) wire.data_collection = routing.dataCollection;\n if (typeof routing?.enforceDistillableText === \"boolean\")\n wire.enforce_distillable_text = routing.enforceDistillableText;\n if (routing?.ignore) wire.ignore = [...routing.ignore];\n if (routing?.maxPrice) wire.max_price = { ...routing.maxPrice };\n if (only) wire.only = [...only];\n if (routing?.order) wire.order = [...routing.order];\n if (routing?.preferredMaxLatency !== undefined)\n wire.preferred_max_latency = routing.preferredMaxLatency;\n if (routing?.preferredMinThroughput !== undefined)\n wire.preferred_min_throughput = routing.preferredMinThroughput;\n if (routing?.quantizations) wire.quantizations = [...routing.quantizations];\n if (typeof routing?.requireParameters === \"boolean\")\n wire.require_parameters = routing.requireParameters;\n if (routing?.sort) wire.sort = routing.sort;\n if (typeof routing?.zdr === \"boolean\") wire.zdr = routing.zdr;\n\n return wire;\n};\n\nconst requestOptionsFor = (\n params: AIProviderStreamParams,\n defaults: OpenRouterRequestOptions | undefined,\n) => {\n const supplied = params.providerOptions?.openrouter;\n if (supplied !== undefined && (typeof supplied !== \"object\" || !supplied)) {\n throw new Error(\"providerOptions.openrouter must be an object\");\n }\n\n return {\n ...defaults,\n ...(supplied as OpenRouterRequestOptions | undefined),\n };\n};\n\nconst resolveAttributionHeaders = async (\n config: OpenRouterConfig,\n params: AIProviderStreamParams,\n) => {\n const supplied =\n typeof config.headers === \"function\"\n ? await config.headers()\n : (config.headers ?? {});\n const headers = new Headers(supplied);\n if (config.appUrl) headers.set(\"HTTP-Referer\", config.appUrl);\n if (config.appName) headers.set(\"X-OpenRouter-Title\", config.appName);\n if (config.appCategories?.length) {\n headers.set(\"X-OpenRouter-Categories\", config.appCategories.join(\",\"));\n }\n const options = requestOptionsFor(params, config.requestOptions);\n if (options.routerMetadata ?? true)\n headers.set(\"X-OpenRouter-Metadata\", \"enabled\");\n if (options.sessionId) headers.set(\"X-Session-Id\", options.sessionId);\n if (options.responseCache) {\n headers.set(\n \"X-OpenRouter-Cache\",\n options.responseCache.enabled ? \"true\" : \"false\",\n );\n if (options.responseCache.ttlSeconds !== undefined)\n headers.set(\n \"X-OpenRouter-Cache-TTL\",\n String(options.responseCache.ttlSeconds),\n );\n if (options.responseCache.clear)\n headers.set(\"X-OpenRouter-Cache-Clear\", \"true\");\n }\n\n return headers;\n};\n\nconst SECURITY_SENSITIVE_EXTRA_BODY_FIELDS = new Set([\n \"messages\",\n \"model\",\n \"models\",\n \"plugins\",\n \"preset\",\n \"provider\",\n \"stream\",\n \"tools\",\n]);\n\nconst assertAllowedPreset = (\n preset: string | undefined,\n allowedPresets: readonly string[] | undefined,\n) => {\n if (!preset) return;\n if (allowedPresets?.includes(preset)) return;\n throw new Error(`OpenRouter preset \"${preset}\" is not allowed`);\n};\n\nconst assertIndirectModels = (\n value: unknown,\n allowedModels: readonly string[] | undefined,\n key = \"\",\n) => {\n if (key === \"model\" && typeof value === \"string\")\n assertAllowedModel(value, allowedModels);\n if ((key === \"models\" || key === \"analysis_models\") && Array.isArray(value)) {\n for (const model of value) {\n if (typeof model === \"string\") assertAllowedModel(model, allowedModels);\n }\n }\n if (Array.isArray(value)) {\n for (const item of value) assertIndirectModels(item, allowedModels);\n } else if (value && typeof value === \"object\") {\n for (const [childKey, child] of Object.entries(value))\n assertIndirectModels(child, allowedModels, childKey);\n }\n};\n\nconst assertRequestOptions = (\n options: OpenRouterRequestOptions,\n allowedModels: readonly string[] | undefined,\n allowedPresets: readonly string[] | undefined,\n allowedProviders: readonly string[] | undefined,\n) => {\n assertAllowedPreset(options.preset, allowedPresets);\n assertRequestRoutingPolicy(options.routing, allowedProviders);\n if (options.sessionId && options.sessionId.length > 256)\n throw new Error(\"OpenRouter sessionId must be at most 256 characters\");\n const ttl = options.responseCache?.ttlSeconds;\n if (ttl !== undefined && (!Number.isInteger(ttl) || ttl < 1 || ttl > 86400))\n throw new Error(\"OpenRouter response-cache TTL must be 1-86400 seconds\");\n if (options.responseCache?.clear && !options.responseCache.enabled)\n throw new Error(\"OpenRouter cache clear requires response caching enabled\");\n if (options.fallbackModels) {\n if (options.fallbackModels.length === 0)\n throw new Error(\"OpenRouter fallbackModels must not be empty\");\n for (const model of options.fallbackModels)\n assertAllowedModel(model, allowedModels);\n }\n assertIndirectModels(options.serverTools, allowedModels);\n assertIndirectModels(options.messagesTools, allowedModels);\n assertIndirectModels(options.plugins, allowedModels);\n if (options.extraBody) {\n const unsafe = Object.keys(options.extraBody).find((key) =>\n SECURITY_SENSITIVE_EXTRA_BODY_FIELDS.has(key),\n );\n if (unsafe)\n throw new Error(`OpenRouter extraBody cannot override \"${unsafe}\"`);\n }\n};\n\nconst assertAllowedModel = (\n model: string,\n allowedModels: readonly string[] | undefined,\n) => {\n if (!allowedModels) return;\n if (allowedModels.some((rule) => modelMatchesRule(model, rule))) return;\n throw new Error(`OpenRouter model \"${model}\" is not allowed`);\n};\n\nconst snapshotPolicy = (config: OpenRouterConfig) => ({\n allowedModels: config.allowedModels ? [...config.allowedModels] : undefined,\n allowedPresets: config.allowedPresets\n ? [...config.allowedPresets]\n : undefined,\n});\n\nconst transformOpenRouterRequest = (\n config: OpenRouterConfig,\n allowedModels: readonly string[] | undefined,\n allowedPresets: readonly string[] | undefined,\n body: Record<string, unknown>,\n params: AIProviderStreamParams,\n skin: \"messages\" | \"openai\" = \"openai\",\n) => {\n const options = requestOptionsFor(params, config.requestOptions);\n assertRequestOptions(\n options,\n allowedModels,\n allowedPresets,\n config.allowedProviders,\n );\n const transformed = { ...body, ...options.extraBody };\n if (options.audioOutput) {\n transformed.audio = options.audioOutput;\n transformed.modalities = [\"text\", \"audio\"];\n }\n if (skin === \"openai\") {\n const requestedReasoning: Record<string, unknown> = {};\n if (params.reasoning?.budgetTokens !== undefined) {\n requestedReasoning.max_tokens = params.reasoning.budgetTokens;\n delete transformed.reasoning_effort;\n } else if (params.reasoning?.effort) {\n requestedReasoning.effort = params.reasoning.effort;\n delete transformed.reasoning_effort;\n }\n if (options.reasoning) {\n Object.assign(requestedReasoning, options.reasoning);\n if (options.reasoning.maxTokens !== undefined) {\n requestedReasoning.max_tokens = options.reasoning.maxTokens;\n delete requestedReasoning.maxTokens;\n }\n }\n if (Object.keys(requestedReasoning).length > 0)\n transformed.reasoning = requestedReasoning;\n }\n const automaticCacheControl =\n params.promptCaching === true || params.cacheSystemPrompt === true\n ? ({ type: \"ephemeral\" } satisfies OpenRouterCacheControl)\n : undefined;\n const cacheControl = options.cacheControl ?? automaticCacheControl;\n if (cacheControl) transformed.cache_control = cacheControl;\n if (options.promptCacheKey)\n transformed.prompt_cache_key = options.promptCacheKey;\n if (options.promptCacheOptions)\n transformed.prompt_cache_options = options.promptCacheOptions;\n const routing = mapRouting(\n { ...config.routing, ...options.routing },\n config.allowedProviders,\n );\n if (Object.keys(routing).length > 0) transformed.provider = routing;\n if (options.fallbackModels) transformed.models = [...options.fallbackModels];\n if (options.includeReasoning !== undefined)\n transformed.include_reasoning = options.includeReasoning;\n if (options.maxToolCalls !== undefined)\n transformed.max_tool_calls = options.maxToolCalls;\n if (options.plugins) transformed.plugins = [...options.plugins];\n if (options.preset) transformed.preset = options.preset;\n if (options.serverTools) {\n transformed.tools = [\n ...(Array.isArray(transformed.tools) ? transformed.tools : []),\n ...options.serverTools,\n ];\n }\n if (options.messagesTools) {\n if (skin !== \"messages\")\n throw new Error(\"OpenRouter messagesTools requires openrouterMessages()\");\n transformed.tools = [\n ...(Array.isArray(transformed.tools) ? transformed.tools : []),\n ...options.messagesTools,\n ];\n }\n if (options.serviceTier) transformed.service_tier = options.serviceTier;\n if (options.sessionId) transformed.session_id = options.sessionId;\n if (options.stopServerToolsWhen)\n transformed.stop_server_tools_when = options.stopServerToolsWhen;\n if (options.trace) transformed.trace = options.trace;\n if (options.transforms) transformed.transforms = [...options.transforms];\n if (options.user) transformed.user = options.user;\n if (options.verbosity) transformed.verbosity = options.verbosity;\n\n return transformed;\n};\n\nconst withOpenRouterPolicy = (\n provider: AIProviderConfig,\n allowedModels: readonly string[] | undefined,\n allowedPresets: readonly string[] | undefined,\n): AIProviderConfig => ({\n stream: (params) => {\n if (params.model.startsWith(\"@preset/\")) {\n assertAllowedPreset(\n params.model.slice(\"@preset/\".length),\n allowedPresets,\n );\n } else {\n const presetSeparator = params.model.indexOf(\"@preset/\");\n if (presetSeparator >= 0) {\n assertAllowedModel(\n params.model.slice(0, presetSeparator),\n allowedModels,\n );\n assertAllowedPreset(\n params.model.slice(presetSeparator + \"@preset/\".length),\n allowedPresets,\n );\n } else {\n assertAllowedModel(params.model, allowedModels);\n }\n }\n return provider.stream(params);\n },\n});\n\n/**\n * OpenRouter provider for the shared AbsoluteJS AI contract.\n *\n * Uses the existing OpenAI-compatible streaming implementation while adding\n * OpenRouter attribution, typed provider routing, local model policy, provider\n * allowlists, cost metadata, and OpenRouter-specific error attribution.\n */\nexport const openrouter = (config: OpenRouterConfig): AIProviderConfig => {\n assertRoutingPolicy(config);\n // Snapshot policy at construction so later mutation of a caller-owned array\n // cannot silently broaden a long-lived provider instance.\n const { allowedModels, allowedPresets } = snapshotPolicy(config);\n const provider = openai({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n fetch: config.fetch,\n headers: (params) => resolveAttributionHeaders(config, params),\n modelForCapabilities: modelForOpenAICapabilities,\n providerName: \"openrouter\",\n tokenSource: config.tokenSource,\n transformRequestBody: (body, params) =>\n transformOpenRouterRequest(\n config,\n allowedModels,\n allowedPresets,\n body,\n params,\n ),\n });\n return withOpenRouterPolicy(provider, allowedModels, allowedPresets);\n};\n\n/** OpenRouter's stateless OpenAI-compatible Responses API provider skin. */\nexport const openrouterResponses = (\n config: OpenRouterConfig,\n): AIProviderConfig => {\n assertRoutingPolicy(config);\n const { allowedModels, allowedPresets } = snapshotPolicy(config);\n const provider = openaiResponses({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n fetch: config.fetch,\n headers: (params) => resolveAttributionHeaders(config, params),\n modelForCapabilities: modelForOpenAICapabilities,\n providerName: \"openrouter\",\n tokenSource: config.tokenSource,\n transformRequestBody: (body, params) =>\n transformOpenRouterRequest(\n config,\n allowedModels,\n allowedPresets,\n body,\n params,\n ),\n });\n return withOpenRouterPolicy(provider, allowedModels, allowedPresets);\n};\n\n/** OpenRouter provider using the native Anthropic Messages protocol skin. */\nexport const openrouterMessages = (\n config: OpenRouterConfig,\n): AIProviderConfig => {\n assertRoutingPolicy(config);\n const { allowedModels, allowedPresets } = snapshotPolicy(config);\n const provider = anthropic({\n apiKey: config.apiKey,\n authStyle: \"bearer\",\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n fetch: config.fetch,\n headers: (params) => resolveAttributionHeaders(config, params),\n providerName: \"openrouter\",\n tokenSource: config.tokenSource,\n transformRequestBody: (body, params) =>\n transformOpenRouterRequest(\n config,\n allowedModels,\n allowedPresets,\n body,\n params,\n \"messages\",\n ),\n });\n return withOpenRouterPolicy(provider, allowedModels, allowedPresets);\n};\n\nexport {\n createOpenRouterClient,\n openRouterModelMatchesRule,\n verifyOpenRouterWebhookSignature,\n} from \"./openrouterClient\";\nexport type {\n OpenRouterClient,\n OpenRouterClientConfig,\n OpenRouterEmbeddingRequest,\n OpenRouterEmbeddingResponse,\n OpenRouterFile,\n OpenRouterFileList,\n OpenRouterHttpRequestOptions,\n OpenRouterImageModelEndpoint,\n OpenRouterImageModelEndpoints,\n OpenRouterImageRequest,\n OpenRouterImageResponse,\n OpenRouterImageStreamEvent,\n OpenRouterModel,\n OpenRouterModelList,\n OpenRouterModelQuery,\n OpenRouterRerankRequest,\n OpenRouterRerankResponse,\n OpenRouterResponsesRequest,\n OpenRouterSpeechRequest,\n OpenRouterTranscriptionRequest,\n OpenRouterVideoJob,\n OpenRouterVideoRequest,\n OpenRouterVideoWebhookEvent,\n OpenRouterZdrEndpoint,\n} from \"./openrouterClient\";\n"
13
14
  ],
14
- "mappings": "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",
15
- "debugId": "BFDE217D89D0CFF064756E2164756E21",
15
+ "mappings": "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",
16
+ "debugId": "29E9DB40EA495C0E64756E2164756E21",
16
17
  "names": []
17
18
  }