@openrouter/ai-sdk-provider 1.5.3 → 6.0.0-alpha.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/ai-sdk-error.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/api-call-error.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/empty-response-body-error.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/get-error-message.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/invalid-argument-error.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/invalid-prompt-error.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/invalid-response-data-error.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/json-parse-error.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/load-api-key-error.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/load-setting-error.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/no-content-generated-error.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/no-such-model-error.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/too-many-embedding-values-for-call-error.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/type-validation-error.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/errors/unsupported-functionality-error.ts","../node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/src/json-value/is-json.ts","../node_modules/.pnpm/eventsource-parser@3.0.3/node_modules/eventsource-parser/src/errors.ts","../node_modules/.pnpm/eventsource-parser@3.0.3/node_modules/eventsource-parser/src/parse.ts","../node_modules/.pnpm/eventsource-parser@3.0.3/node_modules/eventsource-parser/src/stream.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/combine-headers.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/convert-async-iterator-to-readable-stream.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/delay.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/extract-response-headers.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/generate-id.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/get-error-message.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/get-from-api.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/handle-fetch-error.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/is-abort-error.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/remove-undefined-entries.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/is-url-supported.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/load-api-key.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/load-optional-setting.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/load-setting.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/parse-json.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/secure-json-parse.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/validate-types.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/validator.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/parse-json-event-stream.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/parse-provider-options.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/post-to-api.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/types/tool.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/provider-defined-tool-factory.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/resolve.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/response-handler.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/zod-schema.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/schema.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/uint8-utils.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/without-trailing-slash.ts","../node_modules/.pnpm/@ai-sdk+provider-utils@3.0.1_zod@3.25.76/node_modules/@ai-sdk/provider-utils/src/index.ts","../node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/Options.js","../node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/selectParser.js","../node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/array.js","../node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/record.js","../node_modules/.pnpm/zod-to-json-schema@3.24.6_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/string.js","../src/schemas/reasoning-details.ts","../src/utils/type-guards.ts","../src/schemas/format.ts","../src/schemas/error-response.ts","../src/schemas/provider-metadata.ts","../src/utils/map-finish-reason.ts","../src/types/openrouter-chat-completions-input.ts","../src/chat/is-url.ts","../src/chat/file-url-utils.ts","../src/chat/convert-to-openrouter-chat-messages.ts","../src/chat/get-tool-choice.ts","../src/chat/schemas.ts","../src/schemas/image.ts","../src/chat/index.ts","../src/completion/convert-to-openrouter-completion-prompt.ts","../src/completion/schemas.ts","../src/completion/index.ts","../src/embedding/schemas.ts","../src/embedding/index.ts","../src/facade.ts","../src/utils/remove-undefined.ts","../src/utils/with-user-agent-suffix.ts","../src/version.ts","../src/provider.ts","../src/toon/index.ts"],"sourcesContent":["export * from './facade';\nexport * from './provider';\nexport * from './toon';\nexport * from './types';\n","/**\n * Symbol used for identifying AI SDK Error instances.\n * Enables checking if an error is an instance of AISDKError across package versions.\n */\nconst marker = 'vercel.ai.error';\nconst symbol = Symbol.for(marker);\n\n/**\n * Custom error class for AI SDK related errors.\n * @extends Error\n */\nexport class AISDKError extends Error {\n private readonly [symbol] = true; // used in isInstance\n\n /**\n * The underlying cause of the error, if any.\n */\n readonly cause?: unknown;\n\n /**\n * Creates an AI SDK Error.\n *\n * @param {Object} params - The parameters for creating the error.\n * @param {string} params.name - The name of the error.\n * @param {string} params.message - The error message.\n * @param {unknown} [params.cause] - The underlying cause of the error.\n */\n constructor({\n name,\n message,\n cause,\n }: {\n name: string;\n message: string;\n cause?: unknown;\n }) {\n super(message);\n\n this.name = name;\n this.cause = cause;\n }\n\n /**\n * Checks if the given error is an AI SDK Error.\n * @param {unknown} error - The error to check.\n * @returns {boolean} True if the error is an AI SDK Error, false otherwise.\n */\n static isInstance(error: unknown): error is AISDKError {\n return AISDKError.hasMarker(error, marker);\n }\n\n protected static hasMarker(error: unknown, marker: string): boolean {\n const markerSymbol = Symbol.for(marker);\n return (\n error != null &&\n typeof error === 'object' &&\n markerSymbol in error &&\n typeof error[markerSymbol] === 'boolean' &&\n error[markerSymbol] === true\n );\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_APICallError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class APICallError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly url: string;\n readonly requestBodyValues: unknown;\n readonly statusCode?: number;\n\n readonly responseHeaders?: Record<string, string>;\n readonly responseBody?: string;\n\n readonly isRetryable: boolean;\n readonly data?: unknown;\n\n constructor({\n message,\n url,\n requestBodyValues,\n statusCode,\n responseHeaders,\n responseBody,\n cause,\n isRetryable = statusCode != null &&\n (statusCode === 408 || // request timeout\n statusCode === 409 || // conflict\n statusCode === 429 || // too many requests\n statusCode >= 500), // server error\n data,\n }: {\n message: string;\n url: string;\n requestBodyValues: unknown;\n statusCode?: number;\n responseHeaders?: Record<string, string>;\n responseBody?: string;\n cause?: unknown;\n isRetryable?: boolean;\n data?: unknown;\n }) {\n super({ name, message, cause });\n\n this.url = url;\n this.requestBodyValues = requestBodyValues;\n this.statusCode = statusCode;\n this.responseHeaders = responseHeaders;\n this.responseBody = responseBody;\n this.isRetryable = isRetryable;\n this.data = data;\n }\n\n static isInstance(error: unknown): error is APICallError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_EmptyResponseBodyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class EmptyResponseBodyError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message = 'Empty response body' }: { message?: string } = {}) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is EmptyResponseBodyError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","export function getErrorMessage(error: unknown | undefined) {\n if (error == null) {\n return 'unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return JSON.stringify(error);\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidArgumentError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * A function argument is invalid.\n */\nexport class InvalidArgumentError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly argument: string;\n\n constructor({\n message,\n cause,\n argument,\n }: {\n argument: string;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n\n this.argument = argument;\n }\n\n static isInstance(error: unknown): error is InvalidArgumentError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidPromptError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * A prompt is invalid. This error should be thrown by providers when they cannot\n * process a prompt.\n */\nexport class InvalidPromptError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly prompt: unknown;\n\n constructor({\n prompt,\n message,\n cause,\n }: {\n prompt: unknown;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message: `Invalid prompt: ${message}`, cause });\n\n this.prompt = prompt;\n }\n\n static isInstance(error: unknown): error is InvalidPromptError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidResponseDataError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Server returned a response with invalid data content.\n * This should be thrown by providers when they cannot parse the response from the API.\n */\nexport class InvalidResponseDataError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly data: unknown;\n\n constructor({\n data,\n message = `Invalid response data: ${JSON.stringify(data)}.`,\n }: {\n data: unknown;\n message?: string;\n }) {\n super({ name, message });\n\n this.data = data;\n }\n\n static isInstance(error: unknown): error is InvalidResponseDataError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_JSONParseError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n// TODO v5: rename to ParseError\nexport class JSONParseError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly text: string;\n\n constructor({ text, cause }: { text: string; cause: unknown }) {\n super({\n name,\n message:\n `JSON parsing failed: ` +\n `Text: ${text}.\\n` +\n `Error message: ${getErrorMessage(cause)}`,\n cause,\n });\n\n this.text = text;\n }\n\n static isInstance(error: unknown): error is JSONParseError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadAPIKeyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadAPIKeyError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message }: { message: string }) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is LoadAPIKeyError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadSettingError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadSettingError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message }: { message: string }) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is LoadSettingError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_NoContentGeneratedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\nThrown when the AI provider fails to generate any content.\n */\nexport class NoContentGeneratedError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({\n message = 'No content generated.',\n }: { message?: string } = {}) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is NoContentGeneratedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_NoSuchModelError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class NoSuchModelError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly modelId: string;\n readonly modelType:\n | 'languageModel'\n | 'textEmbeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel';\n\n constructor({\n errorName = name,\n modelId,\n modelType,\n message = `No such ${modelType}: ${modelId}`,\n }: {\n errorName?: string;\n modelId: string;\n modelType:\n | 'languageModel'\n | 'textEmbeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel';\n message?: string;\n }) {\n super({ name: errorName, message });\n\n this.modelId = modelId;\n this.modelType = modelType;\n }\n\n static isInstance(error: unknown): error is NoSuchModelError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_TooManyEmbeddingValuesForCallError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class TooManyEmbeddingValuesForCallError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly provider: string;\n readonly modelId: string;\n readonly maxEmbeddingsPerCall: number;\n readonly values: Array<unknown>;\n\n constructor(options: {\n provider: string;\n modelId: string;\n maxEmbeddingsPerCall: number;\n values: Array<unknown>;\n }) {\n super({\n name,\n message:\n `Too many values for a single embedding call. ` +\n `The ${options.provider} model \"${options.modelId}\" can only embed up to ` +\n `${options.maxEmbeddingsPerCall} values per call, but ${options.values.length} values were provided.`,\n });\n\n this.provider = options.provider;\n this.modelId = options.modelId;\n this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall;\n this.values = options.values;\n }\n\n static isInstance(\n error: unknown,\n ): error is TooManyEmbeddingValuesForCallError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_TypeValidationError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class TypeValidationError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly value: unknown;\n\n constructor({ value, cause }: { value: unknown; cause: unknown }) {\n super({\n name,\n message:\n `Type validation failed: ` +\n `Value: ${JSON.stringify(value)}.\\n` +\n `Error message: ${getErrorMessage(cause)}`,\n cause,\n });\n\n this.value = value;\n }\n\n static isInstance(error: unknown): error is TypeValidationError {\n return AISDKError.hasMarker(error, marker);\n }\n\n /**\n * Wraps an error into a TypeValidationError.\n * If the cause is already a TypeValidationError with the same value, it returns the cause.\n * Otherwise, it creates a new TypeValidationError.\n *\n * @param {Object} params - The parameters for wrapping the error.\n * @param {unknown} params.value - The value that failed validation.\n * @param {unknown} params.cause - The original error or cause of the validation failure.\n * @returns {TypeValidationError} A TypeValidationError instance.\n */\n static wrap({\n value,\n cause,\n }: {\n value: unknown;\n cause: unknown;\n }): TypeValidationError {\n return TypeValidationError.isInstance(cause) && cause.value === value\n ? cause\n : new TypeValidationError({ value, cause });\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_UnsupportedFunctionalityError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class UnsupportedFunctionalityError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly functionality: string;\n\n constructor({\n functionality,\n message = `'${functionality}' functionality not supported.`,\n }: {\n functionality: string;\n message?: string;\n }) {\n super({ name, message });\n this.functionality = functionality;\n }\n\n static isInstance(error: unknown): error is UnsupportedFunctionalityError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { JSONArray, JSONObject, JSONValue } from './json-value';\n\nexport function isJSONValue(value: unknown): value is JSONValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.every(isJSONValue);\n }\n\n if (typeof value === 'object') {\n return Object.entries(value).every(\n ([key, val]) => typeof key === 'string' && isJSONValue(val),\n );\n }\n\n return false;\n}\n\nexport function isJSONArray(value: unknown): value is JSONArray {\n return Array.isArray(value) && value.every(isJSONValue);\n}\n\nexport function isJSONObject(value: unknown): value is JSONObject {\n return (\n value != null &&\n typeof value === 'object' &&\n Object.entries(value).every(\n ([key, val]) => typeof key === 'string' && isJSONValue(val),\n )\n );\n}\n","/**\n * The type of error that occurred.\n * @public\n */\nexport type ErrorType = 'invalid-retry' | 'unknown-field'\n\n/**\n * Error thrown when encountering an issue during parsing.\n *\n * @public\n */\nexport class ParseError extends Error {\n /**\n * The type of error that occurred.\n */\n type: ErrorType\n\n /**\n * In the case of an unknown field encountered in the stream, this will be the field name.\n */\n field?: string\n\n /**\n * In the case of an unknown field encountered in the stream, this will be the value of the field.\n */\n value?: string\n\n /**\n * The line that caused the error, if available.\n */\n line?: string\n\n constructor(\n message: string,\n options: {type: ErrorType; field?: string; value?: string; line?: string},\n ) {\n super(message)\n this.name = 'ParseError'\n this.type = options.type\n this.field = options.field\n this.value = options.value\n this.line = options.line\n }\n}\n","/**\n * EventSource/Server-Sent Events parser\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html\n */\nimport {ParseError} from './errors.ts'\nimport type {EventSourceParser, ParserCallbacks} from './types.ts'\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction noop(_arg: unknown) {\n // intentional noop\n}\n\n/**\n * Creates a new EventSource parser.\n *\n * @param callbacks - Callbacks to invoke on different parsing events:\n * - `onEvent` when a new event is parsed\n * - `onError` when an error occurs\n * - `onRetry` when a new reconnection interval has been sent from the server\n * - `onComment` when a comment is encountered in the stream\n *\n * @returns A new EventSource parser, with `parse` and `reset` methods.\n * @public\n */\nexport function createParser(callbacks: ParserCallbacks): EventSourceParser {\n if (typeof callbacks === 'function') {\n throw new TypeError(\n '`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?',\n )\n }\n\n const {onEvent = noop, onError = noop, onRetry = noop, onComment} = callbacks\n\n let incompleteLine = ''\n\n let isFirstChunk = true\n let id: string | undefined\n let data = ''\n let eventType = ''\n\n function feed(newChunk: string) {\n // Strip any UTF8 byte order mark (BOM) at the start of the stream\n const chunk = isFirstChunk ? newChunk.replace(/^\\xEF\\xBB\\xBF/, '') : newChunk\n\n // If there was a previous incomplete line, append it to the new chunk,\n // so we may process it together as a new (hopefully complete) chunk.\n const [complete, incomplete] = splitLines(`${incompleteLine}${chunk}`)\n\n for (const line of complete) {\n parseLine(line)\n }\n\n incompleteLine = incomplete\n isFirstChunk = false\n }\n\n function parseLine(line: string) {\n // If the line is empty (a blank line), dispatch the event\n if (line === '') {\n dispatchEvent()\n return\n }\n\n // If the line starts with a U+003A COLON character (:), ignore the line.\n if (line.startsWith(':')) {\n if (onComment) {\n onComment(line.slice(line.startsWith(': ') ? 2 : 1))\n }\n return\n }\n\n // If the line contains a U+003A COLON character (:)\n const fieldSeparatorIndex = line.indexOf(':')\n if (fieldSeparatorIndex !== -1) {\n // Collect the characters on the line before the first U+003A COLON character (:),\n // and let `field` be that string.\n const field = line.slice(0, fieldSeparatorIndex)\n\n // Collect the characters on the line after the first U+003A COLON character (:),\n // and let `value` be that string. If value starts with a U+0020 SPACE character,\n // remove it from value.\n const offset = line[fieldSeparatorIndex + 1] === ' ' ? 2 : 1\n const value = line.slice(fieldSeparatorIndex + offset)\n\n processField(field, value, line)\n return\n }\n\n // Otherwise, the string is not empty but does not contain a U+003A COLON character (:)\n // Process the field using the whole line as the field name, and an empty string as the field value.\n // 👆 This is according to spec. That means that a line that has the value `data` will result in\n // a newline being added to the current `data` buffer, for instance.\n processField(line, '', line)\n }\n\n function processField(field: string, value: string, line: string) {\n // Field names must be compared literally, with no case folding performed.\n switch (field) {\n case 'event':\n // Set the `event type` buffer to field value\n eventType = value\n break\n case 'data':\n // Append the field value to the `data` buffer, then append a single U+000A LINE FEED(LF)\n // character to the `data` buffer.\n data = `${data}${value}\\n`\n break\n case 'id':\n // If the field value does not contain U+0000 NULL, then set the `ID` buffer to\n // the field value. Otherwise, ignore the field.\n id = value.includes('\\0') ? undefined : value\n break\n case 'retry':\n // If the field value consists of only ASCII digits, then interpret the field value as an\n // integer in base ten, and set the event stream's reconnection time to that integer.\n // Otherwise, ignore the field.\n if (/^\\d+$/.test(value)) {\n onRetry(parseInt(value, 10))\n } else {\n onError(\n new ParseError(`Invalid \\`retry\\` value: \"${value}\"`, {\n type: 'invalid-retry',\n value,\n line,\n }),\n )\n }\n break\n default:\n // Otherwise, the field is ignored.\n onError(\n new ParseError(\n `Unknown field \"${field.length > 20 ? `${field.slice(0, 20)}…` : field}\"`,\n {type: 'unknown-field', field, value, line},\n ),\n )\n break\n }\n }\n\n function dispatchEvent() {\n const shouldDispatch = data.length > 0\n if (shouldDispatch) {\n onEvent({\n id,\n event: eventType || undefined,\n // If the data buffer's last character is a U+000A LINE FEED (LF) character,\n // then remove the last character from the data buffer.\n data: data.endsWith('\\n') ? data.slice(0, -1) : data,\n })\n }\n\n // Reset for the next event\n id = undefined\n data = ''\n eventType = ''\n }\n\n function reset(options: {consume?: boolean} = {}) {\n if (incompleteLine && options.consume) {\n parseLine(incompleteLine)\n }\n\n isFirstChunk = true\n id = undefined\n data = ''\n eventType = ''\n incompleteLine = ''\n }\n\n return {feed, reset}\n}\n\n/**\n * For the given `chunk`, split it into lines according to spec, and return any remaining incomplete line.\n *\n * @param chunk - The chunk to split into lines\n * @returns A tuple containing an array of complete lines, and any remaining incomplete line\n * @internal\n */\nfunction splitLines(chunk: string): [complete: Array<string>, incomplete: string] {\n /**\n * According to the spec, a line is terminated by either:\n * - U+000D CARRIAGE RETURN U+000A LINE FEED (CRLF) character pair\n * - a single U+000A LINE FEED(LF) character not preceded by a U+000D CARRIAGE RETURN(CR) character\n * - a single U+000D CARRIAGE RETURN(CR) character not followed by a U+000A LINE FEED(LF) character\n */\n const lines: Array<string> = []\n let incompleteLine = ''\n let searchIndex = 0\n\n while (searchIndex < chunk.length) {\n // Find next line terminator\n const crIndex = chunk.indexOf('\\r', searchIndex)\n const lfIndex = chunk.indexOf('\\n', searchIndex)\n\n // Determine line end\n let lineEnd = -1\n if (crIndex !== -1 && lfIndex !== -1) {\n // CRLF case\n lineEnd = Math.min(crIndex, lfIndex)\n } else if (crIndex !== -1) {\n lineEnd = crIndex\n } else if (lfIndex !== -1) {\n lineEnd = lfIndex\n }\n\n // Extract line if terminator found\n if (lineEnd === -1) {\n // No terminator found, rest is incomplete\n incompleteLine = chunk.slice(searchIndex)\n break\n } else {\n const line = chunk.slice(searchIndex, lineEnd)\n lines.push(line)\n\n // Move past line terminator\n searchIndex = lineEnd + 1\n if (chunk[searchIndex - 1] === '\\r' && chunk[searchIndex] === '\\n') {\n searchIndex++\n }\n }\n }\n\n return [lines, incompleteLine]\n}\n","import {createParser} from './parse.ts'\nimport type {EventSourceMessage, EventSourceParser} from './types.ts'\n\n/**\n * Options for the EventSourceParserStream.\n *\n * @public\n */\nexport interface StreamOptions {\n /**\n * Behavior when a parsing error occurs.\n *\n * - A custom function can be provided to handle the error.\n * - `'terminate'` will error the stream and stop parsing.\n * - Any other value will ignore the error and continue parsing.\n *\n * @defaultValue `undefined`\n */\n onError?: 'terminate' | ((error: Error) => void)\n\n /**\n * Callback for when a reconnection interval is sent from the server.\n *\n * @param retry - The number of milliseconds to wait before reconnecting.\n */\n onRetry?: (retry: number) => void\n\n /**\n * Callback for when a comment is encountered in the stream.\n *\n * @param comment - The comment encountered in the stream.\n */\n onComment?: (comment: string) => void\n}\n\n/**\n * A TransformStream that ingests a stream of strings and produces a stream of `EventSourceMessage`.\n *\n * @example Basic usage\n * ```\n * const eventStream =\n * response.body\n * .pipeThrough(new TextDecoderStream())\n * .pipeThrough(new EventSourceParserStream())\n * ```\n *\n * @example Terminate stream on parsing errors\n * ```\n * const eventStream =\n * response.body\n * .pipeThrough(new TextDecoderStream())\n * .pipeThrough(new EventSourceParserStream({terminateOnError: true}))\n * ```\n *\n * @public\n */\nexport class EventSourceParserStream extends TransformStream<string, EventSourceMessage> {\n constructor({onError, onRetry, onComment}: StreamOptions = {}) {\n let parser!: EventSourceParser\n\n super({\n start(controller) {\n parser = createParser({\n onEvent: (event) => {\n controller.enqueue(event)\n },\n onError(error) {\n if (onError === 'terminate') {\n controller.error(error)\n } else if (typeof onError === 'function') {\n onError(error)\n }\n\n // Ignore by default\n },\n onRetry,\n onComment,\n })\n },\n transform(chunk) {\n parser.feed(chunk)\n },\n })\n }\n}\n\nexport {type ErrorType, ParseError} from './errors.ts'\nexport type {EventSourceMessage} from './types.ts'\n","export function combineHeaders(\n ...headers: Array<Record<string, string | undefined> | undefined>\n): Record<string, string | undefined> {\n return headers.reduce(\n (combinedHeaders, currentHeaders) => ({\n ...combinedHeaders,\n ...(currentHeaders ?? {}),\n }),\n {},\n ) as Record<string, string | undefined>;\n}\n","/**\n * Converts an AsyncIterator to a ReadableStream.\n *\n * @template T - The type of elements produced by the AsyncIterator.\n * @param { <T>} iterator - The AsyncIterator to convert.\n * @returns {ReadableStream<T>} - A ReadableStream that provides the same data as the AsyncIterator.\n */\nexport function convertAsyncIteratorToReadableStream<T>(\n iterator: AsyncIterator<T>,\n): ReadableStream<T> {\n return new ReadableStream<T>({\n /**\n * Called when the consumer wants to pull more data from the stream.\n *\n * @param {ReadableStreamDefaultController<T>} controller - The controller to enqueue data into the stream.\n * @returns {Promise<void>}\n */\n async pull(controller) {\n try {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n } catch (error) {\n controller.error(error);\n }\n },\n /**\n * Called when the consumer cancels the stream.\n */\n cancel() {},\n });\n}\n","/**\n * Creates a Promise that resolves after a specified delay\n * @param delayInMs - The delay duration in milliseconds. If null or undefined, resolves immediately.\n * @param signal - Optional AbortSignal to cancel the delay\n * @returns A Promise that resolves after the specified delay\n * @throws {DOMException} When the signal is aborted\n */\nexport async function delay(\n delayInMs?: number | null,\n options?: {\n abortSignal?: AbortSignal;\n },\n): Promise<void> {\n if (delayInMs == null) {\n return Promise.resolve();\n }\n\n const signal = options?.abortSignal;\n\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(createAbortError());\n return;\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, delayInMs);\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n signal?.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n cleanup();\n reject(createAbortError());\n };\n\n signal?.addEventListener('abort', onAbort);\n });\n}\n\nfunction createAbortError(): DOMException {\n return new DOMException('Delay was aborted', 'AbortError');\n}\n","/**\nExtracts the headers from a response object and returns them as a key-value object.\n\n@param response - The response object to extract headers from.\n@returns The headers as a key-value object.\n*/\nexport function extractResponseHeaders(response: Response) {\n return Object.fromEntries<string>([...response.headers]);\n}\n","import { InvalidArgumentError } from '@ai-sdk/provider';\n\n/**\nCreates an ID generator.\nThe total length of the ID is the sum of the prefix, separator, and random part length.\nNot cryptographically secure.\n\n@param alphabet - The alphabet to use for the ID. Default: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.\n@param prefix - The prefix of the ID to generate. Optional.\n@param separator - The separator between the prefix and the random part of the ID. Default: '-'.\n@param size - The size of the random part of the ID to generate. Default: 16.\n */\nexport const createIdGenerator = ({\n prefix,\n size = 16,\n alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n separator = '-',\n}: {\n prefix?: string;\n separator?: string;\n size?: number;\n alphabet?: string;\n} = {}): IdGenerator => {\n const generator = () => {\n const alphabetLength = alphabet.length;\n const chars = new Array(size);\n for (let i = 0; i < size; i++) {\n chars[i] = alphabet[(Math.random() * alphabetLength) | 0];\n }\n return chars.join('');\n };\n\n if (prefix == null) {\n return generator;\n }\n\n // check that the prefix is not part of the alphabet (otherwise prefix checking can fail randomly)\n if (alphabet.includes(separator)) {\n throw new InvalidArgumentError({\n argument: 'separator',\n message: `The separator \"${separator}\" must not be part of the alphabet \"${alphabet}\".`,\n });\n }\n\n return () => `${prefix}${separator}${generator()}`;\n};\n\n/**\nA function that generates an ID.\n */\nexport type IdGenerator = () => string;\n\n/**\nGenerates a 16-character random string to use for IDs.\nNot cryptographically secure.\n */\nexport const generateId = createIdGenerator();\n","export function getErrorMessage(error: unknown | undefined) {\n if (error == null) {\n return 'unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return JSON.stringify(error);\n}\n","import { APICallError } from '@ai-sdk/provider';\nimport { extractResponseHeaders } from './extract-response-headers';\nimport { FetchFunction } from './fetch-function';\nimport { handleFetchError } from './handle-fetch-error';\nimport { isAbortError } from './is-abort-error';\nimport { removeUndefinedEntries } from './remove-undefined-entries';\nimport { ResponseHandler } from './response-handler';\n\n// use function to allow for mocking in tests:\nconst getOriginalFetch = () => globalThis.fetch;\n\nexport const getFromApi = async <T>({\n url,\n headers = {},\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch = getOriginalFetch(),\n}: {\n url: string;\n headers?: Record<string, string | undefined>;\n failedResponseHandler: ResponseHandler<Error>;\n successfulResponseHandler: ResponseHandler<T>;\n abortSignal?: AbortSignal;\n fetch?: FetchFunction;\n}) => {\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: removeUndefinedEntries(headers),\n signal: abortSignal,\n });\n\n const responseHeaders = extractResponseHeaders(response);\n\n if (!response.ok) {\n let errorInformation: {\n value: Error;\n responseHeaders?: Record<string, string> | undefined;\n };\n\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: {},\n });\n } catch (error) {\n if (isAbortError(error) || APICallError.isInstance(error)) {\n throw error;\n }\n\n throw new APICallError({\n message: 'Failed to process error response',\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {},\n });\n }\n\n throw errorInformation.value;\n }\n\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: {},\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || APICallError.isInstance(error)) {\n throw error;\n }\n }\n\n throw new APICallError({\n message: 'Failed to process successful response',\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {},\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: {} });\n }\n};\n","import { APICallError } from '@ai-sdk/provider';\nimport { isAbortError } from './is-abort-error';\n\nconst FETCH_FAILED_ERROR_MESSAGES = ['fetch failed', 'failed to fetch'];\n\nexport function handleFetchError({\n error,\n url,\n requestBodyValues,\n}: {\n error: unknown;\n url: string;\n requestBodyValues: unknown;\n}) {\n if (isAbortError(error)) {\n return error;\n }\n\n // unwrap original error when fetch failed (for easier debugging):\n if (\n error instanceof TypeError &&\n FETCH_FAILED_ERROR_MESSAGES.includes(error.message.toLowerCase())\n ) {\n const cause = (error as any).cause;\n\n if (cause != null) {\n // Failed to connect to server:\n return new APICallError({\n message: `Cannot connect to API: ${cause.message}`,\n cause,\n url,\n requestBodyValues,\n isRetryable: true, // retry when network error\n });\n }\n }\n\n return error;\n}\n","export function isAbortError(error: unknown): error is Error {\n return (\n (error instanceof Error || error instanceof DOMException) &&\n (error.name === 'AbortError' ||\n error.name === 'ResponseAborted' || // Next.js\n error.name === 'TimeoutError')\n );\n}\n","/**\n * Removes entries from a record where the value is null or undefined.\n * @param record - The input object whose entries may be null or undefined.\n * @returns A new object containing only entries with non-null and non-undefined values.\n */\nexport function removeUndefinedEntries<T>(\n record: Record<string, T | undefined>,\n): Record<string, T> {\n return Object.fromEntries(\n Object.entries(record).filter(([_key, value]) => value != null),\n ) as Record<string, T>;\n}\n","/**\n * Checks if the given URL is supported natively by the model.\n *\n * @param mediaType - The media type of the URL. Case-sensitive.\n * @param url - The URL to check.\n * @param supportedUrls - A record where keys are case-sensitive media types (or '*')\n * and values are arrays of RegExp patterns for URLs.\n *\n * @returns `true` if the URL matches a pattern under the specific media type\n * or the wildcard '*', `false` otherwise.\n */\nexport function isUrlSupported({\n mediaType,\n url,\n supportedUrls,\n}: {\n mediaType: string;\n url: string;\n supportedUrls: Record<string, RegExp[]>;\n}): boolean {\n // standardize media type and url to lower case\n url = url.toLowerCase();\n mediaType = mediaType.toLowerCase();\n\n return (\n Object.entries(supportedUrls)\n // standardize supported url map into lowercase prefixes:\n .map(([key, value]) => {\n const mediaType = key.toLowerCase();\n return mediaType === '*' || mediaType === '*/*'\n ? { mediaTypePrefix: '', regexes: value }\n : { mediaTypePrefix: mediaType.replace(/\\*/, ''), regexes: value };\n })\n // gather all regexp pattern from matched media type prefixes:\n .filter(({ mediaTypePrefix }) => mediaType.startsWith(mediaTypePrefix))\n .flatMap(({ regexes }) => regexes)\n // check if any pattern matches the url:\n .some(pattern => pattern.test(url))\n );\n}\n","import { LoadAPIKeyError } from '@ai-sdk/provider';\n\nexport function loadApiKey({\n apiKey,\n environmentVariableName,\n apiKeyParameterName = 'apiKey',\n description,\n}: {\n apiKey: string | undefined;\n environmentVariableName: string;\n apiKeyParameterName?: string;\n description: string;\n}): string {\n if (typeof apiKey === 'string') {\n return apiKey;\n }\n\n if (apiKey != null) {\n throw new LoadAPIKeyError({\n message: `${description} API key must be a string.`,\n });\n }\n\n if (typeof process === 'undefined') {\n throw new LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter. Environment variables is not supported in this environment.`,\n });\n }\n\n apiKey = process.env[environmentVariableName];\n\n if (apiKey == null) {\n throw new LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter or the ${environmentVariableName} environment variable.`,\n });\n }\n\n if (typeof apiKey !== 'string') {\n throw new LoadAPIKeyError({\n message: `${description} API key must be a string. The value of the ${environmentVariableName} environment variable is not a string.`,\n });\n }\n\n return apiKey;\n}\n","/**\n * Loads an optional `string` setting from the environment or a parameter.\n *\n * @param settingValue - The setting value.\n * @param environmentVariableName - The environment variable name.\n * @returns The setting value.\n */\nexport function loadOptionalSetting({\n settingValue,\n environmentVariableName,\n}: {\n settingValue: string | undefined;\n environmentVariableName: string;\n}): string | undefined {\n if (typeof settingValue === 'string') {\n return settingValue;\n }\n\n if (settingValue != null || typeof process === 'undefined') {\n return undefined;\n }\n\n settingValue = process.env[environmentVariableName];\n\n if (settingValue == null || typeof settingValue !== 'string') {\n return undefined;\n }\n\n return settingValue;\n}\n","import { LoadSettingError } from '@ai-sdk/provider';\n\n/**\n * Loads a `string` setting from the environment or a parameter.\n *\n * @param settingValue - The setting value.\n * @param environmentVariableName - The environment variable name.\n * @param settingName - The setting name.\n * @param description - The description of the setting.\n * @returns The setting value.\n */\nexport function loadSetting({\n settingValue,\n environmentVariableName,\n settingName,\n description,\n}: {\n settingValue: string | undefined;\n environmentVariableName: string;\n settingName: string;\n description: string;\n}): string {\n if (typeof settingValue === 'string') {\n return settingValue;\n }\n\n if (settingValue != null) {\n throw new LoadSettingError({\n message: `${description} setting must be a string.`,\n });\n }\n\n if (typeof process === 'undefined') {\n throw new LoadSettingError({\n message:\n `${description} setting is missing. ` +\n `Pass it using the '${settingName}' parameter. ` +\n `Environment variables is not supported in this environment.`,\n });\n }\n\n settingValue = process.env[environmentVariableName];\n\n if (settingValue == null) {\n throw new LoadSettingError({\n message:\n `${description} setting is missing. ` +\n `Pass it using the '${settingName}' parameter ` +\n `or the ${environmentVariableName} environment variable.`,\n });\n }\n\n if (typeof settingValue !== 'string') {\n throw new LoadSettingError({\n message:\n `${description} setting must be a string. ` +\n `The value of the ${environmentVariableName} environment variable is not a string.`,\n });\n }\n\n return settingValue;\n}\n","import {\n JSONParseError,\n JSONValue,\n TypeValidationError,\n} from '@ai-sdk/provider';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport { secureJsonParse } from './secure-json-parse';\nimport { safeValidateTypes, validateTypes } from './validate-types';\nimport { Validator } from './validator';\n\n/**\n * Parses a JSON string into an unknown object.\n *\n * @param text - The JSON string to parse.\n * @returns {JSONValue} - The parsed JSON object.\n */\nexport async function parseJSON(options: {\n text: string;\n schema?: undefined;\n}): Promise<JSONValue>;\n/**\n * Parses a JSON string into a strongly-typed object using the provided schema.\n *\n * @template T - The type of the object to parse the JSON into.\n * @param {string} text - The JSON string to parse.\n * @param {Validator<T>} schema - The schema to use for parsing the JSON.\n * @returns {Promise<T>} - The parsed object.\n */\nexport async function parseJSON<T>(options: {\n text: string;\n schema: z4.core.$ZodType<T> | z3.Schema<T> | Validator<T>;\n}): Promise<T>;\nexport async function parseJSON<T>({\n text,\n schema,\n}: {\n text: string;\n schema?: z4.core.$ZodType<T> | z3.Schema<T> | Validator<T>;\n}): Promise<T> {\n try {\n const value = secureJsonParse(text);\n\n if (schema == null) {\n return value;\n }\n\n return validateTypes<T>({ value, schema });\n } catch (error) {\n if (\n JSONParseError.isInstance(error) ||\n TypeValidationError.isInstance(error)\n ) {\n throw error;\n }\n\n throw new JSONParseError({ text, cause: error });\n }\n}\n\nexport type ParseResult<T> =\n | { success: true; value: T; rawValue: unknown }\n | {\n success: false;\n error: JSONParseError | TypeValidationError;\n rawValue: unknown;\n };\n\n/**\n * Safely parses a JSON string and returns the result as an object of type `unknown`.\n *\n * @param text - The JSON string to parse.\n * @returns {Promise<object>} Either an object with `success: true` and the parsed data, or an object with `success: false` and the error that occurred.\n */\nexport async function safeParseJSON(options: {\n text: string;\n schema?: undefined;\n}): Promise<ParseResult<JSONValue>>;\n/**\n * Safely parses a JSON string into a strongly-typed object, using a provided schema to validate the object.\n *\n * @template T - The type of the object to parse the JSON into.\n * @param {string} text - The JSON string to parse.\n * @param {Validator<T>} schema - The schema to use for parsing the JSON.\n * @returns An object with either a `success` flag and the parsed and typed data, or a `success` flag and an error object.\n */\nexport async function safeParseJSON<T>(options: {\n text: string;\n schema: z4.core.$ZodType<T> | z3.Schema<T> | Validator<T>;\n}): Promise<ParseResult<T>>;\nexport async function safeParseJSON<T>({\n text,\n schema,\n}: {\n text: string;\n schema?: z4.core.$ZodType<T> | z3.Schema<T> | Validator<T>;\n}): Promise<ParseResult<T>> {\n try {\n const value = secureJsonParse(text);\n\n if (schema == null) {\n return { success: true, value: value as T, rawValue: value };\n }\n\n return await safeValidateTypes<T>({ value, schema });\n } catch (error) {\n return {\n success: false,\n error: JSONParseError.isInstance(error)\n ? error\n : new JSONParseError({ text, cause: error }),\n rawValue: undefined,\n };\n }\n}\n\nexport function isParsableJson(input: string): boolean {\n try {\n secureJsonParse(input);\n return true;\n } catch {\n return false;\n }\n}\n","// Licensed under BSD-3-Clause (this file only)\n// Code adapted from https://github.com/fastify/secure-json-parse/blob/783fcb1b5434709466759847cec974381939673a/index.js\n//\n// Copyright (c) Vercel, Inc. (https://vercel.com)\n// Copyright (c) 2019 The Fastify Team\n// Copyright (c) 2019, Sideway Inc, and project contributors\n// All rights reserved.\n//\n// The complete list of contributors can be found at:\n// - https://github.com/hapijs/bourne/graphs/contributors\n// - https://github.com/fastify/secure-json-parse/graphs/contributors\n// - https://github.com/vercel/ai/commits/main/packages/provider-utils/src/secure-parse-json.ts\n//\n// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n//\n// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n//\n// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n//\n// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nconst suspectProtoRx = /\"__proto__\"\\s*:/;\nconst suspectConstructorRx = /\"constructor\"\\s*:/;\n\nfunction _parse(text: string) {\n // Parse normally\n const obj = JSON.parse(text);\n\n // Ignore null and non-objects\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (\n suspectProtoRx.test(text) === false &&\n suspectConstructorRx.test(text) === false\n ) {\n return obj;\n }\n\n // Scan result for proto keys\n return filter(obj);\n}\n\nfunction filter(obj: any) {\n let next = [obj];\n\n while (next.length) {\n const nodes = next;\n next = [];\n\n for (const node of nodes) {\n if (Object.prototype.hasOwnProperty.call(node, '__proto__')) {\n throw new SyntaxError('Object contains forbidden prototype property');\n }\n\n if (\n Object.prototype.hasOwnProperty.call(node, 'constructor') &&\n Object.prototype.hasOwnProperty.call(node.constructor, 'prototype')\n ) {\n throw new SyntaxError('Object contains forbidden prototype property');\n }\n\n for (const key in node) {\n const value = node[key];\n if (value && typeof value === 'object') {\n next.push(value);\n }\n }\n }\n }\n return obj;\n}\n\nexport function secureJsonParse(text: string) {\n // Performance optimization, see https://github.com/fastify/secure-json-parse/pull/90\n const { stackTraceLimit } = Error;\n Error.stackTraceLimit = 0;\n try {\n return _parse(text);\n } finally {\n Error.stackTraceLimit = stackTraceLimit;\n }\n}\n","import { TypeValidationError } from '@ai-sdk/provider';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { Validator, asValidator } from './validator';\n\n/**\n * Validates the types of an unknown object using a schema and\n * return a strongly-typed object.\n *\n * @template T - The type of the object to validate.\n * @param {string} options.value - The object to validate.\n * @param {Validator<T>} options.schema - The schema to use for validating the JSON.\n * @returns {Promise<T>} - The typed object.\n */\nexport async function validateTypes<OBJECT>({\n value,\n schema,\n}: {\n value: unknown;\n schema: StandardSchemaV1<unknown, OBJECT> | Validator<OBJECT>;\n}): Promise<OBJECT> {\n const result = await safeValidateTypes({ value, schema });\n\n if (!result.success) {\n throw TypeValidationError.wrap({ value, cause: result.error });\n }\n\n return result.value;\n}\n\n/**\n * Safely validates the types of an unknown object using a schema and\n * return a strongly-typed object.\n *\n * @template T - The type of the object to validate.\n * @param {string} options.value - The JSON object to validate.\n * @param {Validator<T>} options.schema - The schema to use for validating the JSON.\n * @returns An object with either a `success` flag and the parsed and typed data, or a `success` flag and an error object.\n */\nexport async function safeValidateTypes<OBJECT>({\n value,\n schema,\n}: {\n value: unknown;\n schema: StandardSchemaV1<unknown, OBJECT> | Validator<OBJECT>;\n}): Promise<\n | {\n success: true;\n value: OBJECT;\n rawValue: unknown;\n }\n | {\n success: false;\n error: TypeValidationError;\n rawValue: unknown;\n }\n> {\n const validator = asValidator(schema);\n\n try {\n if (validator.validate == null) {\n return { success: true, value: value as OBJECT, rawValue: value };\n }\n\n const result = await validator.validate(value);\n\n if (result.success) {\n return { success: true, value: result.value, rawValue: value };\n }\n\n return {\n success: false,\n error: TypeValidationError.wrap({ value, cause: result.error }),\n rawValue: value,\n };\n } catch (error) {\n return {\n success: false,\n error: TypeValidationError.wrap({ value, cause: error }),\n rawValue: value,\n };\n }\n}\n","import { TypeValidationError } from '@ai-sdk/provider';\nimport { StandardSchemaV1 } from '@standard-schema/spec';\n\n/**\n * Used to mark validator functions so we can support both Zod and custom schemas.\n */\nexport const validatorSymbol = Symbol.for('vercel.ai.validator');\n\nexport type ValidationResult<OBJECT> =\n | { success: true; value: OBJECT }\n | { success: false; error: Error };\n\nexport type Validator<OBJECT = unknown> = {\n /**\n * Used to mark validator functions so we can support both Zod and custom schemas.\n */\n [validatorSymbol]: true;\n\n /**\n * Optional. Validates that the structure of a value matches this schema,\n * and returns a typed version of the value if it does.\n */\n readonly validate?: (\n value: unknown,\n ) => ValidationResult<OBJECT> | PromiseLike<ValidationResult<OBJECT>>;\n};\n\n/**\n * Create a validator.\n *\n * @param validate A validation function for the schema.\n */\nexport function validator<OBJECT>(\n validate?:\n | undefined\n | ((\n value: unknown,\n ) => ValidationResult<OBJECT> | PromiseLike<ValidationResult<OBJECT>>),\n): Validator<OBJECT> {\n return { [validatorSymbol]: true, validate };\n}\n\nexport function isValidator(value: unknown): value is Validator {\n return (\n typeof value === 'object' &&\n value !== null &&\n validatorSymbol in value &&\n value[validatorSymbol] === true &&\n 'validate' in value\n );\n}\n\nexport function asValidator<OBJECT>(\n value: Validator<OBJECT> | StandardSchemaV1<unknown, OBJECT>,\n): Validator<OBJECT> {\n return isValidator(value) ? value : standardSchemaValidator(value);\n}\n\nexport function standardSchemaValidator<OBJECT>(\n standardSchema: StandardSchemaV1<unknown, OBJECT>,\n): Validator<OBJECT> {\n return validator(async value => {\n const result = await standardSchema['~standard'].validate(value);\n\n return result.issues == null\n ? { success: true, value: result.value }\n : {\n success: false,\n error: new TypeValidationError({\n value,\n cause: result.issues,\n }),\n };\n });\n}\n","import {\n EventSourceMessage,\n EventSourceParserStream,\n} from 'eventsource-parser/stream';\nimport { ZodType } from 'zod/v4';\nimport { ParseResult, safeParseJSON } from './parse-json';\n\n/**\n * Parses a JSON event stream into a stream of parsed JSON objects.\n */\nexport function parseJsonEventStream<T>({\n stream,\n schema,\n}: {\n stream: ReadableStream<Uint8Array>;\n schema: ZodType<T>;\n}): ReadableStream<ParseResult<T>> {\n return stream\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough(\n new TransformStream<EventSourceMessage, ParseResult<T>>({\n async transform({ data }, controller) {\n // ignore the 'DONE' event that e.g. OpenAI sends:\n if (data === '[DONE]') {\n return;\n }\n\n controller.enqueue(await safeParseJSON({ text: data, schema }));\n },\n }),\n );\n}\n","import { InvalidArgumentError } from '@ai-sdk/provider';\nimport { safeValidateTypes } from './validate-types';\nimport { z } from 'zod/v4';\n\nexport async function parseProviderOptions<T>({\n provider,\n providerOptions,\n schema,\n}: {\n provider: string;\n providerOptions: Record<string, unknown> | undefined;\n schema: z.core.$ZodType<T, any>;\n}): Promise<T | undefined> {\n if (providerOptions?.[provider] == null) {\n return undefined;\n }\n\n const parsedProviderOptions = await safeValidateTypes<T | undefined>({\n value: providerOptions[provider],\n schema,\n });\n\n if (!parsedProviderOptions.success) {\n throw new InvalidArgumentError({\n argument: 'providerOptions',\n message: `invalid ${provider} provider options`,\n cause: parsedProviderOptions.error,\n });\n }\n\n return parsedProviderOptions.value;\n}\n","import { APICallError } from '@ai-sdk/provider';\nimport { extractResponseHeaders } from './extract-response-headers';\nimport { FetchFunction } from './fetch-function';\nimport { handleFetchError } from './handle-fetch-error';\nimport { isAbortError } from './is-abort-error';\nimport { removeUndefinedEntries } from './remove-undefined-entries';\nimport { ResponseHandler } from './response-handler';\n\n// use function to allow for mocking in tests:\nconst getOriginalFetch = () => globalThis.fetch;\n\nexport const postJsonToApi = async <T>({\n url,\n headers,\n body,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch,\n}: {\n url: string;\n headers?: Record<string, string | undefined>;\n body: unknown;\n failedResponseHandler: ResponseHandler<APICallError>;\n successfulResponseHandler: ResponseHandler<T>;\n abortSignal?: AbortSignal;\n fetch?: FetchFunction;\n}) =>\n postToApi({\n url,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: {\n content: JSON.stringify(body),\n values: body,\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch,\n });\n\nexport const postFormDataToApi = async <T>({\n url,\n headers,\n formData,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch,\n}: {\n url: string;\n headers?: Record<string, string | undefined>;\n formData: FormData;\n failedResponseHandler: ResponseHandler<APICallError>;\n successfulResponseHandler: ResponseHandler<T>;\n abortSignal?: AbortSignal;\n fetch?: FetchFunction;\n}) =>\n postToApi({\n url,\n headers,\n body: {\n content: formData,\n values: Object.fromEntries((formData as any).entries()),\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch,\n });\n\nexport const postToApi = async <T>({\n url,\n headers = {},\n body,\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch = getOriginalFetch(),\n}: {\n url: string;\n headers?: Record<string, string | undefined>;\n body: {\n content: string | FormData | Uint8Array;\n values: unknown;\n };\n failedResponseHandler: ResponseHandler<Error>;\n successfulResponseHandler: ResponseHandler<T>;\n abortSignal?: AbortSignal;\n fetch?: FetchFunction;\n}) => {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: removeUndefinedEntries(headers),\n body: body.content,\n signal: abortSignal,\n });\n\n const responseHeaders = extractResponseHeaders(response);\n\n if (!response.ok) {\n let errorInformation: {\n value: Error;\n responseHeaders?: Record<string, string> | undefined;\n };\n\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: body.values,\n });\n } catch (error) {\n if (isAbortError(error) || APICallError.isInstance(error)) {\n throw error;\n }\n\n throw new APICallError({\n message: 'Failed to process error response',\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values,\n });\n }\n\n throw errorInformation.value;\n }\n\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: body.values,\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || APICallError.isInstance(error)) {\n throw error;\n }\n }\n\n throw new APICallError({\n message: 'Failed to process successful response',\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values,\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: body.values });\n }\n};\n","import { JSONValue, LanguageModelV2ToolResultPart } from '@ai-sdk/provider';\nimport { FlexibleSchema } from '../schema';\nimport { ModelMessage } from './model-message';\nimport { ProviderOptions } from './provider-options';\n\n/**\n * Additional options that are sent into each tool call.\n */\n// TODO AI SDK 6: rename to ToolExecutionOptions\nexport interface ToolCallOptions {\n /**\n * The ID of the tool call. You can use it e.g. when sending tool-call related information with stream data.\n */\n toolCallId: string;\n\n /**\n * Messages that were sent to the language model to initiate the response that contained the tool call.\n * The messages **do not** include the system prompt nor the assistant response that contained the tool call.\n */\n messages: ModelMessage[];\n\n /**\n * An optional abort signal that indicates that the overall operation should be aborted.\n */\n abortSignal?: AbortSignal;\n\n /**\n * Additional context.\n *\n * Experimental (can break in patch releases).\n */\n experimental_context?: unknown;\n}\n\nexport type ToolExecuteFunction<INPUT, OUTPUT> = (\n input: INPUT,\n options: ToolCallOptions,\n) => PromiseLike<OUTPUT> | OUTPUT;\n\n// 0 extends 1 & N checks for any\n// [N] extends [never] checks for never\ntype NeverOptional<N, T> = 0 extends 1 & N\n ? Partial<T>\n : [N] extends [never]\n ? Partial<Record<keyof T, undefined>>\n : T;\n\n/**\nA tool contains the description and the schema of the input that the tool expects.\nThis enables the language model to generate the input.\n\nThe tool can also contain an optional execute function for the actual execution function of the tool.\n */\nexport type Tool<\n INPUT extends JSONValue | unknown | never = any,\n OUTPUT extends JSONValue | unknown | never = any,\n> = {\n /**\nAn optional description of what the tool does.\nWill be used by the language model to decide whether to use the tool.\nNot used for provider-defined tools.\n */\n description?: string;\n\n /**\nAdditional provider-specific metadata. They are passed through\nto the provider from the AI SDK and enable provider-specific\nfunctionality that can be fully encapsulated in the provider.\n */\n providerOptions?: ProviderOptions;\n} & NeverOptional<\n INPUT,\n {\n /**\nThe schema of the input that the tool expects. The language model will use this to generate the input.\nIt is also used to validate the output of the language model.\nUse descriptions to make the input understandable for the language model.\n */\n inputSchema: FlexibleSchema<INPUT>;\n\n /**\n * Optional function that is called when the argument streaming starts.\n * Only called when the tool is used in a streaming context.\n */\n onInputStart?: (options: ToolCallOptions) => void | PromiseLike<void>;\n\n /**\n * Optional function that is called when an argument streaming delta is available.\n * Only called when the tool is used in a streaming context.\n */\n onInputDelta?: (\n options: { inputTextDelta: string } & ToolCallOptions,\n ) => void | PromiseLike<void>;\n\n /**\n * Optional function that is called when a tool call can be started,\n * even if the execute function is not provided.\n */\n onInputAvailable?: (\n options: {\n input: [INPUT] extends [never] ? undefined : INPUT;\n } & ToolCallOptions,\n ) => void | PromiseLike<void>;\n }\n> &\n NeverOptional<\n OUTPUT,\n {\n /**\nOptional conversion function that maps the tool result to an output that can be used by the language model.\n\nIf not provided, the tool result will be sent as a JSON object.\n */\n toModelOutput?: (\n output: OUTPUT,\n ) => LanguageModelV2ToolResultPart['output'];\n } & (\n | {\n /**\nAn async function that is called with the arguments from the tool call and produces a result.\nIf not provided, the tool will not be executed automatically.\n\n@args is the input of the tool call.\n@options.abortSignal is a signal that can be used to abort the tool call.\n */\n execute: ToolExecuteFunction<INPUT, OUTPUT>;\n\n outputSchema?: FlexibleSchema<OUTPUT>;\n }\n | {\n outputSchema: FlexibleSchema<OUTPUT>;\n\n execute?: never;\n }\n )\n > &\n (\n | {\n /**\nTool with user-defined input and output schemas.\n */\n type?: undefined | 'function';\n }\n | {\n /**\nTool that is defined at runtime (e.g. an MCP tool).\nThe types of input and output are not known at development time.\n */\n type: 'dynamic';\n }\n | {\n /**\nTool with provider-defined input and output schemas.\n */\n type: 'provider-defined';\n\n /**\nThe ID of the tool. Should follow the format `<provider-name>.<unique-tool-name>`.\n */\n id: `${string}.${string}`;\n\n /**\nThe name of the tool that the user must use in the tool set.\n */\n name: string;\n\n /**\nThe arguments for configuring the tool. Must match the expected arguments defined by the provider for this tool.\n */\n args: Record<string, unknown>;\n }\n );\n\n/**\n * Infer the input type of a tool.\n */\nexport type InferToolInput<TOOL extends Tool> =\n TOOL extends Tool<infer INPUT, any> ? INPUT : never;\n\n/**\n * Infer the output type of a tool.\n */\nexport type InferToolOutput<TOOL extends Tool> =\n TOOL extends Tool<any, infer OUTPUT> ? OUTPUT : never;\n\n/**\nHelper function for inferring the execute args of a tool.\n */\n// Note: overload order is important for auto-completion\nexport function tool<INPUT, OUTPUT>(\n tool: Tool<INPUT, OUTPUT>,\n): Tool<INPUT, OUTPUT>;\nexport function tool<INPUT>(tool: Tool<INPUT, never>): Tool<INPUT, never>;\nexport function tool<OUTPUT>(tool: Tool<never, OUTPUT>): Tool<never, OUTPUT>;\nexport function tool(tool: Tool<never, never>): Tool<never, never>;\nexport function tool(tool: any): any {\n return tool;\n}\n\n/**\nHelper function for defining a dynamic tool.\n */\nexport function dynamicTool(tool: {\n description?: string;\n providerOptions?: ProviderOptions;\n inputSchema: FlexibleSchema<unknown>;\n execute: ToolExecuteFunction<unknown, unknown>;\n toModelOutput?: (output: unknown) => LanguageModelV2ToolResultPart['output'];\n}): Tool<unknown, unknown> & {\n type: 'dynamic';\n} {\n return { ...tool, type: 'dynamic' };\n}\n","import { tool, Tool, ToolExecuteFunction } from './types/tool';\nimport { FlexibleSchema } from './schema';\n\nexport type ProviderDefinedToolFactory<INPUT, ARGS extends object> = <OUTPUT>(\n options: ARGS & {\n execute?: ToolExecuteFunction<INPUT, OUTPUT>;\n toModelOutput?: Tool<INPUT, OUTPUT>['toModelOutput'];\n onInputStart?: Tool<INPUT, OUTPUT>['onInputStart'];\n onInputDelta?: Tool<INPUT, OUTPUT>['onInputDelta'];\n onInputAvailable?: Tool<INPUT, OUTPUT>['onInputAvailable'];\n },\n) => Tool<INPUT, OUTPUT>;\n\nexport function createProviderDefinedToolFactory<INPUT, ARGS extends object>({\n id,\n name,\n inputSchema,\n}: {\n id: `${string}.${string}`;\n name: string;\n inputSchema: FlexibleSchema<INPUT>;\n}): ProviderDefinedToolFactory<INPUT, ARGS> {\n return <OUTPUT>({\n execute,\n outputSchema,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }: ARGS & {\n execute?: ToolExecuteFunction<INPUT, OUTPUT>;\n outputSchema?: FlexibleSchema<OUTPUT>;\n toModelOutput?: Tool<INPUT, OUTPUT>['toModelOutput'];\n onInputStart?: Tool<INPUT, OUTPUT>['onInputStart'];\n onInputDelta?: Tool<INPUT, OUTPUT>['onInputDelta'];\n onInputAvailable?: Tool<INPUT, OUTPUT>['onInputAvailable'];\n }): Tool<INPUT, OUTPUT> =>\n tool({\n type: 'provider-defined',\n id,\n name,\n args,\n inputSchema,\n outputSchema,\n execute,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n });\n}\n\nexport type ProviderDefinedToolFactoryWithOutputSchema<\n INPUT,\n OUTPUT,\n ARGS extends object,\n> = (\n options: ARGS & {\n execute?: ToolExecuteFunction<INPUT, OUTPUT>;\n toModelOutput?: Tool<INPUT, OUTPUT>['toModelOutput'];\n onInputStart?: Tool<INPUT, OUTPUT>['onInputStart'];\n onInputDelta?: Tool<INPUT, OUTPUT>['onInputDelta'];\n onInputAvailable?: Tool<INPUT, OUTPUT>['onInputAvailable'];\n },\n) => Tool<INPUT, OUTPUT>;\n\nexport function createProviderDefinedToolFactoryWithOutputSchema<\n INPUT,\n OUTPUT,\n ARGS extends object,\n>({\n id,\n name,\n inputSchema,\n outputSchema,\n}: {\n id: `${string}.${string}`;\n name: string;\n inputSchema: FlexibleSchema<INPUT>;\n outputSchema: FlexibleSchema<OUTPUT>;\n}): ProviderDefinedToolFactoryWithOutputSchema<INPUT, OUTPUT, ARGS> {\n return ({\n execute,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }: ARGS & {\n execute?: ToolExecuteFunction<INPUT, OUTPUT>;\n toModelOutput?: Tool<INPUT, OUTPUT>['toModelOutput'];\n onInputStart?: Tool<INPUT, OUTPUT>['onInputStart'];\n onInputDelta?: Tool<INPUT, OUTPUT>['onInputDelta'];\n onInputAvailable?: Tool<INPUT, OUTPUT>['onInputAvailable'];\n }): Tool<INPUT, OUTPUT> =>\n tool({\n type: 'provider-defined',\n id,\n name,\n args,\n inputSchema,\n outputSchema,\n execute,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n });\n}\n","export type Resolvable<T> =\n | T // Raw value\n | Promise<T> // Promise of value\n | (() => T) // Function returning value\n | (() => Promise<T>); // Function returning promise of value\n\n/**\n * Resolves a value that could be a raw value, a Promise, a function returning a value,\n * or a function returning a Promise.\n */\nexport async function resolve<T>(value: Resolvable<T>): Promise<T> {\n // If it's a function, call it to get the value/promise\n if (typeof value === 'function') {\n value = (value as Function)();\n }\n\n // Otherwise just resolve whatever we got (value or promise)\n return Promise.resolve(value as T);\n}\n","import { APICallError, EmptyResponseBodyError } from '@ai-sdk/provider';\nimport { ZodType } from 'zod/v4';\nimport { extractResponseHeaders } from './extract-response-headers';\nimport { parseJSON, ParseResult, safeParseJSON } from './parse-json';\nimport { parseJsonEventStream } from './parse-json-event-stream';\n\nexport type ResponseHandler<RETURN_TYPE> = (options: {\n url: string;\n requestBodyValues: unknown;\n response: Response;\n}) => PromiseLike<{\n value: RETURN_TYPE;\n rawValue?: unknown;\n responseHeaders?: Record<string, string>;\n}>;\n\nexport const createJsonErrorResponseHandler =\n <T>({\n errorSchema,\n errorToMessage,\n isRetryable,\n }: {\n errorSchema: ZodType<T>;\n errorToMessage: (error: T) => string;\n isRetryable?: (response: Response, error?: T) => boolean;\n }): ResponseHandler<APICallError> =>\n async ({ response, url, requestBodyValues }) => {\n const responseBody = await response.text();\n const responseHeaders = extractResponseHeaders(response);\n\n // Some providers return an empty response body for some errors:\n if (responseBody.trim() === '') {\n return {\n responseHeaders,\n value: new APICallError({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable?.(response),\n }),\n };\n }\n\n // resilient parsing in case the response is not JSON or does not match the schema:\n try {\n const parsedError = await parseJSON({\n text: responseBody,\n schema: errorSchema,\n });\n\n return {\n responseHeaders,\n value: new APICallError({\n message: errorToMessage(parsedError),\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n data: parsedError,\n isRetryable: isRetryable?.(response, parsedError),\n }),\n };\n } catch (parseError) {\n return {\n responseHeaders,\n value: new APICallError({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable?.(response),\n }),\n };\n }\n };\n\nexport const createEventSourceResponseHandler =\n <T>(\n chunkSchema: ZodType<T>,\n ): ResponseHandler<ReadableStream<ParseResult<T>>> =>\n async ({ response }: { response: Response }) => {\n const responseHeaders = extractResponseHeaders(response);\n\n if (response.body == null) {\n throw new EmptyResponseBodyError({});\n }\n\n return {\n responseHeaders,\n value: parseJsonEventStream({\n stream: response.body,\n schema: chunkSchema,\n }),\n };\n };\n\nexport const createJsonStreamResponseHandler =\n <T>(\n chunkSchema: ZodType<T>,\n ): ResponseHandler<ReadableStream<ParseResult<T>>> =>\n async ({ response }: { response: Response }) => {\n const responseHeaders = extractResponseHeaders(response);\n\n if (response.body == null) {\n throw new EmptyResponseBodyError({});\n }\n\n let buffer = '';\n\n return {\n responseHeaders,\n value: response.body.pipeThrough(new TextDecoderStream()).pipeThrough(\n new TransformStream<string, ParseResult<T>>({\n async transform(chunkText, controller) {\n if (chunkText.endsWith('\\n')) {\n controller.enqueue(\n await safeParseJSON({\n text: buffer + chunkText,\n schema: chunkSchema,\n }),\n );\n buffer = '';\n } else {\n buffer += chunkText;\n }\n },\n }),\n ),\n };\n };\n\nexport const createJsonResponseHandler =\n <T>(responseSchema: ZodType<T>): ResponseHandler<T> =>\n async ({ response, url, requestBodyValues }) => {\n const responseBody = await response.text();\n\n const parsedResult = await safeParseJSON({\n text: responseBody,\n schema: responseSchema,\n });\n\n const responseHeaders = extractResponseHeaders(response);\n\n if (!parsedResult.success) {\n throw new APICallError({\n message: 'Invalid JSON response',\n cause: parsedResult.error,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n url,\n requestBodyValues,\n });\n }\n\n return {\n responseHeaders,\n value: parsedResult.value,\n rawValue: parsedResult.rawValue,\n };\n };\n\nexport const createBinaryResponseHandler =\n (): ResponseHandler<Uint8Array> =>\n async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n\n if (!response.body) {\n throw new APICallError({\n message: 'Response body is empty',\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: undefined,\n });\n }\n\n try {\n const buffer = await response.arrayBuffer();\n return {\n responseHeaders,\n value: new Uint8Array(buffer),\n };\n } catch (error) {\n throw new APICallError({\n message: 'Failed to read response as array buffer',\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: undefined,\n cause: error,\n });\n }\n };\n\nexport const createStatusCodeErrorResponseHandler =\n (): ResponseHandler<APICallError> =>\n async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n const responseBody = await response.text();\n\n return {\n responseHeaders,\n value: new APICallError({\n message: response.statusText,\n url,\n requestBodyValues: requestBodyValues as Record<string, unknown>,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n }),\n };\n };\n","import { JSONSchema7 } from '@ai-sdk/provider';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport zodToJsonSchema from 'zod-to-json-schema';\nimport { jsonSchema, Schema } from './schema';\n\nexport function zod3Schema<OBJECT>(\n zodSchema: z3.Schema<OBJECT, z3.ZodTypeDef, any>,\n options?: {\n /**\n * Enables support for references in the schema.\n * This is required for recursive schemas, e.g. with `z.lazy`.\n * However, not all language models and providers support such references.\n * Defaults to `false`.\n */\n useReferences?: boolean;\n },\n): Schema<OBJECT> {\n // default to no references (to support openapi conversion for google)\n const useReferences = options?.useReferences ?? false;\n\n return jsonSchema(\n zodToJsonSchema(zodSchema, {\n $refStrategy: useReferences ? 'root' : 'none',\n target: 'jsonSchema7', // note: openai mode breaks various gemini conversions\n }) as JSONSchema7,\n {\n validate: async value => {\n const result = await zodSchema.safeParseAsync(value);\n return result.success\n ? { success: true, value: result.data }\n : { success: false, error: result.error };\n },\n },\n );\n}\n\nexport function zod4Schema<OBJECT>(\n zodSchema: z4.core.$ZodType<OBJECT, any>,\n options?: {\n /**\n * Enables support for references in the schema.\n * This is required for recursive schemas, e.g. with `z.lazy`.\n * However, not all language models and providers support such references.\n * Defaults to `false`.\n */\n useReferences?: boolean;\n },\n): Schema<OBJECT> {\n // default to no references (to support openapi conversion for google)\n const useReferences = options?.useReferences ?? false;\n\n const z4JSONSchema = z4.toJSONSchema(zodSchema, {\n target: 'draft-7',\n io: 'output',\n reused: useReferences ? 'ref' : 'inline',\n }) as JSONSchema7;\n\n return jsonSchema(z4JSONSchema, {\n validate: async value => {\n const result = await z4.safeParseAsync(zodSchema, value);\n return result.success\n ? { success: true, value: result.data }\n : { success: false, error: result.error };\n },\n });\n}\n\nexport function isZod4Schema(\n zodSchema: z4.core.$ZodType<any, any> | z3.Schema<any, z3.ZodTypeDef, any>,\n): zodSchema is z4.core.$ZodType<any, any> {\n // https://zod.dev/library-authors?id=how-to-support-zod-3-and-zod-4-simultaneously\n return '_zod' in zodSchema;\n}\n\nexport function zodSchema<OBJECT>(\n zodSchema:\n | z4.core.$ZodType<OBJECT, any>\n | z3.Schema<OBJECT, z3.ZodTypeDef, any>,\n options?: {\n /**\n * Enables support for references in the schema.\n * This is required for recursive schemas, e.g. with `z.lazy`.\n * However, not all language models and providers support such references.\n * Defaults to `false`.\n */\n useReferences?: boolean;\n },\n): Schema<OBJECT> {\n if (isZod4Schema(zodSchema)) {\n return zod4Schema(zodSchema, options);\n } else {\n return zod3Schema(zodSchema, options);\n }\n}\n","import { Validator, validatorSymbol, type ValidationResult } from './validator';\nimport { JSONSchema7 } from '@ai-sdk/provider';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport { zodSchema } from './zod-schema';\n\n/**\n * Used to mark schemas so we can support both Zod and custom schemas.\n */\nconst schemaSymbol = Symbol.for('vercel.ai.schema');\n\nexport type Schema<OBJECT = unknown> = Validator<OBJECT> & {\n /**\n * Used to mark schemas so we can support both Zod and custom schemas.\n */\n [schemaSymbol]: true;\n\n /**\n * Schema type for inference.\n */\n _type: OBJECT;\n\n /**\n * The JSON Schema for the schema. It is passed to the providers.\n */\n readonly jsonSchema: JSONSchema7;\n};\n\nexport type FlexibleSchema<T> = z4.core.$ZodType<T> | z3.Schema<T> | Schema<T>;\n\nexport type InferSchema<SCHEMA> = SCHEMA extends z3.Schema\n ? z3.infer<SCHEMA>\n : SCHEMA extends z4.core.$ZodType\n ? z4.infer<SCHEMA>\n : SCHEMA extends Schema<infer T>\n ? T\n : never;\n\n/**\n * Create a schema using a JSON Schema.\n *\n * @param jsonSchema The JSON Schema for the schema.\n * @param options.validate Optional. A validation function for the schema.\n */\nexport function jsonSchema<OBJECT = unknown>(\n jsonSchema: JSONSchema7,\n {\n validate,\n }: {\n validate?: (\n value: unknown,\n ) => ValidationResult<OBJECT> | PromiseLike<ValidationResult<OBJECT>>;\n } = {},\n): Schema<OBJECT> {\n return {\n [schemaSymbol]: true,\n _type: undefined as OBJECT, // should never be used directly\n [validatorSymbol]: true,\n jsonSchema,\n validate,\n };\n}\n\nfunction isSchema(value: unknown): value is Schema {\n return (\n typeof value === 'object' &&\n value !== null &&\n schemaSymbol in value &&\n value[schemaSymbol] === true &&\n 'jsonSchema' in value &&\n 'validate' in value\n );\n}\n\nexport function asSchema<OBJECT>(\n schema:\n | z4.core.$ZodType<OBJECT, any>\n | z3.Schema<OBJECT, z3.ZodTypeDef, any>\n | Schema<OBJECT>\n | undefined,\n): Schema<OBJECT> {\n return schema == null\n ? jsonSchema({\n properties: {},\n additionalProperties: false,\n })\n : isSchema(schema)\n ? schema\n : zodSchema(schema);\n}\n","// btoa and atob need to be invoked as a function call, not as a method call.\n// Otherwise CloudFlare will throw a\n// \"TypeError: Illegal invocation: function called with incorrect this reference\"\nconst { btoa, atob } = globalThis;\n\nexport function convertBase64ToUint8Array(base64String: string) {\n const base64Url = base64String.replace(/-/g, '+').replace(/_/g, '/');\n const latin1string = atob(base64Url);\n return Uint8Array.from(latin1string, byte => byte.codePointAt(0)!);\n}\n\nexport function convertUint8ArrayToBase64(array: Uint8Array): string {\n let latin1string = '';\n\n // Note: regular for loop to support older JavaScript versions that\n // do not support for..of on Uint8Array\n for (let i = 0; i < array.length; i++) {\n latin1string += String.fromCodePoint(array[i]);\n }\n\n return btoa(latin1string);\n}\n\nexport function convertToBase64(value: string | Uint8Array): string {\n return value instanceof Uint8Array ? convertUint8ArrayToBase64(value) : value;\n}\n","export function withoutTrailingSlash(url: string | undefined) {\n return url?.replace(/\\/$/, '');\n}\n","export * from './combine-headers';\nexport { convertAsyncIteratorToReadableStream } from './convert-async-iterator-to-readable-stream';\nexport * from './delay';\nexport * from './extract-response-headers';\nexport * from './fetch-function';\nexport { createIdGenerator, generateId, type IdGenerator } from './generate-id';\nexport * from './get-error-message';\nexport * from './get-from-api';\nexport * from './is-abort-error';\nexport { isUrlSupported } from './is-url-supported';\nexport * from './load-api-key';\nexport { loadOptionalSetting } from './load-optional-setting';\nexport { loadSetting } from './load-setting';\nexport * from './parse-json';\nexport { parseJsonEventStream } from './parse-json-event-stream';\nexport { parseProviderOptions } from './parse-provider-options';\nexport * from './post-to-api';\nexport {\n createProviderDefinedToolFactory,\n type ProviderDefinedToolFactory,\n createProviderDefinedToolFactoryWithOutputSchema,\n type ProviderDefinedToolFactoryWithOutputSchema,\n} from './provider-defined-tool-factory';\nexport * from './remove-undefined-entries';\nexport * from './resolve';\nexport * from './response-handler';\nexport {\n asSchema,\n jsonSchema,\n type FlexibleSchema,\n type InferSchema,\n type Schema,\n} from './schema';\nexport * from './uint8-utils';\nexport * from './validate-types';\nexport * from './validator';\nexport * from './without-trailing-slash';\nexport { zodSchema } from './zod-schema';\n\n// folder re-exports\nexport * from './types';\n\n// external re-exports\nexport * from '@standard-schema/spec';\nexport {\n EventSourceParserStream,\n type EventSourceMessage,\n} from 'eventsource-parser/stream';\n","export const ignoreOverride = Symbol(\"Let zodToJsonSchema decide on which parser to use\");\nexport const jsonDescription = (jsonSchema, def) => {\n if (def.description) {\n try {\n return {\n ...jsonSchema,\n ...JSON.parse(def.description),\n };\n }\n catch { }\n }\n return jsonSchema;\n};\nexport const defaultOptions = {\n name: undefined,\n $refStrategy: \"root\",\n basePath: [\"#\"],\n effectStrategy: \"input\",\n pipeStrategy: \"all\",\n dateStrategy: \"format:date-time\",\n mapStrategy: \"entries\",\n removeAdditionalStrategy: \"passthrough\",\n allowedAdditionalProperties: true,\n rejectedAdditionalProperties: false,\n definitionPath: \"definitions\",\n target: \"jsonSchema7\",\n strictUnions: false,\n definitions: {},\n errorMessages: false,\n markdownDescription: false,\n patternStrategy: \"escape\",\n applyRegexFlags: false,\n emailStrategy: \"format:email\",\n base64Strategy: \"contentEncoding:base64\",\n nameStrategy: \"ref\",\n openAiAnyTypeName: \"OpenAiAnyType\"\n};\nexport const getDefaultOptions = (options) => (typeof options === \"string\"\n ? {\n ...defaultOptions,\n name: options,\n }\n : {\n ...defaultOptions,\n ...options,\n });\n","import { ZodFirstPartyTypeKind } from \"zod\";\nimport { parseAnyDef } from \"./parsers/any.js\";\nimport { parseArrayDef } from \"./parsers/array.js\";\nimport { parseBigintDef } from \"./parsers/bigint.js\";\nimport { parseBooleanDef } from \"./parsers/boolean.js\";\nimport { parseBrandedDef } from \"./parsers/branded.js\";\nimport { parseCatchDef } from \"./parsers/catch.js\";\nimport { parseDateDef } from \"./parsers/date.js\";\nimport { parseDefaultDef } from \"./parsers/default.js\";\nimport { parseEffectsDef } from \"./parsers/effects.js\";\nimport { parseEnumDef } from \"./parsers/enum.js\";\nimport { parseIntersectionDef } from \"./parsers/intersection.js\";\nimport { parseLiteralDef } from \"./parsers/literal.js\";\nimport { parseMapDef } from \"./parsers/map.js\";\nimport { parseNativeEnumDef } from \"./parsers/nativeEnum.js\";\nimport { parseNeverDef } from \"./parsers/never.js\";\nimport { parseNullDef } from \"./parsers/null.js\";\nimport { parseNullableDef } from \"./parsers/nullable.js\";\nimport { parseNumberDef } from \"./parsers/number.js\";\nimport { parseObjectDef } from \"./parsers/object.js\";\nimport { parseOptionalDef } from \"./parsers/optional.js\";\nimport { parsePipelineDef } from \"./parsers/pipeline.js\";\nimport { parsePromiseDef } from \"./parsers/promise.js\";\nimport { parseRecordDef } from \"./parsers/record.js\";\nimport { parseSetDef } from \"./parsers/set.js\";\nimport { parseStringDef } from \"./parsers/string.js\";\nimport { parseTupleDef } from \"./parsers/tuple.js\";\nimport { parseUndefinedDef } from \"./parsers/undefined.js\";\nimport { parseUnionDef } from \"./parsers/union.js\";\nimport { parseUnknownDef } from \"./parsers/unknown.js\";\nimport { parseReadonlyDef } from \"./parsers/readonly.js\";\nexport const selectParser = (def, typeName, refs) => {\n switch (typeName) {\n case ZodFirstPartyTypeKind.ZodString:\n return parseStringDef(def, refs);\n case ZodFirstPartyTypeKind.ZodNumber:\n return parseNumberDef(def, refs);\n case ZodFirstPartyTypeKind.ZodObject:\n return parseObjectDef(def, refs);\n case ZodFirstPartyTypeKind.ZodBigInt:\n return parseBigintDef(def, refs);\n case ZodFirstPartyTypeKind.ZodBoolean:\n return parseBooleanDef();\n case ZodFirstPartyTypeKind.ZodDate:\n return parseDateDef(def, refs);\n case ZodFirstPartyTypeKind.ZodUndefined:\n return parseUndefinedDef(refs);\n case ZodFirstPartyTypeKind.ZodNull:\n return parseNullDef(refs);\n case ZodFirstPartyTypeKind.ZodArray:\n return parseArrayDef(def, refs);\n case ZodFirstPartyTypeKind.ZodUnion:\n case ZodFirstPartyTypeKind.ZodDiscriminatedUnion:\n return parseUnionDef(def, refs);\n case ZodFirstPartyTypeKind.ZodIntersection:\n return parseIntersectionDef(def, refs);\n case ZodFirstPartyTypeKind.ZodTuple:\n return parseTupleDef(def, refs);\n case ZodFirstPartyTypeKind.ZodRecord:\n return parseRecordDef(def, refs);\n case ZodFirstPartyTypeKind.ZodLiteral:\n return parseLiteralDef(def, refs);\n case ZodFirstPartyTypeKind.ZodEnum:\n return parseEnumDef(def);\n case ZodFirstPartyTypeKind.ZodNativeEnum:\n return parseNativeEnumDef(def);\n case ZodFirstPartyTypeKind.ZodNullable:\n return parseNullableDef(def, refs);\n case ZodFirstPartyTypeKind.ZodOptional:\n return parseOptionalDef(def, refs);\n case ZodFirstPartyTypeKind.ZodMap:\n return parseMapDef(def, refs);\n case ZodFirstPartyTypeKind.ZodSet:\n return parseSetDef(def, refs);\n case ZodFirstPartyTypeKind.ZodLazy:\n return () => def.getter()._def;\n case ZodFirstPartyTypeKind.ZodPromise:\n return parsePromiseDef(def, refs);\n case ZodFirstPartyTypeKind.ZodNaN:\n case ZodFirstPartyTypeKind.ZodNever:\n return parseNeverDef(refs);\n case ZodFirstPartyTypeKind.ZodEffects:\n return parseEffectsDef(def, refs);\n case ZodFirstPartyTypeKind.ZodAny:\n return parseAnyDef(refs);\n case ZodFirstPartyTypeKind.ZodUnknown:\n return parseUnknownDef(refs);\n case ZodFirstPartyTypeKind.ZodDefault:\n return parseDefaultDef(def, refs);\n case ZodFirstPartyTypeKind.ZodBranded:\n return parseBrandedDef(def, refs);\n case ZodFirstPartyTypeKind.ZodReadonly:\n return parseReadonlyDef(def, refs);\n case ZodFirstPartyTypeKind.ZodCatch:\n return parseCatchDef(def, refs);\n case ZodFirstPartyTypeKind.ZodPipeline:\n return parsePipelineDef(def, refs);\n case ZodFirstPartyTypeKind.ZodFunction:\n case ZodFirstPartyTypeKind.ZodVoid:\n case ZodFirstPartyTypeKind.ZodSymbol:\n return undefined;\n default:\n /* c8 ignore next */\n return ((_) => undefined)(typeName);\n }\n};\n","import { ZodFirstPartyTypeKind } from \"zod\";\nimport { setResponseValueAndErrors } from \"../errorMessages.js\";\nimport { parseDef } from \"../parseDef.js\";\nexport function parseArrayDef(def, refs) {\n const res = {\n type: \"array\",\n };\n if (def.type?._def &&\n def.type?._def?.typeName !== ZodFirstPartyTypeKind.ZodAny) {\n res.items = parseDef(def.type._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\"],\n });\n }\n if (def.minLength) {\n setResponseValueAndErrors(res, \"minItems\", def.minLength.value, def.minLength.message, refs);\n }\n if (def.maxLength) {\n setResponseValueAndErrors(res, \"maxItems\", def.maxLength.value, def.maxLength.message, refs);\n }\n if (def.exactLength) {\n setResponseValueAndErrors(res, \"minItems\", def.exactLength.value, def.exactLength.message, refs);\n setResponseValueAndErrors(res, \"maxItems\", def.exactLength.value, def.exactLength.message, refs);\n }\n return res;\n}\n","import { ZodFirstPartyTypeKind, } from \"zod\";\nimport { parseDef } from \"../parseDef.js\";\nimport { parseStringDef } from \"./string.js\";\nimport { parseBrandedDef } from \"./branded.js\";\nimport { parseAnyDef } from \"./any.js\";\nexport function parseRecordDef(def, refs) {\n if (refs.target === \"openAi\") {\n console.warn(\"Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.\");\n }\n if (refs.target === \"openApi3\" &&\n def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodEnum) {\n return {\n type: \"object\",\n required: def.keyType._def.values,\n properties: def.keyType._def.values.reduce((acc, key) => ({\n ...acc,\n [key]: parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"properties\", key],\n }) ?? parseAnyDef(refs),\n }), {}),\n additionalProperties: refs.rejectedAdditionalProperties,\n };\n }\n const schema = {\n type: \"object\",\n additionalProperties: parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalProperties\"],\n }) ?? refs.allowedAdditionalProperties,\n };\n if (refs.target === \"openApi3\") {\n return schema;\n }\n if (def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodString &&\n def.keyType._def.checks?.length) {\n const { type, ...keyType } = parseStringDef(def.keyType._def, refs);\n return {\n ...schema,\n propertyNames: keyType,\n };\n }\n else if (def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodEnum) {\n return {\n ...schema,\n propertyNames: {\n enum: def.keyType._def.values,\n },\n };\n }\n else if (def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodBranded &&\n def.keyType._def.type._def.typeName === ZodFirstPartyTypeKind.ZodString &&\n def.keyType._def.type._def.checks?.length) {\n const { type, ...keyType } = parseBrandedDef(def.keyType._def, refs);\n return {\n ...schema,\n propertyNames: keyType,\n };\n }\n return schema;\n}\n","import { setResponseValueAndErrors } from \"../errorMessages.js\";\nlet emojiRegex = undefined;\n/**\n * Generated from the regular expressions found here as of 2024-05-22:\n * https://github.com/colinhacks/zod/blob/master/src/types.ts.\n *\n * Expressions with /i flag have been changed accordingly.\n */\nexport const zodPatterns = {\n /**\n * `c` was changed to `[cC]` to replicate /i flag\n */\n cuid: /^[cC][^\\s-]{8,}$/,\n cuid2: /^[0-9a-z]+$/,\n ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,\n /**\n * `a-z` was added to replicate /i flag\n */\n email: /^(?!\\.)(?!.*\\.\\.)([a-zA-Z0-9_'+\\-\\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\\-]*\\.)+[a-zA-Z]{2,}$/,\n /**\n * Constructed a valid Unicode RegExp\n *\n * Lazily instantiate since this type of regex isn't supported\n * in all envs (e.g. React Native).\n *\n * See:\n * https://github.com/colinhacks/zod/issues/2433\n * Fix in Zod:\n * https://github.com/colinhacks/zod/commit/9340fd51e48576a75adc919bff65dbc4a5d4c99b\n */\n emoji: () => {\n if (emojiRegex === undefined) {\n emojiRegex = RegExp(\"^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$\", \"u\");\n }\n return emojiRegex;\n },\n /**\n * Unused\n */\n uuid: /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/,\n /**\n * Unused\n */\n ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,\n ipv4Cidr: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/,\n /**\n * Unused\n */\n ipv6: /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,\n ipv6Cidr: /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,\n base64: /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,\n base64url: /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,\n nanoid: /^[a-zA-Z0-9_-]{21}$/,\n jwt: /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/,\n};\nexport function parseStringDef(def, refs) {\n const res = {\n type: \"string\",\n };\n if (def.checks) {\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n setResponseValueAndErrors(res, \"minLength\", typeof res.minLength === \"number\"\n ? Math.max(res.minLength, check.value)\n : check.value, check.message, refs);\n break;\n case \"max\":\n setResponseValueAndErrors(res, \"maxLength\", typeof res.maxLength === \"number\"\n ? Math.min(res.maxLength, check.value)\n : check.value, check.message, refs);\n break;\n case \"email\":\n switch (refs.emailStrategy) {\n case \"format:email\":\n addFormat(res, \"email\", check.message, refs);\n break;\n case \"format:idn-email\":\n addFormat(res, \"idn-email\", check.message, refs);\n break;\n case \"pattern:zod\":\n addPattern(res, zodPatterns.email, check.message, refs);\n break;\n }\n break;\n case \"url\":\n addFormat(res, \"uri\", check.message, refs);\n break;\n case \"uuid\":\n addFormat(res, \"uuid\", check.message, refs);\n break;\n case \"regex\":\n addPattern(res, check.regex, check.message, refs);\n break;\n case \"cuid\":\n addPattern(res, zodPatterns.cuid, check.message, refs);\n break;\n case \"cuid2\":\n addPattern(res, zodPatterns.cuid2, check.message, refs);\n break;\n case \"startsWith\":\n addPattern(res, RegExp(`^${escapeLiteralCheckValue(check.value, refs)}`), check.message, refs);\n break;\n case \"endsWith\":\n addPattern(res, RegExp(`${escapeLiteralCheckValue(check.value, refs)}$`), check.message, refs);\n break;\n case \"datetime\":\n addFormat(res, \"date-time\", check.message, refs);\n break;\n case \"date\":\n addFormat(res, \"date\", check.message, refs);\n break;\n case \"time\":\n addFormat(res, \"time\", check.message, refs);\n break;\n case \"duration\":\n addFormat(res, \"duration\", check.message, refs);\n break;\n case \"length\":\n setResponseValueAndErrors(res, \"minLength\", typeof res.minLength === \"number\"\n ? Math.max(res.minLength, check.value)\n : check.value, check.message, refs);\n setResponseValueAndErrors(res, \"maxLength\", typeof res.maxLength === \"number\"\n ? Math.min(res.maxLength, check.value)\n : check.value, check.message, refs);\n break;\n case \"includes\": {\n addPattern(res, RegExp(escapeLiteralCheckValue(check.value, refs)), check.message, refs);\n break;\n }\n case \"ip\": {\n if (check.version !== \"v6\") {\n addFormat(res, \"ipv4\", check.message, refs);\n }\n if (check.version !== \"v4\") {\n addFormat(res, \"ipv6\", check.message, refs);\n }\n break;\n }\n case \"base64url\":\n addPattern(res, zodPatterns.base64url, check.message, refs);\n break;\n case \"jwt\":\n addPattern(res, zodPatterns.jwt, check.message, refs);\n break;\n case \"cidr\": {\n if (check.version !== \"v6\") {\n addPattern(res, zodPatterns.ipv4Cidr, check.message, refs);\n }\n if (check.version !== \"v4\") {\n addPattern(res, zodPatterns.ipv6Cidr, check.message, refs);\n }\n break;\n }\n case \"emoji\":\n addPattern(res, zodPatterns.emoji(), check.message, refs);\n break;\n case \"ulid\": {\n addPattern(res, zodPatterns.ulid, check.message, refs);\n break;\n }\n case \"base64\": {\n switch (refs.base64Strategy) {\n case \"format:binary\": {\n addFormat(res, \"binary\", check.message, refs);\n break;\n }\n case \"contentEncoding:base64\": {\n setResponseValueAndErrors(res, \"contentEncoding\", \"base64\", check.message, refs);\n break;\n }\n case \"pattern:zod\": {\n addPattern(res, zodPatterns.base64, check.message, refs);\n break;\n }\n }\n break;\n }\n case \"nanoid\": {\n addPattern(res, zodPatterns.nanoid, check.message, refs);\n }\n case \"toLowerCase\":\n case \"toUpperCase\":\n case \"trim\":\n break;\n default:\n /* c8 ignore next */\n ((_) => { })(check);\n }\n }\n }\n return res;\n}\nfunction escapeLiteralCheckValue(literal, refs) {\n return refs.patternStrategy === \"escape\"\n ? escapeNonAlphaNumeric(literal)\n : literal;\n}\nconst ALPHA_NUMERIC = new Set(\"ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789\");\nfunction escapeNonAlphaNumeric(source) {\n let result = \"\";\n for (let i = 0; i < source.length; i++) {\n if (!ALPHA_NUMERIC.has(source[i])) {\n result += \"\\\\\";\n }\n result += source[i];\n }\n return result;\n}\n// Adds a \"format\" keyword to the schema. If a format exists, both formats will be joined in an allOf-node, along with subsequent ones.\nfunction addFormat(schema, value, message, refs) {\n if (schema.format || schema.anyOf?.some((x) => x.format)) {\n if (!schema.anyOf) {\n schema.anyOf = [];\n }\n if (schema.format) {\n schema.anyOf.push({\n format: schema.format,\n ...(schema.errorMessage &&\n refs.errorMessages && {\n errorMessage: { format: schema.errorMessage.format },\n }),\n });\n delete schema.format;\n if (schema.errorMessage) {\n delete schema.errorMessage.format;\n if (Object.keys(schema.errorMessage).length === 0) {\n delete schema.errorMessage;\n }\n }\n }\n schema.anyOf.push({\n format: value,\n ...(message &&\n refs.errorMessages && { errorMessage: { format: message } }),\n });\n }\n else {\n setResponseValueAndErrors(schema, \"format\", value, message, refs);\n }\n}\n// Adds a \"pattern\" keyword to the schema. If a pattern exists, both patterns will be joined in an allOf-node, along with subsequent ones.\nfunction addPattern(schema, regex, message, refs) {\n if (schema.pattern || schema.allOf?.some((x) => x.pattern)) {\n if (!schema.allOf) {\n schema.allOf = [];\n }\n if (schema.pattern) {\n schema.allOf.push({\n pattern: schema.pattern,\n ...(schema.errorMessage &&\n refs.errorMessages && {\n errorMessage: { pattern: schema.errorMessage.pattern },\n }),\n });\n delete schema.pattern;\n if (schema.errorMessage) {\n delete schema.errorMessage.pattern;\n if (Object.keys(schema.errorMessage).length === 0) {\n delete schema.errorMessage;\n }\n }\n }\n schema.allOf.push({\n pattern: stringifyRegExpWithFlags(regex, refs),\n ...(message &&\n refs.errorMessages && { errorMessage: { pattern: message } }),\n });\n }\n else {\n setResponseValueAndErrors(schema, \"pattern\", stringifyRegExpWithFlags(regex, refs), message, refs);\n }\n}\n// Mutate z.string.regex() in a best attempt to accommodate for regex flags when applyRegexFlags is true\nfunction stringifyRegExpWithFlags(regex, refs) {\n if (!refs.applyRegexFlags || !regex.flags) {\n return regex.source;\n }\n // Currently handled flags\n const flags = {\n i: regex.flags.includes(\"i\"),\n m: regex.flags.includes(\"m\"),\n s: regex.flags.includes(\"s\"), // `.` matches newlines\n };\n // The general principle here is to step through each character, one at a time, applying mutations as flags require. We keep track when the current character is escaped, and when it's inside a group /like [this]/ or (also) a range like /[a-z]/. The following is fairly brittle imperative code; edit at your peril!\n const source = flags.i ? regex.source.toLowerCase() : regex.source;\n let pattern = \"\";\n let isEscaped = false;\n let inCharGroup = false;\n let inCharRange = false;\n for (let i = 0; i < source.length; i++) {\n if (isEscaped) {\n pattern += source[i];\n isEscaped = false;\n continue;\n }\n if (flags.i) {\n if (inCharGroup) {\n if (source[i].match(/[a-z]/)) {\n if (inCharRange) {\n pattern += source[i];\n pattern += `${source[i - 2]}-${source[i]}`.toUpperCase();\n inCharRange = false;\n }\n else if (source[i + 1] === \"-\" && source[i + 2]?.match(/[a-z]/)) {\n pattern += source[i];\n inCharRange = true;\n }\n else {\n pattern += `${source[i]}${source[i].toUpperCase()}`;\n }\n continue;\n }\n }\n else if (source[i].match(/[a-z]/)) {\n pattern += `[${source[i]}${source[i].toUpperCase()}]`;\n continue;\n }\n }\n if (flags.m) {\n if (source[i] === \"^\") {\n pattern += `(^|(?<=[\\r\\n]))`;\n continue;\n }\n else if (source[i] === \"$\") {\n pattern += `($|(?=[\\r\\n]))`;\n continue;\n }\n }\n if (flags.s && source[i] === \".\") {\n pattern += inCharGroup ? `${source[i]}\\r\\n` : `[${source[i]}\\r\\n]`;\n continue;\n }\n pattern += source[i];\n if (source[i] === \"\\\\\") {\n isEscaped = true;\n }\n else if (inCharGroup && source[i] === \"]\") {\n inCharGroup = false;\n }\n else if (!inCharGroup && source[i] === \"[\") {\n inCharGroup = true;\n }\n }\n try {\n new RegExp(pattern);\n }\n catch {\n console.warn(`Could not convert regex pattern at ${refs.currentPath.join(\"/\")} to a flag-independent form! Falling back to the flag-ignorant source`);\n return regex.source;\n }\n return pattern;\n}\n","import { z } from 'zod/v4';\nimport { isDefinedOrNotNull } from '../utils/type-guards';\nimport { ReasoningFormat } from './format';\n\nexport enum ReasoningDetailType {\n Summary = 'reasoning.summary',\n Encrypted = 'reasoning.encrypted',\n Text = 'reasoning.text',\n}\n\nexport const CommonReasoningDetailSchema = z\n .object({\n id: z.string().nullish(),\n format: z.enum(ReasoningFormat).nullish(),\n index: z.number().optional(),\n })\n .loose();\n\nexport const ReasoningDetailSummarySchema = z\n .object({\n type: z.literal(ReasoningDetailType.Summary),\n summary: z.string(),\n })\n .extend(CommonReasoningDetailSchema.shape);\nexport type ReasoningDetailSummary = z.infer<\n typeof ReasoningDetailSummarySchema\n>;\n\nexport const ReasoningDetailEncryptedSchema = z\n .object({\n type: z.literal(ReasoningDetailType.Encrypted),\n data: z.string(),\n })\n .extend(CommonReasoningDetailSchema.shape);\n\nexport type ReasoningDetailEncrypted = z.infer<\n typeof ReasoningDetailEncryptedSchema\n>;\n\nexport const ReasoningDetailTextSchema = z\n .object({\n type: z.literal(ReasoningDetailType.Text),\n text: z.string().nullish(),\n signature: z.string().nullish(),\n })\n .extend(CommonReasoningDetailSchema.shape);\n\nexport type ReasoningDetailText = z.infer<typeof ReasoningDetailTextSchema>;\n\nexport const ReasoningDetailUnionSchema = z.union([\n ReasoningDetailSummarySchema,\n ReasoningDetailEncryptedSchema,\n ReasoningDetailTextSchema,\n]);\n\nexport type ReasoningDetailUnion = z.infer<typeof ReasoningDetailUnionSchema>;\n\nconst ReasoningDetailsWithUnknownSchema = z.union([\n ReasoningDetailUnionSchema,\n z.unknown().transform(() => null),\n]);\n\nexport const ReasoningDetailArraySchema = z\n .array(ReasoningDetailsWithUnknownSchema)\n .transform((d) => d.filter((d): d is ReasoningDetailUnion => !!d));\n\nexport const OutputUnionToReasoningDetailsSchema = z.union([\n z\n .object({\n delta: z.object({\n reasoning_details: z.array(ReasoningDetailsWithUnknownSchema),\n }),\n })\n .transform((data) =>\n data.delta.reasoning_details.filter(isDefinedOrNotNull),\n ),\n z\n .object({\n message: z.object({\n reasoning_details: z.array(ReasoningDetailsWithUnknownSchema),\n }),\n })\n .transform((data) =>\n data.message.reasoning_details.filter(isDefinedOrNotNull),\n ),\n z\n .object({\n text: z.string(),\n reasoning_details: z.array(ReasoningDetailsWithUnknownSchema),\n })\n .transform((data) => data.reasoning_details.filter(isDefinedOrNotNull)),\n]);\n","/**\n * Type guard to check if a value is defined and not null\n */\nexport function isDefinedOrNotNull<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n","export enum ReasoningFormat {\n Unknown = 'unknown',\n OpenAIResponsesV1 = 'openai-responses-v1',\n XAIResponsesV1 = 'xai-responses-v1',\n AnthropicClaudeV1 = 'anthropic-claude-v1',\n GoogleGeminiV1 = 'google-gemini-v1',\n}\n\n// Anthropic Claude was the first reasoning that we're\n// passing back and forth\nexport const DEFAULT_REASONING_FORMAT = ReasoningFormat.AnthropicClaudeV1;\n","import type { ChatErrorError } from '@openrouter/sdk/models';\n\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// Use SDK's ChatErrorError type but wrap in response schema\n// SDK type: { code: string | number | null; message: string; param?: string | null; type?: string | null }\nexport const OpenRouterErrorResponseSchema = z\n .object({\n error: z\n .object({\n code: z\n .union([z.string(), z.number()])\n .nullable()\n .optional()\n .default(null),\n message: z.string(),\n type: z.string().nullable().optional().default(null),\n param: z.any().nullable().optional().default(null),\n })\n .passthrough() satisfies z.ZodType<\n Omit<ChatErrorError, 'code'> & { code: string | number | null }\n >,\n })\n .passthrough();\n\nexport type OpenRouterErrorData = z.infer<typeof OpenRouterErrorResponseSchema>;\n\nexport const openrouterFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: OpenRouterErrorResponseSchema,\n errorToMessage: (data: OpenRouterErrorData) => data.error.message,\n});\n","import { z } from 'zod/v4';\nimport { ReasoningDetailUnionSchema } from './reasoning-details';\n\n/**\n * Schema for file annotations from FileParserPlugin\n */\nexport const FileAnnotationSchema = z\n .object({\n type: z.literal('file'),\n file: z\n .object({\n hash: z.string(),\n name: z.string(),\n content: z\n .array(\n z\n .object({\n type: z.string(),\n text: z.string().optional(),\n })\n .catchall(z.any()),\n )\n .optional(),\n })\n .catchall(z.any()),\n })\n .catchall(z.any());\n\nexport type FileAnnotation = z.infer<typeof FileAnnotationSchema>;\n\n/**\n * Schema for OpenRouter provider metadata attached to responses\n */\nexport const OpenRouterProviderMetadataSchema = z\n .object({\n provider: z.string(),\n reasoning_details: z.array(ReasoningDetailUnionSchema).optional(),\n annotations: z.array(FileAnnotationSchema).optional(),\n usage: z\n .object({\n promptTokens: z.number(),\n promptTokensDetails: z\n .object({\n cachedTokens: z.number(),\n })\n .catchall(z.any())\n .optional(),\n completionTokens: z.number(),\n completionTokensDetails: z\n .object({\n reasoningTokens: z.number(),\n })\n .catchall(z.any())\n .optional(),\n totalTokens: z.number(),\n cost: z.number().optional(),\n costDetails: z\n .object({\n upstreamInferenceCost: z.number(),\n })\n .catchall(z.any())\n .optional(),\n })\n .catchall(z.any()),\n })\n .catchall(z.any());\n\nexport type OpenRouterProviderMetadata = z.infer<\n typeof OpenRouterProviderMetadataSchema\n>;\n\n/**\n * Schema for parsing provider options that may contain reasoning_details and annotations\n */\nexport const OpenRouterProviderOptionsSchema = z\n .object({\n openrouter: z\n .object({\n reasoning_details: z.array(ReasoningDetailUnionSchema).optional(),\n annotations: z.array(FileAnnotationSchema).optional(),\n })\n .optional(),\n })\n .optional();\n","import type { LanguageModelV2FinishReason } from '@ai-sdk/provider';\n\nexport function mapOpenRouterFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV2FinishReason {\n switch (finishReason) {\n case 'stop':\n return 'stop';\n case 'length':\n return 'length';\n case 'content_filter':\n return 'content-filter';\n case 'function_call':\n case 'tool_calls':\n return 'tool-calls';\n default:\n return 'unknown';\n }\n}\n","import type { FileAnnotation } from '@/src/schemas/provider-metadata';\nimport type { ReasoningDetailUnion } from '@/src/schemas/reasoning-details';\n\n// Type for OpenRouter Cache Control following Anthropic's pattern\nexport type OpenRouterCacheControl = { type: 'ephemeral' };\n\nexport type OpenRouterChatCompletionsInput = Array<ChatCompletionMessageParam>;\n\nexport type ChatCompletionMessageParam =\n | ChatCompletionSystemMessageParam\n | ChatCompletionUserMessageParam\n | ChatCompletionAssistantMessageParam\n | ChatCompletionToolMessageParam;\n\nexport interface ChatCompletionSystemMessageParam {\n role: 'system';\n content: string;\n cache_control?: OpenRouterCacheControl;\n}\n\nexport interface ChatCompletionUserMessageParam {\n role: 'user';\n content: string | Array<ChatCompletionContentPart>;\n cache_control?: OpenRouterCacheControl;\n}\n\nexport type ChatCompletionContentPart =\n | ChatCompletionContentPartText\n | ChatCompletionContentPartImage\n | ChatCompletionContentPartFile\n | ChatCompletionContentPartInputAudio;\n\nexport interface ChatCompletionContentPartFile {\n type: 'file';\n file: {\n filename: string;\n file_data: string;\n };\n cache_control?: OpenRouterCacheControl;\n}\n\nexport interface ChatCompletionContentPartImage {\n type: 'image_url';\n image_url: {\n url: string;\n };\n cache_control?: OpenRouterCacheControl;\n}\n\nexport interface ChatCompletionContentPartText {\n type: 'text';\n text: string;\n reasoning?: string | null;\n cache_control?: OpenRouterCacheControl;\n}\n\n/** https://openrouter.ai/docs/guides/overview/multimodal/audio */\nexport const OPENROUTER_AUDIO_FORMATS = [\n 'wav',\n 'mp3',\n 'aiff',\n 'aac',\n 'ogg',\n 'flac',\n 'm4a',\n 'pcm16',\n 'pcm24',\n] as const;\n\nexport type OpenRouterAudioFormat = (typeof OPENROUTER_AUDIO_FORMATS)[number];\n\nexport interface ChatCompletionContentPartInputAudio {\n type: 'input_audio';\n input_audio: {\n data: string;\n format: OpenRouterAudioFormat;\n };\n cache_control?: OpenRouterCacheControl;\n}\n\nexport interface ChatCompletionAssistantMessageParam {\n role: 'assistant';\n content?: string | null;\n reasoning?: string | null;\n reasoning_details?: ReasoningDetailUnion[];\n annotations?: FileAnnotation[];\n tool_calls?: Array<ChatCompletionMessageToolCall>;\n cache_control?: OpenRouterCacheControl;\n}\n\nexport interface ChatCompletionMessageToolCall {\n type: 'function';\n id: string;\n function: {\n arguments: string;\n name: string;\n };\n}\n\nexport interface ChatCompletionToolMessageParam {\n role: 'tool';\n content: string;\n tool_call_id: string;\n cache_control?: OpenRouterCacheControl;\n}\n","export function isUrl({\n url,\n protocols,\n}: {\n url: string | URL;\n protocols: Set<`${string}:`>;\n}): boolean {\n try {\n const urlObj = new URL(url);\n // Cast to the literal string due to Set inferred input type\n return protocols.has(urlObj.protocol as `${string}:`);\n } catch (_) {\n return false;\n }\n}\n","import type { LanguageModelV2FilePart } from '@ai-sdk/provider';\nimport type { OpenRouterAudioFormat } from '../types/openrouter-chat-completions-input';\n\nimport { convertUint8ArrayToBase64 } from '@ai-sdk/provider-utils';\nimport { OPENROUTER_AUDIO_FORMATS } from '../types/openrouter-chat-completions-input';\nimport { isUrl } from './is-url';\n\nexport function getFileUrl({\n part,\n defaultMediaType,\n}: {\n part: LanguageModelV2FilePart;\n defaultMediaType: string;\n}) {\n if (part.data instanceof Uint8Array) {\n const base64 = convertUint8ArrayToBase64(part.data);\n return `data:${part.mediaType ?? defaultMediaType};base64,${base64}`;\n }\n\n const stringUrl = part.data.toString();\n\n if (\n isUrl({\n url: stringUrl,\n protocols: new Set(['http:', 'https:'] as const),\n })\n ) {\n return stringUrl;\n }\n\n return stringUrl.startsWith('data:')\n ? stringUrl\n : `data:${part.mediaType ?? defaultMediaType};base64,${stringUrl}`;\n}\n\nexport function getMediaType(\n dataUrl: string,\n defaultMediaType: string,\n): string {\n const match = dataUrl.match(/^data:([^;]+)/);\n return match ? (match[1] ?? defaultMediaType) : defaultMediaType;\n}\n\nexport function getBase64FromDataUrl(dataUrl: string): string {\n const match = dataUrl.match(/^data:[^;]*;base64,(.+)$/);\n return match ? match[1]! : dataUrl;\n}\n\n/** MIME type to format mapping for normalization */\nexport const MIME_TO_FORMAT: Record<string, OpenRouterAudioFormat> = {\n // MP3 variants\n mpeg: 'mp3',\n mp3: 'mp3',\n // WAV variants\n 'x-wav': 'wav',\n wave: 'wav',\n wav: 'wav',\n // OGG variants\n ogg: 'ogg',\n vorbis: 'ogg',\n // AAC variants\n aac: 'aac',\n 'x-aac': 'aac',\n // M4A variants\n m4a: 'm4a',\n 'x-m4a': 'm4a',\n mp4: 'm4a',\n // AIFF variants\n aiff: 'aiff',\n 'x-aiff': 'aiff',\n // FLAC\n flac: 'flac',\n 'x-flac': 'flac',\n // PCM variants\n pcm16: 'pcm16',\n pcm24: 'pcm24',\n};\n\n/**\n * Converts an audio file part to OpenRouter's input_audio data format.\n *\n * This function extracts base64-encoded audio data from a file part and\n * normalizes the format to one of the supported OpenRouter audio formats.\n *\n * @param part - The file part containing audio data. Must have a mediaType\n * starting with \"audio/\" and contain either base64 data or a data URL.\n *\n * @returns An object with `data` (base64-encoded audio) and `format`\n * suitable for use in OpenRouter's `input_audio` field.\n *\n * @throws {Error} When audio is provided as an HTTP/HTTPS URL. OpenRouter requires\n * audio to be base64-encoded inline. The error message includes instructions for\n * downloading and encoding the audio locally.\n *\n * @throws {Error} When the audio format is not supported.\n *\n * @example\n * ```ts\n * const audioData = getInputAudioData(filePart);\n * // Returns: { data: \"base64string...\", format: \"mp3\" }\n * ```\n */\nexport function getInputAudioData(part: LanguageModelV2FilePart): {\n data: string;\n format: OpenRouterAudioFormat;\n} {\n const fileData = getFileUrl({\n part,\n defaultMediaType: 'audio/mpeg',\n });\n\n // OpenRouter's input_audio doesn't support URLs directly\n if (\n isUrl({\n url: fileData,\n protocols: new Set(['http:', 'https:'] as const),\n })\n ) {\n throw new Error(\n `Audio files cannot be provided as URLs.\\n\\n` +\n `OpenRouter requires audio to be base64-encoded. Please:\\n` +\n `1. Download the audio file locally\\n` +\n `2. Read it as a Buffer or Uint8Array\\n` +\n `3. Pass it as the data parameter\\n\\n` +\n `The AI SDK will automatically handle base64 encoding.\\n\\n` +\n `Learn more: https://openrouter.ai/docs/features/multimodal/audio`,\n );\n }\n\n // Extract base64 data (handles both data URLs and raw base64)\n const data = getBase64FromDataUrl(fileData);\n\n // Map media type to format\n const mediaType = part.mediaType || 'audio/mpeg';\n const rawFormat = mediaType.replace('audio/', '');\n\n // Normalize format names for OpenRouter using MIME type mapping\n const format = MIME_TO_FORMAT[rawFormat];\n\n if (format === undefined) {\n const supportedList = OPENROUTER_AUDIO_FORMATS.join(', ');\n throw new Error(\n `Unsupported audio format: \"${mediaType}\"\\n\\n` +\n `OpenRouter supports the following audio formats: ${supportedList}\\n\\n` +\n `Learn more: https://openrouter.ai/docs/features/multimodal/audio`,\n );\n }\n\n return { data, format };\n}\n","import type {\n LanguageModelV2FilePart,\n LanguageModelV2Prompt,\n LanguageModelV2TextPart,\n LanguageModelV2ToolResultPart,\n SharedV2ProviderMetadata,\n} from '@ai-sdk/provider';\nimport type { ReasoningDetailUnion } from '../schemas/reasoning-details';\nimport type {\n ChatCompletionContentPart,\n OpenRouterChatCompletionsInput,\n} from '../types/openrouter-chat-completions-input';\n\nimport { OpenRouterProviderOptionsSchema } from '../schemas/provider-metadata';\nimport { getFileUrl, getInputAudioData } from './file-url-utils';\nimport { isUrl } from './is-url';\n\n// Type for OpenRouter Cache Control following Anthropic's pattern\nexport type OpenRouterCacheControl = { type: 'ephemeral' };\n\nfunction getCacheControl(\n providerMetadata: SharedV2ProviderMetadata | undefined,\n): OpenRouterCacheControl | undefined {\n const anthropic = providerMetadata?.anthropic;\n const openrouter = providerMetadata?.openrouter;\n\n // Allow both cacheControl and cache_control:\n return (openrouter?.cacheControl ??\n openrouter?.cache_control ??\n anthropic?.cacheControl ??\n anthropic?.cache_control) as OpenRouterCacheControl | undefined;\n}\n\nexport function convertToOpenRouterChatMessages(\n prompt: LanguageModelV2Prompt,\n): OpenRouterChatCompletionsInput {\n const messages: OpenRouterChatCompletionsInput = [];\n for (const { role, content, providerOptions } of prompt) {\n switch (role) {\n case 'system': {\n messages.push({\n role: 'system',\n content,\n cache_control: getCacheControl(providerOptions),\n });\n break;\n }\n\n case 'user': {\n if (content.length === 1 && content[0]?.type === 'text') {\n const cacheControl =\n getCacheControl(providerOptions) ??\n getCacheControl(content[0].providerOptions);\n const contentWithCacheControl: string | ChatCompletionContentPart[] =\n cacheControl\n ? [\n {\n type: 'text',\n text: content[0].text,\n cache_control: cacheControl,\n },\n ]\n : content[0].text;\n messages.push({\n role: 'user',\n content: contentWithCacheControl,\n });\n break;\n }\n\n // Get message level cache control\n const messageCacheControl = getCacheControl(providerOptions);\n const contentParts: ChatCompletionContentPart[] = content.map(\n (part: LanguageModelV2TextPart | LanguageModelV2FilePart) => {\n const cacheControl =\n getCacheControl(part.providerOptions) ?? messageCacheControl;\n\n switch (part.type) {\n case 'text':\n return {\n type: 'text' as const,\n text: part.text,\n // For text parts, only use part-specific cache control\n cache_control: cacheControl,\n };\n case 'file': {\n if (part.mediaType?.startsWith('image/')) {\n const url = getFileUrl({\n part,\n defaultMediaType: 'image/jpeg',\n });\n return {\n type: 'image_url' as const,\n image_url: {\n url,\n },\n // For image parts, use part-specific or message-level cache control\n cache_control: cacheControl,\n };\n }\n\n // Handle audio files for input_audio format\n if (part.mediaType?.startsWith('audio/')) {\n return {\n type: 'input_audio' as const,\n input_audio: getInputAudioData(part),\n cache_control: cacheControl,\n };\n }\n\n const fileName = String(\n part.providerOptions?.openrouter?.filename ??\n part.filename ??\n '',\n );\n\n const fileData = getFileUrl({\n part,\n defaultMediaType: 'application/pdf',\n });\n\n if (\n isUrl({\n url: fileData,\n protocols: new Set(['http:', 'https:'] as const),\n })\n ) {\n return {\n type: 'file' as const,\n file: {\n filename: fileName,\n file_data: fileData,\n },\n } satisfies ChatCompletionContentPart;\n }\n\n return {\n type: 'file' as const,\n file: {\n filename: fileName,\n file_data: fileData,\n },\n cache_control: cacheControl,\n } satisfies ChatCompletionContentPart;\n }\n default: {\n return {\n type: 'text' as const,\n text: '',\n cache_control: cacheControl,\n };\n }\n }\n },\n );\n\n // For multi-part messages, don't add cache_control at the root level\n messages.push({\n role: 'user',\n content: contentParts,\n });\n\n break;\n }\n\n case 'assistant': {\n let text = '';\n let reasoning = '';\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }> = [];\n const accumulatedReasoningDetails: ReasoningDetailUnion[] = [];\n\n for (const part of content) {\n switch (part.type) {\n case 'text': {\n text += part.text;\n\n break;\n }\n case 'tool-call': {\n const partReasoningDetails = (\n part.providerOptions as Record<string, unknown>\n )?.openrouter as Record<string, unknown> | undefined;\n if (\n partReasoningDetails?.reasoning_details &&\n Array.isArray(partReasoningDetails.reasoning_details)\n ) {\n accumulatedReasoningDetails.push(\n ...(partReasoningDetails.reasoning_details as ReasoningDetailUnion[]),\n );\n }\n toolCalls.push({\n id: part.toolCallId,\n type: 'function',\n function: {\n name: part.toolName,\n arguments: JSON.stringify(part.input),\n },\n });\n break;\n }\n case 'reasoning': {\n reasoning += part.text;\n const parsedPartProviderOptions =\n OpenRouterProviderOptionsSchema.safeParse(part.providerOptions);\n if (\n parsedPartProviderOptions.success &&\n parsedPartProviderOptions.data?.openrouter?.reasoning_details\n ) {\n accumulatedReasoningDetails.push(\n ...parsedPartProviderOptions.data.openrouter\n .reasoning_details,\n );\n }\n break;\n }\n\n case 'file':\n break;\n default: {\n break;\n }\n }\n }\n\n // Check message-level providerOptions for preserved reasoning_details and annotations\n const parsedProviderOptions =\n OpenRouterProviderOptionsSchema.safeParse(providerOptions);\n const messageReasoningDetails = parsedProviderOptions.success\n ? parsedProviderOptions.data?.openrouter?.reasoning_details\n : undefined;\n const messageAnnotations = parsedProviderOptions.success\n ? parsedProviderOptions.data?.openrouter?.annotations\n : undefined;\n\n // Use message-level reasoning_details if available, otherwise use accumulated from parts\n const finalReasoningDetails =\n messageReasoningDetails &&\n Array.isArray(messageReasoningDetails) &&\n messageReasoningDetails.length > 0\n ? messageReasoningDetails\n : accumulatedReasoningDetails.length > 0\n ? accumulatedReasoningDetails\n : undefined;\n\n messages.push({\n role: 'assistant',\n content: text,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n reasoning: reasoning || undefined,\n reasoning_details: finalReasoningDetails,\n annotations: messageAnnotations,\n cache_control: getCacheControl(providerOptions),\n });\n\n break;\n }\n\n case 'tool': {\n for (const toolResponse of content) {\n const content = getToolResultContent(toolResponse);\n\n messages.push({\n role: 'tool',\n tool_call_id: toolResponse.toolCallId,\n content,\n cache_control:\n getCacheControl(providerOptions) ??\n getCacheControl(toolResponse.providerOptions),\n });\n }\n break;\n }\n\n default: {\n break;\n }\n }\n }\n\n return messages;\n}\n\nfunction getToolResultContent(input: LanguageModelV2ToolResultPart): string {\n return input.output.type === 'text'\n ? input.output.value\n : JSON.stringify(input.output.value);\n}\n","import type { LanguageModelV2ToolChoice } from '@ai-sdk/provider';\n\nimport { InvalidArgumentError } from '@ai-sdk/provider';\nimport { z } from 'zod/v4';\n\nconst ChatCompletionToolChoiceSchema = z.union([\n z.literal('auto'),\n z.literal('none'),\n z.literal('required'),\n z.object({\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n }),\n }),\n]);\n\ntype ChatCompletionToolChoice = z.infer<typeof ChatCompletionToolChoiceSchema>;\n\nexport function getChatCompletionToolChoice(\n toolChoice: LanguageModelV2ToolChoice,\n): ChatCompletionToolChoice {\n switch (toolChoice.type) {\n case 'auto':\n case 'none':\n case 'required':\n return toolChoice.type;\n case 'tool': {\n return {\n type: 'function',\n function: { name: toolChoice.toolName },\n };\n }\n default: {\n toolChoice satisfies never;\n throw new InvalidArgumentError({\n argument: 'toolChoice',\n message: `Invalid tool choice type: ${JSON.stringify(toolChoice)}`,\n });\n }\n }\n}\n","import { z } from 'zod/v4';\nimport { OpenRouterErrorResponseSchema } from '../schemas/error-response';\nimport { ImageResponseArraySchema } from '../schemas/image';\nimport { ReasoningDetailArraySchema } from '../schemas/reasoning-details';\n\nconst OpenRouterChatCompletionBaseResponseSchema = z\n .object({\n id: z.string().optional(),\n model: z.string().optional(),\n provider: z.string().optional(),\n usage: z\n .object({\n prompt_tokens: z.number(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number(),\n })\n .passthrough()\n .nullish(),\n completion_tokens: z.number(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number(),\n })\n .passthrough()\n .nullish(),\n total_tokens: z.number(),\n cost: z.number().optional(),\n cost_details: z\n .object({\n upstream_inference_cost: z.number().nullish(),\n })\n .passthrough()\n .nullish(),\n })\n .passthrough()\n .nullish(),\n })\n .passthrough();\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nexport const OpenRouterNonStreamChatCompletionResponseSchema = z.union([\n // Success response with choices\n OpenRouterChatCompletionBaseResponseSchema.extend({\n choices: z.array(\n z\n .object({\n message: z\n .object({\n role: z.literal('assistant'),\n content: z.string().nullable().optional(),\n reasoning: z.string().nullable().optional(),\n reasoning_details: ReasoningDetailArraySchema.nullish(),\n images: ImageResponseArraySchema.nullish(),\n\n tool_calls: z\n .array(\n z\n .object({\n id: z.string().optional().nullable(),\n type: z.literal('function'),\n function: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .passthrough(),\n })\n .passthrough(),\n )\n .optional(),\n\n annotations: z\n .array(\n z.union([\n // URL citation from web search\n z\n .object({\n type: z.literal('url_citation'),\n url_citation: z\n .object({\n end_index: z.number(),\n start_index: z.number(),\n title: z.string(),\n url: z.string(),\n content: z.string().optional(),\n })\n .passthrough(),\n })\n .passthrough(),\n // File annotation from FileParserPlugin (old format)\n z\n .object({\n type: z.literal('file_annotation'),\n file_annotation: z\n .object({\n file_id: z.string(),\n quote: z.string().optional(),\n })\n .passthrough(),\n })\n .passthrough(),\n // File annotation from FileParserPlugin (new format)\n z\n .object({\n type: z.literal('file'),\n file: z\n .object({\n hash: z.string(),\n name: z.string(),\n content: z\n .array(\n z\n .object({\n type: z.string(),\n text: z.string().optional(),\n })\n .passthrough(),\n )\n .optional(),\n })\n .passthrough(),\n })\n .passthrough(),\n ]),\n )\n .nullish(),\n })\n .passthrough(),\n index: z.number().nullish(),\n logprobs: z\n .object({\n content: z\n .array(\n z\n .object({\n token: z.string(),\n logprob: z.number(),\n top_logprobs: z.array(\n z\n .object({\n token: z.string(),\n logprob: z.number(),\n })\n .passthrough(),\n ),\n })\n .passthrough(),\n )\n .nullable(),\n })\n .passthrough()\n .nullable()\n .optional(),\n finish_reason: z.string().optional().nullable(),\n })\n .passthrough(),\n ),\n }),\n // Error response (HTTP 200 with error payload)\n OpenRouterErrorResponseSchema.extend({\n user_id: z.string().optional(),\n }),\n]);\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nexport const OpenRouterStreamChatCompletionChunkSchema = z.union([\n OpenRouterChatCompletionBaseResponseSchema.extend({\n choices: z.array(\n z\n .object({\n delta: z\n .object({\n role: z.enum(['assistant']).optional(),\n content: z.string().nullish(),\n reasoning: z.string().nullish().optional(),\n reasoning_details: ReasoningDetailArraySchema.nullish(),\n images: ImageResponseArraySchema.nullish(),\n tool_calls: z\n .array(\n z\n .object({\n index: z.number().nullish(),\n id: z.string().nullish(),\n type: z.literal('function').optional(),\n function: z\n .object({\n name: z.string().nullish(),\n arguments: z.string().nullish(),\n })\n .passthrough(),\n })\n .passthrough(),\n )\n .nullish(),\n\n annotations: z\n .array(\n z.union([\n // URL citation from web search\n z\n .object({\n type: z.literal('url_citation'),\n url_citation: z\n .object({\n end_index: z.number(),\n start_index: z.number(),\n title: z.string(),\n url: z.string(),\n content: z.string().optional(),\n })\n .passthrough(),\n })\n .passthrough(),\n // File annotation from FileParserPlugin (old format)\n z\n .object({\n type: z.literal('file_annotation'),\n file_annotation: z\n .object({\n file_id: z.string(),\n quote: z.string().optional(),\n })\n .passthrough(),\n })\n .passthrough(),\n // File annotation from FileParserPlugin (new format)\n z\n .object({\n type: z.literal('file'),\n file: z\n .object({\n hash: z.string(),\n name: z.string(),\n content: z\n .array(\n z\n .object({\n type: z.string(),\n text: z.string().optional(),\n })\n .passthrough(),\n )\n .optional(),\n })\n .passthrough(),\n })\n .passthrough(),\n ]),\n )\n .nullish(),\n })\n .passthrough()\n .nullish(),\n logprobs: z\n .object({\n content: z\n .array(\n z\n .object({\n token: z.string(),\n logprob: z.number(),\n top_logprobs: z.array(\n z\n .object({\n token: z.string(),\n logprob: z.number(),\n })\n .passthrough(),\n ),\n })\n .passthrough(),\n )\n .nullable(),\n })\n .passthrough()\n .nullish(),\n finish_reason: z.string().nullable().optional(),\n index: z.number().nullish(),\n })\n .passthrough(),\n ),\n }),\n OpenRouterErrorResponseSchema,\n]);\n","import { z } from 'zod/v4';\n\nconst ImageResponseSchema = z\n .object({\n type: z.literal('image_url'),\n image_url: z\n .object({\n url: z.string(),\n })\n .passthrough(),\n })\n .passthrough();\n\nexport type ImageResponse = z.infer<typeof ImageResponseSchema>;\n\nconst ImageResponseWithUnknownSchema = z.union([\n ImageResponseSchema,\n z.unknown().transform(() => null),\n]);\n\nexport const ImageResponseArraySchema = z\n .array(ImageResponseWithUnknownSchema)\n .transform((d) => d.filter((d): d is ImageResponse => !!d));\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2CallWarning,\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2FunctionTool,\n LanguageModelV2ResponseMetadata,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n} from '@ai-sdk/provider';\nimport type { ParseResult } from '@ai-sdk/provider-utils';\nimport type { FinishReason } from 'ai';\nimport type { z } from 'zod/v4';\nimport type { ReasoningDetailUnion } from '@/src/schemas/reasoning-details';\nimport type { FileAnnotation } from '../schemas/provider-metadata';\nimport type { OpenRouterUsageAccounting } from '@/src/types/index';\nimport type {\n OpenRouterChatModelId,\n OpenRouterChatSettings,\n} from '../types/openrouter-chat-settings';\n\nimport {\n APICallError,\n InvalidResponseDataError,\n NoContentGeneratedError,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId,\n isParsableJson,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { ReasoningDetailType } from '@/src/schemas/reasoning-details';\nimport { openrouterFailedResponseHandler } from '../schemas/error-response';\nimport { OpenRouterProviderMetadataSchema } from '../schemas/provider-metadata';\nimport { mapOpenRouterFinishReason } from '../utils/map-finish-reason';\nimport { convertToOpenRouterChatMessages } from './convert-to-openrouter-chat-messages';\nimport { getBase64FromDataUrl, getMediaType } from './file-url-utils';\nimport { getChatCompletionToolChoice } from './get-tool-choice';\nimport {\n OpenRouterNonStreamChatCompletionResponseSchema,\n OpenRouterStreamChatCompletionChunkSchema,\n} from './schemas';\n\ntype OpenRouterChatConfig = {\n provider: string;\n compatibility: 'strict' | 'compatible';\n headers: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: typeof fetch;\n extraBody?: Record<string, unknown>;\n};\n\nexport class OpenRouterChatLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2' as const;\n readonly provider = 'openrouter';\n readonly defaultObjectGenerationMode = 'tool' as const;\n\n readonly modelId: OpenRouterChatModelId;\n readonly supportsImageUrls = true;\n readonly supportedUrls: Record<string, RegExp[]> = {\n 'image/*': [\n /^data:image\\/[a-zA-Z]+;base64,/,\n /^https?:\\/\\/.+\\.(jpg|jpeg|png|gif|webp)$/i,\n ],\n // 'text/*': [/^data:text\\//, /^https?:\\/\\/.+$/],\n 'application/*': [/^data:application\\//, /^https?:\\/\\/.+$/],\n };\n readonly settings: OpenRouterChatSettings;\n\n private readonly config: OpenRouterChatConfig;\n\n constructor(\n modelId: OpenRouterChatModelId,\n settings: OpenRouterChatSettings,\n config: OpenRouterChatConfig,\n ) {\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n }\n\n private getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n frequencyPenalty,\n presencePenalty,\n seed,\n stopSequences,\n responseFormat,\n topK,\n tools,\n toolChoice,\n }: LanguageModelV2CallOptions) {\n const baseArgs = {\n // model id:\n model: this.modelId,\n models: this.settings.models,\n\n // model specific settings:\n logit_bias: this.settings.logitBias,\n logprobs:\n this.settings.logprobs === true ||\n typeof this.settings.logprobs === 'number'\n ? true\n : undefined,\n top_logprobs:\n typeof this.settings.logprobs === 'number'\n ? this.settings.logprobs\n : typeof this.settings.logprobs === 'boolean'\n ? this.settings.logprobs\n ? 0\n : undefined\n : undefined,\n user: this.settings.user,\n parallel_tool_calls: this.settings.parallelToolCalls,\n\n // standardized settings:\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n seed,\n\n stop: stopSequences,\n response_format:\n responseFormat?.type === 'json'\n ? responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n strict: true,\n name: responseFormat.name ?? 'response',\n ...(responseFormat.description && {\n description: responseFormat.description,\n }),\n },\n }\n : { type: 'json_object' }\n : undefined,\n top_k: topK,\n\n // messages:\n messages: convertToOpenRouterChatMessages(prompt),\n\n // OpenRouter specific settings:\n include_reasoning: this.settings.includeReasoning,\n reasoning: this.settings.reasoning,\n usage: this.settings.usage,\n\n // Web search settings:\n plugins: this.settings.plugins,\n web_search_options: this.settings.web_search_options,\n // Provider routing settings:\n provider: this.settings.provider,\n // Debug settings:\n debug: this.settings.debug,\n\n // extra body:\n ...this.config.extraBody,\n ...this.settings.extraBody,\n };\n\n if (tools && tools.length > 0) {\n // TODO: support built-in tools\n const mappedTools = tools\n .filter(\n (tool): tool is LanguageModelV2FunctionTool =>\n tool.type === 'function',\n )\n .map((tool) => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n\n return {\n ...baseArgs,\n tools: mappedTools,\n tool_choice: toolChoice\n ? getChatCompletionToolChoice(toolChoice)\n : undefined,\n };\n }\n\n return baseArgs;\n }\n\n async doGenerate(options: LanguageModelV2CallOptions): Promise<{\n content: Array<LanguageModelV2Content>;\n finishReason: LanguageModelV2FinishReason;\n usage: LanguageModelV2Usage;\n warnings: Array<LanguageModelV2CallWarning>;\n providerMetadata?: {\n openrouter: {\n provider: string;\n reasoning_details?: ReasoningDetailUnion[];\n usage: OpenRouterUsageAccounting;\n };\n };\n request?: { body?: unknown };\n response?: LanguageModelV2ResponseMetadata & {\n headers?: SharedV2Headers;\n body?: unknown;\n };\n }> {\n const providerOptions = options.providerOptions || {};\n const openrouterOptions = providerOptions.openrouter || {};\n\n const args = {\n ...this.getArgs(options),\n ...openrouterOptions,\n };\n\n const { value: responseValue, responseHeaders } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: args,\n failedResponseHandler: openrouterFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n OpenRouterNonStreamChatCompletionResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n // Check if response is an error (HTTP 200 with error payload)\n if ('error' in responseValue) {\n const errorData = responseValue.error as {\n message: string;\n code?: string;\n };\n throw new APICallError({\n message: errorData.message,\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n requestBodyValues: args,\n statusCode: 200,\n responseHeaders,\n data: errorData,\n });\n }\n\n // Now TypeScript knows this is the success response\n const response = responseValue;\n\n const choice = response.choices[0];\n\n if (!choice) {\n throw new NoContentGeneratedError({\n message: 'No choice in response',\n });\n }\n\n // Extract detailed usage information\n const usageInfo: LanguageModelV2Usage = response.usage\n ? {\n inputTokens: response.usage.prompt_tokens ?? 0,\n outputTokens: response.usage.completion_tokens ?? 0,\n totalTokens:\n (response.usage.prompt_tokens ?? 0) +\n (response.usage.completion_tokens ?? 0),\n reasoningTokens:\n response.usage.completion_tokens_details?.reasoning_tokens ?? 0,\n cachedInputTokens:\n response.usage.prompt_tokens_details?.cached_tokens ?? 0,\n }\n : {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n reasoningTokens: 0,\n cachedInputTokens: 0,\n };\n\n const reasoningDetails = choice.message.reasoning_details ?? [];\n\n const reasoning: Array<LanguageModelV2Content> =\n reasoningDetails.length > 0\n ? (reasoningDetails\n .map((detail) => {\n switch (detail.type) {\n case ReasoningDetailType.Text: {\n if (detail.text) {\n return {\n type: 'reasoning' as const,\n text: detail.text,\n providerMetadata: {\n openrouter: {\n reasoning_details: [detail],\n },\n },\n };\n }\n break;\n }\n case ReasoningDetailType.Summary: {\n if (detail.summary) {\n return {\n type: 'reasoning' as const,\n text: detail.summary,\n providerMetadata: {\n openrouter: {\n reasoning_details: [detail],\n },\n },\n };\n }\n break;\n }\n case ReasoningDetailType.Encrypted: {\n // For encrypted reasoning, we include a redacted placeholder\n if (detail.data) {\n return {\n type: 'reasoning' as const,\n text: '[REDACTED]',\n providerMetadata: {\n openrouter: {\n reasoning_details: [detail],\n },\n },\n };\n }\n break;\n }\n default: {\n detail satisfies never;\n }\n }\n return null;\n })\n .filter((p) => p !== null) as Array<LanguageModelV2Content>)\n : choice.message.reasoning\n ? [\n {\n type: 'reasoning' as const,\n text: choice.message.reasoning,\n },\n ]\n : [];\n\n const content: Array<LanguageModelV2Content> = [];\n\n // Add reasoning content first\n content.push(...reasoning);\n\n if (choice.message.content) {\n content.push({\n type: 'text' as const,\n text: choice.message.content,\n });\n }\n\n if (choice.message.tool_calls) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'tool-call' as const,\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments,\n providerMetadata: {\n openrouter: {\n reasoning_details: reasoningDetails,\n },\n },\n });\n }\n }\n\n if (choice.message.images) {\n for (const image of choice.message.images) {\n content.push({\n type: 'file' as const,\n mediaType: getMediaType(image.image_url.url, 'image/jpeg'),\n data: getBase64FromDataUrl(image.image_url.url),\n });\n }\n }\n\n if (choice.message.annotations) {\n for (const annotation of choice.message.annotations) {\n if (annotation.type === 'url_citation') {\n content.push({\n type: 'source' as const,\n sourceType: 'url' as const,\n id: annotation.url_citation.url,\n url: annotation.url_citation.url,\n title: annotation.url_citation.title,\n providerMetadata: {\n openrouter: {\n content: annotation.url_citation.content || '',\n },\n },\n });\n }\n }\n }\n\n // Extract file annotations to expose in providerMetadata\n const fileAnnotations = choice.message.annotations?.filter(\n (\n a,\n ): a is {\n type: 'file';\n file: {\n hash: string;\n name: string;\n content?: Array<{ type: string; text?: string }>;\n };\n } => a.type === 'file',\n );\n\n // Fix for Gemini 3 thoughtSignature: when there are tool calls with encrypted\n // reasoning (thoughtSignature), the model returns 'stop' but expects continuation.\n // Override to 'tool-calls' so the SDK knows to continue the conversation.\n const hasToolCalls =\n choice.message.tool_calls && choice.message.tool_calls.length > 0;\n const hasEncryptedReasoning = reasoningDetails.some(\n (d) => d.type === ReasoningDetailType.Encrypted && d.data,\n );\n const shouldOverrideFinishReason =\n hasToolCalls && hasEncryptedReasoning && choice.finish_reason === 'stop';\n\n const effectiveFinishReason = shouldOverrideFinishReason\n ? 'tool-calls'\n : mapOpenRouterFinishReason(choice.finish_reason);\n\n return {\n content,\n finishReason: effectiveFinishReason,\n usage: usageInfo,\n warnings: [],\n providerMetadata: {\n openrouter: OpenRouterProviderMetadataSchema.parse({\n provider: response.provider ?? '',\n reasoning_details: choice.message.reasoning_details ?? [],\n annotations:\n fileAnnotations && fileAnnotations.length > 0\n ? fileAnnotations\n : undefined,\n usage: {\n promptTokens: usageInfo.inputTokens ?? 0,\n completionTokens: usageInfo.outputTokens ?? 0,\n totalTokens: usageInfo.totalTokens ?? 0,\n cost: response.usage?.cost,\n ...(response.usage?.prompt_tokens_details?.cached_tokens != null\n ? {\n promptTokensDetails: {\n cachedTokens:\n response.usage.prompt_tokens_details.cached_tokens,\n },\n }\n : {}),\n ...(response.usage?.completion_tokens_details?.reasoning_tokens !=\n null\n ? {\n completionTokensDetails: {\n reasoningTokens:\n response.usage.completion_tokens_details.reasoning_tokens,\n },\n }\n : {}),\n ...(response.usage?.cost_details?.upstream_inference_cost != null\n ? {\n costDetails: {\n upstreamInferenceCost:\n response.usage.cost_details.upstream_inference_cost,\n },\n }\n : {}),\n },\n }),\n },\n request: { body: args },\n response: {\n id: response.id,\n modelId: response.model,\n headers: responseHeaders,\n },\n };\n }\n\n async doStream(options: LanguageModelV2CallOptions): Promise<{\n stream: ReadableStream<LanguageModelV2StreamPart>;\n warnings: Array<LanguageModelV2CallWarning>;\n request?: { body?: unknown };\n response?: LanguageModelV2ResponseMetadata & {\n headers?: SharedV2Headers;\n body?: unknown;\n };\n }> {\n const providerOptions = options.providerOptions || {};\n const openrouterOptions = providerOptions.openrouter || {};\n\n const args = {\n ...this.getArgs(options),\n ...openrouterOptions,\n };\n\n const { value: response, responseHeaders } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: {\n ...args,\n stream: true,\n\n // only include stream_options when in strict compatibility mode:\n stream_options:\n this.config.compatibility === 'strict'\n ? {\n include_usage: true,\n // If user has requested usage accounting, make sure we get it in the stream\n ...(this.settings.usage?.include\n ? { include_usage: true }\n : {}),\n }\n : undefined,\n },\n failedResponseHandler: openrouterFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n OpenRouterStreamChatCompletionChunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n inputStarted: boolean;\n sent: boolean;\n }> = [];\n\n let finishReason: FinishReason = 'other';\n const usage: LanguageModelV2Usage = {\n inputTokens: Number.NaN,\n outputTokens: Number.NaN,\n totalTokens: Number.NaN,\n reasoningTokens: Number.NaN,\n cachedInputTokens: Number.NaN,\n };\n\n // Track provider-specific usage information\n const openrouterUsage: Partial<OpenRouterUsageAccounting> = {};\n\n // Track reasoning details to preserve for multi-turn conversations\n const accumulatedReasoningDetails: ReasoningDetailUnion[] = [];\n\n // Track file annotations to expose in providerMetadata\n const accumulatedFileAnnotations: FileAnnotation[] = [];\n\n let textStarted = false;\n let reasoningStarted = false;\n let textId: string | undefined;\n let reasoningId: string | undefined;\n let openrouterResponseId: string | undefined;\n let provider: string | undefined;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<\n z.infer<typeof OpenRouterStreamChatCompletionChunkSchema>\n >,\n LanguageModelV2StreamPart\n >({\n transform(chunk, controller) {\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = 'error';\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const value = chunk.value;\n\n // handle error chunks:\n if ('error' in value) {\n finishReason = 'error';\n controller.enqueue({ type: 'error', error: value.error });\n return;\n }\n\n if (value.provider) {\n provider = value.provider;\n }\n\n if (value.id) {\n openrouterResponseId = value.id;\n controller.enqueue({\n type: 'response-metadata',\n id: value.id,\n });\n }\n\n if (value.model) {\n controller.enqueue({\n type: 'response-metadata',\n modelId: value.model,\n });\n }\n\n if (value.usage != null) {\n usage.inputTokens = value.usage.prompt_tokens;\n usage.outputTokens = value.usage.completion_tokens;\n usage.totalTokens =\n value.usage.prompt_tokens + value.usage.completion_tokens;\n\n // Collect OpenRouter specific usage information\n openrouterUsage.promptTokens = value.usage.prompt_tokens;\n\n if (value.usage.prompt_tokens_details) {\n const cachedInputTokens =\n value.usage.prompt_tokens_details.cached_tokens ?? 0;\n\n usage.cachedInputTokens = cachedInputTokens;\n openrouterUsage.promptTokensDetails = {\n cachedTokens: cachedInputTokens,\n };\n }\n\n openrouterUsage.completionTokens = value.usage.completion_tokens;\n if (value.usage.completion_tokens_details) {\n const reasoningTokens =\n value.usage.completion_tokens_details.reasoning_tokens ?? 0;\n\n usage.reasoningTokens = reasoningTokens;\n openrouterUsage.completionTokensDetails = {\n reasoningTokens,\n };\n }\n\n openrouterUsage.cost = value.usage.cost;\n openrouterUsage.totalTokens = value.usage.total_tokens;\n const upstreamInferenceCost =\n value.usage.cost_details?.upstream_inference_cost;\n if (upstreamInferenceCost != null) {\n openrouterUsage.costDetails = {\n upstreamInferenceCost,\n };\n }\n }\n\n const choice = value.choices[0];\n\n if (choice?.finish_reason != null) {\n finishReason = mapOpenRouterFinishReason(choice.finish_reason);\n }\n\n if (choice?.delta == null) {\n return;\n }\n\n const delta = choice.delta;\n\n const emitReasoningChunk = (\n chunkText: string,\n providerMetadata?: SharedV2ProviderMetadata,\n ) => {\n if (!reasoningStarted) {\n reasoningId = openrouterResponseId || generateId();\n controller.enqueue({\n providerMetadata,\n type: 'reasoning-start',\n id: reasoningId,\n });\n reasoningStarted = true;\n }\n controller.enqueue({\n providerMetadata,\n type: 'reasoning-delta',\n delta: chunkText,\n id: reasoningId || generateId(),\n });\n };\n\n if (delta.reasoning_details && delta.reasoning_details.length > 0) {\n // Accumulate reasoning_details to preserve for multi-turn conversations\n // Merge consecutive reasoning.text items into a single entry\n for (const detail of delta.reasoning_details) {\n if (detail.type === ReasoningDetailType.Text) {\n const lastDetail =\n accumulatedReasoningDetails[\n accumulatedReasoningDetails.length - 1\n ];\n if (lastDetail?.type === ReasoningDetailType.Text) {\n // Merge with the previous text detail\n lastDetail.text =\n (lastDetail.text || '') + (detail.text || '');\n\n lastDetail.signature =\n lastDetail.signature || detail.signature;\n\n lastDetail.format = lastDetail.format || detail.format;\n } else {\n // Start a new text detail\n accumulatedReasoningDetails.push({ ...detail });\n }\n } else {\n // Non-text details (encrypted, summary) are pushed as-is\n accumulatedReasoningDetails.push(detail);\n }\n }\n\n // Emit reasoning_details in providerMetadata for each delta chunk\n // so users can accumulate them on their end before sending back\n const reasoningMetadata: SharedV2ProviderMetadata = {\n openrouter: {\n reasoning_details: delta.reasoning_details,\n },\n };\n\n for (const detail of delta.reasoning_details) {\n switch (detail.type) {\n case ReasoningDetailType.Text: {\n if (detail.text) {\n emitReasoningChunk(detail.text, reasoningMetadata);\n }\n break;\n }\n case ReasoningDetailType.Encrypted: {\n if (detail.data) {\n emitReasoningChunk('[REDACTED]', reasoningMetadata);\n }\n break;\n }\n case ReasoningDetailType.Summary: {\n if (detail.summary) {\n emitReasoningChunk(detail.summary, reasoningMetadata);\n }\n break;\n }\n default: {\n detail satisfies never;\n break;\n }\n }\n }\n } else if (delta.reasoning) {\n emitReasoningChunk(delta.reasoning);\n }\n\n if (delta.content) {\n // If reasoning was previously active and now we're starting text content,\n // we should end the reasoning first to maintain proper order\n if (reasoningStarted && !textStarted) {\n controller.enqueue({\n type: 'reasoning-end',\n id: reasoningId || generateId(),\n });\n reasoningStarted = false; // Mark as ended so we don't end it again in flush\n }\n\n if (!textStarted) {\n textId = openrouterResponseId || generateId();\n controller.enqueue({\n type: 'text-start',\n id: textId,\n });\n textStarted = true;\n }\n controller.enqueue({\n type: 'text-delta',\n delta: delta.content,\n id: textId || generateId(),\n });\n }\n\n if (delta.annotations) {\n for (const annotation of delta.annotations) {\n if (annotation.type === 'url_citation') {\n controller.enqueue({\n type: 'source',\n sourceType: 'url' as const,\n id: annotation.url_citation.url,\n url: annotation.url_citation.url,\n title: annotation.url_citation.title,\n providerMetadata: {\n openrouter: {\n content: annotation.url_citation.content || '',\n },\n },\n });\n } else if (annotation.type === 'file') {\n // Accumulate file annotations to expose in providerMetadata\n // Type guard to validate structure matches expected shape\n const file = (annotation as { file?: unknown }).file;\n if (\n file &&\n typeof file === 'object' &&\n 'hash' in file &&\n 'name' in file\n ) {\n accumulatedFileAnnotations.push(\n annotation as FileAnnotation,\n );\n }\n }\n }\n }\n\n if (delta.tool_calls != null) {\n for (const toolCallDelta of delta.tool_calls) {\n const index = toolCallDelta.index ?? toolCalls.length - 1;\n\n // Tool call start. OpenRouter returns all information except the arguments in the first chunk.\n if (toolCalls[index] == null) {\n if (toolCallDelta.type !== 'function') {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function' type.`,\n });\n }\n\n if (toolCallDelta.id == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'id' to be a string.`,\n });\n }\n\n if (toolCallDelta.function?.name == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function.name' to be a string.`,\n });\n }\n\n toolCalls[index] = {\n id: toolCallDelta.id,\n type: 'function',\n function: {\n name: toolCallDelta.function.name,\n arguments: toolCallDelta.function.arguments ?? '',\n },\n inputStarted: false,\n sent: false,\n };\n\n const toolCall = toolCalls[index];\n\n if (toolCall == null) {\n throw new InvalidResponseDataError({\n data: { index, toolCallsLength: toolCalls.length },\n message: `Tool call at index ${index} is missing after creation.`,\n });\n }\n\n // check if tool call is complete (some providers send the full tool call in one chunk)\n if (\n toolCall.function?.name != null &&\n toolCall.function?.arguments != null &&\n isParsableJson(toolCall.function.arguments)\n ) {\n toolCall.inputStarted = true;\n\n controller.enqueue({\n type: 'tool-input-start',\n id: toolCall.id,\n toolName: toolCall.function.name,\n });\n\n // send delta\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.id,\n delta: toolCall.function.arguments,\n });\n\n controller.enqueue({\n type: 'tool-input-end',\n id: toolCall.id,\n });\n\n // send tool call\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n input: toolCall.function.arguments,\n providerMetadata: {\n openrouter: {\n reasoning_details: accumulatedReasoningDetails,\n },\n },\n });\n\n toolCall.sent = true;\n }\n\n continue;\n }\n\n // existing tool call, merge\n const toolCall = toolCalls[index];\n\n if (toolCall == null) {\n throw new InvalidResponseDataError({\n data: {\n index,\n toolCallsLength: toolCalls.length,\n toolCallDelta,\n },\n message: `Tool call at index ${index} is missing during merge.`,\n });\n }\n\n if (!toolCall.inputStarted) {\n toolCall.inputStarted = true;\n controller.enqueue({\n type: 'tool-input-start',\n id: toolCall.id,\n toolName: toolCall.function.name,\n });\n }\n\n if (toolCallDelta.function?.arguments != null) {\n toolCall.function.arguments +=\n toolCallDelta.function?.arguments ?? '';\n }\n\n // send delta\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.id,\n delta: toolCallDelta.function.arguments ?? '',\n });\n\n // check if tool call is complete\n if (\n toolCall.function?.name != null &&\n toolCall.function?.arguments != null &&\n isParsableJson(toolCall.function.arguments)\n ) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments,\n providerMetadata: {\n openrouter: {\n reasoning_details: accumulatedReasoningDetails,\n },\n },\n });\n\n toolCall.sent = true;\n }\n }\n }\n\n if (delta.images != null) {\n for (const image of delta.images) {\n controller.enqueue({\n type: 'file',\n mediaType: getMediaType(image.image_url.url, 'image/jpeg'),\n data: getBase64FromDataUrl(image.image_url.url),\n });\n }\n }\n },\n\n flush(controller) {\n // Fix for Gemini 3 thoughtSignature: when there are tool calls with encrypted\n // reasoning (thoughtSignature), the model returns 'stop' but expects continuation.\n // Override to 'tool-calls' so the SDK knows to continue the conversation.\n const hasToolCalls = toolCalls.length > 0;\n const hasEncryptedReasoning = accumulatedReasoningDetails.some(\n (d) => d.type === ReasoningDetailType.Encrypted && d.data,\n );\n if (\n hasToolCalls &&\n hasEncryptedReasoning &&\n finishReason === 'stop'\n ) {\n finishReason = 'tool-calls';\n }\n\n // Forward any unsent tool calls if finish reason is 'tool-calls'\n if (finishReason === 'tool-calls') {\n for (const toolCall of toolCalls) {\n if (toolCall && !toolCall.sent) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n // Coerce invalid arguments to an empty JSON object\n input: isParsableJson(toolCall.function.arguments)\n ? toolCall.function.arguments\n : '{}',\n providerMetadata: {\n openrouter: {\n reasoning_details: accumulatedReasoningDetails,\n },\n },\n });\n toolCall.sent = true;\n }\n }\n }\n\n // End reasoning first if it was started, to maintain proper order\n if (reasoningStarted) {\n controller.enqueue({\n type: 'reasoning-end',\n id: reasoningId || generateId(),\n });\n }\n if (textStarted) {\n controller.enqueue({\n type: 'text-end',\n id: textId || generateId(),\n });\n }\n\n const openrouterMetadata: {\n usage: Partial<OpenRouterUsageAccounting>;\n provider?: string;\n reasoning_details?: ReasoningDetailUnion[];\n annotations?: FileAnnotation[];\n } = {\n usage: openrouterUsage,\n };\n\n // Only include provider if it's actually set\n if (provider !== undefined) {\n openrouterMetadata.provider = provider;\n }\n\n // Include accumulated reasoning_details if any were received\n if (accumulatedReasoningDetails.length > 0) {\n openrouterMetadata.reasoning_details =\n accumulatedReasoningDetails;\n }\n\n // Include accumulated file annotations if any were received\n if (accumulatedFileAnnotations.length > 0) {\n openrouterMetadata.annotations = accumulatedFileAnnotations;\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage,\n providerMetadata: {\n openrouter: openrouterMetadata,\n },\n });\n },\n }),\n ),\n warnings: [],\n request: { body: args },\n response: { headers: responseHeaders },\n };\n }\n}\n","import type {\n LanguageModelV2FilePart,\n LanguageModelV2Prompt,\n LanguageModelV2ReasoningPart,\n LanguageModelV2TextPart,\n LanguageModelV2ToolCallPart,\n LanguageModelV2ToolResultPart,\n} from '@ai-sdk/provider';\n\nimport {\n InvalidPromptError,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\n\nexport function convertToOpenRouterCompletionPrompt({\n prompt,\n inputFormat,\n user = 'user',\n assistant = 'assistant',\n}: {\n prompt: LanguageModelV2Prompt;\n inputFormat: 'prompt' | 'messages';\n user?: string;\n assistant?: string;\n}): {\n prompt: string;\n} {\n // When the user supplied a prompt input, we don't transform it:\n if (\n inputFormat === 'prompt' &&\n prompt.length === 1 &&\n prompt[0] &&\n prompt[0].role === 'user' &&\n prompt[0].content.length === 1 &&\n prompt[0].content[0] &&\n prompt[0].content[0].type === 'text'\n ) {\n return { prompt: prompt[0].content[0].text };\n }\n\n // otherwise transform to a chat message format:\n let text = '';\n\n // if first message is a system message, add it to the text:\n if (prompt[0] && prompt[0].role === 'system') {\n text += `${prompt[0].content}\\n\\n`;\n prompt = prompt.slice(1);\n }\n\n for (const { role, content } of prompt) {\n switch (role) {\n case 'system': {\n throw new InvalidPromptError({\n message: `Unexpected system message in prompt: ${content}`,\n prompt,\n });\n }\n\n case 'user': {\n const userMessage = content\n .map((part: LanguageModelV2TextPart | LanguageModelV2FilePart) => {\n switch (part.type) {\n case 'text': {\n return part.text;\n }\n\n case 'file': {\n throw new UnsupportedFunctionalityError({\n functionality: 'file attachments',\n });\n }\n default: {\n return '';\n }\n }\n })\n .join('');\n\n text += `${user}:\\n${userMessage}\\n\\n`;\n break;\n }\n\n case 'assistant': {\n const assistantMessage = content\n .map(\n (\n part:\n | LanguageModelV2TextPart\n | LanguageModelV2FilePart\n | LanguageModelV2ReasoningPart\n | LanguageModelV2ToolCallPart\n | LanguageModelV2ToolResultPart,\n ) => {\n switch (part.type) {\n case 'text': {\n return part.text;\n }\n case 'tool-call': {\n throw new UnsupportedFunctionalityError({\n functionality: 'tool-call messages',\n });\n }\n case 'tool-result': {\n throw new UnsupportedFunctionalityError({\n functionality: 'tool-result messages',\n });\n }\n case 'reasoning': {\n throw new UnsupportedFunctionalityError({\n functionality: 'reasoning messages',\n });\n }\n\n case 'file': {\n throw new UnsupportedFunctionalityError({\n functionality: 'file attachments',\n });\n }\n\n default: {\n return '';\n }\n }\n },\n )\n .join('');\n\n text += `${assistant}:\\n${assistantMessage}\\n\\n`;\n break;\n }\n\n case 'tool': {\n throw new UnsupportedFunctionalityError({\n functionality: 'tool messages',\n });\n }\n\n default: {\n break;\n }\n }\n }\n\n // Assistant message prefix:\n text += `${assistant}:\\n`;\n\n return {\n prompt: text,\n };\n}\n","import { z } from 'zod/v4';\nimport { OpenRouterErrorResponseSchema } from '../schemas/error-response';\nimport { ReasoningDetailArraySchema } from '../schemas/reasoning-details';\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nexport const OpenRouterCompletionChunkSchema = z.union([\n z\n .object({\n id: z.string().optional(),\n model: z.string().optional(),\n choices: z.array(\n z\n .object({\n text: z.string(),\n reasoning: z.string().nullish().optional(),\n reasoning_details: ReasoningDetailArraySchema.nullish(),\n\n finish_reason: z.string().nullish(),\n index: z.number().nullish(),\n logprobs: z\n .object({\n tokens: z.array(z.string()),\n token_logprobs: z.array(z.number()),\n top_logprobs: z\n .array(z.record(z.string(), z.number()))\n .nullable(),\n })\n .passthrough()\n .nullable()\n .optional(),\n })\n .passthrough(),\n ),\n usage: z\n .object({\n prompt_tokens: z.number(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number(),\n })\n .passthrough()\n .nullish(),\n completion_tokens: z.number(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number(),\n })\n .passthrough()\n .nullish(),\n total_tokens: z.number(),\n cost: z.number().optional(),\n cost_details: z\n .object({\n upstream_inference_cost: z.number().nullish(),\n })\n .passthrough()\n .nullish(),\n })\n .passthrough()\n .nullish(),\n })\n .passthrough(),\n OpenRouterErrorResponseSchema,\n]);\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n} from '@ai-sdk/provider';\nimport type { ParseResult } from '@ai-sdk/provider-utils';\nimport type { FinishReason } from 'ai';\nimport type { z } from 'zod/v4';\nimport type { OpenRouterUsageAccounting } from '../types';\nimport type {\n OpenRouterCompletionModelId,\n OpenRouterCompletionSettings,\n} from '../types/openrouter-completion-settings';\n\nimport {\n APICallError,\n NoContentGeneratedError,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { openrouterFailedResponseHandler } from '../schemas/error-response';\nimport { mapOpenRouterFinishReason } from '../utils/map-finish-reason';\nimport { convertToOpenRouterCompletionPrompt } from './convert-to-openrouter-completion-prompt';\nimport { OpenRouterCompletionChunkSchema } from './schemas';\n\ntype OpenRouterCompletionConfig = {\n provider: string;\n compatibility: 'strict' | 'compatible';\n headers: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: typeof fetch;\n extraBody?: Record<string, unknown>;\n};\n\nexport class OpenRouterCompletionLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2' as const;\n readonly provider = 'openrouter';\n readonly modelId: OpenRouterCompletionModelId;\n readonly supportsImageUrls = true;\n readonly supportedUrls: Record<string, RegExp[]> = {\n 'image/*': [\n /^data:image\\/[a-zA-Z]+;base64,/,\n /^https?:\\/\\/.+\\.(jpg|jpeg|png|gif|webp)$/i,\n ],\n 'text/*': [/^data:text\\//, /^https?:\\/\\/.+$/],\n 'application/*': [/^data:application\\//, /^https?:\\/\\/.+$/],\n };\n readonly defaultObjectGenerationMode = undefined;\n readonly settings: OpenRouterCompletionSettings;\n\n private readonly config: OpenRouterCompletionConfig;\n\n constructor(\n modelId: OpenRouterCompletionModelId,\n settings: OpenRouterCompletionSettings,\n config: OpenRouterCompletionConfig,\n ) {\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n }\n\n private getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n frequencyPenalty,\n presencePenalty,\n seed,\n responseFormat,\n topK,\n stopSequences,\n tools,\n toolChoice,\n }: LanguageModelV2CallOptions) {\n const { prompt: completionPrompt } = convertToOpenRouterCompletionPrompt({\n prompt,\n inputFormat: 'prompt',\n });\n\n if (tools?.length) {\n throw new UnsupportedFunctionalityError({\n functionality: 'tools',\n });\n }\n\n if (toolChoice) {\n throw new UnsupportedFunctionalityError({\n functionality: 'toolChoice',\n });\n }\n\n return {\n // model id:\n model: this.modelId,\n models: this.settings.models,\n\n // model specific settings:\n logit_bias: this.settings.logitBias,\n logprobs:\n typeof this.settings.logprobs === 'number'\n ? this.settings.logprobs\n : typeof this.settings.logprobs === 'boolean'\n ? this.settings.logprobs\n ? 0\n : undefined\n : undefined,\n suffix: this.settings.suffix,\n user: this.settings.user,\n\n // standardized settings:\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n seed,\n\n stop: stopSequences,\n response_format: responseFormat,\n top_k: topK,\n\n // prompt:\n prompt: completionPrompt,\n\n // OpenRouter specific settings:\n include_reasoning: this.settings.includeReasoning,\n reasoning: this.settings.reasoning,\n\n // extra body:\n ...this.config.extraBody,\n ...this.settings.extraBody,\n };\n }\n\n async doGenerate(\n options: LanguageModelV2CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const providerOptions = options.providerOptions || {};\n const openrouterOptions = providerOptions.openrouter || {};\n\n const args = {\n ...this.getArgs(options),\n ...openrouterOptions,\n };\n\n const { value: response, responseHeaders } = await postJsonToApi({\n url: this.config.url({\n path: '/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: args,\n failedResponseHandler: openrouterFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n OpenRouterCompletionChunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n if ('error' in response) {\n const errorData = response.error as { message: string; code?: string };\n throw new APICallError({\n message: errorData.message,\n url: this.config.url({\n path: '/completions',\n modelId: this.modelId,\n }),\n requestBodyValues: args,\n statusCode: 200,\n responseHeaders,\n data: errorData,\n });\n }\n\n const choice = response.choices[0];\n\n if (!choice) {\n throw new NoContentGeneratedError({\n message: 'No choice in OpenRouter completion response',\n });\n }\n\n return {\n content: [\n {\n type: 'text',\n text: choice.text ?? '',\n },\n ],\n finishReason: mapOpenRouterFinishReason(choice.finish_reason),\n usage: {\n inputTokens: response.usage?.prompt_tokens ?? 0,\n outputTokens: response.usage?.completion_tokens ?? 0,\n totalTokens:\n (response.usage?.prompt_tokens ?? 0) +\n (response.usage?.completion_tokens ?? 0),\n reasoningTokens:\n response.usage?.completion_tokens_details?.reasoning_tokens ?? 0,\n cachedInputTokens:\n response.usage?.prompt_tokens_details?.cached_tokens ?? 0,\n },\n warnings: [],\n response: {\n headers: responseHeaders,\n },\n };\n }\n\n async doStream(\n options: LanguageModelV2CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const providerOptions = options.providerOptions || {};\n const openrouterOptions = providerOptions.openrouter || {};\n\n const args = {\n ...this.getArgs(options),\n ...openrouterOptions,\n };\n\n const { value: response, responseHeaders } = await postJsonToApi({\n url: this.config.url({\n path: '/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: {\n ...args,\n stream: true,\n\n // only include stream_options when in strict compatibility mode:\n stream_options:\n this.config.compatibility === 'strict'\n ? { include_usage: true }\n : undefined,\n },\n failedResponseHandler: openrouterFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n OpenRouterCompletionChunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n let finishReason: FinishReason = 'other';\n const usage: LanguageModelV2Usage = {\n inputTokens: Number.NaN,\n outputTokens: Number.NaN,\n totalTokens: Number.NaN,\n reasoningTokens: Number.NaN,\n cachedInputTokens: Number.NaN,\n };\n\n const openrouterUsage: Partial<OpenRouterUsageAccounting> = {};\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof OpenRouterCompletionChunkSchema>>,\n LanguageModelV2StreamPart\n >({\n transform(chunk, controller) {\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = 'error';\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const value = chunk.value;\n\n // handle error chunks:\n if ('error' in value) {\n finishReason = 'error';\n controller.enqueue({ type: 'error', error: value.error });\n return;\n }\n\n if (value.usage != null) {\n usage.inputTokens = value.usage.prompt_tokens;\n usage.outputTokens = value.usage.completion_tokens;\n usage.totalTokens =\n value.usage.prompt_tokens + value.usage.completion_tokens;\n\n // Collect OpenRouter specific usage information\n openrouterUsage.promptTokens = value.usage.prompt_tokens;\n\n if (value.usage.prompt_tokens_details) {\n const cachedInputTokens =\n value.usage.prompt_tokens_details.cached_tokens ?? 0;\n\n usage.cachedInputTokens = cachedInputTokens;\n openrouterUsage.promptTokensDetails = {\n cachedTokens: cachedInputTokens,\n };\n }\n\n openrouterUsage.completionTokens = value.usage.completion_tokens;\n if (value.usage.completion_tokens_details) {\n const reasoningTokens =\n value.usage.completion_tokens_details.reasoning_tokens ?? 0;\n\n usage.reasoningTokens = reasoningTokens;\n openrouterUsage.completionTokensDetails = {\n reasoningTokens,\n };\n }\n\n openrouterUsage.cost = value.usage.cost;\n openrouterUsage.totalTokens = value.usage.total_tokens;\n const upstreamInferenceCost =\n value.usage.cost_details?.upstream_inference_cost;\n if (upstreamInferenceCost != null) {\n openrouterUsage.costDetails = {\n upstreamInferenceCost,\n };\n }\n }\n\n const choice = value.choices[0];\n\n if (choice?.finish_reason != null) {\n finishReason = mapOpenRouterFinishReason(choice.finish_reason);\n }\n\n if (choice?.text != null) {\n controller.enqueue({\n type: 'text-delta',\n delta: choice.text,\n id: generateId(),\n });\n }\n },\n\n flush(controller) {\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage,\n providerMetadata: {\n openrouter: {\n usage: openrouterUsage,\n },\n },\n });\n },\n }),\n ),\n response: {\n headers: responseHeaders,\n },\n };\n }\n}\n","import { z } from 'zod/v4';\n\nconst openrouterEmbeddingUsageSchema = z.object({\n prompt_tokens: z.number(),\n total_tokens: z.number(),\n cost: z.number().optional(),\n});\n\nconst openrouterEmbeddingDataSchema = z.object({\n object: z.literal('embedding'),\n embedding: z.array(z.number()),\n index: z.number().optional(),\n});\n\nexport const OpenRouterEmbeddingResponseSchema = z.object({\n id: z.string().optional(),\n object: z.literal('list'),\n data: z.array(openrouterEmbeddingDataSchema),\n model: z.string(),\n usage: openrouterEmbeddingUsageSchema.optional(),\n});\n\nexport type OpenRouterEmbeddingResponse = z.infer<\n typeof OpenRouterEmbeddingResponseSchema\n>;\n","import type {\n EmbeddingModelV2,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n} from '@ai-sdk/provider';\nimport type {\n OpenRouterEmbeddingModelId,\n OpenRouterEmbeddingSettings,\n} from '../types/openrouter-embedding-settings';\n\nimport {\n combineHeaders,\n createJsonResponseHandler,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { openrouterFailedResponseHandler } from '../schemas/error-response';\nimport { OpenRouterEmbeddingResponseSchema } from './schemas';\n\ntype OpenRouterEmbeddingConfig = {\n provider: string;\n headers: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: typeof fetch;\n extraBody?: Record<string, unknown>;\n};\n\nexport class OpenRouterEmbeddingModel implements EmbeddingModelV2<string> {\n readonly specificationVersion = 'v2' as const;\n readonly provider = 'openrouter';\n readonly modelId: OpenRouterEmbeddingModelId;\n readonly settings: OpenRouterEmbeddingSettings;\n readonly maxEmbeddingsPerCall = undefined;\n readonly supportsParallelCalls = true;\n\n private readonly config: OpenRouterEmbeddingConfig;\n\n constructor(\n modelId: OpenRouterEmbeddingModelId,\n settings: OpenRouterEmbeddingSettings,\n config: OpenRouterEmbeddingConfig,\n ) {\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n }\n\n async doEmbed(options: {\n values: Array<string>;\n abortSignal?: AbortSignal;\n headers?: Record<string, string | undefined>;\n }): Promise<{\n embeddings: Array<Array<number>>;\n usage?: { tokens: number };\n providerMetadata?: SharedV2ProviderMetadata;\n response?: {\n headers?: SharedV2Headers;\n body?: unknown;\n };\n }> {\n const { values, abortSignal, headers } = options;\n\n const args = {\n model: this.modelId,\n input: values,\n user: this.settings.user,\n provider: this.settings.provider,\n ...this.config.extraBody,\n ...this.settings.extraBody,\n };\n\n const { value: responseValue, responseHeaders } = await postJsonToApi({\n url: this.config.url({\n path: '/embeddings',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), headers),\n body: args,\n failedResponseHandler: openrouterFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n OpenRouterEmbeddingResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n embeddings: responseValue.data.map((item) => item.embedding),\n usage: responseValue.usage\n ? { tokens: responseValue.usage.prompt_tokens }\n : undefined,\n providerMetadata: responseValue.usage?.cost\n ? {\n openrouter: {\n usage: {\n cost: responseValue.usage.cost,\n },\n },\n }\n : undefined,\n response: {\n headers: responseHeaders,\n body: responseValue,\n },\n };\n }\n}\n","import type { OpenRouterProviderSettings } from './provider';\nimport type {\n OpenRouterChatModelId,\n OpenRouterChatSettings,\n} from './types/openrouter-chat-settings';\nimport type {\n OpenRouterCompletionModelId,\n OpenRouterCompletionSettings,\n} from './types/openrouter-completion-settings';\nimport type {\n OpenRouterEmbeddingModelId,\n OpenRouterEmbeddingSettings,\n} from './types/openrouter-embedding-settings';\n\nimport { loadApiKey, withoutTrailingSlash } from '@ai-sdk/provider-utils';\nimport { OpenRouterChatLanguageModel } from './chat';\nimport { OpenRouterCompletionLanguageModel } from './completion';\nimport { OpenRouterEmbeddingModel } from './embedding';\n\n/**\n@deprecated Use `createOpenRouter` instead.\n */\nexport class OpenRouter {\n /**\nUse a different URL prefix for API calls, e.g. to use proxy servers.\nThe default prefix is `https://openrouter.ai/api/v1`.\n */\n readonly baseURL: string;\n\n /**\nAPI key that is being sent using the `Authorization` header.\nIt defaults to the `OPENROUTER_API_KEY` environment variable.\n */\n readonly apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n readonly headers?: Record<string, string>;\n\n /**\n * Record of provider slugs to API keys for injecting into provider routing.\n */\n readonly api_keys?: Record<string, string>;\n\n /**\n * Creates a new OpenRouter provider instance.\n */\n constructor(options: OpenRouterProviderSettings = {}) {\n this.baseURL =\n withoutTrailingSlash(options.baseURL ?? options.baseUrl) ??\n 'https://openrouter.ai/api/v1';\n this.apiKey = options.apiKey;\n this.headers = options.headers;\n this.api_keys = options.api_keys;\n }\n\n private get baseConfig() {\n return {\n baseURL: this.baseURL,\n headers: () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: this.apiKey,\n environmentVariableName: 'OPENROUTER_API_KEY',\n description: 'OpenRouter',\n })}`,\n ...this.headers,\n ...(this.api_keys &&\n Object.keys(this.api_keys).length > 0 && {\n 'X-Provider-API-Keys': JSON.stringify(this.api_keys),\n }),\n }),\n };\n }\n\n chat(modelId: OpenRouterChatModelId, settings: OpenRouterChatSettings = {}) {\n return new OpenRouterChatLanguageModel(modelId, settings, {\n provider: 'openrouter.chat',\n ...this.baseConfig,\n compatibility: 'strict',\n url: ({ path }) => `${this.baseURL}${path}`,\n });\n }\n\n completion(\n modelId: OpenRouterCompletionModelId,\n settings: OpenRouterCompletionSettings = {},\n ) {\n return new OpenRouterCompletionLanguageModel(modelId, settings, {\n provider: 'openrouter.completion',\n ...this.baseConfig,\n compatibility: 'strict',\n url: ({ path }) => `${this.baseURL}${path}`,\n });\n }\n\n textEmbeddingModel(\n modelId: OpenRouterEmbeddingModelId,\n settings: OpenRouterEmbeddingSettings = {},\n ) {\n return new OpenRouterEmbeddingModel(modelId, settings, {\n provider: 'openrouter.embedding',\n ...this.baseConfig,\n url: ({ path }) => `${this.baseURL}${path}`,\n });\n }\n\n /**\n * @deprecated Use textEmbeddingModel instead\n */\n embedding(\n modelId: OpenRouterEmbeddingModelId,\n settings: OpenRouterEmbeddingSettings = {},\n ) {\n return this.textEmbeddingModel(modelId, settings);\n }\n}\n","/**\n * Removes entries from a record where the value is null or undefined.\n * @param record - The input object whose entries may be null or undefined.\n * @returns A new object containing only entries with non-null and non-undefined values.\n */\nexport function removeUndefinedEntries<T>(\n record: Record<string, T | undefined>,\n): Record<string, T> {\n return Object.fromEntries(\n Object.entries(record).filter(([, value]) => value !== null),\n ) as Record<string, T>;\n}\n","import { removeUndefinedEntries } from '@/src/utils/remove-undefined';\n\n/**\n * Appends suffix parts to the `user-agent` header.\n * If a `user-agent` header already exists, the suffix parts are appended to it.\n * If no `user-agent` header exists, a new one is created with the suffix parts.\n * Automatically removes undefined entries from the headers.\n *\n * @param headers - The original headers.\n * @param userAgentSuffixParts - The parts to append to the `user-agent` header.\n * @returns The new headers with the `user-agent` header set or updated.\n */\nexport function withUserAgentSuffix(\n headers: HeadersInit | Record<string, string | undefined> | undefined,\n ...userAgentSuffixParts: string[]\n): Record<string, string> {\n const cleanedHeaders = removeUndefinedEntries(\n (headers as Record<string, string | undefined>) ?? {},\n );\n\n const currentUserAgentHeader = cleanedHeaders['user-agent'] || '';\n const newUserAgent = [currentUserAgentHeader, ...userAgentSuffixParts]\n .filter(Boolean)\n .join(' ');\n\n return {\n ...cleanedHeaders,\n 'user-agent': newUserAgent,\n };\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n __PACKAGE_VERSION__ === undefined ? '0.0.0-test' : __PACKAGE_VERSION__;\n","import type { ProviderV2 } from '@ai-sdk/provider';\nimport type {\n OpenRouterChatModelId,\n OpenRouterChatSettings,\n} from './types/openrouter-chat-settings';\nimport type {\n OpenRouterCompletionModelId,\n OpenRouterCompletionSettings,\n} from './types/openrouter-completion-settings';\nimport type {\n OpenRouterEmbeddingModelId,\n OpenRouterEmbeddingSettings,\n} from './types/openrouter-embedding-settings';\n\nimport { loadApiKey, withoutTrailingSlash } from '@ai-sdk/provider-utils';\nimport { OpenRouterChatLanguageModel } from './chat';\nimport { OpenRouterCompletionLanguageModel } from './completion';\nimport { OpenRouterEmbeddingModel } from './embedding';\nimport { withUserAgentSuffix } from './utils/with-user-agent-suffix';\nimport { VERSION } from './version';\n\nexport type { OpenRouterChatSettings, OpenRouterCompletionSettings };\n\nexport interface OpenRouterProvider extends ProviderV2 {\n (\n modelId: OpenRouterChatModelId,\n settings?: OpenRouterCompletionSettings,\n ): OpenRouterCompletionLanguageModel;\n (\n modelId: OpenRouterChatModelId,\n settings?: OpenRouterChatSettings,\n ): OpenRouterChatLanguageModel;\n\n languageModel(\n modelId: OpenRouterChatModelId,\n settings?: OpenRouterCompletionSettings,\n ): OpenRouterCompletionLanguageModel;\n languageModel(\n modelId: OpenRouterChatModelId,\n settings?: OpenRouterChatSettings,\n ): OpenRouterChatLanguageModel;\n\n /**\nCreates an OpenRouter chat model for text generation.\n */\n chat(\n modelId: OpenRouterChatModelId,\n settings?: OpenRouterChatSettings,\n ): OpenRouterChatLanguageModel;\n\n /**\nCreates an OpenRouter completion model for text generation.\n */\n completion(\n modelId: OpenRouterCompletionModelId,\n settings?: OpenRouterCompletionSettings,\n ): OpenRouterCompletionLanguageModel;\n\n /**\nCreates an OpenRouter text embedding model. (AI SDK v5)\n */\n textEmbeddingModel(\n modelId: OpenRouterEmbeddingModelId,\n settings?: OpenRouterEmbeddingSettings,\n ): OpenRouterEmbeddingModel;\n\n /**\nCreates an OpenRouter text embedding model. (AI SDK v4 - deprecated, use textEmbeddingModel instead)\n@deprecated Use textEmbeddingModel instead\n */\n embedding(\n modelId: OpenRouterEmbeddingModelId,\n settings?: OpenRouterEmbeddingSettings,\n ): OpenRouterEmbeddingModel;\n}\n\nexport interface OpenRouterProviderSettings {\n /**\nBase URL for the OpenRouter API calls.\n */\n baseURL?: string;\n\n /**\n@deprecated Use `baseURL` instead.\n */\n baseUrl?: string;\n\n /**\nAPI key for authenticating requests.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nOpenRouter compatibility mode. Should be set to `strict` when using the OpenRouter API,\nand `compatible` when using 3rd party providers. In `compatible` mode, newer\ninformation such as streamOptions are not being sent. Defaults to 'compatible'.\n */\n compatibility?: 'strict' | 'compatible';\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: typeof fetch;\n\n /**\nA JSON object to send as the request body to access OpenRouter features & upstream provider features.\n */\n extraBody?: Record<string, unknown>;\n\n /**\n * Record of provider slugs to API keys for injecting into provider routing.\n * Maps provider slugs (e.g. \"anthropic\", \"openai\") to their respective API keys.\n */\n api_keys?: Record<string, string>;\n}\n\n/**\nCreate an OpenRouter provider instance.\n */\nexport function createOpenRouter(\n options: OpenRouterProviderSettings = {},\n): OpenRouterProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL ?? options.baseUrl) ??\n 'https://openrouter.ai/api/v1';\n\n // we default to compatible, because strict breaks providers like Groq:\n const compatibility = options.compatibility ?? 'compatible';\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'OPENROUTER_API_KEY',\n description: 'OpenRouter',\n })}`,\n ...options.headers,\n ...(options.api_keys &&\n Object.keys(options.api_keys).length > 0 && {\n 'X-Provider-API-Keys': JSON.stringify(options.api_keys),\n }),\n },\n `ai-sdk/openrouter/${VERSION}`,\n );\n\n const createChatModel = (\n modelId: OpenRouterChatModelId,\n settings: OpenRouterChatSettings = {},\n ) =>\n new OpenRouterChatLanguageModel(modelId, settings, {\n provider: 'openrouter.chat',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n compatibility,\n fetch: options.fetch,\n extraBody: options.extraBody,\n });\n\n const createCompletionModel = (\n modelId: OpenRouterCompletionModelId,\n settings: OpenRouterCompletionSettings = {},\n ) =>\n new OpenRouterCompletionLanguageModel(modelId, settings, {\n provider: 'openrouter.completion',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n compatibility,\n fetch: options.fetch,\n extraBody: options.extraBody,\n });\n\n const createEmbeddingModel = (\n modelId: OpenRouterEmbeddingModelId,\n settings: OpenRouterEmbeddingSettings = {},\n ) =>\n new OpenRouterEmbeddingModel(modelId, settings, {\n provider: 'openrouter.embedding',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n extraBody: options.extraBody,\n });\n\n const createLanguageModel = (\n modelId: OpenRouterChatModelId | OpenRouterCompletionModelId,\n settings?: OpenRouterChatSettings | OpenRouterCompletionSettings,\n ) => {\n if (new.target) {\n throw new Error(\n 'The OpenRouter model function cannot be called with the new keyword.',\n );\n }\n\n if (modelId === 'openai/gpt-3.5-turbo-instruct') {\n return createCompletionModel(\n modelId,\n settings as OpenRouterCompletionSettings,\n );\n }\n\n return createChatModel(modelId, settings as OpenRouterChatSettings);\n };\n\n const provider = (\n modelId: OpenRouterChatModelId | OpenRouterCompletionModelId,\n settings?: OpenRouterChatSettings | OpenRouterCompletionSettings,\n ) => createLanguageModel(modelId, settings);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createChatModel;\n provider.completion = createCompletionModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n provider.embedding = createEmbeddingModel; // deprecated alias for v4 compatibility\n\n return provider as OpenRouterProvider;\n}\n\n/**\nDefault OpenRouter provider instance. It uses 'strict' compatibility mode.\n */\nexport const openrouter = createOpenRouter({\n compatibility: 'strict', // strict for OpenRouter API\n});\n","/**\n * TOON (Token-Oriented Object Notation) helper utilities for token-efficient\n * data encoding in LLM prompts.\n *\n * TOON achieves ~40% token reduction vs JSON for tabular data while maintaining\n * high LLM comprehension accuracy.\n *\n * @see https://toonformat.dev\n * @see https://github.com/toon-format/toon\n *\n * @example\n * ```ts\n * import { encodeToon, decodeToon } from '@openrouter/ai-sdk-provider';\n *\n * // Encode data to TOON format\n * const toon = await encodeToon([\n * { id: 1, name: 'Alice', score: 95 },\n * { id: 2, name: 'Bob', score: 87 },\n * ]);\n * // Result: [2]{id,name,score}: 1,Alice,95 2,Bob,87\n *\n * // Decode TOON back to JSON\n * const data = await decodeToon(toon);\n * ```\n */\n\nimport type {\n DecodeOptions,\n EncodeOptions,\n JsonValue,\n} from '@toon-format/toon';\n\nexport type { DecodeOptions, EncodeOptions, JsonValue };\n\nexport type ToonEncodeOptions = EncodeOptions;\nexport type ToonDecodeOptions = DecodeOptions;\n\n/**\n * Lazily imports the @toon-format/toon package.\n * Uses dynamic import to support both ESM and CJS consumers.\n */\nasync function getToonModule() {\n try {\n return await import('@toon-format/toon');\n } catch {\n throw new Error(\n 'The @toon-format/toon package is required for TOON encoding/decoding. ' +\n 'Install it with: npm install @toon-format/toon',\n );\n }\n}\n\n/**\n * Encodes a JavaScript value into TOON format string.\n *\n * TOON is particularly efficient for uniform arrays of objects (tabular data),\n * achieving CSV-like compactness while preserving explicit structure.\n *\n * @param value - Any JavaScript value (objects, arrays, primitives)\n * @param options - Optional encoding configuration\n * @returns Promise resolving to TOON formatted string\n *\n * @example\n * ```ts\n * // Simple object\n * await encodeToon({ name: 'Alice', age: 30 });\n * // name: Alice\n * // age: 30\n *\n * // Tabular array (most efficient)\n * await encodeToon([\n * { id: 1, name: 'Alice' },\n * { id: 2, name: 'Bob' },\n * ]);\n * // [2]{id,name}: 1,Alice 2,Bob\n *\n * // With options\n * await encodeToon(data, { indent: 4, keyFolding: 'safe' });\n * ```\n */\nexport async function encodeToon(\n value: unknown,\n options?: ToonEncodeOptions,\n): Promise<string> {\n const toon = await getToonModule();\n return toon.encode(value, options);\n}\n\n/**\n * Decodes a TOON format string into a JavaScript value.\n *\n * @param input - TOON formatted string\n * @param options - Optional decoding configuration\n * @returns Promise resolving to parsed JavaScript value\n *\n * @example\n * ```ts\n * // Decode simple object\n * await decodeToon('name: Alice\\nage: 30');\n * // { name: 'Alice', age: 30 }\n *\n * // Decode tabular array\n * await decodeToon('[2]{id,name}: 1,Alice 2,Bob');\n * // [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]\n *\n * // With options\n * await decodeToon(toonString, { strict: false, expandPaths: 'safe' });\n * ```\n */\nexport async function decodeToon(\n input: string,\n options?: ToonDecodeOptions,\n): Promise<JsonValue> {\n const toon = await getToonModule();\n return toon.decode(input, options);\n}\n"],"mappings":"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","names":["_AISDKError","name","marker","symbol","_a","_a","symbol","name","marker","_a","symbol","name","marker","_a","symbol","name","marker","_TypeValidationError","import_zod","import_zod","TypeValidationError","validator","getOriginalFetch","getOriginalFetch","APICallError","APICallError","APICallError","ReasoningFormat","d","import_v4","import_v4","_a","_a","openrouter","_b","_c","_d","_e","_f","_g","content","import_v4","import_v4","import_v4","d","_a","toolCall","import_v4","_a","import_v4","_a","_a","removeUndefinedEntries","removeUndefinedEntries","_a"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/openrouter-provider.ts","../src/chat/openrouter-chat-language-model.ts","../src/utils/build-provider-metadata.ts","../src/utils/build-usage.ts","../src/chat/convert-to-openrouter-messages.ts","../src/chat/extract-reasoning-details.ts","../src/chat/map-openrouter-finish-reason.ts","../src/embedding/openrouter-embedding-model.ts","../src/image/openrouter-image-model.ts","../src/version.ts"],"sourcesContent":["export { createOpenRouter, type OpenRouterProvider } from './openrouter-provider.js';\nexport type {\n OpenRouterProviderSettings,\n OpenRouterModelOptions,\n OpenRouterPluginConfig,\n OpenRouterProviderRoutingConfig,\n} from './openrouter-config.js';\nexport { VERSION } from './version.js';\n\n// Default instance\nimport { createOpenRouter } from './openrouter-provider.js';\n\n/**\n * Default OpenRouter provider instance.\n *\n * Uses OPENROUTER_API_KEY environment variable for authentication.\n *\n * @example\n * ```ts\n * import { openrouter } from '@openrouter/ai-sdk-provider';\n *\n * const model = openrouter('anthropic/claude-3.5-sonnet');\n * ```\n */\nexport const openrouter = createOpenRouter();\n","import type { ProviderV3 } from '@ai-sdk/provider';\nimport { loadApiKey, withoutTrailingSlash } from '@ai-sdk/provider-utils';\nimport { OpenRouterChatLanguageModel } from './chat/openrouter-chat-language-model.js';\nimport { OpenRouterEmbeddingModel } from './embedding/openrouter-embedding-model.js';\nimport { OpenRouterImageModel } from './image/openrouter-image-model.js';\nimport type {\n OpenRouterProviderSettings,\n OpenRouterModelOptions,\n} from './openrouter-config.js';\n\n/**\n * OpenRouter provider interface extending the AI SDK V3 ProviderV3 interface.\n *\n * The provider is callable - calling it directly is equivalent to calling languageModel().\n */\nexport interface OpenRouterProvider extends ProviderV3 {\n /**\n * Create a language model by calling the provider directly.\n */\n (modelId: string, settings?: OpenRouterModelOptions): OpenRouterChatLanguageModel;\n\n /**\n * Create a language model.\n */\n languageModel(modelId: string, settings?: OpenRouterModelOptions): OpenRouterChatLanguageModel;\n\n /**\n * Create a chat model (alias for languageModel).\n */\n chat(modelId: string, settings?: OpenRouterModelOptions): OpenRouterChatLanguageModel;\n\n /**\n * Create an embedding model.\n */\n embeddingModel(modelId: string, settings?: OpenRouterModelOptions): OpenRouterEmbeddingModel;\n\n /**\n * Create a text embedding model.\n * @deprecated Use embeddingModel instead.\n */\n textEmbeddingModel(modelId: string, settings?: OpenRouterModelOptions): OpenRouterEmbeddingModel;\n\n /**\n * Create an image model.\n */\n imageModel(modelId: string, settings?: OpenRouterModelOptions): OpenRouterImageModel;\n\n /**\n * Create an image model (alias for imageModel).\n */\n image(modelId: string, settings?: OpenRouterModelOptions): OpenRouterImageModel;\n\n /**\n * Create an embedding model (alias for embeddingModel).\n * @deprecated Use embeddingModel instead.\n */\n embedding(modelId: string, settings?: OpenRouterModelOptions): OpenRouterEmbeddingModel;\n}\n\n/**\n * Internal settings passed to model constructors.\n * Contains resolved API key and normalized configuration.\n */\nexport interface OpenRouterModelSettings {\n apiKey: string;\n baseURL: string;\n headers?: Record<string, string>;\n fetch?: typeof globalThis.fetch;\n extraBody?: Record<string, unknown>;\n modelOptions?: OpenRouterModelOptions;\n}\n\n/**\n * Creates an OpenRouter provider instance for the AI SDK.\n *\n * @description\n * Factory function that creates an OpenRouter provider compatible with the AI SDK v3 provider\n * specification. The provider can create language models, embedding models, and image models\n * that route requests through OpenRouter to various AI providers (OpenAI, Anthropic, Google, etc.).\n *\n * The returned provider is callable - you can use it directly as a function to create language\n * models, or use its methods for specific model types.\n *\n * @param options - Provider settings including API key, base URL, headers, and fetch implementation.\n * If no API key is provided, it will be loaded from the OPENROUTER_API_KEY environment variable.\n * @returns An OpenRouter provider that can create language, embedding, and image models.\n *\n * @example Basic usage with environment variable\n * ```ts\n * import { createOpenRouter } from '@openrouter/ai-sdk-provider';\n *\n * // Uses OPENROUTER_API_KEY from environment\n * const openrouter = createOpenRouter();\n *\n * const model = openrouter('anthropic/claude-3.5-sonnet');\n * ```\n *\n * @example With explicit API key\n * ```ts\n * import { createOpenRouter } from '@openrouter/ai-sdk-provider';\n *\n * const openrouter = createOpenRouter({\n * apiKey: process.env.OPENROUTER_API_KEY,\n * });\n *\n * const model = openrouter('anthropic/claude-3.5-sonnet');\n * ```\n *\n * @example Creating different model types\n * ```ts\n * const openrouter = createOpenRouter();\n *\n * // Language model (callable shorthand)\n * const chat = openrouter('anthropic/claude-3.5-sonnet');\n *\n * // Embedding model\n * const embeddings = openrouter.embeddingModel('openai/text-embedding-3-small');\n *\n * // Image model\n * const image = openrouter.imageModel('openai/dall-e-3');\n * ```\n *\n * @example Model variants\n * ```ts\n * const openrouter = createOpenRouter();\n *\n * // Online search variant - model has web search capabilities\n * const online = openrouter('anthropic/claude-3.5-sonnet:online');\n *\n * // Nitro variant - faster inference\n * const nitro = openrouter('anthropic/claude-3.5-sonnet:nitro');\n *\n * // Floor pricing variant - routes to cheapest provider\n * const floor = openrouter('anthropic/claude-3.5-sonnet:floor');\n *\n * // Free tier variant\n * const free = openrouter('meta-llama/llama-3-8b-instruct:free');\n * ```\n */\nexport function createOpenRouter(\n options: OpenRouterProviderSettings = {}\n): OpenRouterProvider {\n // Normalize base URL: accept baseURL or baseUrl, strip trailing slash\n // The fallback ensures we always have a value, so the non-null assertion is safe\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? options.baseUrl ?? 'https://openrouter.ai/api/v1'\n )!;\n\n /**\n * Resolves model settings at model creation time.\n * API key is loaded here (not at provider creation or request time) per Decision 1 - Fail Fast.\n */\n const getModelSettings = (modelOptions?: OpenRouterModelOptions): OpenRouterModelSettings => {\n // Load API key at model creation time\n const apiKey = loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'OPENROUTER_API_KEY',\n description: 'OpenRouter',\n });\n\n return {\n apiKey,\n baseURL,\n headers: options.headers,\n fetch: options.fetch,\n extraBody: options.extraBody,\n modelOptions,\n };\n };\n\n /**\n * Create a language model.\n */\n const languageModel = (\n modelId: string,\n modelOptions?: OpenRouterModelOptions\n ): OpenRouterChatLanguageModel => {\n return new OpenRouterChatLanguageModel(modelId, getModelSettings(modelOptions));\n };\n\n /**\n * Create an embedding model.\n */\n const embeddingModel = (\n modelId: string,\n modelOptions?: OpenRouterModelOptions\n ): OpenRouterEmbeddingModel => {\n return new OpenRouterEmbeddingModel(modelId, getModelSettings(modelOptions));\n };\n\n /**\n * Create an image model.\n */\n const imageModel = (\n modelId: string,\n modelOptions?: OpenRouterModelOptions\n ): OpenRouterImageModel => {\n return new OpenRouterImageModel(modelId, getModelSettings(modelOptions));\n };\n\n // Create the callable provider object\n const provider = Object.assign(\n // Make provider callable - calling it directly creates a language model\n (modelId: string, modelOptions?: OpenRouterModelOptions) => languageModel(modelId, modelOptions),\n {\n specificationVersion: 'v3' as const,\n languageModel,\n chat: languageModel,\n embeddingModel,\n textEmbeddingModel: embeddingModel,\n imageModel,\n image: imageModel,\n embedding: embeddingModel,\n }\n );\n\n return provider;\n}\n","import type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n LanguageModelV3ToolChoice,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport { combineHeaders, normalizeHeaders } from '@ai-sdk/provider-utils';\nimport { OpenRouter } from '@openrouter/sdk';\nimport type {\n OpenResponsesRequest,\n OpenResponsesNonStreamingResponse,\n OpenResponsesStreamEvent,\n OpenResponsesRequestToolFunction,\n OpenAIResponsesToolChoiceUnion,\n} from '@openrouter/sdk/models';\nimport type { EventStream } from '@openrouter/sdk/lib/event-streams';\n\nimport type { OpenRouterModelSettings } from '../openrouter-provider.js';\nimport { buildProviderMetadata } from '../utils/build-provider-metadata.js';\nimport { buildUsage } from '../utils/build-usage.js';\nimport { convertToOpenRouterMessages } from './convert-to-openrouter-messages.js';\nimport {\n extractReasoningDetails,\n hasEncryptedReasoning,\n buildReasoningProviderMetadata,\n type ReasoningOutputItem,\n} from './extract-reasoning-details.js';\nimport { mapOpenRouterFinishReason } from './map-openrouter-finish-reason.js';\n\n/**\n * OpenRouter chat language model implementing AI SDK V3 LanguageModelV3 interface.\n *\n * Uses the OpenRouter Responses API for both streaming and non-streaming requests.\n */\nexport class OpenRouterChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3' as const;\n readonly provider = 'openrouter';\n readonly modelId: string;\n\n private readonly settings: OpenRouterModelSettings;\n\n /**\n * Supported URL patterns by media type.\n * OpenRouter Chat API only supports image URLs natively.\n * PDF URLs are not supported - use PDF data URIs or the Responses API instead.\n */\n readonly supportedUrls: Record<string, RegExp[]> = {\n 'image/*': [/^https?:\\/\\/.*$/],\n };\n\n constructor(modelId: string, settings: OpenRouterModelSettings) {\n this.modelId = modelId;\n this.settings = settings;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions\n ): Promise<LanguageModelV3GenerateResult> {\n const warnings: SharedV3Warning[] = [];\n\n // Create OpenRouter client\n const client = new OpenRouter({\n apiKey: this.settings.apiKey,\n serverURL: this.settings.baseURL,\n });\n\n // Convert messages to OpenRouter Responses API format\n const openRouterInput = convertToOpenRouterMessages(options.prompt);\n\n // Convert tools to Responses API format\n const tools = convertToolsToResponsesFormat(options.tools, warnings);\n\n // Convert toolChoice to Responses API format\n const toolChoice = convertToolChoiceToResponsesFormat(options.toolChoice);\n\n // Convert responseFormat to Responses API text.format\n const text = convertResponseFormatToText(options.responseFormat);\n\n // Build request parameters for Responses API (non-streaming)\n const requestParams: OpenResponsesRequest & { stream: false } = {\n model: this.modelId,\n input: openRouterInput as OpenResponsesRequest['input'],\n stream: false,\n ...(options.maxOutputTokens !== undefined && {\n maxOutputTokens: options.maxOutputTokens,\n }),\n ...(options.temperature !== undefined && {\n temperature: options.temperature,\n }),\n ...(options.topP !== undefined && { topP: options.topP }),\n ...(tools.length > 0 && { tools }),\n ...(toolChoice !== undefined && { toolChoice }),\n ...(text !== undefined && { text }),\n };\n\n // Make the non-streaming request using Responses API\n const combinedHeaders = normalizeHeaders(\n combineHeaders(this.settings.headers, options.headers)\n );\n\n const response = (await client.beta.responses.send(requestParams, {\n fetchOptions: {\n signal: options.abortSignal,\n headers: combinedHeaders,\n },\n })) as OpenResponsesNonStreamingResponse;\n\n // Build content array from Responses API output\n const content: LanguageModelV3Content[] = [];\n\n // Extract reasoning details for multi-turn conversation support\n // These must be preserved and sent back in subsequent turns for reasoning models\n const reasoningDetails = extractReasoningDetails(response);\n const reasoningMetadata = buildReasoningProviderMetadata(reasoningDetails);\n\n // Process output items\n for (const outputItem of response.output) {\n if (outputItem.type === 'reasoning') {\n // Extract reasoning text from content array or summary\n const reasoningItem = outputItem as ReasoningOutputItem;\n const reasoningText =\n reasoningItem.content\n ?.filter((c) => c.type === 'reasoning_text')\n .map((c) => c.text)\n .join('') ||\n reasoningItem.summary\n ?.filter((c) => c.type === 'summary_text')\n .map((c) => c.text)\n .join('') ||\n '';\n\n if (reasoningText) {\n // Attach reasoning_details to the reasoning part for multi-turn support\n content.push({\n type: 'reasoning',\n text: reasoningText,\n ...(reasoningMetadata && { providerMetadata: reasoningMetadata }),\n });\n }\n } else if (outputItem.type === 'message') {\n // Extract text content from message\n const messageItem = outputItem as {\n type: 'message';\n content: Array<{ type: string; text?: string }>;\n };\n for (const contentItem of messageItem.content) {\n if (contentItem.type === 'output_text' && contentItem.text) {\n content.push({\n type: 'text',\n text: contentItem.text,\n });\n }\n }\n } else if (outputItem.type === 'function_call') {\n // Handle tool/function calls\n const functionCallItem = outputItem as {\n type: 'function_call';\n callId: string;\n name: string;\n arguments?: string;\n };\n // Attach reasoning_details to tool-call parts for multi-turn support\n // This is critical for Gemini 3 with thoughtSignature\n content.push({\n type: 'tool-call',\n toolCallId: functionCallItem.callId,\n toolName: functionCallItem.name,\n // Default to empty object when arguments is undefined/empty\n // (some providers omit arguments for tools with no parameters)\n input: functionCallItem.arguments || '{}',\n ...(reasoningMetadata && { providerMetadata: reasoningMetadata }),\n });\n }\n }\n\n // Use outputText as fallback if no text content was extracted\n if (response.outputText && !content.some((c) => c.type === 'text')) {\n content.push({\n type: 'text',\n text: response.outputText,\n });\n }\n\n // Build finish reason based on response status\n let finishReason = mapOpenRouterFinishReason(\n response.status === 'completed' ? 'stop' : response.status ?? 'stop'\n );\n\n // Gemini 3 thoughtSignature fix: when there are tool calls with encrypted\n // reasoning, the model returns 'completed' but expects continuation.\n // Override to 'tool-calls' so the AI SDK knows to continue the conversation.\n const hasToolCalls = content.some((c) => c.type === 'tool-call');\n if (\n hasToolCalls &&\n hasEncryptedReasoning(reasoningDetails) &&\n finishReason.unified === 'stop'\n ) {\n finishReason = { unified: 'tool-calls', raw: finishReason.raw };\n }\n\n // Build usage from Responses API format\n const usage = buildUsage(\n response.usage\n ? {\n inputTokens: response.usage.inputTokens,\n outputTokens: response.usage.outputTokens,\n }\n : undefined\n );\n\n // Build provider metadata\n // Note: The Responses API doesn't include 'provider' field directly\n // Map Responses API field names to Chat Completions API names\n const providerMetadata = buildProviderMetadata({\n id: response.id,\n provider: undefined, // Responses API doesn't expose provider in response\n usage: response.usage\n ? {\n promptTokens: response.usage.inputTokens,\n completionTokens: response.usage.outputTokens,\n totalTokens: response.usage.totalTokens,\n cost: response.usage.cost ?? undefined,\n // Map inputTokensDetails -> promptTokensDetails\n promptTokensDetails: response.usage.inputTokensDetails\n ? {\n cachedTokens: response.usage.inputTokensDetails.cachedTokens,\n }\n : undefined,\n // Map outputTokensDetails -> completionTokensDetails\n completionTokensDetails: response.usage.outputTokensDetails\n ? {\n reasoningTokens:\n response.usage.outputTokensDetails.reasoningTokens,\n }\n : undefined,\n }\n : undefined,\n });\n\n return {\n content,\n finishReason,\n usage,\n warnings,\n providerMetadata,\n request: {\n body: requestParams,\n },\n response: {\n id: response.id,\n timestamp: new Date(response.createdAt * 1000),\n modelId: response.model,\n },\n };\n }\n\n async doStream(\n options: LanguageModelV3CallOptions\n ): Promise<LanguageModelV3StreamResult> {\n const warnings: SharedV3Warning[] = [];\n\n // Create OpenRouter client\n const client = new OpenRouter({\n apiKey: this.settings.apiKey,\n serverURL: this.settings.baseURL,\n });\n\n // Convert messages to OpenRouter Responses API format\n const openRouterInput = convertToOpenRouterMessages(options.prompt);\n\n // Convert tools to Responses API format\n const tools = convertToolsToResponsesFormat(options.tools, warnings);\n\n // Convert toolChoice to Responses API format\n const toolChoice = convertToolChoiceToResponsesFormat(options.toolChoice);\n\n // Convert responseFormat to Responses API text.format\n const text = convertResponseFormatToText(options.responseFormat);\n\n // Build request parameters for Responses API (streaming)\n const requestParams: OpenResponsesRequest & { stream: true } = {\n model: this.modelId,\n input: openRouterInput as OpenResponsesRequest['input'],\n stream: true,\n ...(options.maxOutputTokens !== undefined && {\n maxOutputTokens: options.maxOutputTokens,\n }),\n ...(options.temperature !== undefined && {\n temperature: options.temperature,\n }),\n ...(options.topP !== undefined && { topP: options.topP }),\n ...(tools.length > 0 && { tools }),\n ...(toolChoice !== undefined && { toolChoice }),\n ...(text !== undefined && { text }),\n };\n\n // Make the streaming request using Responses API\n const combinedHeaders = normalizeHeaders(\n combineHeaders(this.settings.headers, options.headers)\n );\n\n const eventStream = (await client.beta.responses.send(requestParams, {\n fetchOptions: {\n signal: options.abortSignal,\n headers: combinedHeaders,\n },\n })) as EventStream<OpenResponsesStreamEvent>;\n\n // Track state for stream transformation\n const state = createStreamState();\n\n // Transform the EventStream to AI SDK V3 stream parts\n const transformedStream = new ReadableStream<LanguageModelV3StreamPart>({\n async start(controller) {\n // Emit stream-start first\n controller.enqueue({\n type: 'stream-start',\n warnings,\n });\n\n try {\n for await (const event of eventStream) {\n const parts = transformResponsesEvent(event, state);\n for (const part of parts) {\n controller.enqueue(part);\n }\n }\n } catch (error) {\n controller.enqueue({\n type: 'error',\n error,\n });\n } finally {\n controller.close();\n }\n },\n });\n\n return {\n stream: transformedStream,\n request: {\n body: requestParams,\n },\n };\n }\n}\n\n/**\n * Stream state for tracking response metadata and content parts.\n */\ninterface StreamState {\n responseId: string | undefined;\n responseModel: string | undefined;\n responseCreated: number | undefined;\n textStarted: boolean;\n textId: string;\n reasoningStarted: boolean;\n reasoningId: string;\n textEnded: boolean;\n reasoningEnded: boolean;\n sourceIds: string[];\n toolCalls: Map<string, { name?: string; argumentsStarted: boolean }>;\n}\n\nfunction createStreamState(): StreamState {\n return {\n responseId: undefined,\n responseModel: undefined,\n responseCreated: undefined,\n textStarted: false,\n textId: 'text-0',\n reasoningStarted: false,\n reasoningId: 'reasoning-0',\n textEnded: false,\n reasoningEnded: false,\n sourceIds: [],\n toolCalls: new Map(),\n };\n}\n\n/**\n * Transform a Responses API stream event to AI SDK V3 stream parts.\n */\nfunction transformResponsesEvent(\n event: OpenResponsesStreamEvent,\n state: StreamState\n): LanguageModelV3StreamPart[] {\n const parts: LanguageModelV3StreamPart[] = [];\n\n switch (event.type) {\n // Response lifecycle events\n case 'response.created':\n case 'response.in_progress': {\n // Capture response metadata from initial events\n if (event.response) {\n state.responseId = event.response.id;\n state.responseModel = event.response.model;\n state.responseCreated = event.response.createdAt;\n }\n break;\n }\n\n // Text streaming\n case 'response.output_text.delta': {\n // Emit text-start if not started\n if (!state.textStarted) {\n state.textStarted = true;\n parts.push({\n type: 'text-start',\n id: state.textId,\n });\n }\n\n // Emit text-delta\n if (event.delta && event.delta.length > 0) {\n parts.push({\n type: 'text-delta',\n id: state.textId,\n delta: event.delta,\n });\n }\n break;\n }\n\n case 'response.output_text.done': {\n // End text if started and not ended\n if (state.textStarted && !state.textEnded) {\n state.textEnded = true;\n parts.push({\n type: 'text-end',\n id: state.textId,\n });\n }\n break;\n }\n\n // Reasoning streaming\n case 'response.reasoning_text.delta': {\n // Emit reasoning-start if not started\n if (!state.reasoningStarted) {\n state.reasoningStarted = true;\n parts.push({\n type: 'reasoning-start',\n id: state.reasoningId,\n });\n }\n\n // Emit reasoning-delta\n if (event.delta && event.delta.length > 0) {\n parts.push({\n type: 'reasoning-delta',\n id: state.reasoningId,\n delta: event.delta,\n });\n }\n break;\n }\n\n // Function call arguments streaming\n case 'response.function_call_arguments.delta': {\n const toolCallId = event.itemId;\n let toolState = state.toolCalls.get(toolCallId);\n\n if (!toolState) {\n toolState = { argumentsStarted: false };\n state.toolCalls.set(toolCallId, toolState);\n }\n\n // Emit tool-input-start if not started\n if (!toolState.argumentsStarted) {\n toolState.argumentsStarted = true;\n parts.push({\n type: 'tool-input-start',\n id: toolCallId,\n toolName: toolState.name ?? '', // Will be filled in by output_item.added\n });\n }\n\n // Emit tool-input-delta\n if (event.delta && event.delta.length > 0) {\n parts.push({\n type: 'tool-input-delta',\n id: toolCallId,\n delta: event.delta,\n });\n }\n break;\n }\n\n case 'response.function_call_arguments.done': {\n const toolCallId = event.itemId;\n const toolState = state.toolCalls.get(toolCallId);\n\n // If we haven't started tool call yet, emit start + delta with full args\n if (!toolState?.argumentsStarted) {\n parts.push({\n type: 'tool-input-start',\n id: toolCallId,\n toolName: event.name,\n });\n // Default to empty object when arguments is undefined/empty\n const args = event.arguments || '{}';\n parts.push({\n type: 'tool-input-delta',\n id: toolCallId,\n delta: args,\n });\n }\n\n // Emit tool-input-end\n parts.push({\n type: 'tool-input-end',\n id: toolCallId,\n });\n\n // Emit tool-call with complete tool call data\n // Default to empty object when arguments is undefined/empty\n // (some providers omit arguments for tools with no parameters)\n parts.push({\n type: 'tool-call',\n toolCallId,\n toolName: event.name,\n input: event.arguments || '{}',\n });\n break;\n }\n\n // Output item events (for function call metadata)\n case 'response.output_item.added': {\n if (event.item.type === 'function_call') {\n const funcItem = event.item as {\n type: 'function_call';\n callId?: string;\n name: string;\n };\n const toolCallId = funcItem.callId ?? `tool-${event.outputIndex}`;\n const toolState = state.toolCalls.get(toolCallId) ?? {\n argumentsStarted: false,\n };\n toolState.name = funcItem.name;\n state.toolCalls.set(toolCallId, toolState);\n }\n break;\n }\n\n // Annotation events (web search sources)\n case 'response.output_text.annotation.added': {\n const annotation = event.annotation;\n if (annotation.type === 'url_citation') {\n const urlAnnotation = annotation as {\n type: 'url_citation';\n url: string;\n title: string;\n };\n const sourceId = `source-${state.sourceIds.length}`;\n state.sourceIds.push(sourceId);\n parts.push({\n type: 'source',\n sourceType: 'url',\n id: sourceId,\n url: urlAnnotation.url,\n title: urlAnnotation.title,\n });\n }\n break;\n }\n\n // Response completed - extract final usage data\n case 'response.completed': {\n // End text if started and not ended\n if (state.textStarted && !state.textEnded) {\n state.textEnded = true;\n parts.push({\n type: 'text-end',\n id: state.textId,\n });\n }\n\n // End reasoning if started and not ended\n if (state.reasoningStarted && !state.reasoningEnded) {\n state.reasoningEnded = true;\n parts.push({\n type: 'reasoning-end',\n id: state.reasoningId,\n });\n }\n\n // Emit response-metadata\n const response = event.response;\n parts.push({\n type: 'response-metadata',\n id: response.id,\n timestamp: response.createdAt\n ? new Date(response.createdAt * 1000)\n : undefined,\n modelId: response.model,\n });\n\n // Build finish reason based on response status\n const finishReason = mapOpenRouterFinishReason(\n response.status === 'completed' ? 'stop' : response.status ?? 'stop'\n );\n\n // Build usage\n const usage = buildUsage(\n response.usage\n ? {\n inputTokens: response.usage.inputTokens,\n outputTokens: response.usage.outputTokens,\n }\n : undefined\n );\n\n // Build provider metadata\n // Map Responses API field names to Chat Completions API names\n const providerMetadata = buildProviderMetadata({\n id: response.id,\n provider: undefined, // Responses API doesn't expose provider\n usage: response.usage\n ? {\n promptTokens: response.usage.inputTokens,\n completionTokens: response.usage.outputTokens,\n totalTokens: response.usage.totalTokens,\n cost: response.usage.cost ?? undefined,\n // Map inputTokensDetails -> promptTokensDetails\n promptTokensDetails: response.usage.inputTokensDetails\n ? {\n cachedTokens:\n response.usage.inputTokensDetails.cachedTokens,\n }\n : undefined,\n // Map outputTokensDetails -> completionTokensDetails\n completionTokensDetails: response.usage.outputTokensDetails\n ? {\n reasoningTokens:\n response.usage.outputTokensDetails.reasoningTokens,\n }\n : undefined,\n }\n : undefined,\n });\n\n parts.push({\n type: 'finish',\n finishReason,\n usage,\n providerMetadata,\n });\n break;\n }\n\n // Response incomplete or failed\n case 'response.incomplete':\n case 'response.failed': {\n // End any open content parts\n if (state.textStarted && !state.textEnded) {\n state.textEnded = true;\n parts.push({\n type: 'text-end',\n id: state.textId,\n });\n }\n if (state.reasoningStarted && !state.reasoningEnded) {\n state.reasoningEnded = true;\n parts.push({\n type: 'reasoning-end',\n id: state.reasoningId,\n });\n }\n\n const response = event.response;\n parts.push({\n type: 'response-metadata',\n id: response.id,\n timestamp: response.createdAt\n ? new Date(response.createdAt * 1000)\n : undefined,\n modelId: response.model,\n });\n\n // Map finish reason\n const finishReason =\n event.type === 'response.failed'\n ? mapOpenRouterFinishReason('error')\n : mapOpenRouterFinishReason(response.status ?? 'incomplete');\n\n const usage = buildUsage(\n response.usage\n ? {\n inputTokens: response.usage.inputTokens,\n outputTokens: response.usage.outputTokens,\n }\n : undefined\n );\n\n const providerMetadata = buildProviderMetadata({\n id: response.id,\n provider: undefined,\n usage: response.usage\n ? {\n promptTokens: response.usage.inputTokens,\n completionTokens: response.usage.outputTokens,\n totalTokens: response.usage.totalTokens,\n cost: response.usage.cost ?? undefined,\n // Map inputTokensDetails -> promptTokensDetails\n promptTokensDetails: response.usage.inputTokensDetails\n ? {\n cachedTokens:\n response.usage.inputTokensDetails.cachedTokens,\n }\n : undefined,\n // Map outputTokensDetails -> completionTokensDetails\n completionTokensDetails: response.usage.outputTokensDetails\n ? {\n reasoningTokens:\n response.usage.outputTokensDetails.reasoningTokens,\n }\n : undefined,\n }\n : undefined,\n });\n\n parts.push({\n type: 'finish',\n finishReason,\n usage,\n providerMetadata,\n });\n break;\n }\n\n // Error event\n case 'error': {\n const errorEvent = event as {\n type: 'error';\n error?: { message?: string };\n };\n parts.push({\n type: 'error',\n error: new Error(\n errorEvent.error?.message ?? 'Unknown streaming error'\n ),\n });\n break;\n }\n\n // Ignored events (handled implicitly or not needed)\n case 'response.output_item.done':\n case 'response.content_part.added':\n case 'response.content_part.done':\n case 'response.refusal.delta':\n case 'response.refusal.done':\n case 'response.reasoning_text.done':\n case 'response.reasoning_summary_part.added':\n case 'response.reasoning_summary_part.done':\n case 'response.reasoning_summary_text.delta':\n case 'response.reasoning_summary_text.done':\n case 'response.image_generation_call.in_progress':\n case 'response.image_generation_call.generating':\n case 'response.image_generation_call.partial_image':\n case 'response.image_generation_call.completed':\n // These events are either handled by other events or not relevant for AI SDK\n break;\n }\n\n return parts;\n}\n\n/**\n * Convert AI SDK tools to OpenRouter Responses API format.\n * Only 'function' type tools are supported.\n */\nfunction convertToolsToResponsesFormat(\n tools: LanguageModelV3CallOptions['tools'],\n warnings: SharedV3Warning[]\n): OpenResponsesRequestToolFunction[] {\n if (!tools || tools.length === 0) {\n return [];\n }\n\n return tools\n .map((tool): OpenResponsesRequestToolFunction | null => {\n if (tool.type !== 'function') {\n warnings.push({\n type: 'unsupported',\n feature: `tool type '${tool.type}'`,\n details: `Only 'function' type tools are supported. Tool '${(tool as { name?: string }).name ?? 'unknown'}' has type '${tool.type}'.`,\n });\n return null;\n }\n\n const functionTool = tool as LanguageModelV3FunctionTool;\n return {\n type: 'function',\n name: functionTool.name,\n description: functionTool.description ?? null,\n parameters: functionTool.inputSchema as { [k: string]: unknown } | null,\n };\n })\n .filter((tool): tool is OpenResponsesRequestToolFunction => tool !== null);\n}\n\n/**\n * Convert AI SDK toolChoice to OpenRouter Responses API format.\n *\n * Mapping:\n * - 'auto' -> 'auto'\n * - 'none' -> 'none'\n * - 'required' -> 'required'\n * - { type: 'tool', toolName } -> { type: 'function', name: toolName }\n */\nfunction convertToolChoiceToResponsesFormat(\n toolChoice: LanguageModelV3ToolChoice | undefined\n): OpenAIResponsesToolChoiceUnion | undefined {\n if (!toolChoice) {\n return undefined;\n }\n\n switch (toolChoice.type) {\n case 'auto':\n return 'auto';\n case 'none':\n return 'none';\n case 'required':\n return 'required';\n case 'tool':\n return {\n type: 'function',\n name: toolChoice.toolName,\n };\n default:\n return undefined;\n }\n}\n\n/**\n * Convert AI SDK responseFormat to OpenRouter Responses API text.format.\n *\n * Mapping:\n * - { type: 'text' } -> { type: 'text' }\n * - { type: 'json' } -> { type: 'json_object' } (no schema)\n * - { type: 'json', schema, name } -> { type: 'json_schema', name, schema } (with schema)\n */\nfunction convertResponseFormatToText(\n responseFormat: LanguageModelV3CallOptions['responseFormat']\n): OpenResponsesRequest['text'] | undefined {\n if (!responseFormat) {\n return undefined;\n }\n\n if (responseFormat.type === 'text') {\n return {\n format: { type: 'text' },\n };\n }\n\n if (responseFormat.type === 'json') {\n // If a schema is provided, use json_schema format\n if (responseFormat.schema) {\n return {\n format: {\n type: 'json_schema',\n name: responseFormat.name ?? 'response',\n description: responseFormat.description,\n schema: responseFormat.schema as { [k: string]: unknown },\n },\n };\n }\n // No schema - use simple json_object format\n return {\n format: { type: 'json_object' },\n };\n }\n\n return undefined;\n}\n","import type { JSONObject } from '@ai-sdk/provider';\nimport type { ChatGenerationTokenUsage } from '@openrouter/sdk/models';\n\n/**\n * OpenRouter-specific provider metadata structure.\n */\nexport interface OpenRouterProviderMetadata {\n /**\n * The response ID from OpenRouter.\n */\n responseId?: string;\n\n /**\n * The upstream provider that served the request.\n */\n provider?: string;\n\n /**\n * Detailed usage information.\n */\n usage?: {\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n promptTokensDetails?: {\n cachedTokens?: number;\n cacheWriteTokens?: number;\n audioTokens?: number;\n videoTokens?: number;\n };\n completionTokensDetails?: {\n reasoningTokens?: number;\n imageTokens?: number;\n };\n /**\n * Cost in USD (omit if unavailable).\n */\n cost?: number;\n /**\n * Whether the request used BYOK (Bring Your Own Key).\n */\n isByok?: boolean;\n /**\n * Detailed cost breakdown.\n */\n costDetails?: JSONObject;\n };\n}\n\n/**\n * Extended prompt tokens details with fields not in SDK types.\n */\nexport interface ExtendedPromptTokensDetails {\n cachedTokens?: number | null;\n cacheWriteTokens?: number | null;\n audioTokens?: number | null;\n videoTokens?: number | null;\n}\n\n/**\n * Extended completion tokens details with fields not in SDK types.\n */\nexport interface ExtendedCompletionTokensDetails {\n reasoningTokens?: number | null;\n imageTokens?: number | null;\n}\n\n/**\n * Extended usage type with additional fields from raw OpenRouter API response.\n * The SDK types don't include cost/is_byok but the API returns them.\n */\nexport interface OpenRouterUsageExtended extends Omit<ChatGenerationTokenUsage, 'promptTokensDetails' | 'completionTokensDetails'> {\n cost?: number;\n isByok?: boolean;\n costDetails?: JSONObject;\n promptTokensDetails?: ExtendedPromptTokensDetails | null;\n completionTokensDetails?: ExtendedCompletionTokensDetails | null;\n}\n\n/**\n * Response data from OpenRouter API used to build provider metadata.\n * Note: The SDK transforms snake_case to camelCase for all fields.\n * The `provider` field exists in raw API responses but isn't in SDK types.\n */\nexport interface OpenRouterResponseData {\n id?: string;\n /**\n * The upstream provider that served the request (e.g. \"Google\", \"Anthropic\").\n * This field exists in the raw API response but isn't in SDK TypeScript types.\n */\n provider?: string;\n /**\n * Usage data in camelCase (as transformed by SDK).\n */\n usage?: OpenRouterUsageExtended;\n}\n\n/**\n * Filters out undefined values from an object, returning only defined properties.\n * This ensures providerMetadata is valid JSON (undefined is not a valid JSON value).\n */\nfunction filterUndefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n return Object.fromEntries(\n Object.entries(obj).filter(([_, v]) => v !== undefined)\n ) as Partial<T>;\n}\n\n/**\n * Builds provider metadata from OpenRouter API response data.\n *\n * @param response - The response data from OpenRouter API (with camelCase fields from SDK).\n * @returns Provider metadata in the format expected by AI SDK.\n */\nexport function buildProviderMetadata(\n response: OpenRouterResponseData | undefined\n): Record<string, JSONObject> | undefined {\n if (!response) {\n return undefined;\n }\n\n const usage = response.usage;\n const usageMetadata: OpenRouterProviderMetadata['usage'] | undefined = usage\n ? filterUndefined({\n promptTokens: usage.promptTokens,\n completionTokens: usage.completionTokens,\n totalTokens: usage.totalTokens,\n ...(usage.promptTokensDetails && {\n promptTokensDetails: filterUndefined({\n cachedTokens: usage.promptTokensDetails.cachedTokens ?? undefined,\n cacheWriteTokens: usage.promptTokensDetails.cacheWriteTokens ?? undefined,\n audioTokens: usage.promptTokensDetails.audioTokens ?? undefined,\n videoTokens: usage.promptTokensDetails.videoTokens ?? undefined,\n }),\n }),\n ...(usage.completionTokensDetails && {\n completionTokensDetails: filterUndefined({\n reasoningTokens: usage.completionTokensDetails.reasoningTokens ?? undefined,\n imageTokens: usage.completionTokensDetails.imageTokens ?? undefined,\n }),\n }),\n cost: usage.cost,\n isByok: usage.isByok,\n costDetails: usage.costDetails,\n })\n : undefined;\n\n const metadata: OpenRouterProviderMetadata = filterUndefined({\n responseId: response.id,\n provider: response.provider,\n usage: usageMetadata,\n });\n\n return {\n openrouter: metadata as unknown as JSONObject,\n };\n}\n","import type { LanguageModelV3Usage, JSONObject } from '@ai-sdk/provider';\n\n/**\n * Raw usage data from OpenRouter API response.\n */\nexport interface OpenRouterRawUsage {\n inputTokens?: number;\n outputTokens?: number;\n inputTokensDetails?: {\n cachedTokens?: number;\n };\n outputTokensDetails?: {\n reasoningTokens?: number;\n };\n}\n\n/**\n * Builds a LanguageModelV3Usage object from OpenRouter API usage data.\n *\n * @param usage - The raw usage data from the OpenRouter API response.\n * @returns A LanguageModelV3Usage object with standardized token counts.\n */\nexport function buildUsage(usage: OpenRouterRawUsage | undefined): LanguageModelV3Usage {\n if (!usage) {\n return {\n inputTokens: {\n total: 0,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: 0,\n text: undefined,\n reasoning: undefined,\n },\n raw: undefined,\n };\n }\n\n // Convert to JSONObject-compatible format for raw field\n const rawUsage: JSONObject = {\n inputTokens: usage.inputTokens ?? null,\n outputTokens: usage.outputTokens ?? null,\n ...(usage.inputTokensDetails && {\n inputTokensDetails: {\n cachedTokens: usage.inputTokensDetails.cachedTokens ?? null,\n },\n }),\n ...(usage.outputTokensDetails && {\n outputTokensDetails: {\n reasoningTokens: usage.outputTokensDetails.reasoningTokens ?? null,\n },\n }),\n };\n\n return {\n inputTokens: {\n total: usage.inputTokens ?? 0,\n noCache: undefined,\n cacheRead: usage.inputTokensDetails?.cachedTokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: usage.outputTokens ?? 0,\n text: undefined,\n reasoning: usage.outputTokensDetails?.reasoningTokens,\n },\n raw: rawUsage,\n };\n}\n","import type {\n LanguageModelV3Prompt,\n LanguageModelV3Message,\n LanguageModelV3TextPart,\n LanguageModelV3FilePart,\n LanguageModelV3ReasoningPart,\n LanguageModelV3ToolCallPart,\n LanguageModelV3ToolResultPart,\n LanguageModelV3ToolResultOutput,\n JSONValue,\n} from '@ai-sdk/provider';\n\n/**\n * OpenRouter Responses API input item types.\n * These match the OpenResponsesEasyInputMessage format used by the Responses API.\n */\nexport type OpenRouterInputItem =\n | OpenRouterEasyInputMessage\n | OpenRouterFunctionCall\n | OpenRouterFunctionCallOutput;\n\n/**\n * Reasoning details item format for API requests.\n * Used to preserve reasoning context across multi-turn conversations.\n */\nexport interface OpenRouterReasoningDetailItem {\n type: 'reasoning.text' | 'reasoning.summary' | 'reasoning.encrypted';\n id?: string;\n format?: string | null;\n index: number;\n text?: string; // For reasoning.text\n signature?: string | null; // For reasoning.text (Claude)\n summary?: string; // For reasoning.summary\n data?: string; // For reasoning.encrypted (Gemini)\n}\n\n/**\n * Reasoning object for assistant messages.\n * Contains the reasoning details to send back to the API.\n */\nexport interface OpenRouterReasoning {\n text?: string;\n summary?: string;\n encrypted?: string;\n}\n\n/**\n * Easy input message format for Responses API.\n * Supports user, system, assistant, and developer roles.\n */\nexport interface OpenRouterEasyInputMessage {\n type?: 'message';\n role: 'user' | 'system' | 'assistant' | 'developer';\n content: string | OpenRouterInputContent[];\n reasoning?: OpenRouterReasoning;\n}\n\nexport interface OpenRouterFunctionCall {\n type: 'function_call';\n callId: string;\n name: string;\n arguments: string;\n}\n\nexport interface OpenRouterFunctionCallOutput {\n type: 'function_call_output';\n callId: string;\n output: string;\n status: 'completed' | 'incomplete';\n}\n\n/**\n * Input content types for Responses API.\n * Uses 'input_text', 'input_image', 'input_file' type prefixes.\n */\nexport type OpenRouterInputContent =\n | { type: 'input_text'; text: string }\n | { type: 'input_image'; imageUrl: string; detail?: 'auto' | 'low' | 'high' }\n | { type: 'input_file'; fileUrl: string; filename?: string };\n\n/**\n * Converts AI SDK V3 prompt format to OpenRouter Responses API input format.\n *\n * Mapping table:\n * - system { content } -> { role: 'system', content: string }\n * - user text -> { role: 'user', content: [{ type: 'input_text', text }] }\n * - user image -> { role: 'user', content: [{ type: 'input_image', imageUrl }] }\n * - user file -> { role: 'user', content: [{ type: 'input_file', fileUrl }] }\n * - assistant text -> { role: 'assistant', content: string }\n * - assistant tool-call -> { type: 'function_call', ... }\n * - tool result -> { type: 'function_call_output', ... }\n *\n * @param prompt - The AI SDK V3 prompt\n * @returns Array of input items in OpenRouter Responses API format\n */\nexport function convertToOpenRouterMessages(\n prompt: LanguageModelV3Prompt\n): OpenRouterInputItem[] {\n const result: OpenRouterInputItem[] = [];\n\n for (const message of prompt) {\n const converted = convertMessage(message);\n result.push(...converted);\n }\n\n return result;\n}\n\n/**\n * Convert a single V3 message to OpenRouter Responses API format.\n * May return multiple items (e.g., when assistant has text + tool calls).\n */\nfunction convertMessage(message: LanguageModelV3Message): OpenRouterInputItem[] {\n // Extract providerOptions from the message for reasoning_details\n const messageWithOptions = message as LanguageModelV3Message & {\n providerOptions?: Record<string, Record<string, unknown>>;\n providerMetadata?: Record<string, Record<string, unknown>>;\n };\n const providerOptions = messageWithOptions.providerOptions;\n const providerMetadata = messageWithOptions.providerMetadata;\n\n switch (message.role) {\n case 'system':\n return [{ role: 'system', content: message.content }];\n\n case 'user':\n return [convertUserMessage(message.content)];\n\n case 'assistant':\n return convertAssistantMessage(message.content, providerMetadata, providerOptions);\n\n case 'tool':\n return convertToolMessage(message.content);\n\n default: {\n // TypeScript exhaustiveness check\n const _exhaustive: never = message;\n throw new Error(`Unknown message role: ${(_exhaustive as { role: string }).role}`);\n }\n }\n}\n\n/**\n * Convert user message content parts to OpenRouter Responses API format.\n */\nfunction convertUserMessage(\n content: Array<LanguageModelV3TextPart | LanguageModelV3FilePart>\n): OpenRouterEasyInputMessage {\n const convertedContent: OpenRouterInputContent[] = [];\n\n for (const part of content) {\n switch (part.type) {\n case 'text': {\n convertedContent.push({ type: 'input_text', text: part.text });\n break;\n }\n\n case 'file':\n convertedContent.push(convertFilePart(part));\n break;\n\n default: {\n // TypeScript exhaustiveness check\n const _exhaustive: never = part;\n throw new Error(`Unknown user content type: ${(_exhaustive as { type: string }).type}`);\n }\n }\n }\n\n return { role: 'user', content: convertedContent };\n}\n\n/**\n * Convert a file part to the appropriate OpenRouter Responses API format.\n *\n * OpenRouter's Responses API uses 'input_image' for images and 'input_file' for other files.\n */\nfunction convertFilePart(part: LanguageModelV3FilePart): OpenRouterInputContent {\n const url = convertDataContent(part.data, part.mediaType);\n \n // Check if it's an image based on media type\n if (part.mediaType.startsWith('image/')) {\n return {\n type: 'input_image',\n imageUrl: url,\n detail: 'auto',\n };\n }\n \n // For other file types (PDF, etc.), use input_file\n return {\n type: 'input_file',\n fileUrl: url,\n };\n}\n\n/**\n * Convert data content (URL, string, or Uint8Array) to a string URL or data URI.\n */\nfunction convertDataContent(\n data: URL | string | Uint8Array,\n mediaType: string\n): string {\n if (data instanceof URL) {\n return data.toString();\n }\n\n if (data instanceof Uint8Array) {\n // Convert Uint8Array to base64 data URI\n const base64 = uint8ArrayToBase64(data);\n return `data:${mediaType};base64,${base64}`;\n }\n\n // String - could be URL or base64 data\n // If it starts with http(s) or data:, treat as URL/data URI\n if (data.startsWith('http://') || data.startsWith('https://') || data.startsWith('data:')) {\n return data;\n }\n\n // Otherwise assume it's base64 encoded data\n return `data:${mediaType};base64,${data}`;\n}\n\n/**\n * Convert Uint8Array to base64 string.\n */\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n // Use browser-compatible base64 encoding\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n}\n\n/**\n * SDK format for reasoning items returned from OpenRouter.\n * Used when extracting reasoning_details from providerMetadata.\n */\ninterface SdkReasoningItem {\n type?: string;\n id?: string;\n format?: string | null;\n signature?: string | null;\n content?: Array<{ type: string; text: string }>;\n summary?: Array<{ type: string; text: string }>;\n encryptedContent?: string;\n // Also support flattened API format\n text?: string;\n data?: string;\n index?: number;\n}\n\n/**\n * Extract reasoning_details from providerMetadata or providerOptions.\n * Checks multiple locations for backwards compatibility.\n */\nfunction extractReasoningDetails(\n content: Array<\n | LanguageModelV3TextPart\n | LanguageModelV3FilePart\n | LanguageModelV3ReasoningPart\n | LanguageModelV3ToolCallPart\n | LanguageModelV3ToolResultPart\n >,\n providerMetadata?: Record<string, Record<string, unknown>>,\n providerOptions?: Record<string, Record<string, unknown>>,\n): JSONValue[] | undefined {\n // Check message-level metadata first\n const messageLevel =\n providerOptions?.openrouter?.reasoning_details ??\n providerMetadata?.openrouter?.reasoning_details;\n\n if (messageLevel && Array.isArray(messageLevel) && messageLevel.length > 0) {\n return messageLevel as JSONValue[];\n }\n\n // Check reasoning content parts for part-level metadata\n for (const part of content) {\n if (part.type === 'reasoning') {\n const partWithMeta = part as LanguageModelV3ReasoningPart & {\n providerMetadata?: Record<string, { reasoning_details?: JSONValue[] }>;\n providerOptions?: Record<string, { reasoning_details?: JSONValue[] }>;\n };\n const partLevel =\n partWithMeta.providerOptions?.openrouter?.reasoning_details ??\n partWithMeta.providerMetadata?.openrouter?.reasoning_details;\n if (partLevel && Array.isArray(partLevel) && partLevel.length > 0) {\n return partLevel as JSONValue[];\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Transform SDK reasoning format to API request format.\n * Flattens the structure for sending back to OpenRouter.\n */\nfunction transformReasoningToApiFormat(\n sdkItems: JSONValue[],\n): OpenRouterReasoningDetailItem[] {\n const apiItems: OpenRouterReasoningDetailItem[] = [];\n\n for (const rawItem of sdkItems) {\n if (typeof rawItem !== 'object' || rawItem === null) {\n continue;\n }\n const item = rawItem as SdkReasoningItem;\n\n const baseProps = {\n id: item.id,\n format: item.format ?? null,\n };\n\n let index = item.index ?? 0;\n\n // Handle already-flattened API format (reasoning.text, reasoning.summary, reasoning.encrypted)\n if (item.type === 'reasoning.text' && item.text !== undefined) {\n apiItems.push({\n type: 'reasoning.text',\n text: item.text,\n signature: item.signature ?? null,\n index: index,\n ...baseProps,\n });\n continue;\n }\n\n if (item.type === 'reasoning.summary' && item.summary !== undefined) {\n apiItems.push({\n type: 'reasoning.summary',\n summary: typeof item.summary === 'string' ? item.summary : '',\n index: index,\n ...baseProps,\n });\n continue;\n }\n\n if (item.type === 'reasoning.encrypted' && item.data !== undefined) {\n apiItems.push({\n type: 'reasoning.encrypted',\n data: item.data,\n index: index,\n ...baseProps,\n });\n continue;\n }\n\n // Handle SDK format (type: 'reasoning' with content/summary/encryptedContent)\n if (item.type === 'reasoning' || item.content || item.summary || item.encryptedContent) {\n // Transform content items to reasoning.text\n if (item.content && Array.isArray(item.content)) {\n for (const contentItem of item.content) {\n if (contentItem.type === 'reasoning_text' && contentItem.text) {\n apiItems.push({\n type: 'reasoning.text',\n text: contentItem.text,\n signature: item.signature ?? null,\n index: index++,\n ...baseProps,\n });\n }\n }\n }\n\n // Transform summary items to reasoning.summary\n if (item.summary && Array.isArray(item.summary)) {\n for (const summaryItem of item.summary) {\n if (summaryItem.type === 'summary_text' && summaryItem.text) {\n apiItems.push({\n type: 'reasoning.summary',\n summary: summaryItem.text,\n index: index++,\n ...baseProps,\n });\n }\n }\n }\n\n // Transform encryptedContent to reasoning.encrypted (Gemini)\n if (item.encryptedContent) {\n apiItems.push({\n type: 'reasoning.encrypted',\n data: item.encryptedContent,\n index: index++,\n ...baseProps,\n });\n }\n }\n }\n\n return apiItems;\n}\n\n/**\n * Build OpenRouterReasoning object from reasoning detail items.\n * Combines all items into a single reasoning object for the API.\n */\nfunction buildReasoningFromDetails(\n items: OpenRouterReasoningDetailItem[],\n): OpenRouterReasoning | undefined {\n if (items.length === 0) {\n return undefined;\n }\n\n const reasoning: OpenRouterReasoning = {};\n\n // Collect all text items\n const textItems = items.filter((i) => i.type === 'reasoning.text' && i.text);\n if (textItems.length > 0) {\n reasoning.text = textItems.map((i) => i.text).join('');\n }\n\n // Collect all summary items\n const summaryItems = items.filter(\n (i) => i.type === 'reasoning.summary' && i.summary,\n );\n if (summaryItems.length > 0) {\n reasoning.summary = summaryItems.map((i) => i.summary).join('');\n }\n\n // Collect encrypted content (should be only one)\n const encryptedItem = items.find(\n (i) => i.type === 'reasoning.encrypted' && i.data,\n );\n if (encryptedItem?.data) {\n reasoning.encrypted = encryptedItem.data;\n }\n\n // Return undefined if no content\n if (!reasoning.text && !reasoning.summary && !reasoning.encrypted) {\n return undefined;\n }\n\n return reasoning;\n}\n\n/**\n * Convert assistant message content parts to OpenRouter Responses API format.\n * Tool calls become separate items in the output array.\n * Extracts reasoning_details from providerMetadata for multi-turn continuation.\n */\nfunction convertAssistantMessage(\n content: Array<\n | LanguageModelV3TextPart\n | LanguageModelV3FilePart\n | LanguageModelV3ReasoningPart\n | LanguageModelV3ToolCallPart\n | LanguageModelV3ToolResultPart\n >,\n providerMetadata?: Record<string, Record<string, unknown>>,\n providerOptions?: Record<string, Record<string, unknown>>,\n): OpenRouterInputItem[] {\n const result: OpenRouterInputItem[] = [];\n let textContent = '';\n\n // Extract reasoning details for multi-turn continuation\n const sdkReasoningDetails = extractReasoningDetails(\n content,\n providerMetadata,\n providerOptions,\n );\n const reasoningItems = sdkReasoningDetails\n ? transformReasoningToApiFormat(sdkReasoningDetails)\n : [];\n const reasoning = buildReasoningFromDetails(reasoningItems);\n\n for (const part of content) {\n switch (part.type) {\n case 'text':\n textContent += part.text;\n break;\n\n case 'reasoning':\n // Include reasoning as part of text\n textContent += part.text;\n break;\n\n case 'tool-call':\n // Tool calls are separate items in Responses API\n result.push({\n type: 'function_call',\n callId: part.toolCallId,\n name: part.toolName,\n arguments:\n typeof part.input === 'string'\n ? part.input\n : JSON.stringify(part.input),\n });\n break;\n\n case 'file':\n // Files in assistant messages - skip for now as they're typically for output\n break;\n\n case 'tool-result':\n // Tool results in assistant messages (provider-executed tools)\n result.push(convertToolResult(part));\n break;\n\n default: {\n // TypeScript exhaustiveness check\n const _exhaustive: never = part;\n throw new Error(\n `Unknown assistant content type: ${(_exhaustive as { type: string }).type}`\n );\n }\n }\n }\n\n // If there's text content, add it as an assistant message first\n // Responses API uses simple string content for assistant messages\n if (textContent) {\n const assistantMessage: OpenRouterEasyInputMessage = {\n role: 'assistant',\n content: textContent,\n };\n // Attach reasoning for multi-turn continuation\n if (reasoning) {\n assistantMessage.reasoning = reasoning;\n }\n result.unshift(assistantMessage);\n } else if (reasoning) {\n // Even without text, include reasoning if present (for tool-call only messages)\n const assistantMessage: OpenRouterEasyInputMessage = {\n role: 'assistant',\n content: '',\n };\n assistantMessage.reasoning = reasoning;\n result.unshift(assistantMessage);\n }\n\n return result;\n}\n\n/**\n * Convert tool message content parts to OpenRouter Responses API format.\n */\nfunction convertToolMessage(\n content: Array<LanguageModelV3ToolResultPart | { type: 'tool-approval-response'; approvalId: string; approved: boolean; reason?: string }>\n): OpenRouterInputItem[] {\n const result: OpenRouterInputItem[] = [];\n\n for (const part of content) {\n if (part.type === 'tool-result') {\n result.push(convertToolResult(part));\n }\n // Skip tool-approval-response as it's not directly mapped to OpenRouter format\n }\n\n return result;\n}\n\n/**\n * Convert a tool result part to OpenRouter function_call_output format.\n */\nfunction convertToolResult(part: LanguageModelV3ToolResultPart): OpenRouterFunctionCallOutput {\n const output = convertToolResultOutput(part.output);\n\n return {\n type: 'function_call_output',\n callId: part.toolCallId,\n output: output.value,\n status: output.isError ? 'incomplete' : 'completed',\n };\n}\n\n/**\n * Convert tool result output to a string value.\n */\nfunction convertToolResultOutput(output: LanguageModelV3ToolResultOutput): {\n value: string;\n isError: boolean;\n} {\n switch (output.type) {\n case 'text':\n return { value: output.value, isError: false };\n\n case 'json':\n return { value: JSON.stringify(output.value), isError: false };\n\n case 'execution-denied':\n return {\n value: `Execution denied: ${output.reason ?? 'No reason provided'}`,\n isError: true,\n };\n\n case 'error-text':\n return { value: output.value, isError: true };\n\n case 'error-json':\n return { value: JSON.stringify(output.value), isError: true };\n\n case 'content': {\n // For content array, convert to string representation\n const textParts = output.value\n .filter((item): item is { type: 'text'; text: string } => item.type === 'text')\n .map((item) => item.text);\n return { value: textParts.join('\\n'), isError: false };\n }\n\n default: {\n // TypeScript exhaustiveness check\n const _exhaustive: never = output;\n throw new Error(`Unknown tool result output type: ${(_exhaustive as { type: string }).type}`);\n }\n }\n}\n","/**\n * Reasoning details extraction for multi-turn conversations.\n *\n * WHY: Reasoning models (Claude, Gemini 3, o1) return encrypted/signed reasoning\n * content that MUST be sent back verbatim in subsequent turns. Without preserving\n * and re-sending reasoning_details, the model loses context about its previous\n * thought process, breaking extended reasoning chains.\n *\n * This module handles extraction from OpenRouter Responses API responses and\n * attachment to AI SDK content parts via providerMetadata.\n */\n\nimport type { JSONObject, JSONValue } from '@ai-sdk/provider';\nimport type {\n OpenResponsesNonStreamingResponse,\n OpenResponsesReasoning,\n} from '@openrouter/sdk/models';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Raw reasoning item from OpenRouter response output.\n */\nexport interface ReasoningOutputItem {\n type: 'reasoning';\n id?: string;\n format?: string | null;\n signature?: string | null;\n content?: Array<{ type: string; text: string }>;\n summary?: Array<{ type: string; text: string }>;\n encryptedContent?: string;\n}\n\n/**\n * Reasoning details in SDK format (as returned by OpenRouter).\n * This is the format we store in providerMetadata for round-tripping.\n */\nexport type ReasoningDetails = JSONValue[];\n\n// =============================================================================\n// Extraction Functions\n// =============================================================================\n\n/**\n * Extract reasoning details from a non-streaming OpenRouter Responses API response.\n *\n * Reasoning details can come from:\n * 1. Output items with type 'reasoning' (Responses API format)\n * 2. Message-level reasoning_details field (Chat Completions API format)\n *\n * @param response - The full OpenRouter Responses API response\n * @returns Reasoning details array, or undefined if none found\n */\nexport function extractReasoningDetails(\n response: OpenResponsesNonStreamingResponse\n): ReasoningDetails | undefined {\n const extractedDetails: JSONValue[] = [];\n\n // Extract from output items (Responses API format)\n for (const outputItem of response.output) {\n if ('type' in outputItem && outputItem.type === 'reasoning') {\n const reasoningItem = outputItem as ReasoningOutputItem;\n\n // Store the full reasoning item structure for round-tripping\n // This preserves all provider-specific fields (signature, encryptedContent, etc.)\n extractedDetails.push({\n type: 'reasoning',\n id: reasoningItem.id,\n content: reasoningItem.content,\n summary: reasoningItem.summary,\n encryptedContent: reasoningItem.encryptedContent,\n signature: reasoningItem.signature,\n format: reasoningItem.format,\n } as JSONValue);\n }\n }\n\n return extractedDetails.length > 0 ? extractedDetails : undefined;\n}\n\n/**\n * Extract reasoning details from streaming response output items.\n *\n * Called at the end of streaming when we have the full response.\n *\n * @param outputItems - The output items from the completed stream response\n * @returns Reasoning details array, or undefined if none found\n */\nexport function extractReasoningDetailsFromOutput(\n outputItems: Array<{ type: string; [key: string]: unknown }>\n): ReasoningDetails | undefined {\n const extractedDetails: JSONValue[] = [];\n\n for (const outputItem of outputItems) {\n if (outputItem.type === 'reasoning') {\n const reasoningItem = outputItem as unknown as ReasoningOutputItem;\n\n extractedDetails.push({\n type: 'reasoning',\n id: reasoningItem.id,\n content: reasoningItem.content,\n summary: reasoningItem.summary,\n encryptedContent: reasoningItem.encryptedContent,\n signature: reasoningItem.signature,\n format: reasoningItem.format,\n } as JSONValue);\n }\n }\n\n return extractedDetails.length > 0 ? extractedDetails : undefined;\n}\n\n// =============================================================================\n// Provider Detection\n// =============================================================================\n\n/**\n * Check if reasoning details contain encrypted content (Gemini thoughtSignature).\n *\n * This is important for Gemini 3 models which return 'completed' status\n * but expect continuation when tool calls exist with encrypted reasoning.\n *\n * @param reasoningDetails - The extracted reasoning details\n * @returns True if encrypted content is present\n */\nexport function hasEncryptedReasoning(\n reasoningDetails: ReasoningDetails | undefined\n): boolean {\n if (!reasoningDetails) {\n return false;\n }\n\n return reasoningDetails.some((d) => {\n if (typeof d === 'object' && d !== null) {\n const obj = d as Record<string, unknown>;\n return obj.encryptedContent != null || obj.type === 'reasoning.encrypted';\n }\n return false;\n });\n}\n\n/**\n * Build provider metadata object with reasoning details.\n *\n * @param reasoningDetails - The reasoning details to include\n * @returns Provider metadata object for attachment to content parts (SharedV3ProviderMetadata compatible)\n */\nexport function buildReasoningProviderMetadata(\n reasoningDetails: ReasoningDetails | undefined\n): Record<string, JSONObject> | undefined {\n if (!reasoningDetails || reasoningDetails.length === 0) {\n return undefined;\n }\n\n return {\n openrouter: {\n reasoning_details: reasoningDetails,\n } as JSONObject,\n };\n}\n\n// =============================================================================\n// Re-export types for convenience\n// =============================================================================\n\nexport type { OpenResponsesReasoning };\n","import type { LanguageModelV3FinishReason } from '@ai-sdk/provider';\n\n/**\n * Maps OpenRouter finish reasons to the AI SDK V3 unified format.\n *\n * Mapping table:\n * - 'end_turn', 'stop', 'stop_sequence' -> 'stop'\n * - 'max_tokens', 'length' -> 'length'\n * - 'tool_use', 'tool_calls' -> 'tool-calls'\n * - 'content_filter' -> 'content-filter'\n * - 'error' -> 'error'\n * - null/undefined/unknown -> 'other'\n *\n * @param finishReason - The finish reason from OpenRouter API response\n * @returns Object containing the unified finish reason and raw original value\n */\nexport function mapOpenRouterFinishReason(\n finishReason: string | null | undefined\n): LanguageModelV3FinishReason {\n // Handle null/undefined\n if (finishReason == null) {\n return { unified: 'other', raw: undefined };\n }\n\n // Map to unified format\n switch (finishReason) {\n case 'end_turn':\n case 'stop':\n case 'stop_sequence':\n return { unified: 'stop', raw: finishReason };\n\n case 'max_tokens':\n case 'length':\n return { unified: 'length', raw: finishReason };\n\n case 'tool_use':\n case 'tool_calls':\n return { unified: 'tool-calls', raw: finishReason };\n\n case 'content_filter':\n return { unified: 'content-filter', raw: finishReason };\n\n case 'error':\n return { unified: 'error', raw: finishReason };\n\n default:\n return { unified: 'other', raw: finishReason };\n }\n}\n","import type {\n EmbeddingModelV3,\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport { combineHeaders, normalizeHeaders } from '@ai-sdk/provider-utils';\nimport { OpenRouter } from '@openrouter/sdk';\nimport type { CreateEmbeddingsResponseBody } from '@openrouter/sdk/models/operations';\n\nimport type { OpenRouterModelSettings } from '../openrouter-provider.js';\n\n/**\n * OpenRouter embedding model implementing AI SDK V3 EmbeddingModelV3 interface.\n */\nexport class OpenRouterEmbeddingModel implements EmbeddingModelV3 {\n readonly specificationVersion = 'v3' as const;\n readonly provider = 'openrouter';\n readonly modelId: string;\n\n private readonly settings: OpenRouterModelSettings;\n\n /**\n * Maximum number of embeddings that can be generated in a single API call.\n * Set to 2048 as a reasonable default for most embedding models.\n */\n readonly maxEmbeddingsPerCall = 2048;\n\n /**\n * Whether the model supports parallel calls.\n */\n readonly supportsParallelCalls = true;\n\n constructor(modelId: string, settings: OpenRouterModelSettings) {\n this.modelId = modelId;\n this.settings = settings;\n }\n\n async doEmbed(options: EmbeddingModelV3CallOptions): Promise<EmbeddingModelV3Result> {\n const warnings: SharedV3Warning[] = [];\n\n // Create OpenRouter client\n const client = new OpenRouter({\n apiKey: this.settings.apiKey,\n serverURL: this.settings.baseURL,\n });\n\n // Build request with provider routing options if configured\n const requestParams: {\n model: string;\n input: string[];\n user?: string;\n provider?: { order?: string[]; allowFallbacks?: boolean; requireParameters?: boolean };\n } = {\n model: this.modelId,\n input: options.values,\n };\n\n // Add provider routing options from model settings\n const modelOptions = this.settings.modelOptions;\n if (modelOptions?.user) {\n requestParams.user = modelOptions.user as string;\n }\n if (modelOptions?.provider) {\n requestParams.provider = modelOptions.provider;\n }\n\n // Make the embeddings request\n const combinedHeaders = normalizeHeaders(\n combineHeaders(this.settings.headers, options.headers)\n );\n\n const response = await client.embeddings.generate(requestParams, {\n fetchOptions: {\n signal: options.abortSignal,\n headers: combinedHeaders,\n },\n });\n\n // Handle string response (shouldn't happen in practice but type allows it)\n if (typeof response === 'string') {\n throw new Error(`Unexpected string response from embeddings API: ${response}`);\n }\n\n const responseBody = response as CreateEmbeddingsResponseBody;\n\n // Extract embeddings from response data\n // Sort by index to ensure correct order, then extract embedding vectors\n const sortedData = [...responseBody.data].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));\n const embeddings = sortedData.map((item) => {\n // Embedding can be number[] or base64 string - we only support number[]\n if (typeof item.embedding === 'string') {\n throw new Error('Base64 encoded embeddings are not supported');\n }\n return item.embedding;\n });\n\n return {\n embeddings,\n usage: responseBody.usage\n ? { tokens: responseBody.usage.promptTokens }\n : undefined,\n warnings,\n };\n }\n}\n","import type {\n ImageModelV3,\n ImageModelV3CallOptions,\n SharedV3Warning,\n} from '@ai-sdk/provider';\n\n/**\n * OpenRouter image model implementing AI SDK V3 ImageModelV3 interface.\n *\n * Note: Image generation is Tier 3 functionality. The doGenerate method\n * throws an error with guidance on tracking progress.\n */\nexport class OpenRouterImageModel implements ImageModelV3 {\n readonly specificationVersion = 'v3' as const;\n readonly provider = 'openrouter';\n readonly modelId: string;\n\n /**\n * Maximum number of images that can be generated in a single API call.\n */\n readonly maxImagesPerCall = 1;\n\n constructor(modelId: string, _settings: unknown) {\n this.modelId = modelId;\n }\n\n async doGenerate(_options: ImageModelV3CallOptions): Promise<{\n images: Array<string> | Array<Uint8Array>;\n warnings: Array<SharedV3Warning>;\n response: {\n timestamp: Date;\n modelId: string;\n headers: Record<string, string> | undefined;\n };\n }> {\n throw new Error(\n 'Image generation not yet supported. ' +\n 'See: https://github.com/OpenRouterTeam/ai-sdk-provider/issues/new?title=Image+generation+support'\n );\n }\n}\n","export const VERSION = '6.0.0-alpha.0';\n"],"mappings":"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","names":["import_provider_utils","extractReasoningDetails","extractReasoningDetails","import_provider_utils","import_sdk"]}