@x12i/ai-dispatcher 1.4.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.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/providers/bedrock.ts","../src/providers/openai.ts","../src/providers/openrouter.ts","../src/resolve-provider.ts","../src/create-dispatcher.ts","../src/history.ts"],"sourcesContent":["export { createAiDispatcher } 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 AiProviderAdapter,\r\n CompiledAiRequest,\r\n CompiledOpenAiRequest,\r\n DispatcherMcpOptions,\r\n DispatcherMcpServer,\r\n DispatcherMcpTool,\r\n ReasoningEffort,\r\n ReasoningOutcome,\r\n ReasoningResolution\r\n} from \"./types/public\";\r\nexport type { OpenAiRuntimeOptions } from \"./types/openai\";\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","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 { 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 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 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 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 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 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) return event;\r\n const data = isRecord(event.data) ? { ...event.data } : {};\r\n data.reasoningResolution = prepared.resolution;\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 const paths = prepared.directive?.usage?.reasoningTokenPaths;\r\n if (!paths || paths.length === 0 || !isRecord(event.data) || !isRecord(event.data.usage)) return event;\r\n const usage = { ...(event.data.usage as RuntimeUsage) };\r\n const tokens = readReasoningTokens(usage.raw, paths);\r\n if (tokens === undefined) {\r\n delete usage.reasoningTokens;\r\n } else {\r\n usage.reasoningTokens = tokens;\r\n }\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 | \"custom\";\r\n\r\nexport const IMPLEMENTED_AI_PROVIDERS = [\"openrouter\", \"bedrock\", \"openai\"] 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} from \"@x12i/ai-profiles\";\r\nimport type { AdvisorPolicy, FusionPolicy, RuntimeMessage, RuntimeRequest, SubagentPolicy } from \"@x12i/openrouter-runtime\";\r\nimport { AiDispatcherError } from \"./errors\";\r\nimport { extractStreamReasoningText } from \"./reasoning-extract\";\r\nimport type { ImplementedAiProvider } from \"./types/providers\";\r\nimport type { AiDispatcherOptions, AiDispatcherRequest, 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 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 const provider = params.provider;\r\n const reasoningEffort = cloned.reasoningEffort;\r\n const bedrockControls = cloned.bedrockControls;\r\n delete cloned.provider;\r\n delete cloned.reasoningEffort;\r\n delete cloned.bedrockControls;\r\n\r\n if (provider === \"openai\") assertOpenAiConfigured(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 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 directive = resolveCatalog({\r\n target: provider,\r\n model: requestedModel,\r\n effort: reasoningEffort\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) cloned.model = directive.model;\r\n if (directive?.promptPrefix) applyPromptPrefix(cloned, directive.promptPrefix);\r\n\r\n const effectiveModel = cloned.model ?? requestedModel;\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 if (overlay) {\r\n const bodyOverlay = overlay;\r\n call.finalizeBody = (body) => mergeReasoningBody(body, bodyOverlay);\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 call\r\n };\r\n}\r\n\r\nfunction resolveCatalog(input: { target: ImplementedAiProvider; model: string; effort: ReasoningEffort }): ReasoningDirective {\r\n try {\r\n return resolveReasoning(input);\r\n } catch (error) {\r\n if (error instanceof AIProfilesError) {\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 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 });\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 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 return options.openai?.defaultModel;\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 {\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.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 type {\r\n RuntimeMessage,\r\n RuntimeRequest,\r\n RuntimeResponse,\r\n RuntimeStreamEvent,\r\n RuntimeLogger,\r\n RuntimeToolExecutor,\r\n RuntimeToolUsage,\r\n 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 { 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 = {}) {\r\n const resolved = resolveOpenAiOptions(options);\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\r\n return {\r\n url: `${options.baseUrl}/responses`,\r\n headers: buildHeaders(options),\r\n body,\r\n warnings: []\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 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}\r\n\r\nfunction resolveOpenAiOptions(options: OpenAiRuntimeOptions): 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 };\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 type { BedrockRuntimeOptions } from \"@x12i/bedrock-runtime\";\r\nimport type { OpenRouterRuntimeOptions, RuntimeStreamEvent, RuntimeToolExecutor } from \"@x12i/openrouter-runtime\";\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 { 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 { OpenAiRuntimeOptions } from \"./types/openai\";\r\n\r\nconst SECRET_HEADERS = new Set([\"authorization\", \"x-api-key\", \"api-key\"]);\r\n\r\nexport function createAiDispatcher(options: AiDispatcherOptions = {}): AiDispatcher {\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 ...(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 ...(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);\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 return options.openai?.tools;\r\n}\r\n\r\nfunction callOf(call: ProviderCallOptions): ProviderCallOptions | undefined {\r\n if (!call.finalizeBody && !call.extractStreamReasoning && !call.suppressNestedReasoningFallback) return undefined;\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 } 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 (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","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","hold","isRecord","isRecord","isRecord","hasMessages","serverToolsEnabled","isEnabledMode","isRecord","readEnv","toCall","isRecord"]}
@@ -0,0 +1,164 @@
1
+ import * as _x12i_openrouter_runtime from '@x12i/openrouter-runtime';
2
+ import { RuntimeToolExecutor, RuntimeLogger, RuntimeRequest, RuntimeResponse, RuntimeStreamEvent, CompiledOpenRouterRequest, OpenRouterRuntimeOptions } from '@x12i/openrouter-runtime';
3
+ export { CompiledOpenRouterRequest, OpenRouterRuntimeOptions, RuntimeDefaults, RuntimeLogger, RuntimeMessage, RuntimeRequest, RuntimeResponse, RuntimeServerToolsPolicy, RuntimeStreamEvent } from '@x12i/openrouter-runtime';
4
+ import { ReasoningEffort, ReasoningOutcome } from '@x12i/ai-profiles';
5
+ export { ReasoningEffort, ReasoningOutcome } from '@x12i/ai-profiles';
6
+ import { CompiledBedrockRequest, BedrockRuntimeOptions } from '@x12i/bedrock-runtime';
7
+ export { BedrockClientLike, BedrockCredentials, BedrockRuntimeOptions, CompiledBedrockRequest } from '@x12i/bedrock-runtime';
8
+
9
+ type AiProviderId = "openrouter" | "openai" | "anthropic" | "google" | "azure" | "bedrock" | "groq" | "mistral" | "cohere" | "together" | "fireworks" | "xai" | "deepseek" | "custom";
10
+ declare const IMPLEMENTED_AI_PROVIDERS: readonly ["openrouter", "bedrock", "openai"];
11
+ type ImplementedAiProvider = (typeof IMPLEMENTED_AI_PROVIDERS)[number];
12
+ declare function isImplementedAiProvider(provider: string): provider is ImplementedAiProvider;
13
+
14
+ interface OpenAiRuntimeOptions {
15
+ apiKey?: string;
16
+ /** Defaults to `https://api.openai.com/v1`. Requests are sent to `{baseUrl}/responses`. */
17
+ baseUrl?: string;
18
+ defaultModel?: string;
19
+ organization?: string;
20
+ project?: string;
21
+ timeoutMs?: number;
22
+ maxAttempts?: number;
23
+ fetch?: typeof globalThis.fetch;
24
+ /** Executors for function tools that do not carry their own `executor`. */
25
+ tools?: Record<string, RuntimeToolExecutor>;
26
+ logger?: RuntimeLogger;
27
+ }
28
+
29
+ /**
30
+ * Catalog resolution for one call.
31
+ * `outcome` is present only when the catalog resolver ran.
32
+ * `bypassed` is true when an explicit provider control took precedence.
33
+ */
34
+ interface ReasoningResolution {
35
+ requestedEffort?: ReasoningEffort;
36
+ target: ImplementedAiProvider;
37
+ requestedModel: string;
38
+ effectiveModel: string;
39
+ outcome?: ReasoningOutcome;
40
+ bypassed: boolean;
41
+ }
42
+ interface AiDispatcherRequest extends RuntimeRequest {
43
+ provider?: AiProviderId;
44
+ /**
45
+ * Provider-neutral reasoning intent. The bundled catalog chooses the wire action.
46
+ * An explicit provider control on the same request wins and the catalog is not called.
47
+ */
48
+ reasoningEffort?: ReasoningEffort;
49
+ /**
50
+ * Bedrock Converse escape hatch. When `additionalModelRequestFields` is set,
51
+ * it is the explicit reasoning control for Bedrock and the catalog is not applied.
52
+ */
53
+ bedrockControls?: {
54
+ additionalModelRequestFields?: Record<string, unknown>;
55
+ };
56
+ /**
57
+ * MCP tools registered at initialization.
58
+ * Omit to attach every tool. `false` or `[]` attaches none.
59
+ * A string list attaches only those exposed names.
60
+ */
61
+ mcp?: false | string[];
62
+ }
63
+ interface DispatcherMcpTool {
64
+ name: string;
65
+ description?: string;
66
+ inputSchema?: Record<string, unknown>;
67
+ }
68
+ interface DispatcherMcpServer {
69
+ id: string;
70
+ tools: DispatcherMcpTool[];
71
+ /**
72
+ * `name` is the MCP tool name, without the server id prefix.
73
+ * `context.toolName` is the exposed name sent to the model.
74
+ */
75
+ callTool: (name: string, args: Record<string, unknown>, context: Parameters<RuntimeToolExecutor>[1]) => Promise<unknown> | unknown;
76
+ /** When set, `refreshMcp()` replaces this server's tools. */
77
+ listTools?: () => Promise<DispatcherMcpTool[]>;
78
+ }
79
+ interface DispatcherMcpOptions {
80
+ servers: DispatcherMcpServer[];
81
+ }
82
+ interface AiDispatcherOptions {
83
+ /**
84
+ * Default provider for run / stream / compile.
85
+ * Implemented: `"openrouter"` | `"bedrock"` | `"openai"`.
86
+ */
87
+ provider?: AiProviderId;
88
+ openrouter?: OpenRouterRuntimeOptions;
89
+ bedrock?: BedrockRuntimeOptions;
90
+ /** Direct OpenAI Responses API. */
91
+ openai?: OpenAiRuntimeOptions;
92
+ /** Connected MCP servers. The dispatcher does not open transports. */
93
+ mcp?: DispatcherMcpOptions;
94
+ logger?: RuntimeLogger;
95
+ }
96
+ interface CompiledOpenAiRequest {
97
+ provider: "openai";
98
+ url: string;
99
+ headers: Record<string, string>;
100
+ body: Record<string, unknown>;
101
+ warnings: _x12i_openrouter_runtime.RuntimeWarning[];
102
+ requestedModel: string;
103
+ effectiveModel: string;
104
+ reasoningResolution?: ReasoningResolution;
105
+ }
106
+ type CompiledAiRequest = (CompiledOpenRouterRequest & {
107
+ provider: "openrouter";
108
+ requestedModel: string;
109
+ effectiveModel: string;
110
+ reasoningResolution?: ReasoningResolution;
111
+ }) | (CompiledBedrockRequest & {
112
+ provider: "bedrock";
113
+ requestedModel: string;
114
+ effectiveModel: string;
115
+ reasoningResolution?: ReasoningResolution;
116
+ }) | CompiledOpenAiRequest;
117
+ interface AiDispatcherResponse extends RuntimeResponse {
118
+ /** Provider-exposed reasoning text. Omitted when the provider did not return any. */
119
+ reasoningText?: string;
120
+ reasoningResolution?: ReasoningResolution;
121
+ }
122
+ interface ProviderCallOptions {
123
+ finalizeBody?: (body: Record<string, unknown>) => Record<string, unknown>;
124
+ extractStreamReasoning?: (event: unknown) => string | undefined;
125
+ suppressNestedReasoningFallback?: boolean;
126
+ }
127
+ interface AiProviderAdapter {
128
+ run(request: RuntimeRequest, call?: ProviderCallOptions): Promise<RuntimeResponse>;
129
+ executeStreamingChat(request: RuntimeRequest, call?: ProviderCallOptions): AsyncIterable<RuntimeStreamEvent>;
130
+ compile(request: RuntimeRequest, call?: ProviderCallOptions): CompiledOpenRouterRequest | CompiledBedrockRequest | CompiledOpenAiWireShape;
131
+ }
132
+ interface CompiledOpenAiWireShape {
133
+ url: string;
134
+ headers: Record<string, string>;
135
+ body: Record<string, unknown>;
136
+ warnings: _x12i_openrouter_runtime.RuntimeWarning[];
137
+ }
138
+ interface AiDispatcher {
139
+ run(request: AiDispatcherRequest): Promise<AiDispatcherResponse>;
140
+ executeStreamingChat(request: AiDispatcherRequest): AsyncIterable<RuntimeStreamEvent>;
141
+ compile(request: AiDispatcherRequest): CompiledAiRequest;
142
+ /** Relists servers that implement `listTools`. Other servers stay as registered. */
143
+ refreshMcp(): Promise<void>;
144
+ readonly provider: AiProviderId;
145
+ }
146
+
147
+ declare function createAiDispatcher(options?: AiDispatcherOptions): AiDispatcher;
148
+
149
+ declare class AiDispatcherError extends Error {
150
+ readonly code: string;
151
+ readonly details?: unknown | undefined;
152
+ constructor(code: string, message: string, details?: unknown | undefined);
153
+ }
154
+ declare function providerNotImplemented(provider: string): AiDispatcherError;
155
+
156
+ /**
157
+ * Clone `message` and delete only the JSON pointers in `paths`.
158
+ * Pointers are relative to the message. Safe to call more than once.
159
+ */
160
+ declare function stripReasoningHistoryFields<T>(message: T, paths: readonly string[]): T;
161
+
162
+ declare function resolveProvider(requestProvider: AiProviderId | undefined, defaultProvider: AiProviderId): ImplementedAiProvider;
163
+
164
+ export { type AiDispatcher, AiDispatcherError, type AiDispatcherOptions, type AiDispatcherRequest, type AiDispatcherResponse, type AiProviderAdapter, type AiProviderId, type CompiledAiRequest, type CompiledOpenAiRequest, type DispatcherMcpOptions, type DispatcherMcpServer, type DispatcherMcpTool, IMPLEMENTED_AI_PROVIDERS, type ImplementedAiProvider, type OpenAiRuntimeOptions, type ReasoningResolution, createAiDispatcher, isImplementedAiProvider, providerNotImplemented, resolveProvider, stripReasoningHistoryFields };
@@ -0,0 +1,164 @@
1
+ import * as _x12i_openrouter_runtime from '@x12i/openrouter-runtime';
2
+ import { RuntimeToolExecutor, RuntimeLogger, RuntimeRequest, RuntimeResponse, RuntimeStreamEvent, CompiledOpenRouterRequest, OpenRouterRuntimeOptions } from '@x12i/openrouter-runtime';
3
+ export { CompiledOpenRouterRequest, OpenRouterRuntimeOptions, RuntimeDefaults, RuntimeLogger, RuntimeMessage, RuntimeRequest, RuntimeResponse, RuntimeServerToolsPolicy, RuntimeStreamEvent } from '@x12i/openrouter-runtime';
4
+ import { ReasoningEffort, ReasoningOutcome } from '@x12i/ai-profiles';
5
+ export { ReasoningEffort, ReasoningOutcome } from '@x12i/ai-profiles';
6
+ import { CompiledBedrockRequest, BedrockRuntimeOptions } from '@x12i/bedrock-runtime';
7
+ export { BedrockClientLike, BedrockCredentials, BedrockRuntimeOptions, CompiledBedrockRequest } from '@x12i/bedrock-runtime';
8
+
9
+ type AiProviderId = "openrouter" | "openai" | "anthropic" | "google" | "azure" | "bedrock" | "groq" | "mistral" | "cohere" | "together" | "fireworks" | "xai" | "deepseek" | "custom";
10
+ declare const IMPLEMENTED_AI_PROVIDERS: readonly ["openrouter", "bedrock", "openai"];
11
+ type ImplementedAiProvider = (typeof IMPLEMENTED_AI_PROVIDERS)[number];
12
+ declare function isImplementedAiProvider(provider: string): provider is ImplementedAiProvider;
13
+
14
+ interface OpenAiRuntimeOptions {
15
+ apiKey?: string;
16
+ /** Defaults to `https://api.openai.com/v1`. Requests are sent to `{baseUrl}/responses`. */
17
+ baseUrl?: string;
18
+ defaultModel?: string;
19
+ organization?: string;
20
+ project?: string;
21
+ timeoutMs?: number;
22
+ maxAttempts?: number;
23
+ fetch?: typeof globalThis.fetch;
24
+ /** Executors for function tools that do not carry their own `executor`. */
25
+ tools?: Record<string, RuntimeToolExecutor>;
26
+ logger?: RuntimeLogger;
27
+ }
28
+
29
+ /**
30
+ * Catalog resolution for one call.
31
+ * `outcome` is present only when the catalog resolver ran.
32
+ * `bypassed` is true when an explicit provider control took precedence.
33
+ */
34
+ interface ReasoningResolution {
35
+ requestedEffort?: ReasoningEffort;
36
+ target: ImplementedAiProvider;
37
+ requestedModel: string;
38
+ effectiveModel: string;
39
+ outcome?: ReasoningOutcome;
40
+ bypassed: boolean;
41
+ }
42
+ interface AiDispatcherRequest extends RuntimeRequest {
43
+ provider?: AiProviderId;
44
+ /**
45
+ * Provider-neutral reasoning intent. The bundled catalog chooses the wire action.
46
+ * An explicit provider control on the same request wins and the catalog is not called.
47
+ */
48
+ reasoningEffort?: ReasoningEffort;
49
+ /**
50
+ * Bedrock Converse escape hatch. When `additionalModelRequestFields` is set,
51
+ * it is the explicit reasoning control for Bedrock and the catalog is not applied.
52
+ */
53
+ bedrockControls?: {
54
+ additionalModelRequestFields?: Record<string, unknown>;
55
+ };
56
+ /**
57
+ * MCP tools registered at initialization.
58
+ * Omit to attach every tool. `false` or `[]` attaches none.
59
+ * A string list attaches only those exposed names.
60
+ */
61
+ mcp?: false | string[];
62
+ }
63
+ interface DispatcherMcpTool {
64
+ name: string;
65
+ description?: string;
66
+ inputSchema?: Record<string, unknown>;
67
+ }
68
+ interface DispatcherMcpServer {
69
+ id: string;
70
+ tools: DispatcherMcpTool[];
71
+ /**
72
+ * `name` is the MCP tool name, without the server id prefix.
73
+ * `context.toolName` is the exposed name sent to the model.
74
+ */
75
+ callTool: (name: string, args: Record<string, unknown>, context: Parameters<RuntimeToolExecutor>[1]) => Promise<unknown> | unknown;
76
+ /** When set, `refreshMcp()` replaces this server's tools. */
77
+ listTools?: () => Promise<DispatcherMcpTool[]>;
78
+ }
79
+ interface DispatcherMcpOptions {
80
+ servers: DispatcherMcpServer[];
81
+ }
82
+ interface AiDispatcherOptions {
83
+ /**
84
+ * Default provider for run / stream / compile.
85
+ * Implemented: `"openrouter"` | `"bedrock"` | `"openai"`.
86
+ */
87
+ provider?: AiProviderId;
88
+ openrouter?: OpenRouterRuntimeOptions;
89
+ bedrock?: BedrockRuntimeOptions;
90
+ /** Direct OpenAI Responses API. */
91
+ openai?: OpenAiRuntimeOptions;
92
+ /** Connected MCP servers. The dispatcher does not open transports. */
93
+ mcp?: DispatcherMcpOptions;
94
+ logger?: RuntimeLogger;
95
+ }
96
+ interface CompiledOpenAiRequest {
97
+ provider: "openai";
98
+ url: string;
99
+ headers: Record<string, string>;
100
+ body: Record<string, unknown>;
101
+ warnings: _x12i_openrouter_runtime.RuntimeWarning[];
102
+ requestedModel: string;
103
+ effectiveModel: string;
104
+ reasoningResolution?: ReasoningResolution;
105
+ }
106
+ type CompiledAiRequest = (CompiledOpenRouterRequest & {
107
+ provider: "openrouter";
108
+ requestedModel: string;
109
+ effectiveModel: string;
110
+ reasoningResolution?: ReasoningResolution;
111
+ }) | (CompiledBedrockRequest & {
112
+ provider: "bedrock";
113
+ requestedModel: string;
114
+ effectiveModel: string;
115
+ reasoningResolution?: ReasoningResolution;
116
+ }) | CompiledOpenAiRequest;
117
+ interface AiDispatcherResponse extends RuntimeResponse {
118
+ /** Provider-exposed reasoning text. Omitted when the provider did not return any. */
119
+ reasoningText?: string;
120
+ reasoningResolution?: ReasoningResolution;
121
+ }
122
+ interface ProviderCallOptions {
123
+ finalizeBody?: (body: Record<string, unknown>) => Record<string, unknown>;
124
+ extractStreamReasoning?: (event: unknown) => string | undefined;
125
+ suppressNestedReasoningFallback?: boolean;
126
+ }
127
+ interface AiProviderAdapter {
128
+ run(request: RuntimeRequest, call?: ProviderCallOptions): Promise<RuntimeResponse>;
129
+ executeStreamingChat(request: RuntimeRequest, call?: ProviderCallOptions): AsyncIterable<RuntimeStreamEvent>;
130
+ compile(request: RuntimeRequest, call?: ProviderCallOptions): CompiledOpenRouterRequest | CompiledBedrockRequest | CompiledOpenAiWireShape;
131
+ }
132
+ interface CompiledOpenAiWireShape {
133
+ url: string;
134
+ headers: Record<string, string>;
135
+ body: Record<string, unknown>;
136
+ warnings: _x12i_openrouter_runtime.RuntimeWarning[];
137
+ }
138
+ interface AiDispatcher {
139
+ run(request: AiDispatcherRequest): Promise<AiDispatcherResponse>;
140
+ executeStreamingChat(request: AiDispatcherRequest): AsyncIterable<RuntimeStreamEvent>;
141
+ compile(request: AiDispatcherRequest): CompiledAiRequest;
142
+ /** Relists servers that implement `listTools`. Other servers stay as registered. */
143
+ refreshMcp(): Promise<void>;
144
+ readonly provider: AiProviderId;
145
+ }
146
+
147
+ declare function createAiDispatcher(options?: AiDispatcherOptions): AiDispatcher;
148
+
149
+ declare class AiDispatcherError extends Error {
150
+ readonly code: string;
151
+ readonly details?: unknown | undefined;
152
+ constructor(code: string, message: string, details?: unknown | undefined);
153
+ }
154
+ declare function providerNotImplemented(provider: string): AiDispatcherError;
155
+
156
+ /**
157
+ * Clone `message` and delete only the JSON pointers in `paths`.
158
+ * Pointers are relative to the message. Safe to call more than once.
159
+ */
160
+ declare function stripReasoningHistoryFields<T>(message: T, paths: readonly string[]): T;
161
+
162
+ declare function resolveProvider(requestProvider: AiProviderId | undefined, defaultProvider: AiProviderId): ImplementedAiProvider;
163
+
164
+ export { type AiDispatcher, AiDispatcherError, type AiDispatcherOptions, type AiDispatcherRequest, type AiDispatcherResponse, type AiProviderAdapter, type AiProviderId, type CompiledAiRequest, type CompiledOpenAiRequest, type DispatcherMcpOptions, type DispatcherMcpServer, type DispatcherMcpTool, IMPLEMENTED_AI_PROVIDERS, type ImplementedAiProvider, type OpenAiRuntimeOptions, type ReasoningResolution, createAiDispatcher, isImplementedAiProvider, providerNotImplemented, resolveProvider, stripReasoningHistoryFields };