@x12i/ai-dispatcher 2.2.0 → 2.3.1
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/README.md +22 -11
- package/dist/index.cjs +36 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -5
- package/dist/index.d.ts +19 -5
- package/dist/index.js +35 -3
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/create-dispatcher.ts","../src/cache-usage.ts","../src/json-pointer.ts","../src/reasoning-extract.ts","../src/think-tags.ts","../src/apply-resolution.ts","../src/decorate-stream.ts","../src/types/providers.ts","../src/errors.ts","../src/mcp.ts","../src/prepare-request.ts","../src/cache-apply.ts","../src/cache-profiles.ts","../src/providers/cloudflare.ts","../src/providers/bedrock.ts","../src/providers/openai.ts","../src/providers/openrouter.ts","../src/resolve-provider.ts","../src/history.ts"],"sourcesContent":["export {\r\n decodeProviderMetadata,\r\n METADATA_NORMALIZATION_MAP,\r\n canonicalMetadataKey,\r\n normalizeMetadata\r\n} from \"@x12i/openrouter-runtime\";\r\nexport type { NormalizedMetadataKey } from \"@x12i/openrouter-runtime\";\r\nexport { createAiDispatcher, DEFAULT_METADATA_PRIORITY } from \"./create-dispatcher\";\r\nexport { AiDispatcherError, providerNotImplemented } from \"./errors\";\r\nexport { stripReasoningHistoryFields } from \"./history\";\r\nexport { resolveProvider } from \"./resolve-provider\";\r\nexport { IMPLEMENTED_AI_PROVIDERS, isImplementedAiProvider } from \"./types/providers\";\r\n\r\nexport type { AiProviderId, ImplementedAiProvider } from \"./types/providers\";\r\nexport type {\r\n AiDispatcher,\r\n AiDispatcherOptions,\r\n AiDispatcherRequest,\r\n AiDispatcherResponse,\r\n AiDispatcherUsage,\r\n AiProviderAdapter,\r\n CompiledAiRequest,\r\n CompiledCloudflareRequest,\r\n CompiledOpenAiRequest,\r\n DispatcherMcpOptions,\r\n DispatcherMcpServer,\r\n DispatcherMcpTool,\r\n CacheMode,\r\n CacheOutcome,\r\n CachePolicy,\r\n CacheResolution,\r\n CacheTtl,\r\n ReasoningEffort,\r\n ReasoningOutcome,\r\n ReasoningResolution\r\n} from \"./types/public\";\r\nexport type { OpenAiRuntimeOptions } from \"./types/openai\";\r\nexport type {\r\n CloudflareBackoff,\r\n CloudflareCallContext,\r\n CloudflareEndpoint,\r\n CloudflareEndpointChoice,\r\n CloudflareGatewayControls,\r\n CloudflareRequestOptions,\r\n CloudflareRunOptions,\r\n CloudflareRuntimeOptions,\r\n CloudflareWebhookFormat\r\n} from \"./types/cloudflare\";\r\n\r\nexport type {\r\n RuntimeRequest,\r\n RuntimeResponse,\r\n RuntimeStreamEvent,\r\n CompiledOpenRouterRequest,\r\n RuntimeLogger,\r\n OpenRouterRuntimeOptions,\r\n RuntimeMessage,\r\n RuntimeDefaults,\r\n RuntimeServerToolsPolicy\r\n} from \"@x12i/openrouter-runtime\";\r\n\r\nexport type {\r\n CompiledBedrockRequest,\r\n BedrockRuntimeOptions,\r\n BedrockCredentials,\r\n BedrockClientLike\r\n} from \"@x12i/bedrock-runtime\";\r\n","import type { BedrockRuntimeOptions } from \"@x12i/bedrock-runtime\";\r\nimport type { OpenRouterRuntimeOptions, RuntimeStreamEvent, RuntimeToolExecutor } from \"@x12i/openrouter-runtime\";\r\nimport { createMetadataPacker } from \"@x12i/provider-metadata\";\r\nimport { applyResolution } from \"./apply-resolution\";\r\nimport { decorateStream } from \"./decorate-stream\";\r\nimport { AiDispatcherError } from \"./errors\";\r\nimport { applyMcpCatalog, createMcpCatalog, refreshMcpCatalog } from \"./mcp\";\r\nimport { prepareDispatchRequest } from \"./prepare-request\";\r\nimport { createBedrockProviderAdapter } from \"./providers/bedrock\";\r\nimport { createCloudflareProviderAdapter } from \"./providers/cloudflare\";\r\nimport { createOpenAiProviderAdapter } from \"./providers/openai\";\r\nimport { createOpenRouterProviderAdapter } from \"./providers/openrouter\";\r\nimport { resolveProvider } from \"./resolve-provider\";\r\nimport type { ImplementedAiProvider } from \"./types/providers\";\r\nimport type {\r\n AiDispatcher,\r\n AiDispatcherOptions,\r\n AiDispatcherRequest,\r\n AiProviderAdapter,\r\n CompiledAiRequest,\r\n ProviderCallOptions\r\n} from \"./types/public\";\r\nimport type { CloudflareRuntimeOptions } from \"./types/cloudflare\";\r\nimport type { OpenAiRuntimeOptions } from \"./types/openai\";\r\n\r\nconst SECRET_HEADERS = new Set([\"authorization\", \"x-api-key\", \"api-key\"]);\r\n\r\n/** Identity keys stay when a record has to be trimmed. Earlier entries are kept ahead of later ones. */\r\nexport const DEFAULT_METADATA_PRIORITY = [\"agentId\", \"orgId\", \"stepId\", \"skillId\", \"recordId\", \"objectType\"] as const;\r\n\r\nexport function createAiDispatcher(options: AiDispatcherOptions = {}): AiDispatcher {\r\n const packer = createMetadataPacker({ priority: options.metadataPriority ?? DEFAULT_METADATA_PRIORITY });\r\n const defaultProvider = resolveProvider(options.provider, \"openrouter\");\r\n const catalog = createMcpCatalog(options.mcp);\r\n let refreshChain: Promise<void> = Promise.resolve();\r\n\r\n const adapters = new Map<ImplementedAiProvider, AiProviderAdapter>();\r\n\r\n function createAdapter(provider: ImplementedAiProvider): AiProviderAdapter {\r\n if (provider === \"openrouter\") {\r\n const openrouterOptions: OpenRouterRuntimeOptions = {\r\n ...options.openrouter,\r\n metadataPacker: packer,\r\n ...(options.logger && !options.openrouter?.logger ? { logger: options.logger } : {})\r\n };\r\n return createOpenRouterProviderAdapter(openrouterOptions);\r\n }\r\n if (provider === \"bedrock\") {\r\n const bedrockOptions: BedrockRuntimeOptions = {\r\n ...options.bedrock,\r\n metadataPacker: packer,\r\n ...(options.logger && !options.bedrock?.logger ? { logger: options.logger } : {})\r\n };\r\n return createBedrockProviderAdapter(bedrockOptions);\r\n }\r\n if (provider === \"openai\") {\r\n const openaiOptions: OpenAiRuntimeOptions = {\r\n ...options.openai,\r\n ...(options.logger && !options.openai?.logger ? { logger: options.logger } : {})\r\n };\r\n return createOpenAiProviderAdapter(openaiOptions, packer);\r\n }\r\n if (provider === \"cloudflare\") {\r\n const cloudflareOptions: CloudflareRuntimeOptions = {\r\n ...options.cloudflare,\r\n ...(options.logger && !options.cloudflare?.logger ? { logger: options.logger } : {})\r\n };\r\n return createCloudflareProviderAdapter(cloudflareOptions, packer);\r\n }\r\n throw new AiDispatcherError(\r\n \"PROVIDER_ADAPTER_MISSING\",\r\n `No adapter registered for provider \"${provider}\".`\r\n );\r\n }\r\n\r\n function getAdapter(provider: ImplementedAiProvider): AiProviderAdapter {\r\n let adapter = adapters.get(provider);\r\n if (!adapter) {\r\n adapter = createAdapter(provider);\r\n adapters.set(provider, adapter);\r\n }\r\n return adapter;\r\n }\r\n\r\n getAdapter(defaultProvider);\r\n\r\n return {\r\n provider: defaultProvider,\r\n\r\n async run(request: AiDispatcherRequest) {\r\n const prepared = prepare(request, true);\r\n log(options, \"ai-dispatcher.request.started\", prepared, \"run\", false);\r\n const response = await getAdapter(prepared.provider).run(prepared.request, callOf(prepared.call));\r\n return applyResolution(response, prepared);\r\n },\r\n\r\n executeStreamingChat(request: AiDispatcherRequest) {\r\n const prepared = prepare(request, false);\r\n log(options, \"ai-dispatcher.request.started\", prepared, \"executeStreamingChat\", true);\r\n return decorateStream(\r\n prepared,\r\n getAdapter(prepared.provider).executeStreamingChat(prepared.request, callOf(prepared.call))\r\n );\r\n },\r\n\r\n compile(request: AiDispatcherRequest): CompiledAiRequest {\r\n const prepared = prepare(request, true);\r\n log(options, \"ai-dispatcher.request.compiled\", prepared, \"compile\", false);\r\n const compiled = getAdapter(prepared.provider).compile(prepared.request, callOf(prepared.call));\r\n return attachCompileMeta(prepared, compiled);\r\n },\r\n\r\n refreshMcp() {\r\n const pending = refreshChain.then(() => refreshMcpCatalog(catalog));\r\n refreshChain = pending.then(\r\n () => undefined,\r\n () => undefined\r\n );\r\n return pending;\r\n }\r\n };\r\n\r\n function prepare(request: AiDispatcherRequest, includeMcp: boolean) {\r\n const provider = resolveProvider(request.provider, defaultProvider);\r\n const prepared = prepareDispatchRequest({ request, provider, options });\r\n const tools = providerTools(provider, options);\r\n applyMcpCatalog({\r\n request: prepared.request as AiDispatcherRequest,\r\n catalog,\r\n ...(tools ? { providerTools: tools } : {}),\r\n includeMcp\r\n });\r\n return prepared;\r\n }\r\n}\r\n\r\nfunction providerTools(\r\n provider: ImplementedAiProvider,\r\n options: AiDispatcherOptions\r\n): Record<string, RuntimeToolExecutor | undefined> | undefined {\r\n if (provider === \"openrouter\") return options.openrouter?.tools;\r\n if (provider === \"bedrock\") return options.bedrock?.tools;\r\n if (provider === \"cloudflare\") return options.cloudflare?.tools;\r\n return options.openai?.tools;\r\n}\r\n\r\nfunction callOf(call: ProviderCallOptions): ProviderCallOptions | undefined {\r\n if (!call.finalizeBody && !call.extractStreamReasoning && !call.suppressNestedReasoningFallback && !call.cloudflare) {\r\n return undefined;\r\n }\r\n return call;\r\n}\r\n\r\nfunction attachCompileMeta(\r\n prepared: ReturnType<typeof prepareDispatchRequest>,\r\n compiled: object\r\n): CompiledAiRequest {\r\n const record = compiled as Record<string, unknown>;\r\n const headers = isRecord(record.headers) ? redactHeaders(record.headers as Record<string, string>) : undefined;\r\n return {\r\n ...record,\r\n ...(headers ? { headers } : {}),\r\n provider: prepared.provider,\r\n requestedModel: prepared.requestedModel,\r\n effectiveModel: prepared.effectiveModel,\r\n ...(prepared.resolution ? { reasoningResolution: prepared.resolution } : {}),\r\n ...(prepared.cacheResolution ? { cacheResolution: prepared.cacheResolution } : {}),\r\n ...(prepared.cacheWarnings?.length\r\n ? { warnings: [...(Array.isArray(record.warnings) ? record.warnings : []), ...prepared.cacheWarnings] }\r\n : {})\r\n } as CompiledAiRequest;\r\n}\r\n\r\nfunction redactHeaders(headers: Record<string, string>): Record<string, string> {\r\n const redacted: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(headers)) {\r\n redacted[key] = SECRET_HEADERS.has(key.toLowerCase()) ? \"[redacted]\" : value;\r\n }\r\n return redacted;\r\n}\r\n\r\nfunction log(\r\n options: AiDispatcherOptions,\r\n event: string,\r\n prepared: ReturnType<typeof prepareDispatchRequest>,\r\n entrypoint: string,\r\n streaming: boolean\r\n): void {\r\n const payload: Record<string, unknown> = {\r\n provider: prepared.provider,\r\n entrypoint,\r\n streaming,\r\n requestedModel: prepared.requestedModel,\r\n effectiveModel: prepared.effectiveModel\r\n };\r\n if (prepared.request.id) payload.requestId = prepared.request.id;\r\n if (prepared.resolution?.outcome) payload.outcome = prepared.resolution.outcome;\r\n if (prepared.resolution) payload.bypassed = prepared.resolution.bypassed;\r\n if (prepared.cacheResolution) payload.cacheOutcome = prepared.cacheResolution.outcome;\r\n if (event.endsWith(\"compiled\")) options.logger?.debug?.(event, payload);\r\n else options.logger?.info?.(event, payload);\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nexport type { RuntimeStreamEvent };\r\n","export interface CacheTokenCounts {\r\n cachedTokens?: number;\r\n cacheWriteTokens?: number;\r\n}\r\n\r\n/** Reads provider usage objects without requiring a cache marker on the request. */\r\nexport function readCacheTokens(source: unknown): CacheTokenCounts {\r\n const cached: number[] = [];\r\n const written: number[] = [];\r\n for (const usage of usageRecords(source)) {\r\n const promptDetails = record(usage.prompt_tokens_details);\r\n const inputDetails = record(usage.input_tokens_details);\r\n pushNumber(cached, promptDetails?.cached_tokens);\r\n pushNumber(cached, inputDetails?.cached_tokens);\r\n pushNumber(cached, usage.cacheReadInputTokens);\r\n pushNumber(cached, usage.cache_read_input_tokens);\r\n pushNumber(cached, usage.cached_tokens);\r\n pushNumber(written, promptDetails?.cache_write_tokens);\r\n pushNumber(written, inputDetails?.cache_write_tokens);\r\n pushNumber(written, usage.cacheWriteInputTokens);\r\n pushNumber(written, usage.cache_write_input_tokens);\r\n pushNumber(written, usage.cache_write_tokens);\r\n }\r\n const cachedTokens = cached[0];\r\n const cacheWriteTokens = written[0];\r\n return {\r\n ...(cachedTokens !== undefined ? { cachedTokens } : {}),\r\n ...(cacheWriteTokens !== undefined ? { cacheWriteTokens } : {})\r\n };\r\n}\r\n\r\nfunction usageRecords(source: unknown): Record<string, unknown>[] {\r\n const root = record(source);\r\n if (!root) return [];\r\n const records: Record<string, unknown>[] = [];\r\n const usage = record(root.usage);\r\n if (usage) records.push(usage);\r\n const raw = record(root.raw);\r\n if (raw) {\r\n const rawUsage = record(raw.usage);\r\n records.push(rawUsage ?? raw);\r\n }\r\n records.push(root);\r\n return records;\r\n}\r\n\r\nfunction pushNumber(target: number[], value: unknown): void {\r\n if (typeof value === \"number\" && Number.isFinite(value)) target.push(value);\r\n}\r\n\r\nfunction record(value: unknown): Record<string, unknown> | undefined {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\r\n}\r\n","const UNSAFE_KEYS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction unescapeToken(token: string): string {\r\n return token.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\r\n}\r\n\r\nfunction tokensFor(pointer: string): string[] | undefined {\r\n if (pointer === \"\") return [];\r\n if (!pointer.startsWith(\"/\")) return undefined;\r\n const tokens = pointer.split(\"/\").slice(1).map(unescapeToken);\r\n if (tokens.some((token) => UNSAFE_KEYS.has(token))) return undefined;\r\n return tokens;\r\n}\r\n\r\nfunction walk(current: unknown, tokens: readonly string[]): unknown[] {\r\n if (tokens.length === 0) return [current];\r\n const [head, ...rest] = tokens;\r\n if (head === undefined) return [];\r\n if (head === \"*\") {\r\n if (!Array.isArray(current)) return [];\r\n return current.flatMap((item) => walk(item, rest));\r\n }\r\n if (Array.isArray(current)) {\r\n if (!/^\\d+$/.test(head)) return [];\r\n const index = Number(head);\r\n if (index >= current.length) return [];\r\n return walk(current[index], rest);\r\n }\r\n if (!isRecord(current) || !Object.prototype.hasOwnProperty.call(current, head)) return [];\r\n return walk(current[head], rest);\r\n}\r\n\r\n/** Values selected by one JSON pointer. `*` visits every array element. */\r\nexport function valuesAtPointer(root: unknown, pointer: string): unknown[] {\r\n const tokens = tokensFor(pointer);\r\n if (!tokens) return [];\r\n return walk(root, tokens);\r\n}\r\n\r\n/**\r\n * Ordered alternatives. The first pointer that yields one or more strings wins.\r\n * Those strings are concatenated in match order.\r\n */\r\nexport function firstConcatenatedText(root: unknown, paths: readonly string[]): string | undefined {\r\n for (const path of paths) {\r\n const strings = valuesAtPointer(root, path).filter((value): value is string => typeof value === \"string\" && value.length > 0);\r\n if (strings.length > 0) return strings.join(\"\");\r\n }\r\n return undefined;\r\n}\r\n\r\n/** Ordered alternatives. The first finite number wins. */\r\nexport function firstNumber(root: unknown, paths: readonly string[]): number | undefined {\r\n for (const path of paths) {\r\n for (const value of valuesAtPointer(root, path)) {\r\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction collectParents(current: unknown, tokens: readonly string[]): unknown[] {\r\n if (tokens.length === 0) return [current];\r\n const [head, ...rest] = tokens;\r\n if (head === undefined) return [];\r\n if (head === \"*\") {\r\n if (!Array.isArray(current)) return [];\r\n return current.flatMap((item) => collectParents(item, rest));\r\n }\r\n if (Array.isArray(current)) {\r\n if (!/^\\d+$/.test(head)) return [];\r\n const index = Number(head);\r\n if (index >= current.length) return [];\r\n return collectParents(current[index], rest);\r\n }\r\n if (!isRecord(current) || !Object.prototype.hasOwnProperty.call(current, head)) return [];\r\n return collectParents(current[head], rest);\r\n}\r\n\r\n/** Delete one pointer from a clone. Missing paths and unsafe keys are ignored. */\r\nexport function deletePointer(root: unknown, pointer: string): void {\r\n const tokens = tokensFor(pointer);\r\n if (!tokens || tokens.length === 0) return;\r\n const last = tokens[tokens.length - 1];\r\n if (last === undefined || last === \"*\") return;\r\n const parents = collectParents(root, tokens.slice(0, -1));\r\n for (const parent of parents) {\r\n if (Array.isArray(parent)) {\r\n if (!/^\\d+$/.test(last)) continue;\r\n const index = Number(last);\r\n if (index < parent.length) parent.splice(index, 1);\r\n continue;\r\n }\r\n if (isRecord(parent) && Object.prototype.hasOwnProperty.call(parent, last)) {\r\n delete parent[last];\r\n }\r\n }\r\n}\r\n","import type { ReasoningResponseMetadata } from \"@x12i/ai-profiles\";\r\nimport { firstConcatenatedText, firstNumber } from \"./json-pointer\";\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction textFromValue(value: unknown): string {\r\n if (typeof value === \"string\") return value;\r\n if (Array.isArray(value)) return value.map(textFromValue).join(\"\");\r\n if (!isRecord(value)) return \"\";\r\n if (typeof value.text === \"string\") return value.text;\r\n if (typeof value.summary === \"string\") return value.summary;\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Stream keys and stream paths are ordered alternatives.\r\n * The first one that yields text wins. Fragments inside that one value are concatenated.\r\n */\r\nexport function extractStreamReasoningText(event: unknown, response: ReasoningResponseMetadata): string | undefined {\r\n if (response.streamReasoningKeys.length > 0) {\r\n if (!isRecord(event)) return undefined;\r\n for (const key of response.streamReasoningKeys) {\r\n const text = textFromValue(event[key]);\r\n if (text) return text;\r\n }\r\n return undefined;\r\n }\r\n return firstConcatenatedText(event, response.streamReasoningPaths);\r\n}\r\n\r\n/**\r\n * Read the first reasoning-token path. A `/usage/...` path is also tried against a bare usage object.\r\n */\r\nexport function readReasoningTokens(root: unknown, paths: readonly string[]): number | undefined {\r\n for (const path of paths) {\r\n const absolute = firstNumber(root, [path]);\r\n if (absolute !== undefined) return absolute;\r\n if (path.startsWith(\"/usage/\")) {\r\n const relative = firstNumber(root, [path.slice(\"/usage\".length)]);\r\n if (relative !== undefined) return relative;\r\n }\r\n }\r\n return undefined;\r\n}\r\n","const OPEN = \"<think>\";\r\nconst CLOSE = \"</think>\";\r\n\r\nfunction holdSuffix(buffer: string, tag: string): number {\r\n const max = Math.min(buffer.length, tag.length - 1);\r\n for (let size = max; size > 0; size -= 1) {\r\n if (tag.startsWith(buffer.slice(buffer.length - size))) return size;\r\n }\r\n return 0;\r\n}\r\n\r\n/**\r\n * Separates `<think>...</think>` from answer text.\r\n * Tags may arrive split across chunks. An unclosed section is not released as answer text.\r\n */\r\nexport class ThinkTagSplitter {\r\n private pending = \"\";\r\n private inThink = false;\r\n answer = \"\";\r\n reasoning = \"\";\r\n\r\n push(chunk: string): { answerDelta: string; reasoningDelta: string } {\r\n this.pending += chunk;\r\n let answerDelta = \"\";\r\n let reasoningDelta = \"\";\r\n while (this.pending.length > 0) {\r\n if (!this.inThink) {\r\n const openAt = this.pending.indexOf(OPEN);\r\n if (openAt >= 0) {\r\n answerDelta += this.pending.slice(0, openAt);\r\n this.pending = this.pending.slice(openAt + OPEN.length);\r\n this.inThink = true;\r\n continue;\r\n }\r\n const hold = holdSuffix(this.pending, OPEN);\r\n answerDelta += this.pending.slice(0, this.pending.length - hold);\r\n this.pending = this.pending.slice(this.pending.length - hold);\r\n break;\r\n }\r\n const closeAt = this.pending.indexOf(CLOSE);\r\n if (closeAt >= 0) {\r\n reasoningDelta += this.pending.slice(0, closeAt);\r\n this.pending = this.pending.slice(closeAt + CLOSE.length);\r\n this.inThink = false;\r\n continue;\r\n }\r\n const hold = holdSuffix(this.pending, CLOSE);\r\n reasoningDelta += this.pending.slice(0, this.pending.length - hold);\r\n this.pending = this.pending.slice(this.pending.length - hold);\r\n break;\r\n }\r\n this.answer += answerDelta;\r\n this.reasoning += reasoningDelta;\r\n return { answerDelta, reasoningDelta };\r\n }\r\n\r\n finish(): { answerDelta: string; reasoningDelta: string } {\r\n if (this.inThink) {\r\n const reasoningDelta = this.pending;\r\n this.pending = \"\";\r\n this.reasoning += reasoningDelta;\r\n return { answerDelta: \"\", reasoningDelta };\r\n }\r\n const answerDelta = this.pending;\r\n this.pending = \"\";\r\n this.answer += answerDelta;\r\n return { answerDelta, reasoningDelta: \"\" };\r\n }\r\n}\r\n\r\nexport function splitThinkTags(text: string): { answer: string; reasoning: string } {\r\n const splitter = new ThinkTagSplitter();\r\n splitter.push(text);\r\n splitter.finish();\r\n return { answer: splitter.answer, reasoning: splitter.reasoning };\r\n}\r\n","import type { ReasoningDirective } from \"@x12i/ai-profiles\";\r\nimport type { RuntimeResponse, RuntimeUsage } from \"@x12i/openrouter-runtime\";\r\nimport { readCacheTokens } from \"./cache-usage\";\r\nimport { firstConcatenatedText } from \"./json-pointer\";\r\nimport type { PreparedDispatch } from \"./prepare-request\";\r\nimport { readReasoningTokens } from \"./reasoning-extract\";\r\nimport { splitThinkTags } from \"./think-tags\";\r\nimport type { AiDispatcherResponse } from \"./types/public\";\r\n\r\nexport function applyResolution(response: RuntimeResponse, prepared: PreparedDispatch): AiDispatcherResponse {\r\n const result = response as AiDispatcherResponse;\r\n if (prepared.resolution) result.reasoningResolution = prepared.resolution;\r\n if (prepared.cacheResolution) result.cacheResolution = prepared.cacheResolution;\r\n if (prepared.cacheWarnings?.length) {\r\n result.warnings = [...result.warnings, ...prepared.cacheWarnings];\r\n }\r\n applyCacheUsage(result);\r\n const directive = prepared.directive;\r\n if (!directive) return result;\r\n\r\n const raw = response.raw?.response;\r\n const pathText = firstConcatenatedText(raw, directive.response.reasoningTextPaths);\r\n let tagText: string | undefined;\r\n if (directive.response.stripThinkTags) {\r\n const split = splitThinkTags(result.text);\r\n result.text = split.answer;\r\n if (split.reasoning) tagText = split.reasoning;\r\n }\r\n const reasoningText = pathText ?? tagText;\r\n if (reasoningText) result.reasoningText = reasoningText;\r\n applyUsage(result, raw, directive);\r\n return result;\r\n}\r\n\r\nfunction applyCacheUsage(response: AiDispatcherResponse): void {\r\n const fromResponse = readCacheTokens(response.raw?.response);\r\n const fromUsage = readCacheTokens(response.usage?.raw);\r\n const cachedTokens = fromResponse.cachedTokens ?? fromUsage.cachedTokens;\r\n const cacheWriteTokens = fromResponse.cacheWriteTokens ?? fromUsage.cacheWriteTokens;\r\n if (cachedTokens === undefined && cacheWriteTokens === undefined) return;\r\n response.usage = {\r\n ...(response.usage ?? {}),\r\n ...(cachedTokens !== undefined ? { cachedTokens } : {}),\r\n ...(cacheWriteTokens !== undefined ? { cacheWriteTokens } : {})\r\n };\r\n}\r\n\r\nfunction applyUsage(response: AiDispatcherResponse, raw: unknown, directive: ReasoningDirective): void {\r\n const paths = directive.usage?.reasoningTokenPaths;\r\n if (!paths || paths.length === 0) return;\r\n const tokens = readReasoningTokens(raw, paths);\r\n if (tokens === undefined) {\r\n if (!response.usage || response.usage.reasoningTokens === undefined) return;\r\n const usage: RuntimeUsage = { ...response.usage };\r\n delete usage.reasoningTokens;\r\n response.usage = usage;\r\n return;\r\n }\r\n response.usage = { ...(response.usage ?? {}), reasoningTokens: tokens };\r\n}\r\n","import type { RuntimeStreamEvent, RuntimeUsage } from \"@x12i/openrouter-runtime\";\r\nimport { readCacheTokens } from \"./cache-usage\";\r\nimport type { PreparedDispatch } from \"./prepare-request\";\r\nimport { readReasoningTokens } from \"./reasoning-extract\";\r\nimport { ThinkTagSplitter } from \"./think-tags\";\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nexport async function* decorateStream(\r\n prepared: PreparedDispatch,\r\n source: AsyncIterable<RuntimeStreamEvent>\r\n): AsyncGenerator<RuntimeStreamEvent> {\r\n const splitter = prepared.directive?.response.stripThinkTags ? new ThinkTagSplitter() : undefined;\r\n let reasoningText = \"\";\r\n\r\n for await (const event of source) {\r\n if (event.type === \"stream.start\") {\r\n yield withResolution(event, prepared);\r\n for (const warning of prepared.cacheWarnings ?? []) {\r\n yield { type: \"stream.warning\", requestId: event.requestId, data: { warning } };\r\n }\r\n continue;\r\n }\r\n\r\n if (event.type === \"stream.reasoning.delta\") {\r\n const text = textOf(event);\r\n if (text) reasoningText += text;\r\n yield event;\r\n continue;\r\n }\r\n\r\n if (event.type === \"stream.text.delta\" && splitter) {\r\n const pushed = splitter.push(textOf(event));\r\n if (pushed.reasoningDelta) {\r\n reasoningText += pushed.reasoningDelta;\r\n yield {\r\n type: \"stream.reasoning.delta\",\r\n requestId: event.requestId,\r\n data: { text: pushed.reasoningDelta }\r\n };\r\n }\r\n if (pushed.answerDelta) {\r\n yield { ...event, data: { text: pushed.answerDelta } };\r\n }\r\n continue;\r\n }\r\n\r\n if (event.type === \"stream.usage\") {\r\n yield adjustUsageEvent(event, prepared);\r\n continue;\r\n }\r\n\r\n if (event.type === \"stream.done\") {\r\n if (splitter) {\r\n const finished = splitter.finish();\r\n if (finished.reasoningDelta) {\r\n reasoningText += finished.reasoningDelta;\r\n yield {\r\n type: \"stream.reasoning.delta\",\r\n requestId: event.requestId,\r\n data: { text: finished.reasoningDelta }\r\n };\r\n }\r\n if (finished.answerDelta) {\r\n yield {\r\n type: \"stream.text.delta\",\r\n requestId: event.requestId,\r\n data: { text: finished.answerDelta }\r\n };\r\n }\r\n }\r\n const data = isRecord(event.data) ? { ...event.data } : {};\r\n if (splitter) data.text = splitter.answer;\r\n if (reasoningText) data.reasoningText = reasoningText;\r\n if (prepared.resolution) data.reasoningResolution = prepared.resolution;\r\n if (prepared.cacheResolution) data.cacheResolution = prepared.cacheResolution;\r\n yield { ...event, data };\r\n continue;\r\n }\r\n\r\n yield event;\r\n }\r\n}\r\n\r\nfunction withResolution(event: RuntimeStreamEvent, prepared: PreparedDispatch): RuntimeStreamEvent {\r\n if (!prepared.resolution && !prepared.cacheResolution) return event;\r\n const data = isRecord(event.data) ? { ...event.data } : {};\r\n if (prepared.resolution) data.reasoningResolution = prepared.resolution;\r\n if (prepared.cacheResolution) data.cacheResolution = prepared.cacheResolution;\r\n return { ...event, data };\r\n}\r\n\r\nfunction textOf(event: RuntimeStreamEvent): string {\r\n if (!isRecord(event.data) || typeof event.data.text !== \"string\") return \"\";\r\n return event.data.text;\r\n}\r\n\r\nfunction adjustUsageEvent(event: RuntimeStreamEvent, prepared: PreparedDispatch): RuntimeStreamEvent {\r\n if (!isRecord(event.data) || !isRecord(event.data.usage)) return event;\r\n const paths = prepared.directive?.usage?.reasoningTokenPaths;\r\n const usage = { ...(event.data.usage as RuntimeUsage) };\r\n let changed = false;\r\n if (paths && paths.length > 0) {\r\n const tokens = readReasoningTokens(usage.raw, paths);\r\n if (tokens === undefined) {\r\n if (usage.reasoningTokens !== undefined) {\r\n delete usage.reasoningTokens;\r\n changed = true;\r\n }\r\n } else if (usage.reasoningTokens !== tokens) {\r\n usage.reasoningTokens = tokens;\r\n changed = true;\r\n }\r\n }\r\n const counts = readCacheTokens(usage.raw);\r\n if (counts.cachedTokens !== undefined) {\r\n (usage as RuntimeUsage & { cachedTokens?: number }).cachedTokens = counts.cachedTokens;\r\n changed = true;\r\n }\r\n if (counts.cacheWriteTokens !== undefined) {\r\n (usage as RuntimeUsage & { cacheWriteTokens?: number }).cacheWriteTokens = counts.cacheWriteTokens;\r\n changed = true;\r\n }\r\n if (!changed) return event;\r\n return { ...event, data: { ...event.data, usage } };\r\n}\r\n","export type AiProviderId =\r\n | \"openrouter\"\r\n | \"openai\"\r\n | \"anthropic\"\r\n | \"google\"\r\n | \"azure\"\r\n | \"bedrock\"\r\n | \"groq\"\r\n | \"mistral\"\r\n | \"cohere\"\r\n | \"together\"\r\n | \"fireworks\"\r\n | \"xai\"\r\n | \"deepseek\"\r\n | \"cloudflare\"\r\n | \"custom\";\r\n\r\nexport const IMPLEMENTED_AI_PROVIDERS = [\"openrouter\", \"bedrock\", \"openai\", \"cloudflare\"] as const satisfies readonly AiProviderId[];\r\n\r\nexport type ImplementedAiProvider = (typeof IMPLEMENTED_AI_PROVIDERS)[number];\r\n\r\nexport function isImplementedAiProvider(provider: string): provider is ImplementedAiProvider {\r\n return (IMPLEMENTED_AI_PROVIDERS as readonly string[]).includes(provider);\r\n}\r\n","import { IMPLEMENTED_AI_PROVIDERS } from \"./types/providers\";\r\n\r\nexport class AiDispatcherError extends Error {\r\n constructor(\r\n public readonly code: string,\r\n message: string,\r\n public readonly details?: unknown\r\n ) {\r\n super(message);\r\n this.name = \"AiDispatcherError\";\r\n }\r\n}\r\n\r\nexport function providerNotImplemented(provider: string): AiDispatcherError {\r\n const implemented = [...IMPLEMENTED_AI_PROVIDERS];\r\n return new AiDispatcherError(\r\n \"PROVIDER_NOT_IMPLEMENTED\",\r\n `AI provider \"${provider}\" is not implemented yet. Supported by @x12i/ai-dispatcher: ${implemented\r\n .map((id) => `\"${id}\"`)\r\n .join(\", \")}.`,\r\n {\r\n provider,\r\n implementedProviders: implemented,\r\n operatorHint: `Pass provider: \"${implemented[0]}\" (or omit provider to use the default).`\r\n }\r\n );\r\n}\r\n","import type { RuntimeToolExecutor } from \"@x12i/openrouter-runtime\";\r\nimport { AiDispatcherError } from \"./errors\";\r\nimport type {\r\n AiDispatcherRequest,\r\n DispatcherMcpOptions,\r\n DispatcherMcpServer,\r\n DispatcherMcpTool\r\n} from \"./types/public\";\r\n\r\nconst TOOL_TOKEN = /^[A-Za-z0-9_-]+$/;\r\nconst MAX_EXPOSED_NAME_LENGTH = 64;\r\nconst DEFAULT_PARAMETERS: Record<string, unknown> = { type: \"object\", properties: {} };\r\n\r\nexport interface IndexedMcpTool {\r\n exposedName: string;\r\n rawName: string;\r\n description: string;\r\n parameters: Record<string, unknown>;\r\n server: DispatcherMcpServer;\r\n}\r\n\r\nexport interface McpCatalog {\r\n servers: DispatcherMcpServer[];\r\n tools: IndexedMcpTool[];\r\n}\r\n\r\nexport function createMcpCatalog(mcp: DispatcherMcpOptions | undefined): McpCatalog {\r\n if (mcp === undefined) return { servers: [], tools: [] };\r\n if (!Array.isArray(mcp.servers)) {\r\n throw new AiDispatcherError(\"MCP_SERVER_INVALID\", \"mcp.servers must be an array.\");\r\n }\r\n return {\r\n servers: mcp.servers,\r\n tools: indexMcpServers(mcp.servers)\r\n };\r\n}\r\n\r\nexport function indexMcpServers(servers: DispatcherMcpServer[]): IndexedMcpTool[] {\r\n const seenServers = new Set<string>();\r\n const seenTools = new Set<string>();\r\n const indexed: IndexedMcpTool[] = [];\r\n\r\n for (const server of servers) {\r\n assertServer(server, seenServers);\r\n for (const tool of server.tools) {\r\n if (!isRecord(tool)) {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NAME_INVALID\",\r\n `MCP server \"${server.id}\" has a tool that is not an object.`\r\n );\r\n }\r\n const exposedName = exposedToolName(server.id, tool);\r\n if (seenTools.has(exposedName)) {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NAME_CONFLICT\",\r\n `MCP tool \"${exposedName}\" is defined more than once.`\r\n );\r\n }\r\n seenTools.add(exposedName);\r\n indexed.push({\r\n exposedName,\r\n rawName: tool.name,\r\n description: toolDescription(tool),\r\n parameters: toolParameters(tool),\r\n server\r\n });\r\n }\r\n }\r\n\r\n return indexed;\r\n}\r\n\r\nexport async function refreshMcpCatalog(catalog: McpCatalog): Promise<void> {\r\n const listed = new Map<string, DispatcherMcpTool[]>();\r\n for (const server of catalog.servers) {\r\n if (!server.listTools) continue;\r\n let tools: DispatcherMcpTool[];\r\n try {\r\n tools = await server.listTools();\r\n } catch (error) {\r\n throw listFailed(server.id, error);\r\n }\r\n if (!Array.isArray(tools)) {\r\n throw new AiDispatcherError(\r\n \"MCP_LIST_FAILED\",\r\n `MCP server \"${server.id}\" listTools did not return an array.`\r\n );\r\n }\r\n listed.set(server.id, tools);\r\n }\r\n\r\n const draft = catalog.servers.map((server) => {\r\n const tools = listed.get(server.id);\r\n return tools ? { ...server, tools } : server;\r\n });\r\n try {\r\n indexMcpServers(draft);\r\n } catch (error) {\r\n throw new AiDispatcherError(\r\n \"MCP_LIST_FAILED\",\r\n error instanceof Error ? error.message : \"MCP tool list is invalid.\"\r\n );\r\n }\r\n\r\n for (const server of catalog.servers) {\r\n const tools = listed.get(server.id);\r\n if (tools) server.tools = tools;\r\n }\r\n catalog.tools = indexMcpServers(catalog.servers);\r\n}\r\n\r\nexport function applyMcpCatalog(params: {\r\n request: AiDispatcherRequest;\r\n catalog: McpCatalog;\r\n providerTools?: Record<string, RuntimeToolExecutor | undefined>;\r\n includeMcp: boolean;\r\n}): void {\r\n const filter = params.request.mcp;\r\n delete params.request.mcp;\r\n if (!params.includeMcp || filter === false || (Array.isArray(filter) && filter.length === 0)) return;\r\n\r\n const allowed = resolveAllowlist(filter, params.catalog.tools);\r\n const requestTools = params.request.functionTools ?? [];\r\n const requestNames = new Set(requestTools.map((tool) => tool.name));\r\n const injected = [];\r\n\r\n for (const entry of params.catalog.tools) {\r\n if (allowed && !allowed.has(entry.exposedName)) continue;\r\n if (requestNames.has(entry.exposedName)) continue;\r\n const clientExecutor = params.providerTools?.[entry.exposedName];\r\n injected.push({\r\n name: entry.exposedName,\r\n description: entry.description,\r\n parameters: entry.parameters,\r\n ...(typeof clientExecutor === \"function\"\r\n ? {}\r\n : { executor: createMcpExecutor(entry.server, entry.rawName) })\r\n });\r\n }\r\n\r\n if (injected.length) {\r\n params.request.functionTools = [...injected, ...requestTools];\r\n }\r\n}\r\n\r\nfunction createMcpExecutor(server: DispatcherMcpServer, rawName: string): RuntimeToolExecutor {\r\n return async (args, context) => {\r\n const result = await server.callTool(rawName, toArgs(args), context);\r\n return flattenMcpResult(result);\r\n };\r\n}\r\n\r\nexport function flattenMcpResult(result: unknown): string {\r\n if (typeof result === \"string\") return result;\r\n if (!isRecord(result)) return stringify(result);\r\n const text = textContent(result.content);\r\n if (result.isError === true) {\r\n throw new Error(text ?? stringify(result));\r\n }\r\n if (text !== undefined) return text;\r\n return stringify(result);\r\n}\r\n\r\nfunction resolveAllowlist(\r\n filter: AiDispatcherRequest[\"mcp\"],\r\n tools: IndexedMcpTool[]\r\n): Set<string> | undefined {\r\n if (filter === undefined) return undefined;\r\n if (!Array.isArray(filter) || filter.some((name) => typeof name !== \"string\")) {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NOT_FOUND\",\r\n \"request.mcp must be false or a list of exposed tool names.\"\r\n );\r\n }\r\n const known = new Set(tools.map((tool) => tool.exposedName));\r\n for (const name of filter) {\r\n if (!known.has(name)) {\r\n throw new AiDispatcherError(\"MCP_TOOL_NOT_FOUND\", `MCP tool \"${name}\" is not registered.`);\r\n }\r\n }\r\n return new Set(filter);\r\n}\r\n\r\nfunction assertServer(server: DispatcherMcpServer, seen: Set<string>): void {\r\n if (\r\n !isRecord(server) ||\r\n typeof server.id !== \"string\" ||\r\n server.id.length === 0 ||\r\n !Array.isArray(server.tools) ||\r\n typeof server.callTool !== \"function\"\r\n ) {\r\n throw new AiDispatcherError(\r\n \"MCP_SERVER_INVALID\",\r\n \"An MCP server needs an id, a tools array, and a callTool function.\"\r\n );\r\n }\r\n if (seen.has(server.id)) {\r\n throw new AiDispatcherError(\"MCP_SERVER_INVALID\", `MCP server \"${server.id}\" is listed more than once.`);\r\n }\r\n seen.add(server.id);\r\n if (!TOOL_TOKEN.test(server.id)) {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NAME_INVALID\",\r\n `MCP server id \"${server.id}\" must use letters, numbers, underscores, and hyphens.`\r\n );\r\n }\r\n}\r\n\r\nfunction exposedToolName(serverId: string, tool: { name?: unknown }): string {\r\n if (typeof tool.name !== \"string\" || !TOOL_TOKEN.test(serverId) || !TOOL_TOKEN.test(tool.name)) {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NAME_INVALID\",\r\n `MCP tool \"${serverId}.${typeof tool.name === \"string\" ? tool.name : \"\"}\" must use letters, numbers, underscores, and hyphens.`\r\n );\r\n }\r\n const exposedName = `${serverId}__${tool.name}`;\r\n if (exposedName.length > MAX_EXPOSED_NAME_LENGTH) {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NAME_INVALID\",\r\n `MCP tool \"${exposedName}\" is longer than ${MAX_EXPOSED_NAME_LENGTH} characters.`\r\n );\r\n }\r\n return exposedName;\r\n}\r\n\r\nfunction toolDescription(tool: { name?: unknown; description?: unknown }): string {\r\n if (tool.description === undefined) return \"\";\r\n if (typeof tool.description !== \"string\") {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NAME_INVALID\",\r\n `MCP tool \"${tool.name}\" description must be a string.`\r\n );\r\n }\r\n return tool.description;\r\n}\r\n\r\nfunction toolParameters(tool: { name?: unknown; inputSchema?: unknown }): Record<string, unknown> {\r\n if (tool.inputSchema === undefined) return { ...DEFAULT_PARAMETERS, properties: {} };\r\n if (!isRecord(tool.inputSchema)) {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NAME_INVALID\",\r\n `MCP tool \"${tool.name}\" inputSchema must be an object.`\r\n );\r\n }\r\n return tool.inputSchema;\r\n}\r\n\r\nfunction textContent(content: unknown): string | undefined {\r\n if (!Array.isArray(content)) return undefined;\r\n const parts: string[] = [];\r\n for (const part of content) {\r\n if (!isRecord(part) || part.type !== \"text\" || typeof part.text !== \"string\") continue;\r\n parts.push(part.text);\r\n }\r\n if (!parts.length) return undefined;\r\n return parts.join(\"\\n\");\r\n}\r\n\r\nfunction toArgs(args: unknown): Record<string, unknown> {\r\n if (isRecord(args)) return args;\r\n return {};\r\n}\r\n\r\nfunction listFailed(serverId: string, error: unknown): AiDispatcherError {\r\n if (error instanceof AiDispatcherError && error.code === \"MCP_LIST_FAILED\") return error;\r\n const message = error instanceof Error ? error.message : `MCP server \"${serverId}\" listTools failed.`;\r\n return new AiDispatcherError(\"MCP_LIST_FAILED\", message);\r\n}\r\n\r\nfunction stringify(result: unknown): string {\r\n const serialized = JSON.stringify(result);\r\n return serialized === undefined ? \"null\" : serialized;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n","import {\r\n AIProfilesError,\r\n mergeReasoningBody,\r\n resolveReasoning,\r\n type ReasoningDirective,\r\n type ReasoningEffort,\r\n type ReasoningTarget\r\n} from \"@x12i/ai-profiles\";\r\nimport type { AdvisorPolicy, FusionPolicy, RuntimeMessage, RuntimeRequest, RuntimeWarning, SubagentPolicy } from \"@x12i/openrouter-runtime\";\r\nimport { applyPromptCache } from \"./cache-apply\";\r\nimport { resolvePromptCache } from \"./cache-profiles\";\r\nimport { AiDispatcherError } from \"./errors\";\r\nimport { cloudflareCatalogQuery, restoreCloudflareModel, selectCloudflareEndpoint } from \"./providers/cloudflare\";\r\nimport { extractStreamReasoningText } from \"./reasoning-extract\";\r\nimport type { CloudflareGatewayControls, CloudflareRequestOptions } from \"./types/cloudflare\";\r\nimport type { ImplementedAiProvider } from \"./types/providers\";\r\nimport type { AiDispatcherOptions, AiDispatcherRequest, CacheResolution, ProviderCallOptions, ReasoningResolution } from \"./types/public\";\r\n\r\nexport interface PreparedDispatch {\r\n provider: ImplementedAiProvider;\r\n request: RuntimeRequest;\r\n requestedModel: string;\r\n effectiveModel: string;\r\n resolution?: ReasoningResolution;\r\n directive?: ReasoningDirective;\r\n cacheResolution?: CacheResolution;\r\n cacheWarnings?: RuntimeWarning[];\r\n call: ProviderCallOptions;\r\n}\r\n\r\ninterface NestedReasoningPolicy {\r\n reasoning?: Record<string, unknown>;\r\n reasoningEffort?: ReasoningEffort;\r\n model?: string;\r\n judgeModel?: string;\r\n}\r\n\r\nexport function prepareDispatchRequest(params: {\r\n request: AiDispatcherRequest;\r\n provider: ImplementedAiProvider;\r\n options: AiDispatcherOptions;\r\n}): PreparedDispatch {\r\n const cloned = cloneRequest(params.request);\r\n applyDispatchIdentity(cloned);\r\n absorbOverrideMetadata(cloned);\r\n const provider = params.provider;\r\n const reasoningEffort = cloned.reasoningEffort;\r\n const bedrockControls = cloned.bedrockControls;\r\n const cachePolicy = cloned.cache;\r\n const cloudflareRequest = cloned.cloudflare;\r\n delete cloned.provider;\r\n delete cloned.reasoningEffort;\r\n delete cloned.bedrockControls;\r\n delete cloned.cache;\r\n delete cloned.cloudflare;\r\n\r\n if (provider === \"openai\") assertOpenAiConfigured(params.options);\r\n if (provider === \"cloudflare\") assertCloudflareConfigured(params.options);\r\n if (provider === \"bedrock\" && cloned.reasoning !== undefined) {\r\n if (bedrockControls?.additionalModelRequestFields === undefined && reasoningEffort === undefined) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Bedrock does not accept an OpenRouter reasoning object. Set reasoningEffort, or set bedrockControls.additionalModelRequestFields.\"\r\n );\r\n }\r\n delete cloned.reasoning;\r\n }\r\n\r\n const requestedModel = cloned.model ?? defaultModelFor(provider, params.options) ?? \"\";\r\n const explicit = hasExplicitControl(provider, cloned, bedrockControls);\r\n let directive: ReasoningDirective | undefined;\r\n let catalogPrefix: string | undefined;\r\n if (!explicit && reasoningEffort !== undefined) {\r\n if (!requestedModel) {\r\n throw new AiDispatcherError(\r\n \"REASONING_MODEL_REQUIRED\",\r\n \"reasoningEffort requires a model id. Set request.model or the provider defaultModel.\"\r\n );\r\n }\r\n if (provider === \"cloudflare\") {\r\n const query = cloudflareCatalogQuery(requestedModel);\r\n catalogPrefix = query.prefix;\r\n directive = resolveCatalog({ target: query.target, model: query.model, effort: reasoningEffort }, true);\r\n } else if (isReasoningTarget(provider)) {\r\n directive = resolveCatalog({ target: provider, model: requestedModel, effort: reasoningEffort }, false);\r\n }\r\n }\r\n\r\n if (provider === \"openrouter\") {\r\n applyNestedReasoning(cloned, reasoningEffort);\r\n }\r\n\r\n if (directive?.model) {\r\n cloned.model = provider === \"cloudflare\"\r\n ? restoreCloudflareModel(directive.model, catalogPrefix)\r\n : directive.model;\r\n }\r\n if (directive?.promptPrefix) applyPromptPrefix(cloned, directive.promptPrefix);\r\n\r\n const effectiveModel = cloned.model ?? requestedModel;\r\n const requestedEndpoint = cloudflareRequest?.endpoint ?? params.options.cloudflare?.endpoint;\r\n const cloudflareEndpoint = provider === \"cloudflare\"\r\n ? selectCloudflareEndpoint({\r\n model: effectiveModel,\r\n ...(requestedEndpoint ? { endpoint: requestedEndpoint } : {}),\r\n ...(cloned.apiMode ? { apiMode: cloned.apiMode } : {})\r\n })\r\n : undefined;\r\n const call: ProviderCallOptions = {};\r\n if (reasoningEffort !== undefined && provider === \"openrouter\") {\r\n call.suppressNestedReasoningFallback = true;\r\n }\r\n\r\n const overlay = directive && hasOwnKeys(directive.body)\r\n ? directive.body\r\n : explicit && provider === \"bedrock\" && bedrockControls?.additionalModelRequestFields\r\n ? { additionalModelRequestFields: bedrockControls.additionalModelRequestFields }\r\n : undefined;\r\n\r\n const cache = cachePolicy\r\n ? resolvePromptCache({\r\n target: provider,\r\n requestedModel,\r\n effectiveModel,\r\n policy: cachePolicy,\r\n ...(cloudflareEndpoint ? { cloudflareEndpoint } : {})\r\n })\r\n : undefined;\r\n const cachePlan = cache?.plan;\r\n const cacheWarnings = cache?.warnings;\r\n const cacheResolution = cache?.resolution;\r\n const cacheTouchesBody = Boolean(\r\n cachePlan && (cachePlan.stripMarkers || cachePlan.placeBreakpoint || cachePlan.sendOpenAiOptions)\r\n );\r\n if (overlay || cacheTouchesBody) {\r\n const bodyOverlay = overlay;\r\n call.finalizeBody = (body) => {\r\n const merged = bodyOverlay ? mergeReasoningBody(body, bodyOverlay) : body;\r\n if (!cacheTouchesBody || !cachePlan) return merged;\r\n const applied = applyPromptCache(merged, cachePlan);\r\n if (cachePlan.placeBreakpoint && !applied.placed) {\r\n noteUnplacedCache(cacheResolution, cacheWarnings, provider, effectiveModel);\r\n return merged;\r\n }\r\n return applied.body;\r\n };\r\n }\r\n if (provider === \"cloudflare\" && cloudflareEndpoint) {\r\n const gateway = mergeCloudflareGateway(params.options.cloudflare, cloudflareRequest);\r\n const gatewayId = cloudflareRequest?.gatewayId ?? params.options.cloudflare?.gatewayId;\r\n call.cloudflare = {\r\n endpoint: cloudflareEndpoint,\r\n ...(gatewayId ? { gatewayId } : {}),\r\n ...(cloudflareRequest?.run ? { run: cloudflareRequest.run } : {}),\r\n ...(gateway ? { gateway } : {}),\r\n ...(cache?.plan.gateway ? { cache: cache.plan.gateway } : {})\r\n };\r\n }\r\n if (directive && hasStreamMetadata(directive)) {\r\n const response = directive.response;\r\n call.extractStreamReasoning = (event) => extractStreamReasoningText(event, response);\r\n }\r\n\r\n const resolution = reasoningEffort !== undefined || explicit\r\n ? buildResolution({\r\n requestedEffort: reasoningEffort,\r\n target: provider,\r\n requestedModel,\r\n effectiveModel,\r\n bypassed: explicit,\r\n outcome: explicit ? undefined : directive?.outcome\r\n })\r\n : undefined;\r\n\r\n return {\r\n provider,\r\n request: cloned,\r\n requestedModel,\r\n effectiveModel,\r\n ...(resolution ? { resolution } : {}),\r\n ...(directive ? { directive } : {}),\r\n ...(cacheResolution ? { cacheResolution } : {}),\r\n ...(cacheWarnings ? { cacheWarnings } : {}),\r\n call\r\n };\r\n}\r\n\r\nfunction noteUnplacedCache(\r\n resolution: CacheResolution | undefined,\r\n warnings: RuntimeWarning[] | undefined,\r\n target: ImplementedAiProvider,\r\n model: string\r\n): void {\r\n if (resolution) {\r\n resolution.outcome = \"ignored\";\r\n delete resolution.ttl;\r\n }\r\n if (!warnings) return;\r\n const kept = warnings.filter((warning) => warning.code !== \"CACHE_TTL_DEGRADED\");\r\n warnings.length = 0;\r\n warnings.push(...kept, {\r\n code: \"CACHE_UNSUPPORTED\",\r\n message: \"Explicit prompt caching needs a system or instructions prefix. The call still runs without a breakpoint.\",\r\n details: { target, model }\r\n });\r\n}\r\n\r\nfunction resolveCatalog(\r\n input: { target: ReasoningTarget; model: string; effort: ReasoningEffort },\r\n ignoreUnknown: boolean\r\n): ReasoningDirective {\r\n try {\r\n return resolveReasoning(input);\r\n } catch (error) {\r\n if (error instanceof AIProfilesError) {\r\n if (ignoreUnknown && (error.code === \"UNKNOWN_MODEL\" || error.code === \"REASONING_MAPPING_MISSING\")) {\r\n return {\r\n outcome: \"ignored\",\r\n body: {},\r\n response: {\r\n reasoningTextPaths: [],\r\n streamReasoningKeys: [],\r\n streamReasoningPaths: [],\r\n stripFromHistoryPaths: [],\r\n stripThinkTags: false\r\n }\r\n };\r\n }\r\n throw new AiDispatcherError(error.code, error.message, error.details);\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nfunction isReasoningTarget(provider: ImplementedAiProvider): provider is ReasoningTarget {\r\n return provider === \"openrouter\" || provider === \"bedrock\" || provider === \"openai\";\r\n}\r\n\r\nfunction hasExplicitControl(\r\n provider: ImplementedAiProvider,\r\n request: AiDispatcherRequest,\r\n bedrockControls: AiDispatcherRequest[\"bedrockControls\"]\r\n): boolean {\r\n if (provider === \"bedrock\") return bedrockControls?.additionalModelRequestFields !== undefined;\r\n return request.reasoning !== undefined;\r\n}\r\n\r\nfunction buildResolution(params: {\r\n requestedEffort: ReasoningEffort | undefined;\r\n target: ImplementedAiProvider;\r\n requestedModel: string;\r\n effectiveModel: string;\r\n bypassed: boolean;\r\n outcome: ReasoningResolution[\"outcome\"];\r\n}): ReasoningResolution {\r\n return {\r\n target: params.target,\r\n requestedModel: params.requestedModel,\r\n effectiveModel: params.effectiveModel,\r\n bypassed: params.bypassed,\r\n ...(params.requestedEffort ? { requestedEffort: params.requestedEffort } : {}),\r\n ...(params.outcome ? { outcome: params.outcome } : {})\r\n };\r\n}\r\n\r\nfunction applyNestedReasoning(request: AiDispatcherRequest, parentEffort: ReasoningEffort | undefined): void {\r\n const serverTools = request.serverTools;\r\n if (!serverTools) return;\r\n if (serverTools.fusion) serverTools.fusion = settleNested(serverTools.fusion, \"fusion\", parentEffort);\r\n if (serverTools.advisor) {\r\n serverTools.advisor = Array.isArray(serverTools.advisor)\r\n ? serverTools.advisor.map((advisor) => settleNested(advisor, \"advisor\", parentEffort))\r\n : settleNested(serverTools.advisor, \"advisor\", parentEffort);\r\n }\r\n if (serverTools.subagent) serverTools.subagent = settleNested(serverTools.subagent, \"subagent\", parentEffort);\r\n}\r\n\r\nfunction settleNested<T extends FusionPolicy | AdvisorPolicy | SubagentPolicy>(\r\n policy: T,\r\n kind: \"fusion\" | \"advisor\" | \"subagent\",\r\n parentEffort: ReasoningEffort | undefined\r\n): T {\r\n const current = policy as T & NestedReasoningPolicy;\r\n const childEffort = current.reasoningEffort;\r\n const next = { ...current };\r\n delete next.reasoningEffort;\r\n if (next.reasoning !== undefined) return next as T;\r\n const effort = childEffort ?? parentEffort;\r\n if (!effort) return next as T;\r\n const model = kind === \"fusion\" ? next.judgeModel : next.model;\r\n if (!model) return next as T;\r\n const directive = resolveCatalog({ target: \"openrouter\", model, effort }, false);\r\n if (directive.model) {\r\n if (kind === \"fusion\") next.judgeModel = directive.model;\r\n else next.model = directive.model;\r\n }\r\n if (isRecord(directive.body.reasoning)) next.reasoning = directive.body.reasoning;\r\n return next as T;\r\n}\r\n\r\nfunction applyPromptPrefix(request: RuntimeRequest, prefix: string): void {\r\n if (typeof request.prompt === \"string\") {\r\n request.prompt = prefix + request.prompt;\r\n return;\r\n }\r\n if (prefixMessages(request.messages, prefix)) return;\r\n if (typeof request.input === \"string\") {\r\n request.input = prefix + request.input;\r\n return;\r\n }\r\n if (Array.isArray(request.input) && prefixInputItems(request.input, prefix)) return;\r\n throw new AiDispatcherError(\r\n \"REASONING_PREFIX_UNSUPPORTED\",\r\n \"The catalog prompt prefix cannot be applied because the request has no user text to prefix.\"\r\n );\r\n}\r\n\r\nfunction prefixMessages(messages: RuntimeMessage[] | undefined, prefix: string): boolean {\r\n if (!messages) return false;\r\n for (const message of messages) {\r\n if (message.role !== \"user\") continue;\r\n if (typeof message.content === \"string\") {\r\n message.content = prefix + message.content;\r\n return true;\r\n }\r\n for (const part of message.content) {\r\n if (part.type === \"text\") {\r\n part.text = prefix + part.text;\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction prefixInputItems(items: Array<Record<string, unknown> | string>, prefix: string): boolean {\r\n for (let index = 0; index < items.length; index += 1) {\r\n const item = items[index];\r\n if (typeof item === \"string\") {\r\n items[index] = prefix + item;\r\n return true;\r\n }\r\n if (!item || item.role === \"system\") continue;\r\n if (typeof item.content === \"string\" && (item.role === \"user\" || item.role === undefined)) {\r\n item.content = prefix + item.content;\r\n return true;\r\n }\r\n if (!Array.isArray(item.content)) continue;\r\n for (const part of item.content) {\r\n if (!isRecord(part) || typeof part.text !== \"string\") continue;\r\n if (part.type === \"text\" || part.type === \"input_text\") {\r\n part.text = prefix + part.text;\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction mergeCloudflareGateway(\r\n base: CloudflareRequestOptions | undefined,\r\n over: CloudflareRequestOptions | undefined\r\n): CloudflareGatewayControls | undefined {\r\n const gateway: CloudflareGatewayControls = {};\r\n for (const source of [base, over]) {\r\n if (!source) continue;\r\n if (source.skipCache !== undefined) gateway.skipCache = source.skipCache;\r\n if (source.cacheTtlSeconds !== undefined) gateway.cacheTtlSeconds = source.cacheTtlSeconds;\r\n if (source.cacheKey !== undefined) gateway.cacheKey = source.cacheKey;\r\n if (source.collectLog !== undefined) gateway.collectLog = source.collectLog;\r\n if (source.requestTimeoutMs !== undefined) gateway.requestTimeoutMs = source.requestTimeoutMs;\r\n if (source.maxGatewayAttempts !== undefined) gateway.maxGatewayAttempts = source.maxGatewayAttempts;\r\n if (source.retryDelayMs !== undefined) gateway.retryDelayMs = source.retryDelayMs;\r\n if (source.backoff !== undefined) gateway.backoff = source.backoff;\r\n if (source.metadata !== undefined) gateway.metadata = source.metadata;\r\n }\r\n return Object.keys(gateway).length ? gateway : undefined;\r\n}\r\n\r\nfunction assertCloudflareConfigured(options: AiDispatcherOptions): void {\r\n const apiToken = options.cloudflare?.apiToken ?? readEnv(\"CLOUDFLARE_API_TOKEN\");\r\n if (!apiToken) {\r\n throw new AiDispatcherError(\r\n \"CLOUDFLARE_API_TOKEN_MISSING\",\r\n \"Cloudflare API token is required. Set cloudflare.apiToken or CLOUDFLARE_API_TOKEN.\"\r\n );\r\n }\r\n const accountId = options.cloudflare?.accountId ?? readEnv(\"CLOUDFLARE_ACCOUNT_ID\");\r\n if (!accountId) {\r\n throw new AiDispatcherError(\r\n \"CLOUDFLARE_ACCOUNT_ID_MISSING\",\r\n \"Cloudflare account id is required. Set cloudflare.accountId or CLOUDFLARE_ACCOUNT_ID.\"\r\n );\r\n }\r\n}\r\n\r\nfunction assertOpenAiConfigured(options: AiDispatcherOptions): void {\r\n const apiKey = options.openai?.apiKey ?? readEnv(\"OPENAI_API_KEY\");\r\n if (!apiKey) {\r\n throw new AiDispatcherError(\r\n \"OPENAI_API_KEY_MISSING\",\r\n \"OpenAI API key is required. Set openai.apiKey or OPENAI_API_KEY.\"\r\n );\r\n }\r\n}\r\n\r\nfunction defaultModelFor(provider: ImplementedAiProvider, options: AiDispatcherOptions): string | undefined {\r\n if (provider === \"openrouter\") return options.openrouter?.defaultModel;\r\n if (provider === \"bedrock\") return options.bedrock?.defaultModel;\r\n if (provider === \"cloudflare\") return options.cloudflare?.defaultModel;\r\n return options.openai?.defaultModel;\r\n}\r\n\r\nconst DISPATCH_IDENTITY_FIELDS = [\"orgId\", \"stepId\", \"skillId\"] as const;\r\n\r\n/**\r\n * Copies dispatcher identity fields into `metadata`.\r\n * A dedicated field wins over the same key inside `metadata`.\r\n * `agentId` stays on the request and is included in the same record when the provider payload is built.\r\n */\r\n/**\r\n * `metadata` is the one caller record. A `rawOpenRouterOverrides` entry whose\r\n * only field is `metadata` is folded into that record. Explicit `metadata` wins on a shared key.\r\n */\r\nfunction absorbOverrideMetadata(request: AiDispatcherRequest): void {\r\n const overrides = request.rawOpenRouterOverrides;\r\n if (!isRecord(overrides) || !Object.prototype.hasOwnProperty.call(overrides, \"metadata\")) return;\r\n if (isRecord(overrides.metadata)) {\r\n const current = { ...(request.metadata ?? {}) };\r\n const extra: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(overrides.metadata)) {\r\n if (!Object.prototype.hasOwnProperty.call(current, key)) extra[key] = value;\r\n }\r\n request.metadata = { ...current, ...extra };\r\n }\r\n const remaining: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(overrides)) {\r\n if (key !== \"metadata\") remaining[key] = value;\r\n }\r\n if (Object.keys(remaining).length === 0) delete request.rawOpenRouterOverrides;\r\n else request.rawOpenRouterOverrides = remaining;\r\n}\r\n\r\nfunction applyDispatchIdentity(request: AiDispatcherRequest): void {\r\n const identity: Record<string, string> = {};\r\n for (const field of DISPATCH_IDENTITY_FIELDS) {\r\n const value = request[field]?.trim();\r\n if (value) identity[field] = value;\r\n delete request[field];\r\n }\r\n if (!Object.keys(identity).length) return;\r\n const rest = { ...(request.metadata ?? {}) };\r\n for (const key of Object.keys(identity)) delete rest[key];\r\n request.metadata = { ...identity, ...rest };\r\n}\r\n\r\nfunction cloneRequest(request: AiDispatcherRequest): AiDispatcherRequest {\r\n const functionTools = request.functionTools?.map((tool) => ({ ...tool }));\r\n const cloned = JSON.parse(JSON.stringify(request)) as AiDispatcherRequest;\r\n if (functionTools) cloned.functionTools = functionTools;\r\n return cloned;\r\n}\r\n\r\nfunction hasOwnKeys(value: Record<string, unknown>): boolean {\r\n return Object.keys(value).length > 0;\r\n}\r\n\r\nfunction hasStreamMetadata(directive: ReasoningDirective): boolean {\r\n return directive.response.streamReasoningKeys.length > 0 || directive.response.streamReasoningPaths.length > 0;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction readEnv(name: string): string | undefined {\r\n if (typeof process === \"undefined\") return undefined;\r\n return process.env[name];\r\n}\r\n","import type { CacheTtl } from \"./types/public\";\r\nimport type { PromptCachePlan } from \"./cache-profiles\";\r\n\r\nconst BREAKPOINT = { mode: \"explicit\" } as const;\r\n\r\nexport interface AppliedPromptCache {\r\n body: Record<string, unknown>;\r\n placed: boolean;\r\n}\r\n\r\n/**\r\n * Adds at most one cache breakpoint to a compiled provider body.\r\n * Returns the same body when the plan does not change the wire.\r\n */\r\nexport function applyPromptCache(body: Record<string, unknown>, plan: PromptCachePlan): AppliedPromptCache {\r\n if (!plan.stripMarkers && !plan.placeBreakpoint && !plan.sendOpenAiOptions) {\r\n return { body, placed: false };\r\n }\r\n\r\n let next = plan.stripMarkers || plan.placeBreakpoint ? stripCacheMarkers(body) : body;\r\n if (plan.sendOpenAiOptions) next = applyOpenAiOptions(next, plan);\r\n\r\n if (!plan.placeBreakpoint) return { body: next, placed: false };\r\n\r\n if (plan.dialect === \"bedrock-cachepoint\") return placeBedrockBreakpoint(next, plan.ttl);\r\n if (plan.dialect === \"anthropic-cache-control\") return placeAnthropicBreakpoint(next, plan.ttl);\r\n if (plan.dialect === \"openai-responses\") return placeOpenAiBreakpoint(next);\r\n return { body: next, placed: false };\r\n}\r\n\r\nfunction applyOpenAiOptions(body: Record<string, unknown>, plan: PromptCachePlan): Record<string, unknown> {\r\n return {\r\n ...body,\r\n ...(plan.key ? { prompt_cache_key: plan.key } : {}),\r\n prompt_cache_options: {\r\n mode: plan.placeBreakpoint ? \"explicit\" : \"implicit\",\r\n ...(plan.ttl ? { ttl: plan.ttl } : {})\r\n }\r\n };\r\n}\r\n\r\nfunction placeOpenAiBreakpoint(body: Record<string, unknown>): AppliedPromptCache {\r\n const instructions = typeof body.instructions === \"string\" ? body.instructions.trim() : \"\";\r\n if (instructions) {\r\n const rest = inputItems(body.input);\r\n return {\r\n placed: true,\r\n body: {\r\n ...omitKey(body, \"instructions\"),\r\n input: [developerBlock(instructions, \"prompt_cache_breakpoint\", BREAKPOINT), ...rest]\r\n }\r\n };\r\n }\r\n if (Array.isArray(body.messages)) {\r\n return markMessages(body, \"messages\", \"prompt_cache_breakpoint\", BREAKPOINT, \"text\");\r\n }\r\n return markInput(body, \"prompt_cache_breakpoint\", BREAKPOINT, \"input_text\");\r\n}\r\n\r\nfunction placeAnthropicBreakpoint(body: Record<string, unknown>, ttl: CacheTtl | undefined): AppliedPromptCache {\r\n const marker = { type: \"ephemeral\", ...(ttl ? { ttl } : {}) };\r\n if (Array.isArray(body.messages)) {\r\n const marked = markMessages(body, \"messages\", \"cache_control\", marker, \"text\");\r\n if (marked.placed) return marked;\r\n if (typeof body.system === \"string\" && body.system.trim()) {\r\n return {\r\n placed: true,\r\n body: {\r\n ...body,\r\n system: [{ type: \"text\", text: body.system.trim(), cache_control: marker }]\r\n }\r\n };\r\n }\r\n return marked;\r\n }\r\n const instructions = typeof body.instructions === \"string\" ? body.instructions.trim() : \"\";\r\n if (instructions) {\r\n const rest = inputItems(body.input);\r\n return {\r\n placed: true,\r\n body: {\r\n ...omitKey(body, \"instructions\"),\r\n input: [developerBlock(instructions, \"cache_control\", marker), ...rest]\r\n }\r\n };\r\n }\r\n return markInput(body, \"cache_control\", marker, \"input_text\");\r\n}\r\n\r\nfunction placeBedrockBreakpoint(body: Record<string, unknown>, ttl: CacheTtl | undefined): AppliedPromptCache {\r\n const point = { cachePoint: { type: \"default\", ...(ttl ? { ttl } : {}) } };\r\n const system = Array.isArray(body.system) ? body.system.filter(hasBedrockText) : [];\r\n if (system.length > 0) {\r\n return { placed: true, body: { ...body, system: [...system, point] } };\r\n }\r\n return { body, placed: false };\r\n}\r\n\r\nfunction markMessages(\r\n body: Record<string, unknown>,\r\n field: \"messages\",\r\n markerKey: string,\r\n markerValue: unknown,\r\n textType: \"text\" | \"input_text\"\r\n): AppliedPromptCache {\r\n const messages = body[field];\r\n if (!Array.isArray(messages)) return { body, placed: false };\r\n const index = stableMessageIndex(messages);\r\n if (index < 0) return { body, placed: false };\r\n const marked = markMessage(messages[index], markerKey, markerValue, textType);\r\n if (!marked) return { body, placed: false };\r\n const next = messages.slice();\r\n next[index] = marked;\r\n return { placed: true, body: { ...body, [field]: next } };\r\n}\r\n\r\nfunction markInput(\r\n body: Record<string, unknown>,\r\n markerKey: string,\r\n markerValue: unknown,\r\n textType: \"text\" | \"input_text\"\r\n): AppliedPromptCache {\r\n if (!Array.isArray(body.input)) return { body, placed: false };\r\n const index = stableInputIndex(body.input);\r\n if (index < 0) return { body, placed: false };\r\n const marked = markMessage(body.input[index], markerKey, markerValue, textType);\r\n if (!marked) return { body, placed: false };\r\n const next = body.input.slice();\r\n next[index] = marked;\r\n return { placed: true, body: { ...body, input: next } };\r\n}\r\n\r\nfunction stableMessageIndex(messages: unknown[]): number {\r\n let lastSystem = -1;\r\n for (let index = 0; index < messages.length; index += 1) {\r\n const message = messages[index];\r\n if (isPlainRecord(message) && message.role === \"system\" && hasText(message.content)) lastSystem = index;\r\n }\r\n return lastSystem;\r\n}\r\n\r\nfunction stableInputIndex(items: unknown[]): number {\r\n let lastStable = -1;\r\n for (let index = 0; index < items.length; index += 1) {\r\n const item = items[index];\r\n if (!isPlainRecord(item) || !hasText(item.content)) continue;\r\n if (item.role === \"system\" || item.role === \"developer\") lastStable = index;\r\n }\r\n return lastStable;\r\n}\r\n\r\nfunction markMessage(\r\n message: unknown,\r\n markerKey: string,\r\n markerValue: unknown,\r\n textType: \"text\" | \"input_text\"\r\n): Record<string, unknown> | undefined {\r\n if (!isPlainRecord(message) || !hasText(message.content)) return undefined;\r\n const content = markContent(message.content, markerKey, markerValue, textType);\r\n if (!content) return undefined;\r\n return { ...message, content };\r\n}\r\n\r\nfunction markContent(\r\n content: unknown,\r\n markerKey: string,\r\n markerValue: unknown,\r\n textType: \"text\" | \"input_text\"\r\n): unknown {\r\n if (typeof content === \"string\") {\r\n if (!content.trim()) return undefined;\r\n return [{ type: textType, text: content, [markerKey]: markerValue }];\r\n }\r\n if (!Array.isArray(content)) return undefined;\r\n const parts = content.map((part) => (isPlainRecord(part) ? { ...part } : part));\r\n for (let index = parts.length - 1; index >= 0; index -= 1) {\r\n const part = parts[index];\r\n if (!isPlainRecord(part) || typeof part.text !== \"string\" || !part.text.trim()) continue;\r\n parts[index] = { ...part, [markerKey]: markerValue };\r\n return parts;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction developerBlock(text: string, markerKey: string, markerValue: unknown): Record<string, unknown> {\r\n return {\r\n role: \"developer\",\r\n content: [{ type: \"input_text\", text, [markerKey]: markerValue }]\r\n };\r\n}\r\n\r\nfunction inputItems(input: unknown): unknown[] {\r\n if (input === undefined) return [];\r\n if (typeof input === \"string\") {\r\n return input.trim() ? [{ role: \"user\", content: input }] : [];\r\n }\r\n return Array.isArray(input) ? input : [];\r\n}\r\n\r\nfunction hasBedrockText(block: unknown): boolean {\r\n return isPlainRecord(block) && typeof block.text === \"string\" && block.text.trim().length > 0;\r\n}\r\n\r\nfunction hasText(content: unknown): boolean {\r\n if (typeof content === \"string\") return content.trim().length > 0;\r\n if (!Array.isArray(content)) return false;\r\n return content.some((part) => isPlainRecord(part) && typeof part.text === \"string\" && part.text.trim().length > 0);\r\n}\r\n\r\nfunction stripCacheMarkers(value: unknown): Record<string, unknown> {\r\n return stripValue(value) as Record<string, unknown>;\r\n}\r\n\r\nfunction stripValue(value: unknown): unknown {\r\n if (Array.isArray(value)) {\r\n return value\r\n .map((item) => stripValue(item))\r\n .filter((item) => !(isPlainRecord(item) && Object.keys(item).length === 0));\r\n }\r\n if (!isPlainRecord(value)) return value;\r\n const next: Record<string, unknown> = {};\r\n for (const [key, child] of Object.entries(value)) {\r\n if (key === \"prompt_cache_breakpoint\" || key === \"cache_control\" || key === \"cachePoint\") continue;\r\n if (key === \"prompt_cache_key\" || key === \"prompt_cache_options\") continue;\r\n next[key] = stripValue(child);\r\n }\r\n return next;\r\n}\r\n\r\nfunction omitKey(body: Record<string, unknown>, key: string): Record<string, unknown> {\r\n const next = { ...body };\r\n delete next[key];\r\n return next;\r\n}\r\n\r\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\r\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === Object.prototype || proto === null;\r\n}\r\n","import type { RuntimeWarning } from \"@x12i/openrouter-runtime\";\r\nimport type { CloudflareEndpoint } from \"./types/cloudflare\";\r\nimport type { ImplementedAiProvider } from \"./types/providers\";\r\nimport type { CacheMode, CacheOutcome, CachePolicy, CacheResolution, CacheTtl } from \"./types/public\";\r\n\r\nexport type CacheDialect =\r\n | \"openai-responses\"\r\n | \"anthropic-cache-control\"\r\n | \"bedrock-cachepoint\"\r\n | \"implicit-native\"\r\n | \"none\";\r\n\r\nexport interface PromptCachePlan {\r\n mode: CacheMode;\r\n dialect: CacheDialect;\r\n ttl?: CacheTtl;\r\n key?: string;\r\n /** Write one breakpoint at the end of the stable prefix. */\r\n placeBreakpoint: boolean;\r\n /** Send `prompt_cache_key` and `prompt_cache_options` when the dialect has them. */\r\n sendOpenAiOptions: boolean;\r\n /** Remove cache markers that arrived through an escape hatch. */\r\n stripMarkers: boolean;\r\n /** AI Gateway cache headers for the Cloudflare provider. */\r\n gateway?: GatewayCacheDirective;\r\n}\r\n\r\nexport interface GatewayCacheDirective {\r\n skip: boolean;\r\n ttlSeconds?: number;\r\n key?: string;\r\n}\r\n\r\ninterface CacheProfile {\r\n dialect: Exclude<CacheDialect, \"none\">;\r\n ttlOptions: CacheTtl[];\r\n defaultTtl: CacheTtl;\r\n}\r\n\r\nconst TTL_MINUTES: Record<CacheTtl, number> = { \"5m\": 5, \"30m\": 30, \"1h\": 60 };\r\nconst TTL_SECONDS: Record<CacheTtl, number> = { \"5m\": 300, \"30m\": 1800, \"1h\": 3600 };\r\n\r\n/** GPT-5.6 and later, including GPT-6 Sol and Luna. Explicit breakpoints, 30-minute TTL. */\r\nconst OPENAI_EXPLICIT: CacheProfile = {\r\n dialect: \"openai-responses\",\r\n ttlOptions: [\"30m\"],\r\n defaultTtl: \"30m\"\r\n};\r\n\r\n/** Earlier OpenAI models cache automatically and reject explicit breakpoints. */\r\nconst OPENAI_IMPLICIT: CacheProfile = {\r\n dialect: \"implicit-native\",\r\n ttlOptions: [\"30m\"],\r\n defaultTtl: \"30m\"\r\n};\r\n\r\n/** Claude on OpenRouter. Breakpoints are `cache_control`; 1-hour TTL costs more to write. */\r\nconst ANTHROPIC_EXPLICIT: CacheProfile = {\r\n dialect: \"anthropic-cache-control\",\r\n ttlOptions: [\"5m\", \"1h\"],\r\n defaultTtl: \"5m\"\r\n};\r\n\r\n/** Qwen uses the same breakpoint shape. Only the 5-minute TTL is sent. */\r\nconst QWEN_EXPLICIT: CacheProfile = {\r\n dialect: \"anthropic-cache-control\",\r\n ttlOptions: [\"5m\"],\r\n defaultTtl: \"5m\"\r\n};\r\n\r\n/** Bedrock Converse `cachePoint` for Claude and Nova. */\r\nconst BEDROCK_EXPLICIT: CacheProfile = {\r\n dialect: \"bedrock-cachepoint\",\r\n ttlOptions: [\"5m\", \"1h\"],\r\n defaultTtl: \"5m\"\r\n};\r\n\r\n/** OpenRouter models that cache a prefix without a marker. */\r\nconst ROUTER_IMPLICIT: CacheProfile = {\r\n dialect: \"implicit-native\",\r\n ttlOptions: [\"5m\"],\r\n defaultTtl: \"5m\"\r\n};\r\n\r\nexport interface ResolvedPromptCache {\r\n plan: PromptCachePlan;\r\n resolution: CacheResolution;\r\n warnings: RuntimeWarning[];\r\n}\r\n\r\nexport function resolvePromptCache(input: {\r\n target: ImplementedAiProvider;\r\n requestedModel: string;\r\n effectiveModel: string;\r\n policy: CachePolicy;\r\n cloudflareEndpoint?: CloudflareEndpoint;\r\n}): ResolvedPromptCache {\r\n const mode = normalizeMode(input.policy.mode);\r\n const key = input.policy.key?.trim() || undefined;\r\n const requestedTtl = normalizeTtl(input.policy.ttl);\r\n const model = input.effectiveModel.trim();\r\n const resolutionBase = {\r\n mode,\r\n target: input.target,\r\n requestedModel: input.requestedModel,\r\n effectiveModel: input.effectiveModel,\r\n keyPresent: Boolean(key)\r\n };\r\n\r\n if (input.target === \"cloudflare\") {\r\n return resolveCloudflarePromptCache({ input, mode, key, requestedTtl, resolutionBase, model });\r\n }\r\n\r\n if (mode === \"disabled\") {\r\n return {\r\n plan: emptyPlan(mode, \"none\", key, true),\r\n resolution: { ...resolutionBase, outcome: \"ignored\" },\r\n warnings: []\r\n };\r\n }\r\n\r\n if (input.policy.mode !== undefined && mode === \"explicit\" && !isCacheMode(input.policy.mode)) {\r\n return ignored(input, resolutionBase, key, \"CACHE_UNSUPPORTED\", \"cache.mode is not auto, explicit, or disabled. The call still runs without cache markers.\");\r\n }\r\n\r\n const matched = matchProfile(input.target, model);\r\n if (!matched.profile) {\r\n return ignored(\r\n input,\r\n resolutionBase,\r\n key,\r\n matched.code,\r\n matched.message\r\n );\r\n }\r\n\r\n return applyProfile({ input, mode, key, requestedTtl, resolutionBase, model, profile: matched.profile });\r\n}\r\n\r\nfunction resolveCloudflarePromptCache(args: {\r\n input: { target: ImplementedAiProvider; effectiveModel: string; policy: CachePolicy; cloudflareEndpoint?: CloudflareEndpoint };\r\n mode: CacheMode;\r\n key: string | undefined;\r\n requestedTtl: CacheTtl | undefined;\r\n resolutionBase: Omit<CacheResolution, \"outcome\" | \"ttl\">;\r\n model: string;\r\n}): ResolvedPromptCache {\r\n const { input, mode, key, requestedTtl, resolutionBase, model } = args;\r\n if (mode === \"disabled\") {\r\n return {\r\n plan: { ...emptyPlan(mode, \"none\", key, true), gateway: gatewayDirective(true, undefined, key) },\r\n resolution: { ...resolutionBase, outcome: \"applied\" },\r\n warnings: []\r\n };\r\n }\r\n if (input.policy.mode !== undefined && mode === \"explicit\" && !isCacheMode(input.policy.mode)) {\r\n return ignored(input, resolutionBase, key, \"CACHE_UNSUPPORTED\", \"cache.mode is not auto, explicit, or disabled. The call still runs without cache markers.\");\r\n }\r\n\r\n const profile = matchCloudflareNative(input.cloudflareEndpoint, model);\r\n if (!profile) {\r\n return {\r\n plan: {\r\n mode,\r\n dialect: \"none\",\r\n placeBreakpoint: false,\r\n sendOpenAiOptions: false,\r\n stripMarkers: false,\r\n gateway: gatewayDirective(false, requestedTtl, key),\r\n ...(requestedTtl ? { ttl: requestedTtl } : {}),\r\n ...(key ? { key } : {})\r\n },\r\n resolution: {\r\n ...resolutionBase,\r\n outcome: \"applied\",\r\n ...(requestedTtl ? { ttl: requestedTtl } : {})\r\n },\r\n warnings: []\r\n };\r\n }\r\n\r\n const resolved = applyProfile({ input, mode, key, requestedTtl, resolutionBase, model, profile });\r\n const ttl = resolved.plan.ttl ?? requestedTtl;\r\n return {\r\n ...resolved,\r\n plan: { ...resolved.plan, gateway: gatewayDirective(false, ttl, key) }\r\n };\r\n}\r\n\r\nfunction applyProfile(args: {\r\n input: { target: ImplementedAiProvider; effectiveModel: string };\r\n mode: CacheMode;\r\n key: string | undefined;\r\n requestedTtl: CacheTtl | undefined;\r\n resolutionBase: Omit<CacheResolution, \"outcome\" | \"ttl\">;\r\n model: string;\r\n profile: CacheProfile;\r\n}): ResolvedPromptCache {\r\n const { input, mode, key, requestedTtl, resolutionBase, model, profile } = args;\r\n const folded = foldTtl(requestedTtl, profile.ttlOptions, profile.defaultTtl);\r\n const explicitDialect = profile.dialect === \"openai-responses\"\r\n || profile.dialect === \"anthropic-cache-control\"\r\n || profile.dialect === \"bedrock-cachepoint\";\r\n\r\n if (mode === \"explicit\" && profile.dialect === \"implicit-native\") {\r\n return ignored(\r\n input,\r\n resolutionBase,\r\n key,\r\n \"CACHE_UNSUPPORTED\",\r\n \"This model caches automatically and does not accept an explicit breakpoint. The call still runs.\"\r\n );\r\n }\r\n\r\n if (mode === \"auto\" && explicitDialect && profile.dialect !== \"openai-responses\") {\r\n return ignored(\r\n input,\r\n resolutionBase,\r\n key,\r\n \"CACHE_UNSUPPORTED\",\r\n \"This model only caches when an explicit breakpoint is set. Set cache.mode to explicit. The call still runs.\"\r\n );\r\n }\r\n\r\n const warnings: RuntimeWarning[] = [];\r\n const sendsTtl = profile.dialect === \"openai-responses\" || (mode === \"explicit\" && explicitDialect);\r\n if (requestedTtl && folded.degraded && sendsTtl) {\r\n warnings.push({\r\n code: \"CACHE_TTL_DEGRADED\",\r\n message: `cache.ttl \"${requestedTtl}\" is not supported for this model. Using \"${folded.ttl}\".`,\r\n details: { requestedTtl, effectiveTtl: folded.ttl, target: input.target, model }\r\n });\r\n }\r\n\r\n const placeBreakpoint = mode === \"explicit\" && explicitDialect;\r\n const sendOpenAiOptions = profile.dialect === \"openai-responses\" && (mode === \"explicit\" || mode === \"auto\");\r\n const outcome: CacheOutcome = folded.degraded && sendsTtl ? \"degraded\" : \"applied\";\r\n\r\n return {\r\n plan: {\r\n mode,\r\n dialect: profile.dialect,\r\n placeBreakpoint,\r\n sendOpenAiOptions,\r\n stripMarkers: placeBreakpoint,\r\n ...(sendsTtl ? { ttl: folded.ttl } : {}),\r\n ...(key ? { key } : {})\r\n },\r\n resolution: {\r\n ...resolutionBase,\r\n outcome,\r\n ...(sendsTtl ? { ttl: folded.ttl } : {})\r\n },\r\n warnings\r\n };\r\n}\r\n\r\nfunction gatewayDirective(skip: boolean, ttl: CacheTtl | undefined, key: string | undefined): GatewayCacheDirective {\r\n return {\r\n skip,\r\n ...(ttl ? { ttlSeconds: TTL_SECONDS[ttl] } : {}),\r\n ...(key ? { key } : {})\r\n };\r\n}\r\n\r\nfunction matchCloudflareNative(endpoint: CloudflareEndpoint | undefined, model: string): CacheProfile | undefined {\r\n const id = model.toLowerCase();\r\n if (endpoint === \"responses\" && isGptExplicit(id)) return OPENAI_EXPLICIT;\r\n if (endpoint === \"responses\" && isGptImplicit(id)) return OPENAI_IMPLICIT;\r\n if (endpoint === \"messages\" && isClaude(id)) return ANTHROPIC_EXPLICIT;\r\n return undefined;\r\n}\r\n\r\nfunction ignored(\r\n input: { target: ImplementedAiProvider; effectiveModel: string },\r\n resolutionBase: Omit<CacheResolution, \"outcome\" | \"ttl\">,\r\n key: string | undefined,\r\n code: string,\r\n message: string\r\n): ResolvedPromptCache {\r\n return {\r\n plan: emptyPlan(resolutionBase.mode, \"none\", key, false),\r\n resolution: { ...resolutionBase, outcome: \"ignored\" },\r\n warnings: [{\r\n code,\r\n message,\r\n details: { target: input.target, model: input.effectiveModel.trim() }\r\n }]\r\n };\r\n}\r\n\r\nfunction emptyPlan(mode: CacheMode, dialect: CacheDialect, key: string | undefined, stripMarkers: boolean): PromptCachePlan {\r\n return {\r\n mode,\r\n dialect,\r\n placeBreakpoint: false,\r\n sendOpenAiOptions: false,\r\n stripMarkers,\r\n ...(key ? { key } : {})\r\n };\r\n}\r\n\r\nfunction matchProfile(\r\n target: ImplementedAiProvider,\r\n model: string\r\n): { profile?: CacheProfile; code: string; message: string } {\r\n const id = model.toLowerCase();\r\n if (!id) {\r\n return {\r\n code: \"CACHE_UNSUPPORTED\",\r\n message: \"Prompt caching needs a model id. The call still runs without cache markers.\"\r\n };\r\n }\r\n\r\n if (target === \"bedrock\") {\r\n if (isOpenAiBedrockId(id)) {\r\n return {\r\n code: \"CACHE_DIALECT_UNSUPPORTED\",\r\n message: \"OpenAI models on Bedrock cache through the Responses API. This runtime sends Converse and does not add those markers. The call still runs.\"\r\n };\r\n }\r\n if (isClaude(id) || isNova(id)) return { profile: BEDROCK_EXPLICIT, code: \"\", message: \"\" };\r\n return {\r\n code: \"CACHE_UNSUPPORTED\",\r\n message: \"This Bedrock model has no prompt-cache profile. The call still runs without cache markers.\"\r\n };\r\n }\r\n\r\n if (target === \"openai\") {\r\n if (isGptExplicit(id)) return { profile: OPENAI_EXPLICIT, code: \"\", message: \"\" };\r\n if (isGptImplicit(id)) return { profile: OPENAI_IMPLICIT, code: \"\", message: \"\" };\r\n return {\r\n code: \"CACHE_UNSUPPORTED\",\r\n message: \"This OpenAI model has no prompt-cache profile. The call still runs without cache markers.\"\r\n };\r\n }\r\n\r\n if (isClaude(id)) return { profile: ANTHROPIC_EXPLICIT, code: \"\", message: \"\" };\r\n if (isQwen(id)) return { profile: QWEN_EXPLICIT, code: \"\", message: \"\" };\r\n if (isGptExplicit(id)) return { profile: OPENAI_EXPLICIT, code: \"\", message: \"\" };\r\n if (isGptImplicit(id) || isRouterImplicit(id)) return { profile: ROUTER_IMPLICIT, code: \"\", message: \"\" };\r\n return {\r\n code: \"CACHE_UNSUPPORTED\",\r\n message: \"This model has no prompt-cache profile. The call still runs without cache markers.\"\r\n };\r\n}\r\n\r\nfunction foldTtl(\r\n requested: CacheTtl | undefined,\r\n options: CacheTtl[],\r\n defaultTtl: CacheTtl\r\n): { ttl: CacheTtl; degraded: boolean } {\r\n if (!requested) return { ttl: defaultTtl, degraded: false };\r\n if (options.includes(requested)) return { ttl: requested, degraded: false };\r\n let best = defaultTtl;\r\n let bestDistance = Math.abs(TTL_MINUTES[defaultTtl] - TTL_MINUTES[requested]);\r\n for (const option of options) {\r\n const distance = Math.abs(TTL_MINUTES[option] - TTL_MINUTES[requested]);\r\n if (distance < bestDistance) {\r\n best = option;\r\n bestDistance = distance;\r\n }\r\n }\r\n return { ttl: best, degraded: true };\r\n}\r\n\r\nfunction normalizeMode(mode: CachePolicy[\"mode\"]): CacheMode {\r\n if (mode === \"auto\" || mode === \"disabled\") return mode;\r\n return \"explicit\";\r\n}\r\n\r\nfunction isCacheMode(mode: string): mode is CacheMode {\r\n return mode === \"auto\" || mode === \"explicit\" || mode === \"disabled\";\r\n}\r\n\r\nfunction normalizeTtl(ttl: CachePolicy[\"ttl\"]): CacheTtl | undefined {\r\n if (ttl === \"5m\" || ttl === \"30m\" || ttl === \"1h\") return ttl;\r\n return undefined;\r\n}\r\n\r\nfunction isGptExplicit(id: string): boolean {\r\n return /(?:^|\\/)gpt-(?:5\\.6|6)(?:[.\\-:]|$)/i.test(id);\r\n}\r\n\r\nfunction isGptImplicit(id: string): boolean {\r\n if (isGptExplicit(id)) return false;\r\n return /(?:^|\\/)gpt(?:[.\\-:]|$)/i.test(id) || /(?:^|\\/)o[134](?:[.\\-:]|$)/i.test(id);\r\n}\r\n\r\nfunction isClaude(id: string): boolean {\r\n return id.includes(\"claude\") || id.startsWith(\"anthropic.\") || id.startsWith(\"anthropic/\");\r\n}\r\n\r\nfunction isQwen(id: string): boolean {\r\n return id.includes(\"qwen\");\r\n}\r\n\r\nfunction isNova(id: string): boolean {\r\n return /(?:^|[./])nova(?:[.\\-:]|$)/i.test(id) || id.includes(\"amazon.nova\");\r\n}\r\n\r\nfunction isOpenAiBedrockId(id: string): boolean {\r\n return id.startsWith(\"openai.\") || id.startsWith(\"openai/\") || isGptExplicit(id) || isGptImplicit(id);\r\n}\r\n\r\nfunction isRouterImplicit(id: string): boolean {\r\n return /(?:^|\\/)(gemini|google|deepseek|x-ai|xai|grok|moonshot|kimi)(?:[./:\\-]|$)/i.test(id)\r\n || id.includes(\"gemini\")\r\n || id.includes(\"deepseek\");\r\n}\r\n","import {\r\n packProviderRecord,\r\n type RuntimeMessage,\r\n type RuntimeRequest,\r\n type RuntimeResponse,\r\n type RuntimeStreamEvent,\r\n type RuntimeLogger,\r\n type RuntimeToolExecutor,\r\n type RuntimeToolUsage,\r\n type RuntimeWarning\r\n} from \"@x12i/openrouter-runtime\";\r\nimport { AiDispatcherError } from \"../errors\";\r\nimport type {\r\n CloudflareCallContext,\r\n CloudflareEndpoint,\r\n CloudflareEndpointChoice,\r\n CloudflareGatewayControls,\r\n CloudflareRuntimeOptions,\r\n CloudflareRunOptions\r\n} from \"../types/cloudflare\";\r\nimport type { MetadataPacker } from \"@x12i/provider-metadata\";\r\nimport type { ProviderCallOptions } from \"../types/public\";\r\n\r\ntype FunctionToolUsage = RuntimeToolUsage[\"functionTools\"][number];\r\n\r\nconst DEFAULT_BASE_URL = \"https://api.cloudflare.com/client/v4\";\r\nconst DEFAULT_TIMEOUT_MS = 120_000;\r\nconst DEFAULT_GATEWAY_ID = \"default\";\r\n\r\nexport interface CompiledCloudflareWire {\r\n endpoint: CloudflareEndpoint;\r\n url: string;\r\n headers: Record<string, string>;\r\n body: Record<string, unknown>;\r\n warnings: RuntimeWarning[];\r\n}\r\n\r\nexport function selectCloudflareEndpoint(input: {\r\n model: string;\r\n endpoint?: CloudflareEndpointChoice;\r\n apiMode?: RuntimeRequest[\"apiMode\"];\r\n}): CloudflareEndpoint {\r\n if (input.endpoint && input.endpoint !== \"auto\") return input.endpoint;\r\n if (input.apiMode === \"chat\") return \"chat\";\r\n if (input.apiMode === \"responses\") return \"responses\";\r\n const id = input.model.trim().toLowerCase();\r\n if (id.startsWith(\"anthropic/\")) return \"messages\";\r\n if (id.startsWith(\"openai/\") || isBareOpenAiModel(id)) return \"responses\";\r\n return \"chat\";\r\n}\r\n\r\nexport function cloudflareCatalogQuery(model: string): {\r\n target: \"openai\" | \"openrouter\";\r\n model: string;\r\n prefix?: string;\r\n} {\r\n const id = model.trim();\r\n const lower = id.toLowerCase();\r\n if (lower.startsWith(\"openai/\")) {\r\n const slash = id.indexOf(\"/\");\r\n return { target: \"openai\", model: id.slice(slash + 1), prefix: id.slice(0, slash + 1) };\r\n }\r\n if (isBareOpenAiModel(id)) return { target: \"openai\", model: id, prefix: \"openai/\" };\r\n return { target: \"openrouter\", model: id };\r\n}\r\n\r\nexport function restoreCloudflareModel(model: string, prefix: string | undefined): string {\r\n if (!prefix || model.includes(\"/\")) return model;\r\n return `${prefix}${model}`;\r\n}\r\n\r\nexport function createCloudflareProviderAdapter(options: CloudflareRuntimeOptions = {}, packer?: MetadataPacker) {\r\n const resolved = resolveCloudflareOptions(options, packer);\r\n\r\n return {\r\n compile(request: RuntimeRequest, call?: ProviderCallOptions): CompiledCloudflareWire {\r\n return compileCloudflareRequest(request, resolved, call, false);\r\n },\r\n async run(request: RuntimeRequest, call?: ProviderCallOptions): Promise<RuntimeResponse> {\r\n const requestId = request.id ?? \"cloudflare\";\r\n try {\r\n return await runCloudflare(request, resolved, call, requestId);\r\n } catch (error) {\r\n if (error instanceof AiDispatcherError && isConfigError(error.code)) throw error;\r\n return failedResponse(request, requestId, error, \"chat\");\r\n }\r\n },\r\n executeStreamingChat(request: RuntimeRequest, call?: ProviderCallOptions): AsyncIterable<RuntimeStreamEvent> {\r\n return streamCloudflare(request, resolved, call);\r\n }\r\n };\r\n}\r\n\r\nfunction compileCloudflareRequest(\r\n request: RuntimeRequest,\r\n options: ResolvedCloudflareOptions,\r\n call: ProviderCallOptions | undefined,\r\n streaming: boolean\r\n): CompiledCloudflareWire {\r\n assertSupported(request);\r\n assertCredentials(options);\r\n const model = (request.model ?? options.defaultModel ?? \"\").trim();\r\n if (!model) {\r\n throw new AiDispatcherError(\r\n \"MODEL_REQUIRED\",\r\n \"A model id is required. Set request.model or cloudflare.defaultModel.\"\r\n );\r\n }\r\n\r\n const endpoint = call?.cloudflare?.endpoint\r\n ?? selectCloudflareEndpoint({\r\n model,\r\n ...(options.endpoint ? { endpoint: options.endpoint } : {}),\r\n ...(request.apiMode ? { apiMode: request.apiMode } : {})\r\n });\r\n if (streaming && endpoint === \"run\") {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Cloudflare /ai/run does not stream. Use chat, responses, or messages, or call run().\"\r\n );\r\n }\r\n if ((endpoint === \"messages\" || endpoint === \"run\") && request.responseFormat !== undefined) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"responseFormat is supported on Cloudflare chat and responses, not on messages or run.\"\r\n );\r\n }\r\n const run = endpoint === \"run\" ? call?.cloudflare?.run : undefined;\r\n assertRunOptions(run);\r\n\r\n let body = endpoint === \"responses\"\r\n ? compileResponsesBody(request, model)\r\n : endpoint === \"messages\"\r\n ? compileMessagesBody(request, model)\r\n : compileChatBody(request, model);\r\n if (call?.finalizeBody) body = call.finalizeBody(body);\r\n if (endpoint !== \"run\") body = { ...body, stream: streaming };\r\n const gateway = mergeGateway(options.gateway, call?.cloudflare?.gateway);\r\n const fromBody = isRecord(body.metadata) ? body.metadata : undefined;\r\n const packed = packProviderRecord(\r\n request.metadata,\r\n request.agentId,\r\n overlayMetadata(gateway?.metadata, fromBody),\r\n options.metadataPacker\r\n );\r\n const record = packed.wire;\r\n body = applyProviderRecord(body, record);\r\n\r\n if (endpoint === \"run\") body = wrapRun(body, run);\r\n\r\n return {\r\n endpoint,\r\n url: endpointUrl(options, endpoint),\r\n headers: buildHeaders(options, call?.cloudflare, model, record),\r\n body,\r\n warnings: packed.warning ? [packed.warning] : []\r\n };\r\n}\r\n\r\nfunction compileResponsesBody(request: RuntimeRequest, model: string): Record<string, unknown> {\r\n const instructions = compileInstructions(request);\r\n const input = compileResponsesInput(request);\r\n if (input === undefined) {\r\n throw new AiDispatcherError(\"INPUT_REQUIRED\", \"Provide request.messages, request.input, or request.prompt.\");\r\n }\r\n return clean({\r\n model,\r\n input,\r\n instructions,\r\n temperature: request.temperature,\r\n max_output_tokens: request.maxTokens,\r\n reasoning: request.reasoning,\r\n text: request.responseFormat,\r\n tools: compileResponsesTools(request),\r\n tool_choice: compileResponsesToolChoice(request)\r\n });\r\n}\r\n\r\nfunction compileChatBody(request: RuntimeRequest, model: string): Record<string, unknown> {\r\n const messages = compileChatMessages(request);\r\n if (!messages.length) {\r\n throw new AiDispatcherError(\"INPUT_REQUIRED\", \"Provide request.messages, request.input, or request.prompt.\");\r\n }\r\n return clean({\r\n model,\r\n messages,\r\n temperature: request.temperature,\r\n max_tokens: request.maxTokens,\r\n reasoning: request.reasoning,\r\n response_format: request.responseFormat,\r\n tools: compileChatTools(request),\r\n tool_choice: compileChatToolChoice(request)\r\n });\r\n}\r\n\r\nfunction compileMessagesBody(request: RuntimeRequest, model: string): Record<string, unknown> {\r\n const system = compileInstructions(request);\r\n const messages = compileAnthropicMessages(request);\r\n if (!messages.length) {\r\n throw new AiDispatcherError(\"INPUT_REQUIRED\", \"Provide request.messages, request.input, or request.prompt.\");\r\n }\r\n return clean({\r\n model,\r\n system,\r\n messages,\r\n temperature: request.temperature,\r\n max_tokens: request.maxTokens,\r\n tools: compileAnthropicTools(request),\r\n tool_choice: compileAnthropicToolChoice(request)\r\n });\r\n}\r\n\r\nfunction wrapRun(body: Record<string, unknown>, run: CloudflareRunOptions | undefined): Record<string, unknown> {\r\n const model = body.model;\r\n const input = { ...body };\r\n delete input.model;\r\n delete input.stream;\r\n return clean({\r\n model,\r\n input,\r\n options: runOptions(run)\r\n });\r\n}\r\n\r\nfunction runOptions(run: CloudflareRunOptions | undefined): Record<string, unknown> | undefined {\r\n if (!run) return undefined;\r\n return clean({\r\n background: run.background,\r\n webhookUrl: run.webhookUrl,\r\n webhookFormat: run.webhookFormat\r\n });\r\n}\r\n\r\nfunction assertRunOptions(run: CloudflareRunOptions | undefined): void {\r\n if (!run) return;\r\n if (run.webhookUrl && run.background !== true) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Cloudflare webhookUrl requires run.background to be true.\"\r\n );\r\n }\r\n if (run.webhookFormat && !run.webhookUrl) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Cloudflare webhookFormat requires run.webhookUrl.\"\r\n );\r\n }\r\n}\r\n\r\nfunction assertSupported(request: RuntimeRequest): void {\r\n if (request.serverTools && serverToolsEnabled(request.serverTools)) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Cloudflare does not support OpenRouter server tools.\"\r\n );\r\n }\r\n if (request.rawOpenRouterOverrides !== undefined) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"rawOpenRouterOverrides cannot be sent to Cloudflare.\"\r\n );\r\n }\r\n if (request.toolChoice && typeof request.toolChoice === \"object\" && request.toolChoice.type === \"server_tool\") {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Cloudflare does not support OpenRouter server tool choices.\"\r\n );\r\n }\r\n}\r\n\r\nfunction assertCredentials(options: ResolvedCloudflareOptions): void {\r\n if (!options.apiToken) {\r\n throw new AiDispatcherError(\r\n \"CLOUDFLARE_API_TOKEN_MISSING\",\r\n \"Cloudflare API token is required. Set cloudflare.apiToken or CLOUDFLARE_API_TOKEN.\"\r\n );\r\n }\r\n if (!options.accountId) {\r\n throw new AiDispatcherError(\r\n \"CLOUDFLARE_ACCOUNT_ID_MISSING\",\r\n \"Cloudflare account id is required. Set cloudflare.accountId or CLOUDFLARE_ACCOUNT_ID.\"\r\n );\r\n }\r\n}\r\n\r\nfunction serverToolsEnabled(policy: NonNullable<RuntimeRequest[\"serverTools\"]>): boolean {\r\n return Object.values(policy).some((value) => {\r\n if (Array.isArray(value)) return value.some((item) => isEnabledMode(item));\r\n return isEnabledMode(value);\r\n });\r\n}\r\n\r\nfunction isEnabledMode(value: unknown): boolean {\r\n return typeof value === \"object\" && value !== null && \"mode\" in value && (value as { mode?: string }).mode !== \"disabled\";\r\n}\r\n\r\nfunction compileInstructions(request: RuntimeRequest): string | undefined {\r\n if (request.instructions) return request.instructions;\r\n if (request.system) return request.system;\r\n const systemMessages = (request.messages ?? []).filter((message) => message.role === \"system\");\r\n if (!systemMessages.length) return undefined;\r\n return systemMessages.map((message) => contentToText(message.content)).filter(Boolean).join(\"\\n\");\r\n}\r\n\r\nfunction compileResponsesInput(request: RuntimeRequest): unknown {\r\n if (request.input !== undefined) return request.input;\r\n const items: unknown[] = [];\r\n for (const message of request.messages ?? []) {\r\n if (message.role === \"system\") continue;\r\n items.push(compileResponsesItem(message));\r\n }\r\n if (typeof request.prompt === \"string\") items.push({ role: \"user\", content: request.prompt });\r\n return items.length ? items : undefined;\r\n}\r\n\r\nfunction compileResponsesItem(message: RuntimeMessage): Record<string, unknown> {\r\n if (message.role === \"tool\") {\r\n return {\r\n type: \"function_call_output\",\r\n call_id: message.toolCallId ?? message.name ?? \"tool\",\r\n output: contentToText(message.content)\r\n };\r\n }\r\n const role = message.role === \"assistant\" ? \"assistant\" : \"user\";\r\n return { role, content: compileResponsesContent(message.content) };\r\n}\r\n\r\nfunction compileResponsesContent(content: RuntimeMessage[\"content\"]): unknown {\r\n if (typeof content === \"string\") return content;\r\n return content.map((part) => {\r\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\r\n if (part.type === \"image_url\") return { type: \"input_image\", image_url: part.imageUrl };\r\n return compileFilePart(part, \"responses\");\r\n });\r\n}\r\n\r\nfunction compileChatMessages(request: RuntimeRequest): unknown[] {\r\n assertExclusiveInput(request);\r\n const messages: unknown[] = [];\r\n const system = compileInstructions(request);\r\n if (system) messages.push({ role: \"system\", content: system });\r\n for (const message of dialogueMessages(request)) messages.push(compileChatMessage(message));\r\n return messages;\r\n}\r\n\r\nfunction compileChatMessage(message: RuntimeMessage): Record<string, unknown> {\r\n if (message.role === \"tool\") {\r\n return {\r\n role: \"tool\",\r\n tool_call_id: message.toolCallId ?? message.name ?? \"tool\",\r\n content: contentToText(message.content)\r\n };\r\n }\r\n return {\r\n role: message.role === \"assistant\" ? \"assistant\" : \"user\",\r\n content: compileChatContent(message.content)\r\n };\r\n}\r\n\r\nfunction compileChatContent(content: RuntimeMessage[\"content\"]): unknown {\r\n if (typeof content === \"string\") return content;\r\n return content.map((part) => {\r\n if (part.type === \"text\") return { type: \"text\", text: part.text };\r\n if (part.type === \"image_url\") return { type: \"image_url\", image_url: { url: part.imageUrl } };\r\n const file = compileFilePart(part, \"chat\");\r\n return file;\r\n });\r\n}\r\n\r\nfunction compileAnthropicMessages(request: RuntimeRequest): unknown[] {\r\n assertExclusiveInput(request);\r\n return dialogueMessages(request).map(compileAnthropicMessage);\r\n}\r\n\r\nfunction compileAnthropicMessage(message: RuntimeMessage): Record<string, unknown> {\r\n if (message.role === \"tool\") {\r\n return {\r\n role: \"user\",\r\n content: [{\r\n type: \"tool_result\",\r\n tool_use_id: message.toolCallId ?? message.name ?? \"tool\",\r\n content: contentToText(message.content)\r\n }]\r\n };\r\n }\r\n const role = message.role === \"assistant\" ? \"assistant\" : \"user\";\r\n return { role, content: compileAnthropicContent(message.content) };\r\n}\r\n\r\nfunction compileAnthropicContent(content: RuntimeMessage[\"content\"]): unknown {\r\n if (typeof content === \"string\") return content;\r\n return content.map((part) => {\r\n if (part.type === \"text\") return { type: \"text\", text: part.text };\r\n if (part.type === \"image_url\") return anthropicImage(part.imageUrl);\r\n return anthropicFile(part);\r\n });\r\n}\r\n\r\nfunction dialogueMessages(request: RuntimeRequest): RuntimeMessage[] {\r\n const source = request.messages?.length\r\n ? request.messages.filter((message) => message.role !== \"system\")\r\n : messagesFromInput(request);\r\n if (typeof request.prompt === \"string\" && request.messages?.length) {\r\n return [...source, { role: \"user\", content: request.prompt }];\r\n }\r\n if (!source.length && typeof request.prompt === \"string\") return [{ role: \"user\", content: request.prompt }];\r\n return source;\r\n}\r\n\r\nfunction messagesFromInput(request: RuntimeRequest): RuntimeMessage[] {\r\n if (typeof request.input === \"string\") return [{ role: \"user\", content: request.input }];\r\n if (!Array.isArray(request.input)) return [];\r\n const messages: RuntimeMessage[] = [];\r\n for (const item of request.input) {\r\n if (typeof item === \"string\") {\r\n messages.push({ role: \"user\", content: item });\r\n continue;\r\n }\r\n if (!isRecord(item)) continue;\r\n const role = item.role === \"assistant\" || item.role === \"tool\" || item.role === \"system\" ? item.role : \"user\";\r\n if (role === \"system\") continue;\r\n const content = inputContent(item.content);\r\n if (content === undefined) continue;\r\n const message: RuntimeMessage = { role, content };\r\n if (typeof item.toolCallId === \"string\") message.toolCallId = item.toolCallId;\r\n if (typeof item.name === \"string\") message.name = item.name;\r\n messages.push(message);\r\n }\r\n return messages;\r\n}\r\n\r\nfunction inputContent(content: unknown): RuntimeMessage[\"content\"] | undefined {\r\n if (typeof content === \"string\") return content;\r\n if (!Array.isArray(content)) return undefined;\r\n const parts: Exclude<RuntimeMessage[\"content\"], string> = [];\r\n for (const part of content) {\r\n if (!isRecord(part)) continue;\r\n if ((part.type === \"text\" || part.type === \"input_text\") && typeof part.text === \"string\") {\r\n parts.push({ type: \"text\", text: part.text });\r\n } else if (part.type === \"image_url\" && typeof part.imageUrl === \"string\") {\r\n parts.push({ type: \"image_url\", imageUrl: part.imageUrl });\r\n } else if (part.type === \"image_url\" && isRecord(part.image_url) && typeof part.image_url.url === \"string\") {\r\n parts.push({ type: \"image_url\", imageUrl: part.image_url.url });\r\n } else if (part.type === \"input_image\" && typeof part.image_url === \"string\") {\r\n parts.push({ type: \"image_url\", imageUrl: part.image_url });\r\n }\r\n }\r\n return parts.length ? parts : undefined;\r\n}\r\n\r\nfunction assertExclusiveInput(request: RuntimeRequest): void {\r\n const hasMessages = Array.isArray(request.messages) && request.messages.length > 0;\r\n if (hasMessages && request.input !== undefined) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Cloudflare chat, messages, and run accept messages or input, not both.\"\r\n );\r\n }\r\n}\r\n\r\nfunction compileFilePart(\r\n part: Extract<RuntimeMessage[\"content\"], readonly unknown[]>[number],\r\n dialect: \"responses\" | \"chat\"\r\n): Record<string, unknown> {\r\n if (part.type !== \"file\") {\r\n throw new AiDispatcherError(\"UNSUPPORTED_REQUEST_FIELD\", \"File content parts need a url or data.\");\r\n }\r\n if (!part.url && !part.data) {\r\n throw new AiDispatcherError(\"UNSUPPORTED_REQUEST_FIELD\", \"File content parts need a url or data.\");\r\n }\r\n if (dialect === \"responses\") {\r\n if (part.url) return clean({ type: \"input_file\", file_url: part.url, filename: part.fileName });\r\n return clean({ type: \"input_file\", file_data: part.data, filename: part.fileName });\r\n }\r\n return {\r\n type: \"file\",\r\n file: clean({\r\n filename: part.fileName,\r\n ...(part.url ? { url: part.url } : {}),\r\n ...(part.data ? { file_data: part.data } : {})\r\n })\r\n };\r\n}\r\n\r\nfunction anthropicImage(imageUrl: string): Record<string, unknown> {\r\n const data = dataUrl(imageUrl);\r\n if (data) return { type: \"image\", source: { type: \"base64\", media_type: data.mediaType, data: data.data } };\r\n return { type: \"image\", source: { type: \"url\", url: imageUrl } };\r\n}\r\n\r\nfunction anthropicFile(part: Extract<RuntimeMessage[\"content\"], readonly unknown[]>[number]): Record<string, unknown> {\r\n if (part.type !== \"file\" || (!part.url && !part.data)) {\r\n throw new AiDispatcherError(\"UNSUPPORTED_REQUEST_FIELD\", \"File content parts need a url or data.\");\r\n }\r\n if (part.url) {\r\n const data = dataUrl(part.url);\r\n if (data) return { type: \"document\", source: { type: \"base64\", media_type: data.mediaType, data: data.data } };\r\n return { type: \"document\", source: { type: \"url\", url: part.url } };\r\n }\r\n return {\r\n type: \"document\",\r\n source: {\r\n type: \"base64\",\r\n media_type: part.mimeType || \"application/octet-stream\",\r\n data: part.data\r\n }\r\n };\r\n}\r\n\r\nfunction dataUrl(value: string): { mediaType: string; data: string } | undefined {\r\n const match = /^data:([^;,]+);base64,([\\s\\S]+)$/i.exec(value);\r\n if (!match) return undefined;\r\n return { mediaType: match[1] ?? \"application/octet-stream\", data: match[2] ?? \"\" };\r\n}\r\n\r\nfunction compileResponsesTools(request: RuntimeRequest): unknown[] | undefined {\r\n const tools = request.functionTools ?? [];\r\n if (!tools.length || request.toolChoice === \"none\") return undefined;\r\n return tools.map((tool) => ({\r\n type: \"function\",\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: tool.parameters\r\n }));\r\n}\r\n\r\nfunction compileChatTools(request: RuntimeRequest): unknown[] | undefined {\r\n const tools = request.functionTools ?? [];\r\n if (!tools.length || request.toolChoice === \"none\") return undefined;\r\n return tools.map((tool) => ({\r\n type: \"function\",\r\n function: {\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: tool.parameters\r\n }\r\n }));\r\n}\r\n\r\nfunction compileAnthropicTools(request: RuntimeRequest): unknown[] | undefined {\r\n const tools = request.functionTools ?? [];\r\n if (!tools.length || request.toolChoice === \"none\") return undefined;\r\n return tools.map((tool) => ({\r\n name: tool.name,\r\n description: tool.description,\r\n input_schema: tool.parameters\r\n }));\r\n}\r\n\r\nfunction compileResponsesToolChoice(request: RuntimeRequest): unknown {\r\n if (!request.functionTools?.length || request.toolChoice === \"none\") return undefined;\r\n const choice = request.toolChoice;\r\n if (!choice || choice === \"auto\") return undefined;\r\n if (choice === \"required\") return \"required\";\r\n if (typeof choice === \"object\" && choice.type === \"function\") return { type: \"function\", name: choice.functionName };\r\n return undefined;\r\n}\r\n\r\nfunction compileChatToolChoice(request: RuntimeRequest): unknown {\r\n if (!request.functionTools?.length || request.toolChoice === \"none\") return undefined;\r\n const choice = request.toolChoice;\r\n if (!choice || choice === \"auto\") return undefined;\r\n if (choice === \"required\") return \"required\";\r\n if (typeof choice === \"object\" && choice.type === \"function\") {\r\n return { type: \"function\", function: { name: choice.functionName } };\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction compileAnthropicToolChoice(request: RuntimeRequest): unknown {\r\n if (!request.functionTools?.length || request.toolChoice === \"none\") return undefined;\r\n const choice = request.toolChoice;\r\n if (!choice || choice === \"auto\") return undefined;\r\n if (choice === \"required\") return { type: \"any\" };\r\n if (typeof choice === \"object\" && choice.type === \"function\") return { type: \"tool\", name: choice.functionName };\r\n return undefined;\r\n}\r\n\r\nfunction contentToText(content: RuntimeMessage[\"content\"]): string {\r\n if (typeof content === \"string\") return content;\r\n return content.map((part) => (part.type === \"text\" ? part.text : \"\")).filter(Boolean).join(\"\");\r\n}\r\n\r\nasync function runCloudflare(\r\n request: RuntimeRequest,\r\n options: ResolvedCloudflareOptions,\r\n call: ProviderCallOptions | undefined,\r\n requestId: string\r\n): Promise<RuntimeResponse> {\r\n const maxIterations = request.execution?.maxToolIterations ?? 8;\r\n const maxFunctionToolCalls = request.execution?.maxFunctionToolCalls ?? 20;\r\n const functionUsage: FunctionToolUsage[] = [];\r\n let active: CompiledCloudflareWire;\r\n try {\r\n active = compileCloudflareRequest(request, options, call, false);\r\n } catch (error) {\r\n if (error instanceof AiDispatcherError && isConfigError(error.code)) throw error;\r\n return failedResponse(request, requestId, error, \"chat\");\r\n }\r\n let response: unknown;\r\n\r\n try {\r\n for (let iteration = 0; iteration <= maxIterations; iteration += 1) {\r\n response = await sendWithRetries(active, options, timeoutFor(request, options));\r\n if (active.endpoint === \"run\" && !chatCalls(unwrap(response)).length) break;\r\n const calls = extractCalls(active.endpoint, response);\r\n if (!calls.length) break;\r\n if (!calls.every((item) => resolveExecutor(item.name, request, options))) {\r\n return normalizeCloudflareResponse({\r\n request,\r\n requestId,\r\n compiled: active,\r\n response,\r\n functionTools: [...functionUsage, ...calls],\r\n status: \"requires_action\"\r\n });\r\n }\r\n if (functionUsage.length + calls.length > maxFunctionToolCalls) {\r\n throw new AiDispatcherError(\"FUNCTION_TOOL_LIMIT\", \"maxFunctionToolCalls exceeded.\");\r\n }\r\n const results: FunctionToolUsage[] = [];\r\n for (const item of calls) results.push(await executeTool(item, request, options));\r\n functionUsage.push(...results);\r\n active = { ...active, body: continueBody(active, response, results) };\r\n }\r\n\r\n return normalizeCloudflareResponse({\r\n request,\r\n requestId,\r\n compiled: active,\r\n response,\r\n functionTools: functionUsage,\r\n status: \"completed\"\r\n });\r\n } catch (error) {\r\n if (error instanceof AiDispatcherError && isConfigError(error.code)) throw error;\r\n return failedResponse(request, requestId, error, responseApiMode(active.endpoint));\r\n }\r\n}\r\n\r\nfunction continueBody(\r\n compiled: CompiledCloudflareWire,\r\n response: unknown,\r\n results: FunctionToolUsage[]\r\n): Record<string, unknown> {\r\n if (compiled.endpoint === \"responses\") return continueResponses(compiled.body, response, results);\r\n if (compiled.endpoint === \"messages\") return continueMessages(compiled.body, response, results);\r\n if (compiled.endpoint === \"run\") return continueRun(compiled.body, response, results);\r\n return continueChat(compiled.body, response, results);\r\n}\r\n\r\nfunction continueResponses(\r\n body: Record<string, unknown>,\r\n response: unknown,\r\n results: FunctionToolUsage[]\r\n): Record<string, unknown> {\r\n const record = unwrap(response);\r\n return clean({\r\n ...body,\r\n tool_choice: \"auto\",\r\n previous_response_id: typeof record.id === \"string\" ? record.id : undefined,\r\n input: results.map(toFunctionCallOutput)\r\n });\r\n}\r\n\r\nfunction continueChat(\r\n body: Record<string, unknown>,\r\n response: unknown,\r\n results: FunctionToolUsage[]\r\n): Record<string, unknown> {\r\n const messages = Array.isArray(body.messages) ? [...body.messages] : [];\r\n const assistant = chatAssistantMessage(unwrap(response));\r\n if (assistant) messages.push(assistant);\r\n for (const result of results) {\r\n messages.push({\r\n role: \"tool\",\r\n tool_call_id: result.callId,\r\n content: outputText(result)\r\n });\r\n }\r\n return { ...body, messages, ...(body.tool_choice !== undefined ? { tool_choice: \"auto\" } : {}) };\r\n}\r\n\r\nfunction continueMessages(\r\n body: Record<string, unknown>,\r\n response: unknown,\r\n results: FunctionToolUsage[]\r\n): Record<string, unknown> {\r\n const messages = Array.isArray(body.messages) ? [...body.messages] : [];\r\n const record = unwrap(response);\r\n messages.push({ role: \"assistant\", content: Array.isArray(record.content) ? record.content : [] });\r\n messages.push({\r\n role: \"user\",\r\n content: results.map((result) => ({\r\n type: \"tool_result\",\r\n tool_use_id: result.callId,\r\n content: outputText(result),\r\n ...(result.status === \"failed\" ? { is_error: true } : {})\r\n }))\r\n });\r\n return { ...body, messages };\r\n}\r\n\r\nfunction continueRun(\r\n body: Record<string, unknown>,\r\n response: unknown,\r\n results: FunctionToolUsage[]\r\n): Record<string, unknown> {\r\n const input = isRecord(body.input) ? body.input : {};\r\n const continued = continueChat({ messages: input.messages }, response, results);\r\n return { ...body, input: { ...input, messages: continued.messages } };\r\n}\r\n\r\nfunction toFunctionCallOutput(result: FunctionToolUsage): Record<string, unknown> {\r\n return {\r\n type: \"function_call_output\",\r\n call_id: result.callId,\r\n output: outputText(result)\r\n };\r\n}\r\n\r\nfunction outputText(result: FunctionToolUsage): string {\r\n const output = result.status === \"completed\" ? result.result : { error: result.error };\r\n return typeof output === \"string\" ? output : JSON.stringify(output);\r\n}\r\n\r\nfunction resolveExecutor(\r\n name: string,\r\n request: RuntimeRequest,\r\n options: ResolvedCloudflareOptions\r\n): RuntimeToolExecutor | undefined {\r\n return request.functionTools?.find((tool) => tool.name === name)?.executor ?? options.tools?.[name];\r\n}\r\n\r\nasync function executeTool(\r\n call: FunctionToolUsage,\r\n request: RuntimeRequest,\r\n options: ResolvedCloudflareOptions\r\n): Promise<FunctionToolUsage> {\r\n const executor = resolveExecutor(call.name, request, options);\r\n if (!executor) return call;\r\n const started = Date.now();\r\n try {\r\n options.logger?.debug?.(\"runtime.function_tool.started\", { name: call.name, callId: call.callId });\r\n const result = await executor(call.args, {\r\n requestId: request.id ?? \"\",\r\n toolName: call.name,\r\n callId: call.callId,\r\n ...(request.metadata ? { metadata: request.metadata } : {})\r\n });\r\n const usage: FunctionToolUsage = {\r\n name: call.name,\r\n callId: call.callId,\r\n status: \"completed\",\r\n args: call.args,\r\n result,\r\n durationMs: Date.now() - started\r\n };\r\n options.logger?.debug?.(\"runtime.function_tool.completed\", { name: call.name, callId: call.callId });\r\n return usage;\r\n } catch (error) {\r\n const usage: FunctionToolUsage = {\r\n name: call.name,\r\n callId: call.callId,\r\n status: \"failed\",\r\n args: call.args,\r\n error: error instanceof Error ? error.message : String(error),\r\n durationMs: Date.now() - started\r\n };\r\n options.logger?.warn?.(\"runtime.function_tool.failed\", usage);\r\n return usage;\r\n }\r\n}\r\n\r\nasync function* streamCloudflare(\r\n request: RuntimeRequest,\r\n options: ResolvedCloudflareOptions,\r\n call?: ProviderCallOptions\r\n): AsyncGenerator<RuntimeStreamEvent> {\r\n const requestId = request.id ?? \"\";\r\n let compiled: CompiledCloudflareWire;\r\n try {\r\n compiled = compileCloudflareRequest(request, options, call, true);\r\n } catch (error) {\r\n yield errorEvent(requestId, error);\r\n throw error;\r\n }\r\n\r\n yield {\r\n type: \"stream.start\",\r\n requestId,\r\n data: {\r\n model: modelOf(compiled),\r\n apiMode: responseApiMode(compiled.endpoint),\r\n entrypoint: \"executeStreamingChat\"\r\n }\r\n };\r\n\r\n const controller = new AbortController();\r\n const timeout = setTimeout(() => controller.abort(), timeoutFor(request, options));\r\n let text = \"\";\r\n let reported = false;\r\n try {\r\n const response = await options.fetch(compiled.url, {\r\n method: \"POST\",\r\n headers: { ...compiled.headers, Accept: \"text/event-stream\" },\r\n body: JSON.stringify(compiled.body),\r\n signal: controller.signal\r\n });\r\n if (!response.ok) {\r\n const failure = await readFailure(response);\r\n reported = true;\r\n yield errorEvent(requestId, failure);\r\n throw failure;\r\n }\r\n for await (const event of parseSse(response)) {\r\n if (!isRecord(event)) continue;\r\n const catalogReasoning = call?.extractStreamReasoning?.(event);\r\n const reasoningText = catalogReasoning || reasoningDelta(event);\r\n if (reasoningText) yield { type: \"stream.reasoning.delta\", requestId, data: { text: reasoningText } };\r\n const delta = textDelta(event);\r\n if (delta) {\r\n text += delta;\r\n yield { type: \"stream.text.delta\", requestId, data: { text: delta } };\r\n }\r\n const toolDelta = toolCallDelta(event);\r\n if (toolDelta) yield { type: \"stream.tool_call.delta\", requestId, data: toolDelta };\r\n const usage = streamUsage(event);\r\n if (usage) yield { type: \"stream.usage\", requestId, data: { usage } };\r\n if (event.type === \"error\") {\r\n const failure = new AiDispatcherError(\r\n \"PROVIDER_REQUEST_FAILED\",\r\n typeof event.message === \"string\" ? event.message : \"Cloudflare stream returned an error event.\",\r\n event\r\n );\r\n reported = true;\r\n yield errorEvent(requestId, failure);\r\n throw failure;\r\n }\r\n }\r\n yield { type: \"stream.done\", requestId, data: { text, model: modelOf(compiled) } };\r\n } catch (error) {\r\n const failure = error instanceof Error && error.name === \"AbortError\"\r\n ? new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", \"Cloudflare request timed out.\")\r\n : error instanceof AiDispatcherError\r\n ? error\r\n : new AiDispatcherError(\r\n \"PROVIDER_GATEWAY_UNREACHABLE\",\r\n error instanceof Error ? error.message : \"Cloudflare request failed before receiving a response.\"\r\n );\r\n if (!reported) yield errorEvent(requestId, failure);\r\n throw failure;\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n}\r\n\r\nasync function sendWithRetries(\r\n compiled: CompiledCloudflareWire,\r\n options: ResolvedCloudflareOptions,\r\n timeoutMs: number\r\n): Promise<unknown> {\r\n let lastError: unknown;\r\n for (let attempt = 1; attempt <= options.maxAttempts; attempt += 1) {\r\n try {\r\n return await sendOnce(compiled, options, timeoutMs);\r\n } catch (error) {\r\n lastError = error;\r\n const retryable = error instanceof AiDispatcherError && error.code === \"PROVIDER_RETRYABLE\";\r\n if (!retryable || attempt >= options.maxAttempts) throw asTerminalError(error);\r\n await delay(Math.min(500 * 2 ** (attempt - 1), 5_000));\r\n }\r\n }\r\n throw lastError;\r\n}\r\n\r\nasync function sendOnce(\r\n compiled: CompiledCloudflareWire,\r\n options: ResolvedCloudflareOptions,\r\n timeoutMs: number\r\n): Promise<unknown> {\r\n const controller = new AbortController();\r\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\r\n try {\r\n const response = await options.fetch(compiled.url, {\r\n method: \"POST\",\r\n headers: compiled.headers,\r\n body: JSON.stringify(compiled.body),\r\n signal: controller.signal\r\n });\r\n if (!response.ok) throw await readFailure(response);\r\n const text = await response.text();\r\n const parsed: unknown = text ? JSON.parse(text) : {};\r\n if (isRecord(parsed) && parsed.success === false) {\r\n throw new AiDispatcherError(\r\n \"PROVIDER_REQUEST_FAILED\",\r\n messageFrom(parsed) ?? \"Cloudflare request failed.\",\r\n { body: parsed }\r\n );\r\n }\r\n return parsed;\r\n } catch (error) {\r\n if (error instanceof AiDispatcherError) throw error;\r\n if (error instanceof SyntaxError) {\r\n throw new AiDispatcherError(\"PROVIDER_REQUEST_FAILED\", \"Cloudflare returned a response that was not JSON.\");\r\n }\r\n if (error instanceof Error && error.name === \"AbortError\") {\r\n throw new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", \"Cloudflare request timed out.\");\r\n }\r\n throw new AiDispatcherError(\r\n \"PROVIDER_GATEWAY_UNREACHABLE\",\r\n error instanceof Error ? error.message : \"Cloudflare request failed before receiving a response.\"\r\n );\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n}\r\n\r\nasync function readFailure(response: Response): Promise<AiDispatcherError> {\r\n const text = await response.text();\r\n let body: unknown = text;\r\n try {\r\n body = text ? JSON.parse(text) : undefined;\r\n } catch {\r\n body = text;\r\n }\r\n const message = messageFrom(body) ?? `Cloudflare request failed with status ${response.status}.`;\r\n const retryable = response.status === 429 || response.status === 408 || response.status >= 500;\r\n return new AiDispatcherError(classifyStatus(response.status), message, {\r\n status: response.status,\r\n body,\r\n retryable\r\n });\r\n}\r\n\r\nfunction classifyStatus(status: number): string {\r\n if (status === 401 || status === 403) return \"PROVIDER_AUTH_FAILED\";\r\n if (status === 404) return \"PROVIDER_MODEL_NOT_FOUND\";\r\n if (status === 429 || status === 408 || status >= 500) return \"PROVIDER_RETRYABLE\";\r\n return \"PROVIDER_REQUEST_FAILED\";\r\n}\r\n\r\nfunction isConfigError(code: string): boolean {\r\n return code === \"CLOUDFLARE_API_TOKEN_MISSING\"\r\n || code === \"CLOUDFLARE_ACCOUNT_ID_MISSING\"\r\n || code === \"MODEL_REQUIRED\"\r\n || code === \"INPUT_REQUIRED\"\r\n || code === \"UNSUPPORTED_REQUEST_FIELD\";\r\n}\r\n\r\nfunction asTerminalError(error: unknown): AiDispatcherError {\r\n if (error instanceof AiDispatcherError && error.code === \"PROVIDER_RETRYABLE\") {\r\n const status = isRecord(error.details) ? error.details.status : undefined;\r\n if (status === 429) return new AiDispatcherError(\"PROVIDER_RATE_LIMITED\", error.message, error.details);\r\n return new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", error.message, error.details);\r\n }\r\n if (error instanceof AiDispatcherError) return error;\r\n return new AiDispatcherError(\"PROVIDER_REQUEST_FAILED\", error instanceof Error ? error.message : String(error));\r\n}\r\n\r\nfunction normalizeCloudflareResponse(params: {\r\n request: RuntimeRequest;\r\n requestId: string;\r\n compiled: CompiledCloudflareWire;\r\n response: unknown;\r\n functionTools?: FunctionToolUsage[];\r\n status?: RuntimeResponse[\"status\"];\r\n}): RuntimeResponse {\r\n const payload = unwrap(params.response);\r\n const calls = params.functionTools ?? extractCalls(params.compiled.endpoint, params.response);\r\n const usage = normalizeUsage(payload.usage) ?? normalizeUsage(isRecord(params.response) ? params.response.usage : undefined);\r\n const status = params.status ?? (calls.length ? \"requires_action\" : \"completed\");\r\n return {\r\n id: typeof payload.id === \"string\" ? payload.id : params.requestId,\r\n status,\r\n apiMode: responseApiMode(params.compiled.endpoint),\r\n model: typeof payload.model === \"string\" ? payload.model : modelOf(params.compiled),\r\n text: answerText(payload),\r\n citations: [],\r\n images: [],\r\n patches: [],\r\n toolUsage: emptyToolUsage(calls),\r\n ...(usage ? { usage } : {}),\r\n warnings: params.compiled.warnings,\r\n errors: [],\r\n raw: { request: params.compiled.body, response: params.response },\r\n ...(params.request.metadata ? { metadata: params.request.metadata } : {})\r\n };\r\n}\r\n\r\nfunction responseApiMode(endpoint: CloudflareEndpoint): \"chat\" | \"responses\" {\r\n return endpoint === \"responses\" ? \"responses\" : \"chat\";\r\n}\r\n\r\nfunction answerText(response: Record<string, unknown>): string {\r\n if (typeof response.output_text === \"string\") return response.output_text;\r\n if (typeof response.text === \"string\" && !Array.isArray(response.choices) && !Array.isArray(response.content)) {\r\n return response.text;\r\n }\r\n const responses = responsesAnswer(response);\r\n if (responses) return responses;\r\n const chat = chatAnswer(response);\r\n if (chat) return chat;\r\n const anthropic = anthropicAnswer(response);\r\n if (anthropic) return anthropic;\r\n if (isRecord(response.result)) return answerText(response.result);\r\n return \"\";\r\n}\r\n\r\nfunction responsesAnswer(response: Record<string, unknown>): string {\r\n if (!Array.isArray(response.output)) return \"\";\r\n const parts: string[] = [];\r\n for (const item of response.output) {\r\n if (!isRecord(item) || item.type !== \"message\" || !Array.isArray(item.content)) continue;\r\n for (const part of item.content) {\r\n if (isRecord(part) && part.type === \"output_text\" && typeof part.text === \"string\") parts.push(part.text);\r\n }\r\n }\r\n return parts.join(\"\");\r\n}\r\n\r\nfunction chatAnswer(response: Record<string, unknown>): string {\r\n const message = chatAssistantMessage(response);\r\n if (!message) return \"\";\r\n const content = message.content;\r\n if (typeof content === \"string\") return content;\r\n if (!Array.isArray(content)) return \"\";\r\n return content\r\n .map((part) => (isRecord(part) && typeof part.text === \"string\" ? part.text : \"\"))\r\n .filter(Boolean)\r\n .join(\"\");\r\n}\r\n\r\nfunction anthropicAnswer(response: Record<string, unknown>): string {\r\n if (!Array.isArray(response.content)) return \"\";\r\n return response.content\r\n .map((part) => (isRecord(part) && part.type === \"text\" && typeof part.text === \"string\" ? part.text : \"\"))\r\n .filter(Boolean)\r\n .join(\"\");\r\n}\r\n\r\nfunction chatAssistantMessage(response: Record<string, unknown>): Record<string, unknown> | undefined {\r\n if (!Array.isArray(response.choices) || !isRecord(response.choices[0])) return undefined;\r\n const message = response.choices[0].message;\r\n return isRecord(message) ? message : undefined;\r\n}\r\n\r\nfunction extractCalls(endpoint: CloudflareEndpoint, response: unknown): FunctionToolUsage[] {\r\n const record = unwrap(response);\r\n if (endpoint === \"responses\") return responsesCalls(record);\r\n if (endpoint === \"messages\") return anthropicCalls(record);\r\n return chatCalls(record);\r\n}\r\n\r\nfunction responsesCalls(response: Record<string, unknown>): FunctionToolUsage[] {\r\n if (!Array.isArray(response.output)) return [];\r\n const calls: FunctionToolUsage[] = [];\r\n for (const item of response.output) {\r\n if (!isRecord(item) || item.type !== \"function_call\") continue;\r\n calls.push(callUsage(\r\n typeof item.name === \"string\" ? item.name : \"function\",\r\n typeof item.call_id === \"string\" ? item.call_id : \"function\",\r\n item.arguments\r\n ));\r\n }\r\n return calls;\r\n}\r\n\r\nfunction chatCalls(response: Record<string, unknown>): FunctionToolUsage[] {\r\n const message = chatAssistantMessage(response);\r\n if (!message || !Array.isArray(message.tool_calls)) return [];\r\n const calls: FunctionToolUsage[] = [];\r\n for (const item of message.tool_calls) {\r\n if (!isRecord(item) || !isRecord(item.function)) continue;\r\n const name = typeof item.function.name === \"string\" ? item.function.name : \"function\";\r\n calls.push(callUsage(\r\n name,\r\n typeof item.id === \"string\" ? item.id : name,\r\n item.function.arguments\r\n ));\r\n }\r\n return calls;\r\n}\r\n\r\nfunction anthropicCalls(response: Record<string, unknown>): FunctionToolUsage[] {\r\n if (!Array.isArray(response.content)) return [];\r\n const calls: FunctionToolUsage[] = [];\r\n for (const item of response.content) {\r\n if (!isRecord(item) || item.type !== \"tool_use\") continue;\r\n const name = typeof item.name === \"string\" ? item.name : \"function\";\r\n calls.push({\r\n name,\r\n callId: typeof item.id === \"string\" ? item.id : name,\r\n status: \"completed\",\r\n args: item.input\r\n });\r\n }\r\n return calls;\r\n}\r\n\r\nfunction callUsage(name: string, callId: string, rawArgs: unknown): FunctionToolUsage {\r\n let args = rawArgs;\r\n if (typeof rawArgs === \"string\") {\r\n try {\r\n args = JSON.parse(rawArgs);\r\n } catch {\r\n args = rawArgs;\r\n }\r\n }\r\n return { name, callId, status: \"completed\", args };\r\n}\r\n\r\nfunction emptyToolUsage(calls: FunctionToolUsage[]): RuntimeToolUsage {\r\n const unused = { requested: false, required: false, used: false };\r\n return {\r\n serverTools: {\r\n webSearch: unused,\r\n webFetch: unused,\r\n datetime: unused,\r\n imageGeneration: unused,\r\n applyPatch: unused,\r\n fusion: unused,\r\n advisor: unused,\r\n subagent: unused\r\n },\r\n functionTools: calls\r\n };\r\n}\r\n\r\nfunction normalizeUsage(usage: unknown): RuntimeResponse[\"usage\"] | undefined {\r\n if (!isRecord(usage)) return undefined;\r\n const inputTokens = numberValue(usage.input_tokens) ?? numberValue(usage.prompt_tokens);\r\n const outputTokens = numberValue(usage.output_tokens) ?? numberValue(usage.completion_tokens);\r\n const totalTokens = numberValue(usage.total_tokens) ?? (\r\n inputTokens !== undefined || outputTokens !== undefined ? (inputTokens ?? 0) + (outputTokens ?? 0) : undefined\r\n );\r\n if (inputTokens === undefined && outputTokens === undefined && totalTokens === undefined) return { raw: usage };\r\n return {\r\n raw: usage,\r\n ...(inputTokens !== undefined ? { inputTokens } : {}),\r\n ...(outputTokens !== undefined ? { outputTokens } : {}),\r\n ...(totalTokens !== undefined ? { totalTokens } : {})\r\n };\r\n}\r\n\r\nfunction failedResponse(\r\n request: RuntimeRequest,\r\n requestId: string,\r\n error: unknown,\r\n apiMode: \"chat\" | \"responses\"\r\n): RuntimeResponse {\r\n const normalized = error instanceof AiDispatcherError\r\n ? error\r\n : new AiDispatcherError(\"PROVIDER_REQUEST_FAILED\", error instanceof Error ? error.message : String(error));\r\n return {\r\n id: requestId,\r\n status: \"failed\",\r\n apiMode,\r\n model: request.model ?? \"\",\r\n text: \"\",\r\n citations: [],\r\n images: [],\r\n patches: [],\r\n toolUsage: emptyToolUsage([]),\r\n warnings: [],\r\n errors: [{\r\n code: normalized.code,\r\n message: normalized.message,\r\n source: \"runtime\",\r\n details: normalized.details\r\n }],\r\n raw: { request, response: undefined }\r\n };\r\n}\r\n\r\nfunction errorEvent(requestId: string, error: unknown): RuntimeStreamEvent {\r\n const normalized = error instanceof AiDispatcherError\r\n ? error\r\n : new AiDispatcherError(\"PROVIDER_REQUEST_FAILED\", error instanceof Error ? error.message : String(error));\r\n return {\r\n type: \"stream.error\",\r\n requestId,\r\n data: {\r\n error: {\r\n code: normalized.code,\r\n message: normalized.message,\r\n source: \"runtime\",\r\n details: normalized.details\r\n }\r\n }\r\n };\r\n}\r\n\r\nfunction textDelta(event: Record<string, unknown>): string | undefined {\r\n if (event.type === \"response.output_text.delta\" && typeof event.delta === \"string\" && event.delta) return event.delta;\r\n if (event.type === \"content_block_delta\" && isRecord(event.delta) && event.delta.type === \"text_delta\" && typeof event.delta.text === \"string\" && event.delta.text) {\r\n return event.delta.text;\r\n }\r\n const choice = firstChoiceDelta(event);\r\n if (choice && typeof choice.content === \"string\" && choice.content) return choice.content;\r\n return undefined;\r\n}\r\n\r\nfunction reasoningDelta(event: Record<string, unknown>): string | undefined {\r\n if (event.type === \"response.reasoning_summary_text.delta\" && typeof event.delta === \"string\" && event.delta) return event.delta;\r\n if (event.type === \"content_block_delta\" && isRecord(event.delta) && event.delta.type === \"thinking_delta\" && typeof event.delta.thinking === \"string\" && event.delta.thinking) {\r\n return event.delta.thinking;\r\n }\r\n const choice = firstChoiceDelta(event);\r\n if (!choice) return undefined;\r\n if (typeof choice.reasoning === \"string\" && choice.reasoning) return choice.reasoning;\r\n if (typeof choice.reasoning_content === \"string\" && choice.reasoning_content) return choice.reasoning_content;\r\n return undefined;\r\n}\r\n\r\nfunction toolCallDelta(event: Record<string, unknown>): { index: number; name?: string; argumentsDelta?: string } | undefined {\r\n if (event.type === \"response.function_call_arguments.delta\" && typeof event.delta === \"string\") {\r\n return {\r\n index: 0,\r\n ...(typeof event.name === \"string\" ? { name: event.name } : {}),\r\n argumentsDelta: event.delta\r\n };\r\n }\r\n if (event.type === \"content_block_delta\" && isRecord(event.delta) && event.delta.type === \"input_json_delta\" && typeof event.delta.partial_json === \"string\") {\r\n return { index: typeof event.index === \"number\" ? event.index : 0, argumentsDelta: event.delta.partial_json };\r\n }\r\n const choice = firstChoiceDelta(event);\r\n if (!choice || !Array.isArray(choice.tool_calls) || !isRecord(choice.tool_calls[0])) return undefined;\r\n const tool = choice.tool_calls[0];\r\n const fn = isRecord(tool.function) ? tool.function : undefined;\r\n const args = fn && typeof fn.arguments === \"string\" ? fn.arguments : undefined;\r\n if (!args && !(fn && typeof fn.name === \"string\")) return undefined;\r\n return {\r\n index: typeof tool.index === \"number\" ? tool.index : 0,\r\n ...(fn && typeof fn.name === \"string\" ? { name: fn.name } : {}),\r\n ...(args ? { argumentsDelta: args } : {})\r\n };\r\n}\r\n\r\nfunction streamUsage(event: Record<string, unknown>): RuntimeResponse[\"usage\"] | undefined {\r\n if (event.type === \"response.completed\" && isRecord(event.response)) return normalizeUsage(event.response.usage);\r\n if (isRecord(event.usage)) return normalizeUsage(event.usage);\r\n return undefined;\r\n}\r\n\r\nfunction firstChoiceDelta(event: Record<string, unknown>): Record<string, unknown> | undefined {\r\n if (!Array.isArray(event.choices) || !isRecord(event.choices[0])) return undefined;\r\n const delta = event.choices[0].delta;\r\n return isRecord(delta) ? delta : undefined;\r\n}\r\n\r\nfunction unwrap(response: unknown): Record<string, unknown> {\r\n if (!isRecord(response)) return {};\r\n if (response.success === true && isRecord(response.result)) return response.result;\r\n return response;\r\n}\r\n\r\nfunction modelOf(compiled: CompiledCloudflareWire): string {\r\n if (typeof compiled.body.model === \"string\") return compiled.body.model;\r\n return \"\";\r\n}\r\n\r\nfunction messageFrom(body: unknown): string | undefined {\r\n if (!isRecord(body)) return undefined;\r\n if (typeof body.message === \"string\") return body.message;\r\n if (isRecord(body.error) && typeof body.error.message === \"string\") return body.error.message;\r\n if (Array.isArray(body.errors)) {\r\n for (const error of body.errors) {\r\n if (isRecord(error) && typeof error.message === \"string\") return error.message;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction numberValue(value: unknown): number | undefined {\r\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\r\n}\r\n\r\nfunction applyProviderRecord(\r\n body: Record<string, unknown>,\r\n metadata: Record<string, string> | undefined\r\n): Record<string, unknown> {\r\n if (metadata) return { ...body, metadata };\r\n if (body.metadata === undefined) return body;\r\n const rest = { ...body };\r\n delete rest.metadata;\r\n return rest;\r\n}\r\n\r\nfunction overlayMetadata(\r\n base: Record<string, unknown> | undefined,\r\n extra: Record<string, unknown> | undefined\r\n): Record<string, unknown> | undefined {\r\n if (!base) return extra;\r\n if (!extra) return base;\r\n return { ...base, ...extra };\r\n}\r\n\r\nfunction endpointUrl(options: ResolvedCloudflareOptions, endpoint: CloudflareEndpoint): string {\r\n const account = encodeURIComponent(options.accountId);\r\n const root = `${options.baseUrl}/accounts/${account}/ai`;\r\n if (endpoint === \"chat\") return `${root}/v1/chat/completions`;\r\n if (endpoint === \"responses\") return `${root}/v1/responses`;\r\n if (endpoint === \"messages\") return `${root}/v1/messages`;\r\n return `${root}/run`;\r\n}\r\n\r\nfunction buildHeaders(\r\n options: ResolvedCloudflareOptions,\r\n call: CloudflareCallContext | undefined,\r\n model: string,\r\n metadata: Record<string, string> | undefined\r\n): Record<string, string> {\r\n const gatewayId = call?.gatewayId?.trim() || options.gatewayId?.trim() || (isWorkersModel(model) ? DEFAULT_GATEWAY_ID : undefined);\r\n const gateway = mergeGateway(options.gateway, call?.gateway);\r\n const cache = call?.cache;\r\n const skip = gateway?.skipCache !== undefined ? gateway.skipCache : cache?.skip === true ? true : undefined;\r\n const ttl = gateway?.cacheTtlSeconds ?? cache?.ttlSeconds;\r\n const key = gateway?.cacheKey ?? cache?.key;\r\n return clean({\r\n \"content-type\": \"application/json\",\r\n authorization: `Bearer ${options.apiToken}`,\r\n ...(gatewayId ? { \"cf-aig-gateway-id\": gatewayId } : {}),\r\n ...(skip !== undefined ? { \"cf-aig-skip-cache\": String(skip) } : {}),\r\n ...(ttl !== undefined ? { \"cf-aig-cache-ttl\": String(ttl) } : {}),\r\n ...(key ? { \"cf-aig-cache-key\": key } : {}),\r\n ...(gateway?.collectLog !== undefined ? { \"cf-aig-collect-log\": String(gateway.collectLog) } : {}),\r\n ...(gateway?.requestTimeoutMs !== undefined ? { \"cf-aig-request-timeout\": String(gateway.requestTimeoutMs) } : {}),\r\n ...(gateway?.maxGatewayAttempts !== undefined ? { \"cf-aig-max-attempts\": String(gateway.maxGatewayAttempts) } : {}),\r\n ...(gateway?.retryDelayMs !== undefined ? { \"cf-aig-retry-delay\": String(gateway.retryDelayMs) } : {}),\r\n ...(isBackoff(gateway?.backoff) ? { \"cf-aig-backoff\": gateway.backoff } : {}),\r\n ...(metadata ? { \"cf-aig-metadata\": JSON.stringify(metadata) } : {})\r\n });\r\n}\r\n\r\nfunction mergeGateway(\r\n base: CloudflareGatewayControls | undefined,\r\n over: CloudflareGatewayControls | undefined\r\n): CloudflareGatewayControls | undefined {\r\n if (!base && !over) return undefined;\r\n return { ...base, ...over };\r\n}\r\n\r\nfunction isBackoff(value: string | undefined): value is \"constant\" | \"linear\" | \"exponential\" {\r\n return value === \"constant\" || value === \"linear\" || value === \"exponential\";\r\n}\r\n\r\nfunction isWorkersModel(model: string): boolean {\r\n return model.trim().toLowerCase().startsWith(\"@cf/\");\r\n}\r\n\r\nfunction isBareOpenAiModel(id: string): boolean {\r\n return /^(gpt|o[134])(?:[.\\-:]|$)/i.test(id.trim());\r\n}\r\n\r\nfunction timeoutFor(request: RuntimeRequest, options: ResolvedCloudflareOptions): number {\r\n return request.execution?.timeoutMs ?? options.timeoutMs;\r\n}\r\n\r\nfunction delay(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nasync function* parseSse(response: Response): AsyncGenerator<unknown> {\r\n const body = response.body;\r\n if (!body) throw new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", \"Cloudflare stream response had no body.\");\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = \"\";\r\n while (true) {\r\n const chunk = await reader.read();\r\n if (chunk.done) break;\r\n buffer += decoder.decode(chunk.value, { stream: true });\r\n const parts = buffer.split(\"\\n\\n\");\r\n buffer = parts.pop() ?? \"\";\r\n for (const part of parts) {\r\n const parsed = parseSsePart(part);\r\n if (parsed !== undefined) yield parsed;\r\n }\r\n }\r\n const trailing = parseSsePart(buffer);\r\n if (trailing !== undefined) yield trailing;\r\n}\r\n\r\nfunction parseSsePart(part: string): unknown | undefined {\r\n const data = part\r\n .split(\"\\n\")\r\n .filter((line) => line.startsWith(\"data:\"))\r\n .map((line) => line.slice(5).trim())\r\n .join(\"\\n\");\r\n if (!data || data === \"[DONE]\") return undefined;\r\n try {\r\n return JSON.parse(data) as unknown;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\ninterface ResolvedCloudflareOptions {\r\n apiToken: string;\r\n accountId: string;\r\n baseUrl: string;\r\n defaultModel?: string;\r\n endpoint?: CloudflareEndpointChoice;\r\n gatewayId?: string;\r\n gateway?: CloudflareGatewayControls;\r\n timeoutMs: number;\r\n maxAttempts: number;\r\n fetch: typeof globalThis.fetch;\r\n tools?: Record<string, RuntimeToolExecutor>;\r\n logger?: RuntimeLogger;\r\n metadataPacker?: MetadataPacker;\r\n}\r\n\r\nfunction resolveCloudflareOptions(options: CloudflareRuntimeOptions, packer?: MetadataPacker): ResolvedCloudflareOptions {\r\n const {\r\n apiToken,\r\n accountId,\r\n baseUrl,\r\n defaultModel,\r\n endpoint,\r\n gatewayId,\r\n timeoutMs,\r\n maxAttempts,\r\n fetch,\r\n tools,\r\n logger,\r\n run,\r\n ...gateway\r\n } = options;\r\n void run;\r\n return {\r\n apiToken: apiToken ?? readEnv(\"CLOUDFLARE_API_TOKEN\") ?? \"\",\r\n accountId: accountId ?? readEnv(\"CLOUDFLARE_ACCOUNT_ID\") ?? \"\",\r\n baseUrl: (baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\"),\r\n ...(defaultModel ? { defaultModel } : {}),\r\n ...(endpoint ? { endpoint } : {}),\r\n ...(gatewayId ? { gatewayId } : {}),\r\n ...(hasGateway(gateway) ? { gateway } : {}),\r\n timeoutMs: timeoutMs ?? DEFAULT_TIMEOUT_MS,\r\n maxAttempts: maxAttempts ?? 2,\r\n fetch: fetch ?? globalThis.fetch,\r\n ...(tools ? { tools } : {}),\r\n ...(logger ? { logger } : {}),\r\n ...(packer ? { metadataPacker: packer } : {})\r\n };\r\n}\r\n\r\nfunction hasGateway(gateway: CloudflareGatewayControls): boolean {\r\n return Object.values(gateway).some((value) => value !== undefined);\r\n}\r\n\r\nfunction clean<T extends Record<string, unknown>>(body: T): T {\r\n return Object.fromEntries(Object.entries(body).filter(([, value]) => value !== undefined)) as T;\r\n}\r\n\r\nfunction readEnv(name: string): string | undefined {\r\n if (typeof process === \"undefined\") return undefined;\r\n return process.env[name];\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n","import {\r\n createBedrockRuntime,\r\n type BedrockRuntime,\r\n type BedrockRuntimeOptions,\r\n type CompiledBedrockRequest,\r\n type RuntimeRequest as BedrockRuntimeRequest\r\n} from \"@x12i/bedrock-runtime\";\r\nimport type { RuntimeRequest, RuntimeResponse, RuntimeStreamEvent } from \"@x12i/openrouter-runtime\";\r\nimport { AiDispatcherError } from \"../errors\";\r\nimport type { AiProviderAdapter, ProviderCallOptions } from \"../types/public\";\r\n\r\n/**\r\n * Maps the dispatcher request into `@x12i/bedrock-runtime` and passes catalog body\r\n * fields through `finalizeBody` so they survive Converse compilation.\r\n */\r\nexport function createBedrockProviderAdapter(\r\n options: BedrockRuntimeOptions = {}\r\n): AiProviderAdapter {\r\n const runtime: BedrockRuntime = createBedrockRuntime(options);\r\n\r\n return {\r\n run(request: RuntimeRequest, call?: ProviderCallOptions): Promise<RuntimeResponse> {\r\n return runtime.run(toBedrockRequest(request), toCall(call)) as unknown as Promise<RuntimeResponse>;\r\n },\r\n executeStreamingChat(request: RuntimeRequest, call?: ProviderCallOptions): AsyncIterable<RuntimeStreamEvent> {\r\n return runtime.executeStreamingChat(\r\n toBedrockRequest(request),\r\n toCall(call)\r\n ) as unknown as AsyncIterable<RuntimeStreamEvent>;\r\n },\r\n compile(request: RuntimeRequest, call?: ProviderCallOptions): CompiledBedrockRequest {\r\n return runtime.compile(toBedrockRequest(request), toCall(call));\r\n }\r\n };\r\n}\r\n\r\nfunction toCall(call?: ProviderCallOptions) {\r\n if (!call) return undefined;\r\n return {\r\n ...(call.finalizeBody ? { finalizeBody: call.finalizeBody } : {}),\r\n ...(call.extractStreamReasoning ? { extractStreamReasoning: call.extractStreamReasoning } : {})\r\n };\r\n}\r\n\r\nfunction toBedrockRequest(request: RuntimeRequest): BedrockRuntimeRequest {\r\n assertBedrockSupported(request);\r\n const mapped: BedrockRuntimeRequest = {};\r\n if (request.id !== undefined) mapped.id = request.id;\r\n if (request.model !== undefined) mapped.model = request.model;\r\n\r\n const hasMessages = Array.isArray(request.messages) && request.messages.length > 0;\r\n if (hasMessages) {\r\n mapped.messages = request.messages as NonNullable<BedrockRuntimeRequest[\"messages\"]>;\r\n } else if (Array.isArray(request.input)) {\r\n mapped.messages = inputItemsToMessages(request.input);\r\n }\r\n\r\n const system = request.system?.trim() ? request.system : request.instructions;\r\n if (system !== undefined) mapped.system = system;\r\n if (request.prompt !== undefined) mapped.prompt = request.prompt;\r\n else if (!hasMessages && !Array.isArray(request.input) && typeof request.input === \"string\") {\r\n mapped.prompt = request.input;\r\n }\r\n if (request.temperature !== undefined) mapped.temperature = request.temperature;\r\n if (request.maxTokens !== undefined) mapped.maxTokens = request.maxTokens;\r\n if (request.functionTools !== undefined) {\r\n mapped.functionTools = request.functionTools as NonNullable<BedrockRuntimeRequest[\"functionTools\"]>;\r\n }\r\n if (request.toolChoice !== undefined && isBedrockToolChoice(request.toolChoice)) {\r\n mapped.toolChoice = request.toolChoice;\r\n }\r\n if (request.execution !== undefined) {\r\n mapped.execution = {\r\n ...(request.execution.maxToolIterations !== undefined\r\n ? { maxToolIterations: request.execution.maxToolIterations }\r\n : {}),\r\n ...(request.execution.maxFunctionToolCalls !== undefined\r\n ? { maxFunctionToolCalls: request.execution.maxFunctionToolCalls }\r\n : {}),\r\n ...(request.execution.timeoutMs !== undefined\r\n ? { timeoutMs: request.execution.timeoutMs }\r\n : {})\r\n };\r\n }\r\n if (request.agentId !== undefined) mapped.agentId = request.agentId;\r\n if (request.metadata !== undefined) mapped.metadata = request.metadata;\r\n return mapped;\r\n}\r\n\r\nfunction assertBedrockSupported(request: RuntimeRequest): void {\r\n if (request.serverTools && serverToolsEnabled(request.serverTools)) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Bedrock does not support OpenRouter server tools.\"\r\n );\r\n }\r\n if (request.responseFormat !== undefined) {\r\n throw new AiDispatcherError(\"UNSUPPORTED_REQUEST_FIELD\", \"Bedrock does not accept responseFormat.\");\r\n }\r\n if (request.rawOpenRouterOverrides !== undefined) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"rawOpenRouterOverrides cannot be sent to Bedrock.\"\r\n );\r\n }\r\n if (request.apiMode !== undefined) {\r\n throw new AiDispatcherError(\"UNSUPPORTED_REQUEST_FIELD\", \"Bedrock does not accept apiMode.\");\r\n }\r\n if (request.toolChoice && typeof request.toolChoice === \"object\" && request.toolChoice.type === \"server_tool\") {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Bedrock does not support OpenRouter server tool choices.\"\r\n );\r\n }\r\n if (hasMessages(request) && Array.isArray(request.input)) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Bedrock accepts messages or input items, not both.\"\r\n );\r\n }\r\n}\r\n\r\nfunction hasMessages(request: RuntimeRequest): boolean {\r\n return Array.isArray(request.messages) && request.messages.length > 0;\r\n}\r\n\r\nfunction serverToolsEnabled(policy: NonNullable<RuntimeRequest[\"serverTools\"]>): boolean {\r\n return Object.values(policy).some((value) => {\r\n if (Array.isArray(value)) return value.some((item) => isEnabledMode(item));\r\n return isEnabledMode(value);\r\n });\r\n}\r\n\r\nfunction isEnabledMode(value: unknown): boolean {\r\n return typeof value === \"object\" && value !== null && \"mode\" in value && (value as { mode?: string }).mode !== \"disabled\";\r\n}\r\n\r\nfunction inputItemsToMessages(\r\n items: Array<Record<string, unknown> | string>\r\n): NonNullable<BedrockRuntimeRequest[\"messages\"]> {\r\n return items.map((item) => {\r\n if (typeof item === \"string\") return { role: \"user\", content: item };\r\n const role = item.role;\r\n if ((role !== \"system\" && role !== \"user\" && role !== \"assistant\" && role !== \"tool\") || !hasContent(item.content)) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Bedrock input items must be text or messages with role and content.\"\r\n );\r\n }\r\n return {\r\n role,\r\n content: item.content as NonNullable<BedrockRuntimeRequest[\"messages\"]>[number][\"content\"],\r\n ...(typeof item.name === \"string\" ? { name: item.name } : {}),\r\n ...(typeof item.toolCallId === \"string\" ? { toolCallId: item.toolCallId } : {})\r\n };\r\n });\r\n}\r\n\r\nfunction hasContent(content: unknown): boolean {\r\n return typeof content === \"string\" || Array.isArray(content);\r\n}\r\n\r\nfunction isBedrockToolChoice(\r\n toolChoice: RuntimeRequest[\"toolChoice\"]\r\n): toolChoice is NonNullable<BedrockRuntimeRequest[\"toolChoice\"]> {\r\n if (toolChoice === undefined) return false;\r\n if (toolChoice === \"auto\" || toolChoice === \"none\" || toolChoice === \"required\") return true;\r\n if (typeof toolChoice === \"object\" && toolChoice.type === \"function\") return true;\r\n return false;\r\n}\r\n","import {\r\n packProviderRecord,\r\n type RuntimeMessage,\r\n type RuntimeRequest,\r\n type RuntimeResponse,\r\n type RuntimeStreamEvent,\r\n type RuntimeLogger,\r\n type RuntimeToolExecutor,\r\n type RuntimeToolUsage,\r\n type RuntimeWarning\r\n} from \"@x12i/openrouter-runtime\";\r\nimport { AiDispatcherError } from \"../errors\";\r\n\r\ntype FunctionToolUsage = RuntimeToolUsage[\"functionTools\"][number];\r\nimport type { ProviderCallOptions } from \"../types/public\";\r\nimport type { MetadataPacker } from \"@x12i/provider-metadata\";\r\nimport type { OpenAiRuntimeOptions } from \"../types/openai\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://api.openai.com/v1\";\r\nconst DEFAULT_TIMEOUT_MS = 120_000;\r\n\r\nexport interface CompiledOpenAiWire {\r\n url: string;\r\n headers: Record<string, string>;\r\n body: Record<string, unknown>;\r\n warnings: RuntimeWarning[];\r\n}\r\n\r\nexport function createOpenAiProviderAdapter(options: OpenAiRuntimeOptions = {}, packer?: MetadataPacker) {\r\n const resolved = resolveOpenAiOptions(options, packer);\r\n\r\n return {\r\n compile(request: RuntimeRequest, call?: ProviderCallOptions): CompiledOpenAiWire {\r\n return compileOpenAiRequest(request, resolved, call, false);\r\n },\r\n async run(request: RuntimeRequest, call?: ProviderCallOptions): Promise<RuntimeResponse> {\r\n const requestId = request.id ?? \"openai\";\r\n try {\r\n return await runOpenAi(request, resolved, call, requestId);\r\n } catch (error) {\r\n if (error instanceof AiDispatcherError && isConfigError(error.code)) throw error;\r\n return failedResponse(request, requestId, error);\r\n }\r\n },\r\n executeStreamingChat(request: RuntimeRequest, call?: ProviderCallOptions): AsyncIterable<RuntimeStreamEvent> {\r\n return streamOpenAi(request, resolved, call);\r\n }\r\n };\r\n}\r\n\r\nfunction compileOpenAiRequest(\r\n request: RuntimeRequest,\r\n options: ResolvedOpenAiOptions,\r\n call: ProviderCallOptions | undefined,\r\n streaming: boolean\r\n): CompiledOpenAiWire {\r\n assertSupported(request);\r\n const model = (request.model ?? options.defaultModel ?? \"\").trim();\r\n if (!model) {\r\n throw new AiDispatcherError(\r\n \"MODEL_REQUIRED\",\r\n \"A model id is required. Set request.model or openai.defaultModel.\"\r\n );\r\n }\r\n if (!options.apiKey) {\r\n throw new AiDispatcherError(\r\n \"OPENAI_API_KEY_MISSING\",\r\n \"OpenAI API key is required. Set openai.apiKey or OPENAI_API_KEY.\"\r\n );\r\n }\r\n\r\n const instructions = compileInstructions(request);\r\n const input = compileInput(request);\r\n if (input === undefined) {\r\n throw new AiDispatcherError(\"INPUT_REQUIRED\", \"Provide request.messages, request.input, or request.prompt.\");\r\n }\r\n\r\n let body: Record<string, unknown> = clean({\r\n model,\r\n input,\r\n instructions,\r\n temperature: request.temperature,\r\n max_output_tokens: request.maxTokens,\r\n reasoning: request.reasoning,\r\n text: request.responseFormat,\r\n tools: compileTools(request),\r\n tool_choice: compileToolChoice(request)\r\n });\r\n if (call?.finalizeBody) body = call.finalizeBody(body);\r\n if (streaming) body = { ...body, stream: true };\r\n else body = { ...body, stream: false };\r\n const packed = attachProviderMetadata(body, request, options.metadataPacker);\r\n body = packed.body;\r\n\r\n return {\r\n url: `${options.baseUrl}/responses`,\r\n headers: buildHeaders(options),\r\n body,\r\n warnings: packed.warning ? [packed.warning] : []\r\n };\r\n}\r\n\r\nfunction assertSupported(request: RuntimeRequest): void {\r\n if (request.serverTools && serverToolsEnabled(request.serverTools)) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Direct OpenAI does not support OpenRouter server tools.\"\r\n );\r\n }\r\n if (request.rawOpenRouterOverrides !== undefined) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"rawOpenRouterOverrides cannot be sent to the OpenAI Responses API.\"\r\n );\r\n }\r\n if (request.apiMode === \"chat\") {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Direct OpenAI uses the Responses API. Do not set apiMode to chat.\"\r\n );\r\n }\r\n if (request.toolChoice && typeof request.toolChoice === \"object\" && request.toolChoice.type === \"server_tool\") {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Direct OpenAI does not support OpenRouter server tool choices.\"\r\n );\r\n }\r\n}\r\n\r\nfunction serverToolsEnabled(policy: NonNullable<RuntimeRequest[\"serverTools\"]>): boolean {\r\n return Object.values(policy).some((value) => {\r\n if (Array.isArray(value)) return value.some((item) => isEnabledMode(item));\r\n return isEnabledMode(value);\r\n });\r\n}\r\n\r\nfunction isEnabledMode(value: unknown): boolean {\r\n return typeof value === \"object\" && value !== null && \"mode\" in value && (value as { mode?: string }).mode !== \"disabled\";\r\n}\r\n\r\nfunction compileInstructions(request: RuntimeRequest): string | undefined {\r\n if (request.instructions) return request.instructions;\r\n if (request.system) return request.system;\r\n const systemMessages = (request.messages ?? []).filter((message) => message.role === \"system\");\r\n if (!systemMessages.length) return undefined;\r\n return systemMessages.map((message) => contentToText(message.content)).filter(Boolean).join(\"\\n\");\r\n}\r\n\r\nfunction compileInput(request: RuntimeRequest): unknown {\r\n if (request.input !== undefined) return request.input;\r\n const items: unknown[] = [];\r\n for (const message of request.messages ?? []) {\r\n if (message.role === \"system\" && !request.instructions && !request.system) continue;\r\n if (message.role === \"system\") continue;\r\n items.push(compileInputItem(message));\r\n }\r\n if (typeof request.prompt === \"string\") {\r\n items.push({ role: \"user\", content: request.prompt });\r\n }\r\n return items.length ? items : undefined;\r\n}\r\n\r\nfunction compileInputItem(message: RuntimeMessage): Record<string, unknown> {\r\n if (message.role === \"tool\") {\r\n return {\r\n type: \"function_call_output\",\r\n call_id: message.toolCallId ?? message.name ?? \"tool\",\r\n output: contentToText(message.content)\r\n };\r\n }\r\n const role = message.role === \"assistant\" ? \"assistant\" : \"user\";\r\n return { role, content: compileContent(message.content) };\r\n}\r\n\r\nfunction compileContent(content: RuntimeMessage[\"content\"]): unknown {\r\n if (typeof content === \"string\") return content;\r\n return content.map((part) => {\r\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\r\n if (part.type === \"image_url\") return { type: \"input_image\", image_url: part.imageUrl };\r\n if (part.url) {\r\n return clean({ type: \"input_file\", file_url: part.url, filename: part.fileName });\r\n }\r\n if (part.data) {\r\n return clean({ type: \"input_file\", file_data: part.data, filename: part.fileName });\r\n }\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"File content parts need a url or data.\"\r\n );\r\n });\r\n}\r\n\r\nfunction compileTools(request: RuntimeRequest): unknown[] | undefined {\r\n const tools = request.functionTools ?? [];\r\n if (!tools.length) return undefined;\r\n return tools.map((tool) => ({\r\n type: \"function\",\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: tool.parameters\r\n }));\r\n}\r\n\r\nfunction compileToolChoice(request: RuntimeRequest): unknown {\r\n const choice = request.toolChoice;\r\n if (!choice || choice === \"auto\") return undefined;\r\n if (choice === \"none\" || choice === \"required\") return choice;\r\n if (typeof choice === \"object\" && choice.type === \"function\") {\r\n return { type: \"function\", name: choice.functionName };\r\n }\r\n return undefined;\r\n}\r\n\r\nasync function runOpenAi(\r\n request: RuntimeRequest,\r\n options: ResolvedOpenAiOptions,\r\n call: ProviderCallOptions | undefined,\r\n requestId: string\r\n): Promise<RuntimeResponse> {\r\n const maxIterations = request.execution?.maxToolIterations ?? 8;\r\n const maxFunctionToolCalls = request.execution?.maxFunctionToolCalls ?? 20;\r\n const functionUsage: FunctionToolUsage[] = [];\r\n let active = compileOpenAiRequest(request, options, call, false);\r\n let response: unknown;\r\n\r\n for (let iteration = 0; iteration <= maxIterations; iteration += 1) {\r\n response = await sendWithRetries(active, options, timeoutFor(request, options));\r\n const calls = functionCalls(isRecord(response) ? response : {});\r\n if (!calls.length) break;\r\n if (!calls.every((item) => resolveExecutor(item.name, request, options))) {\r\n return normalizeOpenAiResponse({\r\n request,\r\n requestId,\r\n compiled: active,\r\n response,\r\n functionTools: [...functionUsage, ...calls],\r\n status: \"requires_action\"\r\n });\r\n }\r\n if (functionUsage.length + calls.length > maxFunctionToolCalls) {\r\n throw new AiDispatcherError(\"FUNCTION_TOOL_LIMIT\", \"maxFunctionToolCalls exceeded.\");\r\n }\r\n const results: FunctionToolUsage[] = [];\r\n for (const item of calls) {\r\n results.push(await executeOpenAiTool(item, request, options));\r\n }\r\n functionUsage.push(...results);\r\n const record = isRecord(response) ? response : {};\r\n active = {\r\n ...active,\r\n body: clean({\r\n ...active.body,\r\n tool_choice: \"auto\",\r\n previous_response_id: typeof record.id === \"string\" ? record.id : undefined,\r\n input: results.map(toFunctionCallOutput)\r\n })\r\n };\r\n }\r\n\r\n return normalizeOpenAiResponse({\r\n request,\r\n requestId,\r\n compiled: active,\r\n response,\r\n functionTools: functionUsage,\r\n status: \"completed\"\r\n });\r\n}\r\n\r\nfunction resolveExecutor(\r\n name: string,\r\n request: RuntimeRequest,\r\n options: ResolvedOpenAiOptions\r\n): RuntimeToolExecutor | undefined {\r\n return request.functionTools?.find((tool) => tool.name === name)?.executor ?? options.tools?.[name];\r\n}\r\n\r\nasync function executeOpenAiTool(\r\n call: FunctionToolUsage,\r\n request: RuntimeRequest,\r\n options: ResolvedOpenAiOptions\r\n): Promise<FunctionToolUsage> {\r\n const executor = resolveExecutor(call.name, request, options);\r\n if (!executor) {\r\n return call;\r\n }\r\n const started = Date.now();\r\n try {\r\n options.logger?.debug?.(\"runtime.function_tool.started\", { name: call.name, callId: call.callId });\r\n const result = await executor(call.args, {\r\n requestId: request.id ?? \"\",\r\n toolName: call.name,\r\n callId: call.callId,\r\n ...(request.metadata ? { metadata: request.metadata } : {})\r\n });\r\n const usage: FunctionToolUsage = {\r\n name: call.name,\r\n callId: call.callId,\r\n status: \"completed\",\r\n args: call.args,\r\n result,\r\n durationMs: Date.now() - started\r\n };\r\n options.logger?.debug?.(\"runtime.function_tool.completed\", { name: call.name, callId: call.callId });\r\n return usage;\r\n } catch (error) {\r\n const usage: FunctionToolUsage = {\r\n name: call.name,\r\n callId: call.callId,\r\n status: \"failed\",\r\n args: call.args,\r\n error: error instanceof Error ? error.message : String(error),\r\n durationMs: Date.now() - started\r\n };\r\n options.logger?.warn?.(\"runtime.function_tool.failed\", usage);\r\n return usage;\r\n }\r\n}\r\n\r\nfunction toFunctionCallOutput(result: FunctionToolUsage): Record<string, unknown> {\r\n const output = result.status === \"completed\" ? result.result : { error: result.error };\r\n return {\r\n type: \"function_call_output\",\r\n call_id: result.callId,\r\n output: typeof output === \"string\" ? output : JSON.stringify(output)\r\n };\r\n}\r\n\r\nfunction contentToText(content: RuntimeMessage[\"content\"]): string {\r\n if (typeof content === \"string\") return content;\r\n return content.map((part) => (part.type === \"text\" ? part.text : \"\")).filter(Boolean).join(\"\");\r\n}\r\n\r\nasync function* streamOpenAi(\r\n request: RuntimeRequest,\r\n options: ResolvedOpenAiOptions,\r\n call?: ProviderCallOptions\r\n): AsyncGenerator<RuntimeStreamEvent> {\r\n const requestId = request.id ?? \"\";\r\n let compiled: CompiledOpenAiWire;\r\n try {\r\n compiled = compileOpenAiRequest(request, options, call, true);\r\n } catch (error) {\r\n yield errorEvent(requestId, error);\r\n throw error;\r\n }\r\n\r\n yield {\r\n type: \"stream.start\",\r\n requestId,\r\n data: {\r\n model: typeof compiled.body.model === \"string\" ? compiled.body.model : \"\",\r\n apiMode: \"responses\",\r\n entrypoint: \"executeStreamingChat\"\r\n }\r\n };\r\n\r\n const controller = new AbortController();\r\n const timeout = setTimeout(() => controller.abort(), timeoutFor(request, options));\r\n let text = \"\";\r\n let reported = false;\r\n const report = (error: unknown): AiDispatcherError => {\r\n const failure = error instanceof AiDispatcherError\r\n ? error\r\n : new AiDispatcherError(\r\n \"PROVIDER_GATEWAY_UNREACHABLE\",\r\n error instanceof Error ? error.message : \"OpenAI request failed before receiving a response.\"\r\n );\r\n return failure;\r\n };\r\n try {\r\n const response = await options.fetch(compiled.url, {\r\n method: \"POST\",\r\n headers: { ...compiled.headers, Accept: \"text/event-stream\" },\r\n body: JSON.stringify(compiled.body),\r\n signal: controller.signal\r\n });\r\n if (!response.ok) {\r\n const failure = await readFailure(response);\r\n reported = true;\r\n yield errorEvent(requestId, failure);\r\n throw failure;\r\n }\r\n for await (const event of parseSse(response)) {\r\n if (!isRecord(event)) continue;\r\n if (event.type === \"response.output_text.delta\" && typeof event.delta === \"string\" && event.delta) {\r\n text += event.delta;\r\n yield { type: \"stream.text.delta\", requestId, data: { text: event.delta } };\r\n } else if (event.type === \"response.reasoning_summary_text.delta\" && call?.extractStreamReasoning) {\r\n const reasoningText = call.extractStreamReasoning(event);\r\n if (reasoningText) {\r\n yield { type: \"stream.reasoning.delta\", requestId, data: { text: reasoningText } };\r\n }\r\n } else if (event.type === \"response.function_call_arguments.delta\" && typeof event.delta === \"string\") {\r\n yield {\r\n type: \"stream.tool_call.delta\",\r\n requestId,\r\n data: {\r\n index: 0,\r\n ...(typeof event.name === \"string\" ? { name: event.name } : {}),\r\n argumentsDelta: event.delta\r\n }\r\n };\r\n } else if (event.type === \"response.completed\" && isRecord(event.response)) {\r\n const usage = normalizeUsage(event.response.usage);\r\n if (usage) yield { type: \"stream.usage\", requestId, data: { usage } };\r\n } else if (event.type === \"error\") {\r\n const failure = new AiDispatcherError(\r\n \"PROVIDER_REQUEST_FAILED\",\r\n typeof event.message === \"string\" ? event.message : \"OpenAI stream returned an error event.\",\r\n event\r\n );\r\n reported = true;\r\n yield errorEvent(requestId, failure);\r\n throw failure;\r\n }\r\n }\r\n yield {\r\n type: \"stream.done\",\r\n requestId,\r\n data: {\r\n text,\r\n model: typeof compiled.body.model === \"string\" ? compiled.body.model : \"\"\r\n }\r\n };\r\n } catch (error) {\r\n const failure = error instanceof Error && error.name === \"AbortError\"\r\n ? new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", \"OpenAI request timed out.\")\r\n : report(error);\r\n if (!reported) yield errorEvent(requestId, failure);\r\n throw failure;\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n}\r\n\r\nasync function sendWithRetries(\r\n compiled: CompiledOpenAiWire,\r\n options: ResolvedOpenAiOptions,\r\n timeoutMs: number\r\n): Promise<unknown> {\r\n const attempts = options.maxAttempts;\r\n let lastError: unknown;\r\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\r\n try {\r\n return await sendOnce(compiled, options, timeoutMs);\r\n } catch (error) {\r\n lastError = error;\r\n const retryable = error instanceof AiDispatcherError && error.code === \"PROVIDER_RETRYABLE\";\r\n if (!retryable || attempt >= attempts) throw asTerminalError(error);\r\n await delay(Math.min(500 * 2 ** (attempt - 1), 5_000));\r\n }\r\n }\r\n throw lastError;\r\n}\r\n\r\nasync function sendOnce(compiled: CompiledOpenAiWire, options: ResolvedOpenAiOptions, timeoutMs: number): Promise<unknown> {\r\n const controller = new AbortController();\r\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\r\n try {\r\n const response = await options.fetch(compiled.url, {\r\n method: \"POST\",\r\n headers: compiled.headers,\r\n body: JSON.stringify(compiled.body),\r\n signal: controller.signal\r\n });\r\n if (!response.ok) throw await readFailure(response);\r\n const text = await response.text();\r\n return text ? JSON.parse(text) : {};\r\n } catch (error) {\r\n if (error instanceof AiDispatcherError) throw error;\r\n if (error instanceof Error && error.name === \"AbortError\") {\r\n throw new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", \"OpenAI request timed out.\");\r\n }\r\n throw new AiDispatcherError(\r\n \"PROVIDER_GATEWAY_UNREACHABLE\",\r\n error instanceof Error ? error.message : \"OpenAI request failed before receiving a response.\"\r\n );\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n}\r\n\r\nasync function readFailure(response: Response): Promise<AiDispatcherError> {\r\n const text = await response.text();\r\n let body: unknown = text;\r\n try {\r\n body = text ? JSON.parse(text) : undefined;\r\n } catch {\r\n body = text;\r\n }\r\n const message = messageFrom(body) ?? `OpenAI request failed with status ${response.status}.`;\r\n const retryable = response.status === 429 || response.status >= 500;\r\n return new AiDispatcherError(classifyStatus(response.status), message, { status: response.status, body, retryable });\r\n}\r\n\r\nfunction classifyStatus(status: number): string {\r\n if (status === 401 || status === 403) return \"PROVIDER_AUTH_FAILED\";\r\n if (status === 404) return \"PROVIDER_MODEL_NOT_FOUND\";\r\n if (status === 429) return \"PROVIDER_RATE_LIMITED\";\r\n if (status === 408 || status >= 500) return \"PROVIDER_RETRYABLE\";\r\n return \"PROVIDER_REQUEST_FAILED\";\r\n}\r\n\r\nfunction isConfigError(code: string): boolean {\r\n return code === \"OPENAI_API_KEY_MISSING\"\r\n || code === \"MODEL_REQUIRED\"\r\n || code === \"INPUT_REQUIRED\"\r\n || code === \"UNSUPPORTED_REQUEST_FIELD\";\r\n}\r\n\r\nfunction asTerminalError(error: unknown): AiDispatcherError {\r\n if (error instanceof AiDispatcherError && error.code === \"PROVIDER_RETRYABLE\") {\r\n return new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", error.message, error.details);\r\n }\r\n if (error instanceof AiDispatcherError) return error;\r\n return new AiDispatcherError(\"PROVIDER_REQUEST_FAILED\", error instanceof Error ? error.message : String(error));\r\n}\r\n\r\nfunction normalizeOpenAiResponse(params: {\r\n request: RuntimeRequest;\r\n requestId: string;\r\n compiled: CompiledOpenAiWire;\r\n response: unknown;\r\n functionTools?: FunctionToolUsage[];\r\n status?: RuntimeResponse[\"status\"];\r\n}): RuntimeResponse {\r\n const record = isRecord(params.response) ? params.response : {};\r\n const text = answerText(record);\r\n const calls = params.functionTools ?? functionCalls(record);\r\n const usage = normalizeUsage(record.usage);\r\n const status = params.status ?? (calls.length ? \"requires_action\" : \"completed\");\r\n return {\r\n id: typeof record.id === \"string\" ? record.id : params.requestId,\r\n status,\r\n apiMode: \"responses\",\r\n model: typeof record.model === \"string\" ? record.model : modelOf(params.compiled),\r\n text,\r\n citations: [],\r\n images: [],\r\n patches: [],\r\n toolUsage: toolUsage(calls),\r\n ...(usage ? { usage } : {}),\r\n warnings: params.compiled.warnings,\r\n errors: [],\r\n raw: { request: params.compiled.body, response: params.response },\r\n ...(params.request.metadata ? { metadata: params.request.metadata } : {})\r\n };\r\n}\r\n\r\nfunction answerText(response: Record<string, unknown>): string {\r\n const output = response.output;\r\n if (Array.isArray(output)) {\r\n const parts: string[] = [];\r\n for (const item of output) {\r\n if (!isRecord(item) || item.type === \"reasoning\" || item.type !== \"message\" || !Array.isArray(item.content)) continue;\r\n for (const part of item.content) {\r\n if (isRecord(part) && part.type === \"output_text\" && typeof part.text === \"string\") parts.push(part.text);\r\n }\r\n }\r\n if (parts.length > 0) return parts.join(\"\");\r\n }\r\n return typeof response.output_text === \"string\" ? response.output_text : \"\";\r\n}\r\n\r\nfunction functionCalls(response: Record<string, unknown>): RuntimeToolUsage[\"functionTools\"] {\r\n if (!Array.isArray(response.output)) return [];\r\n const calls: RuntimeToolUsage[\"functionTools\"] = [];\r\n for (const item of response.output) {\r\n if (!isRecord(item) || item.type !== \"function_call\") continue;\r\n const name = typeof item.name === \"string\" ? item.name : \"function\";\r\n const callId = typeof item.call_id === \"string\" ? item.call_id : name;\r\n let args: unknown = item.arguments;\r\n if (typeof item.arguments === \"string\") {\r\n try {\r\n args = JSON.parse(item.arguments);\r\n } catch {\r\n args = item.arguments;\r\n }\r\n }\r\n calls.push({ name, callId, status: \"completed\", args });\r\n }\r\n return calls;\r\n}\r\n\r\nfunction toolUsage(calls: RuntimeToolUsage[\"functionTools\"]): RuntimeToolUsage {\r\n const unused = { requested: false, required: false, used: false };\r\n return {\r\n serverTools: {\r\n webSearch: unused,\r\n webFetch: unused,\r\n datetime: unused,\r\n imageGeneration: unused,\r\n applyPatch: unused,\r\n fusion: unused,\r\n advisor: unused,\r\n subagent: unused\r\n },\r\n functionTools: calls\r\n };\r\n}\r\n\r\nfunction normalizeUsage(usage: unknown): RuntimeResponse[\"usage\"] | undefined {\r\n if (!isRecord(usage)) return undefined;\r\n const inputTokens = numberValue(usage.input_tokens);\r\n const outputTokens = numberValue(usage.output_tokens);\r\n const totalTokens = numberValue(usage.total_tokens) ?? (\r\n inputTokens !== undefined || outputTokens !== undefined ? (inputTokens ?? 0) + (outputTokens ?? 0) : undefined\r\n );\r\n return {\r\n raw: usage,\r\n ...(inputTokens !== undefined ? { inputTokens } : {}),\r\n ...(outputTokens !== undefined ? { outputTokens } : {}),\r\n ...(totalTokens !== undefined ? { totalTokens } : {})\r\n };\r\n}\r\n\r\nfunction failedResponse(request: RuntimeRequest, requestId: string, error: unknown): RuntimeResponse {\r\n const normalized = error instanceof AiDispatcherError\r\n ? error\r\n : new AiDispatcherError(\"PROVIDER_REQUEST_FAILED\", error instanceof Error ? error.message : String(error));\r\n return {\r\n id: requestId,\r\n status: \"failed\",\r\n apiMode: \"responses\",\r\n model: request.model ?? \"\",\r\n text: \"\",\r\n citations: [],\r\n images: [],\r\n patches: [],\r\n toolUsage: toolUsage([]),\r\n warnings: [],\r\n errors: [{\r\n code: normalized.code,\r\n message: normalized.message,\r\n source: \"runtime\",\r\n details: normalized.details\r\n }],\r\n raw: { request, response: undefined }\r\n };\r\n}\r\n\r\nfunction errorEvent(requestId: string, error: unknown): RuntimeStreamEvent {\r\n const normalized = error instanceof AiDispatcherError\r\n ? error\r\n : new AiDispatcherError(\"PROVIDER_REQUEST_FAILED\", error instanceof Error ? error.message : String(error));\r\n return {\r\n type: \"stream.error\",\r\n requestId,\r\n data: {\r\n error: {\r\n code: normalized.code,\r\n message: normalized.message,\r\n source: \"runtime\",\r\n details: normalized.details\r\n }\r\n }\r\n };\r\n}\r\n\r\nfunction modelOf(compiled: CompiledOpenAiWire): string {\r\n return typeof compiled.body.model === \"string\" ? compiled.body.model : \"\";\r\n}\r\n\r\nfunction messageFrom(body: unknown): string | undefined {\r\n if (!isRecord(body)) return undefined;\r\n if (typeof body.message === \"string\") return body.message;\r\n if (isRecord(body.error) && typeof body.error.message === \"string\") return body.error.message;\r\n return undefined;\r\n}\r\n\r\nfunction numberValue(value: unknown): number | undefined {\r\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\r\n}\r\n\r\nfunction attachProviderMetadata(\r\n body: Record<string, unknown>,\r\n request: RuntimeRequest,\r\n packer?: MetadataPacker\r\n): { body: Record<string, unknown>; warning?: RuntimeWarning } {\r\n const fromBody = isRecord(body.metadata) ? body.metadata : undefined;\r\n const packed = packProviderRecord(request.metadata, request.agentId, fromBody, packer);\r\n if (packed.wire) return { body: { ...body, metadata: packed.wire }, ...(packed.warning ? { warning: packed.warning } : {}) };\r\n if (body.metadata === undefined) return { body, ...(packed.warning ? { warning: packed.warning } : {}) };\r\n const rest = { ...body };\r\n delete rest.metadata;\r\n return { body: rest, ...(packed.warning ? { warning: packed.warning } : {}) };\r\n}\r\n\r\nfunction clean(body: Record<string, unknown>): Record<string, unknown> {\r\n return Object.fromEntries(Object.entries(body).filter(([, value]) => value !== undefined));\r\n}\r\n\r\nfunction buildHeaders(options: ResolvedOpenAiOptions): Record<string, string> {\r\n return {\r\n \"content-type\": \"application/json\",\r\n authorization: `Bearer ${options.apiKey}`,\r\n ...(options.organization ? { \"OpenAI-Organization\": options.organization } : {}),\r\n ...(options.project ? { \"OpenAI-Project\": options.project } : {})\r\n };\r\n}\r\n\r\nfunction timeoutFor(request: RuntimeRequest, options: ResolvedOpenAiOptions): number {\r\n return request.execution?.timeoutMs ?? options.timeoutMs;\r\n}\r\n\r\nfunction delay(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nasync function* parseSse(response: Response): AsyncGenerator<unknown> {\r\n const body = response.body;\r\n if (!body) throw new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", \"OpenAI stream response had no body.\");\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = \"\";\r\n while (true) {\r\n const chunk = await reader.read();\r\n if (chunk.done) break;\r\n buffer += decoder.decode(chunk.value, { stream: true });\r\n const parts = buffer.split(\"\\n\\n\");\r\n buffer = parts.pop() ?? \"\";\r\n for (const part of parts) {\r\n const parsed = parseSsePart(part);\r\n if (parsed !== undefined) yield parsed;\r\n }\r\n }\r\n const trailing = parseSsePart(buffer);\r\n if (trailing !== undefined) yield trailing;\r\n}\r\n\r\nfunction parseSsePart(part: string): unknown | undefined {\r\n const data = part\r\n .split(\"\\n\")\r\n .filter((line) => line.startsWith(\"data:\"))\r\n .map((line) => line.slice(5).trim())\r\n .join(\"\\n\");\r\n if (!data || data === \"[DONE]\") return undefined;\r\n try {\r\n return JSON.parse(data) as unknown;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\ninterface ResolvedOpenAiOptions {\r\n apiKey: string;\r\n baseUrl: string;\r\n defaultModel?: string;\r\n organization?: string;\r\n project?: string;\r\n timeoutMs: number;\r\n maxAttempts: number;\r\n fetch: typeof globalThis.fetch;\r\n tools?: Record<string, RuntimeToolExecutor>;\r\n logger?: RuntimeLogger;\r\n metadataPacker?: MetadataPacker;\r\n}\r\n\r\nfunction resolveOpenAiOptions(options: OpenAiRuntimeOptions, packer?: MetadataPacker): ResolvedOpenAiOptions {\r\n const baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\r\n return {\r\n apiKey: options.apiKey ?? readEnv(\"OPENAI_API_KEY\") ?? \"\",\r\n baseUrl,\r\n ...(options.defaultModel ? { defaultModel: options.defaultModel } : {}),\r\n ...(options.organization ? { organization: options.organization } : {}),\r\n ...(options.project ? { project: options.project } : {}),\r\n timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\r\n maxAttempts: options.maxAttempts ?? 3,\r\n fetch: options.fetch ?? globalThis.fetch,\r\n ...(options.tools ? { tools: options.tools } : {}),\r\n ...(options.logger ? { logger: options.logger } : {}),\r\n ...(packer ? { metadataPacker: packer } : {})\r\n };\r\n}\r\n\r\nfunction readEnv(name: string): string | undefined {\r\n if (typeof process === \"undefined\") return undefined;\r\n return process.env[name];\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n","import {\r\n createOpenRouterRuntime,\r\n type OpenRouterRuntime,\r\n type OpenRouterRuntimeOptions,\r\n type RuntimeRequest,\r\n type RuntimeResponse,\r\n type RuntimeStreamEvent\r\n} from \"@x12i/openrouter-runtime\";\r\nimport type { AiProviderAdapter, ProviderCallOptions } from \"../types/public\";\r\n\r\nexport function createOpenRouterProviderAdapter(\r\n options: OpenRouterRuntimeOptions = {}\r\n): AiProviderAdapter {\r\n const runtime: OpenRouterRuntime = createOpenRouterRuntime(options);\r\n\r\n return {\r\n run(request: RuntimeRequest, call?: ProviderCallOptions): Promise<RuntimeResponse> {\r\n return runtime.run(request, toCall(call));\r\n },\r\n executeStreamingChat(request: RuntimeRequest, call?: ProviderCallOptions): AsyncIterable<RuntimeStreamEvent> {\r\n return runtime.executeStreamingChat(request, toCall(call));\r\n },\r\n compile(request: RuntimeRequest, call?: ProviderCallOptions) {\r\n return runtime.compile(request, toCall(call));\r\n }\r\n };\r\n}\r\n\r\nfunction toCall(call?: ProviderCallOptions) {\r\n if (!call) return undefined;\r\n return {\r\n ...(call.finalizeBody ? { finalizeBody: call.finalizeBody } : {}),\r\n ...(call.extractStreamReasoning ? { extractStreamReasoning: call.extractStreamReasoning } : {}),\r\n ...(call.suppressNestedReasoningFallback ? { suppressNestedReasoningFallback: true as const } : {})\r\n };\r\n}\r\n","import type { AiProviderId, ImplementedAiProvider } from \"./types/providers\";\r\nimport { isImplementedAiProvider } from \"./types/providers\";\r\nimport { AiDispatcherError, providerNotImplemented } from \"./errors\";\r\n\r\nexport function resolveProvider(\r\n requestProvider: AiProviderId | undefined,\r\n defaultProvider: AiProviderId\r\n): ImplementedAiProvider {\r\n const provider = requestProvider ?? defaultProvider;\r\n if (!provider || typeof provider !== \"string\") {\r\n throw new AiDispatcherError(\r\n \"PROVIDER_REQUIRED\",\r\n \"An AI provider is required. Set options.provider or request.provider.\"\r\n );\r\n }\r\n if (!isImplementedAiProvider(provider)) {\r\n throw providerNotImplemented(provider);\r\n }\r\n return provider;\r\n}\r\n","import { deletePointer } from \"./json-pointer\";\r\n\r\n/**\r\n * Clone `message` and delete only the JSON pointers in `paths`.\r\n * Pointers are relative to the message. Safe to call more than once.\r\n */\r\nexport function stripReasoningHistoryFields<T>(message: T, paths: readonly string[]): T {\r\n const clone = structuredClone(message);\r\n for (const path of paths) deletePointer(clone, path);\r\n return clone;\r\n}\r\n"],"mappings":"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","names":["isRecord","reasoningDelta","hold","isRecord","isRecord","isRecord","record","hasMessages","isRecord","readEnv","hasMessages","serverToolsEnabled","isEnabledMode","packProviderRecord","DEFAULT_BASE_URL","DEFAULT_TIMEOUT_MS","isConfigError","failedResponse","assertSupported","compileInstructions","clean","buildHeaders","serverToolsEnabled","isEnabledMode","contentToText","sendWithRetries","timeoutFor","isRecord","resolveExecutor","record","toFunctionCallOutput","errorEvent","readFailure","parseSse","normalizeUsage","sendOnce","asTerminalError","delay","messageFrom","classifyStatus","answerText","modelOf","numberValue","packProviderRecord","parseSsePart","readEnv","toCall","record","isRecord"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/create-dispatcher.ts","../src/cache-usage.ts","../src/json-pointer.ts","../src/reasoning-extract.ts","../src/think-tags.ts","../src/apply-resolution.ts","../src/decorate-stream.ts","../src/types/providers.ts","../src/errors.ts","../src/mcp.ts","../src/prepare-request.ts","../src/cache-apply.ts","../src/cache-profiles.ts","../src/providers/cloudflare.ts","../src/providers/bedrock.ts","../src/providers/openai.ts","../src/providers/openrouter.ts","../src/resolve-provider.ts","../src/history.ts"],"sourcesContent":["export { registerHostIntents } from \"@x12i/ai-profiles\";\r\nexport {\r\n decodeProviderMetadata,\r\n METADATA_NORMALIZATION_MAP,\r\n canonicalMetadataKey,\r\n normalizeMetadata\r\n} from \"@x12i/openrouter-runtime\";\r\nexport type { NormalizedMetadataKey } from \"@x12i/openrouter-runtime\";\r\nexport { createAiDispatcher, DEFAULT_METADATA_PRIORITY } from \"./create-dispatcher\";\r\nexport { AiDispatcherError, providerNotImplemented } from \"./errors\";\r\nexport { stripReasoningHistoryFields } from \"./history\";\r\nexport { resolveProvider } from \"./resolve-provider\";\r\nexport { IMPLEMENTED_AI_PROVIDERS, isImplementedAiProvider } from \"./types/providers\";\r\n\r\nexport type { AiProviderId, ImplementedAiProvider } from \"./types/providers\";\r\nexport type {\r\n AiDispatcher,\r\n AiDispatcherOptions,\r\n AiDispatcherRequest,\r\n AiDispatcherResponse,\r\n AiDispatcherUsage,\r\n AiProviderAdapter,\r\n CompiledAiRequest,\r\n CompiledCloudflareRequest,\r\n CompiledOpenAiRequest,\r\n DispatcherMcpOptions,\r\n DispatcherMcpServer,\r\n DispatcherMcpTool,\r\n CacheMode,\r\n CacheOutcome,\r\n CachePolicy,\r\n CacheResolution,\r\n CacheTtl,\r\n ReasoningEffort,\r\n ReasoningOutcome,\r\n ReasoningResolution,\r\n RoleStamp\r\n} from \"./types/public\";\r\nexport type { OpenAiRuntimeOptions } from \"./types/openai\";\r\nexport type {\r\n CloudflareBackoff,\r\n CloudflareCallContext,\r\n CloudflareEndpoint,\r\n CloudflareEndpointChoice,\r\n CloudflareGatewayControls,\r\n CloudflareRequestOptions,\r\n CloudflareRunOptions,\r\n CloudflareRuntimeOptions,\r\n CloudflareWebhookFormat\r\n} from \"./types/cloudflare\";\r\n\r\nexport type {\r\n RuntimeRequest,\r\n RuntimeResponse,\r\n RuntimeStreamEvent,\r\n CompiledOpenRouterRequest,\r\n RuntimeLogger,\r\n OpenRouterRuntimeOptions,\r\n RuntimeMessage,\r\n RuntimeDefaults,\r\n RuntimeServerToolsPolicy\r\n} from \"@x12i/openrouter-runtime\";\r\n\r\nexport type {\r\n CompiledBedrockRequest,\r\n BedrockRuntimeOptions,\r\n BedrockCredentials,\r\n BedrockClientLike\r\n} from \"@x12i/bedrock-runtime\";\r\n","import type { BedrockRuntimeOptions } from \"@x12i/bedrock-runtime\";\r\nimport type { OpenRouterRuntimeOptions, RuntimeStreamEvent, RuntimeToolExecutor } from \"@x12i/openrouter-runtime\";\r\nimport { createMetadataPacker } from \"@x12i/provider-metadata\";\r\nimport { applyResolution } from \"./apply-resolution\";\r\nimport { decorateStream } from \"./decorate-stream\";\r\nimport { AiDispatcherError } from \"./errors\";\r\nimport { applyMcpCatalog, createMcpCatalog, refreshMcpCatalog } from \"./mcp\";\r\nimport { prepareDispatchRequest } from \"./prepare-request\";\r\nimport { createBedrockProviderAdapter } from \"./providers/bedrock\";\r\nimport { createCloudflareProviderAdapter } from \"./providers/cloudflare\";\r\nimport { createOpenAiProviderAdapter } from \"./providers/openai\";\r\nimport { createOpenRouterProviderAdapter } from \"./providers/openrouter\";\r\nimport { resolveProvider } from \"./resolve-provider\";\r\nimport type { ImplementedAiProvider } from \"./types/providers\";\r\nimport type {\r\n AiDispatcher,\r\n AiDispatcherOptions,\r\n AiDispatcherRequest,\r\n AiProviderAdapter,\r\n CompiledAiRequest,\r\n ProviderCallOptions\r\n} from \"./types/public\";\r\nimport type { CloudflareRuntimeOptions } from \"./types/cloudflare\";\r\nimport type { OpenAiRuntimeOptions } from \"./types/openai\";\r\n\r\nconst SECRET_HEADERS = new Set([\"authorization\", \"x-api-key\", \"api-key\"]);\r\n\r\n/** Identity keys stay when a record has to be trimmed. Earlier entries are kept ahead of later ones. */\r\nexport const DEFAULT_METADATA_PRIORITY = [\r\n \"agentId\",\r\n \"orgId\",\r\n \"stepId\",\r\n \"skillId\",\r\n \"role\",\r\n \"roleLayer\",\r\n \"roleDigest\",\r\n \"profileChoice\",\r\n \"recordId\",\r\n \"objectType\"\r\n] as const;\r\n\r\nexport function createAiDispatcher(options: AiDispatcherOptions = {}): AiDispatcher {\r\n const packer = createMetadataPacker({ priority: options.metadataPriority ?? DEFAULT_METADATA_PRIORITY });\r\n const defaultProvider = resolveProvider(options.provider, \"openrouter\");\r\n const catalog = createMcpCatalog(options.mcp);\r\n let refreshChain: Promise<void> = Promise.resolve();\r\n\r\n const adapters = new Map<ImplementedAiProvider, AiProviderAdapter>();\r\n\r\n function createAdapter(provider: ImplementedAiProvider): AiProviderAdapter {\r\n if (provider === \"openrouter\") {\r\n const openrouterOptions: OpenRouterRuntimeOptions = {\r\n ...options.openrouter,\r\n metadataPacker: packer,\r\n ...(options.logger && !options.openrouter?.logger ? { logger: options.logger } : {})\r\n };\r\n return createOpenRouterProviderAdapter(openrouterOptions);\r\n }\r\n if (provider === \"bedrock\") {\r\n const bedrockOptions: BedrockRuntimeOptions = {\r\n ...options.bedrock,\r\n metadataPacker: packer,\r\n ...(options.logger && !options.bedrock?.logger ? { logger: options.logger } : {})\r\n };\r\n return createBedrockProviderAdapter(bedrockOptions);\r\n }\r\n if (provider === \"openai\") {\r\n const openaiOptions: OpenAiRuntimeOptions = {\r\n ...options.openai,\r\n ...(options.logger && !options.openai?.logger ? { logger: options.logger } : {})\r\n };\r\n return createOpenAiProviderAdapter(openaiOptions, packer);\r\n }\r\n if (provider === \"cloudflare\") {\r\n const cloudflareOptions: CloudflareRuntimeOptions = {\r\n ...options.cloudflare,\r\n ...(options.logger && !options.cloudflare?.logger ? { logger: options.logger } : {})\r\n };\r\n return createCloudflareProviderAdapter(cloudflareOptions, packer);\r\n }\r\n throw new AiDispatcherError(\r\n \"PROVIDER_ADAPTER_MISSING\",\r\n `No adapter registered for provider \"${provider}\".`\r\n );\r\n }\r\n\r\n function getAdapter(provider: ImplementedAiProvider): AiProviderAdapter {\r\n let adapter = adapters.get(provider);\r\n if (!adapter) {\r\n adapter = createAdapter(provider);\r\n adapters.set(provider, adapter);\r\n }\r\n return adapter;\r\n }\r\n\r\n getAdapter(defaultProvider);\r\n\r\n return {\r\n provider: defaultProvider,\r\n\r\n async run(request: AiDispatcherRequest) {\r\n const prepared = prepare(request, true);\r\n log(options, \"ai-dispatcher.request.started\", prepared, \"run\", false);\r\n const response = await getAdapter(prepared.provider).run(prepared.request, callOf(prepared.call));\r\n return applyResolution(response, prepared);\r\n },\r\n\r\n executeStreamingChat(request: AiDispatcherRequest) {\r\n const prepared = prepare(request, false);\r\n log(options, \"ai-dispatcher.request.started\", prepared, \"executeStreamingChat\", true);\r\n return decorateStream(\r\n prepared,\r\n getAdapter(prepared.provider).executeStreamingChat(prepared.request, callOf(prepared.call))\r\n );\r\n },\r\n\r\n compile(request: AiDispatcherRequest): CompiledAiRequest {\r\n const prepared = prepare(request, true);\r\n log(options, \"ai-dispatcher.request.compiled\", prepared, \"compile\", false);\r\n const compiled = getAdapter(prepared.provider).compile(prepared.request, callOf(prepared.call));\r\n return attachCompileMeta(prepared, compiled);\r\n },\r\n\r\n refreshMcp() {\r\n const pending = refreshChain.then(() => refreshMcpCatalog(catalog));\r\n refreshChain = pending.then(\r\n () => undefined,\r\n () => undefined\r\n );\r\n return pending;\r\n }\r\n };\r\n\r\n function prepare(request: AiDispatcherRequest, includeMcp: boolean) {\r\n const provider = resolveProvider(request.provider, defaultProvider);\r\n const prepared = prepareDispatchRequest({ request, provider, options });\r\n const tools = providerTools(provider, options);\r\n applyMcpCatalog({\r\n request: prepared.request as AiDispatcherRequest,\r\n catalog,\r\n ...(tools ? { providerTools: tools } : {}),\r\n includeMcp\r\n });\r\n return prepared;\r\n }\r\n}\r\n\r\nfunction providerTools(\r\n provider: ImplementedAiProvider,\r\n options: AiDispatcherOptions\r\n): Record<string, RuntimeToolExecutor | undefined> | undefined {\r\n if (provider === \"openrouter\") return options.openrouter?.tools;\r\n if (provider === \"bedrock\") return options.bedrock?.tools;\r\n if (provider === \"cloudflare\") return options.cloudflare?.tools;\r\n return options.openai?.tools;\r\n}\r\n\r\nfunction callOf(call: ProviderCallOptions): ProviderCallOptions | undefined {\r\n if (!call.finalizeBody && !call.extractStreamReasoning && !call.suppressNestedReasoningFallback && !call.cloudflare) {\r\n return undefined;\r\n }\r\n return call;\r\n}\r\n\r\nfunction attachCompileMeta(\r\n prepared: ReturnType<typeof prepareDispatchRequest>,\r\n compiled: object\r\n): CompiledAiRequest {\r\n const record = compiled as Record<string, unknown>;\r\n const headers = isRecord(record.headers) ? redactHeaders(record.headers as Record<string, string>) : undefined;\r\n return {\r\n ...record,\r\n ...(headers ? { headers } : {}),\r\n provider: prepared.provider,\r\n requestedModel: prepared.requestedModel,\r\n effectiveModel: prepared.effectiveModel,\r\n ...(prepared.resolution ? { reasoningResolution: prepared.resolution } : {}),\r\n ...(prepared.cacheResolution ? { cacheResolution: prepared.cacheResolution } : {}),\r\n ...(prepared.cacheWarnings?.length\r\n ? { warnings: [...(Array.isArray(record.warnings) ? record.warnings : []), ...prepared.cacheWarnings] }\r\n : {})\r\n } as CompiledAiRequest;\r\n}\r\n\r\nfunction redactHeaders(headers: Record<string, string>): Record<string, string> {\r\n const redacted: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(headers)) {\r\n redacted[key] = SECRET_HEADERS.has(key.toLowerCase()) ? \"[redacted]\" : value;\r\n }\r\n return redacted;\r\n}\r\n\r\nfunction log(\r\n options: AiDispatcherOptions,\r\n event: string,\r\n prepared: ReturnType<typeof prepareDispatchRequest>,\r\n entrypoint: string,\r\n streaming: boolean\r\n): void {\r\n const payload: Record<string, unknown> = {\r\n provider: prepared.provider,\r\n entrypoint,\r\n streaming,\r\n requestedModel: prepared.requestedModel,\r\n effectiveModel: prepared.effectiveModel\r\n };\r\n if (prepared.request.id) payload.requestId = prepared.request.id;\r\n if (prepared.resolution?.outcome) payload.outcome = prepared.resolution.outcome;\r\n if (prepared.resolution) payload.bypassed = prepared.resolution.bypassed;\r\n if (prepared.cacheResolution) payload.cacheOutcome = prepared.cacheResolution.outcome;\r\n if (event.endsWith(\"compiled\")) options.logger?.debug?.(event, payload);\r\n else options.logger?.info?.(event, payload);\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nexport type { RuntimeStreamEvent };\r\n","export interface CacheTokenCounts {\r\n cachedTokens?: number;\r\n cacheWriteTokens?: number;\r\n}\r\n\r\n/** Reads provider usage objects without requiring a cache marker on the request. */\r\nexport function readCacheTokens(source: unknown): CacheTokenCounts {\r\n const cached: number[] = [];\r\n const written: number[] = [];\r\n for (const usage of usageRecords(source)) {\r\n const promptDetails = record(usage.prompt_tokens_details);\r\n const inputDetails = record(usage.input_tokens_details);\r\n pushNumber(cached, promptDetails?.cached_tokens);\r\n pushNumber(cached, inputDetails?.cached_tokens);\r\n pushNumber(cached, usage.cacheReadInputTokens);\r\n pushNumber(cached, usage.cache_read_input_tokens);\r\n pushNumber(cached, usage.cached_tokens);\r\n pushNumber(written, promptDetails?.cache_write_tokens);\r\n pushNumber(written, inputDetails?.cache_write_tokens);\r\n pushNumber(written, usage.cacheWriteInputTokens);\r\n pushNumber(written, usage.cache_write_input_tokens);\r\n pushNumber(written, usage.cache_write_tokens);\r\n }\r\n const cachedTokens = cached[0];\r\n const cacheWriteTokens = written[0];\r\n return {\r\n ...(cachedTokens !== undefined ? { cachedTokens } : {}),\r\n ...(cacheWriteTokens !== undefined ? { cacheWriteTokens } : {})\r\n };\r\n}\r\n\r\nfunction usageRecords(source: unknown): Record<string, unknown>[] {\r\n const root = record(source);\r\n if (!root) return [];\r\n const records: Record<string, unknown>[] = [];\r\n const usage = record(root.usage);\r\n if (usage) records.push(usage);\r\n const raw = record(root.raw);\r\n if (raw) {\r\n const rawUsage = record(raw.usage);\r\n records.push(rawUsage ?? raw);\r\n }\r\n records.push(root);\r\n return records;\r\n}\r\n\r\nfunction pushNumber(target: number[], value: unknown): void {\r\n if (typeof value === \"number\" && Number.isFinite(value)) target.push(value);\r\n}\r\n\r\nfunction record(value: unknown): Record<string, unknown> | undefined {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\r\n}\r\n","const UNSAFE_KEYS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction unescapeToken(token: string): string {\r\n return token.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\r\n}\r\n\r\nfunction tokensFor(pointer: string): string[] | undefined {\r\n if (pointer === \"\") return [];\r\n if (!pointer.startsWith(\"/\")) return undefined;\r\n const tokens = pointer.split(\"/\").slice(1).map(unescapeToken);\r\n if (tokens.some((token) => UNSAFE_KEYS.has(token))) return undefined;\r\n return tokens;\r\n}\r\n\r\nfunction walk(current: unknown, tokens: readonly string[]): unknown[] {\r\n if (tokens.length === 0) return [current];\r\n const [head, ...rest] = tokens;\r\n if (head === undefined) return [];\r\n if (head === \"*\") {\r\n if (!Array.isArray(current)) return [];\r\n return current.flatMap((item) => walk(item, rest));\r\n }\r\n if (Array.isArray(current)) {\r\n if (!/^\\d+$/.test(head)) return [];\r\n const index = Number(head);\r\n if (index >= current.length) return [];\r\n return walk(current[index], rest);\r\n }\r\n if (!isRecord(current) || !Object.prototype.hasOwnProperty.call(current, head)) return [];\r\n return walk(current[head], rest);\r\n}\r\n\r\n/** Values selected by one JSON pointer. `*` visits every array element. */\r\nexport function valuesAtPointer(root: unknown, pointer: string): unknown[] {\r\n const tokens = tokensFor(pointer);\r\n if (!tokens) return [];\r\n return walk(root, tokens);\r\n}\r\n\r\n/**\r\n * Ordered alternatives. The first pointer that yields one or more strings wins.\r\n * Those strings are concatenated in match order.\r\n */\r\nexport function firstConcatenatedText(root: unknown, paths: readonly string[]): string | undefined {\r\n for (const path of paths) {\r\n const strings = valuesAtPointer(root, path).filter((value): value is string => typeof value === \"string\" && value.length > 0);\r\n if (strings.length > 0) return strings.join(\"\");\r\n }\r\n return undefined;\r\n}\r\n\r\n/** Ordered alternatives. The first finite number wins. */\r\nexport function firstNumber(root: unknown, paths: readonly string[]): number | undefined {\r\n for (const path of paths) {\r\n for (const value of valuesAtPointer(root, path)) {\r\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction collectParents(current: unknown, tokens: readonly string[]): unknown[] {\r\n if (tokens.length === 0) return [current];\r\n const [head, ...rest] = tokens;\r\n if (head === undefined) return [];\r\n if (head === \"*\") {\r\n if (!Array.isArray(current)) return [];\r\n return current.flatMap((item) => collectParents(item, rest));\r\n }\r\n if (Array.isArray(current)) {\r\n if (!/^\\d+$/.test(head)) return [];\r\n const index = Number(head);\r\n if (index >= current.length) return [];\r\n return collectParents(current[index], rest);\r\n }\r\n if (!isRecord(current) || !Object.prototype.hasOwnProperty.call(current, head)) return [];\r\n return collectParents(current[head], rest);\r\n}\r\n\r\n/** Delete one pointer from a clone. Missing paths and unsafe keys are ignored. */\r\nexport function deletePointer(root: unknown, pointer: string): void {\r\n const tokens = tokensFor(pointer);\r\n if (!tokens || tokens.length === 0) return;\r\n const last = tokens[tokens.length - 1];\r\n if (last === undefined || last === \"*\") return;\r\n const parents = collectParents(root, tokens.slice(0, -1));\r\n for (const parent of parents) {\r\n if (Array.isArray(parent)) {\r\n if (!/^\\d+$/.test(last)) continue;\r\n const index = Number(last);\r\n if (index < parent.length) parent.splice(index, 1);\r\n continue;\r\n }\r\n if (isRecord(parent) && Object.prototype.hasOwnProperty.call(parent, last)) {\r\n delete parent[last];\r\n }\r\n }\r\n}\r\n","import type { ReasoningResponseMetadata } from \"@x12i/ai-profiles\";\r\nimport { firstConcatenatedText, firstNumber } from \"./json-pointer\";\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction textFromValue(value: unknown): string {\r\n if (typeof value === \"string\") return value;\r\n if (Array.isArray(value)) return value.map(textFromValue).join(\"\");\r\n if (!isRecord(value)) return \"\";\r\n if (typeof value.text === \"string\") return value.text;\r\n if (typeof value.summary === \"string\") return value.summary;\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Stream keys and stream paths are ordered alternatives.\r\n * The first one that yields text wins. Fragments inside that one value are concatenated.\r\n */\r\nexport function extractStreamReasoningText(event: unknown, response: ReasoningResponseMetadata): string | undefined {\r\n if (response.streamReasoningKeys.length > 0) {\r\n if (!isRecord(event)) return undefined;\r\n for (const key of response.streamReasoningKeys) {\r\n const text = textFromValue(event[key]);\r\n if (text) return text;\r\n }\r\n return undefined;\r\n }\r\n return firstConcatenatedText(event, response.streamReasoningPaths);\r\n}\r\n\r\n/**\r\n * Read the first reasoning-token path. A `/usage/...` path is also tried against a bare usage object.\r\n */\r\nexport function readReasoningTokens(root: unknown, paths: readonly string[]): number | undefined {\r\n for (const path of paths) {\r\n const absolute = firstNumber(root, [path]);\r\n if (absolute !== undefined) return absolute;\r\n if (path.startsWith(\"/usage/\")) {\r\n const relative = firstNumber(root, [path.slice(\"/usage\".length)]);\r\n if (relative !== undefined) return relative;\r\n }\r\n }\r\n return undefined;\r\n}\r\n","const OPEN = \"<think>\";\r\nconst CLOSE = \"</think>\";\r\n\r\nfunction holdSuffix(buffer: string, tag: string): number {\r\n const max = Math.min(buffer.length, tag.length - 1);\r\n for (let size = max; size > 0; size -= 1) {\r\n if (tag.startsWith(buffer.slice(buffer.length - size))) return size;\r\n }\r\n return 0;\r\n}\r\n\r\n/**\r\n * Separates `<think>...</think>` from answer text.\r\n * Tags may arrive split across chunks. An unclosed section is not released as answer text.\r\n */\r\nexport class ThinkTagSplitter {\r\n private pending = \"\";\r\n private inThink = false;\r\n answer = \"\";\r\n reasoning = \"\";\r\n\r\n push(chunk: string): { answerDelta: string; reasoningDelta: string } {\r\n this.pending += chunk;\r\n let answerDelta = \"\";\r\n let reasoningDelta = \"\";\r\n while (this.pending.length > 0) {\r\n if (!this.inThink) {\r\n const openAt = this.pending.indexOf(OPEN);\r\n if (openAt >= 0) {\r\n answerDelta += this.pending.slice(0, openAt);\r\n this.pending = this.pending.slice(openAt + OPEN.length);\r\n this.inThink = true;\r\n continue;\r\n }\r\n const hold = holdSuffix(this.pending, OPEN);\r\n answerDelta += this.pending.slice(0, this.pending.length - hold);\r\n this.pending = this.pending.slice(this.pending.length - hold);\r\n break;\r\n }\r\n const closeAt = this.pending.indexOf(CLOSE);\r\n if (closeAt >= 0) {\r\n reasoningDelta += this.pending.slice(0, closeAt);\r\n this.pending = this.pending.slice(closeAt + CLOSE.length);\r\n this.inThink = false;\r\n continue;\r\n }\r\n const hold = holdSuffix(this.pending, CLOSE);\r\n reasoningDelta += this.pending.slice(0, this.pending.length - hold);\r\n this.pending = this.pending.slice(this.pending.length - hold);\r\n break;\r\n }\r\n this.answer += answerDelta;\r\n this.reasoning += reasoningDelta;\r\n return { answerDelta, reasoningDelta };\r\n }\r\n\r\n finish(): { answerDelta: string; reasoningDelta: string } {\r\n if (this.inThink) {\r\n const reasoningDelta = this.pending;\r\n this.pending = \"\";\r\n this.reasoning += reasoningDelta;\r\n return { answerDelta: \"\", reasoningDelta };\r\n }\r\n const answerDelta = this.pending;\r\n this.pending = \"\";\r\n this.answer += answerDelta;\r\n return { answerDelta, reasoningDelta: \"\" };\r\n }\r\n}\r\n\r\nexport function splitThinkTags(text: string): { answer: string; reasoning: string } {\r\n const splitter = new ThinkTagSplitter();\r\n splitter.push(text);\r\n splitter.finish();\r\n return { answer: splitter.answer, reasoning: splitter.reasoning };\r\n}\r\n","import type { ReasoningDirective } from \"@x12i/ai-profiles\";\r\nimport type { RuntimeResponse, RuntimeUsage } from \"@x12i/openrouter-runtime\";\r\nimport { readCacheTokens } from \"./cache-usage\";\r\nimport { firstConcatenatedText } from \"./json-pointer\";\r\nimport type { PreparedDispatch } from \"./prepare-request\";\r\nimport { readReasoningTokens } from \"./reasoning-extract\";\r\nimport { splitThinkTags } from \"./think-tags\";\r\nimport type { AiDispatcherResponse } from \"./types/public\";\r\n\r\nexport function applyResolution(response: RuntimeResponse, prepared: PreparedDispatch): AiDispatcherResponse {\r\n const result = response as AiDispatcherResponse;\r\n if (prepared.resolution) result.reasoningResolution = prepared.resolution;\r\n if (prepared.cacheResolution) result.cacheResolution = prepared.cacheResolution;\r\n if (prepared.cacheWarnings?.length) {\r\n result.warnings = [...result.warnings, ...prepared.cacheWarnings];\r\n }\r\n applyCacheUsage(result);\r\n const directive = prepared.directive;\r\n if (!directive) return result;\r\n\r\n const raw = response.raw?.response;\r\n const pathText = firstConcatenatedText(raw, directive.response.reasoningTextPaths);\r\n let tagText: string | undefined;\r\n if (directive.response.stripThinkTags) {\r\n const split = splitThinkTags(result.text);\r\n result.text = split.answer;\r\n if (split.reasoning) tagText = split.reasoning;\r\n }\r\n const reasoningText = pathText ?? tagText;\r\n if (reasoningText) result.reasoningText = reasoningText;\r\n applyUsage(result, raw, directive);\r\n return result;\r\n}\r\n\r\nfunction applyCacheUsage(response: AiDispatcherResponse): void {\r\n const fromResponse = readCacheTokens(response.raw?.response);\r\n const fromUsage = readCacheTokens(response.usage?.raw);\r\n const cachedTokens = fromResponse.cachedTokens ?? fromUsage.cachedTokens;\r\n const cacheWriteTokens = fromResponse.cacheWriteTokens ?? fromUsage.cacheWriteTokens;\r\n if (cachedTokens === undefined && cacheWriteTokens === undefined) return;\r\n response.usage = {\r\n ...(response.usage ?? {}),\r\n ...(cachedTokens !== undefined ? { cachedTokens } : {}),\r\n ...(cacheWriteTokens !== undefined ? { cacheWriteTokens } : {})\r\n };\r\n}\r\n\r\nfunction applyUsage(response: AiDispatcherResponse, raw: unknown, directive: ReasoningDirective): void {\r\n const paths = directive.usage?.reasoningTokenPaths;\r\n if (!paths || paths.length === 0) return;\r\n const tokens = readReasoningTokens(raw, paths);\r\n if (tokens === undefined) {\r\n if (!response.usage || response.usage.reasoningTokens === undefined) return;\r\n const usage: RuntimeUsage = { ...response.usage };\r\n delete usage.reasoningTokens;\r\n response.usage = usage;\r\n return;\r\n }\r\n response.usage = { ...(response.usage ?? {}), reasoningTokens: tokens };\r\n}\r\n","import type { RuntimeStreamEvent, RuntimeUsage } from \"@x12i/openrouter-runtime\";\r\nimport { readCacheTokens } from \"./cache-usage\";\r\nimport type { PreparedDispatch } from \"./prepare-request\";\r\nimport { readReasoningTokens } from \"./reasoning-extract\";\r\nimport { ThinkTagSplitter } from \"./think-tags\";\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nexport async function* decorateStream(\r\n prepared: PreparedDispatch,\r\n source: AsyncIterable<RuntimeStreamEvent>\r\n): AsyncGenerator<RuntimeStreamEvent> {\r\n const splitter = prepared.directive?.response.stripThinkTags ? new ThinkTagSplitter() : undefined;\r\n let reasoningText = \"\";\r\n\r\n for await (const event of source) {\r\n if (event.type === \"stream.start\") {\r\n yield withResolution(event, prepared);\r\n for (const warning of prepared.cacheWarnings ?? []) {\r\n yield { type: \"stream.warning\", requestId: event.requestId, data: { warning } };\r\n }\r\n continue;\r\n }\r\n\r\n if (event.type === \"stream.reasoning.delta\") {\r\n const text = textOf(event);\r\n if (text) reasoningText += text;\r\n yield event;\r\n continue;\r\n }\r\n\r\n if (event.type === \"stream.text.delta\" && splitter) {\r\n const pushed = splitter.push(textOf(event));\r\n if (pushed.reasoningDelta) {\r\n reasoningText += pushed.reasoningDelta;\r\n yield {\r\n type: \"stream.reasoning.delta\",\r\n requestId: event.requestId,\r\n data: { text: pushed.reasoningDelta }\r\n };\r\n }\r\n if (pushed.answerDelta) {\r\n yield { ...event, data: { text: pushed.answerDelta } };\r\n }\r\n continue;\r\n }\r\n\r\n if (event.type === \"stream.usage\") {\r\n yield adjustUsageEvent(event, prepared);\r\n continue;\r\n }\r\n\r\n if (event.type === \"stream.done\") {\r\n if (splitter) {\r\n const finished = splitter.finish();\r\n if (finished.reasoningDelta) {\r\n reasoningText += finished.reasoningDelta;\r\n yield {\r\n type: \"stream.reasoning.delta\",\r\n requestId: event.requestId,\r\n data: { text: finished.reasoningDelta }\r\n };\r\n }\r\n if (finished.answerDelta) {\r\n yield {\r\n type: \"stream.text.delta\",\r\n requestId: event.requestId,\r\n data: { text: finished.answerDelta }\r\n };\r\n }\r\n }\r\n const data = isRecord(event.data) ? { ...event.data } : {};\r\n if (splitter) data.text = splitter.answer;\r\n if (reasoningText) data.reasoningText = reasoningText;\r\n if (prepared.resolution) data.reasoningResolution = prepared.resolution;\r\n if (prepared.cacheResolution) data.cacheResolution = prepared.cacheResolution;\r\n yield { ...event, data };\r\n continue;\r\n }\r\n\r\n yield event;\r\n }\r\n}\r\n\r\nfunction withResolution(event: RuntimeStreamEvent, prepared: PreparedDispatch): RuntimeStreamEvent {\r\n if (!prepared.resolution && !prepared.cacheResolution) return event;\r\n const data = isRecord(event.data) ? { ...event.data } : {};\r\n if (prepared.resolution) data.reasoningResolution = prepared.resolution;\r\n if (prepared.cacheResolution) data.cacheResolution = prepared.cacheResolution;\r\n return { ...event, data };\r\n}\r\n\r\nfunction textOf(event: RuntimeStreamEvent): string {\r\n if (!isRecord(event.data) || typeof event.data.text !== \"string\") return \"\";\r\n return event.data.text;\r\n}\r\n\r\nfunction adjustUsageEvent(event: RuntimeStreamEvent, prepared: PreparedDispatch): RuntimeStreamEvent {\r\n if (!isRecord(event.data) || !isRecord(event.data.usage)) return event;\r\n const paths = prepared.directive?.usage?.reasoningTokenPaths;\r\n const usage = { ...(event.data.usage as RuntimeUsage) };\r\n let changed = false;\r\n if (paths && paths.length > 0) {\r\n const tokens = readReasoningTokens(usage.raw, paths);\r\n if (tokens === undefined) {\r\n if (usage.reasoningTokens !== undefined) {\r\n delete usage.reasoningTokens;\r\n changed = true;\r\n }\r\n } else if (usage.reasoningTokens !== tokens) {\r\n usage.reasoningTokens = tokens;\r\n changed = true;\r\n }\r\n }\r\n const counts = readCacheTokens(usage.raw);\r\n if (counts.cachedTokens !== undefined) {\r\n (usage as RuntimeUsage & { cachedTokens?: number }).cachedTokens = counts.cachedTokens;\r\n changed = true;\r\n }\r\n if (counts.cacheWriteTokens !== undefined) {\r\n (usage as RuntimeUsage & { cacheWriteTokens?: number }).cacheWriteTokens = counts.cacheWriteTokens;\r\n changed = true;\r\n }\r\n if (!changed) return event;\r\n return { ...event, data: { ...event.data, usage } };\r\n}\r\n","export type AiProviderId =\r\n | \"openrouter\"\r\n | \"openai\"\r\n | \"anthropic\"\r\n | \"google\"\r\n | \"azure\"\r\n | \"bedrock\"\r\n | \"groq\"\r\n | \"mistral\"\r\n | \"cohere\"\r\n | \"together\"\r\n | \"fireworks\"\r\n | \"xai\"\r\n | \"deepseek\"\r\n | \"cloudflare\"\r\n | \"custom\";\r\n\r\nexport const IMPLEMENTED_AI_PROVIDERS = [\"openrouter\", \"bedrock\", \"openai\", \"cloudflare\"] as const satisfies readonly AiProviderId[];\r\n\r\nexport type ImplementedAiProvider = (typeof IMPLEMENTED_AI_PROVIDERS)[number];\r\n\r\nexport function isImplementedAiProvider(provider: string): provider is ImplementedAiProvider {\r\n return (IMPLEMENTED_AI_PROVIDERS as readonly string[]).includes(provider);\r\n}\r\n","import { IMPLEMENTED_AI_PROVIDERS } from \"./types/providers\";\r\n\r\nexport class AiDispatcherError extends Error {\r\n constructor(\r\n public readonly code: string,\r\n message: string,\r\n public readonly details?: unknown\r\n ) {\r\n super(message);\r\n this.name = \"AiDispatcherError\";\r\n }\r\n}\r\n\r\nexport function providerNotImplemented(provider: string): AiDispatcherError {\r\n const implemented = [...IMPLEMENTED_AI_PROVIDERS];\r\n return new AiDispatcherError(\r\n \"PROVIDER_NOT_IMPLEMENTED\",\r\n `AI provider \"${provider}\" is not implemented yet. Supported by @x12i/ai-dispatcher: ${implemented\r\n .map((id) => `\"${id}\"`)\r\n .join(\", \")}.`,\r\n {\r\n provider,\r\n implementedProviders: implemented,\r\n operatorHint: `Pass provider: \"${implemented[0]}\" (or omit provider to use the default).`\r\n }\r\n );\r\n}\r\n","import type { RuntimeToolExecutor } from \"@x12i/openrouter-runtime\";\r\nimport { AiDispatcherError } from \"./errors\";\r\nimport type {\r\n AiDispatcherRequest,\r\n DispatcherMcpOptions,\r\n DispatcherMcpServer,\r\n DispatcherMcpTool\r\n} from \"./types/public\";\r\n\r\nconst TOOL_TOKEN = /^[A-Za-z0-9_-]+$/;\r\nconst MAX_EXPOSED_NAME_LENGTH = 64;\r\nconst DEFAULT_PARAMETERS: Record<string, unknown> = { type: \"object\", properties: {} };\r\n\r\nexport interface IndexedMcpTool {\r\n exposedName: string;\r\n rawName: string;\r\n description: string;\r\n parameters: Record<string, unknown>;\r\n server: DispatcherMcpServer;\r\n}\r\n\r\nexport interface McpCatalog {\r\n servers: DispatcherMcpServer[];\r\n tools: IndexedMcpTool[];\r\n}\r\n\r\nexport function createMcpCatalog(mcp: DispatcherMcpOptions | undefined): McpCatalog {\r\n if (mcp === undefined) return { servers: [], tools: [] };\r\n if (!Array.isArray(mcp.servers)) {\r\n throw new AiDispatcherError(\"MCP_SERVER_INVALID\", \"mcp.servers must be an array.\");\r\n }\r\n return {\r\n servers: mcp.servers,\r\n tools: indexMcpServers(mcp.servers)\r\n };\r\n}\r\n\r\nexport function indexMcpServers(servers: DispatcherMcpServer[]): IndexedMcpTool[] {\r\n const seenServers = new Set<string>();\r\n const seenTools = new Set<string>();\r\n const indexed: IndexedMcpTool[] = [];\r\n\r\n for (const server of servers) {\r\n assertServer(server, seenServers);\r\n for (const tool of server.tools) {\r\n if (!isRecord(tool)) {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NAME_INVALID\",\r\n `MCP server \"${server.id}\" has a tool that is not an object.`\r\n );\r\n }\r\n const exposedName = exposedToolName(server.id, tool);\r\n if (seenTools.has(exposedName)) {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NAME_CONFLICT\",\r\n `MCP tool \"${exposedName}\" is defined more than once.`\r\n );\r\n }\r\n seenTools.add(exposedName);\r\n indexed.push({\r\n exposedName,\r\n rawName: tool.name,\r\n description: toolDescription(tool),\r\n parameters: toolParameters(tool),\r\n server\r\n });\r\n }\r\n }\r\n\r\n return indexed;\r\n}\r\n\r\nexport async function refreshMcpCatalog(catalog: McpCatalog): Promise<void> {\r\n const listed = new Map<string, DispatcherMcpTool[]>();\r\n for (const server of catalog.servers) {\r\n if (!server.listTools) continue;\r\n let tools: DispatcherMcpTool[];\r\n try {\r\n tools = await server.listTools();\r\n } catch (error) {\r\n throw listFailed(server.id, error);\r\n }\r\n if (!Array.isArray(tools)) {\r\n throw new AiDispatcherError(\r\n \"MCP_LIST_FAILED\",\r\n `MCP server \"${server.id}\" listTools did not return an array.`\r\n );\r\n }\r\n listed.set(server.id, tools);\r\n }\r\n\r\n const draft = catalog.servers.map((server) => {\r\n const tools = listed.get(server.id);\r\n return tools ? { ...server, tools } : server;\r\n });\r\n try {\r\n indexMcpServers(draft);\r\n } catch (error) {\r\n throw new AiDispatcherError(\r\n \"MCP_LIST_FAILED\",\r\n error instanceof Error ? error.message : \"MCP tool list is invalid.\"\r\n );\r\n }\r\n\r\n for (const server of catalog.servers) {\r\n const tools = listed.get(server.id);\r\n if (tools) server.tools = tools;\r\n }\r\n catalog.tools = indexMcpServers(catalog.servers);\r\n}\r\n\r\nexport function applyMcpCatalog(params: {\r\n request: AiDispatcherRequest;\r\n catalog: McpCatalog;\r\n providerTools?: Record<string, RuntimeToolExecutor | undefined>;\r\n includeMcp: boolean;\r\n}): void {\r\n const filter = params.request.mcp;\r\n delete params.request.mcp;\r\n if (!params.includeMcp || filter === false || (Array.isArray(filter) && filter.length === 0)) return;\r\n\r\n const allowed = resolveAllowlist(filter, params.catalog.tools);\r\n const requestTools = params.request.functionTools ?? [];\r\n const requestNames = new Set(requestTools.map((tool) => tool.name));\r\n const injected = [];\r\n\r\n for (const entry of params.catalog.tools) {\r\n if (allowed && !allowed.has(entry.exposedName)) continue;\r\n if (requestNames.has(entry.exposedName)) continue;\r\n const clientExecutor = params.providerTools?.[entry.exposedName];\r\n injected.push({\r\n name: entry.exposedName,\r\n description: entry.description,\r\n parameters: entry.parameters,\r\n ...(typeof clientExecutor === \"function\"\r\n ? {}\r\n : { executor: createMcpExecutor(entry.server, entry.rawName) })\r\n });\r\n }\r\n\r\n if (injected.length) {\r\n params.request.functionTools = [...injected, ...requestTools];\r\n }\r\n}\r\n\r\nfunction createMcpExecutor(server: DispatcherMcpServer, rawName: string): RuntimeToolExecutor {\r\n return async (args, context) => {\r\n const result = await server.callTool(rawName, toArgs(args), context);\r\n return flattenMcpResult(result);\r\n };\r\n}\r\n\r\nexport function flattenMcpResult(result: unknown): string {\r\n if (typeof result === \"string\") return result;\r\n if (!isRecord(result)) return stringify(result);\r\n const text = textContent(result.content);\r\n if (result.isError === true) {\r\n throw new Error(text ?? stringify(result));\r\n }\r\n if (text !== undefined) return text;\r\n return stringify(result);\r\n}\r\n\r\nfunction resolveAllowlist(\r\n filter: AiDispatcherRequest[\"mcp\"],\r\n tools: IndexedMcpTool[]\r\n): Set<string> | undefined {\r\n if (filter === undefined) return undefined;\r\n if (!Array.isArray(filter) || filter.some((name) => typeof name !== \"string\")) {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NOT_FOUND\",\r\n \"request.mcp must be false or a list of exposed tool names.\"\r\n );\r\n }\r\n const known = new Set(tools.map((tool) => tool.exposedName));\r\n for (const name of filter) {\r\n if (!known.has(name)) {\r\n throw new AiDispatcherError(\"MCP_TOOL_NOT_FOUND\", `MCP tool \"${name}\" is not registered.`);\r\n }\r\n }\r\n return new Set(filter);\r\n}\r\n\r\nfunction assertServer(server: DispatcherMcpServer, seen: Set<string>): void {\r\n if (\r\n !isRecord(server) ||\r\n typeof server.id !== \"string\" ||\r\n server.id.length === 0 ||\r\n !Array.isArray(server.tools) ||\r\n typeof server.callTool !== \"function\"\r\n ) {\r\n throw new AiDispatcherError(\r\n \"MCP_SERVER_INVALID\",\r\n \"An MCP server needs an id, a tools array, and a callTool function.\"\r\n );\r\n }\r\n if (seen.has(server.id)) {\r\n throw new AiDispatcherError(\"MCP_SERVER_INVALID\", `MCP server \"${server.id}\" is listed more than once.`);\r\n }\r\n seen.add(server.id);\r\n if (!TOOL_TOKEN.test(server.id)) {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NAME_INVALID\",\r\n `MCP server id \"${server.id}\" must use letters, numbers, underscores, and hyphens.`\r\n );\r\n }\r\n}\r\n\r\nfunction exposedToolName(serverId: string, tool: { name?: unknown }): string {\r\n if (typeof tool.name !== \"string\" || !TOOL_TOKEN.test(serverId) || !TOOL_TOKEN.test(tool.name)) {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NAME_INVALID\",\r\n `MCP tool \"${serverId}.${typeof tool.name === \"string\" ? tool.name : \"\"}\" must use letters, numbers, underscores, and hyphens.`\r\n );\r\n }\r\n const exposedName = `${serverId}__${tool.name}`;\r\n if (exposedName.length > MAX_EXPOSED_NAME_LENGTH) {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NAME_INVALID\",\r\n `MCP tool \"${exposedName}\" is longer than ${MAX_EXPOSED_NAME_LENGTH} characters.`\r\n );\r\n }\r\n return exposedName;\r\n}\r\n\r\nfunction toolDescription(tool: { name?: unknown; description?: unknown }): string {\r\n if (tool.description === undefined) return \"\";\r\n if (typeof tool.description !== \"string\") {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NAME_INVALID\",\r\n `MCP tool \"${tool.name}\" description must be a string.`\r\n );\r\n }\r\n return tool.description;\r\n}\r\n\r\nfunction toolParameters(tool: { name?: unknown; inputSchema?: unknown }): Record<string, unknown> {\r\n if (tool.inputSchema === undefined) return { ...DEFAULT_PARAMETERS, properties: {} };\r\n if (!isRecord(tool.inputSchema)) {\r\n throw new AiDispatcherError(\r\n \"MCP_TOOL_NAME_INVALID\",\r\n `MCP tool \"${tool.name}\" inputSchema must be an object.`\r\n );\r\n }\r\n return tool.inputSchema;\r\n}\r\n\r\nfunction textContent(content: unknown): string | undefined {\r\n if (!Array.isArray(content)) return undefined;\r\n const parts: string[] = [];\r\n for (const part of content) {\r\n if (!isRecord(part) || part.type !== \"text\" || typeof part.text !== \"string\") continue;\r\n parts.push(part.text);\r\n }\r\n if (!parts.length) return undefined;\r\n return parts.join(\"\\n\");\r\n}\r\n\r\nfunction toArgs(args: unknown): Record<string, unknown> {\r\n if (isRecord(args)) return args;\r\n return {};\r\n}\r\n\r\nfunction listFailed(serverId: string, error: unknown): AiDispatcherError {\r\n if (error instanceof AiDispatcherError && error.code === \"MCP_LIST_FAILED\") return error;\r\n const message = error instanceof Error ? error.message : `MCP server \"${serverId}\" listTools failed.`;\r\n return new AiDispatcherError(\"MCP_LIST_FAILED\", message);\r\n}\r\n\r\nfunction stringify(result: unknown): string {\r\n const serialized = JSON.stringify(result);\r\n return serialized === undefined ? \"null\" : serialized;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n","import {\r\n AIProfilesError,\r\n mergeReasoningBody,\r\n resolveReasoning,\r\n type ReasoningDirective,\r\n type ReasoningEffort,\r\n type ReasoningTarget\r\n} from \"@x12i/ai-profiles\";\r\nimport type { AdvisorPolicy, FusionPolicy, RuntimeMessage, RuntimeRequest, RuntimeWarning, SubagentPolicy } from \"@x12i/openrouter-runtime\";\r\nimport { applyPromptCache } from \"./cache-apply\";\r\nimport { resolvePromptCache } from \"./cache-profiles\";\r\nimport { AiDispatcherError } from \"./errors\";\r\nimport { cloudflareCatalogQuery, restoreCloudflareModel, selectCloudflareEndpoint } from \"./providers/cloudflare\";\r\nimport { extractStreamReasoningText } from \"./reasoning-extract\";\r\nimport type { CloudflareGatewayControls, CloudflareRequestOptions } from \"./types/cloudflare\";\r\nimport type { ImplementedAiProvider } from \"./types/providers\";\r\nimport type { AiDispatcherOptions, AiDispatcherRequest, CacheResolution, ProviderCallOptions, ReasoningResolution } from \"./types/public\";\r\n\r\nexport interface PreparedDispatch {\r\n provider: ImplementedAiProvider;\r\n request: RuntimeRequest;\r\n requestedModel: string;\r\n effectiveModel: string;\r\n resolution?: ReasoningResolution;\r\n directive?: ReasoningDirective;\r\n cacheResolution?: CacheResolution;\r\n cacheWarnings?: RuntimeWarning[];\r\n call: ProviderCallOptions;\r\n}\r\n\r\ninterface NestedReasoningPolicy {\r\n reasoning?: Record<string, unknown>;\r\n reasoningEffort?: ReasoningEffort;\r\n model?: string;\r\n judgeModel?: string;\r\n}\r\n\r\nexport function prepareDispatchRequest(params: {\r\n request: AiDispatcherRequest;\r\n provider: ImplementedAiProvider;\r\n options: AiDispatcherOptions;\r\n}): PreparedDispatch {\r\n const cloned = cloneRequest(params.request);\r\n applyRoleStamp(cloned);\r\n applyDispatchIdentity(cloned);\r\n absorbOverrideMetadata(cloned);\r\n const provider = params.provider;\r\n const reasoningEffort = cloned.reasoningEffort;\r\n const bedrockControls = cloned.bedrockControls;\r\n const cachePolicy = cloned.cache;\r\n const cloudflareRequest = cloned.cloudflare;\r\n delete cloned.provider;\r\n delete cloned.reasoningEffort;\r\n delete cloned.bedrockControls;\r\n delete cloned.cache;\r\n delete cloned.cloudflare;\r\n\r\n if (provider === \"openai\") assertOpenAiConfigured(params.options);\r\n if (provider === \"cloudflare\") assertCloudflareConfigured(params.options);\r\n if (provider === \"bedrock\" && cloned.reasoning !== undefined) {\r\n if (bedrockControls?.additionalModelRequestFields === undefined && reasoningEffort === undefined) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Bedrock does not accept an OpenRouter reasoning object. Set reasoningEffort, or set bedrockControls.additionalModelRequestFields.\"\r\n );\r\n }\r\n delete cloned.reasoning;\r\n }\r\n\r\n const requestedModel = cloned.model ?? defaultModelFor(provider, params.options) ?? \"\";\r\n const explicit = hasExplicitControl(provider, cloned, bedrockControls);\r\n let directive: ReasoningDirective | undefined;\r\n let catalogPrefix: string | undefined;\r\n if (!explicit && reasoningEffort !== undefined) {\r\n if (!requestedModel) {\r\n throw new AiDispatcherError(\r\n \"REASONING_MODEL_REQUIRED\",\r\n \"reasoningEffort requires a model id. Set request.model or the provider defaultModel.\"\r\n );\r\n }\r\n if (provider === \"cloudflare\") {\r\n const query = cloudflareCatalogQuery(requestedModel);\r\n catalogPrefix = query.prefix;\r\n directive = resolveCatalog({ target: query.target, model: query.model, effort: reasoningEffort }, true);\r\n } else if (isReasoningTarget(provider)) {\r\n directive = resolveCatalog({ target: provider, model: requestedModel, effort: reasoningEffort }, false);\r\n }\r\n }\r\n\r\n if (provider === \"openrouter\") {\r\n applyNestedReasoning(cloned, reasoningEffort);\r\n }\r\n\r\n if (directive?.model) {\r\n cloned.model = provider === \"cloudflare\"\r\n ? restoreCloudflareModel(directive.model, catalogPrefix)\r\n : directive.model;\r\n }\r\n if (directive?.promptPrefix) applyPromptPrefix(cloned, directive.promptPrefix);\r\n\r\n const effectiveModel = cloned.model ?? requestedModel;\r\n const requestedEndpoint = cloudflareRequest?.endpoint ?? params.options.cloudflare?.endpoint;\r\n const cloudflareEndpoint = provider === \"cloudflare\"\r\n ? selectCloudflareEndpoint({\r\n model: effectiveModel,\r\n ...(requestedEndpoint ? { endpoint: requestedEndpoint } : {}),\r\n ...(cloned.apiMode ? { apiMode: cloned.apiMode } : {})\r\n })\r\n : undefined;\r\n const call: ProviderCallOptions = {};\r\n if (reasoningEffort !== undefined && provider === \"openrouter\") {\r\n call.suppressNestedReasoningFallback = true;\r\n }\r\n\r\n const overlay = directive && hasOwnKeys(directive.body)\r\n ? directive.body\r\n : explicit && provider === \"bedrock\" && bedrockControls?.additionalModelRequestFields\r\n ? { additionalModelRequestFields: bedrockControls.additionalModelRequestFields }\r\n : undefined;\r\n\r\n const cache = cachePolicy\r\n ? resolvePromptCache({\r\n target: provider,\r\n requestedModel,\r\n effectiveModel,\r\n policy: cachePolicy,\r\n ...(cloudflareEndpoint ? { cloudflareEndpoint } : {})\r\n })\r\n : undefined;\r\n const cachePlan = cache?.plan;\r\n const cacheWarnings = cache?.warnings;\r\n const cacheResolution = cache?.resolution;\r\n const cacheTouchesBody = Boolean(\r\n cachePlan && (cachePlan.stripMarkers || cachePlan.placeBreakpoint || cachePlan.sendOpenAiOptions)\r\n );\r\n if (overlay || cacheTouchesBody) {\r\n const bodyOverlay = overlay;\r\n call.finalizeBody = (body) => {\r\n const merged = bodyOverlay ? mergeReasoningBody(body, bodyOverlay) : body;\r\n if (!cacheTouchesBody || !cachePlan) return merged;\r\n const applied = applyPromptCache(merged, cachePlan);\r\n if (cachePlan.placeBreakpoint && !applied.placed) {\r\n noteUnplacedCache(cacheResolution, cacheWarnings, provider, effectiveModel);\r\n return merged;\r\n }\r\n return applied.body;\r\n };\r\n }\r\n if (provider === \"cloudflare\" && cloudflareEndpoint) {\r\n const gateway = mergeCloudflareGateway(params.options.cloudflare, cloudflareRequest);\r\n const gatewayId = cloudflareRequest?.gatewayId ?? params.options.cloudflare?.gatewayId;\r\n call.cloudflare = {\r\n endpoint: cloudflareEndpoint,\r\n ...(gatewayId ? { gatewayId } : {}),\r\n ...(cloudflareRequest?.run ? { run: cloudflareRequest.run } : {}),\r\n ...(gateway ? { gateway } : {}),\r\n ...(cache?.plan.gateway ? { cache: cache.plan.gateway } : {})\r\n };\r\n }\r\n if (directive && hasStreamMetadata(directive)) {\r\n const response = directive.response;\r\n call.extractStreamReasoning = (event) => extractStreamReasoningText(event, response);\r\n }\r\n\r\n const resolution = reasoningEffort !== undefined || explicit\r\n ? buildResolution({\r\n requestedEffort: reasoningEffort,\r\n target: provider,\r\n requestedModel,\r\n effectiveModel,\r\n bypassed: explicit,\r\n outcome: explicit ? undefined : directive?.outcome\r\n })\r\n : undefined;\r\n\r\n return {\r\n provider,\r\n request: cloned,\r\n requestedModel,\r\n effectiveModel,\r\n ...(resolution ? { resolution } : {}),\r\n ...(directive ? { directive } : {}),\r\n ...(cacheResolution ? { cacheResolution } : {}),\r\n ...(cacheWarnings ? { cacheWarnings } : {}),\r\n call\r\n };\r\n}\r\n\r\nfunction noteUnplacedCache(\r\n resolution: CacheResolution | undefined,\r\n warnings: RuntimeWarning[] | undefined,\r\n target: ImplementedAiProvider,\r\n model: string\r\n): void {\r\n if (resolution) {\r\n resolution.outcome = \"ignored\";\r\n delete resolution.ttl;\r\n }\r\n if (!warnings) return;\r\n const kept = warnings.filter((warning) => warning.code !== \"CACHE_TTL_DEGRADED\");\r\n warnings.length = 0;\r\n warnings.push(...kept, {\r\n code: \"CACHE_UNSUPPORTED\",\r\n message: \"Explicit prompt caching needs a system or instructions prefix. The call still runs without a breakpoint.\",\r\n details: { target, model }\r\n });\r\n}\r\n\r\nfunction resolveCatalog(\r\n input: { target: ReasoningTarget; model: string; effort: ReasoningEffort },\r\n ignoreUnknown: boolean\r\n): ReasoningDirective {\r\n try {\r\n return resolveReasoning(input);\r\n } catch (error) {\r\n if (error instanceof AIProfilesError) {\r\n if (ignoreUnknown && (error.code === \"UNKNOWN_MODEL\" || error.code === \"REASONING_MAPPING_MISSING\")) {\r\n return {\r\n outcome: \"ignored\",\r\n body: {},\r\n response: {\r\n reasoningTextPaths: [],\r\n streamReasoningKeys: [],\r\n streamReasoningPaths: [],\r\n stripFromHistoryPaths: [],\r\n stripThinkTags: false\r\n }\r\n };\r\n }\r\n throw new AiDispatcherError(error.code, error.message, error.details);\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nfunction isReasoningTarget(provider: ImplementedAiProvider): provider is ReasoningTarget {\r\n return provider === \"openrouter\" || provider === \"bedrock\" || provider === \"openai\";\r\n}\r\n\r\nfunction hasExplicitControl(\r\n provider: ImplementedAiProvider,\r\n request: AiDispatcherRequest,\r\n bedrockControls: AiDispatcherRequest[\"bedrockControls\"]\r\n): boolean {\r\n if (provider === \"bedrock\") return bedrockControls?.additionalModelRequestFields !== undefined;\r\n return request.reasoning !== undefined;\r\n}\r\n\r\nfunction buildResolution(params: {\r\n requestedEffort: ReasoningEffort | undefined;\r\n target: ImplementedAiProvider;\r\n requestedModel: string;\r\n effectiveModel: string;\r\n bypassed: boolean;\r\n outcome: ReasoningResolution[\"outcome\"];\r\n}): ReasoningResolution {\r\n return {\r\n target: params.target,\r\n requestedModel: params.requestedModel,\r\n effectiveModel: params.effectiveModel,\r\n bypassed: params.bypassed,\r\n ...(params.requestedEffort ? { requestedEffort: params.requestedEffort } : {}),\r\n ...(params.outcome ? { outcome: params.outcome } : {})\r\n };\r\n}\r\n\r\nfunction applyNestedReasoning(request: AiDispatcherRequest, parentEffort: ReasoningEffort | undefined): void {\r\n const serverTools = request.serverTools;\r\n if (!serverTools) return;\r\n if (serverTools.fusion) serverTools.fusion = settleNested(serverTools.fusion, \"fusion\", parentEffort);\r\n if (serverTools.advisor) {\r\n serverTools.advisor = Array.isArray(serverTools.advisor)\r\n ? serverTools.advisor.map((advisor) => settleNested(advisor, \"advisor\", parentEffort))\r\n : settleNested(serverTools.advisor, \"advisor\", parentEffort);\r\n }\r\n if (serverTools.subagent) serverTools.subagent = settleNested(serverTools.subagent, \"subagent\", parentEffort);\r\n}\r\n\r\nfunction settleNested<T extends FusionPolicy | AdvisorPolicy | SubagentPolicy>(\r\n policy: T,\r\n kind: \"fusion\" | \"advisor\" | \"subagent\",\r\n parentEffort: ReasoningEffort | undefined\r\n): T {\r\n const current = policy as T & NestedReasoningPolicy;\r\n const childEffort = current.reasoningEffort;\r\n const next = { ...current };\r\n delete next.reasoningEffort;\r\n if (next.reasoning !== undefined) return next as T;\r\n const effort = childEffort ?? parentEffort;\r\n if (!effort) return next as T;\r\n const model = kind === \"fusion\" ? next.judgeModel : next.model;\r\n if (!model) return next as T;\r\n const directive = resolveCatalog({ target: \"openrouter\", model, effort }, false);\r\n if (directive.model) {\r\n if (kind === \"fusion\") next.judgeModel = directive.model;\r\n else next.model = directive.model;\r\n }\r\n if (isRecord(directive.body.reasoning)) next.reasoning = directive.body.reasoning;\r\n return next as T;\r\n}\r\n\r\nfunction applyPromptPrefix(request: RuntimeRequest, prefix: string): void {\r\n if (typeof request.prompt === \"string\") {\r\n request.prompt = prefix + request.prompt;\r\n return;\r\n }\r\n if (prefixMessages(request.messages, prefix)) return;\r\n if (typeof request.input === \"string\") {\r\n request.input = prefix + request.input;\r\n return;\r\n }\r\n if (Array.isArray(request.input) && prefixInputItems(request.input, prefix)) return;\r\n throw new AiDispatcherError(\r\n \"REASONING_PREFIX_UNSUPPORTED\",\r\n \"The catalog prompt prefix cannot be applied because the request has no user text to prefix.\"\r\n );\r\n}\r\n\r\nfunction prefixMessages(messages: RuntimeMessage[] | undefined, prefix: string): boolean {\r\n if (!messages) return false;\r\n for (const message of messages) {\r\n if (message.role !== \"user\") continue;\r\n if (typeof message.content === \"string\") {\r\n message.content = prefix + message.content;\r\n return true;\r\n }\r\n for (const part of message.content) {\r\n if (part.type === \"text\") {\r\n part.text = prefix + part.text;\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction prefixInputItems(items: Array<Record<string, unknown> | string>, prefix: string): boolean {\r\n for (let index = 0; index < items.length; index += 1) {\r\n const item = items[index];\r\n if (typeof item === \"string\") {\r\n items[index] = prefix + item;\r\n return true;\r\n }\r\n if (!item || item.role === \"system\") continue;\r\n if (typeof item.content === \"string\" && (item.role === \"user\" || item.role === undefined)) {\r\n item.content = prefix + item.content;\r\n return true;\r\n }\r\n if (!Array.isArray(item.content)) continue;\r\n for (const part of item.content) {\r\n if (!isRecord(part) || typeof part.text !== \"string\") continue;\r\n if (part.type === \"text\" || part.type === \"input_text\") {\r\n part.text = prefix + part.text;\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction mergeCloudflareGateway(\r\n base: CloudflareRequestOptions | undefined,\r\n over: CloudflareRequestOptions | undefined\r\n): CloudflareGatewayControls | undefined {\r\n const gateway: CloudflareGatewayControls = {};\r\n for (const source of [base, over]) {\r\n if (!source) continue;\r\n if (source.skipCache !== undefined) gateway.skipCache = source.skipCache;\r\n if (source.cacheTtlSeconds !== undefined) gateway.cacheTtlSeconds = source.cacheTtlSeconds;\r\n if (source.cacheKey !== undefined) gateway.cacheKey = source.cacheKey;\r\n if (source.collectLog !== undefined) gateway.collectLog = source.collectLog;\r\n if (source.requestTimeoutMs !== undefined) gateway.requestTimeoutMs = source.requestTimeoutMs;\r\n if (source.maxGatewayAttempts !== undefined) gateway.maxGatewayAttempts = source.maxGatewayAttempts;\r\n if (source.retryDelayMs !== undefined) gateway.retryDelayMs = source.retryDelayMs;\r\n if (source.backoff !== undefined) gateway.backoff = source.backoff;\r\n if (source.metadata !== undefined) gateway.metadata = source.metadata;\r\n }\r\n return Object.keys(gateway).length ? gateway : undefined;\r\n}\r\n\r\nfunction assertCloudflareConfigured(options: AiDispatcherOptions): void {\r\n const apiToken = options.cloudflare?.apiToken ?? readEnv(\"CLOUDFLARE_API_TOKEN\");\r\n if (!apiToken) {\r\n throw new AiDispatcherError(\r\n \"CLOUDFLARE_API_TOKEN_MISSING\",\r\n \"Cloudflare API token is required. Set cloudflare.apiToken or CLOUDFLARE_API_TOKEN.\"\r\n );\r\n }\r\n const accountId = options.cloudflare?.accountId ?? readEnv(\"CLOUDFLARE_ACCOUNT_ID\");\r\n if (!accountId) {\r\n throw new AiDispatcherError(\r\n \"CLOUDFLARE_ACCOUNT_ID_MISSING\",\r\n \"Cloudflare account id is required. Set cloudflare.accountId or CLOUDFLARE_ACCOUNT_ID.\"\r\n );\r\n }\r\n}\r\n\r\nfunction assertOpenAiConfigured(options: AiDispatcherOptions): void {\r\n const apiKey = options.openai?.apiKey ?? readEnv(\"OPENAI_API_KEY\");\r\n if (!apiKey) {\r\n throw new AiDispatcherError(\r\n \"OPENAI_API_KEY_MISSING\",\r\n \"OpenAI API key is required. Set openai.apiKey or OPENAI_API_KEY.\"\r\n );\r\n }\r\n}\r\n\r\nfunction defaultModelFor(provider: ImplementedAiProvider, options: AiDispatcherOptions): string | undefined {\r\n if (provider === \"openrouter\") return options.openrouter?.defaultModel;\r\n if (provider === \"bedrock\") return options.bedrock?.defaultModel;\r\n if (provider === \"cloudflare\") return options.cloudflare?.defaultModel;\r\n return options.openai?.defaultModel;\r\n}\r\n\r\nconst DISPATCH_IDENTITY_FIELDS = [\"orgId\", \"stepId\", \"skillId\"] as const;\r\nconst ROLE_STAMP_FIELDS = [\"role\", \"roleLayer\", \"roleDigest\", \"profileChoice\"] as const;\r\n\r\n/**\r\n * Expands `role` into the metadata record and removes it from the provider request.\r\n * A stamp field wins over the same key already in `metadata`.\r\n */\r\nfunction applyRoleStamp(request: AiDispatcherRequest): void {\r\n const stamp = request.role;\r\n delete request.role;\r\n if (!isRecord(stamp)) return;\r\n const identity: Record<string, string> = {};\r\n for (const field of ROLE_STAMP_FIELDS) {\r\n const value = stamp[field];\r\n if (typeof value !== \"string\") continue;\r\n const trimmed = value.trim();\r\n if (trimmed) identity[field] = trimmed;\r\n }\r\n if (!Object.keys(identity).length) return;\r\n const rest = { ...(request.metadata ?? {}) };\r\n for (const key of Object.keys(identity)) delete rest[key];\r\n request.metadata = { ...identity, ...rest };\r\n}\r\n\r\n/**\r\n * Copies dispatcher identity fields into `metadata`.\r\n * A dedicated field wins over the same key inside `metadata`.\r\n * `agentId` stays on the request and is included in the same record when the provider payload is built.\r\n */\r\n/**\r\n * `metadata` is the one caller record. A `rawOpenRouterOverrides` entry whose\r\n * only field is `metadata` is folded into that record. Explicit `metadata` wins on a shared key.\r\n */\r\nfunction absorbOverrideMetadata(request: AiDispatcherRequest): void {\r\n const overrides = request.rawOpenRouterOverrides;\r\n if (!isRecord(overrides) || !Object.prototype.hasOwnProperty.call(overrides, \"metadata\")) return;\r\n if (isRecord(overrides.metadata)) {\r\n const current = { ...(request.metadata ?? {}) };\r\n const extra: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(overrides.metadata)) {\r\n if (!Object.prototype.hasOwnProperty.call(current, key)) extra[key] = value;\r\n }\r\n request.metadata = { ...current, ...extra };\r\n }\r\n const remaining: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(overrides)) {\r\n if (key !== \"metadata\") remaining[key] = value;\r\n }\r\n if (Object.keys(remaining).length === 0) delete request.rawOpenRouterOverrides;\r\n else request.rawOpenRouterOverrides = remaining;\r\n}\r\n\r\nfunction applyDispatchIdentity(request: AiDispatcherRequest): void {\r\n const identity: Record<string, string> = {};\r\n for (const field of DISPATCH_IDENTITY_FIELDS) {\r\n const value = request[field]?.trim();\r\n if (value) identity[field] = value;\r\n delete request[field];\r\n }\r\n if (!Object.keys(identity).length) return;\r\n const rest = { ...(request.metadata ?? {}) };\r\n for (const key of Object.keys(identity)) delete rest[key];\r\n request.metadata = { ...identity, ...rest };\r\n}\r\n\r\nfunction cloneRequest(request: AiDispatcherRequest): AiDispatcherRequest {\r\n const functionTools = request.functionTools?.map((tool) => ({ ...tool }));\r\n const cloned = JSON.parse(JSON.stringify(request)) as AiDispatcherRequest;\r\n if (functionTools) cloned.functionTools = functionTools;\r\n return cloned;\r\n}\r\n\r\nfunction hasOwnKeys(value: Record<string, unknown>): boolean {\r\n return Object.keys(value).length > 0;\r\n}\r\n\r\nfunction hasStreamMetadata(directive: ReasoningDirective): boolean {\r\n return directive.response.streamReasoningKeys.length > 0 || directive.response.streamReasoningPaths.length > 0;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction readEnv(name: string): string | undefined {\r\n if (typeof process === \"undefined\") return undefined;\r\n return process.env[name];\r\n}\r\n","import type { CacheTtl } from \"./types/public\";\r\nimport type { PromptCachePlan } from \"./cache-profiles\";\r\n\r\nconst BREAKPOINT = { mode: \"explicit\" } as const;\r\n\r\nexport interface AppliedPromptCache {\r\n body: Record<string, unknown>;\r\n placed: boolean;\r\n}\r\n\r\n/**\r\n * Adds at most one cache breakpoint to a compiled provider body.\r\n * Returns the same body when the plan does not change the wire.\r\n */\r\nexport function applyPromptCache(body: Record<string, unknown>, plan: PromptCachePlan): AppliedPromptCache {\r\n if (!plan.stripMarkers && !plan.placeBreakpoint && !plan.sendOpenAiOptions) {\r\n return { body, placed: false };\r\n }\r\n\r\n let next = plan.stripMarkers || plan.placeBreakpoint ? stripCacheMarkers(body) : body;\r\n if (plan.sendOpenAiOptions) next = applyOpenAiOptions(next, plan);\r\n\r\n if (!plan.placeBreakpoint) return { body: next, placed: false };\r\n\r\n if (plan.dialect === \"bedrock-cachepoint\") return placeBedrockBreakpoint(next, plan.ttl);\r\n if (plan.dialect === \"anthropic-cache-control\") return placeAnthropicBreakpoint(next, plan.ttl);\r\n if (plan.dialect === \"openai-responses\") return placeOpenAiBreakpoint(next);\r\n return { body: next, placed: false };\r\n}\r\n\r\nfunction applyOpenAiOptions(body: Record<string, unknown>, plan: PromptCachePlan): Record<string, unknown> {\r\n return {\r\n ...body,\r\n ...(plan.key ? { prompt_cache_key: plan.key } : {}),\r\n prompt_cache_options: {\r\n mode: plan.placeBreakpoint ? \"explicit\" : \"implicit\",\r\n ...(plan.ttl ? { ttl: plan.ttl } : {})\r\n }\r\n };\r\n}\r\n\r\nfunction placeOpenAiBreakpoint(body: Record<string, unknown>): AppliedPromptCache {\r\n const instructions = typeof body.instructions === \"string\" ? body.instructions.trim() : \"\";\r\n if (instructions) {\r\n const rest = inputItems(body.input);\r\n return {\r\n placed: true,\r\n body: {\r\n ...omitKey(body, \"instructions\"),\r\n input: [developerBlock(instructions, \"prompt_cache_breakpoint\", BREAKPOINT), ...rest]\r\n }\r\n };\r\n }\r\n if (Array.isArray(body.messages)) {\r\n return markMessages(body, \"messages\", \"prompt_cache_breakpoint\", BREAKPOINT, \"text\");\r\n }\r\n return markInput(body, \"prompt_cache_breakpoint\", BREAKPOINT, \"input_text\");\r\n}\r\n\r\nfunction placeAnthropicBreakpoint(body: Record<string, unknown>, ttl: CacheTtl | undefined): AppliedPromptCache {\r\n const marker = { type: \"ephemeral\", ...(ttl ? { ttl } : {}) };\r\n if (Array.isArray(body.messages)) {\r\n const marked = markMessages(body, \"messages\", \"cache_control\", marker, \"text\");\r\n if (marked.placed) return marked;\r\n if (typeof body.system === \"string\" && body.system.trim()) {\r\n return {\r\n placed: true,\r\n body: {\r\n ...body,\r\n system: [{ type: \"text\", text: body.system.trim(), cache_control: marker }]\r\n }\r\n };\r\n }\r\n return marked;\r\n }\r\n const instructions = typeof body.instructions === \"string\" ? body.instructions.trim() : \"\";\r\n if (instructions) {\r\n const rest = inputItems(body.input);\r\n return {\r\n placed: true,\r\n body: {\r\n ...omitKey(body, \"instructions\"),\r\n input: [developerBlock(instructions, \"cache_control\", marker), ...rest]\r\n }\r\n };\r\n }\r\n return markInput(body, \"cache_control\", marker, \"input_text\");\r\n}\r\n\r\nfunction placeBedrockBreakpoint(body: Record<string, unknown>, ttl: CacheTtl | undefined): AppliedPromptCache {\r\n const point = { cachePoint: { type: \"default\", ...(ttl ? { ttl } : {}) } };\r\n const system = Array.isArray(body.system) ? body.system.filter(hasBedrockText) : [];\r\n if (system.length > 0) {\r\n return { placed: true, body: { ...body, system: [...system, point] } };\r\n }\r\n return { body, placed: false };\r\n}\r\n\r\nfunction markMessages(\r\n body: Record<string, unknown>,\r\n field: \"messages\",\r\n markerKey: string,\r\n markerValue: unknown,\r\n textType: \"text\" | \"input_text\"\r\n): AppliedPromptCache {\r\n const messages = body[field];\r\n if (!Array.isArray(messages)) return { body, placed: false };\r\n const index = stableMessageIndex(messages);\r\n if (index < 0) return { body, placed: false };\r\n const marked = markMessage(messages[index], markerKey, markerValue, textType);\r\n if (!marked) return { body, placed: false };\r\n const next = messages.slice();\r\n next[index] = marked;\r\n return { placed: true, body: { ...body, [field]: next } };\r\n}\r\n\r\nfunction markInput(\r\n body: Record<string, unknown>,\r\n markerKey: string,\r\n markerValue: unknown,\r\n textType: \"text\" | \"input_text\"\r\n): AppliedPromptCache {\r\n if (!Array.isArray(body.input)) return { body, placed: false };\r\n const index = stableInputIndex(body.input);\r\n if (index < 0) return { body, placed: false };\r\n const marked = markMessage(body.input[index], markerKey, markerValue, textType);\r\n if (!marked) return { body, placed: false };\r\n const next = body.input.slice();\r\n next[index] = marked;\r\n return { placed: true, body: { ...body, input: next } };\r\n}\r\n\r\nfunction stableMessageIndex(messages: unknown[]): number {\r\n let lastSystem = -1;\r\n for (let index = 0; index < messages.length; index += 1) {\r\n const message = messages[index];\r\n if (isPlainRecord(message) && message.role === \"system\" && hasText(message.content)) lastSystem = index;\r\n }\r\n return lastSystem;\r\n}\r\n\r\nfunction stableInputIndex(items: unknown[]): number {\r\n let lastStable = -1;\r\n for (let index = 0; index < items.length; index += 1) {\r\n const item = items[index];\r\n if (!isPlainRecord(item) || !hasText(item.content)) continue;\r\n if (item.role === \"system\" || item.role === \"developer\") lastStable = index;\r\n }\r\n return lastStable;\r\n}\r\n\r\nfunction markMessage(\r\n message: unknown,\r\n markerKey: string,\r\n markerValue: unknown,\r\n textType: \"text\" | \"input_text\"\r\n): Record<string, unknown> | undefined {\r\n if (!isPlainRecord(message) || !hasText(message.content)) return undefined;\r\n const content = markContent(message.content, markerKey, markerValue, textType);\r\n if (!content) return undefined;\r\n return { ...message, content };\r\n}\r\n\r\nfunction markContent(\r\n content: unknown,\r\n markerKey: string,\r\n markerValue: unknown,\r\n textType: \"text\" | \"input_text\"\r\n): unknown {\r\n if (typeof content === \"string\") {\r\n if (!content.trim()) return undefined;\r\n return [{ type: textType, text: content, [markerKey]: markerValue }];\r\n }\r\n if (!Array.isArray(content)) return undefined;\r\n const parts = content.map((part) => (isPlainRecord(part) ? { ...part } : part));\r\n for (let index = parts.length - 1; index >= 0; index -= 1) {\r\n const part = parts[index];\r\n if (!isPlainRecord(part) || typeof part.text !== \"string\" || !part.text.trim()) continue;\r\n parts[index] = { ...part, [markerKey]: markerValue };\r\n return parts;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction developerBlock(text: string, markerKey: string, markerValue: unknown): Record<string, unknown> {\r\n return {\r\n role: \"developer\",\r\n content: [{ type: \"input_text\", text, [markerKey]: markerValue }]\r\n };\r\n}\r\n\r\nfunction inputItems(input: unknown): unknown[] {\r\n if (input === undefined) return [];\r\n if (typeof input === \"string\") {\r\n return input.trim() ? [{ role: \"user\", content: input }] : [];\r\n }\r\n return Array.isArray(input) ? input : [];\r\n}\r\n\r\nfunction hasBedrockText(block: unknown): boolean {\r\n return isPlainRecord(block) && typeof block.text === \"string\" && block.text.trim().length > 0;\r\n}\r\n\r\nfunction hasText(content: unknown): boolean {\r\n if (typeof content === \"string\") return content.trim().length > 0;\r\n if (!Array.isArray(content)) return false;\r\n return content.some((part) => isPlainRecord(part) && typeof part.text === \"string\" && part.text.trim().length > 0);\r\n}\r\n\r\nfunction stripCacheMarkers(value: unknown): Record<string, unknown> {\r\n return stripValue(value) as Record<string, unknown>;\r\n}\r\n\r\nfunction stripValue(value: unknown): unknown {\r\n if (Array.isArray(value)) {\r\n return value\r\n .map((item) => stripValue(item))\r\n .filter((item) => !(isPlainRecord(item) && Object.keys(item).length === 0));\r\n }\r\n if (!isPlainRecord(value)) return value;\r\n const next: Record<string, unknown> = {};\r\n for (const [key, child] of Object.entries(value)) {\r\n if (key === \"prompt_cache_breakpoint\" || key === \"cache_control\" || key === \"cachePoint\") continue;\r\n if (key === \"prompt_cache_key\" || key === \"prompt_cache_options\") continue;\r\n next[key] = stripValue(child);\r\n }\r\n return next;\r\n}\r\n\r\nfunction omitKey(body: Record<string, unknown>, key: string): Record<string, unknown> {\r\n const next = { ...body };\r\n delete next[key];\r\n return next;\r\n}\r\n\r\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\r\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === Object.prototype || proto === null;\r\n}\r\n","import type { RuntimeWarning } from \"@x12i/openrouter-runtime\";\r\nimport type { CloudflareEndpoint } from \"./types/cloudflare\";\r\nimport type { ImplementedAiProvider } from \"./types/providers\";\r\nimport type { CacheMode, CacheOutcome, CachePolicy, CacheResolution, CacheTtl } from \"./types/public\";\r\n\r\nexport type CacheDialect =\r\n | \"openai-responses\"\r\n | \"anthropic-cache-control\"\r\n | \"bedrock-cachepoint\"\r\n | \"implicit-native\"\r\n | \"none\";\r\n\r\nexport interface PromptCachePlan {\r\n mode: CacheMode;\r\n dialect: CacheDialect;\r\n ttl?: CacheTtl;\r\n key?: string;\r\n /** Write one breakpoint at the end of the stable prefix. */\r\n placeBreakpoint: boolean;\r\n /** Send `prompt_cache_key` and `prompt_cache_options` when the dialect has them. */\r\n sendOpenAiOptions: boolean;\r\n /** Remove cache markers that arrived through an escape hatch. */\r\n stripMarkers: boolean;\r\n /** AI Gateway cache headers for the Cloudflare provider. */\r\n gateway?: GatewayCacheDirective;\r\n}\r\n\r\nexport interface GatewayCacheDirective {\r\n skip: boolean;\r\n ttlSeconds?: number;\r\n key?: string;\r\n}\r\n\r\ninterface CacheProfile {\r\n dialect: Exclude<CacheDialect, \"none\">;\r\n ttlOptions: CacheTtl[];\r\n defaultTtl: CacheTtl;\r\n}\r\n\r\nconst TTL_MINUTES: Record<CacheTtl, number> = { \"5m\": 5, \"30m\": 30, \"1h\": 60 };\r\nconst TTL_SECONDS: Record<CacheTtl, number> = { \"5m\": 300, \"30m\": 1800, \"1h\": 3600 };\r\n\r\n/** GPT-5.6 and later, including GPT-6 Sol and Luna. Explicit breakpoints, 30-minute TTL. */\r\nconst OPENAI_EXPLICIT: CacheProfile = {\r\n dialect: \"openai-responses\",\r\n ttlOptions: [\"30m\"],\r\n defaultTtl: \"30m\"\r\n};\r\n\r\n/** Earlier OpenAI models cache automatically and reject explicit breakpoints. */\r\nconst OPENAI_IMPLICIT: CacheProfile = {\r\n dialect: \"implicit-native\",\r\n ttlOptions: [\"30m\"],\r\n defaultTtl: \"30m\"\r\n};\r\n\r\n/** Claude on OpenRouter. Breakpoints are `cache_control`; 1-hour TTL costs more to write. */\r\nconst ANTHROPIC_EXPLICIT: CacheProfile = {\r\n dialect: \"anthropic-cache-control\",\r\n ttlOptions: [\"5m\", \"1h\"],\r\n defaultTtl: \"5m\"\r\n};\r\n\r\n/** Qwen uses the same breakpoint shape. Only the 5-minute TTL is sent. */\r\nconst QWEN_EXPLICIT: CacheProfile = {\r\n dialect: \"anthropic-cache-control\",\r\n ttlOptions: [\"5m\"],\r\n defaultTtl: \"5m\"\r\n};\r\n\r\n/** Bedrock Converse `cachePoint` for Claude and Nova. */\r\nconst BEDROCK_EXPLICIT: CacheProfile = {\r\n dialect: \"bedrock-cachepoint\",\r\n ttlOptions: [\"5m\", \"1h\"],\r\n defaultTtl: \"5m\"\r\n};\r\n\r\n/** OpenRouter models that cache a prefix without a marker. */\r\nconst ROUTER_IMPLICIT: CacheProfile = {\r\n dialect: \"implicit-native\",\r\n ttlOptions: [\"5m\"],\r\n defaultTtl: \"5m\"\r\n};\r\n\r\nexport interface ResolvedPromptCache {\r\n plan: PromptCachePlan;\r\n resolution: CacheResolution;\r\n warnings: RuntimeWarning[];\r\n}\r\n\r\nexport function resolvePromptCache(input: {\r\n target: ImplementedAiProvider;\r\n requestedModel: string;\r\n effectiveModel: string;\r\n policy: CachePolicy;\r\n cloudflareEndpoint?: CloudflareEndpoint;\r\n}): ResolvedPromptCache {\r\n const mode = normalizeMode(input.policy.mode);\r\n const key = input.policy.key?.trim() || undefined;\r\n const requestedTtl = normalizeTtl(input.policy.ttl);\r\n const model = input.effectiveModel.trim();\r\n const resolutionBase = {\r\n mode,\r\n target: input.target,\r\n requestedModel: input.requestedModel,\r\n effectiveModel: input.effectiveModel,\r\n keyPresent: Boolean(key)\r\n };\r\n\r\n if (input.target === \"cloudflare\") {\r\n return resolveCloudflarePromptCache({ input, mode, key, requestedTtl, resolutionBase, model });\r\n }\r\n\r\n if (mode === \"disabled\") {\r\n return {\r\n plan: emptyPlan(mode, \"none\", key, true),\r\n resolution: { ...resolutionBase, outcome: \"ignored\" },\r\n warnings: []\r\n };\r\n }\r\n\r\n if (input.policy.mode !== undefined && mode === \"explicit\" && !isCacheMode(input.policy.mode)) {\r\n return ignored(input, resolutionBase, key, \"CACHE_UNSUPPORTED\", \"cache.mode is not auto, explicit, or disabled. The call still runs without cache markers.\");\r\n }\r\n\r\n const matched = matchProfile(input.target, model);\r\n if (!matched.profile) {\r\n return ignored(\r\n input,\r\n resolutionBase,\r\n key,\r\n matched.code,\r\n matched.message\r\n );\r\n }\r\n\r\n return applyProfile({ input, mode, key, requestedTtl, resolutionBase, model, profile: matched.profile });\r\n}\r\n\r\nfunction resolveCloudflarePromptCache(args: {\r\n input: { target: ImplementedAiProvider; effectiveModel: string; policy: CachePolicy; cloudflareEndpoint?: CloudflareEndpoint };\r\n mode: CacheMode;\r\n key: string | undefined;\r\n requestedTtl: CacheTtl | undefined;\r\n resolutionBase: Omit<CacheResolution, \"outcome\" | \"ttl\">;\r\n model: string;\r\n}): ResolvedPromptCache {\r\n const { input, mode, key, requestedTtl, resolutionBase, model } = args;\r\n if (mode === \"disabled\") {\r\n return {\r\n plan: { ...emptyPlan(mode, \"none\", key, true), gateway: gatewayDirective(true, undefined, key) },\r\n resolution: { ...resolutionBase, outcome: \"applied\" },\r\n warnings: []\r\n };\r\n }\r\n if (input.policy.mode !== undefined && mode === \"explicit\" && !isCacheMode(input.policy.mode)) {\r\n return ignored(input, resolutionBase, key, \"CACHE_UNSUPPORTED\", \"cache.mode is not auto, explicit, or disabled. The call still runs without cache markers.\");\r\n }\r\n\r\n const profile = matchCloudflareNative(input.cloudflareEndpoint, model);\r\n if (!profile) {\r\n return {\r\n plan: {\r\n mode,\r\n dialect: \"none\",\r\n placeBreakpoint: false,\r\n sendOpenAiOptions: false,\r\n stripMarkers: false,\r\n gateway: gatewayDirective(false, requestedTtl, key),\r\n ...(requestedTtl ? { ttl: requestedTtl } : {}),\r\n ...(key ? { key } : {})\r\n },\r\n resolution: {\r\n ...resolutionBase,\r\n outcome: \"applied\",\r\n ...(requestedTtl ? { ttl: requestedTtl } : {})\r\n },\r\n warnings: []\r\n };\r\n }\r\n\r\n const resolved = applyProfile({ input, mode, key, requestedTtl, resolutionBase, model, profile });\r\n const ttl = resolved.plan.ttl ?? requestedTtl;\r\n return {\r\n ...resolved,\r\n plan: { ...resolved.plan, gateway: gatewayDirective(false, ttl, key) }\r\n };\r\n}\r\n\r\nfunction applyProfile(args: {\r\n input: { target: ImplementedAiProvider; effectiveModel: string };\r\n mode: CacheMode;\r\n key: string | undefined;\r\n requestedTtl: CacheTtl | undefined;\r\n resolutionBase: Omit<CacheResolution, \"outcome\" | \"ttl\">;\r\n model: string;\r\n profile: CacheProfile;\r\n}): ResolvedPromptCache {\r\n const { input, mode, key, requestedTtl, resolutionBase, model, profile } = args;\r\n const folded = foldTtl(requestedTtl, profile.ttlOptions, profile.defaultTtl);\r\n const explicitDialect = profile.dialect === \"openai-responses\"\r\n || profile.dialect === \"anthropic-cache-control\"\r\n || profile.dialect === \"bedrock-cachepoint\";\r\n\r\n if (mode === \"explicit\" && profile.dialect === \"implicit-native\") {\r\n return ignored(\r\n input,\r\n resolutionBase,\r\n key,\r\n \"CACHE_UNSUPPORTED\",\r\n \"This model caches automatically and does not accept an explicit breakpoint. The call still runs.\"\r\n );\r\n }\r\n\r\n if (mode === \"auto\" && explicitDialect && profile.dialect !== \"openai-responses\") {\r\n return ignored(\r\n input,\r\n resolutionBase,\r\n key,\r\n \"CACHE_UNSUPPORTED\",\r\n \"This model only caches when an explicit breakpoint is set. Set cache.mode to explicit. The call still runs.\"\r\n );\r\n }\r\n\r\n const warnings: RuntimeWarning[] = [];\r\n const sendsTtl = profile.dialect === \"openai-responses\" || (mode === \"explicit\" && explicitDialect);\r\n if (requestedTtl && folded.degraded && sendsTtl) {\r\n warnings.push({\r\n code: \"CACHE_TTL_DEGRADED\",\r\n message: `cache.ttl \"${requestedTtl}\" is not supported for this model. Using \"${folded.ttl}\".`,\r\n details: { requestedTtl, effectiveTtl: folded.ttl, target: input.target, model }\r\n });\r\n }\r\n\r\n const placeBreakpoint = mode === \"explicit\" && explicitDialect;\r\n const sendOpenAiOptions = profile.dialect === \"openai-responses\" && (mode === \"explicit\" || mode === \"auto\");\r\n const outcome: CacheOutcome = folded.degraded && sendsTtl ? \"degraded\" : \"applied\";\r\n\r\n return {\r\n plan: {\r\n mode,\r\n dialect: profile.dialect,\r\n placeBreakpoint,\r\n sendOpenAiOptions,\r\n stripMarkers: placeBreakpoint,\r\n ...(sendsTtl ? { ttl: folded.ttl } : {}),\r\n ...(key ? { key } : {})\r\n },\r\n resolution: {\r\n ...resolutionBase,\r\n outcome,\r\n ...(sendsTtl ? { ttl: folded.ttl } : {})\r\n },\r\n warnings\r\n };\r\n}\r\n\r\nfunction gatewayDirective(skip: boolean, ttl: CacheTtl | undefined, key: string | undefined): GatewayCacheDirective {\r\n return {\r\n skip,\r\n ...(ttl ? { ttlSeconds: TTL_SECONDS[ttl] } : {}),\r\n ...(key ? { key } : {})\r\n };\r\n}\r\n\r\nfunction matchCloudflareNative(endpoint: CloudflareEndpoint | undefined, model: string): CacheProfile | undefined {\r\n const id = model.toLowerCase();\r\n if (endpoint === \"responses\" && isGptExplicit(id)) return OPENAI_EXPLICIT;\r\n if (endpoint === \"responses\" && isGptImplicit(id)) return OPENAI_IMPLICIT;\r\n if (endpoint === \"messages\" && isClaude(id)) return ANTHROPIC_EXPLICIT;\r\n return undefined;\r\n}\r\n\r\nfunction ignored(\r\n input: { target: ImplementedAiProvider; effectiveModel: string },\r\n resolutionBase: Omit<CacheResolution, \"outcome\" | \"ttl\">,\r\n key: string | undefined,\r\n code: string,\r\n message: string\r\n): ResolvedPromptCache {\r\n return {\r\n plan: emptyPlan(resolutionBase.mode, \"none\", key, false),\r\n resolution: { ...resolutionBase, outcome: \"ignored\" },\r\n warnings: [{\r\n code,\r\n message,\r\n details: { target: input.target, model: input.effectiveModel.trim() }\r\n }]\r\n };\r\n}\r\n\r\nfunction emptyPlan(mode: CacheMode, dialect: CacheDialect, key: string | undefined, stripMarkers: boolean): PromptCachePlan {\r\n return {\r\n mode,\r\n dialect,\r\n placeBreakpoint: false,\r\n sendOpenAiOptions: false,\r\n stripMarkers,\r\n ...(key ? { key } : {})\r\n };\r\n}\r\n\r\nfunction matchProfile(\r\n target: ImplementedAiProvider,\r\n model: string\r\n): { profile?: CacheProfile; code: string; message: string } {\r\n const id = model.toLowerCase();\r\n if (!id) {\r\n return {\r\n code: \"CACHE_UNSUPPORTED\",\r\n message: \"Prompt caching needs a model id. The call still runs without cache markers.\"\r\n };\r\n }\r\n\r\n if (target === \"bedrock\") {\r\n if (isOpenAiBedrockId(id)) {\r\n return {\r\n code: \"CACHE_DIALECT_UNSUPPORTED\",\r\n message: \"OpenAI models on Bedrock cache through the Responses API. This runtime sends Converse and does not add those markers. The call still runs.\"\r\n };\r\n }\r\n if (isClaude(id) || isNova(id)) return { profile: BEDROCK_EXPLICIT, code: \"\", message: \"\" };\r\n return {\r\n code: \"CACHE_UNSUPPORTED\",\r\n message: \"This Bedrock model has no prompt-cache profile. The call still runs without cache markers.\"\r\n };\r\n }\r\n\r\n if (target === \"openai\") {\r\n if (isGptExplicit(id)) return { profile: OPENAI_EXPLICIT, code: \"\", message: \"\" };\r\n if (isGptImplicit(id)) return { profile: OPENAI_IMPLICIT, code: \"\", message: \"\" };\r\n return {\r\n code: \"CACHE_UNSUPPORTED\",\r\n message: \"This OpenAI model has no prompt-cache profile. The call still runs without cache markers.\"\r\n };\r\n }\r\n\r\n if (isClaude(id)) return { profile: ANTHROPIC_EXPLICIT, code: \"\", message: \"\" };\r\n if (isQwen(id)) return { profile: QWEN_EXPLICIT, code: \"\", message: \"\" };\r\n if (isGptExplicit(id)) return { profile: OPENAI_EXPLICIT, code: \"\", message: \"\" };\r\n if (isGptImplicit(id) || isRouterImplicit(id)) return { profile: ROUTER_IMPLICIT, code: \"\", message: \"\" };\r\n return {\r\n code: \"CACHE_UNSUPPORTED\",\r\n message: \"This model has no prompt-cache profile. The call still runs without cache markers.\"\r\n };\r\n}\r\n\r\nfunction foldTtl(\r\n requested: CacheTtl | undefined,\r\n options: CacheTtl[],\r\n defaultTtl: CacheTtl\r\n): { ttl: CacheTtl; degraded: boolean } {\r\n if (!requested) return { ttl: defaultTtl, degraded: false };\r\n if (options.includes(requested)) return { ttl: requested, degraded: false };\r\n let best = defaultTtl;\r\n let bestDistance = Math.abs(TTL_MINUTES[defaultTtl] - TTL_MINUTES[requested]);\r\n for (const option of options) {\r\n const distance = Math.abs(TTL_MINUTES[option] - TTL_MINUTES[requested]);\r\n if (distance < bestDistance) {\r\n best = option;\r\n bestDistance = distance;\r\n }\r\n }\r\n return { ttl: best, degraded: true };\r\n}\r\n\r\nfunction normalizeMode(mode: CachePolicy[\"mode\"]): CacheMode {\r\n if (mode === \"auto\" || mode === \"disabled\") return mode;\r\n return \"explicit\";\r\n}\r\n\r\nfunction isCacheMode(mode: string): mode is CacheMode {\r\n return mode === \"auto\" || mode === \"explicit\" || mode === \"disabled\";\r\n}\r\n\r\nfunction normalizeTtl(ttl: CachePolicy[\"ttl\"]): CacheTtl | undefined {\r\n if (ttl === \"5m\" || ttl === \"30m\" || ttl === \"1h\") return ttl;\r\n return undefined;\r\n}\r\n\r\nfunction isGptExplicit(id: string): boolean {\r\n return /(?:^|\\/)gpt-(?:5\\.6|6)(?:[.\\-:]|$)/i.test(id);\r\n}\r\n\r\nfunction isGptImplicit(id: string): boolean {\r\n if (isGptExplicit(id)) return false;\r\n return /(?:^|\\/)gpt(?:[.\\-:]|$)/i.test(id) || /(?:^|\\/)o[134](?:[.\\-:]|$)/i.test(id);\r\n}\r\n\r\nfunction isClaude(id: string): boolean {\r\n return id.includes(\"claude\") || id.startsWith(\"anthropic.\") || id.startsWith(\"anthropic/\");\r\n}\r\n\r\nfunction isQwen(id: string): boolean {\r\n return id.includes(\"qwen\");\r\n}\r\n\r\nfunction isNova(id: string): boolean {\r\n return /(?:^|[./])nova(?:[.\\-:]|$)/i.test(id) || id.includes(\"amazon.nova\");\r\n}\r\n\r\nfunction isOpenAiBedrockId(id: string): boolean {\r\n return id.startsWith(\"openai.\") || id.startsWith(\"openai/\") || isGptExplicit(id) || isGptImplicit(id);\r\n}\r\n\r\nfunction isRouterImplicit(id: string): boolean {\r\n return /(?:^|\\/)(gemini|google|deepseek|x-ai|xai|grok|moonshot|kimi)(?:[./:\\-]|$)/i.test(id)\r\n || id.includes(\"gemini\")\r\n || id.includes(\"deepseek\");\r\n}\r\n","import {\r\n packProviderRecord,\r\n type RuntimeMessage,\r\n type RuntimeRequest,\r\n type RuntimeResponse,\r\n type RuntimeStreamEvent,\r\n type RuntimeLogger,\r\n type RuntimeToolExecutor,\r\n type RuntimeToolUsage,\r\n type RuntimeWarning\r\n} from \"@x12i/openrouter-runtime\";\r\nimport { AiDispatcherError } from \"../errors\";\r\nimport type {\r\n CloudflareCallContext,\r\n CloudflareEndpoint,\r\n CloudflareEndpointChoice,\r\n CloudflareGatewayControls,\r\n CloudflareRuntimeOptions,\r\n CloudflareRunOptions\r\n} from \"../types/cloudflare\";\r\nimport type { MetadataPacker } from \"@x12i/provider-metadata\";\r\nimport type { ProviderCallOptions } from \"../types/public\";\r\n\r\ntype FunctionToolUsage = RuntimeToolUsage[\"functionTools\"][number];\r\n\r\nconst DEFAULT_BASE_URL = \"https://api.cloudflare.com/client/v4\";\r\nconst DEFAULT_TIMEOUT_MS = 120_000;\r\nconst DEFAULT_GATEWAY_ID = \"default\";\r\n\r\nexport interface CompiledCloudflareWire {\r\n endpoint: CloudflareEndpoint;\r\n url: string;\r\n headers: Record<string, string>;\r\n body: Record<string, unknown>;\r\n warnings: RuntimeWarning[];\r\n}\r\n\r\nexport function selectCloudflareEndpoint(input: {\r\n model: string;\r\n endpoint?: CloudflareEndpointChoice;\r\n apiMode?: RuntimeRequest[\"apiMode\"];\r\n}): CloudflareEndpoint {\r\n if (input.endpoint && input.endpoint !== \"auto\") return input.endpoint;\r\n if (input.apiMode === \"chat\") return \"chat\";\r\n if (input.apiMode === \"responses\") return \"responses\";\r\n const id = input.model.trim().toLowerCase();\r\n if (id.startsWith(\"anthropic/\")) return \"messages\";\r\n if (id.startsWith(\"openai/\") || isBareOpenAiModel(id)) return \"responses\";\r\n return \"chat\";\r\n}\r\n\r\nexport function cloudflareCatalogQuery(model: string): {\r\n target: \"openai\" | \"openrouter\";\r\n model: string;\r\n prefix?: string;\r\n} {\r\n const id = model.trim();\r\n const lower = id.toLowerCase();\r\n if (lower.startsWith(\"openai/\")) {\r\n const slash = id.indexOf(\"/\");\r\n return { target: \"openai\", model: id.slice(slash + 1), prefix: id.slice(0, slash + 1) };\r\n }\r\n if (isBareOpenAiModel(id)) return { target: \"openai\", model: id, prefix: \"openai/\" };\r\n return { target: \"openrouter\", model: id };\r\n}\r\n\r\nexport function restoreCloudflareModel(model: string, prefix: string | undefined): string {\r\n if (!prefix || model.includes(\"/\")) return model;\r\n return `${prefix}${model}`;\r\n}\r\n\r\nexport function createCloudflareProviderAdapter(options: CloudflareRuntimeOptions = {}, packer?: MetadataPacker) {\r\n const resolved = resolveCloudflareOptions(options, packer);\r\n\r\n return {\r\n compile(request: RuntimeRequest, call?: ProviderCallOptions): CompiledCloudflareWire {\r\n return compileCloudflareRequest(request, resolved, call, false);\r\n },\r\n async run(request: RuntimeRequest, call?: ProviderCallOptions): Promise<RuntimeResponse> {\r\n const requestId = request.id ?? \"cloudflare\";\r\n try {\r\n return await runCloudflare(request, resolved, call, requestId);\r\n } catch (error) {\r\n if (error instanceof AiDispatcherError && isConfigError(error.code)) throw error;\r\n return failedResponse(request, requestId, error, \"chat\");\r\n }\r\n },\r\n executeStreamingChat(request: RuntimeRequest, call?: ProviderCallOptions): AsyncIterable<RuntimeStreamEvent> {\r\n return streamCloudflare(request, resolved, call);\r\n }\r\n };\r\n}\r\n\r\nfunction compileCloudflareRequest(\r\n request: RuntimeRequest,\r\n options: ResolvedCloudflareOptions,\r\n call: ProviderCallOptions | undefined,\r\n streaming: boolean\r\n): CompiledCloudflareWire {\r\n assertSupported(request);\r\n assertCredentials(options);\r\n const model = (request.model ?? options.defaultModel ?? \"\").trim();\r\n if (!model) {\r\n throw new AiDispatcherError(\r\n \"MODEL_REQUIRED\",\r\n \"A model id is required. Set request.model or cloudflare.defaultModel.\"\r\n );\r\n }\r\n\r\n const endpoint = call?.cloudflare?.endpoint\r\n ?? selectCloudflareEndpoint({\r\n model,\r\n ...(options.endpoint ? { endpoint: options.endpoint } : {}),\r\n ...(request.apiMode ? { apiMode: request.apiMode } : {})\r\n });\r\n if (streaming && endpoint === \"run\") {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Cloudflare /ai/run does not stream. Use chat, responses, or messages, or call run().\"\r\n );\r\n }\r\n if ((endpoint === \"messages\" || endpoint === \"run\") && request.responseFormat !== undefined) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"responseFormat is supported on Cloudflare chat and responses, not on messages or run.\"\r\n );\r\n }\r\n const run = endpoint === \"run\" ? call?.cloudflare?.run : undefined;\r\n assertRunOptions(run);\r\n\r\n let body = endpoint === \"responses\"\r\n ? compileResponsesBody(request, model)\r\n : endpoint === \"messages\"\r\n ? compileMessagesBody(request, model)\r\n : compileChatBody(request, model);\r\n if (call?.finalizeBody) body = call.finalizeBody(body);\r\n if (endpoint !== \"run\") body = { ...body, stream: streaming };\r\n const gateway = mergeGateway(options.gateway, call?.cloudflare?.gateway);\r\n const fromBody = isRecord(body.metadata) ? body.metadata : undefined;\r\n const packed = packProviderRecord(\r\n request.metadata,\r\n request.agentId,\r\n overlayMetadata(gateway?.metadata, fromBody),\r\n options.metadataPacker\r\n );\r\n const record = packed.wire;\r\n body = applyProviderRecord(body, record);\r\n\r\n if (endpoint === \"run\") body = wrapRun(body, run);\r\n\r\n return {\r\n endpoint,\r\n url: endpointUrl(options, endpoint),\r\n headers: buildHeaders(options, call?.cloudflare, model, record),\r\n body,\r\n warnings: packed.warning ? [packed.warning] : []\r\n };\r\n}\r\n\r\nfunction compileResponsesBody(request: RuntimeRequest, model: string): Record<string, unknown> {\r\n const instructions = compileInstructions(request);\r\n const input = compileResponsesInput(request);\r\n if (input === undefined) {\r\n throw new AiDispatcherError(\"INPUT_REQUIRED\", \"Provide request.messages, request.input, or request.prompt.\");\r\n }\r\n return clean({\r\n model,\r\n input,\r\n instructions,\r\n temperature: request.temperature,\r\n max_output_tokens: request.maxTokens,\r\n reasoning: request.reasoning,\r\n text: request.responseFormat,\r\n tools: compileResponsesTools(request),\r\n tool_choice: compileResponsesToolChoice(request)\r\n });\r\n}\r\n\r\nfunction compileChatBody(request: RuntimeRequest, model: string): Record<string, unknown> {\r\n const messages = compileChatMessages(request);\r\n if (!messages.length) {\r\n throw new AiDispatcherError(\"INPUT_REQUIRED\", \"Provide request.messages, request.input, or request.prompt.\");\r\n }\r\n return clean({\r\n model,\r\n messages,\r\n temperature: request.temperature,\r\n max_tokens: request.maxTokens,\r\n reasoning: request.reasoning,\r\n response_format: request.responseFormat,\r\n tools: compileChatTools(request),\r\n tool_choice: compileChatToolChoice(request)\r\n });\r\n}\r\n\r\nfunction compileMessagesBody(request: RuntimeRequest, model: string): Record<string, unknown> {\r\n const system = compileInstructions(request);\r\n const messages = compileAnthropicMessages(request);\r\n if (!messages.length) {\r\n throw new AiDispatcherError(\"INPUT_REQUIRED\", \"Provide request.messages, request.input, or request.prompt.\");\r\n }\r\n return clean({\r\n model,\r\n system,\r\n messages,\r\n temperature: request.temperature,\r\n max_tokens: request.maxTokens,\r\n tools: compileAnthropicTools(request),\r\n tool_choice: compileAnthropicToolChoice(request)\r\n });\r\n}\r\n\r\nfunction wrapRun(body: Record<string, unknown>, run: CloudflareRunOptions | undefined): Record<string, unknown> {\r\n const model = body.model;\r\n const input = { ...body };\r\n delete input.model;\r\n delete input.stream;\r\n return clean({\r\n model,\r\n input,\r\n options: runOptions(run)\r\n });\r\n}\r\n\r\nfunction runOptions(run: CloudflareRunOptions | undefined): Record<string, unknown> | undefined {\r\n if (!run) return undefined;\r\n return clean({\r\n background: run.background,\r\n webhookUrl: run.webhookUrl,\r\n webhookFormat: run.webhookFormat\r\n });\r\n}\r\n\r\nfunction assertRunOptions(run: CloudflareRunOptions | undefined): void {\r\n if (!run) return;\r\n if (run.webhookUrl && run.background !== true) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Cloudflare webhookUrl requires run.background to be true.\"\r\n );\r\n }\r\n if (run.webhookFormat && !run.webhookUrl) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Cloudflare webhookFormat requires run.webhookUrl.\"\r\n );\r\n }\r\n}\r\n\r\nfunction assertSupported(request: RuntimeRequest): void {\r\n if (request.serverTools && serverToolsEnabled(request.serverTools)) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Cloudflare does not support OpenRouter server tools.\"\r\n );\r\n }\r\n if (request.rawOpenRouterOverrides !== undefined) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"rawOpenRouterOverrides cannot be sent to Cloudflare.\"\r\n );\r\n }\r\n if (request.toolChoice && typeof request.toolChoice === \"object\" && request.toolChoice.type === \"server_tool\") {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Cloudflare does not support OpenRouter server tool choices.\"\r\n );\r\n }\r\n}\r\n\r\nfunction assertCredentials(options: ResolvedCloudflareOptions): void {\r\n if (!options.apiToken) {\r\n throw new AiDispatcherError(\r\n \"CLOUDFLARE_API_TOKEN_MISSING\",\r\n \"Cloudflare API token is required. Set cloudflare.apiToken or CLOUDFLARE_API_TOKEN.\"\r\n );\r\n }\r\n if (!options.accountId) {\r\n throw new AiDispatcherError(\r\n \"CLOUDFLARE_ACCOUNT_ID_MISSING\",\r\n \"Cloudflare account id is required. Set cloudflare.accountId or CLOUDFLARE_ACCOUNT_ID.\"\r\n );\r\n }\r\n}\r\n\r\nfunction serverToolsEnabled(policy: NonNullable<RuntimeRequest[\"serverTools\"]>): boolean {\r\n return Object.values(policy).some((value) => {\r\n if (Array.isArray(value)) return value.some((item) => isEnabledMode(item));\r\n return isEnabledMode(value);\r\n });\r\n}\r\n\r\nfunction isEnabledMode(value: unknown): boolean {\r\n return typeof value === \"object\" && value !== null && \"mode\" in value && (value as { mode?: string }).mode !== \"disabled\";\r\n}\r\n\r\nfunction compileInstructions(request: RuntimeRequest): string | undefined {\r\n if (request.instructions) return request.instructions;\r\n if (request.system) return request.system;\r\n const systemMessages = (request.messages ?? []).filter((message) => message.role === \"system\");\r\n if (!systemMessages.length) return undefined;\r\n return systemMessages.map((message) => contentToText(message.content)).filter(Boolean).join(\"\\n\");\r\n}\r\n\r\nfunction compileResponsesInput(request: RuntimeRequest): unknown {\r\n if (request.input !== undefined) return request.input;\r\n const items: unknown[] = [];\r\n for (const message of request.messages ?? []) {\r\n if (message.role === \"system\") continue;\r\n items.push(compileResponsesItem(message));\r\n }\r\n if (typeof request.prompt === \"string\") items.push({ role: \"user\", content: request.prompt });\r\n return items.length ? items : undefined;\r\n}\r\n\r\nfunction compileResponsesItem(message: RuntimeMessage): Record<string, unknown> {\r\n if (message.role === \"tool\") {\r\n return {\r\n type: \"function_call_output\",\r\n call_id: message.toolCallId ?? message.name ?? \"tool\",\r\n output: contentToText(message.content)\r\n };\r\n }\r\n const role = message.role === \"assistant\" ? \"assistant\" : \"user\";\r\n return { role, content: compileResponsesContent(message.content) };\r\n}\r\n\r\nfunction compileResponsesContent(content: RuntimeMessage[\"content\"]): unknown {\r\n if (typeof content === \"string\") return content;\r\n return content.map((part) => {\r\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\r\n if (part.type === \"image_url\") return { type: \"input_image\", image_url: part.imageUrl };\r\n return compileFilePart(part, \"responses\");\r\n });\r\n}\r\n\r\nfunction compileChatMessages(request: RuntimeRequest): unknown[] {\r\n assertExclusiveInput(request);\r\n const messages: unknown[] = [];\r\n const system = compileInstructions(request);\r\n if (system) messages.push({ role: \"system\", content: system });\r\n for (const message of dialogueMessages(request)) messages.push(compileChatMessage(message));\r\n return messages;\r\n}\r\n\r\nfunction compileChatMessage(message: RuntimeMessage): Record<string, unknown> {\r\n if (message.role === \"tool\") {\r\n return {\r\n role: \"tool\",\r\n tool_call_id: message.toolCallId ?? message.name ?? \"tool\",\r\n content: contentToText(message.content)\r\n };\r\n }\r\n return {\r\n role: message.role === \"assistant\" ? \"assistant\" : \"user\",\r\n content: compileChatContent(message.content)\r\n };\r\n}\r\n\r\nfunction compileChatContent(content: RuntimeMessage[\"content\"]): unknown {\r\n if (typeof content === \"string\") return content;\r\n return content.map((part) => {\r\n if (part.type === \"text\") return { type: \"text\", text: part.text };\r\n if (part.type === \"image_url\") return { type: \"image_url\", image_url: { url: part.imageUrl } };\r\n const file = compileFilePart(part, \"chat\");\r\n return file;\r\n });\r\n}\r\n\r\nfunction compileAnthropicMessages(request: RuntimeRequest): unknown[] {\r\n assertExclusiveInput(request);\r\n return dialogueMessages(request).map(compileAnthropicMessage);\r\n}\r\n\r\nfunction compileAnthropicMessage(message: RuntimeMessage): Record<string, unknown> {\r\n if (message.role === \"tool\") {\r\n return {\r\n role: \"user\",\r\n content: [{\r\n type: \"tool_result\",\r\n tool_use_id: message.toolCallId ?? message.name ?? \"tool\",\r\n content: contentToText(message.content)\r\n }]\r\n };\r\n }\r\n const role = message.role === \"assistant\" ? \"assistant\" : \"user\";\r\n return { role, content: compileAnthropicContent(message.content) };\r\n}\r\n\r\nfunction compileAnthropicContent(content: RuntimeMessage[\"content\"]): unknown {\r\n if (typeof content === \"string\") return content;\r\n return content.map((part) => {\r\n if (part.type === \"text\") return { type: \"text\", text: part.text };\r\n if (part.type === \"image_url\") return anthropicImage(part.imageUrl);\r\n return anthropicFile(part);\r\n });\r\n}\r\n\r\nfunction dialogueMessages(request: RuntimeRequest): RuntimeMessage[] {\r\n const source = request.messages?.length\r\n ? request.messages.filter((message) => message.role !== \"system\")\r\n : messagesFromInput(request);\r\n if (typeof request.prompt === \"string\" && request.messages?.length) {\r\n return [...source, { role: \"user\", content: request.prompt }];\r\n }\r\n if (!source.length && typeof request.prompt === \"string\") return [{ role: \"user\", content: request.prompt }];\r\n return source;\r\n}\r\n\r\nfunction messagesFromInput(request: RuntimeRequest): RuntimeMessage[] {\r\n if (typeof request.input === \"string\") return [{ role: \"user\", content: request.input }];\r\n if (!Array.isArray(request.input)) return [];\r\n const messages: RuntimeMessage[] = [];\r\n for (const item of request.input) {\r\n if (typeof item === \"string\") {\r\n messages.push({ role: \"user\", content: item });\r\n continue;\r\n }\r\n if (!isRecord(item)) continue;\r\n const role = item.role === \"assistant\" || item.role === \"tool\" || item.role === \"system\" ? item.role : \"user\";\r\n if (role === \"system\") continue;\r\n const content = inputContent(item.content);\r\n if (content === undefined) continue;\r\n const message: RuntimeMessage = { role, content };\r\n if (typeof item.toolCallId === \"string\") message.toolCallId = item.toolCallId;\r\n if (typeof item.name === \"string\") message.name = item.name;\r\n messages.push(message);\r\n }\r\n return messages;\r\n}\r\n\r\nfunction inputContent(content: unknown): RuntimeMessage[\"content\"] | undefined {\r\n if (typeof content === \"string\") return content;\r\n if (!Array.isArray(content)) return undefined;\r\n const parts: Exclude<RuntimeMessage[\"content\"], string> = [];\r\n for (const part of content) {\r\n if (!isRecord(part)) continue;\r\n if ((part.type === \"text\" || part.type === \"input_text\") && typeof part.text === \"string\") {\r\n parts.push({ type: \"text\", text: part.text });\r\n } else if (part.type === \"image_url\" && typeof part.imageUrl === \"string\") {\r\n parts.push({ type: \"image_url\", imageUrl: part.imageUrl });\r\n } else if (part.type === \"image_url\" && isRecord(part.image_url) && typeof part.image_url.url === \"string\") {\r\n parts.push({ type: \"image_url\", imageUrl: part.image_url.url });\r\n } else if (part.type === \"input_image\" && typeof part.image_url === \"string\") {\r\n parts.push({ type: \"image_url\", imageUrl: part.image_url });\r\n }\r\n }\r\n return parts.length ? parts : undefined;\r\n}\r\n\r\nfunction assertExclusiveInput(request: RuntimeRequest): void {\r\n const hasMessages = Array.isArray(request.messages) && request.messages.length > 0;\r\n if (hasMessages && request.input !== undefined) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Cloudflare chat, messages, and run accept messages or input, not both.\"\r\n );\r\n }\r\n}\r\n\r\nfunction compileFilePart(\r\n part: Extract<RuntimeMessage[\"content\"], readonly unknown[]>[number],\r\n dialect: \"responses\" | \"chat\"\r\n): Record<string, unknown> {\r\n if (part.type !== \"file\") {\r\n throw new AiDispatcherError(\"UNSUPPORTED_REQUEST_FIELD\", \"File content parts need a url or data.\");\r\n }\r\n if (!part.url && !part.data) {\r\n throw new AiDispatcherError(\"UNSUPPORTED_REQUEST_FIELD\", \"File content parts need a url or data.\");\r\n }\r\n if (dialect === \"responses\") {\r\n if (part.url) return clean({ type: \"input_file\", file_url: part.url, filename: part.fileName });\r\n return clean({ type: \"input_file\", file_data: part.data, filename: part.fileName });\r\n }\r\n return {\r\n type: \"file\",\r\n file: clean({\r\n filename: part.fileName,\r\n ...(part.url ? { url: part.url } : {}),\r\n ...(part.data ? { file_data: part.data } : {})\r\n })\r\n };\r\n}\r\n\r\nfunction anthropicImage(imageUrl: string): Record<string, unknown> {\r\n const data = dataUrl(imageUrl);\r\n if (data) return { type: \"image\", source: { type: \"base64\", media_type: data.mediaType, data: data.data } };\r\n return { type: \"image\", source: { type: \"url\", url: imageUrl } };\r\n}\r\n\r\nfunction anthropicFile(part: Extract<RuntimeMessage[\"content\"], readonly unknown[]>[number]): Record<string, unknown> {\r\n if (part.type !== \"file\" || (!part.url && !part.data)) {\r\n throw new AiDispatcherError(\"UNSUPPORTED_REQUEST_FIELD\", \"File content parts need a url or data.\");\r\n }\r\n if (part.url) {\r\n const data = dataUrl(part.url);\r\n if (data) return { type: \"document\", source: { type: \"base64\", media_type: data.mediaType, data: data.data } };\r\n return { type: \"document\", source: { type: \"url\", url: part.url } };\r\n }\r\n return {\r\n type: \"document\",\r\n source: {\r\n type: \"base64\",\r\n media_type: part.mimeType || \"application/octet-stream\",\r\n data: part.data\r\n }\r\n };\r\n}\r\n\r\nfunction dataUrl(value: string): { mediaType: string; data: string } | undefined {\r\n const match = /^data:([^;,]+);base64,([\\s\\S]+)$/i.exec(value);\r\n if (!match) return undefined;\r\n return { mediaType: match[1] ?? \"application/octet-stream\", data: match[2] ?? \"\" };\r\n}\r\n\r\nfunction compileResponsesTools(request: RuntimeRequest): unknown[] | undefined {\r\n const tools = request.functionTools ?? [];\r\n if (!tools.length || request.toolChoice === \"none\") return undefined;\r\n return tools.map((tool) => ({\r\n type: \"function\",\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: tool.parameters\r\n }));\r\n}\r\n\r\nfunction compileChatTools(request: RuntimeRequest): unknown[] | undefined {\r\n const tools = request.functionTools ?? [];\r\n if (!tools.length || request.toolChoice === \"none\") return undefined;\r\n return tools.map((tool) => ({\r\n type: \"function\",\r\n function: {\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: tool.parameters\r\n }\r\n }));\r\n}\r\n\r\nfunction compileAnthropicTools(request: RuntimeRequest): unknown[] | undefined {\r\n const tools = request.functionTools ?? [];\r\n if (!tools.length || request.toolChoice === \"none\") return undefined;\r\n return tools.map((tool) => ({\r\n name: tool.name,\r\n description: tool.description,\r\n input_schema: tool.parameters\r\n }));\r\n}\r\n\r\nfunction compileResponsesToolChoice(request: RuntimeRequest): unknown {\r\n if (!request.functionTools?.length || request.toolChoice === \"none\") return undefined;\r\n const choice = request.toolChoice;\r\n if (!choice || choice === \"auto\") return undefined;\r\n if (choice === \"required\") return \"required\";\r\n if (typeof choice === \"object\" && choice.type === \"function\") return { type: \"function\", name: choice.functionName };\r\n return undefined;\r\n}\r\n\r\nfunction compileChatToolChoice(request: RuntimeRequest): unknown {\r\n if (!request.functionTools?.length || request.toolChoice === \"none\") return undefined;\r\n const choice = request.toolChoice;\r\n if (!choice || choice === \"auto\") return undefined;\r\n if (choice === \"required\") return \"required\";\r\n if (typeof choice === \"object\" && choice.type === \"function\") {\r\n return { type: \"function\", function: { name: choice.functionName } };\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction compileAnthropicToolChoice(request: RuntimeRequest): unknown {\r\n if (!request.functionTools?.length || request.toolChoice === \"none\") return undefined;\r\n const choice = request.toolChoice;\r\n if (!choice || choice === \"auto\") return undefined;\r\n if (choice === \"required\") return { type: \"any\" };\r\n if (typeof choice === \"object\" && choice.type === \"function\") return { type: \"tool\", name: choice.functionName };\r\n return undefined;\r\n}\r\n\r\nfunction contentToText(content: RuntimeMessage[\"content\"]): string {\r\n if (typeof content === \"string\") return content;\r\n return content.map((part) => (part.type === \"text\" ? part.text : \"\")).filter(Boolean).join(\"\");\r\n}\r\n\r\nasync function runCloudflare(\r\n request: RuntimeRequest,\r\n options: ResolvedCloudflareOptions,\r\n call: ProviderCallOptions | undefined,\r\n requestId: string\r\n): Promise<RuntimeResponse> {\r\n const maxIterations = request.execution?.maxToolIterations ?? 8;\r\n const maxFunctionToolCalls = request.execution?.maxFunctionToolCalls ?? 20;\r\n const functionUsage: FunctionToolUsage[] = [];\r\n let active: CompiledCloudflareWire;\r\n try {\r\n active = compileCloudflareRequest(request, options, call, false);\r\n } catch (error) {\r\n if (error instanceof AiDispatcherError && isConfigError(error.code)) throw error;\r\n return failedResponse(request, requestId, error, \"chat\");\r\n }\r\n let response: unknown;\r\n\r\n try {\r\n for (let iteration = 0; iteration <= maxIterations; iteration += 1) {\r\n response = await sendWithRetries(active, options, timeoutFor(request, options));\r\n if (active.endpoint === \"run\" && !chatCalls(unwrap(response)).length) break;\r\n const calls = extractCalls(active.endpoint, response);\r\n if (!calls.length) break;\r\n if (!calls.every((item) => resolveExecutor(item.name, request, options))) {\r\n return normalizeCloudflareResponse({\r\n request,\r\n requestId,\r\n compiled: active,\r\n response,\r\n functionTools: [...functionUsage, ...calls],\r\n status: \"requires_action\"\r\n });\r\n }\r\n if (functionUsage.length + calls.length > maxFunctionToolCalls) {\r\n throw new AiDispatcherError(\"FUNCTION_TOOL_LIMIT\", \"maxFunctionToolCalls exceeded.\");\r\n }\r\n const results: FunctionToolUsage[] = [];\r\n for (const item of calls) results.push(await executeTool(item, request, options));\r\n functionUsage.push(...results);\r\n active = { ...active, body: continueBody(active, response, results) };\r\n }\r\n\r\n return normalizeCloudflareResponse({\r\n request,\r\n requestId,\r\n compiled: active,\r\n response,\r\n functionTools: functionUsage,\r\n status: \"completed\"\r\n });\r\n } catch (error) {\r\n if (error instanceof AiDispatcherError && isConfigError(error.code)) throw error;\r\n return failedResponse(request, requestId, error, responseApiMode(active.endpoint));\r\n }\r\n}\r\n\r\nfunction continueBody(\r\n compiled: CompiledCloudflareWire,\r\n response: unknown,\r\n results: FunctionToolUsage[]\r\n): Record<string, unknown> {\r\n if (compiled.endpoint === \"responses\") return continueResponses(compiled.body, response, results);\r\n if (compiled.endpoint === \"messages\") return continueMessages(compiled.body, response, results);\r\n if (compiled.endpoint === \"run\") return continueRun(compiled.body, response, results);\r\n return continueChat(compiled.body, response, results);\r\n}\r\n\r\nfunction continueResponses(\r\n body: Record<string, unknown>,\r\n response: unknown,\r\n results: FunctionToolUsage[]\r\n): Record<string, unknown> {\r\n const record = unwrap(response);\r\n return clean({\r\n ...body,\r\n tool_choice: \"auto\",\r\n previous_response_id: typeof record.id === \"string\" ? record.id : undefined,\r\n input: results.map(toFunctionCallOutput)\r\n });\r\n}\r\n\r\nfunction continueChat(\r\n body: Record<string, unknown>,\r\n response: unknown,\r\n results: FunctionToolUsage[]\r\n): Record<string, unknown> {\r\n const messages = Array.isArray(body.messages) ? [...body.messages] : [];\r\n const assistant = chatAssistantMessage(unwrap(response));\r\n if (assistant) messages.push(assistant);\r\n for (const result of results) {\r\n messages.push({\r\n role: \"tool\",\r\n tool_call_id: result.callId,\r\n content: outputText(result)\r\n });\r\n }\r\n return { ...body, messages, ...(body.tool_choice !== undefined ? { tool_choice: \"auto\" } : {}) };\r\n}\r\n\r\nfunction continueMessages(\r\n body: Record<string, unknown>,\r\n response: unknown,\r\n results: FunctionToolUsage[]\r\n): Record<string, unknown> {\r\n const messages = Array.isArray(body.messages) ? [...body.messages] : [];\r\n const record = unwrap(response);\r\n messages.push({ role: \"assistant\", content: Array.isArray(record.content) ? record.content : [] });\r\n messages.push({\r\n role: \"user\",\r\n content: results.map((result) => ({\r\n type: \"tool_result\",\r\n tool_use_id: result.callId,\r\n content: outputText(result),\r\n ...(result.status === \"failed\" ? { is_error: true } : {})\r\n }))\r\n });\r\n return { ...body, messages };\r\n}\r\n\r\nfunction continueRun(\r\n body: Record<string, unknown>,\r\n response: unknown,\r\n results: FunctionToolUsage[]\r\n): Record<string, unknown> {\r\n const input = isRecord(body.input) ? body.input : {};\r\n const continued = continueChat({ messages: input.messages }, response, results);\r\n return { ...body, input: { ...input, messages: continued.messages } };\r\n}\r\n\r\nfunction toFunctionCallOutput(result: FunctionToolUsage): Record<string, unknown> {\r\n return {\r\n type: \"function_call_output\",\r\n call_id: result.callId,\r\n output: outputText(result)\r\n };\r\n}\r\n\r\nfunction outputText(result: FunctionToolUsage): string {\r\n const output = result.status === \"completed\" ? result.result : { error: result.error };\r\n return typeof output === \"string\" ? output : JSON.stringify(output);\r\n}\r\n\r\nfunction resolveExecutor(\r\n name: string,\r\n request: RuntimeRequest,\r\n options: ResolvedCloudflareOptions\r\n): RuntimeToolExecutor | undefined {\r\n return request.functionTools?.find((tool) => tool.name === name)?.executor ?? options.tools?.[name];\r\n}\r\n\r\nasync function executeTool(\r\n call: FunctionToolUsage,\r\n request: RuntimeRequest,\r\n options: ResolvedCloudflareOptions\r\n): Promise<FunctionToolUsage> {\r\n const executor = resolveExecutor(call.name, request, options);\r\n if (!executor) return call;\r\n const started = Date.now();\r\n try {\r\n options.logger?.debug?.(\"runtime.function_tool.started\", { name: call.name, callId: call.callId });\r\n const result = await executor(call.args, {\r\n requestId: request.id ?? \"\",\r\n toolName: call.name,\r\n callId: call.callId,\r\n ...(request.metadata ? { metadata: request.metadata } : {})\r\n });\r\n const usage: FunctionToolUsage = {\r\n name: call.name,\r\n callId: call.callId,\r\n status: \"completed\",\r\n args: call.args,\r\n result,\r\n durationMs: Date.now() - started\r\n };\r\n options.logger?.debug?.(\"runtime.function_tool.completed\", { name: call.name, callId: call.callId });\r\n return usage;\r\n } catch (error) {\r\n const usage: FunctionToolUsage = {\r\n name: call.name,\r\n callId: call.callId,\r\n status: \"failed\",\r\n args: call.args,\r\n error: error instanceof Error ? error.message : String(error),\r\n durationMs: Date.now() - started\r\n };\r\n options.logger?.warn?.(\"runtime.function_tool.failed\", usage);\r\n return usage;\r\n }\r\n}\r\n\r\nasync function* streamCloudflare(\r\n request: RuntimeRequest,\r\n options: ResolvedCloudflareOptions,\r\n call?: ProviderCallOptions\r\n): AsyncGenerator<RuntimeStreamEvent> {\r\n const requestId = request.id ?? \"\";\r\n let compiled: CompiledCloudflareWire;\r\n try {\r\n compiled = compileCloudflareRequest(request, options, call, true);\r\n } catch (error) {\r\n yield errorEvent(requestId, error);\r\n throw error;\r\n }\r\n\r\n yield {\r\n type: \"stream.start\",\r\n requestId,\r\n data: {\r\n model: modelOf(compiled),\r\n apiMode: responseApiMode(compiled.endpoint),\r\n entrypoint: \"executeStreamingChat\"\r\n }\r\n };\r\n\r\n const controller = new AbortController();\r\n const timeout = setTimeout(() => controller.abort(), timeoutFor(request, options));\r\n let text = \"\";\r\n let reported = false;\r\n try {\r\n const response = await options.fetch(compiled.url, {\r\n method: \"POST\",\r\n headers: { ...compiled.headers, Accept: \"text/event-stream\" },\r\n body: JSON.stringify(compiled.body),\r\n signal: controller.signal\r\n });\r\n if (!response.ok) {\r\n const failure = await readFailure(response);\r\n reported = true;\r\n yield errorEvent(requestId, failure);\r\n throw failure;\r\n }\r\n for await (const event of parseSse(response)) {\r\n if (!isRecord(event)) continue;\r\n const catalogReasoning = call?.extractStreamReasoning?.(event);\r\n const reasoningText = catalogReasoning || reasoningDelta(event);\r\n if (reasoningText) yield { type: \"stream.reasoning.delta\", requestId, data: { text: reasoningText } };\r\n const delta = textDelta(event);\r\n if (delta) {\r\n text += delta;\r\n yield { type: \"stream.text.delta\", requestId, data: { text: delta } };\r\n }\r\n const toolDelta = toolCallDelta(event);\r\n if (toolDelta) yield { type: \"stream.tool_call.delta\", requestId, data: toolDelta };\r\n const usage = streamUsage(event);\r\n if (usage) yield { type: \"stream.usage\", requestId, data: { usage } };\r\n if (event.type === \"error\") {\r\n const failure = new AiDispatcherError(\r\n \"PROVIDER_REQUEST_FAILED\",\r\n typeof event.message === \"string\" ? event.message : \"Cloudflare stream returned an error event.\",\r\n event\r\n );\r\n reported = true;\r\n yield errorEvent(requestId, failure);\r\n throw failure;\r\n }\r\n }\r\n yield { type: \"stream.done\", requestId, data: { text, model: modelOf(compiled) } };\r\n } catch (error) {\r\n const failure = error instanceof Error && error.name === \"AbortError\"\r\n ? new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", \"Cloudflare request timed out.\")\r\n : error instanceof AiDispatcherError\r\n ? error\r\n : new AiDispatcherError(\r\n \"PROVIDER_GATEWAY_UNREACHABLE\",\r\n error instanceof Error ? error.message : \"Cloudflare request failed before receiving a response.\"\r\n );\r\n if (!reported) yield errorEvent(requestId, failure);\r\n throw failure;\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n}\r\n\r\nasync function sendWithRetries(\r\n compiled: CompiledCloudflareWire,\r\n options: ResolvedCloudflareOptions,\r\n timeoutMs: number\r\n): Promise<unknown> {\r\n let lastError: unknown;\r\n for (let attempt = 1; attempt <= options.maxAttempts; attempt += 1) {\r\n try {\r\n return await sendOnce(compiled, options, timeoutMs);\r\n } catch (error) {\r\n lastError = error;\r\n const retryable = error instanceof AiDispatcherError && error.code === \"PROVIDER_RETRYABLE\";\r\n if (!retryable || attempt >= options.maxAttempts) throw asTerminalError(error);\r\n await delay(Math.min(500 * 2 ** (attempt - 1), 5_000));\r\n }\r\n }\r\n throw lastError;\r\n}\r\n\r\nasync function sendOnce(\r\n compiled: CompiledCloudflareWire,\r\n options: ResolvedCloudflareOptions,\r\n timeoutMs: number\r\n): Promise<unknown> {\r\n const controller = new AbortController();\r\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\r\n try {\r\n const response = await options.fetch(compiled.url, {\r\n method: \"POST\",\r\n headers: compiled.headers,\r\n body: JSON.stringify(compiled.body),\r\n signal: controller.signal\r\n });\r\n if (!response.ok) throw await readFailure(response);\r\n const text = await response.text();\r\n const parsed: unknown = text ? JSON.parse(text) : {};\r\n if (isRecord(parsed) && parsed.success === false) {\r\n throw new AiDispatcherError(\r\n \"PROVIDER_REQUEST_FAILED\",\r\n messageFrom(parsed) ?? \"Cloudflare request failed.\",\r\n { body: parsed }\r\n );\r\n }\r\n return parsed;\r\n } catch (error) {\r\n if (error instanceof AiDispatcherError) throw error;\r\n if (error instanceof SyntaxError) {\r\n throw new AiDispatcherError(\"PROVIDER_REQUEST_FAILED\", \"Cloudflare returned a response that was not JSON.\");\r\n }\r\n if (error instanceof Error && error.name === \"AbortError\") {\r\n throw new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", \"Cloudflare request timed out.\");\r\n }\r\n throw new AiDispatcherError(\r\n \"PROVIDER_GATEWAY_UNREACHABLE\",\r\n error instanceof Error ? error.message : \"Cloudflare request failed before receiving a response.\"\r\n );\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n}\r\n\r\nasync function readFailure(response: Response): Promise<AiDispatcherError> {\r\n const text = await response.text();\r\n let body: unknown = text;\r\n try {\r\n body = text ? JSON.parse(text) : undefined;\r\n } catch {\r\n body = text;\r\n }\r\n const message = messageFrom(body) ?? `Cloudflare request failed with status ${response.status}.`;\r\n const retryable = response.status === 429 || response.status === 408 || response.status >= 500;\r\n return new AiDispatcherError(classifyStatus(response.status), message, {\r\n status: response.status,\r\n body,\r\n retryable\r\n });\r\n}\r\n\r\nfunction classifyStatus(status: number): string {\r\n if (status === 401 || status === 403) return \"PROVIDER_AUTH_FAILED\";\r\n if (status === 404) return \"PROVIDER_MODEL_NOT_FOUND\";\r\n if (status === 429 || status === 408 || status >= 500) return \"PROVIDER_RETRYABLE\";\r\n return \"PROVIDER_REQUEST_FAILED\";\r\n}\r\n\r\nfunction isConfigError(code: string): boolean {\r\n return code === \"CLOUDFLARE_API_TOKEN_MISSING\"\r\n || code === \"CLOUDFLARE_ACCOUNT_ID_MISSING\"\r\n || code === \"MODEL_REQUIRED\"\r\n || code === \"INPUT_REQUIRED\"\r\n || code === \"UNSUPPORTED_REQUEST_FIELD\";\r\n}\r\n\r\nfunction asTerminalError(error: unknown): AiDispatcherError {\r\n if (error instanceof AiDispatcherError && error.code === \"PROVIDER_RETRYABLE\") {\r\n const status = isRecord(error.details) ? error.details.status : undefined;\r\n if (status === 429) return new AiDispatcherError(\"PROVIDER_RATE_LIMITED\", error.message, error.details);\r\n return new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", error.message, error.details);\r\n }\r\n if (error instanceof AiDispatcherError) return error;\r\n return new AiDispatcherError(\"PROVIDER_REQUEST_FAILED\", error instanceof Error ? error.message : String(error));\r\n}\r\n\r\nfunction normalizeCloudflareResponse(params: {\r\n request: RuntimeRequest;\r\n requestId: string;\r\n compiled: CompiledCloudflareWire;\r\n response: unknown;\r\n functionTools?: FunctionToolUsage[];\r\n status?: RuntimeResponse[\"status\"];\r\n}): RuntimeResponse {\r\n const payload = unwrap(params.response);\r\n const calls = params.functionTools ?? extractCalls(params.compiled.endpoint, params.response);\r\n const usage = normalizeUsage(payload.usage) ?? normalizeUsage(isRecord(params.response) ? params.response.usage : undefined);\r\n const status = params.status ?? (calls.length ? \"requires_action\" : \"completed\");\r\n return {\r\n id: typeof payload.id === \"string\" ? payload.id : params.requestId,\r\n status,\r\n apiMode: responseApiMode(params.compiled.endpoint),\r\n model: typeof payload.model === \"string\" ? payload.model : modelOf(params.compiled),\r\n text: answerText(payload),\r\n citations: [],\r\n images: [],\r\n patches: [],\r\n toolUsage: emptyToolUsage(calls),\r\n ...(usage ? { usage } : {}),\r\n warnings: params.compiled.warnings,\r\n errors: [],\r\n raw: { request: params.compiled.body, response: params.response },\r\n ...(params.request.metadata ? { metadata: params.request.metadata } : {})\r\n };\r\n}\r\n\r\nfunction responseApiMode(endpoint: CloudflareEndpoint): \"chat\" | \"responses\" {\r\n return endpoint === \"responses\" ? \"responses\" : \"chat\";\r\n}\r\n\r\nfunction answerText(response: Record<string, unknown>): string {\r\n if (typeof response.output_text === \"string\") return response.output_text;\r\n if (typeof response.text === \"string\" && !Array.isArray(response.choices) && !Array.isArray(response.content)) {\r\n return response.text;\r\n }\r\n const responses = responsesAnswer(response);\r\n if (responses) return responses;\r\n const chat = chatAnswer(response);\r\n if (chat) return chat;\r\n const anthropic = anthropicAnswer(response);\r\n if (anthropic) return anthropic;\r\n if (isRecord(response.result)) return answerText(response.result);\r\n return \"\";\r\n}\r\n\r\nfunction responsesAnswer(response: Record<string, unknown>): string {\r\n if (!Array.isArray(response.output)) return \"\";\r\n const parts: string[] = [];\r\n for (const item of response.output) {\r\n if (!isRecord(item) || item.type !== \"message\" || !Array.isArray(item.content)) continue;\r\n for (const part of item.content) {\r\n if (isRecord(part) && part.type === \"output_text\" && typeof part.text === \"string\") parts.push(part.text);\r\n }\r\n }\r\n return parts.join(\"\");\r\n}\r\n\r\nfunction chatAnswer(response: Record<string, unknown>): string {\r\n const message = chatAssistantMessage(response);\r\n if (!message) return \"\";\r\n const content = message.content;\r\n if (typeof content === \"string\") return content;\r\n if (!Array.isArray(content)) return \"\";\r\n return content\r\n .map((part) => (isRecord(part) && typeof part.text === \"string\" ? part.text : \"\"))\r\n .filter(Boolean)\r\n .join(\"\");\r\n}\r\n\r\nfunction anthropicAnswer(response: Record<string, unknown>): string {\r\n if (!Array.isArray(response.content)) return \"\";\r\n return response.content\r\n .map((part) => (isRecord(part) && part.type === \"text\" && typeof part.text === \"string\" ? part.text : \"\"))\r\n .filter(Boolean)\r\n .join(\"\");\r\n}\r\n\r\nfunction chatAssistantMessage(response: Record<string, unknown>): Record<string, unknown> | undefined {\r\n if (!Array.isArray(response.choices) || !isRecord(response.choices[0])) return undefined;\r\n const message = response.choices[0].message;\r\n return isRecord(message) ? message : undefined;\r\n}\r\n\r\nfunction extractCalls(endpoint: CloudflareEndpoint, response: unknown): FunctionToolUsage[] {\r\n const record = unwrap(response);\r\n if (endpoint === \"responses\") return responsesCalls(record);\r\n if (endpoint === \"messages\") return anthropicCalls(record);\r\n return chatCalls(record);\r\n}\r\n\r\nfunction responsesCalls(response: Record<string, unknown>): FunctionToolUsage[] {\r\n if (!Array.isArray(response.output)) return [];\r\n const calls: FunctionToolUsage[] = [];\r\n for (const item of response.output) {\r\n if (!isRecord(item) || item.type !== \"function_call\") continue;\r\n calls.push(callUsage(\r\n typeof item.name === \"string\" ? item.name : \"function\",\r\n typeof item.call_id === \"string\" ? item.call_id : \"function\",\r\n item.arguments\r\n ));\r\n }\r\n return calls;\r\n}\r\n\r\nfunction chatCalls(response: Record<string, unknown>): FunctionToolUsage[] {\r\n const message = chatAssistantMessage(response);\r\n if (!message || !Array.isArray(message.tool_calls)) return [];\r\n const calls: FunctionToolUsage[] = [];\r\n for (const item of message.tool_calls) {\r\n if (!isRecord(item) || !isRecord(item.function)) continue;\r\n const name = typeof item.function.name === \"string\" ? item.function.name : \"function\";\r\n calls.push(callUsage(\r\n name,\r\n typeof item.id === \"string\" ? item.id : name,\r\n item.function.arguments\r\n ));\r\n }\r\n return calls;\r\n}\r\n\r\nfunction anthropicCalls(response: Record<string, unknown>): FunctionToolUsage[] {\r\n if (!Array.isArray(response.content)) return [];\r\n const calls: FunctionToolUsage[] = [];\r\n for (const item of response.content) {\r\n if (!isRecord(item) || item.type !== \"tool_use\") continue;\r\n const name = typeof item.name === \"string\" ? item.name : \"function\";\r\n calls.push({\r\n name,\r\n callId: typeof item.id === \"string\" ? item.id : name,\r\n status: \"completed\",\r\n args: item.input\r\n });\r\n }\r\n return calls;\r\n}\r\n\r\nfunction callUsage(name: string, callId: string, rawArgs: unknown): FunctionToolUsage {\r\n let args = rawArgs;\r\n if (typeof rawArgs === \"string\") {\r\n try {\r\n args = JSON.parse(rawArgs);\r\n } catch {\r\n args = rawArgs;\r\n }\r\n }\r\n return { name, callId, status: \"completed\", args };\r\n}\r\n\r\nfunction emptyToolUsage(calls: FunctionToolUsage[]): RuntimeToolUsage {\r\n const unused = { requested: false, required: false, used: false };\r\n return {\r\n serverTools: {\r\n webSearch: unused,\r\n webFetch: unused,\r\n datetime: unused,\r\n imageGeneration: unused,\r\n applyPatch: unused,\r\n fusion: unused,\r\n advisor: unused,\r\n subagent: unused\r\n },\r\n functionTools: calls\r\n };\r\n}\r\n\r\nfunction normalizeUsage(usage: unknown): RuntimeResponse[\"usage\"] | undefined {\r\n if (!isRecord(usage)) return undefined;\r\n const inputTokens = numberValue(usage.input_tokens) ?? numberValue(usage.prompt_tokens);\r\n const outputTokens = numberValue(usage.output_tokens) ?? numberValue(usage.completion_tokens);\r\n const totalTokens = numberValue(usage.total_tokens) ?? (\r\n inputTokens !== undefined || outputTokens !== undefined ? (inputTokens ?? 0) + (outputTokens ?? 0) : undefined\r\n );\r\n if (inputTokens === undefined && outputTokens === undefined && totalTokens === undefined) return { raw: usage };\r\n return {\r\n raw: usage,\r\n ...(inputTokens !== undefined ? { inputTokens } : {}),\r\n ...(outputTokens !== undefined ? { outputTokens } : {}),\r\n ...(totalTokens !== undefined ? { totalTokens } : {})\r\n };\r\n}\r\n\r\nfunction failedResponse(\r\n request: RuntimeRequest,\r\n requestId: string,\r\n error: unknown,\r\n apiMode: \"chat\" | \"responses\"\r\n): RuntimeResponse {\r\n const normalized = error instanceof AiDispatcherError\r\n ? error\r\n : new AiDispatcherError(\"PROVIDER_REQUEST_FAILED\", error instanceof Error ? error.message : String(error));\r\n return {\r\n id: requestId,\r\n status: \"failed\",\r\n apiMode,\r\n model: request.model ?? \"\",\r\n text: \"\",\r\n citations: [],\r\n images: [],\r\n patches: [],\r\n toolUsage: emptyToolUsage([]),\r\n warnings: [],\r\n errors: [{\r\n code: normalized.code,\r\n message: normalized.message,\r\n source: \"runtime\",\r\n details: normalized.details\r\n }],\r\n raw: { request, response: undefined }\r\n };\r\n}\r\n\r\nfunction errorEvent(requestId: string, error: unknown): RuntimeStreamEvent {\r\n const normalized = error instanceof AiDispatcherError\r\n ? error\r\n : new AiDispatcherError(\"PROVIDER_REQUEST_FAILED\", error instanceof Error ? error.message : String(error));\r\n return {\r\n type: \"stream.error\",\r\n requestId,\r\n data: {\r\n error: {\r\n code: normalized.code,\r\n message: normalized.message,\r\n source: \"runtime\",\r\n details: normalized.details\r\n }\r\n }\r\n };\r\n}\r\n\r\nfunction textDelta(event: Record<string, unknown>): string | undefined {\r\n if (event.type === \"response.output_text.delta\" && typeof event.delta === \"string\" && event.delta) return event.delta;\r\n if (event.type === \"content_block_delta\" && isRecord(event.delta) && event.delta.type === \"text_delta\" && typeof event.delta.text === \"string\" && event.delta.text) {\r\n return event.delta.text;\r\n }\r\n const choice = firstChoiceDelta(event);\r\n if (choice && typeof choice.content === \"string\" && choice.content) return choice.content;\r\n return undefined;\r\n}\r\n\r\nfunction reasoningDelta(event: Record<string, unknown>): string | undefined {\r\n if (event.type === \"response.reasoning_summary_text.delta\" && typeof event.delta === \"string\" && event.delta) return event.delta;\r\n if (event.type === \"content_block_delta\" && isRecord(event.delta) && event.delta.type === \"thinking_delta\" && typeof event.delta.thinking === \"string\" && event.delta.thinking) {\r\n return event.delta.thinking;\r\n }\r\n const choice = firstChoiceDelta(event);\r\n if (!choice) return undefined;\r\n if (typeof choice.reasoning === \"string\" && choice.reasoning) return choice.reasoning;\r\n if (typeof choice.reasoning_content === \"string\" && choice.reasoning_content) return choice.reasoning_content;\r\n return undefined;\r\n}\r\n\r\nfunction toolCallDelta(event: Record<string, unknown>): { index: number; name?: string; argumentsDelta?: string } | undefined {\r\n if (event.type === \"response.function_call_arguments.delta\" && typeof event.delta === \"string\") {\r\n return {\r\n index: 0,\r\n ...(typeof event.name === \"string\" ? { name: event.name } : {}),\r\n argumentsDelta: event.delta\r\n };\r\n }\r\n if (event.type === \"content_block_delta\" && isRecord(event.delta) && event.delta.type === \"input_json_delta\" && typeof event.delta.partial_json === \"string\") {\r\n return { index: typeof event.index === \"number\" ? event.index : 0, argumentsDelta: event.delta.partial_json };\r\n }\r\n const choice = firstChoiceDelta(event);\r\n if (!choice || !Array.isArray(choice.tool_calls) || !isRecord(choice.tool_calls[0])) return undefined;\r\n const tool = choice.tool_calls[0];\r\n const fn = isRecord(tool.function) ? tool.function : undefined;\r\n const args = fn && typeof fn.arguments === \"string\" ? fn.arguments : undefined;\r\n if (!args && !(fn && typeof fn.name === \"string\")) return undefined;\r\n return {\r\n index: typeof tool.index === \"number\" ? tool.index : 0,\r\n ...(fn && typeof fn.name === \"string\" ? { name: fn.name } : {}),\r\n ...(args ? { argumentsDelta: args } : {})\r\n };\r\n}\r\n\r\nfunction streamUsage(event: Record<string, unknown>): RuntimeResponse[\"usage\"] | undefined {\r\n if (event.type === \"response.completed\" && isRecord(event.response)) return normalizeUsage(event.response.usage);\r\n if (isRecord(event.usage)) return normalizeUsage(event.usage);\r\n return undefined;\r\n}\r\n\r\nfunction firstChoiceDelta(event: Record<string, unknown>): Record<string, unknown> | undefined {\r\n if (!Array.isArray(event.choices) || !isRecord(event.choices[0])) return undefined;\r\n const delta = event.choices[0].delta;\r\n return isRecord(delta) ? delta : undefined;\r\n}\r\n\r\nfunction unwrap(response: unknown): Record<string, unknown> {\r\n if (!isRecord(response)) return {};\r\n if (response.success === true && isRecord(response.result)) return response.result;\r\n return response;\r\n}\r\n\r\nfunction modelOf(compiled: CompiledCloudflareWire): string {\r\n if (typeof compiled.body.model === \"string\") return compiled.body.model;\r\n return \"\";\r\n}\r\n\r\nfunction messageFrom(body: unknown): string | undefined {\r\n if (!isRecord(body)) return undefined;\r\n if (typeof body.message === \"string\") return body.message;\r\n if (isRecord(body.error) && typeof body.error.message === \"string\") return body.error.message;\r\n if (Array.isArray(body.errors)) {\r\n for (const error of body.errors) {\r\n if (isRecord(error) && typeof error.message === \"string\") return error.message;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction numberValue(value: unknown): number | undefined {\r\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\r\n}\r\n\r\nfunction applyProviderRecord(\r\n body: Record<string, unknown>,\r\n metadata: Record<string, string> | undefined\r\n): Record<string, unknown> {\r\n if (metadata) return { ...body, metadata };\r\n if (body.metadata === undefined) return body;\r\n const rest = { ...body };\r\n delete rest.metadata;\r\n return rest;\r\n}\r\n\r\nfunction overlayMetadata(\r\n base: Record<string, unknown> | undefined,\r\n extra: Record<string, unknown> | undefined\r\n): Record<string, unknown> | undefined {\r\n if (!base) return extra;\r\n if (!extra) return base;\r\n return { ...base, ...extra };\r\n}\r\n\r\nfunction endpointUrl(options: ResolvedCloudflareOptions, endpoint: CloudflareEndpoint): string {\r\n const account = encodeURIComponent(options.accountId);\r\n const root = `${options.baseUrl}/accounts/${account}/ai`;\r\n if (endpoint === \"chat\") return `${root}/v1/chat/completions`;\r\n if (endpoint === \"responses\") return `${root}/v1/responses`;\r\n if (endpoint === \"messages\") return `${root}/v1/messages`;\r\n return `${root}/run`;\r\n}\r\n\r\nfunction buildHeaders(\r\n options: ResolvedCloudflareOptions,\r\n call: CloudflareCallContext | undefined,\r\n model: string,\r\n metadata: Record<string, string> | undefined\r\n): Record<string, string> {\r\n const gatewayId = call?.gatewayId?.trim() || options.gatewayId?.trim() || (isWorkersModel(model) ? DEFAULT_GATEWAY_ID : undefined);\r\n const gateway = mergeGateway(options.gateway, call?.gateway);\r\n const cache = call?.cache;\r\n const skip = gateway?.skipCache !== undefined ? gateway.skipCache : cache?.skip === true ? true : undefined;\r\n const ttl = gateway?.cacheTtlSeconds ?? cache?.ttlSeconds;\r\n const key = gateway?.cacheKey ?? cache?.key;\r\n return clean({\r\n \"content-type\": \"application/json\",\r\n authorization: `Bearer ${options.apiToken}`,\r\n ...(gatewayId ? { \"cf-aig-gateway-id\": gatewayId } : {}),\r\n ...(skip !== undefined ? { \"cf-aig-skip-cache\": String(skip) } : {}),\r\n ...(ttl !== undefined ? { \"cf-aig-cache-ttl\": String(ttl) } : {}),\r\n ...(key ? { \"cf-aig-cache-key\": key } : {}),\r\n ...(gateway?.collectLog !== undefined ? { \"cf-aig-collect-log\": String(gateway.collectLog) } : {}),\r\n ...(gateway?.requestTimeoutMs !== undefined ? { \"cf-aig-request-timeout\": String(gateway.requestTimeoutMs) } : {}),\r\n ...(gateway?.maxGatewayAttempts !== undefined ? { \"cf-aig-max-attempts\": String(gateway.maxGatewayAttempts) } : {}),\r\n ...(gateway?.retryDelayMs !== undefined ? { \"cf-aig-retry-delay\": String(gateway.retryDelayMs) } : {}),\r\n ...(isBackoff(gateway?.backoff) ? { \"cf-aig-backoff\": gateway.backoff } : {}),\r\n ...(metadata ? { \"cf-aig-metadata\": JSON.stringify(metadata) } : {})\r\n });\r\n}\r\n\r\nfunction mergeGateway(\r\n base: CloudflareGatewayControls | undefined,\r\n over: CloudflareGatewayControls | undefined\r\n): CloudflareGatewayControls | undefined {\r\n if (!base && !over) return undefined;\r\n return { ...base, ...over };\r\n}\r\n\r\nfunction isBackoff(value: string | undefined): value is \"constant\" | \"linear\" | \"exponential\" {\r\n return value === \"constant\" || value === \"linear\" || value === \"exponential\";\r\n}\r\n\r\nfunction isWorkersModel(model: string): boolean {\r\n return model.trim().toLowerCase().startsWith(\"@cf/\");\r\n}\r\n\r\nfunction isBareOpenAiModel(id: string): boolean {\r\n return /^(gpt|o[134])(?:[.\\-:]|$)/i.test(id.trim());\r\n}\r\n\r\nfunction timeoutFor(request: RuntimeRequest, options: ResolvedCloudflareOptions): number {\r\n return request.execution?.timeoutMs ?? options.timeoutMs;\r\n}\r\n\r\nfunction delay(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nasync function* parseSse(response: Response): AsyncGenerator<unknown> {\r\n const body = response.body;\r\n if (!body) throw new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", \"Cloudflare stream response had no body.\");\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = \"\";\r\n while (true) {\r\n const chunk = await reader.read();\r\n if (chunk.done) break;\r\n buffer += decoder.decode(chunk.value, { stream: true });\r\n const parts = buffer.split(\"\\n\\n\");\r\n buffer = parts.pop() ?? \"\";\r\n for (const part of parts) {\r\n const parsed = parseSsePart(part);\r\n if (parsed !== undefined) yield parsed;\r\n }\r\n }\r\n const trailing = parseSsePart(buffer);\r\n if (trailing !== undefined) yield trailing;\r\n}\r\n\r\nfunction parseSsePart(part: string): unknown | undefined {\r\n const data = part\r\n .split(\"\\n\")\r\n .filter((line) => line.startsWith(\"data:\"))\r\n .map((line) => line.slice(5).trim())\r\n .join(\"\\n\");\r\n if (!data || data === \"[DONE]\") return undefined;\r\n try {\r\n return JSON.parse(data) as unknown;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\ninterface ResolvedCloudflareOptions {\r\n apiToken: string;\r\n accountId: string;\r\n baseUrl: string;\r\n defaultModel?: string;\r\n endpoint?: CloudflareEndpointChoice;\r\n gatewayId?: string;\r\n gateway?: CloudflareGatewayControls;\r\n timeoutMs: number;\r\n maxAttempts: number;\r\n fetch: typeof globalThis.fetch;\r\n tools?: Record<string, RuntimeToolExecutor>;\r\n logger?: RuntimeLogger;\r\n metadataPacker?: MetadataPacker;\r\n}\r\n\r\nfunction resolveCloudflareOptions(options: CloudflareRuntimeOptions, packer?: MetadataPacker): ResolvedCloudflareOptions {\r\n const {\r\n apiToken,\r\n accountId,\r\n baseUrl,\r\n defaultModel,\r\n endpoint,\r\n gatewayId,\r\n timeoutMs,\r\n maxAttempts,\r\n fetch,\r\n tools,\r\n logger,\r\n run,\r\n ...gateway\r\n } = options;\r\n void run;\r\n return {\r\n apiToken: apiToken ?? readEnv(\"CLOUDFLARE_API_TOKEN\") ?? \"\",\r\n accountId: accountId ?? readEnv(\"CLOUDFLARE_ACCOUNT_ID\") ?? \"\",\r\n baseUrl: (baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\"),\r\n ...(defaultModel ? { defaultModel } : {}),\r\n ...(endpoint ? { endpoint } : {}),\r\n ...(gatewayId ? { gatewayId } : {}),\r\n ...(hasGateway(gateway) ? { gateway } : {}),\r\n timeoutMs: timeoutMs ?? DEFAULT_TIMEOUT_MS,\r\n maxAttempts: maxAttempts ?? 2,\r\n fetch: fetch ?? globalThis.fetch,\r\n ...(tools ? { tools } : {}),\r\n ...(logger ? { logger } : {}),\r\n ...(packer ? { metadataPacker: packer } : {})\r\n };\r\n}\r\n\r\nfunction hasGateway(gateway: CloudflareGatewayControls): boolean {\r\n return Object.values(gateway).some((value) => value !== undefined);\r\n}\r\n\r\nfunction clean<T extends Record<string, unknown>>(body: T): T {\r\n return Object.fromEntries(Object.entries(body).filter(([, value]) => value !== undefined)) as T;\r\n}\r\n\r\nfunction readEnv(name: string): string | undefined {\r\n if (typeof process === \"undefined\") return undefined;\r\n return process.env[name];\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n","import {\r\n createBedrockRuntime,\r\n type BedrockRuntime,\r\n type BedrockRuntimeOptions,\r\n type CompiledBedrockRequest,\r\n type RuntimeRequest as BedrockRuntimeRequest\r\n} from \"@x12i/bedrock-runtime\";\r\nimport type { RuntimeRequest, RuntimeResponse, RuntimeStreamEvent } from \"@x12i/openrouter-runtime\";\r\nimport { AiDispatcherError } from \"../errors\";\r\nimport type { AiProviderAdapter, ProviderCallOptions } from \"../types/public\";\r\n\r\n/**\r\n * Maps the dispatcher request into `@x12i/bedrock-runtime` and passes catalog body\r\n * fields through `finalizeBody` so they survive Converse compilation.\r\n */\r\nexport function createBedrockProviderAdapter(\r\n options: BedrockRuntimeOptions = {}\r\n): AiProviderAdapter {\r\n const runtime: BedrockRuntime = createBedrockRuntime(options);\r\n\r\n return {\r\n run(request: RuntimeRequest, call?: ProviderCallOptions): Promise<RuntimeResponse> {\r\n return runtime.run(toBedrockRequest(request), toCall(call)) as unknown as Promise<RuntimeResponse>;\r\n },\r\n executeStreamingChat(request: RuntimeRequest, call?: ProviderCallOptions): AsyncIterable<RuntimeStreamEvent> {\r\n return runtime.executeStreamingChat(\r\n toBedrockRequest(request),\r\n toCall(call)\r\n ) as unknown as AsyncIterable<RuntimeStreamEvent>;\r\n },\r\n compile(request: RuntimeRequest, call?: ProviderCallOptions): CompiledBedrockRequest {\r\n return runtime.compile(toBedrockRequest(request), toCall(call));\r\n }\r\n };\r\n}\r\n\r\nfunction toCall(call?: ProviderCallOptions) {\r\n if (!call) return undefined;\r\n return {\r\n ...(call.finalizeBody ? { finalizeBody: call.finalizeBody } : {}),\r\n ...(call.extractStreamReasoning ? { extractStreamReasoning: call.extractStreamReasoning } : {})\r\n };\r\n}\r\n\r\nfunction toBedrockRequest(request: RuntimeRequest): BedrockRuntimeRequest {\r\n assertBedrockSupported(request);\r\n const mapped: BedrockRuntimeRequest = {};\r\n if (request.id !== undefined) mapped.id = request.id;\r\n if (request.model !== undefined) mapped.model = request.model;\r\n\r\n const hasMessages = Array.isArray(request.messages) && request.messages.length > 0;\r\n if (hasMessages) {\r\n mapped.messages = request.messages as NonNullable<BedrockRuntimeRequest[\"messages\"]>;\r\n } else if (Array.isArray(request.input)) {\r\n mapped.messages = inputItemsToMessages(request.input);\r\n }\r\n\r\n const system = request.system?.trim() ? request.system : request.instructions;\r\n if (system !== undefined) mapped.system = system;\r\n if (request.prompt !== undefined) mapped.prompt = request.prompt;\r\n else if (!hasMessages && !Array.isArray(request.input) && typeof request.input === \"string\") {\r\n mapped.prompt = request.input;\r\n }\r\n if (request.temperature !== undefined) mapped.temperature = request.temperature;\r\n if (request.maxTokens !== undefined) mapped.maxTokens = request.maxTokens;\r\n if (request.functionTools !== undefined) {\r\n mapped.functionTools = request.functionTools as NonNullable<BedrockRuntimeRequest[\"functionTools\"]>;\r\n }\r\n if (request.toolChoice !== undefined && isBedrockToolChoice(request.toolChoice)) {\r\n mapped.toolChoice = request.toolChoice;\r\n }\r\n if (request.execution !== undefined) {\r\n mapped.execution = {\r\n ...(request.execution.maxToolIterations !== undefined\r\n ? { maxToolIterations: request.execution.maxToolIterations }\r\n : {}),\r\n ...(request.execution.maxFunctionToolCalls !== undefined\r\n ? { maxFunctionToolCalls: request.execution.maxFunctionToolCalls }\r\n : {}),\r\n ...(request.execution.timeoutMs !== undefined\r\n ? { timeoutMs: request.execution.timeoutMs }\r\n : {})\r\n };\r\n }\r\n if (request.agentId !== undefined) mapped.agentId = request.agentId;\r\n if (request.metadata !== undefined) mapped.metadata = request.metadata;\r\n return mapped;\r\n}\r\n\r\nfunction assertBedrockSupported(request: RuntimeRequest): void {\r\n if (request.serverTools && serverToolsEnabled(request.serverTools)) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Bedrock does not support OpenRouter server tools.\"\r\n );\r\n }\r\n if (request.responseFormat !== undefined) {\r\n throw new AiDispatcherError(\"UNSUPPORTED_REQUEST_FIELD\", \"Bedrock does not accept responseFormat.\");\r\n }\r\n if (request.rawOpenRouterOverrides !== undefined) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"rawOpenRouterOverrides cannot be sent to Bedrock.\"\r\n );\r\n }\r\n if (request.apiMode !== undefined) {\r\n throw new AiDispatcherError(\"UNSUPPORTED_REQUEST_FIELD\", \"Bedrock does not accept apiMode.\");\r\n }\r\n if (request.toolChoice && typeof request.toolChoice === \"object\" && request.toolChoice.type === \"server_tool\") {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Bedrock does not support OpenRouter server tool choices.\"\r\n );\r\n }\r\n if (hasMessages(request) && Array.isArray(request.input)) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Bedrock accepts messages or input items, not both.\"\r\n );\r\n }\r\n}\r\n\r\nfunction hasMessages(request: RuntimeRequest): boolean {\r\n return Array.isArray(request.messages) && request.messages.length > 0;\r\n}\r\n\r\nfunction serverToolsEnabled(policy: NonNullable<RuntimeRequest[\"serverTools\"]>): boolean {\r\n return Object.values(policy).some((value) => {\r\n if (Array.isArray(value)) return value.some((item) => isEnabledMode(item));\r\n return isEnabledMode(value);\r\n });\r\n}\r\n\r\nfunction isEnabledMode(value: unknown): boolean {\r\n return typeof value === \"object\" && value !== null && \"mode\" in value && (value as { mode?: string }).mode !== \"disabled\";\r\n}\r\n\r\nfunction inputItemsToMessages(\r\n items: Array<Record<string, unknown> | string>\r\n): NonNullable<BedrockRuntimeRequest[\"messages\"]> {\r\n return items.map((item) => {\r\n if (typeof item === \"string\") return { role: \"user\", content: item };\r\n const role = item.role;\r\n if ((role !== \"system\" && role !== \"user\" && role !== \"assistant\" && role !== \"tool\") || !hasContent(item.content)) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Bedrock input items must be text or messages with role and content.\"\r\n );\r\n }\r\n return {\r\n role,\r\n content: item.content as NonNullable<BedrockRuntimeRequest[\"messages\"]>[number][\"content\"],\r\n ...(typeof item.name === \"string\" ? { name: item.name } : {}),\r\n ...(typeof item.toolCallId === \"string\" ? { toolCallId: item.toolCallId } : {})\r\n };\r\n });\r\n}\r\n\r\nfunction hasContent(content: unknown): boolean {\r\n return typeof content === \"string\" || Array.isArray(content);\r\n}\r\n\r\nfunction isBedrockToolChoice(\r\n toolChoice: RuntimeRequest[\"toolChoice\"]\r\n): toolChoice is NonNullable<BedrockRuntimeRequest[\"toolChoice\"]> {\r\n if (toolChoice === undefined) return false;\r\n if (toolChoice === \"auto\" || toolChoice === \"none\" || toolChoice === \"required\") return true;\r\n if (typeof toolChoice === \"object\" && toolChoice.type === \"function\") return true;\r\n return false;\r\n}\r\n","import {\r\n packProviderRecord,\r\n type RuntimeMessage,\r\n type RuntimeRequest,\r\n type RuntimeResponse,\r\n type RuntimeStreamEvent,\r\n type RuntimeLogger,\r\n type RuntimeToolExecutor,\r\n type RuntimeToolUsage,\r\n type RuntimeWarning\r\n} from \"@x12i/openrouter-runtime\";\r\nimport { AiDispatcherError } from \"../errors\";\r\n\r\ntype FunctionToolUsage = RuntimeToolUsage[\"functionTools\"][number];\r\nimport type { ProviderCallOptions } from \"../types/public\";\r\nimport type { MetadataPacker } from \"@x12i/provider-metadata\";\r\nimport type { OpenAiRuntimeOptions } from \"../types/openai\";\r\n\r\nconst DEFAULT_BASE_URL = \"https://api.openai.com/v1\";\r\nconst DEFAULT_TIMEOUT_MS = 120_000;\r\n\r\nexport interface CompiledOpenAiWire {\r\n url: string;\r\n headers: Record<string, string>;\r\n body: Record<string, unknown>;\r\n warnings: RuntimeWarning[];\r\n}\r\n\r\nexport function createOpenAiProviderAdapter(options: OpenAiRuntimeOptions = {}, packer?: MetadataPacker) {\r\n const resolved = resolveOpenAiOptions(options, packer);\r\n\r\n return {\r\n compile(request: RuntimeRequest, call?: ProviderCallOptions): CompiledOpenAiWire {\r\n return compileOpenAiRequest(request, resolved, call, false);\r\n },\r\n async run(request: RuntimeRequest, call?: ProviderCallOptions): Promise<RuntimeResponse> {\r\n const requestId = request.id ?? \"openai\";\r\n try {\r\n return await runOpenAi(request, resolved, call, requestId);\r\n } catch (error) {\r\n if (error instanceof AiDispatcherError && isConfigError(error.code)) throw error;\r\n return failedResponse(request, requestId, error);\r\n }\r\n },\r\n executeStreamingChat(request: RuntimeRequest, call?: ProviderCallOptions): AsyncIterable<RuntimeStreamEvent> {\r\n return streamOpenAi(request, resolved, call);\r\n }\r\n };\r\n}\r\n\r\nfunction compileOpenAiRequest(\r\n request: RuntimeRequest,\r\n options: ResolvedOpenAiOptions,\r\n call: ProviderCallOptions | undefined,\r\n streaming: boolean\r\n): CompiledOpenAiWire {\r\n assertSupported(request);\r\n const model = (request.model ?? options.defaultModel ?? \"\").trim();\r\n if (!model) {\r\n throw new AiDispatcherError(\r\n \"MODEL_REQUIRED\",\r\n \"A model id is required. Set request.model or openai.defaultModel.\"\r\n );\r\n }\r\n if (!options.apiKey) {\r\n throw new AiDispatcherError(\r\n \"OPENAI_API_KEY_MISSING\",\r\n \"OpenAI API key is required. Set openai.apiKey or OPENAI_API_KEY.\"\r\n );\r\n }\r\n\r\n const instructions = compileInstructions(request);\r\n const input = compileInput(request);\r\n if (input === undefined) {\r\n throw new AiDispatcherError(\"INPUT_REQUIRED\", \"Provide request.messages, request.input, or request.prompt.\");\r\n }\r\n\r\n let body: Record<string, unknown> = clean({\r\n model,\r\n input,\r\n instructions,\r\n temperature: request.temperature,\r\n max_output_tokens: request.maxTokens,\r\n reasoning: request.reasoning,\r\n text: request.responseFormat,\r\n tools: compileTools(request),\r\n tool_choice: compileToolChoice(request)\r\n });\r\n if (call?.finalizeBody) body = call.finalizeBody(body);\r\n if (streaming) body = { ...body, stream: true };\r\n else body = { ...body, stream: false };\r\n const packed = attachProviderMetadata(body, request, options.metadataPacker);\r\n body = packed.body;\r\n\r\n return {\r\n url: `${options.baseUrl}/responses`,\r\n headers: buildHeaders(options),\r\n body,\r\n warnings: packed.warning ? [packed.warning] : []\r\n };\r\n}\r\n\r\nfunction assertSupported(request: RuntimeRequest): void {\r\n if (request.serverTools && serverToolsEnabled(request.serverTools)) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Direct OpenAI does not support OpenRouter server tools.\"\r\n );\r\n }\r\n if (request.rawOpenRouterOverrides !== undefined) {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"rawOpenRouterOverrides cannot be sent to the OpenAI Responses API.\"\r\n );\r\n }\r\n if (request.apiMode === \"chat\") {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Direct OpenAI uses the Responses API. Do not set apiMode to chat.\"\r\n );\r\n }\r\n if (request.toolChoice && typeof request.toolChoice === \"object\" && request.toolChoice.type === \"server_tool\") {\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"Direct OpenAI does not support OpenRouter server tool choices.\"\r\n );\r\n }\r\n}\r\n\r\nfunction serverToolsEnabled(policy: NonNullable<RuntimeRequest[\"serverTools\"]>): boolean {\r\n return Object.values(policy).some((value) => {\r\n if (Array.isArray(value)) return value.some((item) => isEnabledMode(item));\r\n return isEnabledMode(value);\r\n });\r\n}\r\n\r\nfunction isEnabledMode(value: unknown): boolean {\r\n return typeof value === \"object\" && value !== null && \"mode\" in value && (value as { mode?: string }).mode !== \"disabled\";\r\n}\r\n\r\nfunction compileInstructions(request: RuntimeRequest): string | undefined {\r\n if (request.instructions) return request.instructions;\r\n if (request.system) return request.system;\r\n const systemMessages = (request.messages ?? []).filter((message) => message.role === \"system\");\r\n if (!systemMessages.length) return undefined;\r\n return systemMessages.map((message) => contentToText(message.content)).filter(Boolean).join(\"\\n\");\r\n}\r\n\r\nfunction compileInput(request: RuntimeRequest): unknown {\r\n if (request.input !== undefined) return request.input;\r\n const items: unknown[] = [];\r\n for (const message of request.messages ?? []) {\r\n if (message.role === \"system\" && !request.instructions && !request.system) continue;\r\n if (message.role === \"system\") continue;\r\n items.push(compileInputItem(message));\r\n }\r\n if (typeof request.prompt === \"string\") {\r\n items.push({ role: \"user\", content: request.prompt });\r\n }\r\n return items.length ? items : undefined;\r\n}\r\n\r\nfunction compileInputItem(message: RuntimeMessage): Record<string, unknown> {\r\n if (message.role === \"tool\") {\r\n return {\r\n type: \"function_call_output\",\r\n call_id: message.toolCallId ?? message.name ?? \"tool\",\r\n output: contentToText(message.content)\r\n };\r\n }\r\n const role = message.role === \"assistant\" ? \"assistant\" : \"user\";\r\n return { role, content: compileContent(message.content) };\r\n}\r\n\r\nfunction compileContent(content: RuntimeMessage[\"content\"]): unknown {\r\n if (typeof content === \"string\") return content;\r\n return content.map((part) => {\r\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\r\n if (part.type === \"image_url\") return { type: \"input_image\", image_url: part.imageUrl };\r\n if (part.url) {\r\n return clean({ type: \"input_file\", file_url: part.url, filename: part.fileName });\r\n }\r\n if (part.data) {\r\n return clean({ type: \"input_file\", file_data: part.data, filename: part.fileName });\r\n }\r\n throw new AiDispatcherError(\r\n \"UNSUPPORTED_REQUEST_FIELD\",\r\n \"File content parts need a url or data.\"\r\n );\r\n });\r\n}\r\n\r\nfunction compileTools(request: RuntimeRequest): unknown[] | undefined {\r\n const tools = request.functionTools ?? [];\r\n if (!tools.length) return undefined;\r\n return tools.map((tool) => ({\r\n type: \"function\",\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: tool.parameters\r\n }));\r\n}\r\n\r\nfunction compileToolChoice(request: RuntimeRequest): unknown {\r\n const choice = request.toolChoice;\r\n if (!choice || choice === \"auto\") return undefined;\r\n if (choice === \"none\" || choice === \"required\") return choice;\r\n if (typeof choice === \"object\" && choice.type === \"function\") {\r\n return { type: \"function\", name: choice.functionName };\r\n }\r\n return undefined;\r\n}\r\n\r\nasync function runOpenAi(\r\n request: RuntimeRequest,\r\n options: ResolvedOpenAiOptions,\r\n call: ProviderCallOptions | undefined,\r\n requestId: string\r\n): Promise<RuntimeResponse> {\r\n const maxIterations = request.execution?.maxToolIterations ?? 8;\r\n const maxFunctionToolCalls = request.execution?.maxFunctionToolCalls ?? 20;\r\n const functionUsage: FunctionToolUsage[] = [];\r\n let active = compileOpenAiRequest(request, options, call, false);\r\n let response: unknown;\r\n\r\n for (let iteration = 0; iteration <= maxIterations; iteration += 1) {\r\n response = await sendWithRetries(active, options, timeoutFor(request, options));\r\n const calls = functionCalls(isRecord(response) ? response : {});\r\n if (!calls.length) break;\r\n if (!calls.every((item) => resolveExecutor(item.name, request, options))) {\r\n return normalizeOpenAiResponse({\r\n request,\r\n requestId,\r\n compiled: active,\r\n response,\r\n functionTools: [...functionUsage, ...calls],\r\n status: \"requires_action\"\r\n });\r\n }\r\n if (functionUsage.length + calls.length > maxFunctionToolCalls) {\r\n throw new AiDispatcherError(\"FUNCTION_TOOL_LIMIT\", \"maxFunctionToolCalls exceeded.\");\r\n }\r\n const results: FunctionToolUsage[] = [];\r\n for (const item of calls) {\r\n results.push(await executeOpenAiTool(item, request, options));\r\n }\r\n functionUsage.push(...results);\r\n const record = isRecord(response) ? response : {};\r\n active = {\r\n ...active,\r\n body: clean({\r\n ...active.body,\r\n tool_choice: \"auto\",\r\n previous_response_id: typeof record.id === \"string\" ? record.id : undefined,\r\n input: results.map(toFunctionCallOutput)\r\n })\r\n };\r\n }\r\n\r\n return normalizeOpenAiResponse({\r\n request,\r\n requestId,\r\n compiled: active,\r\n response,\r\n functionTools: functionUsage,\r\n status: \"completed\"\r\n });\r\n}\r\n\r\nfunction resolveExecutor(\r\n name: string,\r\n request: RuntimeRequest,\r\n options: ResolvedOpenAiOptions\r\n): RuntimeToolExecutor | undefined {\r\n return request.functionTools?.find((tool) => tool.name === name)?.executor ?? options.tools?.[name];\r\n}\r\n\r\nasync function executeOpenAiTool(\r\n call: FunctionToolUsage,\r\n request: RuntimeRequest,\r\n options: ResolvedOpenAiOptions\r\n): Promise<FunctionToolUsage> {\r\n const executor = resolveExecutor(call.name, request, options);\r\n if (!executor) {\r\n return call;\r\n }\r\n const started = Date.now();\r\n try {\r\n options.logger?.debug?.(\"runtime.function_tool.started\", { name: call.name, callId: call.callId });\r\n const result = await executor(call.args, {\r\n requestId: request.id ?? \"\",\r\n toolName: call.name,\r\n callId: call.callId,\r\n ...(request.metadata ? { metadata: request.metadata } : {})\r\n });\r\n const usage: FunctionToolUsage = {\r\n name: call.name,\r\n callId: call.callId,\r\n status: \"completed\",\r\n args: call.args,\r\n result,\r\n durationMs: Date.now() - started\r\n };\r\n options.logger?.debug?.(\"runtime.function_tool.completed\", { name: call.name, callId: call.callId });\r\n return usage;\r\n } catch (error) {\r\n const usage: FunctionToolUsage = {\r\n name: call.name,\r\n callId: call.callId,\r\n status: \"failed\",\r\n args: call.args,\r\n error: error instanceof Error ? error.message : String(error),\r\n durationMs: Date.now() - started\r\n };\r\n options.logger?.warn?.(\"runtime.function_tool.failed\", usage);\r\n return usage;\r\n }\r\n}\r\n\r\nfunction toFunctionCallOutput(result: FunctionToolUsage): Record<string, unknown> {\r\n const output = result.status === \"completed\" ? result.result : { error: result.error };\r\n return {\r\n type: \"function_call_output\",\r\n call_id: result.callId,\r\n output: typeof output === \"string\" ? output : JSON.stringify(output)\r\n };\r\n}\r\n\r\nfunction contentToText(content: RuntimeMessage[\"content\"]): string {\r\n if (typeof content === \"string\") return content;\r\n return content.map((part) => (part.type === \"text\" ? part.text : \"\")).filter(Boolean).join(\"\");\r\n}\r\n\r\nasync function* streamOpenAi(\r\n request: RuntimeRequest,\r\n options: ResolvedOpenAiOptions,\r\n call?: ProviderCallOptions\r\n): AsyncGenerator<RuntimeStreamEvent> {\r\n const requestId = request.id ?? \"\";\r\n let compiled: CompiledOpenAiWire;\r\n try {\r\n compiled = compileOpenAiRequest(request, options, call, true);\r\n } catch (error) {\r\n yield errorEvent(requestId, error);\r\n throw error;\r\n }\r\n\r\n yield {\r\n type: \"stream.start\",\r\n requestId,\r\n data: {\r\n model: typeof compiled.body.model === \"string\" ? compiled.body.model : \"\",\r\n apiMode: \"responses\",\r\n entrypoint: \"executeStreamingChat\"\r\n }\r\n };\r\n\r\n const controller = new AbortController();\r\n const timeout = setTimeout(() => controller.abort(), timeoutFor(request, options));\r\n let text = \"\";\r\n let reported = false;\r\n const report = (error: unknown): AiDispatcherError => {\r\n const failure = error instanceof AiDispatcherError\r\n ? error\r\n : new AiDispatcherError(\r\n \"PROVIDER_GATEWAY_UNREACHABLE\",\r\n error instanceof Error ? error.message : \"OpenAI request failed before receiving a response.\"\r\n );\r\n return failure;\r\n };\r\n try {\r\n const response = await options.fetch(compiled.url, {\r\n method: \"POST\",\r\n headers: { ...compiled.headers, Accept: \"text/event-stream\" },\r\n body: JSON.stringify(compiled.body),\r\n signal: controller.signal\r\n });\r\n if (!response.ok) {\r\n const failure = await readFailure(response);\r\n reported = true;\r\n yield errorEvent(requestId, failure);\r\n throw failure;\r\n }\r\n for await (const event of parseSse(response)) {\r\n if (!isRecord(event)) continue;\r\n if (event.type === \"response.output_text.delta\" && typeof event.delta === \"string\" && event.delta) {\r\n text += event.delta;\r\n yield { type: \"stream.text.delta\", requestId, data: { text: event.delta } };\r\n } else if (event.type === \"response.reasoning_summary_text.delta\" && call?.extractStreamReasoning) {\r\n const reasoningText = call.extractStreamReasoning(event);\r\n if (reasoningText) {\r\n yield { type: \"stream.reasoning.delta\", requestId, data: { text: reasoningText } };\r\n }\r\n } else if (event.type === \"response.function_call_arguments.delta\" && typeof event.delta === \"string\") {\r\n yield {\r\n type: \"stream.tool_call.delta\",\r\n requestId,\r\n data: {\r\n index: 0,\r\n ...(typeof event.name === \"string\" ? { name: event.name } : {}),\r\n argumentsDelta: event.delta\r\n }\r\n };\r\n } else if (event.type === \"response.completed\" && isRecord(event.response)) {\r\n const usage = normalizeUsage(event.response.usage);\r\n if (usage) yield { type: \"stream.usage\", requestId, data: { usage } };\r\n } else if (event.type === \"error\") {\r\n const failure = new AiDispatcherError(\r\n \"PROVIDER_REQUEST_FAILED\",\r\n typeof event.message === \"string\" ? event.message : \"OpenAI stream returned an error event.\",\r\n event\r\n );\r\n reported = true;\r\n yield errorEvent(requestId, failure);\r\n throw failure;\r\n }\r\n }\r\n yield {\r\n type: \"stream.done\",\r\n requestId,\r\n data: {\r\n text,\r\n model: typeof compiled.body.model === \"string\" ? compiled.body.model : \"\"\r\n }\r\n };\r\n } catch (error) {\r\n const failure = error instanceof Error && error.name === \"AbortError\"\r\n ? new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", \"OpenAI request timed out.\")\r\n : report(error);\r\n if (!reported) yield errorEvent(requestId, failure);\r\n throw failure;\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n}\r\n\r\nasync function sendWithRetries(\r\n compiled: CompiledOpenAiWire,\r\n options: ResolvedOpenAiOptions,\r\n timeoutMs: number\r\n): Promise<unknown> {\r\n const attempts = options.maxAttempts;\r\n let lastError: unknown;\r\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\r\n try {\r\n return await sendOnce(compiled, options, timeoutMs);\r\n } catch (error) {\r\n lastError = error;\r\n const retryable = error instanceof AiDispatcherError && error.code === \"PROVIDER_RETRYABLE\";\r\n if (!retryable || attempt >= attempts) throw asTerminalError(error);\r\n await delay(Math.min(500 * 2 ** (attempt - 1), 5_000));\r\n }\r\n }\r\n throw lastError;\r\n}\r\n\r\nasync function sendOnce(compiled: CompiledOpenAiWire, options: ResolvedOpenAiOptions, timeoutMs: number): Promise<unknown> {\r\n const controller = new AbortController();\r\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\r\n try {\r\n const response = await options.fetch(compiled.url, {\r\n method: \"POST\",\r\n headers: compiled.headers,\r\n body: JSON.stringify(compiled.body),\r\n signal: controller.signal\r\n });\r\n if (!response.ok) throw await readFailure(response);\r\n const text = await response.text();\r\n return text ? JSON.parse(text) : {};\r\n } catch (error) {\r\n if (error instanceof AiDispatcherError) throw error;\r\n if (error instanceof Error && error.name === \"AbortError\") {\r\n throw new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", \"OpenAI request timed out.\");\r\n }\r\n throw new AiDispatcherError(\r\n \"PROVIDER_GATEWAY_UNREACHABLE\",\r\n error instanceof Error ? error.message : \"OpenAI request failed before receiving a response.\"\r\n );\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n}\r\n\r\nasync function readFailure(response: Response): Promise<AiDispatcherError> {\r\n const text = await response.text();\r\n let body: unknown = text;\r\n try {\r\n body = text ? JSON.parse(text) : undefined;\r\n } catch {\r\n body = text;\r\n }\r\n const message = messageFrom(body) ?? `OpenAI request failed with status ${response.status}.`;\r\n const retryable = response.status === 429 || response.status >= 500;\r\n return new AiDispatcherError(classifyStatus(response.status), message, { status: response.status, body, retryable });\r\n}\r\n\r\nfunction classifyStatus(status: number): string {\r\n if (status === 401 || status === 403) return \"PROVIDER_AUTH_FAILED\";\r\n if (status === 404) return \"PROVIDER_MODEL_NOT_FOUND\";\r\n if (status === 429 || status === 408 || status >= 500) return \"PROVIDER_RETRYABLE\";\r\n return \"PROVIDER_REQUEST_FAILED\";\r\n}\r\n\r\nfunction isConfigError(code: string): boolean {\r\n return code === \"OPENAI_API_KEY_MISSING\"\r\n || code === \"MODEL_REQUIRED\"\r\n || code === \"INPUT_REQUIRED\"\r\n || code === \"UNSUPPORTED_REQUEST_FIELD\";\r\n}\r\n\r\nfunction asTerminalError(error: unknown): AiDispatcherError {\r\n if (error instanceof AiDispatcherError && error.code === \"PROVIDER_RETRYABLE\") {\r\n const status = isRecord(error.details) ? error.details.status : undefined;\r\n if (status === 429) return new AiDispatcherError(\"PROVIDER_RATE_LIMITED\", error.message, error.details);\r\n return new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", error.message, error.details);\r\n }\r\n if (error instanceof AiDispatcherError) return error;\r\n return new AiDispatcherError(\"PROVIDER_REQUEST_FAILED\", error instanceof Error ? error.message : String(error));\r\n}\r\n\r\nfunction normalizeOpenAiResponse(params: {\r\n request: RuntimeRequest;\r\n requestId: string;\r\n compiled: CompiledOpenAiWire;\r\n response: unknown;\r\n functionTools?: FunctionToolUsage[];\r\n status?: RuntimeResponse[\"status\"];\r\n}): RuntimeResponse {\r\n const record = isRecord(params.response) ? params.response : {};\r\n const text = answerText(record);\r\n const calls = params.functionTools ?? functionCalls(record);\r\n const usage = normalizeUsage(record.usage);\r\n const status = params.status ?? (calls.length ? \"requires_action\" : \"completed\");\r\n return {\r\n id: typeof record.id === \"string\" ? record.id : params.requestId,\r\n status,\r\n apiMode: \"responses\",\r\n model: typeof record.model === \"string\" ? record.model : modelOf(params.compiled),\r\n text,\r\n citations: [],\r\n images: [],\r\n patches: [],\r\n toolUsage: toolUsage(calls),\r\n ...(usage ? { usage } : {}),\r\n warnings: params.compiled.warnings,\r\n errors: [],\r\n raw: { request: params.compiled.body, response: params.response },\r\n ...(params.request.metadata ? { metadata: params.request.metadata } : {})\r\n };\r\n}\r\n\r\nfunction answerText(response: Record<string, unknown>): string {\r\n const output = response.output;\r\n if (Array.isArray(output)) {\r\n const parts: string[] = [];\r\n for (const item of output) {\r\n if (!isRecord(item) || item.type === \"reasoning\" || item.type !== \"message\" || !Array.isArray(item.content)) continue;\r\n for (const part of item.content) {\r\n if (isRecord(part) && part.type === \"output_text\" && typeof part.text === \"string\") parts.push(part.text);\r\n }\r\n }\r\n if (parts.length > 0) return parts.join(\"\");\r\n }\r\n return typeof response.output_text === \"string\" ? response.output_text : \"\";\r\n}\r\n\r\nfunction functionCalls(response: Record<string, unknown>): RuntimeToolUsage[\"functionTools\"] {\r\n if (!Array.isArray(response.output)) return [];\r\n const calls: RuntimeToolUsage[\"functionTools\"] = [];\r\n for (const item of response.output) {\r\n if (!isRecord(item) || item.type !== \"function_call\") continue;\r\n const name = typeof item.name === \"string\" ? item.name : \"function\";\r\n const callId = typeof item.call_id === \"string\" ? item.call_id : name;\r\n let args: unknown = item.arguments;\r\n if (typeof item.arguments === \"string\") {\r\n try {\r\n args = JSON.parse(item.arguments);\r\n } catch {\r\n args = item.arguments;\r\n }\r\n }\r\n calls.push({ name, callId, status: \"completed\", args });\r\n }\r\n return calls;\r\n}\r\n\r\nfunction toolUsage(calls: RuntimeToolUsage[\"functionTools\"]): RuntimeToolUsage {\r\n const unused = { requested: false, required: false, used: false };\r\n return {\r\n serverTools: {\r\n webSearch: unused,\r\n webFetch: unused,\r\n datetime: unused,\r\n imageGeneration: unused,\r\n applyPatch: unused,\r\n fusion: unused,\r\n advisor: unused,\r\n subagent: unused\r\n },\r\n functionTools: calls\r\n };\r\n}\r\n\r\nfunction normalizeUsage(usage: unknown): RuntimeResponse[\"usage\"] | undefined {\r\n if (!isRecord(usage)) return undefined;\r\n const inputTokens = numberValue(usage.input_tokens);\r\n const outputTokens = numberValue(usage.output_tokens);\r\n const totalTokens = numberValue(usage.total_tokens) ?? (\r\n inputTokens !== undefined || outputTokens !== undefined ? (inputTokens ?? 0) + (outputTokens ?? 0) : undefined\r\n );\r\n return {\r\n raw: usage,\r\n ...(inputTokens !== undefined ? { inputTokens } : {}),\r\n ...(outputTokens !== undefined ? { outputTokens } : {}),\r\n ...(totalTokens !== undefined ? { totalTokens } : {})\r\n };\r\n}\r\n\r\nfunction failedResponse(request: RuntimeRequest, requestId: string, error: unknown): RuntimeResponse {\r\n const normalized = error instanceof AiDispatcherError\r\n ? error\r\n : new AiDispatcherError(\"PROVIDER_REQUEST_FAILED\", error instanceof Error ? error.message : String(error));\r\n return {\r\n id: requestId,\r\n status: \"failed\",\r\n apiMode: \"responses\",\r\n model: request.model ?? \"\",\r\n text: \"\",\r\n citations: [],\r\n images: [],\r\n patches: [],\r\n toolUsage: toolUsage([]),\r\n warnings: [],\r\n errors: [{\r\n code: normalized.code,\r\n message: normalized.message,\r\n source: \"runtime\",\r\n details: normalized.details\r\n }],\r\n raw: { request, response: undefined }\r\n };\r\n}\r\n\r\nfunction errorEvent(requestId: string, error: unknown): RuntimeStreamEvent {\r\n const normalized = error instanceof AiDispatcherError\r\n ? error\r\n : new AiDispatcherError(\"PROVIDER_REQUEST_FAILED\", error instanceof Error ? error.message : String(error));\r\n return {\r\n type: \"stream.error\",\r\n requestId,\r\n data: {\r\n error: {\r\n code: normalized.code,\r\n message: normalized.message,\r\n source: \"runtime\",\r\n details: normalized.details\r\n }\r\n }\r\n };\r\n}\r\n\r\nfunction modelOf(compiled: CompiledOpenAiWire): string {\r\n return typeof compiled.body.model === \"string\" ? compiled.body.model : \"\";\r\n}\r\n\r\nfunction messageFrom(body: unknown): string | undefined {\r\n if (!isRecord(body)) return undefined;\r\n if (typeof body.message === \"string\") return body.message;\r\n if (isRecord(body.error) && typeof body.error.message === \"string\") return body.error.message;\r\n return undefined;\r\n}\r\n\r\nfunction numberValue(value: unknown): number | undefined {\r\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\r\n}\r\n\r\nfunction attachProviderMetadata(\r\n body: Record<string, unknown>,\r\n request: RuntimeRequest,\r\n packer?: MetadataPacker\r\n): { body: Record<string, unknown>; warning?: RuntimeWarning } {\r\n const fromBody = isRecord(body.metadata) ? body.metadata : undefined;\r\n const packed = packProviderRecord(request.metadata, request.agentId, fromBody, packer);\r\n if (packed.wire) return { body: { ...body, metadata: packed.wire }, ...(packed.warning ? { warning: packed.warning } : {}) };\r\n if (body.metadata === undefined) return { body, ...(packed.warning ? { warning: packed.warning } : {}) };\r\n const rest = { ...body };\r\n delete rest.metadata;\r\n return { body: rest, ...(packed.warning ? { warning: packed.warning } : {}) };\r\n}\r\n\r\nfunction clean(body: Record<string, unknown>): Record<string, unknown> {\r\n return Object.fromEntries(Object.entries(body).filter(([, value]) => value !== undefined));\r\n}\r\n\r\nfunction buildHeaders(options: ResolvedOpenAiOptions): Record<string, string> {\r\n return {\r\n \"content-type\": \"application/json\",\r\n authorization: `Bearer ${options.apiKey}`,\r\n ...(options.organization ? { \"OpenAI-Organization\": options.organization } : {}),\r\n ...(options.project ? { \"OpenAI-Project\": options.project } : {})\r\n };\r\n}\r\n\r\nfunction timeoutFor(request: RuntimeRequest, options: ResolvedOpenAiOptions): number {\r\n return request.execution?.timeoutMs ?? options.timeoutMs;\r\n}\r\n\r\nfunction delay(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nasync function* parseSse(response: Response): AsyncGenerator<unknown> {\r\n const body = response.body;\r\n if (!body) throw new AiDispatcherError(\"PROVIDER_GATEWAY_UNREACHABLE\", \"OpenAI stream response had no body.\");\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = \"\";\r\n while (true) {\r\n const chunk = await reader.read();\r\n if (chunk.done) break;\r\n buffer += decoder.decode(chunk.value, { stream: true });\r\n const parts = buffer.split(\"\\n\\n\");\r\n buffer = parts.pop() ?? \"\";\r\n for (const part of parts) {\r\n const parsed = parseSsePart(part);\r\n if (parsed !== undefined) yield parsed;\r\n }\r\n }\r\n const trailing = parseSsePart(buffer);\r\n if (trailing !== undefined) yield trailing;\r\n}\r\n\r\nfunction parseSsePart(part: string): unknown | undefined {\r\n const data = part\r\n .split(\"\\n\")\r\n .filter((line) => line.startsWith(\"data:\"))\r\n .map((line) => line.slice(5).trim())\r\n .join(\"\\n\");\r\n if (!data || data === \"[DONE]\") return undefined;\r\n try {\r\n return JSON.parse(data) as unknown;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\ninterface ResolvedOpenAiOptions {\r\n apiKey: string;\r\n baseUrl: string;\r\n defaultModel?: string;\r\n organization?: string;\r\n project?: string;\r\n timeoutMs: number;\r\n maxAttempts: number;\r\n fetch: typeof globalThis.fetch;\r\n tools?: Record<string, RuntimeToolExecutor>;\r\n logger?: RuntimeLogger;\r\n metadataPacker?: MetadataPacker;\r\n}\r\n\r\nfunction resolveOpenAiOptions(options: OpenAiRuntimeOptions, packer?: MetadataPacker): ResolvedOpenAiOptions {\r\n const baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\r\n return {\r\n apiKey: options.apiKey ?? readEnv(\"OPENAI_API_KEY\") ?? \"\",\r\n baseUrl,\r\n ...(options.defaultModel ? { defaultModel: options.defaultModel } : {}),\r\n ...(options.organization ? { organization: options.organization } : {}),\r\n ...(options.project ? { project: options.project } : {}),\r\n timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\r\n maxAttempts: options.maxAttempts ?? 3,\r\n fetch: options.fetch ?? globalThis.fetch,\r\n ...(options.tools ? { tools: options.tools } : {}),\r\n ...(options.logger ? { logger: options.logger } : {}),\r\n ...(packer ? { metadataPacker: packer } : {})\r\n };\r\n}\r\n\r\nfunction readEnv(name: string): string | undefined {\r\n if (typeof process === \"undefined\") return undefined;\r\n return process.env[name];\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n","import {\r\n createOpenRouterRuntime,\r\n type OpenRouterRuntime,\r\n type OpenRouterRuntimeOptions,\r\n type RuntimeRequest,\r\n type RuntimeResponse,\r\n type RuntimeStreamEvent\r\n} from \"@x12i/openrouter-runtime\";\r\nimport type { AiProviderAdapter, ProviderCallOptions } from \"../types/public\";\r\n\r\nexport function createOpenRouterProviderAdapter(\r\n options: OpenRouterRuntimeOptions = {}\r\n): AiProviderAdapter {\r\n const runtime: OpenRouterRuntime = createOpenRouterRuntime(options);\r\n\r\n return {\r\n run(request: RuntimeRequest, call?: ProviderCallOptions): Promise<RuntimeResponse> {\r\n return runtime.run(request, toCall(call));\r\n },\r\n executeStreamingChat(request: RuntimeRequest, call?: ProviderCallOptions): AsyncIterable<RuntimeStreamEvent> {\r\n return runtime.executeStreamingChat(request, toCall(call));\r\n },\r\n compile(request: RuntimeRequest, call?: ProviderCallOptions) {\r\n return runtime.compile(request, toCall(call));\r\n }\r\n };\r\n}\r\n\r\nfunction toCall(call?: ProviderCallOptions) {\r\n if (!call) return undefined;\r\n return {\r\n ...(call.finalizeBody ? { finalizeBody: call.finalizeBody } : {}),\r\n ...(call.extractStreamReasoning ? { extractStreamReasoning: call.extractStreamReasoning } : {}),\r\n ...(call.suppressNestedReasoningFallback ? { suppressNestedReasoningFallback: true as const } : {})\r\n };\r\n}\r\n","import type { AiProviderId, ImplementedAiProvider } from \"./types/providers\";\r\nimport { isImplementedAiProvider } from \"./types/providers\";\r\nimport { AiDispatcherError, providerNotImplemented } from \"./errors\";\r\n\r\nexport function resolveProvider(\r\n requestProvider: AiProviderId | undefined,\r\n defaultProvider: AiProviderId\r\n): ImplementedAiProvider {\r\n const provider = requestProvider ?? defaultProvider;\r\n if (!provider || typeof provider !== \"string\") {\r\n throw new AiDispatcherError(\r\n \"PROVIDER_REQUIRED\",\r\n \"An AI provider is required. Set options.provider or request.provider.\"\r\n );\r\n }\r\n if (!isImplementedAiProvider(provider)) {\r\n throw providerNotImplemented(provider);\r\n }\r\n return provider;\r\n}\r\n","import { deletePointer } from \"./json-pointer\";\r\n\r\n/**\r\n * Clone `message` and delete only the JSON pointers in `paths`.\r\n * Pointers are relative to the message. Safe to call more than once.\r\n */\r\nexport function stripReasoningHistoryFields<T>(message: T, paths: readonly string[]): T {\r\n const clone = structuredClone(message);\r\n for (const path of paths) deletePointer(clone, path);\r\n return clone;\r\n}\r\n"],"mappings":"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","names":["isRecord","reasoningDelta","hold","isRecord","isRecord","isRecord","record","hasMessages","isRecord","readEnv","hasMessages","serverToolsEnabled","isEnabledMode","packProviderRecord","DEFAULT_BASE_URL","DEFAULT_TIMEOUT_MS","isConfigError","failedResponse","assertSupported","compileInstructions","clean","buildHeaders","serverToolsEnabled","isEnabledMode","contentToText","sendWithRetries","timeoutFor","isRecord","resolveExecutor","record","toFunctionCallOutput","errorEvent","readFailure","parseSse","normalizeUsage","sendOnce","asTerminalError","delay","messageFrom","classifyStatus","answerText","modelOf","numberValue","packProviderRecord","parseSsePart","readEnv","toCall","record","isRecord"]}
|