@absolutejs/ai 0.6.4 → 0.6.6
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.
- package/CHANGELOG.md +19 -0
- package/README.md +18 -0
- package/changelog.json +37 -0
- package/dist/ai/index.js +359 -188
- package/dist/ai/index.js.map +17 -16
- package/dist/ai/providers/anthropic.js +147 -104
- package/dist/ai/providers/anthropic.js.map +8 -8
- package/dist/ai/providers/gemini.js +146 -103
- package/dist/ai/providers/gemini.js.map +7 -7
- package/dist/ai/providers/ollama.js +61 -20
- package/dist/ai/providers/ollama.js.map +5 -5
- package/dist/ai/providers/openai.js +245 -151
- package/dist/ai/providers/openai.js.map +11 -10
- package/dist/ai/providers/openaiCompatible.js +245 -151
- package/dist/ai/providers/openaiCompatible.js.map +11 -10
- package/dist/ai/providers/openaiResponses.js +243 -149
- package/dist/ai/providers/openaiResponses.js.map +10 -9
- package/dist/ai/providers/openrouter.js +246 -152
- package/dist/ai/providers/openrouter.js.map +12 -11
- package/dist/src/ai/contextPolicy.d.ts +2 -0
- package/dist/src/ai/errors/providerError.d.ts +2 -0
- package/dist/src/ai/index.d.ts +3 -0
- package/dist/src/ai/inputCapacity.d.ts +4 -2
- package/dist/src/ai/prepareTextInput.d.ts +2 -0
- package/dist/src/ai/providerFallback.d.ts +27 -8
- package/dist/src/ai/providers/openaiSchema.d.ts +4 -0
- package/package.json +3 -3
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/ai/
|
|
3
|
+
"sources": ["../src/ai/providers/openaiSchema.ts", "../src/ai/errors/providerError.ts", "../src/ai/inputCapacity.ts", "../src/ai/providers/openaiCapacity.ts", "../src/ai/resilience.ts", "../src/ai/providers/instrumentation.ts", "../src/ai/models/reasoning.ts", "../src/ai/providers/reasoning.ts", "../src/ai/providers/openaiResponses.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"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 notSent: 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 notSent: 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 // Billing availability belongs to this configured provider/credential, not\n // every account using the same vendor. Permit one probe after cooldown.\n let billingFailure: ProviderError | null = null;\n let billingRetryAt = 0;\n let billingProbe = false;\n const billingCooldownMs = 5 * 60_000;\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 billingFailure = null;\n billingProbe = false;\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 if (providerError.billingUnavailable) {\n billingFailure = providerError;\n billingRetryAt = Date.now() + billingCooldownMs;\n }\n billingProbe = false;\n const canRetry =\n !yielded &&\n providerError.retryable &&\n attemptNo <\n (params.maxRetries === undefined\n ? config.maxRetries\n : Math.max(0, Math.min(config.maxRetries, params.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 ...provider,\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 if (billingFailure && (Date.now() < billingRetryAt || billingProbe)) {\n const failure = billingFailure;\n return (async function* () {\n throw new ProviderError({\n provider: providerName,\n message: \"Provider billing is unavailable\",\n type: failure.type,\n status: failure.status,\n retryable: false,\n notSent: true,\n });\n })();\n }\n if (billingFailure) billingProbe = true;\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",
|
|
9
|
-
"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 ...provider,\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 (\n (chunk.type === \"done\" ||\n (chunk.type === \"usage_update\" && chunk.final)) &&\n chunk.usage\n ) {\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",
|
|
5
|
+
"const record = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\n/** Losslessly lower finite-key records (including Zod partialRecord) into\n * named optional properties. Never discard arbitrary key constraints. */\nexport const openaiSchema = (\n schema: Record<string, unknown>,\n): Record<string, unknown> => {\n const result: Record<string, unknown> = { ...schema };\n for (const key of [\n \"properties\",\n \"$defs\",\n \"definitions\",\n \"patternProperties\",\n ]) {\n const value = result[key];\n if (record(value))\n result[key] = Object.fromEntries(\n Object.entries(value).map(([name, child]) => [\n name,\n record(child) ? openaiSchema(child) : child,\n ]),\n );\n }\n for (const key of [\n \"items\",\n \"additionalProperties\",\n \"not\",\n \"if\",\n \"then\",\n \"else\",\n ])\n if (record(result[key])) result[key] = openaiSchema(result[key]);\n for (const key of [\"anyOf\", \"oneOf\", \"allOf\", \"prefixItems\"])\n if (Array.isArray(result[key]))\n result[key] = result[key].map((child: unknown) =>\n record(child) ? openaiSchema(child) : child,\n );\n const names = result.propertyNames;\n if (\n record(names) &&\n Array.isArray(names.enum) &&\n names.enum.every((key) => typeof key === \"string\") &&\n Object.keys(names).every((key) =>\n [\"enum\", \"type\", \"description\", \"title\"].includes(key),\n ) &&\n !result.patternProperties\n ) {\n const existing = record(result.properties) ? result.properties : {};\n const additional = result.additionalProperties;\n const entries = names.enum\n .filter(\n (key: string) => Object.hasOwn(existing, key) || additional !== false,\n )\n .map((key: string) => [\n key,\n Object.hasOwn(existing, key)\n ? existing[key]\n : record(additional)\n ? additional\n : {},\n ]);\n result.properties = Object.fromEntries(entries);\n result.additionalProperties = false;\n delete result.propertyNames;\n }\n return result;\n};\n\nexport const isStrictCompatible = (schema: unknown): boolean => {\n if (Array.isArray(schema)) return schema.every(isStrictCompatible);\n if (!record(schema)) return true;\n if (schema.propertyNames || schema.patternProperties) return false;\n const properties = record(schema.properties) ? schema.properties : {};\n if (\n schema.type === \"object\" ||\n schema.properties ||\n schema.additionalProperties !== undefined\n ) {\n const required = Array.isArray(schema.required) ? schema.required : [];\n if (\n schema.additionalProperties !== false ||\n !Object.keys(properties).every((key) => required.includes(key))\n )\n return false;\n }\n const nested = [\n schema.items,\n schema.anyOf,\n schema.oneOf,\n schema.allOf,\n schema.additionalProperties,\n ];\n for (const map of [properties, schema.$defs, schema.definitions])\n if (record(map)) nested.push(...Object.values(map));\n return nested.every(isStrictCompatible);\n};\n",
|
|
6
|
+
"// 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\nconst BILLING_ERROR_TYPES = new Set([\n \"credit_balance_exhausted\",\n \"insufficient_quota\",\n \"billing_hard_limit_reached\",\n \"billing_not_active\",\n \"insufficient_credits\",\n]);\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 /** No request was sent (for example, a locally blocked provider). */\n notSent?: 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 billingUnavailable: boolean;\n readonly notSent: 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 =\n init.type ??\n (typeof init.metadata?.code === \"string\"\n ? init.metadata.code\n : typeof init.metadata?.type === \"string\"\n ? init.metadata.type\n : null);\n this.billingUnavailable =\n BILLING_ERROR_TYPES.has(this.type ?? \"\") ||\n init.status === 402 ||\n (init.provider === \"anthropic\" &&\n init.status === 400 &&\n /credit balance is too low/i.test(\n String(init.metadata?.message ?? init.message),\n ));\n this.notSent = init.notSent === true;\n this.retryable = !this.billingUnavailable && 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 let metadata: Record<string, unknown> | undefined;\n try {\n const parsed = JSON.parse(body);\n const details = parsed?.error ?? parsed;\n if (details && typeof details === \"object\" && !Array.isArray(details))\n metadata = details;\n } catch {\n /* Non-JSON error bodies retain their original message. */\n }\n return new ProviderError({\n metadata,\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 (isProviderError(err))\n return new ProviderError({\n provider: err.provider,\n message: err.message,\n status: err.status,\n type: err.type,\n retryable: err.retryable,\n notSent: err.notSent,\n metadata: err.metadata,\n cause: err,\n });\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\n/** Provider entrypoints are independently bundled; preserve their error contract. */\nexport const isProviderError = (error: unknown): error is ProviderError =>\n error instanceof Error &&\n error.name === \"ProviderError\" &&\n \"provider\" in error &&\n typeof error.provider === \"string\" &&\n \"status\" in error &&\n (error.status === null || typeof error.status === \"number\") &&\n \"retryable\" in error &&\n typeof error.retryable === \"boolean\" &&\n \"billingUnavailable\" in error &&\n typeof error.billingUnavailable === \"boolean\" &&\n \"notSent\" in error &&\n typeof error.notSent === \"boolean\";\n",
|
|
7
|
+
"import { ProviderError, isProviderError } from \"./errors/providerError\";\nimport type { AIProviderConfig, AIProviderStreamParams } from \"../../types/ai\";\n\n/** Provider-reported limits. Some providers have separate input/output windows. */\nexport type AIModelLimits = {\n maxInputTokens: number;\n maxOutputTokens: number;\n contextWindowTokens?: number;\n};\nexport type AIInputCapacity = {\n limits: AIModelLimits;\n inputTokens: number;\n outputTokens: number;\n availableInputTokens: number;\n /** Caller-input counts exclude hosted tool definitions and future hosted results.\n * Provider admission still validates the complete request. */\n inputTokenScope: \"request\" | \"caller-input\";\n /** Whether the counted scope fits; not a full hosted-workload guarantee. */\n fits: boolean;\n};\nexport class AIInputError extends Error {\n constructor(\n public readonly code:\n | \"capacity_unavailable\"\n | \"input_too_large\"\n | \"unsupported_content\",\n message: string,\n public readonly providerStatus?: number,\n public readonly requestId?: string,\n public readonly providerError?: ProviderError,\n ) {\n super(message);\n this.name = \"AIInputError\";\n }\n}\nexport const positiveTokenLimit = (value: unknown): number => {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value <= 0)\n throw new AIInputError(\n \"capacity_unavailable\",\n \"The provider did not supply a valid model limit.\",\n );\n return value;\n};\nexport const inputTokenCount = (value: unknown): number => {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0)\n throw new AIInputError(\n \"capacity_unavailable\",\n \"The provider did not supply a valid token count.\",\n );\n return value;\n};\n\n/** No character/token conversion guesses. Includes the serialized prompt and tools. */\nexport const inspectAIInput = async (\n provider: AIProviderConfig,\n params: AIProviderStreamParams,\n): Promise<AIInputCapacity> => {\n params.signal?.throwIfAborted();\n if (!provider.inputCapacity)\n throw new AIInputError(\n \"capacity_unavailable\",\n \"This provider does not expose model capacity and token counting.\",\n );\n const [limits, tokens] = await Promise.all([\n provider.inputCapacity.getLimits(params),\n provider.inputCapacity.countTokens(params),\n ]).catch((error: unknown) => {\n // Provider subpaths may bundle their own AIInputError constructor. Preserve\n // the high-level error contract instead of leaking a different class copy.\n if (\n error instanceof Error &&\n error.name === \"AIInputError\" &&\n \"code\" in error &&\n (error.code === \"capacity_unavailable\" ||\n error.code === \"input_too_large\" ||\n error.code === \"unsupported_content\")\n )\n throw new AIInputError(\n error.code,\n error.message,\n \"providerStatus\" in error && typeof error.providerStatus === \"number\"\n ? error.providerStatus\n : undefined,\n \"requestId\" in error && typeof error.requestId === \"string\"\n ? error.requestId\n : undefined,\n \"providerError\" in error && isProviderError(error.providerError)\n ? ProviderError.from(\n error.providerError,\n error.providerError.provider,\n )\n : undefined,\n );\n throw error;\n });\n const inputTokens = inputTokenCount(tokens);\n const outputTokens = positiveTokenLimit(\n provider.inputCapacity.outputTokens?.(params) ??\n params.maxTokens ??\n limits.maxOutputTokens,\n );\n const maxInputTokens = positiveTokenLimit(limits.maxInputTokens);\n const maxOutputTokens = positiveTokenLimit(limits.maxOutputTokens);\n const availableInputTokens = Math.max(\n 0,\n Math.min(\n maxInputTokens,\n limits.contextWindowTokens === undefined\n ? maxInputTokens\n : positiveTokenLimit(limits.contextWindowTokens) - outputTokens,\n ),\n );\n return {\n limits,\n inputTokens,\n inputTokenScope: provider.inputCapacity.countScope?.(params) ?? \"request\",\n outputTokens,\n availableInputTokens,\n fits:\n outputTokens <= maxOutputTokens && inputTokens <= availableInputTokens,\n };\n};\n\n/** Cache metadata per provider instance; use a zero TTL with rotating auth/headers. never cache failures. */\nexport const cacheModelLimits = (\n load: (params: AIProviderStreamParams) => Promise<AIModelLimits>,\n ttlMs = 300_000,\n) => {\n const cache = new Map<string, { at: number; limits: AIModelLimits }>();\n return async (params: AIProviderStreamParams) => {\n const entry = cache.get(params.model);\n if (entry && Date.now() - entry.at < ttlMs) return entry.limits;\n const limits = await load(params);\n positiveTokenLimit(limits.maxInputTokens);\n positiveTokenLimit(limits.maxOutputTokens);\n if (cache.size >= 100) cache.clear();\n cache.set(params.model, { at: Date.now(), limits });\n return limits;\n };\n};\n\nexport const capacityJson = async (\n response: Response,\n provider = \"unknown\",\n): Promise<Record<string, unknown>> => {\n if (!response.ok) {\n // Retain the provider's reason (billing/auth/rate limit), not the request\n // payload or headers. Callers need this to distinguish actionable failures.\n const payload: unknown = await response.json().catch(() => undefined);\n const record =\n payload && typeof payload === \"object\" && !Array.isArray(payload)\n ? (payload as Record<string, unknown>)\n : undefined;\n const providerError = record?.error;\n const nested =\n providerError &&\n typeof providerError === \"object\" &&\n !Array.isArray(providerError)\n ? (providerError as Record<string, unknown>)\n : undefined;\n const message = nested?.message ?? record?.message;\n const detail =\n typeof message === \"string\" ? message.slice(0, 1000) : undefined;\n const id =\n response.headers.get(\"request-id\") ??\n response.headers.get(\"x-request-id\") ??\n record?.request_id;\n throw new AIInputError(\n \"capacity_unavailable\",\n `Model capacity request failed (${response.status}).${detail ? ` ${detail}` : \"\"}`,\n response.status,\n typeof id === \"string\" ? id.slice(0, 200) : undefined,\n ProviderError.fromResponse(\n provider,\n response.status,\n JSON.stringify({ error: nested ?? record ?? {} }),\n ),\n );\n }\n const value: unknown = await response.json();\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n throw new AIInputError(\n \"capacity_unavailable\",\n \"Model capacity response was invalid.\",\n );\n return value as Record<string, unknown>;\n};\n",
|
|
8
|
+
"import type {\n AIProviderConfig,\n AIProviderStreamParams,\n} from \"../../../types/ai\";\nimport {\n AIInputError,\n capacityJson,\n inputTokenCount,\n positiveTokenLimit,\n type AIModelLimits,\n} from \"../inputCapacity\";\n\n// Exact IDs only: new variants/snapshots must not inherit a guessed context size.\n// Sources verified 2026-09-15: https://developers.openai.com/api/docs/models/{id}\nconst LIMITS: Record<string, AIModelLimits> = {\n \"gpt-4.1\": {\n maxInputTokens: 1047576,\n contextWindowTokens: 1047576,\n maxOutputTokens: 32768,\n },\n \"gpt-4.1-2025-04-14\": {\n maxInputTokens: 1047576,\n contextWindowTokens: 1047576,\n maxOutputTokens: 32768,\n },\n \"gpt-4.1-mini\": {\n maxInputTokens: 1047576,\n contextWindowTokens: 1047576,\n maxOutputTokens: 32768,\n },\n \"gpt-4.1-mini-2025-04-14\": {\n maxInputTokens: 1047576,\n contextWindowTokens: 1047576,\n maxOutputTokens: 32768,\n },\n \"gpt-4.1-nano\": {\n maxInputTokens: 1047576,\n contextWindowTokens: 1047576,\n maxOutputTokens: 32768,\n },\n \"gpt-4.1-nano-2025-04-14\": {\n maxInputTokens: 1047576,\n contextWindowTokens: 1047576,\n maxOutputTokens: 32768,\n },\n \"gpt-4o\": {\n maxInputTokens: 128000,\n contextWindowTokens: 128000,\n maxOutputTokens: 16384,\n },\n \"gpt-4o-mini\": {\n maxInputTokens: 128000,\n contextWindowTokens: 128000,\n maxOutputTokens: 16384,\n },\n \"gpt-4o-mini-2024-07-18\": {\n maxInputTokens: 128000,\n contextWindowTokens: 128000,\n maxOutputTokens: 16384,\n },\n \"gpt-5\": {\n maxInputTokens: 272000,\n contextWindowTokens: 400000,\n maxOutputTokens: 128000,\n },\n \"gpt-5-mini\": {\n maxInputTokens: 272000,\n contextWindowTokens: 400000,\n maxOutputTokens: 128000,\n },\n \"gpt-5-mini-2025-08-07\": {\n maxInputTokens: 272000,\n contextWindowTokens: 400000,\n maxOutputTokens: 128000,\n },\n \"gpt-5-nano\": {\n maxInputTokens: 272000,\n contextWindowTokens: 400000,\n maxOutputTokens: 128000,\n },\n \"gpt-5-nano-2025-08-07\": {\n maxInputTokens: 272000,\n contextWindowTokens: 400000,\n maxOutputTokens: 128000,\n },\n \"gpt-5.4-mini\": {\n maxInputTokens: 272000,\n contextWindowTokens: 400000,\n maxOutputTokens: 128000,\n },\n \"gpt-5.4-nano\": {\n maxInputTokens: 272000,\n contextWindowTokens: 400000,\n maxOutputTokens: 128000,\n },\n \"gpt-5.1\": {\n maxInputTokens: 400000,\n contextWindowTokens: 400000,\n maxOutputTokens: 128000,\n },\n \"gpt-5.1-2025-11-13\": {\n maxInputTokens: 400000,\n contextWindowTokens: 400000,\n maxOutputTokens: 128000,\n },\n \"gpt-5.2\": {\n maxInputTokens: 400000,\n contextWindowTokens: 400000,\n maxOutputTokens: 128000,\n },\n \"gpt-5.2-2025-12-11\": {\n maxInputTokens: 400000,\n contextWindowTokens: 400000,\n maxOutputTokens: 128000,\n },\n \"gpt-5.4\": {\n maxInputTokens: 1050000,\n contextWindowTokens: 1050000,\n maxOutputTokens: 128000,\n },\n \"gpt-5.4-2026-03-05\": {\n maxInputTokens: 1050000,\n contextWindowTokens: 1050000,\n maxOutputTokens: 128000,\n },\n \"gpt-5.5\": {\n maxInputTokens: 1050000,\n contextWindowTokens: 1050000,\n maxOutputTokens: 128000,\n },\n \"gpt-6.1-sol\": {\n maxInputTokens: 922000,\n contextWindowTokens: 1050000,\n maxOutputTokens: 128000,\n },\n \"gpt-6-luna\": {\n maxInputTokens: 922000,\n contextWindowTokens: 1050000,\n maxOutputTokens: 128000,\n },\n \"gpt-6-astra\": {\n maxInputTokens: 922000,\n contextWindowTokens: 1050000,\n maxOutputTokens: 128000,\n },\n \"gpt-5.6-sol\": {\n maxInputTokens: 922000,\n contextWindowTokens: 1050000,\n maxOutputTokens: 128000,\n },\n \"gpt-5.6-terra\": {\n maxInputTokens: 922000,\n contextWindowTokens: 1050000,\n maxOutputTokens: 128000,\n },\n \"gpt-5.6-luna\": {\n maxInputTokens: 922000,\n contextWindowTokens: 1050000,\n maxOutputTokens: 128000,\n },\n o3: {\n maxInputTokens: 200000,\n contextWindowTokens: 200000,\n maxOutputTokens: 100000,\n },\n \"o3-2025-04-16\": {\n maxInputTokens: 200000,\n contextWindowTokens: 200000,\n maxOutputTokens: 100000,\n },\n \"o4-mini\": {\n maxInputTokens: 200000,\n contextWindowTokens: 200000,\n maxOutputTokens: 100000,\n },\n \"o4-mini-2025-04-16\": {\n maxInputTokens: 200000,\n contextWindowTokens: 200000,\n maxOutputTokens: 100000,\n },\n \"gpt-5-chat-latest\": {\n maxInputTokens: 128000,\n contextWindowTokens: 128000,\n maxOutputTokens: 16384,\n },\n \"gpt-5.1-chat-latest\": {\n maxInputTokens: 128000,\n contextWindowTokens: 128000,\n maxOutputTokens: 16384,\n },\n \"gpt-5.2-chat-latest\": {\n maxInputTokens: 128000,\n contextWindowTokens: 128000,\n maxOutputTokens: 16384,\n },\n};\nexport const openaiInputCapacity = (config: {\n baseUrl: string;\n fetch: typeof globalThis.fetch;\n key: () => Promise<string>;\n headers: (params: AIProviderStreamParams) => Promise<HeadersInit>;\n body: (params: AIProviderStreamParams) => Record<string, unknown>;\n /** For private deployments or models not yet in the documented catalog. */\n modelLimits?: (params: AIProviderStreamParams) => Promise<AIModelLimits>;\n}): NonNullable<AIProviderConfig[\"inputCapacity\"]> => ({\n outputTokens: (params) => {\n const value = config.body(params).max_output_tokens;\n return value === undefined ? undefined : positiveTokenLimit(value);\n },\n getLimits: async (params) => {\n if (config.modelLimits) return config.modelLimits(params);\n if (new URL(config.baseUrl).origin !== \"https://api.openai.com\")\n throw new AIInputError(\n \"capacity_unavailable\",\n \"This compatible endpoint must expose its own model capacity.\",\n );\n const limits = LIMITS[params.model];\n if (!limits)\n throw new AIInputError(\n \"capacity_unavailable\",\n `Model limits are unavailable for ${params.model}; no character limit has been substituted.`,\n );\n return { ...limits };\n },\n countTokens: async (params) => {\n const headers = new Headers(await config.headers(params));\n headers.set(\"Authorization\", `Bearer ${await config.key()}`);\n headers.set(\"Content-Type\", \"application/json\");\n const body = config.body(params);\n const counted: Record<string, unknown> = {};\n for (const key of [\n \"model\",\n \"input\",\n \"instructions\",\n \"tools\",\n \"tool_choice\",\n \"reasoning\",\n \"text\",\n \"parallel_tool_calls\",\n ])\n if (body[key] !== undefined) counted[key] = body[key];\n const response = await config.fetch(\n `${config.baseUrl}/v1/responses/input_tokens`,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(counted),\n signal: params.signal\n ? AbortSignal.any([params.signal, AbortSignal.timeout(15_000)])\n : AbortSignal.timeout(15_000),\n },\n );\n return inputTokenCount(\n (await capacityJson(response, \"openai\")).input_tokens,\n );\n },\n});\n",
|
|
9
|
+
"import { isProviderError } from \"./errors/providerError\";\nimport 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 notSent: 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 notSent: 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 // Billing availability belongs to this configured provider/credential, not\n // every account using the same vendor. Permit one probe after cooldown.\n let billingFailure: ProviderError | null = null;\n let billingRetryAt = 0;\n let billingProbe = false;\n const inspectAvailable = async <T>(inspect: () => Promise<T>): Promise<T> => {\n if (billingFailure && Date.now() < billingRetryAt) {\n throw new ProviderError({\n provider: providerName,\n message: \"Provider billing is unavailable\",\n type: billingFailure.type,\n status: billingFailure.status,\n metadata: billingFailure.metadata,\n retryable: false,\n notSent: true,\n });\n }\n try {\n return await inspect();\n } catch (error) {\n const nested =\n error instanceof Error && \"providerError\" in error\n ? error.providerError\n : error;\n if (isProviderError(nested) && nested.billingUnavailable) {\n billingFailure = ProviderError.from(nested, providerName);\n billingRetryAt = Date.now() + billingCooldownMs;\n }\n throw error;\n }\n };\n const billingCooldownMs = 5 * 60_000;\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 billingFailure = null;\n billingProbe = false;\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 if (providerError.billingUnavailable) {\n billingFailure = providerError;\n billingRetryAt = Date.now() + billingCooldownMs;\n }\n billingProbe = false;\n const canRetry =\n !yielded &&\n providerError.retryable &&\n attemptNo <\n (params.maxRetries === undefined\n ? config.maxRetries\n : Math.max(0, Math.min(config.maxRetries, params.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 } finally {\n billingProbe = false;\n }\n };\n\n return {\n ...provider,\n ...(provider.inputCapacity\n ? {\n inputCapacity: {\n ...provider.inputCapacity,\n getLimits: (params) =>\n inspectAvailable(() => provider.inputCapacity!.getLimits(params)),\n countTokens: (params) =>\n inspectAvailable(() =>\n provider.inputCapacity!.countTokens(params),\n ),\n },\n }\n : {}),\n stream: async function* (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 if (billingFailure && (Date.now() < billingRetryAt || billingProbe)) {\n const failure = billingFailure;\n throw new ProviderError({\n provider: providerName,\n message: \"Provider billing is unavailable\",\n type: failure.type,\n status: failure.status,\n metadata: failure.metadata,\n retryable: false,\n notSent: true,\n });\n }\n const tripped = circuitOpen(providerName);\n if (tripped) {\n throw tripped;\n }\n\n if (billingFailure) billingProbe = true;\n yield* attempt(params, 0);\n },\n };\n};\n",
|
|
10
|
+
"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 ...resilient,\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 (\n (chunk.type === \"done\" ||\n (chunk.type === \"usage_update\" && chunk.final)) &&\n chunk.usage\n ) {\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",
|
|
10
11
|
"import type { ReasoningEffort } from \"../../../types/ai\";\n\nexport const REASONING_EFFORTS = [\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n] as const;\nexport type ReasoningSelection = \"auto\" | ReasoningEffort;\nexport type ModelReasoning = {\n kind: \"effort\" | \"budget\" | \"fixed\";\n efforts: readonly ReasoningEffort[];\n description: string;\n source: string;\n};\nexport const isReasoningSelection = (\n value: unknown,\n): value is ReasoningSelection =>\n value === \"auto\" || REASONING_EFFORTS.some((effort) => effort === value);\nconst profile = (\n kind: ModelReasoning[\"kind\"],\n efforts: readonly ReasoningEffort[],\n description: string,\n source: string,\n): ModelReasoning => ({ kind, efforts, description, source });\nconst claude = profile(\n \"effort\",\n [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n \"More thinking for harder problems; higher settings can take longer and use more credits.\",\n \"https://platform.claude.com/docs/en/build-with-claude/effort\",\n);\nconst claude46 = {\n ...claude,\n efforts: [\"low\", \"medium\", \"high\", \"max\"] as const,\n};\nconst opus45 = { ...claude, efforts: [\"low\", \"medium\", \"high\"] as const };\nconst haiku = profile(\n \"budget\",\n [\"none\", \"low\", \"medium\", \"high\"],\n \"Thinking-token budget: Low 2,048; Medium 8,192; High 16,384. Actual usage can be lower.\",\n \"https://platform.claude.com/docs/en/build-with-claude/extended-thinking\",\n);\nconst gpt = profile(\n \"effort\",\n [\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n claude.description,\n \"https://developers.openai.com/api/docs/models/gpt-5.6-sol\",\n);\nconst gemini = profile(\n \"effort\",\n [\"low\", \"medium\", \"high\"],\n claude.description,\n \"https://ai.google.dev/gemini-api/docs/openai\",\n);\nconst deepseek = profile(\n \"effort\",\n [\"none\", \"low\", \"high\", \"max\"],\n claude.description,\n \"https://api-docs.deepseek.com/guides/thinking_mode/\",\n);\nconst mistral = profile(\n \"effort\",\n [\"none\", \"high\"],\n \"Minimal thinking or full reasoning. This model does not offer intermediate effort levels.\",\n \"https://docs.mistral.ai/studio/conversations/reasoning\",\n);\nconst qwen = profile(\n \"budget\",\n [\"none\", \"low\", \"medium\", \"high\"],\n haiku.description,\n \"https://help.aliyun.com/en/model-studio/deep-thinking\",\n);\n/** Exact reviewed IDs; unknown models expose only the provider default. Reviewed 2026-09-20;\n * Anthropic effort levels re-checked against the Models API 2026-09-25. */\nexport const MODEL_REASONING: Readonly<Record<string, ModelReasoning>> = {\n \"anthropic:claude-opus-5-5\": claude,\n \"anthropic:claude-sonnet-5-5\": claude,\n \"anthropic:claude-haiku-5-5\": claude,\n \"openai:gpt-6.1-sol\": {\n ...gpt,\n efforts: [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n source: \"https://developers.openai.com/api/docs/models/gpt-6.1-sol\",\n },\n \"openai:gpt-6-luna\": {\n ...gpt,\n source: \"https://developers.openai.com/api/docs/models/gpt-6-luna\",\n },\n \"anthropic:claude-fable-5-1\": claude,\n \"anthropic:claude-opus-5\": claude,\n \"anthropic:claude-sonnet-5\": claude,\n \"anthropic:claude-fable-5\": claude,\n \"anthropic:claude-opus-4-8\": claude,\n \"anthropic:claude-opus-4-7\": claude,\n \"anthropic:claude-sonnet-4-6\": claude46,\n \"anthropic:claude-opus-4-6\": claude46,\n \"anthropic:claude-opus-4-5\": opus45,\n \"anthropic:claude-haiku-4-5\": haiku,\n \"anthropic:claude-sonnet-4-5\": haiku,\n \"openai:gpt-6-astra\": {\n ...gpt,\n efforts: [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n source: \"https://developers.openai.com/api/docs/models/gpt-6-astra\",\n },\n \"openai:gpt-5.6-sol\": gpt,\n \"openai:gpt-5.6-terra\": gpt,\n \"openai:gpt-5.6-luna\": gpt,\n \"google:gemini-3.8-flash\": gemini,\n \"google:gemini-3.1-pro-preview\": gemini,\n \"google:gemini-2.5-flash\": profile(\n \"budget\",\n [\"none\", \"low\", \"medium\", \"high\"],\n \"Thinking-token budget: Low 1,024; Medium 8,192; High 24,576.\",\n gemini.source,\n ),\n \"xai:grok-4.6\": profile(\n \"effort\",\n [\"low\", \"medium\", \"high\", \"xhigh\"],\n \"Always reasons. Choose how much thinking it should do.\",\n \"https://docs.x.ai/developers/model-capabilities/text/reasoning\",\n ),\n \"deepseek:deepseek-flash\": deepseek,\n \"deepseek:deepseek-v4-pro\": deepseek,\n \"mistral:mistral-medium-3-5\": mistral,\n \"mistral:mistral-small-latest\": mistral,\n \"alibaba:qwen3.8-max\": qwen,\n \"alibaba:qwen3.7-plus\": qwen,\n \"moonshot:kimi-k3\": profile(\n \"effort\",\n [\"low\", \"high\", \"max\"],\n \"Always reasons. Choose how much thinking it should do.\",\n \"https://platform.kimi.ai/docs/guide/kimi-k3-quickstart\",\n ),\n \"moonshot:kimi-k2.7-code\": profile(\n \"fixed\",\n [],\n \"Thinking is always enabled; this model has no documented adjustable effort control.\",\n \"https://www.kimi.ai/resources/kimi-k2-7-code\",\n ),\n};\nexport const getModelReasoning = (\n provider: string,\n model: string,\n): ModelReasoning | undefined => MODEL_REASONING[`${provider}:${model}`];\nexport const supportsReasoningSelection = (\n provider: string,\n model: string,\n selection: ReasoningSelection,\n): boolean =>\n selection === \"auto\" ||\n Boolean(getModelReasoning(provider, model)?.efforts.includes(selection));\nexport const reasoningSelectionLabel = (\n selection: ReasoningSelection,\n provider?: string,\n): string => {\n if (selection === \"auto\") return \"Auto\";\n if (selection === \"none\") return provider === \"mistral\" ? \"Minimal\" : \"Off\";\n if (selection === \"xhigh\") return \"Extra high\";\n return selection.charAt(0).toUpperCase() + selection.slice(1);\n};\n",
|
|
11
12
|
"import type { ReasoningConfig, ReasoningEffort } from \"../../../types/ai\";\n\nimport { getModelReasoning } from \"../models/reasoning\";\n\nconst EFFORT_ORDER: ReasoningEffort[] = [\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n];\n\n// Anthropic models that take adaptive thinking + output_config.effort.\nconst ANTHROPIC_EFFORT = [\n /opus-4-[5-8]/,\n /sonnet-4-6/,\n /fable-5/,\n /mythos-5/,\n /opus-5/,\n /sonnet-5/,\n /haiku-5/,\n];\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 /haiku-4-5/,\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 = [\n /opus-4-[78]/,\n /fable-5/,\n /mythos-5/,\n /opus-5/,\n /sonnet-5/,\n /haiku-5/,\n];\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-[56]/];\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 none: 0,\n xhigh: 24576,\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 known = getModelReasoning(\"anthropic\", model);\n if (known?.kind === \"effort\") return clampEffort(effort, [...known.efforts]);\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 known = getModelReasoning(\"openai\", model);\n if (known) return clampEffort(effort, [...known.efforts]);\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\n/** Provider-specific Chat Completions controls. Never send a guessed parameter. */\nexport const compatibleReasoningBody = (\n provider: string,\n model: string,\n reasoning?: ReasoningConfig,\n): Record<string, unknown> => {\n if (!reasoning) return {};\n const known = getModelReasoning(provider, model);\n const effort = resolveEffort(reasoning);\n if (!known || !effort) return {};\n if (!known.efforts.includes(effort))\n throw new Error(\n `Unsupported reasoning effort ${effort} for ${provider}:${model}`,\n );\n if (provider === \"alibaba\")\n return effort === \"none\"\n ? { enable_thinking: false }\n : {\n enable_thinking: true,\n thinking_budget: resolveBudgetTokens(reasoning),\n };\n if (provider === \"deepseek\")\n return effort === \"none\"\n ? { thinking: { type: \"disabled\" } }\n : { thinking: { type: \"enabled\" }, reasoning_effort: effort };\n return { reasoning_effort: effort };\n};\nexport const geminiThinkingConfig = (\n model: string,\n reasoning?: ReasoningConfig,\n): Record<string, unknown> | undefined => {\n if (!reasoning) return undefined;\n const profile = getModelReasoning(\"google\", model);\n const effort = resolveEffort(reasoning);\n if (!profile || !effort) return undefined;\n if (!profile.efforts.includes(effort))\n throw new Error(`Unsupported reasoning effort ${effort} for ${model}`);\n if (profile.kind === \"effort\") return { thinkingLevel: effort };\n const budgets: Partial<Record<ReasoningEffort, number>> = {\n none: 0,\n low: 1024,\n medium: 8192,\n high: 24576,\n };\n return { thinkingBudget: reasoning.budgetTokens ?? budgets[effort] };\n};\n",
|
|
12
|
-
"import type {\n AIProviderConfig,\n AIProviderContentBlock,\n AIProviderMessage,\n AIProviderStreamParams,\n AIProviderToolDefinition,\n AIUsage,\n AIResponseMetadata,\n} from \"../../../types/ai\";\nimport { openaiInputCapacity } from \"./openaiCapacity\";\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 modelLimits?: (\n params: AIProviderStreamParams,\n ) => Promise<import(\"../inputCapacity\").AIModelLimits>;\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 // The Responses API takes input_image.image_url as a plain string (a URL or\n // data URI), and a file's URL as file_url rather than file_data.\n if (block.type === \"image\") {\n return {\n detail: \"auto\",\n image_url:\n block.source.type === \"url\"\n ? block.source.url\n : `data:${block.source.media_type};base64,${block.source.data}`,\n type: \"input_image\",\n };\n }\n\n if (block.type === \"document\") {\n return block.source.type === \"url\"\n ? { file_url: block.source.url, type: \"input_file\" }\n : {\n file_data: `data:${block.source.media_type};base64,${block.source.data}`,\n filename: block.name ?? \"document.pdf\",\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 // Replay the call without its output item `id`. With the id, OpenAI\n // requires the reasoning item that produced it, which is not replayed,\n // so every reasoning-model conversation 400s after its first tool round.\n if (block.providerData)\n return Object.fromEntries(\n Object.entries(block.providerData).filter(([key]) => key !== \"id\"),\n );\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: block.images?.length\n ? [\n { text: block.content, type: \"input_text\" },\n ...block.images.map((source) =>\n mapBlockToResponsesFormat({ source, type: \"image\" }),\n ),\n ]\n : 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\n// Strict mode requires every object to list all of its properties as\n// required and to forbid additional ones, recursively.\nconst isStrictCompatible = (schema: unknown): boolean => {\n if (Array.isArray(schema)) return schema.every(isStrictCompatible);\n if (!isRecord(schema)) return true;\n const { properties } = schema;\n if (isRecord(properties)) {\n const required = Array.isArray(schema.required) ? schema.required : [];\n if (schema.additionalProperties !== false) return false;\n if (!Object.keys(properties).every((key) => required.includes(key)))\n return false;\n }\n const nested = [schema.items, schema.anyOf];\n for (const map of [properties, schema.$defs, schema.definitions])\n if (isRecord(map)) nested.push(...Object.values(map));\n\n return nested.every(isStrictCompatible);\n};\n\n// The Responses API treats a function tool as strict unless told otherwise,\n// and a strict model fills every optional property with a placeholder\n// (`query: \" \"`, `startLine: 0`) instead of omitting it.\nconst mapToolDefinition = (tool: AIProviderToolDefinition) => ({\n description: tool.description,\n name: tool.name,\n parameters: tool.input_schema,\n strict: isStrictCompatible(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\nexport const buildResponsesRequestBody = (\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 // Reasoning models reject sampling parameters with a 400.\n const samples = !isOpenAIReasoningModel(capabilityModel);\n if (samples && typeof params.temperature === \"number\")\n body.temperature = params.temperature;\n if (samples && 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 // Total input includes cache reads and writes; report disjoint categories.\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 written =\n inputDetails && typeof inputDetails.cache_write_tokens === \"number\"\n ? inputDetails.cache_write_tokens\n : 0;\n const normalized: AIUsage = {\n cacheReadInputTokens: cached,\n cacheWriteInputTokens: written || undefined,\n costCredits: typeof usage.cost === \"number\" ? usage.cost : undefined,\n inputTokens: Math.max(0, input - cached - written),\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 =\n 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\" ? annotation.title : 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 (usage)\n yield { type: \"usage_update\" as const, usage, metadata, final: true };\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 if (\n isRecord(parsed.item) &&\n parsed.item.type === \"function_call\" &&\n typeof parsed.item.name === \"string\"\n ) {\n const id =\n typeof parsed.item.call_id === \"string\"\n ? parsed.item.call_id\n : parsed.item.id;\n if (typeof id === \"string\")\n yield {\n type: \"tool_input_start\" as const,\n id,\n name: parsed.item.name,\n };\n }\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 if (isRecord(parsed.response)) {\n const usage = extractUsage(parsed.response);\n if (usage)\n yield {\n type: \"usage_update\" as const,\n usage,\n metadata: extractResponseMetadata(parsed.response),\n final: false,\n };\n }\n throw responseFailure(eventType, parsed, providerName);\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(\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 inputCapacity: openaiInputCapacity({\n baseUrl,\n fetch: fetchImpl,\n key: resolveKey,\n headers: resolveHeaders,\n modelLimits: config.modelLimits,\n body: (params) => {\n const built = buildResponsesRequestBody(\n params,\n imageModels.has(params.model),\n config.modelForCapabilities?.(params.model) ?? params.model,\n );\n return config.transformRequestBody\n ? config.transformRequestBody(built, params)\n : built;\n },\n }),\n stream: (params: AIProviderStreamParams) => {\n const isImageModel = imageModels.has(params.model);\n const builtBody = buildResponsesRequestBody(\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"
|
|
13
|
+
"import { openaiSchema, isStrictCompatible } from \"./openaiSchema\";\nimport type {\n AIProviderConfig,\n AIProviderContentBlock,\n AIProviderMessage,\n AIProviderStreamParams,\n AIProviderToolDefinition,\n AIUsage,\n AIResponseMetadata,\n} from \"../../../types/ai\";\nimport { openaiInputCapacity } from \"./openaiCapacity\";\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 modelLimits?: (\n params: AIProviderStreamParams,\n ) => Promise<import(\"../inputCapacity\").AIModelLimits>;\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 // The Responses API takes input_image.image_url as a plain string (a URL or\n // data URI), and a file's URL as file_url rather than file_data.\n if (block.type === \"image\") {\n return {\n detail: \"auto\",\n image_url:\n block.source.type === \"url\"\n ? block.source.url\n : `data:${block.source.media_type};base64,${block.source.data}`,\n type: \"input_image\",\n };\n }\n\n if (block.type === \"document\") {\n return block.source.type === \"url\"\n ? { file_url: block.source.url, type: \"input_file\" }\n : {\n file_data: `data:${block.source.media_type};base64,${block.source.data}`,\n filename: block.name ?? \"document.pdf\",\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 // Replay the call without its output item `id`. With the id, OpenAI\n // requires the reasoning item that produced it, which is not replayed,\n // so every reasoning-model conversation 400s after its first tool round.\n if (block.providerData)\n return Object.fromEntries(\n Object.entries(block.providerData).filter(([key]) => key !== \"id\"),\n );\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: block.images?.length\n ? [\n { text: block.content, type: \"input_text\" },\n ...block.images.map((source) =>\n mapBlockToResponsesFormat({ source, type: \"image\" }),\n ),\n ]\n : 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\n// The Responses API treats a function tool as strict unless told otherwise,\n// and a strict model fills every optional property with a placeholder\n// (`query: \" \"`, `startLine: 0`) instead of omitting it.\nconst mapToolDefinition = (tool: AIProviderToolDefinition) => ({\n description: tool.description,\n name: tool.name,\n parameters: openaiSchema(tool.input_schema),\n strict: isStrictCompatible(openaiSchema(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\nexport const buildResponsesRequestBody = (\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 // Reasoning models reject sampling parameters with a 400.\n const samples = !isOpenAIReasoningModel(capabilityModel);\n if (samples && typeof params.temperature === \"number\")\n body.temperature = params.temperature;\n if (samples && 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: openaiSchema(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 // Total input includes cache reads and writes; report disjoint categories.\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 written =\n inputDetails && typeof inputDetails.cache_write_tokens === \"number\"\n ? inputDetails.cache_write_tokens\n : 0;\n const normalized: AIUsage = {\n cacheReadInputTokens: cached,\n cacheWriteInputTokens: written || undefined,\n costCredits: typeof usage.cost === \"number\" ? usage.cost : undefined,\n inputTokens: Math.max(0, input - cached - written),\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 =\n 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\" ? annotation.title : 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 (usage)\n yield { type: \"usage_update\" as const, usage, metadata, final: true };\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 if (\n isRecord(parsed.item) &&\n parsed.item.type === \"function_call\" &&\n typeof parsed.item.name === \"string\"\n ) {\n const id =\n typeof parsed.item.call_id === \"string\"\n ? parsed.item.call_id\n : parsed.item.id;\n if (typeof id === \"string\")\n yield {\n type: \"tool_input_start\" as const,\n id,\n name: parsed.item.name,\n };\n }\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 if (isRecord(parsed.response)) {\n const usage = extractUsage(parsed.response);\n if (usage)\n yield {\n type: \"usage_update\" as const,\n usage,\n metadata: extractResponseMetadata(parsed.response),\n final: false,\n };\n }\n throw responseFailure(eventType, parsed, providerName);\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(\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 inputCapacity: openaiInputCapacity({\n baseUrl,\n fetch: fetchImpl,\n key: resolveKey,\n headers: resolveHeaders,\n modelLimits: config.modelLimits,\n body: (params) => {\n const built = buildResponsesRequestBody(\n params,\n imageModels.has(params.model),\n config.modelForCapabilities?.(params.model) ?? params.model,\n );\n return config.transformRequestBody\n ? config.transformRequestBody(built, params)\n : built;\n },\n }),\n stream: (params: AIProviderStreamParams) => {\n const isImageModel = imageModels.has(params.model);\n const builtBody = buildResponsesRequestBody(\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"
|
|
13
14
|
],
|
|
14
|
-
"mappings": "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",
|
|
15
|
-
"debugId": "
|
|
15
|
+
"mappings": "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",
|
|
16
|
+
"debugId": "A223C4EDE1186C2C64756E2164756E21",
|
|
16
17
|
"names": []
|
|
17
18
|
}
|