ai 5.0.12 → 5.0.13

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","../src/generate-text/generate-text.ts","../src/error/no-output-specified-error.ts","../src/model/resolve-model.ts","../src/error/index.ts","../src/error/invalid-argument-error.ts","../src/error/invalid-stream-part-error.ts","../src/error/invalid-tool-input-error.ts","../src/error/mcp-client-error.ts","../src/error/no-image-generated-error.ts","../src/error/no-object-generated-error.ts","../src/error/no-output-generated-error.ts","../src/error/no-such-tool-error.ts","../src/error/tool-call-repair-error.ts","../src/error/unsupported-model-version-error.ts","../src/prompt/invalid-data-content-error.ts","../src/prompt/invalid-message-role-error.ts","../src/prompt/message-conversion-error.ts","../src/util/download-error.ts","../src/util/retry-error.ts","../src/prompt/convert-to-language-model-prompt.ts","../src/util/detect-media-type.ts","../src/util/download.ts","../src/prompt/data-content.ts","../src/prompt/split-data-url.ts","../src/prompt/prepare-call-settings.ts","../src/prompt/prepare-tools-and-tool-choice.ts","../src/util/is-non-empty-object.ts","../src/prompt/standardize-prompt.ts","../src/prompt/message.ts","../src/types/provider-metadata.ts","../src/types/json-value.ts","../src/prompt/content-part.ts","../src/prompt/wrap-gateway-error.ts","../src/telemetry/assemble-operation-name.ts","../src/telemetry/get-base-telemetry-attributes.ts","../src/telemetry/get-tracer.ts","../src/telemetry/noop-tracer.ts","../src/telemetry/record-span.ts","../src/telemetry/select-telemetry-attributes.ts","../src/telemetry/stringify-for-telemetry.ts","../src/types/usage.ts","../src/util/as-array.ts","../src/util/retry-with-exponential-backoff.ts","../src/util/prepare-retries.ts","../src/generate-text/extract-content-text.ts","../src/generate-text/generated-file.ts","../src/generate-text/parse-tool-call.ts","../src/generate-text/step-result.ts","../src/generate-text/stop-condition.ts","../src/prompt/create-tool-model-output.ts","../src/generate-text/to-response-messages.ts","../src/generate-text/stream-text.ts","../src/util/prepare-headers.ts","../src/text-stream/create-text-stream-response.ts","../src/util/write-to-server-response.ts","../src/text-stream/pipe-text-stream-to-response.ts","../src/ui-message-stream/json-to-sse-transform-stream.ts","../src/ui-message-stream/ui-message-stream-headers.ts","../src/ui-message-stream/create-ui-message-stream-response.ts","../src/ui-message-stream/get-response-ui-message-id.ts","../src/ui/process-ui-message-stream.ts","../src/ui-message-stream/ui-message-chunks.ts","../src/util/merge-objects.ts","../src/util/parse-partial-json.ts","../src/util/fix-json.ts","../src/ui/ui-messages.ts","../src/ui-message-stream/handle-ui-message-stream-finish.ts","../src/ui-message-stream/pipe-ui-message-stream-to-response.ts","../src/util/async-iterable-stream.ts","../src/util/consume-stream.ts","../src/util/create-resolvable-promise.ts","../src/util/create-stitchable-stream.ts","../src/util/delayed-promise.ts","../src/util/filter-stream-errors.ts","../src/util/now.ts","../src/generate-text/run-tools-transformation.ts","../src/agent/agent.ts","../src/embed/embed.ts","../src/util/split-array.ts","../src/embed/embed-many.ts","../src/generate-image/generate-image.ts","../src/generate-object/generate-object.ts","../src/generate-object/output-strategy.ts","../src/generate-object/parse-and-validate-object-result.ts","../src/generate-object/validate-object-generation-input.ts","../src/generate-object/stream-object.ts","../src/util/cosine-similarity.ts","../src/util/data-url.ts","../src/util/is-deep-equal-data.ts","../src/util/serial-job-executor.ts","../src/util/simulate-readable-stream.ts","../src/error/no-speech-generated-error.ts","../src/generate-speech/generated-audio-file.ts","../src/generate-speech/generate-speech.ts","../src/generate-text/output.ts","../src/generate-text/smooth-stream.ts","../src/middleware/default-settings-middleware.ts","../src/util/get-potential-start-index.ts","../src/middleware/extract-reasoning-middleware.ts","../src/middleware/simulate-streaming-middleware.ts","../src/middleware/wrap-language-model.ts","../src/middleware/wrap-provider.ts","../src/registry/custom-provider.ts","../src/registry/no-such-provider-error.ts","../src/registry/provider-registry.ts","../src/tool/mcp/mcp-client.ts","../src/tool/mcp/mcp-sse-transport.ts","../src/tool/mcp/json-rpc-message.ts","../src/tool/mcp/types.ts","../src/tool/mcp/mcp-transport.ts","../src/error/no-transcript-generated-error.ts","../src/transcribe/transcribe.ts","../src/ui/call-completion-api.ts","../src/ui/process-text-stream.ts","../src/ui/chat.ts","../src/ui/convert-file-list-to-file-ui-parts.ts","../src/ui/default-chat-transport.ts","../src/ui/http-chat-transport.ts","../src/ui/convert-to-model-messages.ts","../src/ui/last-assistant-message-is-complete-with-tool-calls.ts","../src/ui/transform-text-to-ui-message-stream.ts","../src/ui/text-stream-chat-transport.ts","../src/ui-message-stream/create-ui-message-stream.ts","../src/ui-message-stream/read-ui-message-stream.ts"],"sourcesContent":["// re-exports:\nexport {\n asSchema,\n createIdGenerator,\n dynamicTool,\n generateId,\n jsonSchema,\n tool,\n zodSchema,\n type IdGenerator,\n type InferToolInput,\n type InferToolOutput,\n type Schema,\n type Tool,\n type ToolCallOptions,\n type ToolExecuteFunction,\n} from '@ai-sdk/provider-utils';\n\n// directory exports\nexport * from './agent';\nexport * from './embed';\nexport * from './error';\nexport * from './generate-image';\nexport * from './generate-object';\nexport * from './generate-speech';\nexport * from './generate-text';\nexport * from './middleware';\nexport * from './prompt';\nexport * from './registry';\nexport * from './text-stream';\nexport * from './tool';\nexport * from './transcribe';\nexport * from './types';\nexport * from './ui';\nexport * from './ui-message-stream';\nexport * from './util';\n\n// telemetry types:\nexport type { TelemetrySettings } from './telemetry/telemetry-settings';\n\n// import globals\nimport './global';\n","import {\n LanguageModelV2,\n LanguageModelV2Content,\n LanguageModelV2ToolCall,\n} from '@ai-sdk/provider';\nimport {\n createIdGenerator,\n executeTool,\n getErrorMessage,\n IdGenerator,\n ProviderOptions,\n} from '@ai-sdk/provider-utils';\nimport { Tracer } from '@opentelemetry/api';\nimport { NoOutputSpecifiedError } from '../error/no-output-specified-error';\nimport { resolveLanguageModel } from '../model/resolve-model';\nimport { ModelMessage } from '../prompt';\nimport { CallSettings } from '../prompt/call-settings';\nimport { convertToLanguageModelPrompt } from '../prompt/convert-to-language-model-prompt';\nimport { prepareCallSettings } from '../prompt/prepare-call-settings';\nimport { prepareToolsAndToolChoice } from '../prompt/prepare-tools-and-tool-choice';\nimport { Prompt } from '../prompt/prompt';\nimport { standardizePrompt } from '../prompt/standardize-prompt';\nimport { wrapGatewayError } from '../prompt/wrap-gateway-error';\nimport { assembleOperationName } from '../telemetry/assemble-operation-name';\nimport { getBaseTelemetryAttributes } from '../telemetry/get-base-telemetry-attributes';\nimport { getTracer } from '../telemetry/get-tracer';\nimport { recordErrorOnSpan, recordSpan } from '../telemetry/record-span';\nimport { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';\nimport { stringifyForTelemetry } from '../telemetry/stringify-for-telemetry';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport { LanguageModel, ToolChoice } from '../types';\nimport { addLanguageModelUsage, LanguageModelUsage } from '../types/usage';\nimport { asArray } from '../util/as-array';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { ContentPart } from './content-part';\nimport { extractContentText } from './extract-content-text';\nimport { GenerateTextResult } from './generate-text-result';\nimport { DefaultGeneratedFile } from './generated-file';\nimport { Output } from './output';\nimport { parseToolCall } from './parse-tool-call';\nimport { PrepareStepFunction } from './prepare-step';\nimport { ResponseMessage } from './response-message';\nimport { DefaultStepResult, StepResult } from './step-result';\nimport {\n isStopConditionMet,\n stepCountIs,\n StopCondition,\n} from './stop-condition';\nimport { toResponseMessages } from './to-response-messages';\nimport { TypedToolCall } from './tool-call';\nimport { ToolCallRepairFunction } from './tool-call-repair-function';\nimport { TypedToolError } from './tool-error';\nimport { ToolOutput } from './tool-output';\nimport { TypedToolResult } from './tool-result';\nimport { ToolSet } from './tool-set';\n\nconst originalGenerateId = createIdGenerator({\n prefix: 'aitxt',\n size: 24,\n});\n\n/**\nCallback that is set using the `onStepFinish` option.\n\n@param stepResult - The result of the step.\n */\nexport type GenerateTextOnStepFinishCallback<TOOLS extends ToolSet> = (\n stepResult: StepResult<TOOLS>,\n) => Promise<void> | void;\n\n/**\nGenerate a text and call tools for a given prompt using a language model.\n\nThis function does not stream the output. If you want to stream the output, use `streamText` instead.\n\n@param model - The language model to use.\n\n@param tools - Tools that are accessible to and can be called by the model. The model needs to support calling tools.\n@param toolChoice - The tool choice strategy. Default: 'auto'.\n\n@param system - A system message that will be part of the prompt.\n@param prompt - A simple text prompt. You can either use `prompt` or `messages` but not both.\n@param messages - A list of messages. You can either use `prompt` or `messages` but not both.\n\n@param maxOutputTokens - Maximum number of tokens to generate.\n@param temperature - Temperature setting.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topP - Nucleus sampling.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topK - Only sample from the top K options for each subsequent token.\nUsed to remove \"long tail\" low probability responses.\nRecommended for advanced use cases only. You usually only need to use temperature.\n@param presencePenalty - Presence penalty setting.\nIt affects the likelihood of the model to repeat information that is already in the prompt.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param frequencyPenalty - Frequency penalty setting.\nIt affects the likelihood of the model to repeatedly use the same words or phrases.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param stopSequences - Stop sequences.\nIf set, the model will stop generating text when one of the stop sequences is generated.\n@param seed - The seed (integer) to use for random sampling.\nIf set and supported by the model, calls will generate deterministic results.\n\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@param experimental_generateMessageId - Generate a unique ID for each message.\n\n@param onStepFinish - Callback that is called when each step (LLM call) is finished, including intermediate steps.\n\n@returns\nA result object that contains the generated text, the results of the tool calls, and additional information.\n */\nexport async function generateText<\n TOOLS extends ToolSet,\n OUTPUT = never,\n OUTPUT_PARTIAL = never,\n>({\n model: modelArg,\n tools,\n toolChoice,\n system,\n prompt,\n messages,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n stopWhen = stepCountIs(1),\n experimental_output: output,\n experimental_telemetry: telemetry,\n providerOptions,\n experimental_activeTools,\n activeTools = experimental_activeTools,\n experimental_prepareStep,\n prepareStep = experimental_prepareStep,\n experimental_repairToolCall: repairToolCall,\n experimental_context,\n _internal: {\n generateId = originalGenerateId,\n currentDate = () => new Date(),\n } = {},\n onStepFinish,\n ...settings\n}: CallSettings &\n Prompt & {\n /**\nThe language model to use.\n */\n model: LanguageModel;\n\n /**\nThe tools that the model can call. The model needs to support calling tools.\n*/\n tools?: TOOLS;\n\n /**\nThe tool choice strategy. Default: 'auto'.\n */\n toolChoice?: ToolChoice<NoInfer<TOOLS>>;\n\n /**\nCondition for stopping the generation when there are tool results in the last step.\nWhen the condition is an array, any of the conditions can be met to stop the generation.\n\n@default stepCountIs(1)\n */\n stopWhen?:\n | StopCondition<NoInfer<TOOLS>>\n | Array<StopCondition<NoInfer<TOOLS>>>;\n\n /**\nOptional telemetry configuration (experimental).\n */\n experimental_telemetry?: TelemetrySettings;\n\n /**\nAdditional provider-specific options. 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\n /**\n * @deprecated Use `activeTools` instead.\n */\n experimental_activeTools?: Array<keyof NoInfer<TOOLS>>;\n\n /**\nLimits the tools that are available for the model to call without\nchanging the tool call and result types in the result.\n */\n activeTools?: Array<keyof NoInfer<TOOLS>>;\n\n /**\nOptional specification for parsing structured outputs from the LLM response.\n */\n experimental_output?: Output<OUTPUT, OUTPUT_PARTIAL>;\n\n /**\n * @deprecated Use `prepareStep` instead.\n */\n experimental_prepareStep?: PrepareStepFunction<NoInfer<TOOLS>>;\n\n /**\nOptional function that you can use to provide different settings for a step.\n */\n prepareStep?: PrepareStepFunction<NoInfer<TOOLS>>;\n\n /**\nA function that attempts to repair a tool call that failed to parse.\n */\n experimental_repairToolCall?: ToolCallRepairFunction<NoInfer<TOOLS>>;\n\n /**\n Callback that is called when each step (LLM call) is finished, including intermediate steps.\n */\n onStepFinish?: GenerateTextOnStepFinishCallback<NoInfer<TOOLS>>;\n\n /**\n * Context that is passed into tool execution.\n *\n * Experimental (can break in patch releases).\n *\n * @default undefined\n */\n experimental_context?: unknown;\n\n /**\n * Internal. For test use only. May change without notice.\n */\n _internal?: {\n generateId?: IdGenerator;\n currentDate?: () => Date;\n };\n }): Promise<GenerateTextResult<TOOLS, OUTPUT>> {\n const model = resolveLanguageModel(modelArg);\n const stopConditions = asArray(stopWhen);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const callSettings = prepareCallSettings(settings);\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries },\n });\n\n const initialPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n });\n\n const tracer = getTracer(telemetry);\n\n try {\n return await recordSpan({\n name: 'ai.generateText',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.generateText',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // model:\n 'ai.model.provider': model.provider,\n 'ai.model.id': model.modelId,\n // specific settings that only make sense on the outer level:\n 'ai.prompt': {\n input: () => JSON.stringify({ system, prompt, messages }),\n },\n },\n }),\n tracer,\n fn: async span => {\n const callSettings = prepareCallSettings(settings);\n\n let currentModelResponse: Awaited<\n ReturnType<LanguageModelV2['doGenerate']>\n > & { response: { id: string; timestamp: Date; modelId: string } };\n let clientToolCalls: Array<TypedToolCall<TOOLS>> = [];\n let clientToolOutputs: Array<ToolOutput<TOOLS>> = [];\n const responseMessages: Array<ResponseMessage> = [];\n const steps: GenerateTextResult<TOOLS, OUTPUT>['steps'] = [];\n\n do {\n const stepInputMessages = [\n ...initialPrompt.messages,\n ...responseMessages,\n ];\n\n const prepareStepResult = await prepareStep?.({\n model,\n steps,\n stepNumber: steps.length,\n messages: stepInputMessages,\n });\n\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: {\n system: prepareStepResult?.system ?? initialPrompt.system,\n messages: prepareStepResult?.messages ?? stepInputMessages,\n },\n supportedUrls: await model.supportedUrls,\n });\n\n const stepModel = resolveLanguageModel(\n prepareStepResult?.model ?? model,\n );\n\n const { toolChoice: stepToolChoice, tools: stepTools } =\n prepareToolsAndToolChoice({\n tools,\n toolChoice: prepareStepResult?.toolChoice ?? toolChoice,\n activeTools: prepareStepResult?.activeTools ?? activeTools,\n });\n\n currentModelResponse = await retry(() =>\n recordSpan({\n name: 'ai.generateText.doGenerate',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.generateText.doGenerate',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // model:\n 'ai.model.provider': stepModel.provider,\n 'ai.model.id': stepModel.modelId,\n // prompt:\n 'ai.prompt.messages': {\n input: () => stringifyForTelemetry(promptMessages),\n },\n 'ai.prompt.tools': {\n // convert the language model level tools:\n input: () => stepTools?.map(tool => JSON.stringify(tool)),\n },\n 'ai.prompt.toolChoice': {\n input: () =>\n stepToolChoice != null\n ? JSON.stringify(stepToolChoice)\n : undefined,\n },\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.system': stepModel.provider,\n 'gen_ai.request.model': stepModel.modelId,\n 'gen_ai.request.frequency_penalty': settings.frequencyPenalty,\n 'gen_ai.request.max_tokens': settings.maxOutputTokens,\n 'gen_ai.request.presence_penalty': settings.presencePenalty,\n 'gen_ai.request.stop_sequences': settings.stopSequences,\n 'gen_ai.request.temperature':\n settings.temperature ?? undefined,\n 'gen_ai.request.top_k': settings.topK,\n 'gen_ai.request.top_p': settings.topP,\n },\n }),\n tracer,\n fn: async span => {\n const result = await stepModel.doGenerate({\n ...callSettings,\n tools: stepTools,\n toolChoice: stepToolChoice,\n responseFormat: output?.responseFormat,\n prompt: promptMessages,\n providerOptions,\n abortSignal,\n headers,\n });\n\n // Fill in default values:\n const responseData = {\n id: result.response?.id ?? generateId(),\n timestamp: result.response?.timestamp ?? currentDate(),\n modelId: result.response?.modelId ?? stepModel.modelId,\n headers: result.response?.headers,\n body: result.response?.body,\n };\n\n // Add response information to the span:\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.response.finishReason': result.finishReason,\n 'ai.response.text': {\n output: () => extractContentText(result.content),\n },\n 'ai.response.toolCalls': {\n output: () => {\n const toolCalls = asToolCalls(result.content);\n return toolCalls == null\n ? undefined\n : JSON.stringify(toolCalls);\n },\n },\n 'ai.response.id': responseData.id,\n 'ai.response.model': responseData.modelId,\n 'ai.response.timestamp':\n responseData.timestamp.toISOString(),\n 'ai.response.providerMetadata': JSON.stringify(\n result.providerMetadata,\n ),\n\n // TODO rename telemetry attributes to inputTokens and outputTokens\n 'ai.usage.promptTokens': result.usage.inputTokens,\n 'ai.usage.completionTokens': result.usage.outputTokens,\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.response.finish_reasons': [result.finishReason],\n 'gen_ai.response.id': responseData.id,\n 'gen_ai.response.model': responseData.modelId,\n 'gen_ai.usage.input_tokens': result.usage.inputTokens,\n 'gen_ai.usage.output_tokens': result.usage.outputTokens,\n },\n }),\n );\n\n return { ...result, response: responseData };\n },\n }),\n );\n\n // parse tool calls:\n const stepToolCalls: TypedToolCall<TOOLS>[] = await Promise.all(\n currentModelResponse.content\n .filter(\n (part): part is LanguageModelV2ToolCall =>\n part.type === 'tool-call',\n )\n .map(toolCall =>\n parseToolCall({\n toolCall,\n tools,\n repairToolCall,\n system,\n messages: stepInputMessages,\n }),\n ),\n );\n\n // notify the tools that the tool calls are available:\n for (const toolCall of stepToolCalls) {\n if (toolCall.invalid) {\n continue; // ignore invalid tool calls\n }\n\n const tool = tools![toolCall.toolName];\n if (tool?.onInputAvailable != null) {\n await tool.onInputAvailable({\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n messages: stepInputMessages,\n abortSignal,\n experimental_context,\n });\n }\n }\n\n // insert error tool outputs for invalid tool calls:\n // TODO AI SDK 6: invalid inputs should not require output parts\n const invalidToolCalls = stepToolCalls.filter(\n toolCall => toolCall.invalid && toolCall.dynamic,\n );\n\n clientToolOutputs = [];\n\n for (const toolCall of invalidToolCalls) {\n clientToolOutputs.push({\n type: 'tool-error',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n error: getErrorMessage(toolCall.error!),\n dynamic: true,\n });\n }\n\n // execute client tool calls:\n clientToolCalls = stepToolCalls.filter(\n toolCall => !toolCall.providerExecuted,\n );\n\n if (tools != null) {\n clientToolOutputs.push(\n ...(await executeTools({\n toolCalls: clientToolCalls.filter(\n toolCall => !toolCall.invalid,\n ),\n tools,\n tracer,\n telemetry,\n messages: stepInputMessages,\n abortSignal,\n experimental_context,\n })),\n );\n }\n\n // content:\n const stepContent = asContent({\n content: currentModelResponse.content,\n toolCalls: stepToolCalls,\n toolOutputs: clientToolOutputs,\n });\n\n // append to messages for potential next step:\n responseMessages.push(\n ...toResponseMessages({\n content: stepContent,\n tools,\n }),\n );\n\n // Add step information (after response messages are updated):\n const currentStepResult: StepResult<TOOLS> = new DefaultStepResult({\n content: stepContent,\n finishReason: currentModelResponse.finishReason,\n usage: currentModelResponse.usage,\n warnings: currentModelResponse.warnings,\n providerMetadata: currentModelResponse.providerMetadata,\n request: currentModelResponse.request ?? {},\n response: {\n ...currentModelResponse.response,\n // deep clone msgs to avoid mutating past messages in multi-step:\n messages: structuredClone(responseMessages),\n },\n });\n\n steps.push(currentStepResult);\n await onStepFinish?.(currentStepResult);\n } while (\n // there are tool calls:\n clientToolCalls.length > 0 &&\n // all current tool calls have outputs (incl. execution errors):\n clientToolOutputs.length === clientToolCalls.length &&\n // continue until a stop condition is met:\n !(await isStopConditionMet({ stopConditions, steps }))\n );\n\n // Add response information to the span:\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.response.finishReason': currentModelResponse.finishReason,\n 'ai.response.text': {\n output: () => extractContentText(currentModelResponse.content),\n },\n 'ai.response.toolCalls': {\n output: () => {\n const toolCalls = asToolCalls(currentModelResponse.content);\n return toolCalls == null\n ? undefined\n : JSON.stringify(toolCalls);\n },\n },\n 'ai.response.providerMetadata': JSON.stringify(\n currentModelResponse.providerMetadata,\n ),\n\n // TODO rename telemetry attributes to inputTokens and outputTokens\n 'ai.usage.promptTokens': currentModelResponse.usage.inputTokens,\n 'ai.usage.completionTokens':\n currentModelResponse.usage.outputTokens,\n },\n }),\n );\n\n const lastStep = steps[steps.length - 1];\n\n return new DefaultGenerateTextResult({\n steps,\n resolvedOutput: await output?.parseOutput(\n { text: lastStep.text },\n {\n response: lastStep.response,\n usage: lastStep.usage,\n finishReason: lastStep.finishReason,\n },\n ),\n });\n },\n });\n } catch (error) {\n throw wrapGatewayError(error);\n }\n}\n\nasync function executeTools<TOOLS extends ToolSet>({\n toolCalls,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n}: {\n toolCalls: Array<TypedToolCall<TOOLS>>;\n tools: TOOLS;\n tracer: Tracer;\n telemetry: TelemetrySettings | undefined;\n messages: ModelMessage[];\n abortSignal: AbortSignal | undefined;\n experimental_context: unknown;\n}): Promise<Array<ToolOutput<TOOLS>>> {\n const toolOutputs = await Promise.all(\n toolCalls.map(async ({ toolCallId, toolName, input }) => {\n const tool = tools[toolName];\n\n if (tool?.execute == null) {\n return undefined;\n }\n\n return recordSpan({\n name: 'ai.toolCall',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.toolCall',\n telemetry,\n }),\n 'ai.toolCall.name': toolName,\n 'ai.toolCall.id': toolCallId,\n 'ai.toolCall.args': {\n output: () => JSON.stringify(input),\n },\n },\n }),\n tracer,\n fn: async span => {\n try {\n const stream = executeTool({\n execute: tool.execute!.bind(tool),\n input,\n options: {\n toolCallId,\n messages,\n abortSignal,\n experimental_context,\n },\n });\n\n let output: unknown;\n for await (const part of stream) {\n if (part.type === 'final') {\n output = part.output;\n }\n }\n try {\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.toolCall.result': {\n output: () => JSON.stringify(output),\n },\n },\n }),\n );\n } catch (ignored) {\n // JSON stringify might fail if the result is not serializable,\n // in which case we just ignore it. In the future we might want to\n // add an optional serialize method to the tool interface and warn\n // if the result is not serializable.\n }\n\n return {\n type: 'tool-result',\n toolCallId,\n toolName,\n input,\n output,\n dynamic: tool.type === 'dynamic',\n } as TypedToolResult<TOOLS>;\n } catch (error) {\n recordErrorOnSpan(span, error);\n return {\n type: 'tool-error',\n toolCallId,\n toolName,\n input,\n error,\n dynamic: tool.type === 'dynamic',\n } as TypedToolError<TOOLS>;\n }\n },\n });\n }),\n );\n\n return toolOutputs.filter(\n (output): output is NonNullable<typeof output> => output != null,\n );\n}\n\nclass DefaultGenerateTextResult<TOOLS extends ToolSet, OUTPUT>\n implements GenerateTextResult<TOOLS, OUTPUT>\n{\n readonly steps: GenerateTextResult<TOOLS, OUTPUT>['steps'];\n\n private readonly resolvedOutput: OUTPUT;\n\n constructor(options: {\n steps: GenerateTextResult<TOOLS, OUTPUT>['steps'];\n resolvedOutput: OUTPUT;\n }) {\n this.steps = options.steps;\n this.resolvedOutput = options.resolvedOutput;\n }\n\n private get finalStep() {\n return this.steps[this.steps.length - 1];\n }\n\n get content() {\n return this.finalStep.content;\n }\n\n get text() {\n return this.finalStep.text;\n }\n\n get files() {\n return this.finalStep.files;\n }\n\n get reasoningText() {\n return this.finalStep.reasoningText;\n }\n\n get reasoning() {\n return this.finalStep.reasoning;\n }\n\n get toolCalls() {\n return this.finalStep.toolCalls;\n }\n\n get staticToolCalls() {\n return this.finalStep.staticToolCalls;\n }\n\n get dynamicToolCalls() {\n return this.finalStep.dynamicToolCalls;\n }\n\n get toolResults() {\n return this.finalStep.toolResults;\n }\n\n get staticToolResults() {\n return this.finalStep.staticToolResults;\n }\n\n get dynamicToolResults() {\n return this.finalStep.dynamicToolResults;\n }\n\n get sources() {\n return this.finalStep.sources;\n }\n\n get finishReason() {\n return this.finalStep.finishReason;\n }\n\n get warnings() {\n return this.finalStep.warnings;\n }\n\n get providerMetadata() {\n return this.finalStep.providerMetadata;\n }\n\n get response() {\n return this.finalStep.response;\n }\n\n get request() {\n return this.finalStep.request;\n }\n\n get usage() {\n return this.finalStep.usage;\n }\n\n get totalUsage() {\n return this.steps.reduce(\n (totalUsage, step) => {\n return addLanguageModelUsage(totalUsage, step.usage);\n },\n {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n reasoningTokens: undefined,\n cachedInputTokens: undefined,\n } as LanguageModelUsage,\n );\n }\n\n get experimental_output() {\n if (this.resolvedOutput == null) {\n throw new NoOutputSpecifiedError();\n }\n\n return this.resolvedOutput;\n }\n}\n\nfunction asToolCalls(content: Array<LanguageModelV2Content>) {\n const parts = content.filter(\n (part): part is LanguageModelV2ToolCall => part.type === 'tool-call',\n );\n\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.map(toolCall => ({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n }));\n}\n\nfunction asContent<TOOLS extends ToolSet>({\n content,\n toolCalls,\n toolOutputs,\n}: {\n content: Array<LanguageModelV2Content>;\n toolCalls: Array<TypedToolCall<TOOLS>>;\n toolOutputs: Array<ToolOutput<TOOLS>>;\n}): Array<ContentPart<TOOLS>> {\n return [\n ...content.map(part => {\n switch (part.type) {\n case 'text':\n case 'reasoning':\n case 'source':\n return part;\n\n case 'file': {\n return {\n type: 'file' as const,\n file: new DefaultGeneratedFile(part),\n };\n }\n\n case 'tool-call': {\n return toolCalls.find(\n toolCall => toolCall.toolCallId === part.toolCallId,\n )!;\n }\n\n case 'tool-result': {\n const toolCall = toolCalls.find(\n toolCall => toolCall.toolCallId === part.toolCallId,\n )!;\n\n if (toolCall == null) {\n throw new Error(`Tool call ${part.toolCallId} not found.`);\n }\n\n if (part.isError) {\n return {\n type: 'tool-error' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName as keyof TOOLS & string,\n input: toolCall.input,\n error: part.result,\n providerExecuted: true,\n dynamic: toolCall.dynamic,\n } as TypedToolError<TOOLS>;\n }\n\n return {\n type: 'tool-result' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName as keyof TOOLS & string,\n input: toolCall.input,\n output: part.result,\n providerExecuted: true,\n dynamic: toolCall.dynamic,\n } as TypedToolResult<TOOLS>;\n }\n }\n }),\n ...toolOutputs,\n ];\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_NoOutputSpecifiedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\nThrown when no output type is specified and output-related methods are called.\n */\nexport class NoOutputSpecifiedError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message = 'No output specified.' }: { message?: string } = {}) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is NoOutputSpecifiedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { gateway } from '@ai-sdk/gateway';\nimport {\n EmbeddingModelV2,\n LanguageModelV2,\n ProviderV2,\n} from '@ai-sdk/provider';\nimport { UnsupportedModelVersionError } from '../error';\nimport { EmbeddingModel } from '../types/embedding-model';\nimport { LanguageModel } from '../types/language-model';\n\nexport function resolveLanguageModel(model: LanguageModel): LanguageModelV2 {\n if (typeof model !== 'string') {\n if (model.specificationVersion !== 'v2') {\n throw new UnsupportedModelVersionError({\n version: model.specificationVersion,\n provider: model.provider,\n modelId: model.modelId,\n });\n }\n\n return model;\n }\n\n return getGlobalProvider().languageModel(model);\n}\n\nexport function resolveEmbeddingModel<VALUE = string>(\n model: EmbeddingModel<VALUE>,\n): EmbeddingModelV2<VALUE> {\n if (typeof model !== 'string') {\n if (model.specificationVersion !== 'v2') {\n throw new UnsupportedModelVersionError({\n version: model.specificationVersion,\n provider: model.provider,\n modelId: model.modelId,\n });\n }\n\n return model;\n }\n\n // TODO AI SDK 6: figure out how to cleanly support different generic types\n return getGlobalProvider().textEmbeddingModel(\n model,\n ) as EmbeddingModelV2<VALUE>;\n}\n\nfunction getGlobalProvider(): ProviderV2 {\n return globalThis.AI_SDK_DEFAULT_PROVIDER ?? gateway;\n}\n","export {\n AISDKError,\n APICallError,\n EmptyResponseBodyError,\n InvalidPromptError,\n InvalidResponseDataError,\n JSONParseError,\n LoadAPIKeyError,\n NoContentGeneratedError,\n NoSuchModelError,\n TypeValidationError,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\n\nexport { InvalidArgumentError } from './invalid-argument-error';\nexport { InvalidStreamPartError } from './invalid-stream-part-error';\nexport { InvalidToolInputError } from './invalid-tool-input-error';\nexport { MCPClientError } from './mcp-client-error';\nexport { NoImageGeneratedError } from './no-image-generated-error';\nexport { NoObjectGeneratedError } from './no-object-generated-error';\nexport { NoOutputGeneratedError } from './no-output-generated-error';\nexport { NoOutputSpecifiedError } from './no-output-specified-error';\nexport { NoSuchToolError } from './no-such-tool-error';\nexport { ToolCallRepairError } from './tool-call-repair-error';\nexport { UnsupportedModelVersionError } from './unsupported-model-version-error';\n\nexport { InvalidDataContentError } from '../prompt/invalid-data-content-error';\nexport { InvalidMessageRoleError } from '../prompt/invalid-message-role-error';\nexport { MessageConversionError } from '../prompt/message-conversion-error';\nexport { DownloadError } from '../util/download-error';\nexport { RetryError } from '../util/retry-error';\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_InvalidArgumentError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class InvalidArgumentError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly parameter: string;\n readonly value: unknown;\n\n constructor({\n parameter,\n value,\n message,\n }: {\n parameter: string;\n value: unknown;\n message: string;\n }) {\n super({\n name,\n message: `Invalid argument for parameter ${parameter}: ${message}`,\n });\n\n this.parameter = parameter;\n this.value = value;\n }\n\n static isInstance(error: unknown): error is InvalidArgumentError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\nimport { SingleRequestTextStreamPart } from '../generate-text/run-tools-transformation';\n\nconst name = 'AI_InvalidStreamPartError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class InvalidStreamPartError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly chunk: SingleRequestTextStreamPart<any>;\n\n constructor({\n chunk,\n message,\n }: {\n chunk: SingleRequestTextStreamPart<any>;\n message: string;\n }) {\n super({ name, message });\n\n this.chunk = chunk;\n }\n\n static isInstance(error: unknown): error is InvalidStreamPartError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError, getErrorMessage } from '@ai-sdk/provider';\n\nconst name = 'AI_InvalidToolInputError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class InvalidToolInputError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly toolName: string;\n readonly toolInput: string;\n\n constructor({\n toolInput,\n toolName,\n cause,\n message = `Invalid input for tool ${toolName}: ${getErrorMessage(cause)}`,\n }: {\n message?: string;\n toolInput: string;\n toolName: string;\n cause: unknown;\n }) {\n super({ name, message, cause });\n\n this.toolInput = toolInput;\n this.toolName = toolName;\n }\n\n static isInstance(error: unknown): error is InvalidToolInputError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_MCPClientError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * An error occurred with the MCP client.\n */\nexport class MCPClientError extends AISDKError {\n private readonly [symbol] = true;\n\n constructor({\n name = 'MCPClientError',\n message,\n cause,\n }: {\n name?: string;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n }\n\n static isInstance(error: unknown): error is MCPClientError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\nimport { ImageModelResponseMetadata } from '../types/image-model-response-metadata';\n\nconst name = 'AI_NoImageGeneratedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\nThrown when no image could be generated. This can have multiple causes:\n\n- The model failed to generate a response.\n- The model generated a response that could not be parsed.\n */\nexport class NoImageGeneratedError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n /**\nThe response metadata for each call.\n */\n readonly responses: Array<ImageModelResponseMetadata> | undefined;\n\n constructor({\n message = 'No image generated.',\n cause,\n responses,\n }: {\n message?: string;\n cause?: Error;\n responses?: Array<ImageModelResponseMetadata>;\n }) {\n super({ name, message, cause });\n\n this.responses = responses;\n }\n\n static isInstance(error: unknown): error is NoImageGeneratedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\nimport { FinishReason } from '../types/language-model';\nimport { LanguageModelResponseMetadata } from '../types/language-model-response-metadata';\nimport { LanguageModelUsage } from '../types/usage';\n\nconst name = 'AI_NoObjectGeneratedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\nThrown when no object could be generated. This can have several causes:\n\n- The model failed to generate a response.\n- The model generated a response that could not be parsed.\n- The model generated a response that could not be validated against the schema.\n\nThe error contains the following properties:\n\n- `text`: The text that was generated by the model. This can be the raw text or the tool call text, depending on the model.\n */\nexport class NoObjectGeneratedError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n /**\n The text that was generated by the model. This can be the raw text or the tool call text, depending on the model.\n */\n readonly text: string | undefined;\n\n /**\n The response metadata.\n */\n readonly response: LanguageModelResponseMetadata | undefined;\n\n /**\n The usage of the model.\n */\n readonly usage: LanguageModelUsage | undefined;\n\n /**\n Reason why the model finished generating a response.\n */\n readonly finishReason: FinishReason | undefined;\n\n constructor({\n message = 'No object generated.',\n cause,\n text,\n response,\n usage,\n finishReason,\n }: {\n message?: string;\n cause?: Error;\n text?: string;\n response: LanguageModelResponseMetadata;\n usage: LanguageModelUsage;\n finishReason: FinishReason;\n }) {\n super({ name, message, cause });\n\n this.text = text;\n this.response = response;\n this.usage = usage;\n this.finishReason = finishReason;\n }\n\n static isInstance(error: unknown): error is NoObjectGeneratedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n\nexport function verifyNoObjectGeneratedError(\n error: unknown,\n expected: {\n message: string;\n response: LanguageModelResponseMetadata & {\n body?: string;\n };\n usage: LanguageModelUsage;\n finishReason: FinishReason;\n },\n) {\n expect(NoObjectGeneratedError.isInstance(error)).toBeTruthy();\n const noObjectGeneratedError = error as NoObjectGeneratedError;\n expect(noObjectGeneratedError.message).toEqual(expected.message);\n expect(noObjectGeneratedError.response).toEqual(expected.response);\n expect(noObjectGeneratedError.usage).toEqual(expected.usage);\n expect(noObjectGeneratedError.finishReason).toEqual(expected.finishReason);\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_NoOutputGeneratedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\nThrown when no LLM output was generated, e.g. because of errors.\n */\nexport class NoOutputGeneratedError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({\n message = 'No output generated.',\n cause,\n }: {\n message?: string;\n cause?: Error;\n } = {}) {\n super({ name, message, cause });\n }\n\n static isInstance(error: unknown): error is NoOutputGeneratedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_NoSuchToolError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class NoSuchToolError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly toolName: string;\n readonly availableTools: string[] | undefined;\n\n constructor({\n toolName,\n availableTools = undefined,\n message = `Model tried to call unavailable tool '${toolName}'. ${\n availableTools === undefined\n ? 'No tools are available.'\n : `Available tools: ${availableTools.join(', ')}.`\n }`,\n }: {\n toolName: string;\n availableTools?: string[] | undefined;\n message?: string;\n }) {\n super({ name, message });\n\n this.toolName = toolName;\n this.availableTools = availableTools;\n }\n\n static isInstance(error: unknown): error is NoSuchToolError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError, getErrorMessage } from '@ai-sdk/provider';\nimport { InvalidToolInputError } from './invalid-tool-input-error';\nimport { NoSuchToolError } from './no-such-tool-error';\n\nconst name = 'AI_ToolCallRepairError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class ToolCallRepairError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly originalError: NoSuchToolError | InvalidToolInputError;\n\n constructor({\n cause,\n originalError,\n message = `Error repairing tool call: ${getErrorMessage(cause)}`,\n }: {\n message?: string;\n cause: unknown;\n originalError: NoSuchToolError | InvalidToolInputError;\n }) {\n super({ name, message, cause });\n this.originalError = originalError;\n }\n\n static isInstance(error: unknown): error is ToolCallRepairError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\n/**\nError that is thrown when a model with an unsupported version is used.\n */\nexport class UnsupportedModelVersionError extends AISDKError {\n readonly version: string;\n readonly provider: string;\n readonly modelId: string;\n\n constructor(options: { version: string; provider: string; modelId: string }) {\n super({\n name: 'AI_UnsupportedModelVersionError',\n message:\n `Unsupported model version ${options.version} for provider \"${options.provider}\" and model \"${options.modelId}\". ` +\n `AI SDK 5 only supports models that implement specification version \"v2\".`,\n });\n\n this.version = options.version;\n this.provider = options.provider;\n this.modelId = options.modelId;\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_InvalidDataContentError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class InvalidDataContentError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly content: unknown;\n\n constructor({\n content,\n cause,\n message = `Invalid data content. Expected a base64 string, Uint8Array, ArrayBuffer, or Buffer, but got ${typeof content}.`,\n }: {\n content: unknown;\n cause?: unknown;\n message?: string;\n }) {\n super({ name, message, cause });\n\n this.content = content;\n }\n\n static isInstance(error: unknown): error is InvalidDataContentError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_InvalidMessageRoleError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class InvalidMessageRoleError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly role: string;\n\n constructor({\n role,\n message = `Invalid message role: '${role}'. Must be one of: \"system\", \"user\", \"assistant\", \"tool\".`,\n }: {\n role: string;\n message?: string;\n }) {\n super({ name, message });\n\n this.role = role;\n }\n\n static isInstance(error: unknown): error is InvalidMessageRoleError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\nimport { UIMessage } from '../ui/ui-messages';\n\nconst name = 'AI_MessageConversionError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class MessageConversionError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly originalMessage: Omit<UIMessage, 'id'>;\n\n constructor({\n originalMessage,\n message,\n }: {\n originalMessage: Omit<UIMessage, 'id'>;\n message: string;\n }) {\n super({ name, message });\n\n this.originalMessage = originalMessage;\n }\n\n static isInstance(error: unknown): error is MessageConversionError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_DownloadError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class DownloadError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly url: string;\n readonly statusCode?: number;\n readonly statusText?: string;\n\n constructor({\n url,\n statusCode,\n statusText,\n cause,\n message = cause == null\n ? `Failed to download ${url}: ${statusCode} ${statusText}`\n : `Failed to download ${url}: ${cause}`,\n }: {\n url: string;\n statusCode?: number;\n statusText?: string;\n message?: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n\n this.url = url;\n this.statusCode = statusCode;\n this.statusText = statusText;\n }\n\n static isInstance(error: unknown): error is DownloadError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_RetryError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport type RetryErrorReason =\n | 'maxRetriesExceeded'\n | 'errorNotRetryable'\n | 'abort';\n\nexport class RetryError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n // note: property order determines debugging output\n readonly reason: RetryErrorReason;\n readonly lastError: unknown;\n readonly errors: Array<unknown>;\n\n constructor({\n message,\n reason,\n errors,\n }: {\n message: string;\n reason: RetryErrorReason;\n errors: Array<unknown>;\n }) {\n super({ name, message });\n\n this.reason = reason;\n this.errors = errors;\n\n // separate our last error to make debugging via log easier:\n this.lastError = errors[errors.length - 1];\n }\n\n static isInstance(error: unknown): error is RetryError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import {\n LanguageModelV2FilePart,\n LanguageModelV2Message,\n LanguageModelV2Prompt,\n LanguageModelV2TextPart,\n} from '@ai-sdk/provider';\nimport {\n DataContent,\n FilePart,\n ImagePart,\n isUrlSupported,\n ModelMessage,\n TextPart,\n} from '@ai-sdk/provider-utils';\nimport {\n detectMediaType,\n imageMediaTypeSignatures,\n} from '../util/detect-media-type';\nimport { download } from '../util/download';\nimport { convertToLanguageModelV2DataContent } from './data-content';\nimport { InvalidMessageRoleError } from './invalid-message-role-error';\nimport { StandardizedPrompt } from './standardize-prompt';\n\nexport async function convertToLanguageModelPrompt({\n prompt,\n supportedUrls,\n downloadImplementation = download,\n}: {\n prompt: StandardizedPrompt;\n supportedUrls: Record<string, RegExp[]>;\n downloadImplementation?: typeof download;\n}): Promise<LanguageModelV2Prompt> {\n const downloadedAssets = await downloadAssets(\n prompt.messages,\n downloadImplementation,\n supportedUrls,\n );\n\n return [\n ...(prompt.system != null\n ? [{ role: 'system' as const, content: prompt.system }]\n : []),\n ...prompt.messages.map(message =>\n convertToLanguageModelMessage({ message, downloadedAssets }),\n ),\n ];\n}\n\n/**\n * Convert a ModelMessage to a LanguageModelV2Message.\n *\n * @param message The ModelMessage to convert.\n * @param downloadedAssets A map of URLs to their downloaded data. Only\n * available if the model does not support URLs, null otherwise.\n */\nexport function convertToLanguageModelMessage({\n message,\n downloadedAssets,\n}: {\n message: ModelMessage;\n downloadedAssets: Record<\n string,\n { mediaType: string | undefined; data: Uint8Array }\n >;\n}): LanguageModelV2Message {\n const role = message.role;\n switch (role) {\n case 'system': {\n return {\n role: 'system',\n content: message.content,\n providerOptions: message.providerOptions,\n };\n }\n\n case 'user': {\n if (typeof message.content === 'string') {\n return {\n role: 'user',\n content: [{ type: 'text', text: message.content }],\n providerOptions: message.providerOptions,\n };\n }\n\n return {\n role: 'user',\n content: message.content\n .map(part => convertPartToLanguageModelPart(part, downloadedAssets))\n // remove empty text parts:\n .filter(part => part.type !== 'text' || part.text !== ''),\n providerOptions: message.providerOptions,\n };\n }\n\n case 'assistant': {\n if (typeof message.content === 'string') {\n return {\n role: 'assistant',\n content: [{ type: 'text', text: message.content }],\n providerOptions: message.providerOptions,\n };\n }\n\n return {\n role: 'assistant',\n content: message.content\n .filter(\n // remove empty text parts:\n part => part.type !== 'text' || part.text !== '',\n )\n .map(part => {\n const providerOptions = part.providerOptions;\n\n switch (part.type) {\n case 'file': {\n const { data, mediaType } = convertToLanguageModelV2DataContent(\n part.data,\n );\n return {\n type: 'file',\n data,\n filename: part.filename,\n mediaType: mediaType ?? part.mediaType,\n providerOptions,\n };\n }\n case 'reasoning': {\n return {\n type: 'reasoning',\n text: part.text,\n providerOptions,\n };\n }\n case 'text': {\n return {\n type: 'text' as const,\n text: part.text,\n providerOptions,\n };\n }\n case 'tool-call': {\n return {\n type: 'tool-call' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n providerExecuted: part.providerExecuted,\n providerOptions,\n };\n }\n case 'tool-result': {\n return {\n type: 'tool-result' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: part.output,\n providerOptions,\n };\n }\n }\n }),\n providerOptions: message.providerOptions,\n };\n }\n\n case 'tool': {\n return {\n role: 'tool',\n content: message.content.map(part => ({\n type: 'tool-result' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: part.output,\n providerOptions: part.providerOptions,\n })),\n providerOptions: message.providerOptions,\n };\n }\n\n default: {\n const _exhaustiveCheck: never = role;\n throw new InvalidMessageRoleError({ role: _exhaustiveCheck });\n }\n }\n}\n\n/**\n * Downloads images and files from URLs in the messages.\n */\nasync function downloadAssets(\n messages: ModelMessage[],\n downloadImplementation: typeof download,\n supportedUrls: Record<string, RegExp[]>,\n): Promise<\n Record<string, { mediaType: string | undefined; data: Uint8Array }>\n> {\n const urls = messages\n .filter(message => message.role === 'user')\n .map(message => message.content)\n .filter((content): content is Array<TextPart | ImagePart | FilePart> =>\n Array.isArray(content),\n )\n .flat()\n .filter(\n (part): part is ImagePart | FilePart =>\n part.type === 'image' || part.type === 'file',\n )\n .map(part => {\n const mediaType =\n part.mediaType ?? (part.type === 'image' ? 'image/*' : undefined);\n\n let data = part.type === 'image' ? part.image : part.data;\n if (typeof data === 'string') {\n try {\n data = new URL(data);\n } catch (ignored) {}\n }\n\n return { mediaType, data };\n })\n /**\n * Filter out URLs that the model supports natively, so we don't download them.\n */\n .filter(\n (part): part is { mediaType: string; data: URL } =>\n part.data instanceof URL &&\n part.mediaType != null &&\n !isUrlSupported({\n url: part.data.toString(),\n mediaType: part.mediaType,\n supportedUrls,\n }),\n )\n .map(part => part.data);\n\n // download in parallel:\n const downloadedImages = await Promise.all(\n urls.map(async url => ({\n url,\n data: await downloadImplementation({ url }),\n })),\n );\n\n return Object.fromEntries(\n downloadedImages.map(({ url, data }) => [url.toString(), data]),\n );\n}\n\n/**\n * Convert part of a message to a LanguageModelV2Part.\n * @param part The part to convert.\n * @param downloadedAssets A map of URLs to their downloaded data. Only\n * available if the model does not support URLs, null otherwise.\n *\n * @returns The converted part.\n */\nfunction convertPartToLanguageModelPart(\n part: TextPart | ImagePart | FilePart,\n downloadedAssets: Record<\n string,\n { mediaType: string | undefined; data: Uint8Array }\n >,\n): LanguageModelV2TextPart | LanguageModelV2FilePart {\n if (part.type === 'text') {\n return {\n type: 'text',\n text: part.text,\n providerOptions: part.providerOptions,\n };\n }\n\n let originalData: DataContent | URL;\n const type = part.type;\n switch (type) {\n case 'image':\n originalData = part.image;\n break;\n case 'file':\n originalData = part.data;\n\n break;\n default:\n throw new Error(`Unsupported part type: ${type}`);\n }\n\n const { data: convertedData, mediaType: convertedMediaType } =\n convertToLanguageModelV2DataContent(originalData);\n\n let mediaType: string | undefined = convertedMediaType ?? part.mediaType;\n let data: Uint8Array | string | URL = convertedData; // binary | base64 | url\n\n // If the content is a URL, we check if it was downloaded:\n if (data instanceof URL) {\n const downloadedFile = downloadedAssets[data.toString()];\n if (downloadedFile) {\n data = downloadedFile.data;\n mediaType ??= downloadedFile.mediaType;\n }\n }\n\n // Now that we have the normalized data either as a URL or a Uint8Array,\n // we can create the LanguageModelV2Part.\n switch (type) {\n case 'image': {\n // When possible, try to detect the media type automatically\n // to deal with incorrect media type inputs.\n // When detection fails, use provided media type.\n if (data instanceof Uint8Array || typeof data === 'string') {\n mediaType =\n detectMediaType({ data, signatures: imageMediaTypeSignatures }) ??\n mediaType;\n }\n\n return {\n type: 'file',\n mediaType: mediaType ?? 'image/*', // any image\n filename: undefined,\n data,\n providerOptions: part.providerOptions,\n };\n }\n\n case 'file': {\n // We must have a mediaType for files, if not, throw an error.\n if (mediaType == null) {\n throw new Error(`Media type is missing for file part`);\n }\n\n return {\n type: 'file',\n mediaType,\n filename: part.filename,\n data,\n providerOptions: part.providerOptions,\n };\n }\n }\n}\n","import { convertBase64ToUint8Array } from '@ai-sdk/provider-utils';\n\nexport const imageMediaTypeSignatures = [\n {\n mediaType: 'image/gif' as const,\n bytesPrefix: [0x47, 0x49, 0x46],\n base64Prefix: 'R0lG',\n },\n {\n mediaType: 'image/png' as const,\n bytesPrefix: [0x89, 0x50, 0x4e, 0x47],\n base64Prefix: 'iVBORw',\n },\n {\n mediaType: 'image/jpeg' as const,\n bytesPrefix: [0xff, 0xd8],\n base64Prefix: '/9j/',\n },\n {\n mediaType: 'image/webp' as const,\n bytesPrefix: [0x52, 0x49, 0x46, 0x46],\n base64Prefix: 'UklGRg',\n },\n {\n mediaType: 'image/bmp' as const,\n bytesPrefix: [0x42, 0x4d],\n base64Prefix: 'Qk',\n },\n {\n mediaType: 'image/tiff' as const,\n bytesPrefix: [0x49, 0x49, 0x2a, 0x00],\n base64Prefix: 'SUkqAA',\n },\n {\n mediaType: 'image/tiff' as const,\n bytesPrefix: [0x4d, 0x4d, 0x00, 0x2a],\n base64Prefix: 'TU0AKg',\n },\n {\n mediaType: 'image/avif' as const,\n bytesPrefix: [\n 0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66,\n ],\n base64Prefix: 'AAAAIGZ0eXBhdmlm',\n },\n {\n mediaType: 'image/heic' as const,\n bytesPrefix: [\n 0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x63,\n ],\n base64Prefix: 'AAAAIGZ0eXBoZWlj',\n },\n] as const;\n\nexport const audioMediaTypeSignatures = [\n {\n mediaType: 'audio/mpeg' as const,\n bytesPrefix: [0xff, 0xfb],\n base64Prefix: '//s=',\n },\n {\n mediaType: 'audio/wav' as const,\n bytesPrefix: [0x52, 0x49, 0x46, 0x46],\n base64Prefix: 'UklGR',\n },\n {\n mediaType: 'audio/ogg' as const,\n bytesPrefix: [0x4f, 0x67, 0x67, 0x53],\n base64Prefix: 'T2dnUw',\n },\n {\n mediaType: 'audio/flac' as const,\n bytesPrefix: [0x66, 0x4c, 0x61, 0x43],\n base64Prefix: 'ZkxhQw',\n },\n {\n mediaType: 'audio/aac' as const,\n bytesPrefix: [0x40, 0x15, 0x00, 0x00],\n base64Prefix: 'QBUA',\n },\n {\n mediaType: 'audio/mp4' as const,\n bytesPrefix: [0x66, 0x74, 0x79, 0x70],\n base64Prefix: 'ZnR5cA',\n },\n {\n mediaType: 'audio/webm',\n bytesPrefix: [0x1a, 0x45, 0xdf, 0xa3],\n base64Prefix: 'GkXf',\n },\n] as const;\n\nconst stripID3 = (data: Uint8Array | string) => {\n const bytes =\n typeof data === 'string' ? convertBase64ToUint8Array(data) : data;\n const id3Size =\n ((bytes[6] & 0x7f) << 21) |\n ((bytes[7] & 0x7f) << 14) |\n ((bytes[8] & 0x7f) << 7) |\n (bytes[9] & 0x7f);\n\n // The raw MP3 starts here\n return bytes.slice(id3Size + 10);\n};\n\nfunction stripID3TagsIfPresent(data: Uint8Array | string): Uint8Array | string {\n const hasId3 =\n (typeof data === 'string' && data.startsWith('SUQz')) ||\n (typeof data !== 'string' &&\n data.length > 10 &&\n data[0] === 0x49 && // 'I'\n data[1] === 0x44 && // 'D'\n data[2] === 0x33); // '3'\n\n return hasId3 ? stripID3(data) : data;\n}\n\n/**\n * Detect the media IANA media type of a file using a list of signatures.\n *\n * @param data - The file data.\n * @param signatures - The signatures to use for detection.\n * @returns The media type of the file.\n */\nexport function detectMediaType({\n data,\n signatures,\n}: {\n data: Uint8Array | string;\n signatures: typeof audioMediaTypeSignatures | typeof imageMediaTypeSignatures;\n}): (typeof signatures)[number]['mediaType'] | undefined {\n const processedData = stripID3TagsIfPresent(data);\n\n for (const signature of signatures) {\n if (\n typeof processedData === 'string'\n ? processedData.startsWith(signature.base64Prefix)\n : processedData.length >= signature.bytesPrefix.length &&\n signature.bytesPrefix.every(\n (byte, index) => processedData[index] === byte,\n )\n ) {\n return signature.mediaType;\n }\n }\n\n return undefined;\n}\n","import { DownloadError } from './download-error';\n\nexport async function download({ url }: { url: URL }): Promise<{\n data: Uint8Array;\n mediaType: string | undefined;\n}> {\n const urlText = url.toString();\n try {\n const response = await fetch(urlText);\n\n if (!response.ok) {\n throw new DownloadError({\n url: urlText,\n statusCode: response.status,\n statusText: response.statusText,\n });\n }\n\n return {\n data: new Uint8Array(await response.arrayBuffer()),\n mediaType: response.headers.get('content-type') ?? undefined,\n };\n } catch (error) {\n if (DownloadError.isInstance(error)) {\n throw error;\n }\n\n throw new DownloadError({ url: urlText, cause: error });\n }\n}\n","import { AISDKError, LanguageModelV2DataContent } from '@ai-sdk/provider';\nimport {\n convertBase64ToUint8Array,\n convertUint8ArrayToBase64,\n DataContent,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { InvalidDataContentError } from './invalid-data-content-error';\nimport { splitDataUrl } from './split-data-url';\n\n/**\n@internal\n */\nexport const dataContentSchema: z.ZodType<DataContent> = z.union([\n z.string(),\n z.instanceof(Uint8Array),\n z.instanceof(ArrayBuffer),\n z.custom<Buffer>(\n // Buffer might not be available in some environments such as CloudFlare:\n (value: unknown): value is Buffer =>\n globalThis.Buffer?.isBuffer(value) ?? false,\n { message: 'Must be a Buffer' },\n ),\n]);\n\nexport function convertToLanguageModelV2DataContent(\n content: DataContent | URL,\n): {\n data: LanguageModelV2DataContent;\n mediaType: string | undefined;\n} {\n // Buffer & Uint8Array:\n if (content instanceof Uint8Array) {\n return { data: content, mediaType: undefined };\n }\n\n // ArrayBuffer needs conversion to Uint8Array (lightweight):\n if (content instanceof ArrayBuffer) {\n return { data: new Uint8Array(content), mediaType: undefined };\n }\n\n // Attempt to create a URL from the data. If it fails, we can assume the data\n // is not a URL and likely some other sort of data.\n if (typeof content === 'string') {\n try {\n content = new URL(content);\n } catch (error) {\n // ignored\n }\n }\n\n // Extract data from data URL:\n if (content instanceof URL && content.protocol === 'data:') {\n const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(\n content.toString(),\n );\n\n if (dataUrlMediaType == null || base64Content == null) {\n throw new AISDKError({\n name: 'InvalidDataContentError',\n message: `Invalid data URL format in content ${content.toString()}`,\n });\n }\n\n return { data: base64Content, mediaType: dataUrlMediaType };\n }\n\n return { data: content, mediaType: undefined };\n}\n\n/**\nConverts data content to a base64-encoded string.\n\n@param content - Data content to convert.\n@returns Base64-encoded string.\n*/\nexport function convertDataContentToBase64String(content: DataContent): string {\n if (typeof content === 'string') {\n return content;\n }\n\n if (content instanceof ArrayBuffer) {\n return convertUint8ArrayToBase64(new Uint8Array(content));\n }\n\n return convertUint8ArrayToBase64(content);\n}\n\n/**\nConverts data content to a Uint8Array.\n\n@param content - Data content to convert.\n@returns Uint8Array.\n */\nexport function convertDataContentToUint8Array(\n content: DataContent,\n): Uint8Array {\n if (content instanceof Uint8Array) {\n return content;\n }\n\n if (typeof content === 'string') {\n try {\n return convertBase64ToUint8Array(content);\n } catch (error) {\n throw new InvalidDataContentError({\n message:\n 'Invalid data content. Content string is not a base64-encoded media.',\n content,\n cause: error,\n });\n }\n }\n\n if (content instanceof ArrayBuffer) {\n return new Uint8Array(content);\n }\n\n throw new InvalidDataContentError({ content });\n}\n\n/**\n * Converts a Uint8Array to a string of text.\n *\n * @param uint8Array - The Uint8Array to convert.\n * @returns The converted string.\n */\nexport function convertUint8ArrayToText(uint8Array: Uint8Array): string {\n try {\n return new TextDecoder().decode(uint8Array);\n } catch (error) {\n throw new Error('Error decoding Uint8Array to text');\n }\n}\n","export function splitDataUrl(dataUrl: string): {\n mediaType: string | undefined;\n base64Content: string | undefined;\n} {\n try {\n const [header, base64Content] = dataUrl.split(',');\n return {\n mediaType: header.split(';')[0].split(':')[1],\n base64Content,\n };\n } catch (error) {\n return {\n mediaType: undefined,\n base64Content: undefined,\n };\n }\n}\n","import { InvalidArgumentError } from '../error/invalid-argument-error';\nimport { CallSettings } from './call-settings';\n\n/**\n * Validates call settings and returns a new object with limited values.\n */\nexport function prepareCallSettings({\n maxOutputTokens,\n temperature,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n seed,\n stopSequences,\n}: Omit<CallSettings, 'abortSignal' | 'headers' | 'maxRetries'>): Omit<\n CallSettings,\n 'abortSignal' | 'headers' | 'maxRetries'\n> {\n if (maxOutputTokens != null) {\n if (!Number.isInteger(maxOutputTokens)) {\n throw new InvalidArgumentError({\n parameter: 'maxOutputTokens',\n value: maxOutputTokens,\n message: 'maxOutputTokens must be an integer',\n });\n }\n\n if (maxOutputTokens < 1) {\n throw new InvalidArgumentError({\n parameter: 'maxOutputTokens',\n value: maxOutputTokens,\n message: 'maxOutputTokens must be >= 1',\n });\n }\n }\n\n if (temperature != null) {\n if (typeof temperature !== 'number') {\n throw new InvalidArgumentError({\n parameter: 'temperature',\n value: temperature,\n message: 'temperature must be a number',\n });\n }\n }\n\n if (topP != null) {\n if (typeof topP !== 'number') {\n throw new InvalidArgumentError({\n parameter: 'topP',\n value: topP,\n message: 'topP must be a number',\n });\n }\n }\n\n if (topK != null) {\n if (typeof topK !== 'number') {\n throw new InvalidArgumentError({\n parameter: 'topK',\n value: topK,\n message: 'topK must be a number',\n });\n }\n }\n\n if (presencePenalty != null) {\n if (typeof presencePenalty !== 'number') {\n throw new InvalidArgumentError({\n parameter: 'presencePenalty',\n value: presencePenalty,\n message: 'presencePenalty must be a number',\n });\n }\n }\n\n if (frequencyPenalty != null) {\n if (typeof frequencyPenalty !== 'number') {\n throw new InvalidArgumentError({\n parameter: 'frequencyPenalty',\n value: frequencyPenalty,\n message: 'frequencyPenalty must be a number',\n });\n }\n }\n\n if (seed != null) {\n if (!Number.isInteger(seed)) {\n throw new InvalidArgumentError({\n parameter: 'seed',\n value: seed,\n message: 'seed must be an integer',\n });\n }\n }\n\n return {\n maxOutputTokens,\n temperature,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n stopSequences,\n seed,\n };\n}\n","import {\n LanguageModelV2FunctionTool,\n LanguageModelV2ProviderDefinedTool,\n LanguageModelV2ToolChoice,\n} from '@ai-sdk/provider';\nimport { asSchema } from '@ai-sdk/provider-utils';\nimport { isNonEmptyObject } from '../util/is-non-empty-object';\nimport { ToolSet } from '../generate-text';\nimport { ToolChoice } from '../types/language-model';\n\nexport function prepareToolsAndToolChoice<TOOLS extends ToolSet>({\n tools,\n toolChoice,\n activeTools,\n}: {\n tools: TOOLS | undefined;\n toolChoice: ToolChoice<TOOLS> | undefined;\n activeTools: Array<keyof TOOLS> | undefined;\n}): {\n tools:\n | Array<LanguageModelV2FunctionTool | LanguageModelV2ProviderDefinedTool>\n | undefined;\n toolChoice: LanguageModelV2ToolChoice | undefined;\n} {\n if (!isNonEmptyObject(tools)) {\n return {\n tools: undefined,\n toolChoice: undefined,\n };\n }\n\n // when activeTools is provided, we only include the tools that are in the list:\n const filteredTools =\n activeTools != null\n ? Object.entries(tools).filter(([name]) =>\n activeTools.includes(name as keyof TOOLS),\n )\n : Object.entries(tools);\n\n return {\n tools: filteredTools.map(([name, tool]) => {\n const toolType = tool.type;\n switch (toolType) {\n case undefined:\n case 'dynamic':\n case 'function':\n return {\n type: 'function' as const,\n name,\n description: tool.description,\n inputSchema: asSchema(tool.inputSchema).jsonSchema,\n providerOptions: tool.providerOptions,\n };\n case 'provider-defined':\n return {\n type: 'provider-defined' as const,\n name,\n id: tool.id,\n args: tool.args,\n };\n default: {\n const exhaustiveCheck: never = toolType;\n throw new Error(`Unsupported tool type: ${exhaustiveCheck}`);\n }\n }\n }),\n toolChoice:\n toolChoice == null\n ? { type: 'auto' }\n : typeof toolChoice === 'string'\n ? { type: toolChoice }\n : { type: 'tool' as const, toolName: toolChoice.toolName as string },\n };\n}\n","export function isNonEmptyObject(\n object: Record<string, unknown> | undefined | null,\n): object is Record<string, unknown> {\n return object != null && Object.keys(object).length > 0;\n}\n","import { InvalidPromptError } from '@ai-sdk/provider';\nimport { ModelMessage, safeValidateTypes } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { modelMessageSchema } from './message';\nimport { Prompt } from './prompt';\n\nexport type StandardizedPrompt = {\n /**\n * System message.\n */\n system?: string;\n\n /**\n * Messages.\n */\n messages: ModelMessage[];\n};\n\nexport async function standardizePrompt(\n prompt: Prompt,\n): Promise<StandardizedPrompt> {\n if (prompt.prompt == null && prompt.messages == null) {\n throw new InvalidPromptError({\n prompt,\n message: 'prompt or messages must be defined',\n });\n }\n\n if (prompt.prompt != null && prompt.messages != null) {\n throw new InvalidPromptError({\n prompt,\n message: 'prompt and messages cannot be defined at the same time',\n });\n }\n\n // validate that system is a string\n if (prompt.system != null && typeof prompt.system !== 'string') {\n throw new InvalidPromptError({\n prompt,\n message: 'system must be a string',\n });\n }\n\n let messages: ModelMessage[];\n\n if (prompt.prompt != null && typeof prompt.prompt === 'string') {\n messages = [{ role: 'user', content: prompt.prompt }];\n } else if (prompt.prompt != null && Array.isArray(prompt.prompt)) {\n messages = prompt.prompt;\n } else if (prompt.messages != null) {\n messages = prompt.messages;\n } else {\n throw new InvalidPromptError({\n prompt,\n message: 'prompt or messages must be defined',\n });\n }\n\n if (messages.length === 0) {\n throw new InvalidPromptError({\n prompt,\n message: 'messages must not be empty',\n });\n }\n\n const validationResult = await safeValidateTypes({\n value: messages,\n schema: z.array(modelMessageSchema),\n });\n\n if (!validationResult.success) {\n throw new InvalidPromptError({\n prompt,\n message:\n 'The messages must be a ModelMessage[]. ' +\n 'If you have passed a UIMessage[], you can use convertToModelMessages to convert them.',\n cause: validationResult.error,\n });\n }\n\n return {\n messages,\n system: prompt.system,\n };\n}\n","import {\n AssistantModelMessage,\n ModelMessage,\n SystemModelMessage,\n ToolModelMessage,\n UserModelMessage,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { providerMetadataSchema } from '../types/provider-metadata';\nimport {\n filePartSchema,\n imagePartSchema,\n reasoningPartSchema,\n textPartSchema,\n toolCallPartSchema,\n toolResultPartSchema,\n} from './content-part';\n\n/**\n@deprecated Use `SystemModelMessage` instead.\n */\n// TODO remove in AI SDK 6\nexport type CoreSystemMessage = SystemModelMessage;\n\nexport const systemModelMessageSchema: z.ZodType<SystemModelMessage> = z.object(\n {\n role: z.literal('system'),\n content: z.string(),\n providerOptions: providerMetadataSchema.optional(),\n },\n);\n\n/**\n@deprecated Use `systemModelMessageSchema` instead.\n */\n// TODO remove in AI SDK 6\nexport const coreSystemMessageSchema = systemModelMessageSchema;\n\n/**\n@deprecated Use `UserModelMessage` instead.\n */\n// TODO remove in AI SDK 6\nexport type CoreUserMessage = UserModelMessage;\n\nexport const userModelMessageSchema: z.ZodType<UserModelMessage> = z.object({\n role: z.literal('user'),\n content: z.union([\n z.string(),\n z.array(z.union([textPartSchema, imagePartSchema, filePartSchema])),\n ]),\n providerOptions: providerMetadataSchema.optional(),\n});\n\n/**\n@deprecated Use `userModelMessageSchema` instead.\n */\n// TODO remove in AI SDK 6\nexport const coreUserMessageSchema = userModelMessageSchema;\n\n/**\n@deprecated Use `AssistantModelMessage` instead.\n */\n// TODO remove in AI SDK 6\nexport type CoreAssistantMessage = AssistantModelMessage;\n\nexport const assistantModelMessageSchema: z.ZodType<AssistantModelMessage> =\n z.object({\n role: z.literal('assistant'),\n content: z.union([\n z.string(),\n z.array(\n z.union([\n textPartSchema,\n filePartSchema,\n reasoningPartSchema,\n toolCallPartSchema,\n toolResultPartSchema,\n ]),\n ),\n ]),\n providerOptions: providerMetadataSchema.optional(),\n });\n\n/**\n@deprecated Use `assistantModelMessageSchema` instead.\n */\n// TODO remove in AI SDK 6\nexport const coreAssistantMessageSchema = assistantModelMessageSchema;\n\n/**\n@deprecated Use `ToolModelMessage` instead.\n */\n// TODO remove in AI SDK 6\nexport type CoreToolMessage = ToolModelMessage;\n\nexport const toolModelMessageSchema: z.ZodType<ToolModelMessage> = z.object({\n role: z.literal('tool'),\n content: z.array(toolResultPartSchema),\n providerOptions: providerMetadataSchema.optional(),\n});\n\n/**\n@deprecated Use `toolModelMessageSchema` instead.\n */\n// TODO remove in AI SDK 6\nexport const coreToolMessageSchema = toolModelMessageSchema;\n\n/**\n@deprecated Use `ModelMessage` instead.\n */\n// TODO remove in AI SDK 6\nexport type CoreMessage = ModelMessage;\n\nexport const modelMessageSchema: z.ZodType<ModelMessage> = z.union([\n systemModelMessageSchema,\n userModelMessageSchema,\n assistantModelMessageSchema,\n toolModelMessageSchema,\n]);\n\n/**\n@deprecated Use `modelMessageSchema` instead.\n */\n// TODO remove in AI SDK 6\nexport const coreMessageSchema: z.ZodType<CoreMessage> = modelMessageSchema;\n","import { SharedV2ProviderMetadata } from '@ai-sdk/provider';\nimport { z } from 'zod/v4';\nimport { jsonValueSchema } from './json-value';\n\n/**\nAdditional provider-specific metadata that is returned from the provider.\n\nThis is needed to enable provider-specific functionality that can be\nfully encapsulated in the provider.\n */\nexport type ProviderMetadata = SharedV2ProviderMetadata;\n\nexport const providerMetadataSchema: z.ZodType<ProviderMetadata> = z.record(\n z.string(),\n z.record(z.string(), jsonValueSchema),\n);\n","import { JSONValue as OriginalJSONValue } from '@ai-sdk/provider';\nimport { z } from 'zod/v4';\n\nexport const jsonValueSchema: z.ZodType<JSONValue> = z.lazy(() =>\n z.union([\n z.null(),\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.string(), jsonValueSchema),\n z.array(jsonValueSchema),\n ]),\n);\n\nexport type JSONValue = OriginalJSONValue;\n","import { LanguageModelV2ToolResultOutput } from '@ai-sdk/provider';\nimport {\n FilePart,\n ImagePart,\n ProviderOptions,\n ReasoningPart,\n TextPart,\n ToolResultPart,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { jsonValueSchema } from '../types/json-value';\nimport { providerMetadataSchema } from '../types/provider-metadata';\nimport { dataContentSchema } from './data-content';\n\n/**\n@internal\n */\nexport const textPartSchema: z.ZodType<TextPart> = z.object({\n type: z.literal('text'),\n text: z.string(),\n providerOptions: providerMetadataSchema.optional(),\n});\n\n/**\n@internal\n */\nexport const imagePartSchema: z.ZodType<ImagePart> = z.object({\n type: z.literal('image'),\n image: z.union([dataContentSchema, z.instanceof(URL)]),\n mediaType: z.string().optional(),\n providerOptions: providerMetadataSchema.optional(),\n});\n\n/**\n@internal\n */\nexport const filePartSchema: z.ZodType<FilePart> = z.object({\n type: z.literal('file'),\n data: z.union([dataContentSchema, z.instanceof(URL)]),\n filename: z.string().optional(),\n mediaType: z.string(),\n providerOptions: providerMetadataSchema.optional(),\n});\n\n/**\n@internal\n */\nexport const reasoningPartSchema: z.ZodType<ReasoningPart> = z.object({\n type: z.literal('reasoning'),\n text: z.string(),\n providerOptions: providerMetadataSchema.optional(),\n});\n\n/**\nTool call content part of a prompt. It contains a tool call (usually generated by the AI model).\n */\nexport interface ToolCallPart {\n type: 'tool-call';\n\n /**\nID of the tool call. This ID is used to match the tool call with the tool result.\n */\n toolCallId: string;\n\n /**\nName of the tool that is being called.\n */\n toolName: string;\n\n /**\nArguments of the tool call. This is a JSON-serializable object that matches the tool's input schema.\n */\n input: unknown;\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}\n\n/**\n@internal\n */\nexport const toolCallPartSchema: z.ZodType<ToolCallPart> = z.object({\n type: z.literal('tool-call'),\n toolCallId: z.string(),\n toolName: z.string(),\n input: z.unknown(),\n providerOptions: providerMetadataSchema.optional(),\n providerExecuted: z.boolean().optional(),\n}) as z.ZodType<ToolCallPart>; // necessary bc input is optional on Zod type\n\n/**\n@internal\n */\nexport const outputSchema: z.ZodType<LanguageModelV2ToolResultOutput> =\n z.discriminatedUnion('type', [\n z.object({\n type: z.literal('text'),\n value: z.string(),\n }),\n z.object({\n type: z.literal('json'),\n value: jsonValueSchema,\n }),\n z.object({\n type: z.literal('error-text'),\n value: z.string(),\n }),\n z.object({\n type: z.literal('error-json'),\n value: jsonValueSchema,\n }),\n z.object({\n type: z.literal('content'),\n value: z.array(\n z.union([\n z.object({\n type: z.literal('text'),\n text: z.string(),\n }),\n z.object({\n type: z.literal('media'),\n data: z.string(),\n mediaType: z.string(),\n }),\n ]),\n ),\n }),\n ]);\n\n/**\n@internal\n */\nexport const toolResultPartSchema: z.ZodType<ToolResultPart> = z.object({\n type: z.literal('tool-result'),\n toolCallId: z.string(),\n toolName: z.string(),\n output: outputSchema,\n providerOptions: providerMetadataSchema.optional(),\n}) as z.ZodType<ToolResultPart>; // necessary bc result is optional on Zod type\n","import {\n GatewayAuthenticationError,\n GatewayModelNotFoundError,\n} from '@ai-sdk/gateway';\nimport { AISDKError } from '@ai-sdk/provider';\n\nexport function wrapGatewayError(error: unknown): unknown {\n if (\n GatewayAuthenticationError.isInstance(error) ||\n GatewayModelNotFoundError.isInstance(error)\n ) {\n return new AISDKError({\n name: 'GatewayError',\n message:\n 'Vercel AI Gateway access failed. ' +\n 'If you want to use AI SDK providers directly, use the providers, e.g. @ai-sdk/openai, ' +\n 'or register a different global default provider.',\n cause: error,\n });\n }\n\n return error;\n}\n","import { TelemetrySettings } from './telemetry-settings';\n\nexport function assembleOperationName({\n operationId,\n telemetry,\n}: {\n operationId: string;\n telemetry?: TelemetrySettings;\n}) {\n return {\n // standardized operation and resource name:\n 'operation.name': `${operationId}${\n telemetry?.functionId != null ? ` ${telemetry.functionId}` : ''\n }`,\n 'resource.name': telemetry?.functionId,\n\n // detailed, AI SDK specific data:\n 'ai.operationId': operationId,\n 'ai.telemetry.functionId': telemetry?.functionId,\n };\n}\n","import { Attributes } from '@opentelemetry/api';\nimport { CallSettings } from '../prompt/call-settings';\nimport { TelemetrySettings } from './telemetry-settings';\n\nexport function getBaseTelemetryAttributes({\n model,\n settings,\n telemetry,\n headers,\n}: {\n model: { modelId: string; provider: string };\n settings: Omit<CallSettings, 'abortSignal' | 'headers' | 'temperature'>;\n telemetry: TelemetrySettings | undefined;\n headers: Record<string, string | undefined> | undefined;\n}): Attributes {\n return {\n 'ai.model.provider': model.provider,\n 'ai.model.id': model.modelId,\n\n // settings:\n ...Object.entries(settings).reduce((attributes, [key, value]) => {\n attributes[`ai.settings.${key}`] = value;\n return attributes;\n }, {} as Attributes),\n\n // add metadata as attributes:\n ...Object.entries(telemetry?.metadata ?? {}).reduce(\n (attributes, [key, value]) => {\n attributes[`ai.telemetry.metadata.${key}`] = value;\n return attributes;\n },\n {} as Attributes,\n ),\n\n // request headers\n ...Object.entries(headers ?? {}).reduce((attributes, [key, value]) => {\n if (value !== undefined) {\n attributes[`ai.request.headers.${key}`] = value;\n }\n return attributes;\n }, {} as Attributes),\n };\n}\n","import { Tracer, trace } from '@opentelemetry/api';\nimport { noopTracer } from './noop-tracer';\n\nexport function getTracer({\n isEnabled = false,\n tracer,\n}: {\n isEnabled?: boolean;\n tracer?: Tracer;\n} = {}): Tracer {\n if (!isEnabled) {\n return noopTracer;\n }\n\n if (tracer) {\n return tracer;\n }\n\n return trace.getTracer('ai');\n}\n","import { Span, SpanContext, Tracer } from '@opentelemetry/api';\n\n/**\n * Tracer implementation that does nothing (null object).\n */\nexport const noopTracer: Tracer = {\n startSpan(): Span {\n return noopSpan;\n },\n\n startActiveSpan<F extends (span: Span) => unknown>(\n name: unknown,\n arg1: unknown,\n arg2?: unknown,\n arg3?: F,\n ): ReturnType<any> {\n if (typeof arg1 === 'function') {\n return arg1(noopSpan);\n }\n if (typeof arg2 === 'function') {\n return arg2(noopSpan);\n }\n if (typeof arg3 === 'function') {\n return arg3(noopSpan);\n }\n },\n};\n\nconst noopSpan: Span = {\n spanContext() {\n return noopSpanContext;\n },\n setAttribute() {\n return this;\n },\n setAttributes() {\n return this;\n },\n addEvent() {\n return this;\n },\n addLink() {\n return this;\n },\n addLinks() {\n return this;\n },\n setStatus() {\n return this;\n },\n updateName() {\n return this;\n },\n end() {\n return this;\n },\n isRecording() {\n return false;\n },\n recordException() {\n return this;\n },\n};\n\nconst noopSpanContext: SpanContext = {\n traceId: '',\n spanId: '',\n traceFlags: 0,\n};\n","import { Attributes, Span, Tracer, SpanStatusCode } from '@opentelemetry/api';\n\nexport function recordSpan<T>({\n name,\n tracer,\n attributes,\n fn,\n endWhenDone = true,\n}: {\n name: string;\n tracer: Tracer;\n attributes: Attributes;\n fn: (span: Span) => Promise<T>;\n endWhenDone?: boolean;\n}) {\n return tracer.startActiveSpan(name, { attributes }, async span => {\n try {\n const result = await fn(span);\n\n if (endWhenDone) {\n span.end();\n }\n\n return result;\n } catch (error) {\n try {\n recordErrorOnSpan(span, error);\n } finally {\n // always stop the span when there is an error:\n span.end();\n }\n\n throw error;\n }\n });\n}\n\n/**\n * Record an error on a span. If the error is an instance of Error, an exception event will be recorded on the span, otherwise\n * the span will be set to an error status.\n *\n * @param span - The span to record the error on.\n * @param error - The error to record on the span.\n */\nexport function recordErrorOnSpan(span: Span, error: unknown) {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { TelemetrySettings } from './telemetry-settings';\n\nexport function selectTelemetryAttributes({\n telemetry,\n attributes,\n}: {\n telemetry?: TelemetrySettings;\n attributes: {\n [attributeKey: string]:\n | AttributeValue\n | { input: () => AttributeValue | undefined }\n | { output: () => AttributeValue | undefined }\n | undefined;\n };\n}): Attributes {\n // when telemetry is disabled, return an empty object to avoid serialization overhead:\n if (telemetry?.isEnabled !== true) {\n return {};\n }\n\n return Object.entries(attributes).reduce((attributes, [key, value]) => {\n if (value == null) {\n return attributes;\n }\n\n // input value, check if it should be recorded:\n if (\n typeof value === 'object' &&\n 'input' in value &&\n typeof value.input === 'function'\n ) {\n // default to true:\n if (telemetry?.recordInputs === false) {\n return attributes;\n }\n\n const result = value.input();\n\n return result == null ? attributes : { ...attributes, [key]: result };\n }\n\n // output value, check if it should be recorded:\n if (\n typeof value === 'object' &&\n 'output' in value &&\n typeof value.output === 'function'\n ) {\n // default to true:\n if (telemetry?.recordOutputs === false) {\n return attributes;\n }\n\n const result = value.output();\n\n return result == null ? attributes : { ...attributes, [key]: result };\n }\n\n // value is an attribute value already:\n return { ...attributes, [key]: value };\n }, {});\n}\n","import {\n LanguageModelV2Message,\n LanguageModelV2Prompt,\n} from '@ai-sdk/provider';\nimport { convertDataContentToBase64String } from '../prompt/data-content';\n\n/**\n * Helper utility to serialize prompt content for OpenTelemetry tracing.\n * It is initially created because normalized LanguageModelV1Prompt carries\n * images as Uint8Arrays, on which JSON.stringify acts weirdly, converting\n * them to objects with stringified indices as keys, e.g. {\"0\": 42, \"1\": 69 }.\n */\nexport function stringifyForTelemetry(prompt: LanguageModelV2Prompt): string {\n return JSON.stringify(\n prompt.map((message: LanguageModelV2Message) => ({\n ...message,\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content.map(part =>\n part.type === 'file'\n ? {\n ...part,\n data:\n part.data instanceof Uint8Array\n ? convertDataContentToBase64String(part.data)\n : part.data,\n }\n : part,\n ),\n })),\n );\n}\n","import { LanguageModelV2Usage } from '@ai-sdk/provider';\n\n/**\nRepresents the number of tokens used in a prompt and completion.\n */\nexport type LanguageModelUsage = LanguageModelV2Usage;\n\n/**\nRepresents the number of tokens used in an embedding.\n */\n// TODO replace with EmbeddingModelV2Usage\nexport type EmbeddingModelUsage = {\n /**\nThe number of tokens used in the embedding.\n */\n tokens: number;\n};\n\nexport function addLanguageModelUsage(\n usage1: LanguageModelUsage,\n usage2: LanguageModelUsage,\n): LanguageModelUsage {\n return {\n inputTokens: addTokenCounts(usage1.inputTokens, usage2.inputTokens),\n outputTokens: addTokenCounts(usage1.outputTokens, usage2.outputTokens),\n totalTokens: addTokenCounts(usage1.totalTokens, usage2.totalTokens),\n reasoningTokens: addTokenCounts(\n usage1.reasoningTokens,\n usage2.reasoningTokens,\n ),\n cachedInputTokens: addTokenCounts(\n usage1.cachedInputTokens,\n usage2.cachedInputTokens,\n ),\n };\n}\n\nfunction addTokenCounts(\n tokenCount1: number | undefined,\n tokenCount2: number | undefined,\n): number | undefined {\n return tokenCount1 == null && tokenCount2 == null\n ? undefined\n : (tokenCount1 ?? 0) + (tokenCount2 ?? 0);\n}\n","export function asArray<T>(value: T | T[] | undefined): T[] {\n return value === undefined ? [] : Array.isArray(value) ? value : [value];\n}\n","import { APICallError } from '@ai-sdk/provider';\nimport { delay, getErrorMessage, isAbortError } from '@ai-sdk/provider-utils';\nimport { RetryError } from './retry-error';\n\nexport type RetryFunction = <OUTPUT>(\n fn: () => PromiseLike<OUTPUT>,\n) => PromiseLike<OUTPUT>;\n\nfunction getRetryDelayInMs({\n error,\n exponentialBackoffDelay,\n}: {\n error: APICallError;\n exponentialBackoffDelay: number;\n}): number {\n const headers = error.responseHeaders;\n\n if (!headers) return exponentialBackoffDelay;\n\n let ms: number | undefined;\n\n // retry-ms is more precise than retry-after and used by e.g. OpenAI\n const retryAfterMs = headers['retry-after-ms'];\n if (retryAfterMs) {\n const timeoutMs = parseFloat(retryAfterMs);\n if (!Number.isNaN(timeoutMs)) {\n ms = timeoutMs;\n }\n }\n\n // About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After\n const retryAfter = headers['retry-after'];\n if (retryAfter && ms === undefined) {\n const timeoutSeconds = parseFloat(retryAfter);\n if (!Number.isNaN(timeoutSeconds)) {\n ms = timeoutSeconds * 1000;\n } else {\n ms = Date.parse(retryAfter) - Date.now();\n }\n }\n\n // check that the delay is reasonable:\n if (\n ms != null &&\n !Number.isNaN(ms) &&\n 0 <= ms &&\n (ms < 60 * 1000 || ms < exponentialBackoffDelay)\n ) {\n return ms;\n }\n\n return exponentialBackoffDelay;\n}\n\n/**\nThe `retryWithExponentialBackoffRespectingRetryHeaders` strategy retries a failed API call with an exponential backoff,\nwhile respecting rate limit headers (retry-after-ms and retry-after) if they are provided and reasonable (0-60 seconds).\nYou can configure the maximum number of retries, the initial delay, and the backoff factor.\n */\nexport const retryWithExponentialBackoffRespectingRetryHeaders =\n ({\n maxRetries = 2,\n initialDelayInMs = 2000,\n backoffFactor = 2,\n abortSignal,\n }: {\n maxRetries?: number;\n initialDelayInMs?: number;\n backoffFactor?: number;\n abortSignal?: AbortSignal;\n } = {}): RetryFunction =>\n async <OUTPUT>(f: () => PromiseLike<OUTPUT>) =>\n _retryWithExponentialBackoff(f, {\n maxRetries,\n delayInMs: initialDelayInMs,\n backoffFactor,\n abortSignal,\n });\n\nasync function _retryWithExponentialBackoff<OUTPUT>(\n f: () => PromiseLike<OUTPUT>,\n {\n maxRetries,\n delayInMs,\n backoffFactor,\n abortSignal,\n }: {\n maxRetries: number;\n delayInMs: number;\n backoffFactor: number;\n abortSignal: AbortSignal | undefined;\n },\n errors: unknown[] = [],\n): Promise<OUTPUT> {\n try {\n return await f();\n } catch (error) {\n if (isAbortError(error)) {\n throw error; // don't retry when the request was aborted\n }\n\n if (maxRetries === 0) {\n throw error; // don't wrap the error when retries are disabled\n }\n\n const errorMessage = getErrorMessage(error);\n const newErrors = [...errors, error];\n const tryNumber = newErrors.length;\n\n if (tryNumber > maxRetries) {\n throw new RetryError({\n message: `Failed after ${tryNumber} attempts. Last error: ${errorMessage}`,\n reason: 'maxRetriesExceeded',\n errors: newErrors,\n });\n }\n\n if (\n error instanceof Error &&\n APICallError.isInstance(error) &&\n error.isRetryable === true &&\n tryNumber <= maxRetries\n ) {\n await delay(\n getRetryDelayInMs({\n error,\n exponentialBackoffDelay: delayInMs,\n }),\n { abortSignal },\n );\n\n return _retryWithExponentialBackoff(\n f,\n {\n maxRetries,\n delayInMs: backoffFactor * delayInMs,\n backoffFactor,\n abortSignal,\n },\n newErrors,\n );\n }\n\n if (tryNumber === 1) {\n throw error; // don't wrap the error when a non-retryable error occurs on the first try\n }\n\n throw new RetryError({\n message: `Failed after ${tryNumber} attempts with non-retryable error: '${errorMessage}'`,\n reason: 'errorNotRetryable',\n errors: newErrors,\n });\n }\n}\n","import { InvalidArgumentError } from '../error/invalid-argument-error';\nimport {\n RetryFunction,\n retryWithExponentialBackoffRespectingRetryHeaders,\n} from '../util/retry-with-exponential-backoff';\n\n/**\n * Validate and prepare retries.\n */\nexport function prepareRetries({\n maxRetries,\n abortSignal,\n}: {\n maxRetries: number | undefined;\n abortSignal: AbortSignal | undefined;\n}): {\n maxRetries: number;\n retry: RetryFunction;\n} {\n if (maxRetries != null) {\n if (!Number.isInteger(maxRetries)) {\n throw new InvalidArgumentError({\n parameter: 'maxRetries',\n value: maxRetries,\n message: 'maxRetries must be an integer',\n });\n }\n\n if (maxRetries < 0) {\n throw new InvalidArgumentError({\n parameter: 'maxRetries',\n value: maxRetries,\n message: 'maxRetries must be >= 0',\n });\n }\n }\n\n const maxRetriesResult = maxRetries ?? 2;\n\n return {\n maxRetries: maxRetriesResult,\n retry: retryWithExponentialBackoffRespectingRetryHeaders({\n maxRetries: maxRetriesResult,\n abortSignal,\n }),\n };\n}\n","import { LanguageModelV2Content, LanguageModelV2Text } from '@ai-sdk/provider';\n\nexport function extractContentText(\n content: LanguageModelV2Content[],\n): string | undefined {\n const parts = content.filter(\n (content): content is LanguageModelV2Text => content.type === 'text',\n );\n\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.map(content => content.text).join('');\n}\n","import {\n convertBase64ToUint8Array,\n convertUint8ArrayToBase64,\n} from '@ai-sdk/provider-utils';\n\n/**\n * A generated file.\n */\nexport interface GeneratedFile {\n /**\nFile as a base64 encoded string.\n */\n readonly base64: string;\n\n /**\nFile as a Uint8Array.\n */\n readonly uint8Array: Uint8Array;\n\n /**\nThe IANA media type of the file.\n\n@see https://www.iana.org/assignments/media-types/media-types.xhtml\n */\n readonly mediaType: string;\n}\n\nexport class DefaultGeneratedFile implements GeneratedFile {\n private base64Data: string | undefined;\n private uint8ArrayData: Uint8Array | undefined;\n\n readonly mediaType: string;\n\n constructor({\n data,\n mediaType,\n }: {\n data: string | Uint8Array;\n mediaType: string;\n }) {\n const isUint8Array = data instanceof Uint8Array;\n this.base64Data = isUint8Array ? undefined : data;\n this.uint8ArrayData = isUint8Array ? data : undefined;\n this.mediaType = mediaType;\n }\n\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get base64() {\n if (this.base64Data == null) {\n this.base64Data = convertUint8ArrayToBase64(this.uint8ArrayData!);\n }\n return this.base64Data;\n }\n\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get uint8Array() {\n if (this.uint8ArrayData == null) {\n this.uint8ArrayData = convertBase64ToUint8Array(this.base64Data!);\n }\n return this.uint8ArrayData;\n }\n}\n\nexport class DefaultGeneratedFileWithType extends DefaultGeneratedFile {\n readonly type = 'file';\n\n constructor(options: { data: string | Uint8Array; mediaType: string }) {\n super(options);\n }\n}\n","import { LanguageModelV2ToolCall } from '@ai-sdk/provider';\nimport {\n asSchema,\n ModelMessage,\n safeParseJSON,\n safeValidateTypes,\n} from '@ai-sdk/provider-utils';\nimport { InvalidToolInputError } from '../error/invalid-tool-input-error';\nimport { NoSuchToolError } from '../error/no-such-tool-error';\nimport { ToolCallRepairError } from '../error/tool-call-repair-error';\nimport { TypedToolCall } from './tool-call';\nimport { ToolCallRepairFunction } from './tool-call-repair-function';\nimport { ToolSet } from './tool-set';\n\nexport async function parseToolCall<TOOLS extends ToolSet>({\n toolCall,\n tools,\n repairToolCall,\n system,\n messages,\n}: {\n toolCall: LanguageModelV2ToolCall;\n tools: TOOLS | undefined;\n repairToolCall: ToolCallRepairFunction<TOOLS> | undefined;\n system: string | undefined;\n messages: ModelMessage[];\n}): Promise<TypedToolCall<TOOLS>> {\n try {\n if (tools == null) {\n throw new NoSuchToolError({ toolName: toolCall.toolName });\n }\n\n try {\n return await doParseToolCall({ toolCall, tools });\n } catch (error) {\n if (\n repairToolCall == null ||\n !(\n NoSuchToolError.isInstance(error) ||\n InvalidToolInputError.isInstance(error)\n )\n ) {\n throw error;\n }\n\n let repairedToolCall: LanguageModelV2ToolCall | null = null;\n\n try {\n repairedToolCall = await repairToolCall({\n toolCall,\n tools,\n inputSchema: ({ toolName }) => {\n const { inputSchema } = tools[toolName];\n return asSchema(inputSchema).jsonSchema;\n },\n system,\n messages,\n error,\n });\n } catch (repairError) {\n throw new ToolCallRepairError({\n cause: repairError,\n originalError: error,\n });\n }\n\n // no repaired tool call returned\n if (repairedToolCall == null) {\n throw error;\n }\n\n return await doParseToolCall({ toolCall: repairedToolCall, tools });\n }\n } catch (error) {\n // TODO AI SDK 6: special invalid tool call parts\n return {\n type: 'tool-call',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n dynamic: true,\n invalid: true,\n error,\n };\n }\n}\n\nasync function doParseToolCall<TOOLS extends ToolSet>({\n toolCall,\n tools,\n}: {\n toolCall: LanguageModelV2ToolCall;\n tools: TOOLS;\n}): Promise<TypedToolCall<TOOLS>> {\n const toolName = toolCall.toolName as keyof TOOLS & string;\n\n const tool = tools[toolName];\n\n if (tool == null) {\n throw new NoSuchToolError({\n toolName: toolCall.toolName,\n availableTools: Object.keys(tools),\n });\n }\n\n const schema = asSchema(tool.inputSchema);\n\n // when the tool call has no arguments, we try passing an empty object to the schema\n // (many LLMs generate empty strings for tool calls with no arguments)\n const parseResult =\n toolCall.input.trim() === ''\n ? await safeValidateTypes({ value: {}, schema })\n : await safeParseJSON({ text: toolCall.input, schema });\n\n if (parseResult.success === false) {\n throw new InvalidToolInputError({\n toolName,\n toolInput: toolCall.input,\n cause: parseResult.error,\n });\n }\n\n return tool.type === 'dynamic'\n ? {\n type: 'tool-call',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: parseResult.value,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n dynamic: true,\n }\n : {\n type: 'tool-call',\n toolCallId: toolCall.toolCallId,\n toolName,\n input: parseResult.value,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n };\n}\n","import { ReasoningPart } from '@ai-sdk/provider-utils';\nimport {\n CallWarning,\n FinishReason,\n LanguageModelRequestMetadata,\n LanguageModelResponseMetadata,\n ProviderMetadata,\n} from '../types';\nimport { Source } from '../types/language-model';\nimport { LanguageModelUsage } from '../types/usage';\nimport { ContentPart } from './content-part';\nimport { GeneratedFile } from './generated-file';\nimport { ResponseMessage } from './response-message';\nimport { DynamicToolCall, StaticToolCall, TypedToolCall } from './tool-call';\nimport {\n DynamicToolResult,\n StaticToolResult,\n TypedToolResult,\n} from './tool-result';\nimport { ToolSet } from './tool-set';\n\n/**\n * The result of a single step in the generation process.\n */\nexport type StepResult<TOOLS extends ToolSet> = {\n /**\nThe content that was generated in the last step.\n */\n readonly content: Array<ContentPart<TOOLS>>;\n\n /**\nThe generated text.\n*/\n readonly text: string;\n\n /**\nThe reasoning that was generated during the generation.\n*/\n readonly reasoning: Array<ReasoningPart>;\n\n /**\nThe reasoning text that was generated during the generation.\n*/\n readonly reasoningText: string | undefined;\n\n /**\nThe files that were generated during the generation.\n*/\n readonly files: Array<GeneratedFile>;\n\n /**\nThe sources that were used to generate the text.\n*/\n readonly sources: Array<Source>;\n\n /**\nThe tool calls that were made during the generation.\n*/\n readonly toolCalls: Array<TypedToolCall<TOOLS>>;\n\n /**\nThe static tool calls that were made in the last step.\n*/\n readonly staticToolCalls: Array<StaticToolCall<TOOLS>>;\n\n /**\nThe dynamic tool calls that were made in the last step.\n*/\n readonly dynamicToolCalls: Array<DynamicToolCall>;\n\n /**\nThe results of the tool calls.\n*/\n readonly toolResults: Array<TypedToolResult<TOOLS>>;\n\n /**\nThe static tool results that were made in the last step.\n*/\n readonly staticToolResults: Array<StaticToolResult<TOOLS>>;\n\n /**\nThe dynamic tool results that were made in the last step.\n*/\n readonly dynamicToolResults: Array<DynamicToolResult>;\n\n /**\nThe reason why the generation finished.\n*/\n readonly finishReason: FinishReason;\n\n /**\nThe token usage of the generated text.\n*/\n readonly usage: LanguageModelUsage;\n\n /**\nWarnings from the model provider (e.g. unsupported settings).\n*/\n readonly warnings: CallWarning[] | undefined;\n\n /**\nAdditional request information.\n */\n readonly request: LanguageModelRequestMetadata;\n\n /**\nAdditional response information.\n*/\n readonly response: LanguageModelResponseMetadata & {\n /**\nThe response messages that were generated during the call.\nResponse messages can be either assistant messages or tool messages.\nThey contain a generated id.\n*/\n readonly messages: Array<ResponseMessage>;\n\n /**\nResponse body (available only for providers that use HTTP requests).\n */\n body?: unknown;\n };\n\n /**\nAdditional provider-specific metadata. They are passed through\nfrom the provider to the AI SDK and enable provider-specific\nresults that can be fully encapsulated in the provider.\n */\n readonly providerMetadata: ProviderMetadata | undefined;\n};\n\nexport class DefaultStepResult<TOOLS extends ToolSet>\n implements StepResult<TOOLS>\n{\n readonly content: StepResult<TOOLS>['content'];\n readonly finishReason: StepResult<TOOLS>['finishReason'];\n readonly usage: StepResult<TOOLS>['usage'];\n readonly warnings: StepResult<TOOLS>['warnings'];\n readonly request: StepResult<TOOLS>['request'];\n readonly response: StepResult<TOOLS>['response'];\n readonly providerMetadata: StepResult<TOOLS>['providerMetadata'];\n\n constructor({\n content,\n finishReason,\n usage,\n warnings,\n request,\n response,\n providerMetadata,\n }: {\n content: StepResult<TOOLS>['content'];\n finishReason: StepResult<TOOLS>['finishReason'];\n usage: StepResult<TOOLS>['usage'];\n warnings: StepResult<TOOLS>['warnings'];\n request: StepResult<TOOLS>['request'];\n response: StepResult<TOOLS>['response'];\n providerMetadata: StepResult<TOOLS>['providerMetadata'];\n }) {\n this.content = content;\n this.finishReason = finishReason;\n this.usage = usage;\n this.warnings = warnings;\n this.request = request;\n this.response = response;\n this.providerMetadata = providerMetadata;\n }\n\n get text() {\n return this.content\n .filter(part => part.type === 'text')\n .map(part => part.text)\n .join('');\n }\n\n get reasoning() {\n return this.content.filter(part => part.type === 'reasoning');\n }\n\n get reasoningText() {\n return this.reasoning.length === 0\n ? undefined\n : this.reasoning.map(part => part.text).join('');\n }\n\n get files() {\n return this.content\n .filter(part => part.type === 'file')\n .map(part => part.file);\n }\n\n get sources() {\n return this.content.filter(part => part.type === 'source');\n }\n\n get toolCalls() {\n return this.content.filter(part => part.type === 'tool-call');\n }\n\n get staticToolCalls() {\n return this.toolCalls.filter(\n (toolCall): toolCall is StaticToolCall<TOOLS> =>\n toolCall.dynamic === false,\n );\n }\n\n get dynamicToolCalls() {\n return this.toolCalls.filter(\n (toolCall): toolCall is DynamicToolCall => toolCall.dynamic === true,\n );\n }\n\n get toolResults() {\n return this.content.filter(part => part.type === 'tool-result');\n }\n\n get staticToolResults() {\n return this.toolResults.filter(\n (toolResult): toolResult is StaticToolResult<TOOLS> =>\n toolResult.dynamic === false,\n );\n }\n\n get dynamicToolResults() {\n return this.toolResults.filter(\n (toolResult): toolResult is DynamicToolResult =>\n toolResult.dynamic === true,\n );\n }\n}\n","import { StepResult } from './step-result';\nimport { ToolSet } from './tool-set';\n\nexport type StopCondition<TOOLS extends ToolSet> = (options: {\n steps: Array<StepResult<TOOLS>>;\n}) => PromiseLike<boolean> | boolean;\n\nexport function stepCountIs(stepCount: number): StopCondition<any> {\n return ({ steps }) => steps.length === stepCount;\n}\n\nexport function hasToolCall(toolName: string): StopCondition<any> {\n return ({ steps }) =>\n steps[steps.length - 1]?.toolCalls?.some(\n toolCall => toolCall.toolName === toolName,\n ) ?? false;\n}\n\nexport async function isStopConditionMet<TOOLS extends ToolSet>({\n stopConditions,\n steps,\n}: {\n stopConditions: Array<StopCondition<TOOLS>>;\n steps: Array<StepResult<TOOLS>>;\n}): Promise<boolean> {\n return (\n await Promise.all(stopConditions.map(condition => condition({ steps })))\n ).some(result => result);\n}\n","import {\n getErrorMessage,\n JSONValue,\n LanguageModelV2ToolResultOutput,\n} from '@ai-sdk/provider';\nimport { Tool } from '@ai-sdk/provider-utils';\n\nexport function createToolModelOutput({\n output,\n tool,\n errorMode,\n}: {\n output: unknown;\n tool: Tool | undefined;\n errorMode: 'none' | 'text' | 'json';\n}): LanguageModelV2ToolResultOutput {\n if (errorMode === 'text') {\n return { type: 'error-text', value: getErrorMessage(output) };\n } else if (errorMode === 'json') {\n return { type: 'error-json', value: toJSONValue(output) };\n }\n\n if (tool?.toModelOutput) {\n return tool.toModelOutput(output);\n }\n\n return typeof output === 'string'\n ? { type: 'text', value: output }\n : { type: 'json', value: toJSONValue(output) };\n}\n\nfunction toJSONValue(value: unknown): JSONValue {\n return value === undefined ? null : (value as JSONValue);\n}\n","import {\n AssistantContent,\n AssistantModelMessage,\n ToolContent,\n ToolModelMessage,\n} from '../prompt';\nimport { createToolModelOutput } from '../prompt/create-tool-model-output';\nimport { ContentPart } from './content-part';\nimport { ToolSet } from './tool-set';\n\n/**\nConverts the result of a `generateText` or `streamText` call to a list of response messages.\n */\nexport function toResponseMessages<TOOLS extends ToolSet>({\n content: inputContent,\n tools,\n}: {\n content: Array<ContentPart<TOOLS>>;\n tools: TOOLS | undefined;\n}): Array<AssistantModelMessage | ToolModelMessage> {\n const responseMessages: Array<AssistantModelMessage | ToolModelMessage> = [];\n\n const content: AssistantContent = inputContent\n .filter(part => part.type !== 'source')\n .filter(\n part =>\n (part.type !== 'tool-result' || part.providerExecuted) &&\n (part.type !== 'tool-error' || part.providerExecuted),\n )\n .filter(part => part.type !== 'text' || part.text.length > 0)\n .map(part => {\n switch (part.type) {\n case 'text':\n return {\n type: 'text',\n text: part.text,\n providerOptions: part.providerMetadata,\n };\n case 'reasoning':\n return {\n type: 'reasoning',\n text: part.text,\n providerOptions: part.providerMetadata,\n };\n case 'file':\n return {\n type: 'file',\n data: part.file.base64,\n mediaType: part.file.mediaType,\n providerOptions: part.providerMetadata,\n };\n case 'tool-call':\n return {\n type: 'tool-call',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n providerExecuted: part.providerExecuted,\n providerOptions: part.providerMetadata,\n };\n case 'tool-result':\n return {\n type: 'tool-result',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: createToolModelOutput({\n tool: tools?.[part.toolName],\n output: part.output,\n errorMode: 'none',\n }),\n providerExecuted: true,\n providerOptions: part.providerMetadata,\n };\n case 'tool-error':\n return {\n type: 'tool-result',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: createToolModelOutput({\n tool: tools?.[part.toolName],\n output: part.error,\n errorMode: 'json',\n }),\n providerOptions: part.providerMetadata,\n };\n }\n });\n\n if (content.length > 0) {\n responseMessages.push({\n role: 'assistant',\n content,\n });\n }\n\n const toolResultContent: ToolContent = inputContent\n .filter(part => part.type === 'tool-result' || part.type === 'tool-error')\n .filter(part => !part.providerExecuted)\n .map(toolResult => ({\n type: 'tool-result',\n toolCallId: toolResult.toolCallId,\n toolName: toolResult.toolName,\n output: createToolModelOutput({\n tool: tools?.[toolResult.toolName],\n output:\n toolResult.type === 'tool-result'\n ? toolResult.output\n : toolResult.error,\n errorMode: toolResult.type === 'tool-error' ? 'text' : 'none',\n }),\n }));\n\n if (toolResultContent.length > 0) {\n responseMessages.push({\n role: 'tool',\n content: toolResultContent,\n });\n }\n\n return responseMessages;\n}\n","import {\n getErrorMessage,\n LanguageModelV2,\n LanguageModelV2CallWarning,\n} from '@ai-sdk/provider';\nimport {\n createIdGenerator,\n IdGenerator,\n isAbortError,\n ProviderOptions,\n} from '@ai-sdk/provider-utils';\nimport { Span } from '@opentelemetry/api';\nimport { ServerResponse } from 'node:http';\nimport { NoOutputGeneratedError } from '../error';\nimport { NoOutputSpecifiedError } from '../error/no-output-specified-error';\nimport { resolveLanguageModel } from '../model/resolve-model';\nimport { CallSettings } from '../prompt/call-settings';\nimport { convertToLanguageModelPrompt } from '../prompt/convert-to-language-model-prompt';\nimport { prepareCallSettings } from '../prompt/prepare-call-settings';\nimport { prepareToolsAndToolChoice } from '../prompt/prepare-tools-and-tool-choice';\nimport { Prompt } from '../prompt/prompt';\nimport { standardizePrompt } from '../prompt/standardize-prompt';\nimport { wrapGatewayError } from '../prompt/wrap-gateway-error';\nimport { assembleOperationName } from '../telemetry/assemble-operation-name';\nimport { getBaseTelemetryAttributes } from '../telemetry/get-base-telemetry-attributes';\nimport { getTracer } from '../telemetry/get-tracer';\nimport { recordSpan } from '../telemetry/record-span';\nimport { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';\nimport { stringifyForTelemetry } from '../telemetry/stringify-for-telemetry';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport { createTextStreamResponse } from '../text-stream/create-text-stream-response';\nimport { pipeTextStreamToResponse } from '../text-stream/pipe-text-stream-to-response';\nimport { LanguageModelRequestMetadata } from '../types';\nimport {\n CallWarning,\n FinishReason,\n LanguageModel,\n ToolChoice,\n} from '../types/language-model';\nimport { ProviderMetadata } from '../types/provider-metadata';\nimport { addLanguageModelUsage, LanguageModelUsage } from '../types/usage';\nimport { UIMessage } from '../ui';\nimport { createUIMessageStreamResponse } from '../ui-message-stream/create-ui-message-stream-response';\nimport { getResponseUIMessageId } from '../ui-message-stream/get-response-ui-message-id';\nimport { handleUIMessageStreamFinish } from '../ui-message-stream/handle-ui-message-stream-finish';\nimport { pipeUIMessageStreamToResponse } from '../ui-message-stream/pipe-ui-message-stream-to-response';\nimport {\n InferUIMessageChunk,\n UIMessageChunk,\n} from '../ui-message-stream/ui-message-chunks';\nimport { UIMessageStreamResponseInit } from '../ui-message-stream/ui-message-stream-response-init';\nimport { InferUIMessageData, InferUIMessageMetadata } from '../ui/ui-messages';\nimport { asArray } from '../util/as-array';\nimport {\n AsyncIterableStream,\n createAsyncIterableStream,\n} from '../util/async-iterable-stream';\nimport { consumeStream } from '../util/consume-stream';\nimport { createStitchableStream } from '../util/create-stitchable-stream';\nimport { DelayedPromise } from '../util/delayed-promise';\nimport { filterStreamErrors } from '../util/filter-stream-errors';\nimport { now as originalNow } from '../util/now';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { ContentPart } from './content-part';\nimport { Output } from './output';\nimport { PrepareStepFunction } from './prepare-step';\nimport { ResponseMessage } from './response-message';\nimport {\n runToolsTransformation,\n SingleRequestTextStreamPart,\n} from './run-tools-transformation';\nimport { DefaultStepResult, StepResult } from './step-result';\nimport {\n isStopConditionMet,\n stepCountIs,\n StopCondition,\n} from './stop-condition';\nimport {\n ConsumeStreamOptions,\n StreamTextResult,\n TextStreamPart,\n UIMessageStreamOptions,\n} from './stream-text-result';\nimport { toResponseMessages } from './to-response-messages';\nimport { TypedToolCall } from './tool-call';\nimport { ToolCallRepairFunction } from './tool-call-repair-function';\nimport { ToolOutput } from './tool-output';\nimport { ToolSet } from './tool-set';\n\nconst originalGenerateId = createIdGenerator({\n prefix: 'aitxt',\n size: 24,\n});\n\n/**\nA transformation that is applied to the stream.\n\n@param stopStream - A function that stops the source stream.\n@param tools - The tools that are accessible to and can be called by the model. The model needs to support calling tools.\n */\nexport type StreamTextTransform<TOOLS extends ToolSet> = (options: {\n tools: TOOLS; // for type inference\n stopStream: () => void;\n}) => TransformStream<TextStreamPart<TOOLS>, TextStreamPart<TOOLS>>;\n\n/**\nCallback that is set using the `onError` option.\n\n@param event - The event that is passed to the callback.\n */\nexport type StreamTextOnErrorCallback = (event: {\n error: unknown;\n}) => PromiseLike<void> | void;\n\n/**\nCallback that is set using the `onStepFinish` option.\n\n@param stepResult - The result of the step.\n */\nexport type StreamTextOnStepFinishCallback<TOOLS extends ToolSet> = (\n stepResult: StepResult<TOOLS>,\n) => PromiseLike<void> | void;\n\n/**\nCallback that is set using the `onChunk` option.\n\n@param event - The event that is passed to the callback.\n */\nexport type StreamTextOnChunkCallback<TOOLS extends ToolSet> = (event: {\n chunk: Extract<\n TextStreamPart<TOOLS>,\n {\n type:\n | 'text-delta'\n | 'reasoning-delta'\n | 'source'\n | 'tool-call'\n | 'tool-input-start'\n | 'tool-input-delta'\n | 'tool-result'\n | 'raw';\n }\n >;\n}) => PromiseLike<void> | void;\n\n/**\nCallback that is set using the `onFinish` option.\n\n@param event - The event that is passed to the callback.\n */\nexport type StreamTextOnFinishCallback<TOOLS extends ToolSet> = (\n event: StepResult<TOOLS> & {\n /**\nDetails for all steps.\n */\n readonly steps: StepResult<TOOLS>[];\n\n /**\nTotal usage for all steps. This is the sum of the usage of all steps.\n */\n readonly totalUsage: LanguageModelUsage;\n },\n) => PromiseLike<void> | void;\n\n/**\nCallback that is set using the `onAbort` option.\n\n@param event - The event that is passed to the callback.\n */\nexport type StreamTextOnAbortCallback<TOOLS extends ToolSet> = (event: {\n /**\nDetails for all previously finished steps.\n */\n readonly steps: StepResult<TOOLS>[];\n}) => PromiseLike<void> | void;\n\n/**\nGenerate a text and call tools for a given prompt using a language model.\n\nThis function streams the output. If you do not want to stream the output, use `generateText` instead.\n\n@param model - The language model to use.\n@param tools - Tools that are accessible to and can be called by the model. The model needs to support calling tools.\n\n@param system - A system message that will be part of the prompt.\n@param prompt - A simple text prompt. You can either use `prompt` or `messages` but not both.\n@param messages - A list of messages. You can either use `prompt` or `messages` but not both.\n\n@param maxOutputTokens - Maximum number of tokens to generate.\n@param temperature - Temperature setting.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topP - Nucleus sampling.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topK - Only sample from the top K options for each subsequent token.\nUsed to remove \"long tail\" low probability responses.\nRecommended for advanced use cases only. You usually only need to use temperature.\n@param presencePenalty - Presence penalty setting.\nIt affects the likelihood of the model to repeat information that is already in the prompt.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param frequencyPenalty - Frequency penalty setting.\nIt affects the likelihood of the model to repeatedly use the same words or phrases.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param stopSequences - Stop sequences.\nIf set, the model will stop generating text when one of the stop sequences is generated.\n@param seed - The seed (integer) to use for random sampling.\nIf set and supported by the model, calls will generate deterministic results.\n\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@param maxSteps - Maximum number of sequential LLM calls (steps), e.g. when you use tool calls.\n\n@param onChunk - Callback that is called for each chunk of the stream. The stream processing will pause until the callback promise is resolved.\n@param onError - Callback that is called when an error occurs during streaming. You can use it to log errors.\n@param onStepFinish - Callback that is called when each step (LLM call) is finished, including intermediate steps.\n@param onFinish - Callback that is called when the LLM response and all request tool executions\n(for tools that have an `execute` function) are finished.\n\n@return\nA result object for accessing different stream types and additional information.\n */\nexport function streamText<\n TOOLS extends ToolSet,\n OUTPUT = never,\n PARTIAL_OUTPUT = never,\n>({\n model,\n tools,\n toolChoice,\n system,\n prompt,\n messages,\n maxRetries,\n abortSignal,\n headers,\n stopWhen = stepCountIs(1),\n experimental_output: output,\n experimental_telemetry: telemetry,\n prepareStep,\n providerOptions,\n experimental_activeTools,\n activeTools = experimental_activeTools,\n experimental_repairToolCall: repairToolCall,\n experimental_transform: transform,\n includeRawChunks = false,\n onChunk,\n onError = ({ error }) => {\n console.error(error);\n },\n onFinish,\n onAbort,\n onStepFinish,\n experimental_context,\n _internal: {\n now = originalNow,\n generateId = originalGenerateId,\n currentDate = () => new Date(),\n } = {},\n ...settings\n}: CallSettings &\n Prompt & {\n /**\nThe language model to use.\n */\n model: LanguageModel;\n\n /**\nThe tools that the model can call. The model needs to support calling tools.\n */\n tools?: TOOLS;\n\n /**\nThe tool choice strategy. Default: 'auto'.\n */\n toolChoice?: ToolChoice<TOOLS>;\n\n /**\nCondition for stopping the generation when there are tool results in the last step.\nWhen the condition is an array, any of the conditions can be met to stop the generation.\n\n@default stepCountIs(1)\n */\n stopWhen?:\n | StopCondition<NoInfer<TOOLS>>\n | Array<StopCondition<NoInfer<TOOLS>>>;\n\n /**\nOptional telemetry configuration (experimental).\n */\n experimental_telemetry?: TelemetrySettings;\n\n /**\nAdditional provider-specific options. 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\n /**\n * @deprecated Use `activeTools` instead.\n */\n experimental_activeTools?: Array<keyof NoInfer<TOOLS>>;\n\n /**\n Limits the tools that are available for the model to call without\n changing the tool call and result types in the result.\n */\n activeTools?: Array<keyof NoInfer<TOOLS>>;\n\n /**\nOptional specification for parsing structured outputs from the LLM response.\n */\n experimental_output?: Output<OUTPUT, PARTIAL_OUTPUT>;\n\n /**\nOptional function that you can use to provide different settings for a step.\n\n@param options - The options for the step.\n@param options.steps - The steps that have been executed so far.\n@param options.stepNumber - The number of the step that is being executed.\n@param options.model - The model that is being used.\n\n@returns An object that contains the settings for the step.\nIf you return undefined (or for undefined settings), the settings from the outer level will be used.\n */\n prepareStep?: PrepareStepFunction<NoInfer<TOOLS>>;\n\n /**\nA function that attempts to repair a tool call that failed to parse.\n */\n experimental_repairToolCall?: ToolCallRepairFunction<TOOLS>;\n\n /**\nOptional stream transformations.\nThey are applied in the order they are provided.\nThe stream transformations must maintain the stream structure for streamText to work correctly.\n */\n experimental_transform?:\n | StreamTextTransform<TOOLS>\n | Array<StreamTextTransform<TOOLS>>;\n\n /**\nWhether to include raw chunks from the provider in the stream.\nWhen enabled, you will receive raw chunks with type 'raw' that contain the unprocessed data from the provider.\nThis allows access to cutting-edge provider features not yet wrapped by the AI SDK.\nDefaults to false.\n */\n includeRawChunks?: boolean;\n\n /**\nCallback that is called for each chunk of the stream.\nThe stream processing will pause until the callback promise is resolved.\n */\n onChunk?: StreamTextOnChunkCallback<TOOLS>;\n\n /**\nCallback that is invoked when an error occurs during streaming.\nYou can use it to log errors.\nThe stream processing will pause until the callback promise is resolved.\n */\n onError?: StreamTextOnErrorCallback;\n\n /**\nCallback that is called when the LLM response and all request tool executions\n(for tools that have an `execute` function) are finished.\n\nThe usage is the combined usage of all steps.\n */\n onFinish?: StreamTextOnFinishCallback<TOOLS>;\n\n onAbort?: StreamTextOnAbortCallback<TOOLS>;\n\n /**\nCallback that is called when each step (LLM call) is finished, including intermediate steps.\n */\n onStepFinish?: StreamTextOnStepFinishCallback<TOOLS>;\n\n /**\n * Context that is passed into tool execution.\n *\n * Experimental (can break in patch releases).\n *\n * @default undefined\n */\n experimental_context?: unknown;\n\n /**\nInternal. For test use only. May change without notice.\n */\n _internal?: {\n now?: () => number;\n generateId?: IdGenerator;\n currentDate?: () => Date;\n };\n }): StreamTextResult<TOOLS, PARTIAL_OUTPUT> {\n return new DefaultStreamTextResult<TOOLS, OUTPUT, PARTIAL_OUTPUT>({\n model: resolveLanguageModel(model),\n telemetry,\n headers,\n settings,\n maxRetries,\n abortSignal,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n transforms: asArray(transform),\n activeTools,\n repairToolCall,\n stopConditions: asArray(stopWhen),\n output,\n providerOptions,\n prepareStep,\n includeRawChunks,\n onChunk,\n onError,\n onFinish,\n onAbort,\n onStepFinish,\n now,\n currentDate,\n generateId,\n experimental_context,\n });\n}\n\ntype EnrichedStreamPart<TOOLS extends ToolSet, PARTIAL_OUTPUT> = {\n part: TextStreamPart<TOOLS>;\n partialOutput: PARTIAL_OUTPUT | undefined;\n};\n\nfunction createOutputTransformStream<\n TOOLS extends ToolSet,\n OUTPUT,\n PARTIAL_OUTPUT,\n>(\n output: Output<OUTPUT, PARTIAL_OUTPUT> | undefined,\n): TransformStream<\n TextStreamPart<TOOLS>,\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>\n> {\n if (!output) {\n return new TransformStream<\n TextStreamPart<TOOLS>,\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>\n >({\n transform(chunk, controller) {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n },\n });\n }\n\n let firstTextChunkId: string | undefined = undefined;\n let text = '';\n let textChunk = '';\n let lastPublishedJson = '';\n\n function publishTextChunk({\n controller,\n partialOutput = undefined,\n }: {\n controller: TransformStreamDefaultController<\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>\n >;\n partialOutput?: PARTIAL_OUTPUT;\n }) {\n controller.enqueue({\n part: {\n type: 'text-delta',\n id: firstTextChunkId!,\n text: textChunk,\n },\n partialOutput,\n });\n textChunk = '';\n }\n\n return new TransformStream<\n TextStreamPart<TOOLS>,\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>\n >({\n async transform(chunk, controller) {\n // ensure that we publish the last text chunk before the step finish:\n if (chunk.type === 'finish-step' && textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n\n if (\n chunk.type !== 'text-delta' &&\n chunk.type !== 'text-start' &&\n chunk.type !== 'text-end'\n ) {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n // we have to pick a text chunk which contains the json text\n // since we are streaming, we have to pick the first text chunk\n if (firstTextChunkId == null) {\n firstTextChunkId = chunk.id;\n } else if (chunk.id !== firstTextChunkId) {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n if (chunk.type === 'text-start') {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n if (chunk.type === 'text-end') {\n if (textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n text += chunk.text;\n textChunk += chunk.text;\n\n // only publish if partial json can be parsed:\n const result = await output.parsePartial({ text });\n if (result != null) {\n // only send new json if it has changed:\n const currentJson = JSON.stringify(result.partial);\n if (currentJson !== lastPublishedJson) {\n publishTextChunk({ controller, partialOutput: result.partial });\n lastPublishedJson = currentJson;\n }\n }\n },\n });\n}\n\nclass DefaultStreamTextResult<TOOLS extends ToolSet, OUTPUT, PARTIAL_OUTPUT>\n implements StreamTextResult<TOOLS, PARTIAL_OUTPUT>\n{\n private readonly _totalUsage = new DelayedPromise<\n Awaited<StreamTextResult<TOOLS, PARTIAL_OUTPUT>['usage']>\n >();\n private readonly _finishReason = new DelayedPromise<\n Awaited<StreamTextResult<TOOLS, PARTIAL_OUTPUT>['finishReason']>\n >();\n private readonly _steps = new DelayedPromise<\n Awaited<StreamTextResult<TOOLS, PARTIAL_OUTPUT>['steps']>\n >();\n\n private readonly addStream: (\n stream: ReadableStream<TextStreamPart<TOOLS>>,\n ) => void;\n\n private readonly closeStream: () => void;\n\n private baseStream: ReadableStream<EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>>;\n\n private output: Output<OUTPUT, PARTIAL_OUTPUT> | undefined;\n\n private includeRawChunks: boolean;\n\n private tools: TOOLS | undefined;\n\n constructor({\n model,\n telemetry,\n headers,\n settings,\n maxRetries: maxRetriesArg,\n abortSignal,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n transforms,\n activeTools,\n repairToolCall,\n stopConditions,\n output,\n providerOptions,\n prepareStep,\n includeRawChunks,\n now,\n currentDate,\n generateId,\n onChunk,\n onError,\n onFinish,\n onAbort,\n onStepFinish,\n experimental_context,\n }: {\n model: LanguageModelV2;\n telemetry: TelemetrySettings | undefined;\n headers: Record<string, string | undefined> | undefined;\n settings: Omit<CallSettings, 'abortSignal' | 'headers'>;\n maxRetries: number | undefined;\n abortSignal: AbortSignal | undefined;\n system: Prompt['system'];\n prompt: Prompt['prompt'];\n messages: Prompt['messages'];\n tools: TOOLS | undefined;\n toolChoice: ToolChoice<TOOLS> | undefined;\n transforms: Array<StreamTextTransform<TOOLS>>;\n activeTools: Array<keyof TOOLS> | undefined;\n repairToolCall: ToolCallRepairFunction<TOOLS> | undefined;\n stopConditions: Array<StopCondition<NoInfer<TOOLS>>>;\n output: Output<OUTPUT, PARTIAL_OUTPUT> | undefined;\n providerOptions: ProviderOptions | undefined;\n prepareStep: PrepareStepFunction<NoInfer<TOOLS>> | undefined;\n includeRawChunks: boolean;\n now: () => number;\n currentDate: () => Date;\n generateId: () => string;\n experimental_context: unknown;\n\n // callbacks:\n onChunk: undefined | StreamTextOnChunkCallback<TOOLS>;\n onError: StreamTextOnErrorCallback;\n onFinish: undefined | StreamTextOnFinishCallback<TOOLS>;\n onAbort: undefined | StreamTextOnAbortCallback<TOOLS>;\n onStepFinish: undefined | StreamTextOnStepFinishCallback<TOOLS>;\n }) {\n this.output = output;\n this.includeRawChunks = includeRawChunks;\n this.tools = tools;\n\n // promise to ensure that the step has been fully processed by the event processor\n // before a new step is started. This is required because the continuation condition\n // needs the updated steps to determine if another step is needed.\n let stepFinish!: DelayedPromise<void>;\n\n let recordedContent: Array<ContentPart<TOOLS>> = [];\n const recordedResponseMessages: Array<ResponseMessage> = [];\n let recordedFinishReason: FinishReason | undefined = undefined;\n let recordedTotalUsage: LanguageModelUsage | undefined = undefined;\n let recordedRequest: LanguageModelRequestMetadata = {};\n let recordedWarnings: Array<CallWarning> = [];\n const recordedSteps: StepResult<TOOLS>[] = [];\n\n let rootSpan!: Span;\n\n let activeTextContent: Record<\n string,\n {\n type: 'text';\n text: string;\n providerMetadata: ProviderMetadata | undefined;\n }\n > = {};\n\n let activeReasoningContent: Record<\n string,\n {\n type: 'reasoning';\n text: string;\n providerMetadata: ProviderMetadata | undefined;\n }\n > = {};\n\n const eventProcessor = new TransformStream<\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>,\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>\n >({\n async transform(chunk, controller) {\n controller.enqueue(chunk); // forward the chunk to the next stream\n\n const { part } = chunk;\n\n if (\n part.type === 'text-delta' ||\n part.type === 'reasoning-delta' ||\n part.type === 'source' ||\n part.type === 'tool-call' ||\n part.type === 'tool-result' ||\n part.type === 'tool-input-start' ||\n part.type === 'tool-input-delta' ||\n part.type === 'raw'\n ) {\n await onChunk?.({ chunk: part });\n }\n\n if (part.type === 'error') {\n await onError({ error: wrapGatewayError(part.error) });\n }\n\n if (part.type === 'text-start') {\n activeTextContent[part.id] = {\n type: 'text',\n text: '',\n providerMetadata: part.providerMetadata,\n };\n\n recordedContent.push(activeTextContent[part.id]);\n }\n\n if (part.type === 'text-delta') {\n const activeText = activeTextContent[part.id];\n\n if (activeText == null) {\n controller.enqueue({\n part: {\n type: 'error',\n error: `text part ${part.id} not found`,\n },\n partialOutput: undefined,\n });\n return;\n }\n\n activeText.text += part.text;\n activeText.providerMetadata =\n part.providerMetadata ?? activeText.providerMetadata;\n }\n\n if (part.type === 'text-end') {\n delete activeTextContent[part.id];\n }\n\n if (part.type === 'reasoning-start') {\n activeReasoningContent[part.id] = {\n type: 'reasoning',\n text: '',\n providerMetadata: part.providerMetadata,\n };\n\n recordedContent.push(activeReasoningContent[part.id]);\n }\n\n if (part.type === 'reasoning-delta') {\n const activeReasoning = activeReasoningContent[part.id];\n\n if (activeReasoning == null) {\n controller.enqueue({\n part: {\n type: 'error',\n error: `reasoning part ${part.id} not found`,\n },\n partialOutput: undefined,\n });\n return;\n }\n\n activeReasoning.text += part.text;\n activeReasoning.providerMetadata =\n part.providerMetadata ?? activeReasoning.providerMetadata;\n }\n\n if (part.type === 'reasoning-end') {\n const activeReasoning = activeReasoningContent[part.id];\n\n if (activeReasoning == null) {\n controller.enqueue({\n part: {\n type: 'error',\n error: `reasoning part ${part.id} not found`,\n },\n partialOutput: undefined,\n });\n return;\n }\n\n activeReasoning.providerMetadata =\n part.providerMetadata ?? activeReasoning.providerMetadata;\n\n delete activeReasoningContent[part.id];\n }\n\n if (part.type === 'file') {\n recordedContent.push({ type: 'file', file: part.file });\n }\n\n if (part.type === 'source') {\n recordedContent.push(part);\n }\n\n if (part.type === 'tool-call') {\n recordedContent.push(part);\n }\n\n if (part.type === 'tool-result' && !part.preliminary) {\n recordedContent.push(part);\n }\n\n if (part.type === 'tool-error') {\n recordedContent.push(part);\n }\n\n if (part.type === 'start-step') {\n recordedRequest = part.request;\n recordedWarnings = part.warnings;\n }\n\n if (part.type === 'finish-step') {\n const stepMessages = toResponseMessages({\n content: recordedContent,\n tools,\n });\n\n // Add step information (after response messages are updated):\n const currentStepResult: StepResult<TOOLS> = new DefaultStepResult({\n content: recordedContent,\n finishReason: part.finishReason,\n usage: part.usage,\n warnings: recordedWarnings,\n request: recordedRequest,\n response: {\n ...part.response,\n messages: [...recordedResponseMessages, ...stepMessages],\n },\n providerMetadata: part.providerMetadata,\n });\n\n await onStepFinish?.(currentStepResult);\n\n recordedSteps.push(currentStepResult);\n\n recordedContent = [];\n activeReasoningContent = {};\n activeTextContent = {};\n\n recordedResponseMessages.push(...stepMessages);\n\n // resolve the promise to signal that the step has been fully processed\n // by the event processor:\n stepFinish.resolve();\n }\n\n if (part.type === 'finish') {\n recordedTotalUsage = part.totalUsage;\n recordedFinishReason = part.finishReason;\n }\n },\n\n async flush(controller) {\n try {\n if (recordedSteps.length === 0) {\n const error = new NoOutputGeneratedError({\n message: 'No output generated. Check the stream for errors.',\n });\n\n self._finishReason.reject(error);\n self._totalUsage.reject(error);\n self._steps.reject(error);\n\n return; // no steps recorded (e.g. in error scenario)\n }\n\n // derived:\n const finishReason = recordedFinishReason ?? 'unknown';\n const totalUsage = recordedTotalUsage ?? {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n };\n\n // from finish:\n self._finishReason.resolve(finishReason);\n self._totalUsage.resolve(totalUsage);\n\n // aggregate results:\n self._steps.resolve(recordedSteps);\n\n // call onFinish callback:\n const finalStep = recordedSteps[recordedSteps.length - 1];\n await onFinish?.({\n finishReason,\n totalUsage,\n usage: finalStep.usage,\n content: finalStep.content,\n text: finalStep.text,\n reasoningText: finalStep.reasoningText,\n reasoning: finalStep.reasoning,\n files: finalStep.files,\n sources: finalStep.sources,\n toolCalls: finalStep.toolCalls,\n staticToolCalls: finalStep.staticToolCalls,\n dynamicToolCalls: finalStep.dynamicToolCalls,\n toolResults: finalStep.toolResults,\n staticToolResults: finalStep.staticToolResults,\n dynamicToolResults: finalStep.dynamicToolResults,\n request: finalStep.request,\n response: finalStep.response,\n warnings: finalStep.warnings,\n providerMetadata: finalStep.providerMetadata,\n steps: recordedSteps,\n });\n\n // Add response information to the root span:\n rootSpan.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.response.finishReason': finishReason,\n 'ai.response.text': { output: () => finalStep.text },\n 'ai.response.toolCalls': {\n output: () =>\n finalStep.toolCalls?.length\n ? JSON.stringify(finalStep.toolCalls)\n : undefined,\n },\n 'ai.response.providerMetadata': JSON.stringify(\n finalStep.providerMetadata,\n ),\n\n 'ai.usage.inputTokens': totalUsage.inputTokens,\n 'ai.usage.outputTokens': totalUsage.outputTokens,\n 'ai.usage.totalTokens': totalUsage.totalTokens,\n 'ai.usage.reasoningTokens': totalUsage.reasoningTokens,\n 'ai.usage.cachedInputTokens': totalUsage.cachedInputTokens,\n },\n }),\n );\n } catch (error) {\n controller.error(error);\n } finally {\n rootSpan.end();\n }\n },\n });\n\n // initialize the stitchable stream and the transformed stream:\n const stitchableStream = createStitchableStream<TextStreamPart<TOOLS>>();\n this.addStream = stitchableStream.addStream;\n this.closeStream = stitchableStream.close;\n\n let stream = stitchableStream.stream;\n\n // filter out abort errors:\n stream = filterStreamErrors(stream, ({ error, controller }) => {\n if (isAbortError(error) && abortSignal?.aborted) {\n onAbort?.({ steps: recordedSteps });\n controller.enqueue({ type: 'abort' });\n controller.close();\n } else {\n controller.error(error);\n }\n });\n\n // add a stream that emits a start event:\n stream = stream.pipeThrough(\n new TransformStream<TextStreamPart<TOOLS>, TextStreamPart<TOOLS>>({\n start(controller) {\n controller.enqueue({ type: 'start' });\n },\n }),\n );\n\n // transform the stream before output parsing\n // to enable replacement of stream segments:\n for (const transform of transforms) {\n stream = stream.pipeThrough(\n transform({\n tools: tools as TOOLS,\n stopStream() {\n stitchableStream.terminate();\n },\n }),\n );\n }\n\n this.baseStream = stream\n .pipeThrough(createOutputTransformStream(output))\n .pipeThrough(eventProcessor);\n\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const tracer = getTracer(telemetry);\n\n const callSettings = prepareCallSettings(settings);\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries },\n });\n\n const self = this;\n\n recordSpan({\n name: 'ai.streamText',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: 'ai.streamText', telemetry }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n 'ai.prompt': {\n input: () => JSON.stringify({ system, prompt, messages }),\n },\n },\n }),\n tracer,\n endWhenDone: false,\n fn: async rootSpanArg => {\n rootSpan = rootSpanArg;\n\n async function streamStep({\n currentStep,\n responseMessages,\n usage,\n }: {\n currentStep: number;\n responseMessages: Array<ResponseMessage>;\n usage: LanguageModelUsage;\n }) {\n const includeRawChunks = self.includeRawChunks;\n\n stepFinish = new DelayedPromise<void>();\n\n const initialPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n });\n\n const stepInputMessages = [\n ...initialPrompt.messages,\n ...responseMessages,\n ];\n\n const prepareStepResult = await prepareStep?.({\n model,\n steps: recordedSteps,\n stepNumber: recordedSteps.length,\n messages: stepInputMessages,\n });\n\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: {\n system: prepareStepResult?.system ?? initialPrompt.system,\n messages: prepareStepResult?.messages ?? stepInputMessages,\n },\n supportedUrls: await model.supportedUrls,\n });\n\n const stepModel = resolveLanguageModel(\n prepareStepResult?.model ?? model,\n );\n\n const { toolChoice: stepToolChoice, tools: stepTools } =\n prepareToolsAndToolChoice({\n tools,\n toolChoice: prepareStepResult?.toolChoice ?? toolChoice,\n activeTools: prepareStepResult?.activeTools ?? activeTools,\n });\n\n const {\n result: { stream, response, request },\n doStreamSpan,\n startTimestampMs,\n } = await retry(() =>\n recordSpan({\n name: 'ai.streamText.doStream',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.streamText.doStream',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // model:\n 'ai.model.provider': stepModel.provider,\n 'ai.model.id': stepModel.modelId,\n // prompt:\n 'ai.prompt.messages': {\n input: () => stringifyForTelemetry(promptMessages),\n },\n 'ai.prompt.tools': {\n // convert the language model level tools:\n input: () => stepTools?.map(tool => JSON.stringify(tool)),\n },\n 'ai.prompt.toolChoice': {\n input: () =>\n stepToolChoice != null\n ? JSON.stringify(stepToolChoice)\n : undefined,\n },\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.system': stepModel.provider,\n 'gen_ai.request.model': stepModel.modelId,\n 'gen_ai.request.frequency_penalty':\n callSettings.frequencyPenalty,\n 'gen_ai.request.max_tokens': callSettings.maxOutputTokens,\n 'gen_ai.request.presence_penalty':\n callSettings.presencePenalty,\n 'gen_ai.request.stop_sequences': callSettings.stopSequences,\n 'gen_ai.request.temperature': callSettings.temperature,\n 'gen_ai.request.top_k': callSettings.topK,\n 'gen_ai.request.top_p': callSettings.topP,\n },\n }),\n tracer,\n endWhenDone: false,\n fn: async doStreamSpan => {\n return {\n startTimestampMs: now(), // get before the call\n doStreamSpan,\n result: await stepModel.doStream({\n ...callSettings,\n tools: stepTools,\n toolChoice: stepToolChoice,\n responseFormat: output?.responseFormat,\n prompt: promptMessages,\n providerOptions,\n abortSignal,\n headers,\n includeRawChunks,\n }),\n };\n },\n }),\n );\n\n const streamWithToolResults = runToolsTransformation({\n tools,\n generatorStream: stream,\n tracer,\n telemetry,\n system,\n messages: stepInputMessages,\n repairToolCall,\n abortSignal,\n experimental_context,\n });\n\n const stepRequest = request ?? {};\n const stepToolCalls: TypedToolCall<TOOLS>[] = [];\n const stepToolOutputs: ToolOutput<TOOLS>[] = [];\n let warnings: LanguageModelV2CallWarning[] | undefined;\n\n const activeToolCallToolNames: Record<string, string> = {};\n\n let stepFinishReason: FinishReason = 'unknown';\n let stepUsage: LanguageModelUsage = {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n };\n let stepProviderMetadata: ProviderMetadata | undefined;\n let stepFirstChunk = true;\n let stepResponse: { id: string; timestamp: Date; modelId: string } = {\n id: generateId(),\n timestamp: currentDate(),\n modelId: model.modelId,\n };\n\n // raw text as it comes from the provider. recorded for telemetry.\n let activeText = '';\n\n self.addStream(\n streamWithToolResults.pipeThrough(\n new TransformStream<\n SingleRequestTextStreamPart<TOOLS>,\n TextStreamPart<TOOLS>\n >({\n async transform(chunk, controller): Promise<void> {\n if (chunk.type === 'stream-start') {\n warnings = chunk.warnings;\n return; // stream start chunks are sent immediately and do not count as first chunk\n }\n\n if (stepFirstChunk) {\n // Telemetry for first chunk:\n const msToFirstChunk = now() - startTimestampMs;\n\n stepFirstChunk = false;\n\n doStreamSpan.addEvent('ai.stream.firstChunk', {\n 'ai.response.msToFirstChunk': msToFirstChunk,\n });\n\n doStreamSpan.setAttributes({\n 'ai.response.msToFirstChunk': msToFirstChunk,\n });\n\n // Step start:\n controller.enqueue({\n type: 'start-step',\n request: stepRequest,\n warnings: warnings ?? [],\n });\n }\n\n const chunkType = chunk.type;\n switch (chunkType) {\n case 'text-start':\n case 'text-end': {\n controller.enqueue(chunk);\n break;\n }\n\n case 'text-delta': {\n if (chunk.delta.length > 0) {\n controller.enqueue({\n type: 'text-delta',\n id: chunk.id,\n text: chunk.delta,\n providerMetadata: chunk.providerMetadata,\n });\n activeText += chunk.delta;\n }\n break;\n }\n\n case 'reasoning-start':\n case 'reasoning-end': {\n controller.enqueue(chunk);\n break;\n }\n\n case 'reasoning-delta': {\n controller.enqueue({\n type: 'reasoning-delta',\n id: chunk.id,\n text: chunk.delta,\n providerMetadata: chunk.providerMetadata,\n });\n break;\n }\n\n case 'tool-call': {\n controller.enqueue(chunk);\n // store tool calls for onFinish callback and toolCalls promise:\n stepToolCalls.push(chunk);\n break;\n }\n\n case 'tool-result': {\n controller.enqueue(chunk);\n\n if (!chunk.preliminary) {\n stepToolOutputs.push(chunk);\n }\n\n break;\n }\n\n case 'tool-error': {\n controller.enqueue(chunk);\n stepToolOutputs.push(chunk);\n break;\n }\n\n case 'response-metadata': {\n stepResponse = {\n id: chunk.id ?? stepResponse.id,\n timestamp: chunk.timestamp ?? stepResponse.timestamp,\n modelId: chunk.modelId ?? stepResponse.modelId,\n };\n break;\n }\n\n case 'finish': {\n // Note: tool executions might not be finished yet when the finish event is emitted.\n // store usage and finish reason for promises and onFinish callback:\n stepUsage = chunk.usage;\n stepFinishReason = chunk.finishReason;\n stepProviderMetadata = chunk.providerMetadata;\n\n // Telemetry for finish event timing\n // (since tool executions can take longer and distort calculations)\n const msToFinish = now() - startTimestampMs;\n doStreamSpan.addEvent('ai.stream.finish');\n doStreamSpan.setAttributes({\n 'ai.response.msToFinish': msToFinish,\n 'ai.response.avgOutputTokensPerSecond':\n (1000 * (stepUsage.outputTokens ?? 0)) / msToFinish,\n });\n\n break;\n }\n\n case 'file': {\n controller.enqueue(chunk);\n break;\n }\n\n case 'source': {\n controller.enqueue(chunk);\n break;\n }\n\n case 'tool-input-start': {\n activeToolCallToolNames[chunk.id] = chunk.toolName;\n\n const tool = tools?.[chunk.toolName];\n if (tool?.onInputStart != null) {\n await tool.onInputStart({\n toolCallId: chunk.id,\n messages: stepInputMessages,\n abortSignal,\n experimental_context,\n });\n }\n\n controller.enqueue({\n ...chunk,\n dynamic: tool?.type === 'dynamic',\n });\n break;\n }\n\n case 'tool-input-end': {\n delete activeToolCallToolNames[chunk.id];\n controller.enqueue(chunk);\n break;\n }\n\n case 'tool-input-delta': {\n const toolName = activeToolCallToolNames[chunk.id];\n const tool = tools?.[toolName];\n\n if (tool?.onInputDelta != null) {\n await tool.onInputDelta({\n inputTextDelta: chunk.delta,\n toolCallId: chunk.id,\n messages: stepInputMessages,\n abortSignal,\n experimental_context,\n });\n }\n\n controller.enqueue(chunk);\n break;\n }\n\n case 'error': {\n controller.enqueue(chunk);\n stepFinishReason = 'error';\n break;\n }\n\n case 'raw': {\n if (includeRawChunks) {\n controller.enqueue(chunk);\n }\n break;\n }\n\n default: {\n const exhaustiveCheck: never = chunkType;\n throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);\n }\n }\n },\n\n // invoke onFinish callback and resolve toolResults promise when the stream is about to close:\n async flush(controller) {\n const stepToolCallsJson =\n stepToolCalls.length > 0\n ? JSON.stringify(stepToolCalls)\n : undefined;\n\n // record telemetry information first to ensure best effort timing\n try {\n doStreamSpan.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.response.finishReason': stepFinishReason,\n 'ai.response.text': {\n output: () => activeText,\n },\n 'ai.response.toolCalls': {\n output: () => stepToolCallsJson,\n },\n 'ai.response.id': stepResponse.id,\n 'ai.response.model': stepResponse.modelId,\n 'ai.response.timestamp':\n stepResponse.timestamp.toISOString(),\n 'ai.response.providerMetadata':\n JSON.stringify(stepProviderMetadata),\n\n 'ai.usage.inputTokens': stepUsage.inputTokens,\n 'ai.usage.outputTokens': stepUsage.outputTokens,\n 'ai.usage.totalTokens': stepUsage.totalTokens,\n 'ai.usage.reasoningTokens': stepUsage.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n stepUsage.cachedInputTokens,\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.response.finish_reasons': [stepFinishReason],\n 'gen_ai.response.id': stepResponse.id,\n 'gen_ai.response.model': stepResponse.modelId,\n 'gen_ai.usage.input_tokens': stepUsage.inputTokens,\n 'gen_ai.usage.output_tokens': stepUsage.outputTokens,\n },\n }),\n );\n } catch (error) {\n // ignore error setting telemetry attributes\n } finally {\n // finish doStreamSpan before other operations for correct timing:\n doStreamSpan.end();\n }\n\n controller.enqueue({\n type: 'finish-step',\n finishReason: stepFinishReason,\n usage: stepUsage,\n providerMetadata: stepProviderMetadata,\n response: {\n ...stepResponse,\n headers: response?.headers,\n },\n });\n\n const combinedUsage = addLanguageModelUsage(usage, stepUsage);\n\n // wait for the step to be fully processed by the event processor\n // to ensure that the recorded steps are complete:\n await stepFinish.promise;\n\n const clientToolCalls = stepToolCalls.filter(\n toolCall => toolCall.providerExecuted !== true,\n );\n const clientToolOutputs = stepToolOutputs.filter(\n toolOutput => toolOutput.providerExecuted !== true,\n );\n\n if (\n clientToolCalls.length > 0 &&\n // all current tool calls have outputs (incl. execution errors):\n clientToolOutputs.length === clientToolCalls.length &&\n // continue until a stop condition is met:\n !(await isStopConditionMet({\n stopConditions,\n steps: recordedSteps,\n }))\n ) {\n // append to messages for the next step:\n responseMessages.push(\n ...toResponseMessages({\n content:\n // use transformed content to create the messages for the next step:\n recordedSteps[recordedSteps.length - 1].content,\n tools,\n }),\n );\n\n try {\n await streamStep({\n currentStep: currentStep + 1,\n responseMessages,\n usage: combinedUsage,\n });\n } catch (error) {\n controller.enqueue({\n type: 'error',\n error,\n });\n\n self.closeStream();\n }\n } else {\n controller.enqueue({\n type: 'finish',\n finishReason: stepFinishReason,\n totalUsage: combinedUsage,\n });\n\n self.closeStream(); // close the stitchable stream\n }\n },\n }),\n ),\n );\n }\n\n // add the initial stream to the stitchable stream\n await streamStep({\n currentStep: 0,\n responseMessages: [],\n usage: {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n },\n });\n },\n }).catch(error => {\n // add an error stream part and close the streams:\n self.addStream(\n new ReadableStream({\n start(controller) {\n controller.enqueue({ type: 'error', error });\n controller.close();\n },\n }),\n );\n self.closeStream();\n });\n }\n\n get steps() {\n // when any of the promises are accessed, the stream is consumed\n // so it resolves without needing to consume the stream separately\n this.consumeStream();\n\n return this._steps.promise;\n }\n\n private get finalStep() {\n return this.steps.then(steps => steps[steps.length - 1]);\n }\n\n get content() {\n return this.finalStep.then(step => step.content);\n }\n\n get warnings() {\n return this.finalStep.then(step => step.warnings);\n }\n\n get providerMetadata() {\n return this.finalStep.then(step => step.providerMetadata);\n }\n\n get text() {\n return this.finalStep.then(step => step.text);\n }\n\n get reasoningText() {\n return this.finalStep.then(step => step.reasoningText);\n }\n\n get reasoning() {\n return this.finalStep.then(step => step.reasoning);\n }\n\n get sources() {\n return this.finalStep.then(step => step.sources);\n }\n\n get files() {\n return this.finalStep.then(step => step.files);\n }\n\n get toolCalls() {\n return this.finalStep.then(step => step.toolCalls);\n }\n\n get staticToolCalls() {\n return this.finalStep.then(step => step.staticToolCalls);\n }\n\n get dynamicToolCalls() {\n return this.finalStep.then(step => step.dynamicToolCalls);\n }\n\n get toolResults() {\n return this.finalStep.then(step => step.toolResults);\n }\n\n get staticToolResults() {\n return this.finalStep.then(step => step.staticToolResults);\n }\n\n get dynamicToolResults() {\n return this.finalStep.then(step => step.dynamicToolResults);\n }\n\n get usage() {\n return this.finalStep.then(step => step.usage);\n }\n\n get request() {\n return this.finalStep.then(step => step.request);\n }\n\n get response() {\n return this.finalStep.then(step => step.response);\n }\n\n get totalUsage() {\n // when any of the promises are accessed, the stream is consumed\n // so it resolves without needing to consume the stream separately\n this.consumeStream();\n\n return this._totalUsage.promise;\n }\n\n get finishReason() {\n // when any of the promises are accessed, the stream is consumed\n // so it resolves without needing to consume the stream separately\n this.consumeStream();\n\n return this._finishReason.promise;\n }\n\n /**\nSplit out a new stream from the original stream.\nThe original stream is replaced to allow for further splitting,\nsince we do not know how many times the stream will be split.\n\nNote: this leads to buffering the stream content on the server.\nHowever, the LLM results are expected to be small enough to not cause issues.\n */\n private teeStream() {\n const [stream1, stream2] = this.baseStream.tee();\n this.baseStream = stream2;\n return stream1;\n }\n\n get textStream(): AsyncIterableStream<string> {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream<EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>, string>({\n transform({ part }, controller) {\n if (part.type === 'text-delta') {\n controller.enqueue(part.text);\n }\n },\n }),\n ),\n );\n }\n\n get fullStream(): AsyncIterableStream<TextStreamPart<TOOLS>> {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream<\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>,\n TextStreamPart<TOOLS>\n >({\n transform({ part }, controller) {\n controller.enqueue(part);\n },\n }),\n ),\n );\n }\n\n async consumeStream(options?: ConsumeStreamOptions): Promise<void> {\n try {\n await consumeStream({\n stream: this.fullStream,\n onError: options?.onError,\n });\n } catch (error) {\n options?.onError?.(error);\n }\n }\n\n get experimental_partialOutputStream(): AsyncIterableStream<PARTIAL_OUTPUT> {\n if (this.output == null) {\n throw new NoOutputSpecifiedError();\n }\n\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream<\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>,\n PARTIAL_OUTPUT\n >({\n transform({ partialOutput }, controller) {\n if (partialOutput != null) {\n controller.enqueue(partialOutput);\n }\n },\n }),\n ),\n );\n }\n\n toUIMessageStream<UI_MESSAGE extends UIMessage>({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning = true,\n sendSources = false,\n sendStart = true,\n sendFinish = true,\n onError = getErrorMessage,\n }: UIMessageStreamOptions<UI_MESSAGE> = {}): AsyncIterableStream<\n InferUIMessageChunk<UI_MESSAGE>\n > {\n const responseMessageId =\n generateMessageId != null\n ? getResponseUIMessageId({\n originalMessages,\n responseMessageId: generateMessageId,\n })\n : undefined;\n\n const toolNamesByCallId: Record<string, string> = {};\n\n const isDynamic = (toolCallId: string) => {\n const toolName = toolNamesByCallId[toolCallId];\n const dynamic = this.tools?.[toolName]?.type === 'dynamic';\n return dynamic ? true : undefined; // only send when dynamic to reduce data transfer\n };\n\n const baseStream = this.fullStream.pipeThrough(\n new TransformStream<\n TextStreamPart<TOOLS>,\n UIMessageChunk<\n InferUIMessageMetadata<UI_MESSAGE>,\n InferUIMessageData<UI_MESSAGE>\n >\n >({\n transform: async (part, controller) => {\n const messageMetadataValue = messageMetadata?.({ part });\n\n const partType = part.type;\n switch (partType) {\n case 'text-start': {\n controller.enqueue({\n type: 'text-start',\n id: part.id,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n break;\n }\n\n case 'text-delta': {\n controller.enqueue({\n type: 'text-delta',\n id: part.id,\n delta: part.text,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n break;\n }\n\n case 'text-end': {\n controller.enqueue({\n type: 'text-end',\n id: part.id,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n break;\n }\n\n case 'reasoning-start': {\n controller.enqueue({\n type: 'reasoning-start',\n id: part.id,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n break;\n }\n\n case 'reasoning-delta': {\n if (sendReasoning) {\n controller.enqueue({\n type: 'reasoning-delta',\n id: part.id,\n delta: part.text,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n }\n break;\n }\n\n case 'reasoning-end': {\n controller.enqueue({\n type: 'reasoning-end',\n id: part.id,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n break;\n }\n\n case 'file': {\n controller.enqueue({\n type: 'file',\n mediaType: part.file.mediaType,\n url: `data:${part.file.mediaType};base64,${part.file.base64}`,\n });\n break;\n }\n\n case 'source': {\n if (sendSources && part.sourceType === 'url') {\n controller.enqueue({\n type: 'source-url',\n sourceId: part.id,\n url: part.url,\n title: part.title,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n }\n\n if (sendSources && part.sourceType === 'document') {\n controller.enqueue({\n type: 'source-document',\n sourceId: part.id,\n mediaType: part.mediaType,\n title: part.title,\n filename: part.filename,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n }\n break;\n }\n\n case 'tool-input-start': {\n toolNamesByCallId[part.id] = part.toolName;\n const dynamic = isDynamic(part.id);\n\n controller.enqueue({\n type: 'tool-input-start',\n toolCallId: part.id,\n toolName: part.toolName,\n ...(part.providerExecuted != null\n ? { providerExecuted: part.providerExecuted }\n : {}),\n ...(dynamic != null ? { dynamic } : {}),\n });\n break;\n }\n\n case 'tool-input-delta': {\n controller.enqueue({\n type: 'tool-input-delta',\n toolCallId: part.id,\n inputTextDelta: part.delta,\n });\n break;\n }\n\n case 'tool-call': {\n toolNamesByCallId[part.toolCallId] = part.toolName;\n const dynamic = isDynamic(part.toolCallId);\n\n if (part.invalid) {\n controller.enqueue({\n type: 'tool-input-error',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...(part.providerExecuted != null\n ? { providerExecuted: part.providerExecuted }\n : {}),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n ...(dynamic != null ? { dynamic } : {}),\n errorText: onError(part.error),\n });\n } else {\n controller.enqueue({\n type: 'tool-input-available',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...(part.providerExecuted != null\n ? { providerExecuted: part.providerExecuted }\n : {}),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n ...(dynamic != null ? { dynamic } : {}),\n });\n }\n\n break;\n }\n\n case 'tool-result': {\n const dynamic = isDynamic(part.toolCallId);\n\n controller.enqueue({\n type: 'tool-output-available',\n toolCallId: part.toolCallId,\n output: part.output,\n ...(part.providerExecuted != null\n ? { providerExecuted: part.providerExecuted }\n : {}),\n ...(part.preliminary != null\n ? { preliminary: part.preliminary }\n : {}),\n ...(dynamic != null ? { dynamic } : {}),\n });\n break;\n }\n\n case 'tool-error': {\n const dynamic = isDynamic(part.toolCallId);\n\n controller.enqueue({\n type: 'tool-output-error',\n toolCallId: part.toolCallId,\n errorText: onError(part.error),\n ...(part.providerExecuted != null\n ? { providerExecuted: part.providerExecuted }\n : {}),\n ...(dynamic != null ? { dynamic } : {}),\n });\n break;\n }\n\n case 'error': {\n controller.enqueue({\n type: 'error',\n errorText: onError(part.error),\n });\n break;\n }\n\n case 'start-step': {\n controller.enqueue({ type: 'start-step' });\n break;\n }\n\n case 'finish-step': {\n controller.enqueue({ type: 'finish-step' });\n break;\n }\n\n case 'start': {\n if (sendStart) {\n controller.enqueue({\n type: 'start',\n ...(messageMetadataValue != null\n ? { messageMetadata: messageMetadataValue }\n : {}),\n ...(responseMessageId != null\n ? { messageId: responseMessageId }\n : {}),\n });\n }\n break;\n }\n\n case 'finish': {\n if (sendFinish) {\n controller.enqueue({\n type: 'finish',\n ...(messageMetadataValue != null\n ? { messageMetadata: messageMetadataValue }\n : {}),\n });\n }\n break;\n }\n\n case 'abort': {\n controller.enqueue(part);\n break;\n }\n\n case 'tool-input-end': {\n break;\n }\n\n case 'raw': {\n // Raw chunks are not included in UI message streams\n // as they contain provider-specific data for developer use\n break;\n }\n\n default: {\n const exhaustiveCheck: never = partType;\n throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);\n }\n }\n\n // start and finish events already have metadata\n // so we only need to send metadata for other parts\n if (\n messageMetadataValue != null &&\n partType !== 'start' &&\n partType !== 'finish'\n ) {\n controller.enqueue({\n type: 'message-metadata',\n messageMetadata: messageMetadataValue,\n });\n }\n },\n }),\n );\n\n return createAsyncIterableStream(\n handleUIMessageStreamFinish<UI_MESSAGE>({\n stream: baseStream,\n messageId: responseMessageId ?? generateMessageId?.(),\n originalMessages,\n onFinish,\n onError,\n }),\n );\n }\n\n pipeUIMessageStreamToResponse<UI_MESSAGE extends UIMessage>(\n response: ServerResponse,\n {\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n ...init\n }: UIMessageStreamResponseInit & UIMessageStreamOptions<UI_MESSAGE> = {},\n ) {\n pipeUIMessageStreamToResponse({\n response,\n stream: this.toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n }),\n ...init,\n });\n }\n\n pipeTextStreamToResponse(response: ServerResponse, init?: ResponseInit) {\n pipeTextStreamToResponse({\n response,\n textStream: this.textStream,\n ...init,\n });\n }\n\n toUIMessageStreamResponse<UI_MESSAGE extends UIMessage>({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n ...init\n }: UIMessageStreamResponseInit &\n UIMessageStreamOptions<UI_MESSAGE> = {}): Response {\n return createUIMessageStreamResponse({\n stream: this.toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n }),\n ...init,\n });\n }\n\n toTextStreamResponse(init?: ResponseInit): Response {\n return createTextStreamResponse({\n textStream: this.textStream,\n ...init,\n });\n }\n}\n","export function prepareHeaders(\n headers: HeadersInit | undefined,\n defaultHeaders: Record<string, string>,\n): Headers {\n const responseHeaders = new Headers(headers ?? {});\n\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (!responseHeaders.has(key)) {\n responseHeaders.set(key, value);\n }\n }\n\n return responseHeaders;\n}\n","import { prepareHeaders } from '../util/prepare-headers';\n\nexport function createTextStreamResponse({\n status,\n statusText,\n headers,\n textStream,\n}: ResponseInit & {\n textStream: ReadableStream<string>;\n}): Response {\n return new Response(textStream.pipeThrough(new TextEncoderStream()), {\n status: status ?? 200,\n statusText,\n headers: prepareHeaders(headers, {\n 'content-type': 'text/plain; charset=utf-8',\n }),\n });\n}\n","import { ServerResponse } from 'node:http';\n\n/**\n * Writes the content of a stream to a server response.\n */\nexport function writeToServerResponse({\n response,\n status,\n statusText,\n headers,\n stream,\n}: {\n response: ServerResponse;\n status?: number;\n statusText?: string;\n headers?: Record<string, string | number | string[]>;\n stream: ReadableStream<Uint8Array>;\n}): void {\n response.writeHead(status ?? 200, statusText, headers);\n\n const reader = stream.getReader();\n const read = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n response.write(value);\n }\n } catch (error) {\n throw error;\n } finally {\n response.end();\n }\n };\n\n read();\n}\n","import { ServerResponse } from 'node:http';\nimport { prepareHeaders } from '../util/prepare-headers';\nimport { writeToServerResponse } from '../util/write-to-server-response';\n\nexport function pipeTextStreamToResponse({\n response,\n status,\n statusText,\n headers,\n textStream,\n}: {\n response: ServerResponse;\n textStream: ReadableStream<string>;\n} & ResponseInit): void {\n writeToServerResponse({\n response,\n status,\n statusText,\n headers: Object.fromEntries(\n prepareHeaders(headers, {\n 'content-type': 'text/plain; charset=utf-8',\n }).entries(),\n ),\n stream: textStream.pipeThrough(new TextEncoderStream()),\n });\n}\n","export class JsonToSseTransformStream extends TransformStream<unknown, string> {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\\n\\n`);\n },\n flush(controller) {\n controller.enqueue('data: [DONE]\\n\\n');\n },\n });\n }\n}\n","export const UI_MESSAGE_STREAM_HEADERS = {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n connection: 'keep-alive',\n 'x-vercel-ai-ui-message-stream': 'v1',\n 'x-accel-buffering': 'no', // disable nginx buffering\n};\n","import { prepareHeaders } from '../util/prepare-headers';\nimport { JsonToSseTransformStream } from './json-to-sse-transform-stream';\nimport { UI_MESSAGE_STREAM_HEADERS } from './ui-message-stream-headers';\nimport { UIMessageChunk } from './ui-message-chunks';\nimport { UIMessageStreamResponseInit } from './ui-message-stream-response-init';\n\nexport function createUIMessageStreamResponse({\n status,\n statusText,\n headers,\n stream,\n consumeSseStream,\n}: UIMessageStreamResponseInit & {\n stream: ReadableStream<UIMessageChunk>;\n}): Response {\n let sseStream = stream.pipeThrough(new JsonToSseTransformStream());\n\n // when the consumeSseStream is provided, we need to tee the stream\n // and send the second part to the consumeSseStream function\n // so that it can be consumed by the client independently\n if (consumeSseStream) {\n const [stream1, stream2] = sseStream.tee();\n sseStream = stream1;\n consumeSseStream({ stream: stream2 }); // no await (do not block the response)\n }\n\n return new Response(sseStream.pipeThrough(new TextEncoderStream()), {\n status,\n statusText,\n headers: prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS),\n });\n}\n","import { IdGenerator } from '@ai-sdk/provider-utils';\nimport { UIMessage } from '../ui/ui-messages';\n\nexport function getResponseUIMessageId({\n originalMessages,\n responseMessageId,\n}: {\n originalMessages: UIMessage[] | undefined;\n responseMessageId: string | IdGenerator;\n}) {\n // when there are no original messages (i.e. no persistence),\n // the assistant message id generation is handled on the client side.\n if (originalMessages == null) {\n return undefined;\n }\n\n const lastMessage = originalMessages[originalMessages.length - 1];\n\n return lastMessage?.role === 'assistant'\n ? lastMessage.id\n : typeof responseMessageId === 'function'\n ? responseMessageId()\n : responseMessageId;\n}\n","import {\n StandardSchemaV1,\n validateTypes,\n Validator,\n} from '@ai-sdk/provider-utils';\nimport { ProviderMetadata } from '../types';\nimport {\n DataUIMessageChunk,\n InferUIMessageChunk,\n isDataUIMessageChunk,\n UIMessageChunk,\n} from '../ui-message-stream/ui-message-chunks';\nimport { ErrorHandler } from '../util/error-handler';\nimport { mergeObjects } from '../util/merge-objects';\nimport { parsePartialJson } from '../util/parse-partial-json';\nimport { UIDataTypesToSchemas } from './chat';\nimport {\n DataUIPart,\n DynamicToolUIPart,\n getToolName,\n InferUIMessageData,\n InferUIMessageMetadata,\n InferUIMessageToolCall,\n InferUIMessageTools,\n isToolUIPart,\n ReasoningUIPart,\n TextUIPart,\n ToolUIPart,\n UIMessage,\n UIMessagePart,\n} from './ui-messages';\n\nexport type StreamingUIMessageState<UI_MESSAGE extends UIMessage> = {\n message: UI_MESSAGE;\n activeTextParts: Record<string, TextUIPart>;\n activeReasoningParts: Record<string, ReasoningUIPart>;\n partialToolCalls: Record<\n string,\n { text: string; index: number; toolName: string; dynamic?: boolean }\n >;\n};\n\nexport function createStreamingUIMessageState<UI_MESSAGE extends UIMessage>({\n lastMessage,\n messageId,\n}: {\n lastMessage: UI_MESSAGE | undefined;\n messageId: string;\n}): StreamingUIMessageState<UI_MESSAGE> {\n return {\n message:\n lastMessage?.role === 'assistant'\n ? lastMessage\n : ({\n id: messageId,\n metadata: undefined,\n role: 'assistant',\n parts: [] as UIMessagePart<\n InferUIMessageData<UI_MESSAGE>,\n InferUIMessageTools<UI_MESSAGE>\n >[],\n } as UI_MESSAGE),\n activeTextParts: {},\n activeReasoningParts: {},\n partialToolCalls: {},\n };\n}\n\nexport function processUIMessageStream<UI_MESSAGE extends UIMessage>({\n stream,\n messageMetadataSchema,\n dataPartSchemas,\n runUpdateMessageJob,\n onError,\n onToolCall,\n onData,\n}: {\n // input stream is not fully typed yet:\n stream: ReadableStream<UIMessageChunk>;\n messageMetadataSchema?:\n | Validator<InferUIMessageMetadata<UI_MESSAGE>>\n | StandardSchemaV1<InferUIMessageMetadata<UI_MESSAGE>>;\n dataPartSchemas?: UIDataTypesToSchemas<InferUIMessageData<UI_MESSAGE>>;\n onToolCall?: (options: {\n toolCall: InferUIMessageToolCall<UI_MESSAGE>;\n }) => void | PromiseLike<void>;\n onData?: (dataPart: DataUIPart<InferUIMessageData<UI_MESSAGE>>) => void;\n runUpdateMessageJob: (\n job: (options: {\n state: StreamingUIMessageState<UI_MESSAGE>;\n write: () => void;\n }) => Promise<void>,\n ) => Promise<void>;\n onError: ErrorHandler;\n}): ReadableStream<InferUIMessageChunk<UI_MESSAGE>> {\n return stream.pipeThrough(\n new TransformStream<UIMessageChunk, InferUIMessageChunk<UI_MESSAGE>>({\n async transform(chunk, controller) {\n await runUpdateMessageJob(async ({ state, write }) => {\n function getToolInvocation(toolCallId: string) {\n const toolInvocations = state.message.parts.filter(isToolUIPart);\n\n const toolInvocation = toolInvocations.find(\n invocation => invocation.toolCallId === toolCallId,\n );\n\n if (toolInvocation == null) {\n throw new Error(\n 'tool-output-error must be preceded by a tool-input-available',\n );\n }\n\n return toolInvocation;\n }\n\n function getDynamicToolInvocation(toolCallId: string) {\n const toolInvocations = state.message.parts.filter(\n part => part.type === 'dynamic-tool',\n ) as DynamicToolUIPart[];\n\n const toolInvocation = toolInvocations.find(\n invocation => invocation.toolCallId === toolCallId,\n );\n\n if (toolInvocation == null) {\n throw new Error(\n 'tool-output-error must be preceded by a tool-input-available',\n );\n }\n\n return toolInvocation;\n }\n\n function updateToolPart(\n options: {\n toolName: keyof InferUIMessageTools<UI_MESSAGE> & string;\n toolCallId: string;\n providerExecuted?: boolean;\n } & (\n | {\n state: 'input-streaming';\n input: unknown;\n providerExecuted?: boolean;\n }\n | {\n state: 'input-available';\n input: unknown;\n providerExecuted?: boolean;\n providerMetadata?: ProviderMetadata;\n }\n | {\n state: 'output-available';\n input: unknown;\n output: unknown;\n providerExecuted?: boolean;\n preliminary?: boolean;\n }\n | {\n state: 'output-error';\n input: unknown;\n rawInput?: unknown;\n errorText: string;\n providerExecuted?: boolean;\n providerMetadata?: ProviderMetadata;\n }\n ),\n ) {\n const part = state.message.parts.find(\n part =>\n isToolUIPart(part) && part.toolCallId === options.toolCallId,\n ) as ToolUIPart<InferUIMessageTools<UI_MESSAGE>> | undefined;\n\n const anyOptions = options as any;\n const anyPart = part as any;\n\n if (part != null) {\n part.state = options.state;\n anyPart.input = anyOptions.input;\n anyPart.output = anyOptions.output;\n anyPart.errorText = anyOptions.errorText;\n anyPart.rawInput = anyOptions.rawInput;\n anyPart.preliminary = anyOptions.preliminary;\n\n // once providerExecuted is set, it stays for streaming\n anyPart.providerExecuted =\n anyOptions.providerExecuted ?? part.providerExecuted;\n\n if (\n anyOptions.providerMetadata != null &&\n part.state === 'input-available'\n ) {\n part.callProviderMetadata = anyOptions.providerMetadata;\n }\n } else {\n state.message.parts.push({\n type: `tool-${options.toolName}`,\n toolCallId: options.toolCallId,\n state: options.state,\n input: anyOptions.input,\n output: anyOptions.output,\n rawInput: anyOptions.rawInput,\n errorText: anyOptions.errorText,\n providerExecuted: anyOptions.providerExecuted,\n preliminary: anyOptions.preliminary,\n ...(anyOptions.providerMetadata != null\n ? { callProviderMetadata: anyOptions.providerMetadata }\n : {}),\n } as ToolUIPart<InferUIMessageTools<UI_MESSAGE>>);\n }\n }\n\n function updateDynamicToolPart(\n options: {\n toolName: keyof InferUIMessageTools<UI_MESSAGE> & string;\n toolCallId: string;\n providerExecuted?: boolean;\n } & (\n | {\n state: 'input-streaming';\n input: unknown;\n }\n | {\n state: 'input-available';\n input: unknown;\n providerMetadata?: ProviderMetadata;\n }\n | {\n state: 'output-available';\n input: unknown;\n output: unknown;\n preliminary: boolean | undefined;\n }\n | {\n state: 'output-error';\n input: unknown;\n errorText: string;\n providerMetadata?: ProviderMetadata;\n }\n ),\n ) {\n const part = state.message.parts.find(\n part =>\n part.type === 'dynamic-tool' &&\n part.toolCallId === options.toolCallId,\n ) as DynamicToolUIPart | undefined;\n\n const anyOptions = options as any;\n const anyPart = part as any;\n\n if (part != null) {\n part.state = options.state;\n anyPart.toolName = options.toolName;\n anyPart.input = anyOptions.input;\n anyPart.output = anyOptions.output;\n anyPart.errorText = anyOptions.errorText;\n anyPart.rawInput = anyOptions.rawInput ?? anyPart.rawInput;\n anyPart.preliminary = anyOptions.preliminary;\n\n if (\n anyOptions.providerMetadata != null &&\n part.state === 'input-available'\n ) {\n part.callProviderMetadata = anyOptions.providerMetadata;\n }\n } else {\n state.message.parts.push({\n type: 'dynamic-tool',\n toolName: options.toolName,\n toolCallId: options.toolCallId,\n state: options.state,\n input: anyOptions.input,\n output: anyOptions.output,\n errorText: anyOptions.errorText,\n preliminary: anyOptions.preliminary,\n ...(anyOptions.providerMetadata != null\n ? { callProviderMetadata: anyOptions.providerMetadata }\n : {}),\n } as DynamicToolUIPart);\n }\n }\n\n async function updateMessageMetadata(metadata: unknown) {\n if (metadata != null) {\n const mergedMetadata =\n state.message.metadata != null\n ? mergeObjects(state.message.metadata, metadata)\n : metadata;\n\n if (messageMetadataSchema != null) {\n await validateTypes({\n value: mergedMetadata,\n schema: messageMetadataSchema,\n });\n }\n\n state.message.metadata =\n mergedMetadata as InferUIMessageMetadata<UI_MESSAGE>;\n }\n }\n\n switch (chunk.type) {\n case 'text-start': {\n const textPart: TextUIPart = {\n type: 'text',\n text: '',\n providerMetadata: chunk.providerMetadata,\n state: 'streaming',\n };\n state.activeTextParts[chunk.id] = textPart;\n state.message.parts.push(textPart);\n write();\n break;\n }\n\n case 'text-delta': {\n const textPart = state.activeTextParts[chunk.id];\n textPart.text += chunk.delta;\n textPart.providerMetadata =\n chunk.providerMetadata ?? textPart.providerMetadata;\n write();\n break;\n }\n\n case 'text-end': {\n const textPart = state.activeTextParts[chunk.id];\n textPart.state = 'done';\n textPart.providerMetadata =\n chunk.providerMetadata ?? textPart.providerMetadata;\n delete state.activeTextParts[chunk.id];\n write();\n break;\n }\n\n case 'reasoning-start': {\n const reasoningPart: ReasoningUIPart = {\n type: 'reasoning',\n text: '',\n providerMetadata: chunk.providerMetadata,\n state: 'streaming',\n };\n state.activeReasoningParts[chunk.id] = reasoningPart;\n state.message.parts.push(reasoningPart);\n write();\n break;\n }\n\n case 'reasoning-delta': {\n const reasoningPart = state.activeReasoningParts[chunk.id];\n reasoningPart.text += chunk.delta;\n reasoningPart.providerMetadata =\n chunk.providerMetadata ?? reasoningPart.providerMetadata;\n write();\n break;\n }\n\n case 'reasoning-end': {\n const reasoningPart = state.activeReasoningParts[chunk.id];\n reasoningPart.providerMetadata =\n chunk.providerMetadata ?? reasoningPart.providerMetadata;\n reasoningPart.state = 'done';\n delete state.activeReasoningParts[chunk.id];\n\n write();\n break;\n }\n\n case 'file': {\n state.message.parts.push({\n type: 'file',\n mediaType: chunk.mediaType,\n url: chunk.url,\n });\n\n write();\n break;\n }\n\n case 'source-url': {\n state.message.parts.push({\n type: 'source-url',\n sourceId: chunk.sourceId,\n url: chunk.url,\n title: chunk.title,\n providerMetadata: chunk.providerMetadata,\n });\n\n write();\n break;\n }\n\n case 'source-document': {\n state.message.parts.push({\n type: 'source-document',\n sourceId: chunk.sourceId,\n mediaType: chunk.mediaType,\n title: chunk.title,\n filename: chunk.filename,\n providerMetadata: chunk.providerMetadata,\n });\n\n write();\n break;\n }\n\n case 'tool-input-start': {\n const toolInvocations = state.message.parts.filter(isToolUIPart);\n\n // add the partial tool call to the map\n state.partialToolCalls[chunk.toolCallId] = {\n text: '',\n toolName: chunk.toolName,\n index: toolInvocations.length,\n dynamic: chunk.dynamic,\n };\n\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: 'input-streaming',\n input: undefined,\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: 'input-streaming',\n input: undefined,\n providerExecuted: chunk.providerExecuted,\n });\n }\n\n write();\n break;\n }\n\n case 'tool-input-delta': {\n const partialToolCall = state.partialToolCalls[chunk.toolCallId];\n\n partialToolCall.text += chunk.inputTextDelta;\n\n const { value: partialArgs } = await parsePartialJson(\n partialToolCall.text,\n );\n\n if (partialToolCall.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: partialToolCall.toolName,\n state: 'input-streaming',\n input: partialArgs,\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: partialToolCall.toolName,\n state: 'input-streaming',\n input: partialArgs,\n });\n }\n\n write();\n break;\n }\n\n case 'tool-input-available': {\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: 'input-available',\n input: chunk.input,\n providerMetadata: chunk.providerMetadata,\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: 'input-available',\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n });\n }\n\n write();\n\n // invoke the onToolCall callback if it exists. This is blocking.\n // In the future we should make this non-blocking, which\n // requires additional state management for error handling etc.\n // Skip calling onToolCall for provider-executed tools since they are already executed\n if (onToolCall && !chunk.providerExecuted) {\n await onToolCall({\n toolCall: chunk as InferUIMessageToolCall<UI_MESSAGE>,\n });\n }\n break;\n }\n\n case 'tool-input-error': {\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: 'output-error',\n input: chunk.input,\n errorText: chunk.errorText,\n providerMetadata: chunk.providerMetadata,\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: 'output-error',\n input: undefined,\n rawInput: chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n });\n }\n\n write();\n break;\n }\n\n case 'tool-output-available': {\n if (chunk.dynamic) {\n const toolInvocation = getDynamicToolInvocation(\n chunk.toolCallId,\n );\n\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: toolInvocation.toolName,\n state: 'output-available',\n input: (toolInvocation as any).input,\n output: chunk.output,\n preliminary: chunk.preliminary,\n });\n } else {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: getToolName(toolInvocation),\n state: 'output-available',\n input: (toolInvocation as any).input,\n output: chunk.output,\n providerExecuted: chunk.providerExecuted,\n preliminary: chunk.preliminary,\n });\n }\n\n write();\n break;\n }\n\n case 'tool-output-error': {\n if (chunk.dynamic) {\n const toolInvocation = getDynamicToolInvocation(\n chunk.toolCallId,\n );\n\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: toolInvocation.toolName,\n state: 'output-error',\n input: (toolInvocation as any).input,\n errorText: chunk.errorText,\n });\n } else {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: getToolName(toolInvocation),\n state: 'output-error',\n input: (toolInvocation as any).input,\n rawInput: (toolInvocation as any).rawInput,\n errorText: chunk.errorText,\n });\n }\n\n write();\n break;\n }\n\n case 'start-step': {\n // add a step boundary part to the message\n state.message.parts.push({ type: 'step-start' });\n break;\n }\n\n case 'finish-step': {\n // reset the current text and reasoning parts\n state.activeTextParts = {};\n state.activeReasoningParts = {};\n break;\n }\n\n case 'start': {\n if (chunk.messageId != null) {\n state.message.id = chunk.messageId;\n }\n\n await updateMessageMetadata(chunk.messageMetadata);\n\n if (chunk.messageId != null || chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n\n case 'finish': {\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n\n case 'message-metadata': {\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n\n case 'error': {\n onError?.(new Error(chunk.errorText));\n break;\n }\n\n default: {\n if (isDataUIMessageChunk(chunk)) {\n // validate data chunk if dataPartSchemas is provided\n if (dataPartSchemas?.[chunk.type] != null) {\n await validateTypes({\n value: chunk.data,\n schema: dataPartSchemas[chunk.type],\n });\n }\n\n // cast, validation is done above\n const dataChunk = chunk as DataUIMessageChunk<\n InferUIMessageData<UI_MESSAGE>\n >;\n\n // transient parts are not added to the message state\n if (dataChunk.transient) {\n onData?.(dataChunk);\n break;\n }\n\n const existingUIPart =\n dataChunk.id != null\n ? (state.message.parts.find(\n chunkArg =>\n dataChunk.type === chunkArg.type &&\n dataChunk.id === chunkArg.id,\n ) as\n | DataUIPart<InferUIMessageData<UI_MESSAGE>>\n | undefined)\n : undefined;\n\n if (existingUIPart != null) {\n existingUIPart.data = dataChunk.data;\n } else {\n state.message.parts.push(dataChunk);\n }\n\n onData?.(dataChunk);\n\n write();\n }\n }\n }\n\n controller.enqueue(chunk as InferUIMessageChunk<UI_MESSAGE>);\n });\n },\n }),\n );\n}\n","import { z } from 'zod/v4';\nimport {\n ProviderMetadata,\n providerMetadataSchema,\n} from '../types/provider-metadata';\nimport {\n InferUIMessageData,\n InferUIMessageMetadata,\n UIDataTypes,\n UIMessage,\n} from '../ui/ui-messages';\nimport { ValueOf } from '../util/value-of';\n\nexport const uiMessageChunkSchema = z.union([\n z.strictObject({\n type: z.literal('text-start'),\n id: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('text-delta'),\n id: z.string(),\n delta: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('text-end'),\n id: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('error'),\n errorText: z.string(),\n }),\n z.strictObject({\n type: z.literal('tool-input-start'),\n toolCallId: z.string(),\n toolName: z.string(),\n providerExecuted: z.boolean().optional(),\n dynamic: z.boolean().optional(),\n }),\n z.strictObject({\n type: z.literal('tool-input-delta'),\n toolCallId: z.string(),\n inputTextDelta: z.string(),\n }),\n z.strictObject({\n type: z.literal('tool-input-available'),\n toolCallId: z.string(),\n toolName: z.string(),\n input: z.unknown(),\n providerExecuted: z.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n dynamic: z.boolean().optional(),\n }),\n z.strictObject({\n type: z.literal('tool-input-error'),\n toolCallId: z.string(),\n toolName: z.string(),\n input: z.unknown(),\n providerExecuted: z.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n dynamic: z.boolean().optional(),\n errorText: z.string(),\n }),\n z.strictObject({\n type: z.literal('tool-output-available'),\n toolCallId: z.string(),\n output: z.unknown(),\n providerExecuted: z.boolean().optional(),\n dynamic: z.boolean().optional(),\n preliminary: z.boolean().optional(),\n }),\n z.strictObject({\n type: z.literal('tool-output-error'),\n toolCallId: z.string(),\n errorText: z.string(),\n providerExecuted: z.boolean().optional(),\n dynamic: z.boolean().optional(),\n }),\n z.strictObject({\n type: z.literal('reasoning'),\n text: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('reasoning-start'),\n id: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('reasoning-delta'),\n id: z.string(),\n delta: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('reasoning-end'),\n id: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('reasoning-part-finish'),\n }),\n z.strictObject({\n type: z.literal('source-url'),\n sourceId: z.string(),\n url: z.string(),\n title: z.string().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('source-document'),\n sourceId: z.string(),\n mediaType: z.string(),\n title: z.string(),\n filename: z.string().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('file'),\n url: z.string(),\n mediaType: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.string().startsWith('data-'),\n id: z.string().optional(),\n data: z.unknown(),\n transient: z.boolean().optional(),\n }),\n z.strictObject({\n type: z.literal('start-step'),\n }),\n z.strictObject({\n type: z.literal('finish-step'),\n }),\n z.strictObject({\n type: z.literal('start'),\n messageId: z.string().optional(),\n messageMetadata: z.unknown().optional(),\n }),\n z.strictObject({\n type: z.literal('finish'),\n messageMetadata: z.unknown().optional(),\n }),\n z.strictObject({\n type: z.literal('abort'),\n }),\n z.strictObject({\n type: z.literal('message-metadata'),\n messageMetadata: z.unknown(),\n }),\n]);\n\nexport type DataUIMessageChunk<DATA_TYPES extends UIDataTypes> = ValueOf<{\n [NAME in keyof DATA_TYPES & string]: {\n type: `data-${NAME}`;\n id?: string;\n data: DATA_TYPES[NAME];\n transient?: boolean;\n };\n}>;\n\nexport type UIMessageChunk<\n METADATA = unknown,\n DATA_TYPES extends UIDataTypes = UIDataTypes,\n> =\n | {\n type: 'text-start';\n id: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'text-delta';\n delta: string;\n id: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'text-end';\n id: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'reasoning-start';\n id: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'reasoning-delta';\n id: string;\n delta: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'reasoning-end';\n id: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'error';\n errorText: string;\n }\n | {\n type: 'tool-input-available';\n toolCallId: string;\n toolName: string;\n input: unknown;\n providerExecuted?: boolean;\n providerMetadata?: ProviderMetadata;\n dynamic?: boolean;\n }\n | {\n type: 'tool-input-error';\n toolCallId: string;\n toolName: string;\n input: unknown;\n providerExecuted?: boolean;\n providerMetadata?: ProviderMetadata;\n dynamic?: boolean;\n errorText: string;\n }\n | {\n type: 'tool-output-available';\n toolCallId: string;\n output: unknown;\n providerExecuted?: boolean;\n dynamic?: boolean;\n preliminary?: boolean;\n }\n | {\n type: 'tool-output-error';\n toolCallId: string;\n errorText: string;\n providerExecuted?: boolean;\n dynamic?: boolean;\n }\n | {\n type: 'tool-input-start';\n toolCallId: string;\n toolName: string;\n providerExecuted?: boolean;\n dynamic?: boolean;\n }\n | {\n type: 'tool-input-delta';\n toolCallId: string;\n inputTextDelta: string;\n }\n | {\n type: 'source-url';\n sourceId: string;\n url: string;\n title?: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'source-document';\n sourceId: string;\n mediaType: string;\n title: string;\n filename?: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'file';\n url: string;\n mediaType: string;\n }\n | DataUIMessageChunk<DATA_TYPES>\n | {\n type: 'start-step';\n }\n | {\n type: 'finish-step';\n }\n | {\n type: 'start';\n messageId?: string;\n messageMetadata?: METADATA;\n }\n | {\n type: 'finish';\n messageMetadata?: METADATA;\n }\n | {\n type: 'abort';\n }\n | {\n type: 'message-metadata';\n messageMetadata: METADATA;\n };\n\nexport function isDataUIMessageChunk(\n chunk: UIMessageChunk,\n): chunk is DataUIMessageChunk<UIDataTypes> {\n return chunk.type.startsWith('data-');\n}\n\nexport type InferUIMessageChunk<T extends UIMessage> = UIMessageChunk<\n InferUIMessageMetadata<T>,\n InferUIMessageData<T>\n>;\n","/**\n * Deeply merges two objects together.\n * - Properties from the `overrides` object override those in the `base` object with the same key.\n * - For nested objects, the merge is performed recursively (deep merge).\n * - Arrays are replaced, not merged.\n * - Primitive values are replaced.\n * - If both `base` and `overrides` are undefined, returns undefined.\n * - If one of `base` or `overrides` is undefined, returns the other.\n *\n * @param base The target object to merge into\n * @param overrides The source object to merge from\n * @returns A new object with the merged properties, or undefined if both inputs are undefined\n */\nexport function mergeObjects<T extends object, U extends object>(\n base: T | undefined,\n overrides: U | undefined,\n): (T & U) | T | U | undefined {\n // If both inputs are undefined, return undefined\n if (base === undefined && overrides === undefined) {\n return undefined;\n }\n\n // If target is undefined, return source\n if (base === undefined) {\n return overrides;\n }\n\n // If source is undefined, return target\n if (overrides === undefined) {\n return base;\n }\n\n // Create a new object to avoid mutating the inputs\n const result = { ...base } as T & U;\n\n // Iterate through all keys in the source object\n for (const key in overrides) {\n if (Object.prototype.hasOwnProperty.call(overrides, key)) {\n const overridesValue = overrides[key];\n\n // Skip if the overrides value is undefined\n if (overridesValue === undefined) continue;\n\n // Get the base value if it exists\n const baseValue =\n key in base ? base[key as unknown as keyof T] : undefined;\n\n // Check if both values are objects that can be deeply merged\n const isSourceObject =\n overridesValue !== null &&\n typeof overridesValue === 'object' &&\n !Array.isArray(overridesValue) &&\n !(overridesValue instanceof Date) &&\n !(overridesValue instanceof RegExp);\n\n const isTargetObject =\n baseValue !== null &&\n baseValue !== undefined &&\n typeof baseValue === 'object' &&\n !Array.isArray(baseValue) &&\n !(baseValue instanceof Date) &&\n !(baseValue instanceof RegExp);\n\n // If both values are mergeable objects, merge them recursively\n if (isSourceObject && isTargetObject) {\n result[key as keyof (T & U)] = mergeObjects(\n baseValue as object,\n overridesValue as object,\n ) as any;\n } else {\n // For primitives, arrays, or when one value is not a mergeable object,\n // simply override with the source value\n result[key as keyof (T & U)] = overridesValue as any;\n }\n }\n }\n\n return result;\n}\n","import { JSONValue } from '@ai-sdk/provider';\nimport { safeParseJSON } from '@ai-sdk/provider-utils';\nimport { fixJson } from './fix-json';\n\nexport async function parsePartialJson(jsonText: string | undefined): Promise<{\n value: JSONValue | undefined;\n state:\n | 'undefined-input'\n | 'successful-parse'\n | 'repaired-parse'\n | 'failed-parse';\n}> {\n if (jsonText === undefined) {\n return { value: undefined, state: 'undefined-input' };\n }\n\n let result = await safeParseJSON({ text: jsonText });\n\n if (result.success) {\n return { value: result.value, state: 'successful-parse' };\n }\n\n result = await safeParseJSON({ text: fixJson(jsonText) });\n\n if (result.success) {\n return { value: result.value, state: 'repaired-parse' };\n }\n\n return { value: undefined, state: 'failed-parse' };\n}\n","type State =\n | 'ROOT'\n | 'FINISH'\n | 'INSIDE_STRING'\n | 'INSIDE_STRING_ESCAPE'\n | 'INSIDE_LITERAL'\n | 'INSIDE_NUMBER'\n | 'INSIDE_OBJECT_START'\n | 'INSIDE_OBJECT_KEY'\n | 'INSIDE_OBJECT_AFTER_KEY'\n | 'INSIDE_OBJECT_BEFORE_VALUE'\n | 'INSIDE_OBJECT_AFTER_VALUE'\n | 'INSIDE_OBJECT_AFTER_COMMA'\n | 'INSIDE_ARRAY_START'\n | 'INSIDE_ARRAY_AFTER_VALUE'\n | 'INSIDE_ARRAY_AFTER_COMMA';\n\n// Implemented as a scanner with additional fixing\n// that performs a single linear time scan pass over the partial JSON.\n//\n// The states should ideally match relevant states from the JSON spec:\n// https://www.json.org/json-en.html\n//\n// Please note that invalid JSON is not considered/covered, because it\n// is assumed that the resulting JSON will be processed by a standard\n// JSON parser that will detect any invalid JSON.\nexport function fixJson(input: string): string {\n const stack: State[] = ['ROOT'];\n let lastValidIndex = -1;\n let literalStart: number | null = null;\n\n function processValueStart(char: string, i: number, swapState: State) {\n {\n switch (char) {\n case '\"': {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push('INSIDE_STRING');\n break;\n }\n\n case 'f':\n case 't':\n case 'n': {\n lastValidIndex = i;\n literalStart = i;\n stack.pop();\n stack.push(swapState);\n stack.push('INSIDE_LITERAL');\n break;\n }\n\n case '-': {\n stack.pop();\n stack.push(swapState);\n stack.push('INSIDE_NUMBER');\n break;\n }\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push('INSIDE_NUMBER');\n break;\n }\n\n case '{': {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push('INSIDE_OBJECT_START');\n break;\n }\n\n case '[': {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push('INSIDE_ARRAY_START');\n break;\n }\n }\n }\n }\n\n function processAfterObjectValue(char: string, i: number) {\n switch (char) {\n case ',': {\n stack.pop();\n stack.push('INSIDE_OBJECT_AFTER_COMMA');\n break;\n }\n case '}': {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n }\n\n function processAfterArrayValue(char: string, i: number) {\n switch (char) {\n case ',': {\n stack.pop();\n stack.push('INSIDE_ARRAY_AFTER_COMMA');\n break;\n }\n case ']': {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n }\n\n for (let i = 0; i < input.length; i++) {\n const char = input[i];\n const currentState = stack[stack.length - 1];\n\n switch (currentState) {\n case 'ROOT':\n processValueStart(char, i, 'FINISH');\n break;\n\n case 'INSIDE_OBJECT_START': {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push('INSIDE_OBJECT_KEY');\n break;\n }\n case '}': {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n break;\n }\n\n case 'INSIDE_OBJECT_AFTER_COMMA': {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push('INSIDE_OBJECT_KEY');\n break;\n }\n }\n break;\n }\n\n case 'INSIDE_OBJECT_KEY': {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push('INSIDE_OBJECT_AFTER_KEY');\n break;\n }\n }\n break;\n }\n\n case 'INSIDE_OBJECT_AFTER_KEY': {\n switch (char) {\n case ':': {\n stack.pop();\n stack.push('INSIDE_OBJECT_BEFORE_VALUE');\n\n break;\n }\n }\n break;\n }\n\n case 'INSIDE_OBJECT_BEFORE_VALUE': {\n processValueStart(char, i, 'INSIDE_OBJECT_AFTER_VALUE');\n break;\n }\n\n case 'INSIDE_OBJECT_AFTER_VALUE': {\n processAfterObjectValue(char, i);\n break;\n }\n\n case 'INSIDE_STRING': {\n switch (char) {\n case '\"': {\n stack.pop();\n lastValidIndex = i;\n break;\n }\n\n case '\\\\': {\n stack.push('INSIDE_STRING_ESCAPE');\n break;\n }\n\n default: {\n lastValidIndex = i;\n }\n }\n\n break;\n }\n\n case 'INSIDE_ARRAY_START': {\n switch (char) {\n case ']': {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n\n default: {\n lastValidIndex = i;\n processValueStart(char, i, 'INSIDE_ARRAY_AFTER_VALUE');\n break;\n }\n }\n break;\n }\n\n case 'INSIDE_ARRAY_AFTER_VALUE': {\n switch (char) {\n case ',': {\n stack.pop();\n stack.push('INSIDE_ARRAY_AFTER_COMMA');\n break;\n }\n\n case ']': {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n\n default: {\n lastValidIndex = i;\n break;\n }\n }\n\n break;\n }\n\n case 'INSIDE_ARRAY_AFTER_COMMA': {\n processValueStart(char, i, 'INSIDE_ARRAY_AFTER_VALUE');\n break;\n }\n\n case 'INSIDE_STRING_ESCAPE': {\n stack.pop();\n lastValidIndex = i;\n\n break;\n }\n\n case 'INSIDE_NUMBER': {\n switch (char) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n lastValidIndex = i;\n break;\n }\n\n case 'e':\n case 'E':\n case '-':\n case '.': {\n break;\n }\n\n case ',': {\n stack.pop();\n\n if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i);\n }\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i);\n }\n\n break;\n }\n\n case '}': {\n stack.pop();\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i);\n }\n\n break;\n }\n\n case ']': {\n stack.pop();\n\n if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i);\n }\n\n break;\n }\n\n default: {\n stack.pop();\n break;\n }\n }\n\n break;\n }\n\n case 'INSIDE_LITERAL': {\n const partialLiteral = input.substring(literalStart!, i + 1);\n\n if (\n !'false'.startsWith(partialLiteral) &&\n !'true'.startsWith(partialLiteral) &&\n !'null'.startsWith(partialLiteral)\n ) {\n stack.pop();\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i);\n } else if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i);\n }\n } else {\n lastValidIndex = i;\n }\n\n break;\n }\n }\n }\n\n let result = input.slice(0, lastValidIndex + 1);\n\n for (let i = stack.length - 1; i >= 0; i--) {\n const state = stack[i];\n\n switch (state) {\n case 'INSIDE_STRING': {\n result += '\"';\n break;\n }\n\n case 'INSIDE_OBJECT_KEY':\n case 'INSIDE_OBJECT_AFTER_KEY':\n case 'INSIDE_OBJECT_AFTER_COMMA':\n case 'INSIDE_OBJECT_START':\n case 'INSIDE_OBJECT_BEFORE_VALUE':\n case 'INSIDE_OBJECT_AFTER_VALUE': {\n result += '}';\n break;\n }\n\n case 'INSIDE_ARRAY_START':\n case 'INSIDE_ARRAY_AFTER_COMMA':\n case 'INSIDE_ARRAY_AFTER_VALUE': {\n result += ']';\n break;\n }\n\n case 'INSIDE_LITERAL': {\n const partialLiteral = input.substring(literalStart!, input.length);\n\n if ('true'.startsWith(partialLiteral)) {\n result += 'true'.slice(partialLiteral.length);\n } else if ('false'.startsWith(partialLiteral)) {\n result += 'false'.slice(partialLiteral.length);\n } else if ('null'.startsWith(partialLiteral)) {\n result += 'null'.slice(partialLiteral.length);\n }\n }\n }\n }\n\n return result;\n}\n","import {\n InferToolInput,\n InferToolOutput,\n Tool,\n ToolCall,\n} from '@ai-sdk/provider-utils';\nimport { ToolSet } from '../generate-text';\nimport { ProviderMetadata } from '../types/provider-metadata';\nimport { DeepPartial } from '../util/deep-partial';\nimport { ValueOf } from '../util/value-of';\n\n/**\nThe data types that can be used in the UI message for the UI message data parts.\n */\nexport type UIDataTypes = Record<string, unknown>;\n\nexport type UITool = {\n input: unknown;\n output: unknown | undefined;\n};\n\n/**\n * Infer the input and output types of a tool so it can be used as a UI tool.\n */\nexport type InferUITool<TOOL extends Tool> = {\n input: InferToolInput<TOOL>;\n output: InferToolOutput<TOOL>;\n};\n\n/**\n * Infer the input and output types of a tool set so it can be used as a UI tool set.\n */\nexport type InferUITools<TOOLS extends ToolSet> = {\n [NAME in keyof TOOLS & string]: InferUITool<TOOLS[NAME]>;\n};\n\nexport type UITools = Record<string, UITool>;\n\n/**\nAI SDK UI Messages. They are used in the client and to communicate between the frontend and the API routes.\n */\nexport interface UIMessage<\n METADATA = unknown,\n DATA_PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n> {\n /**\nA unique identifier for the message.\n */\n id: string;\n\n /**\nThe role of the message.\n */\n role: 'system' | 'user' | 'assistant';\n\n /**\nThe metadata of the message.\n */\n metadata?: METADATA;\n\n /**\nThe parts of the message. Use this for rendering the message in the UI.\n\nSystem messages should be avoided (set the system prompt on the server instead).\nThey can have text parts.\n\nUser messages can have text parts and file parts.\n\nAssistant messages can have text, reasoning, tool invocation, and file parts.\n */\n parts: Array<UIMessagePart<DATA_PARTS, TOOLS>>;\n}\n\nexport type UIMessagePart<\n DATA_TYPES extends UIDataTypes,\n TOOLS extends UITools,\n> =\n | TextUIPart\n | ReasoningUIPart\n | ToolUIPart<TOOLS>\n | DynamicToolUIPart\n | SourceUrlUIPart\n | SourceDocumentUIPart\n | FileUIPart\n | DataUIPart<DATA_TYPES>\n | StepStartUIPart;\n\n/**\n * A text part of a message.\n */\nexport type TextUIPart = {\n type: 'text';\n\n /**\n * The text content.\n */\n text: string;\n\n /**\n * The state of the text part.\n */\n state?: 'streaming' | 'done';\n\n /**\n * The provider metadata.\n */\n providerMetadata?: ProviderMetadata;\n};\n\n/**\n * A reasoning part of a message.\n */\nexport type ReasoningUIPart = {\n type: 'reasoning';\n\n /**\n * The reasoning text.\n */\n text: string;\n\n /**\n * The state of the reasoning part.\n */\n state?: 'streaming' | 'done';\n\n /**\n * The provider metadata.\n */\n providerMetadata?: ProviderMetadata;\n};\n\n/**\n * A source part of a message.\n */\nexport type SourceUrlUIPart = {\n type: 'source-url';\n sourceId: string;\n url: string;\n title?: string;\n providerMetadata?: ProviderMetadata;\n};\n\n/**\n * A document source part of a message.\n */\nexport type SourceDocumentUIPart = {\n type: 'source-document';\n sourceId: string;\n mediaType: string;\n title: string;\n filename?: string;\n providerMetadata?: ProviderMetadata;\n};\n\n/**\n * A file part of a message.\n */\nexport type FileUIPart = {\n type: 'file';\n\n /**\n * IANA media type of the file.\n *\n * @see https://www.iana.org/assignments/media-types/media-types.xhtml\n */\n mediaType: string;\n\n /**\n * Optional filename of the file.\n */\n filename?: string;\n\n /**\n * The URL of the file.\n * It can either be a URL to a hosted file or a [Data URL](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs).\n */\n url: string;\n\n /**\n * The provider metadata.\n */\n providerMetadata?: ProviderMetadata;\n};\n\n/**\n * A step boundary part of a message.\n */\nexport type StepStartUIPart = {\n type: 'step-start';\n};\n\nexport type DataUIPart<DATA_TYPES extends UIDataTypes> = ValueOf<{\n [NAME in keyof DATA_TYPES & string]: {\n type: `data-${NAME}`;\n id?: string;\n data: DATA_TYPES[NAME];\n };\n}>;\n\nexport type ToolUIPart<TOOLS extends UITools = UITools> = ValueOf<{\n [NAME in keyof TOOLS & string]: {\n type: `tool-${NAME}`;\n toolCallId: string;\n } & (\n | {\n state: 'input-streaming';\n input: DeepPartial<TOOLS[NAME]['input']> | undefined;\n providerExecuted?: boolean;\n output?: never;\n errorText?: never;\n }\n | {\n state: 'input-available';\n input: TOOLS[NAME]['input'];\n providerExecuted?: boolean;\n output?: never;\n errorText?: never;\n callProviderMetadata?: ProviderMetadata;\n }\n | {\n state: 'output-available';\n input: TOOLS[NAME]['input'];\n output: TOOLS[NAME]['output'];\n errorText?: never;\n providerExecuted?: boolean;\n callProviderMetadata?: ProviderMetadata;\n preliminary?: boolean;\n }\n | {\n state: 'output-error'; // TODO AI SDK 6: change to 'error' state\n input: TOOLS[NAME]['input'] | undefined;\n rawInput?: unknown; // TODO AI SDK 6: remove this field, input should be unknown\n output?: never;\n errorText: string;\n providerExecuted?: boolean;\n callProviderMetadata?: ProviderMetadata;\n }\n );\n}>;\n\nexport type DynamicToolUIPart = {\n type: 'dynamic-tool';\n toolName: string;\n toolCallId: string;\n} & (\n | {\n state: 'input-streaming';\n input: unknown | undefined;\n output?: never;\n errorText?: never;\n }\n | {\n state: 'input-available';\n input: unknown;\n output?: never;\n errorText?: never;\n callProviderMetadata?: ProviderMetadata;\n }\n | {\n state: 'output-available';\n input: unknown;\n output: unknown;\n errorText?: never;\n callProviderMetadata?: ProviderMetadata;\n preliminary?: boolean;\n }\n | {\n state: 'output-error'; // TODO AI SDK 6: change to 'error' state\n input: unknown;\n output?: never;\n errorText: string;\n callProviderMetadata?: ProviderMetadata;\n }\n);\n\nexport function isToolUIPart<TOOLS extends UITools>(\n part: UIMessagePart<UIDataTypes, TOOLS>,\n): part is ToolUIPart<TOOLS> {\n return part.type.startsWith('tool-');\n}\n\nexport function getToolName<TOOLS extends UITools>(\n part: ToolUIPart<TOOLS>,\n): keyof TOOLS {\n return part.type.split('-').slice(1).join('-') as keyof TOOLS;\n}\n\nexport type InferUIMessageMetadata<T extends UIMessage> =\n T extends UIMessage<infer METADATA> ? METADATA : unknown;\n\nexport type InferUIMessageData<T extends UIMessage> =\n T extends UIMessage<unknown, infer DATA_TYPES> ? DATA_TYPES : UIDataTypes;\n\nexport type InferUIMessageTools<T extends UIMessage> =\n T extends UIMessage<unknown, UIDataTypes, infer TOOLS> ? TOOLS : UITools;\n\nexport type InferUIMessageToolOutputs<UI_MESSAGE extends UIMessage> =\n InferUIMessageTools<UI_MESSAGE>[keyof InferUIMessageTools<UI_MESSAGE>]['output'];\n\nexport type InferUIMessageToolCall<UI_MESSAGE extends UIMessage> =\n | ValueOf<{\n [NAME in keyof InferUIMessageTools<UI_MESSAGE>]: ToolCall<\n NAME & string,\n InferUIMessageTools<UI_MESSAGE>[NAME] extends { input: infer INPUT }\n ? INPUT\n : never\n > & { dynamic?: false };\n }>\n | (ToolCall<string, unknown> & { dynamic: true });\n","import {\n createStreamingUIMessageState,\n processUIMessageStream,\n StreamingUIMessageState,\n} from '../ui/process-ui-message-stream';\nimport { UIMessage } from '../ui/ui-messages';\nimport { ErrorHandler } from '../util/error-handler';\nimport { InferUIMessageChunk, UIMessageChunk } from './ui-message-chunks';\nimport { UIMessageStreamOnFinishCallback } from './ui-message-stream-on-finish-callback';\n\nexport function handleUIMessageStreamFinish<UI_MESSAGE extends UIMessage>({\n messageId,\n originalMessages = [],\n onFinish,\n onError,\n stream,\n}: {\n stream: ReadableStream<InferUIMessageChunk<UI_MESSAGE>>;\n\n /**\n * The message ID to use for the response message.\n * If not provided, no id will be set for the response message.\n */\n messageId?: string;\n\n /**\n * The original messages.\n */\n originalMessages?: UI_MESSAGE[];\n\n onError: ErrorHandler;\n\n onFinish?: UIMessageStreamOnFinishCallback<UI_MESSAGE>;\n}): ReadableStream<InferUIMessageChunk<UI_MESSAGE>> {\n // last message is only relevant for assistant messages\n let lastMessage: UI_MESSAGE | undefined =\n originalMessages?.[originalMessages.length - 1];\n if (lastMessage?.role !== 'assistant') {\n lastMessage = undefined;\n } else {\n // appending to the last message, so we need to use the same id\n messageId = lastMessage.id;\n }\n\n let isAborted = false;\n\n const idInjectedStream = stream.pipeThrough(\n new TransformStream<\n InferUIMessageChunk<UI_MESSAGE>,\n InferUIMessageChunk<UI_MESSAGE>\n >({\n transform(chunk, controller) {\n // when there is no messageId in the start chunk,\n // but the user checked for persistence,\n // inject the messageId into the chunk\n if (chunk.type === 'start') {\n const startChunk = chunk as UIMessageChunk & { type: 'start' };\n if (startChunk.messageId == null && messageId != null) {\n startChunk.messageId = messageId;\n }\n }\n\n if (chunk.type === 'abort') {\n isAborted = true;\n }\n\n controller.enqueue(chunk);\n },\n }),\n );\n\n if (onFinish == null) {\n return idInjectedStream;\n }\n\n const state = createStreamingUIMessageState<UI_MESSAGE>({\n lastMessage: lastMessage\n ? (structuredClone(lastMessage) as UI_MESSAGE)\n : undefined,\n messageId: messageId ?? '', // will be overridden by the stream\n });\n\n const runUpdateMessageJob = async (\n job: (options: {\n state: StreamingUIMessageState<UI_MESSAGE>;\n write: () => void;\n }) => Promise<void>,\n ) => {\n await job({ state, write: () => {} });\n };\n\n return processUIMessageStream<UI_MESSAGE>({\n stream: idInjectedStream,\n runUpdateMessageJob,\n onError,\n }).pipeThrough(\n new TransformStream<\n InferUIMessageChunk<UI_MESSAGE>,\n InferUIMessageChunk<UI_MESSAGE>\n >({\n transform(chunk, controller) {\n controller.enqueue(chunk);\n },\n\n async flush() {\n const isContinuation = state.message.id === lastMessage?.id;\n await onFinish({\n isAborted,\n isContinuation,\n responseMessage: state.message as UI_MESSAGE,\n messages: [\n ...(isContinuation\n ? originalMessages.slice(0, -1)\n : originalMessages),\n state.message,\n ] as UI_MESSAGE[],\n });\n },\n }),\n );\n}\n","import { ServerResponse } from 'node:http';\nimport { prepareHeaders } from '../util/prepare-headers';\nimport { writeToServerResponse } from '../util/write-to-server-response';\nimport { JsonToSseTransformStream } from './json-to-sse-transform-stream';\nimport { UI_MESSAGE_STREAM_HEADERS } from './ui-message-stream-headers';\nimport { UIMessageChunk } from './ui-message-chunks';\nimport { UIMessageStreamResponseInit } from './ui-message-stream-response-init';\n\nexport function pipeUIMessageStreamToResponse({\n response,\n status,\n statusText,\n headers,\n stream,\n consumeSseStream,\n}: {\n response: ServerResponse;\n stream: ReadableStream<UIMessageChunk>;\n} & UIMessageStreamResponseInit): void {\n let sseStream = stream.pipeThrough(new JsonToSseTransformStream());\n\n // when the consumeSseStream is provided, we need to tee the stream\n // and send the second part to the consumeSseStream function\n // so that it can be consumed by the client independently\n if (consumeSseStream) {\n const [stream1, stream2] = sseStream.tee();\n sseStream = stream1;\n consumeSseStream({ stream: stream2 }); // no await (do not block the response)\n }\n\n writeToServerResponse({\n response,\n status,\n statusText,\n headers: Object.fromEntries(\n prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS).entries(),\n ),\n stream: sseStream.pipeThrough(new TextEncoderStream()),\n });\n}\n","export type AsyncIterableStream<T> = AsyncIterable<T> & ReadableStream<T>;\n\nexport function createAsyncIterableStream<T>(\n source: ReadableStream<T>,\n): AsyncIterableStream<T> {\n const stream = source.pipeThrough(new TransformStream<T, T>());\n\n (stream as AsyncIterableStream<T>)[Symbol.asyncIterator] = () => {\n const reader = stream.getReader();\n return {\n async next(): Promise<IteratorResult<T>> {\n const { done, value } = await reader.read();\n return done ? { done: true, value: undefined } : { done: false, value };\n },\n };\n };\n\n return stream as AsyncIterableStream<T>;\n}\n","/**\n * Consumes a ReadableStream until it's fully read.\n *\n * This function reads the stream chunk by chunk until the stream is exhausted.\n * It doesn't process or return the data from the stream; it simply ensures\n * that the entire stream is read.\n *\n * @param {ReadableStream} stream - The ReadableStream to be consumed.\n * @returns {Promise<void>} A promise that resolves when the stream is fully consumed.\n */\nexport async function consumeStream({\n stream,\n onError,\n}: {\n stream: ReadableStream;\n onError?: (error: unknown) => void;\n}): Promise<void> {\n const reader = stream.getReader();\n try {\n while (true) {\n const { done } = await reader.read();\n if (done) break;\n }\n } catch (error) {\n onError?.(error);\n } finally {\n reader.releaseLock();\n }\n}\n","import { ErrorHandler } from './error-handler';\n\n/**\n * Creates a Promise with externally accessible resolve and reject functions.\n *\n * @template T - The type of the value that the Promise will resolve to.\n * @returns An object containing:\n * - promise: A Promise that can be resolved or rejected externally.\n * - resolve: A function to resolve the Promise with a value of type T.\n * - reject: A function to reject the Promise with an error.\n */\nexport function createResolvablePromise<T = any>(): {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: ErrorHandler;\n} {\n let resolve: (value: T) => void;\n let reject: ErrorHandler;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return {\n promise,\n resolve: resolve!,\n reject: reject!,\n };\n}\n","import { createResolvablePromise } from './create-resolvable-promise';\n\n/**\n * Creates a stitchable stream that can pipe one stream at a time.\n *\n * @template T - The type of values emitted by the streams.\n * @returns {Object} An object containing the stitchable stream and control methods.\n */\nexport function createStitchableStream<T>(): {\n stream: ReadableStream<T>;\n addStream: (innerStream: ReadableStream<T>) => void;\n close: () => void;\n terminate: () => void;\n} {\n let innerStreamReaders: ReadableStreamDefaultReader<T>[] = [];\n let controller: ReadableStreamDefaultController<T> | null = null;\n let isClosed = false;\n let waitForNewStream = createResolvablePromise<void>();\n\n const terminate = () => {\n isClosed = true;\n waitForNewStream.resolve();\n\n innerStreamReaders.forEach(reader => reader.cancel());\n innerStreamReaders = [];\n controller?.close();\n };\n\n const processPull = async () => {\n // Case 1: Outer stream is closed and no more inner streams\n if (isClosed && innerStreamReaders.length === 0) {\n controller?.close();\n return;\n }\n\n // Case 2: No inner streams available, but outer stream is open\n // wait for a new inner stream to be added or the outer stream to close\n if (innerStreamReaders.length === 0) {\n waitForNewStream = createResolvablePromise<void>();\n await waitForNewStream.promise;\n return processPull();\n }\n\n try {\n const { value, done } = await innerStreamReaders[0].read();\n\n if (done) {\n // Case 3: Current inner stream is done\n innerStreamReaders.shift(); // Remove the finished stream\n\n // Continue pulling from the next stream if available\n if (innerStreamReaders.length > 0) {\n await processPull();\n } else if (isClosed) {\n controller?.close();\n }\n } else {\n // Case 4: Current inner stream returns an item\n controller?.enqueue(value);\n }\n } catch (error) {\n // Case 5: Current inner stream throws an error\n controller?.error(error);\n innerStreamReaders.shift(); // Remove the errored stream\n terminate(); // we have errored, terminate all streams\n }\n };\n\n return {\n stream: new ReadableStream<T>({\n start(controllerParam) {\n controller = controllerParam;\n },\n pull: processPull,\n async cancel() {\n for (const reader of innerStreamReaders) {\n await reader.cancel();\n }\n innerStreamReaders = [];\n isClosed = true;\n },\n }),\n addStream: (innerStream: ReadableStream<T>) => {\n if (isClosed) {\n throw new Error('Cannot add inner stream: outer stream is closed');\n }\n\n innerStreamReaders.push(innerStream.getReader());\n waitForNewStream.resolve();\n },\n\n /**\n * Gracefully close the outer stream. This will let the inner streams\n * finish processing and then close the outer stream.\n */\n close: () => {\n isClosed = true;\n waitForNewStream.resolve();\n\n if (innerStreamReaders.length === 0) {\n controller?.close();\n }\n },\n\n /**\n * Immediately close the outer stream. This will cancel all inner streams\n * and close the outer stream.\n */\n terminate,\n };\n}\n","/**\n * Delayed promise. It is only constructed once the value is accessed.\n * This is useful to avoid unhandled promise rejections when the promise is created\n * but not accessed.\n */\nexport class DelayedPromise<T> {\n private status:\n | { type: 'pending' }\n | { type: 'resolved'; value: T }\n | { type: 'rejected'; error: unknown } = { type: 'pending' };\n private _promise: Promise<T> | undefined;\n private _resolve: undefined | ((value: T) => void) = undefined;\n private _reject: undefined | ((error: unknown) => void) = undefined;\n\n get promise(): Promise<T> {\n if (this._promise) {\n return this._promise;\n }\n\n this._promise = new Promise<T>((resolve, reject) => {\n if (this.status.type === 'resolved') {\n resolve(this.status.value);\n } else if (this.status.type === 'rejected') {\n reject(this.status.error);\n }\n\n this._resolve = resolve;\n this._reject = reject;\n });\n\n return this._promise;\n }\n\n resolve(value: T): void {\n this.status = { type: 'resolved', value };\n\n if (this._promise) {\n this._resolve?.(value);\n }\n }\n\n reject(error: unknown): void {\n this.status = { type: 'rejected', error };\n\n if (this._promise) {\n this._reject?.(error);\n }\n }\n}\n","export function filterStreamErrors<T>(\n readable: ReadableStream<T>,\n onError: ({\n error,\n controller,\n }: {\n error: unknown;\n controller: ReadableStreamDefaultController<T>;\n }) => Promise<void> | void,\n): ReadableStream<T> {\n return new ReadableStream<T>({\n async start(controller) {\n const reader = readable.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n break;\n }\n controller.enqueue(value);\n }\n } catch (error) {\n await onError({ error, controller });\n }\n },\n cancel(reason) {\n return readable.cancel(reason);\n },\n });\n}\n","// Shim for performance.now() to support environments that don't have it:\nexport function now(): number {\n return globalThis?.performance?.now() ?? Date.now();\n}\n","import {\n LanguageModelV2CallWarning,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider';\nimport {\n executeTool,\n generateId,\n getErrorMessage,\n ModelMessage,\n} from '@ai-sdk/provider-utils';\nimport { Tracer } from '@opentelemetry/api';\nimport { assembleOperationName } from '../telemetry/assemble-operation-name';\nimport { recordErrorOnSpan, recordSpan } from '../telemetry/record-span';\nimport { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport { FinishReason, LanguageModelUsage, ProviderMetadata } from '../types';\nimport { Source } from '../types/language-model';\nimport { DefaultGeneratedFileWithType, GeneratedFile } from './generated-file';\nimport { parseToolCall } from './parse-tool-call';\nimport { TypedToolCall } from './tool-call';\nimport { ToolCallRepairFunction } from './tool-call-repair-function';\nimport { TypedToolError } from './tool-error';\nimport { TypedToolResult } from './tool-result';\nimport { ToolSet } from './tool-set';\n\nexport type SingleRequestTextStreamPart<TOOLS extends ToolSet> =\n // Text blocks:\n | {\n type: 'text-start';\n providerMetadata?: ProviderMetadata;\n id: string;\n }\n | {\n type: 'text-delta';\n id: string;\n providerMetadata?: ProviderMetadata;\n delta: string;\n }\n | {\n type: 'text-end';\n providerMetadata?: ProviderMetadata;\n id: string;\n }\n\n // Reasoning blocks:\n | {\n type: 'reasoning-start';\n providerMetadata?: ProviderMetadata;\n id: string;\n }\n | {\n type: 'reasoning-delta';\n id: string;\n providerMetadata?: ProviderMetadata;\n delta: string;\n }\n | {\n type: 'reasoning-end';\n id: string;\n providerMetadata?: ProviderMetadata;\n }\n\n // Tool calls:\n | {\n type: 'tool-input-start';\n id: string;\n toolName: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'tool-input-delta';\n id: string;\n delta: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'tool-input-end';\n id: string;\n providerMetadata?: ProviderMetadata;\n }\n | ({ type: 'source' } & Source)\n | { type: 'file'; file: GeneratedFile } // different because of GeneratedFile object\n | ({ type: 'tool-call' } & TypedToolCall<TOOLS>)\n | ({ type: 'tool-result' } & TypedToolResult<TOOLS>)\n | ({ type: 'tool-error' } & TypedToolError<TOOLS>)\n | { type: 'file'; file: GeneratedFile } // different because of GeneratedFile object\n | { type: 'stream-start'; warnings: LanguageModelV2CallWarning[] }\n | {\n type: 'response-metadata';\n id?: string;\n timestamp?: Date;\n modelId?: string;\n }\n | {\n type: 'finish';\n finishReason: FinishReason;\n usage: LanguageModelUsage;\n providerMetadata?: ProviderMetadata;\n }\n | { type: 'error'; error: unknown }\n | { type: 'raw'; rawValue: unknown };\n\nexport function runToolsTransformation<TOOLS extends ToolSet>({\n tools,\n generatorStream,\n tracer,\n telemetry,\n system,\n messages,\n abortSignal,\n repairToolCall,\n experimental_context,\n}: {\n tools: TOOLS | undefined;\n generatorStream: ReadableStream<LanguageModelV2StreamPart>;\n tracer: Tracer;\n telemetry: TelemetrySettings | undefined;\n system: string | undefined;\n messages: ModelMessage[];\n abortSignal: AbortSignal | undefined;\n repairToolCall: ToolCallRepairFunction<TOOLS> | undefined;\n experimental_context: unknown;\n}): ReadableStream<SingleRequestTextStreamPart<TOOLS>> {\n // tool results stream\n let toolResultsStreamController: ReadableStreamDefaultController<\n SingleRequestTextStreamPart<TOOLS>\n > | null = null;\n const toolResultsStream = new ReadableStream<\n SingleRequestTextStreamPart<TOOLS>\n >({\n start(controller) {\n toolResultsStreamController = controller;\n },\n });\n\n // keep track of outstanding tool results for stream closing:\n const outstandingToolResults = new Set<string>();\n\n // keep track of tool inputs for provider-side tool results\n const toolInputs = new Map<string, unknown>();\n\n let canClose = false;\n let finishChunk:\n | (SingleRequestTextStreamPart<TOOLS> & { type: 'finish' })\n | undefined = undefined;\n\n function attemptClose() {\n // close the tool results controller if no more outstanding tool calls\n if (canClose && outstandingToolResults.size === 0) {\n // we delay sending the finish chunk until all tool results (incl. delayed ones)\n // are received to ensure that the frontend receives tool results before a message\n // finish event arrives.\n if (finishChunk != null) {\n toolResultsStreamController!.enqueue(finishChunk);\n }\n\n toolResultsStreamController!.close();\n }\n }\n\n // forward stream\n const forwardStream = new TransformStream<\n LanguageModelV2StreamPart,\n SingleRequestTextStreamPart<TOOLS>\n >({\n async transform(\n chunk: LanguageModelV2StreamPart,\n controller: TransformStreamDefaultController<\n SingleRequestTextStreamPart<TOOLS>\n >,\n ) {\n const chunkType = chunk.type;\n\n switch (chunkType) {\n // forward:\n case 'stream-start':\n case 'text-start':\n case 'text-delta':\n case 'text-end':\n case 'reasoning-start':\n case 'reasoning-delta':\n case 'reasoning-end':\n case 'tool-input-start':\n case 'tool-input-delta':\n case 'tool-input-end':\n case 'source':\n case 'response-metadata':\n case 'error':\n case 'raw': {\n controller.enqueue(chunk);\n break;\n }\n\n case 'file': {\n controller.enqueue({\n type: 'file',\n file: new DefaultGeneratedFileWithType({\n data: chunk.data,\n mediaType: chunk.mediaType,\n }),\n });\n break;\n }\n\n case 'finish': {\n finishChunk = {\n type: 'finish',\n finishReason: chunk.finishReason,\n usage: chunk.usage,\n providerMetadata: chunk.providerMetadata,\n };\n break;\n }\n\n // process tool call:\n case 'tool-call': {\n try {\n const toolCall = await parseToolCall({\n toolCall: chunk,\n tools,\n repairToolCall,\n system,\n messages,\n });\n\n controller.enqueue(toolCall);\n\n // handle invalid tool calls:\n if (toolCall.invalid) {\n toolResultsStreamController!.enqueue({\n type: 'tool-error',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n error: getErrorMessage(toolCall.error!),\n dynamic: true,\n });\n\n break;\n }\n\n const tool = tools![toolCall.toolName];\n\n toolInputs.set(toolCall.toolCallId, toolCall.input);\n\n if (tool.onInputAvailable != null) {\n await tool.onInputAvailable({\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n messages,\n abortSignal,\n experimental_context,\n });\n }\n\n // Only execute tools that are not provider-executed:\n if (tool.execute != null && toolCall.providerExecuted !== true) {\n const toolExecutionId = generateId(); // use our own id to guarantee uniqueness\n outstandingToolResults.add(toolExecutionId);\n\n // Note: we don't await the tool execution here (by leaving out 'await' on recordSpan),\n // because we want to process the next chunk as soon as possible.\n // This is important for the case where the tool execution takes a long time.\n recordSpan({\n name: 'ai.toolCall',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.toolCall',\n telemetry,\n }),\n 'ai.toolCall.name': toolCall.toolName,\n 'ai.toolCall.id': toolCall.toolCallId,\n 'ai.toolCall.args': {\n output: () => JSON.stringify(toolCall.input),\n },\n },\n }),\n tracer,\n fn: async span => {\n let output: unknown;\n\n try {\n const stream = executeTool({\n execute: tool.execute!.bind(tool),\n input: toolCall.input,\n options: {\n toolCallId: toolCall.toolCallId,\n messages,\n abortSignal,\n experimental_context,\n },\n });\n\n for await (const part of stream) {\n toolResultsStreamController!.enqueue({\n ...toolCall,\n type: 'tool-result',\n output: part.output,\n ...(part.type === 'preliminary' && {\n preliminary: true,\n }),\n });\n\n if (part.type === 'final') {\n output = part.output;\n }\n }\n } catch (error) {\n recordErrorOnSpan(span, error);\n toolResultsStreamController!.enqueue({\n ...toolCall,\n type: 'tool-error',\n error,\n } satisfies TypedToolError<TOOLS>);\n\n outstandingToolResults.delete(toolExecutionId);\n attemptClose();\n return;\n }\n\n outstandingToolResults.delete(toolExecutionId);\n attemptClose();\n\n // record telemetry\n try {\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.toolCall.result': {\n output: () => JSON.stringify(output),\n },\n },\n }),\n );\n } catch (ignored) {\n // JSON stringify might fail if the result is not serializable,\n // in which case we just ignore it. In the future we might want to\n // add an optional serialize method to the tool interface and warn\n // if the result is not serializable.\n }\n },\n });\n }\n } catch (error) {\n toolResultsStreamController!.enqueue({ type: 'error', error });\n }\n\n break;\n }\n\n case 'tool-result': {\n const toolName = chunk.toolName as keyof TOOLS & string;\n\n if (chunk.isError) {\n toolResultsStreamController!.enqueue({\n type: 'tool-error',\n toolCallId: chunk.toolCallId,\n toolName,\n input: toolInputs.get(chunk.toolCallId),\n providerExecuted: chunk.providerExecuted,\n error: chunk.result,\n } as TypedToolError<TOOLS>);\n } else {\n controller.enqueue({\n type: 'tool-result',\n toolCallId: chunk.toolCallId,\n toolName,\n input: toolInputs.get(chunk.toolCallId),\n output: chunk.result,\n providerExecuted: chunk.providerExecuted,\n } as TypedToolResult<TOOLS>);\n }\n break;\n }\n\n default: {\n const _exhaustiveCheck: never = chunkType;\n throw new Error(`Unhandled chunk type: ${_exhaustiveCheck}`);\n }\n }\n },\n\n flush() {\n canClose = true;\n attemptClose();\n },\n });\n\n // combine the generator stream and the tool results stream\n return new ReadableStream<SingleRequestTextStreamPart<TOOLS>>({\n async start(controller) {\n // need to wait for both pipes so there are no dangling promises that\n // can cause uncaught promise rejections when the stream is aborted\n return Promise.all([\n generatorStream.pipeThrough(forwardStream).pipeTo(\n new WritableStream({\n write(chunk) {\n controller.enqueue(chunk);\n },\n close() {\n // the generator stream controller is automatically closed when it's consumed\n },\n }),\n ),\n toolResultsStream.pipeTo(\n new WritableStream({\n write(chunk) {\n controller.enqueue(chunk);\n },\n close() {\n controller.close();\n },\n }),\n ),\n ]);\n },\n });\n}\n","import { IdGenerator } from '@ai-sdk/provider-utils';\nimport {\n generateText,\n GenerateTextOnStepFinishCallback,\n} from '../generate-text/generate-text';\nimport { GenerateTextResult } from '../generate-text/generate-text-result';\nimport { Output } from '../generate-text/output';\nimport { PrepareStepFunction } from '../generate-text/prepare-step';\nimport { StopCondition } from '../generate-text/stop-condition';\nimport { streamText } from '../generate-text/stream-text';\nimport { StreamTextResult } from '../generate-text/stream-text-result';\nimport { ToolCallRepairFunction } from '../generate-text/tool-call-repair-function';\nimport { ToolSet } from '../generate-text/tool-set';\nimport { CallSettings } from '../prompt/call-settings';\nimport { Prompt } from '../prompt/prompt';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport { LanguageModel, ToolChoice } from '../types/language-model';\nimport { ProviderMetadata } from '../types/provider-metadata';\n\nexport type AgentSettings<\n TOOLS extends ToolSet,\n OUTPUT = never,\n OUTPUT_PARTIAL = never,\n> = CallSettings & {\n /**\n * The system prompt to use.\n */\n system?: string;\n\n /**\nThe language model to use.\n */\n model: LanguageModel;\n\n /**\nThe tools that the model can call. The model needs to support calling tools.\n*/\n tools?: TOOLS;\n\n /**\nThe tool choice strategy. Default: 'auto'.\n */\n toolChoice?: ToolChoice<NoInfer<TOOLS>>;\n\n /**\nCondition for stopping the generation when there are tool results in the last step.\nWhen the condition is an array, any of the conditions can be met to stop the generation.\n\n@default stepCountIs(1)\n */\n stopWhen?:\n | StopCondition<NoInfer<TOOLS>>\n | Array<StopCondition<NoInfer<TOOLS>>>;\n\n /**\nOptional telemetry configuration (experimental).\n */\n experimental_telemetry?: TelemetrySettings;\n\n /**\nLimits the tools that are available for the model to call without\nchanging the tool call and result types in the result.\n */\n activeTools?: Array<keyof NoInfer<TOOLS>>;\n\n /**\nOptional specification for parsing structured outputs from the LLM response.\n */\n experimental_output?: Output<OUTPUT, OUTPUT_PARTIAL>;\n\n /**\n * @deprecated Use `prepareStep` instead.\n */\n experimental_prepareStep?: PrepareStepFunction<NoInfer<TOOLS>>;\n\n /**\nOptional function that you can use to provide different settings for a step.\n */\n prepareStep?: PrepareStepFunction<NoInfer<TOOLS>>;\n\n /**\nA function that attempts to repair a tool call that failed to parse.\n */\n experimental_repairToolCall?: ToolCallRepairFunction<NoInfer<TOOLS>>;\n\n /**\n Callback that is called when each step (LLM call) is finished, including intermediate steps.\n */\n onStepFinish?: GenerateTextOnStepFinishCallback<NoInfer<TOOLS>>;\n\n /**\n * Context that is passed into tool calls.\n *\n * Experimental (can break in patch releases).\n *\n * @default undefined\n */\n experimental_context?: unknown;\n\n /**\n * Internal. For test use only. May change without notice.\n */\n _internal?: {\n generateId?: IdGenerator;\n currentDate?: () => Date;\n };\n};\n\nexport class Agent<\n TOOLS extends ToolSet,\n OUTPUT = never,\n OUTPUT_PARTIAL = never,\n> {\n private readonly settings: AgentSettings<TOOLS, OUTPUT, OUTPUT_PARTIAL>;\n\n constructor(settings: AgentSettings<TOOLS, OUTPUT, OUTPUT_PARTIAL>) {\n this.settings = settings;\n }\n\n async generate(\n options: Prompt & {\n /**\nAdditional provider-specific metadata. They are passed through\nfrom the provider to the AI SDK and enable provider-specific\nresults that can be fully encapsulated in the provider.\n */\n providerMetadata?: ProviderMetadata;\n },\n ): Promise<GenerateTextResult<TOOLS, OUTPUT>> {\n return generateText({ ...this.settings, ...options });\n }\n\n stream(\n options: Prompt & {\n /**\nAdditional provider-specific metadata. They are passed through\nfrom the provider to the AI SDK and enable provider-specific\nresults that can be fully encapsulated in the provider.\n */\n providerMetadata?: ProviderMetadata;\n },\n ): StreamTextResult<TOOLS, OUTPUT_PARTIAL> {\n return streamText({ ...this.settings, ...options });\n }\n}\n","import { ProviderOptions } from '@ai-sdk/provider-utils';\nimport { resolveEmbeddingModel } from '../model/resolve-model';\nimport { assembleOperationName } from '../telemetry/assemble-operation-name';\nimport { getBaseTelemetryAttributes } from '../telemetry/get-base-telemetry-attributes';\nimport { getTracer } from '../telemetry/get-tracer';\nimport { recordSpan } from '../telemetry/record-span';\nimport { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport { EmbeddingModel } from '../types';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { EmbedResult } from './embed-result';\n\n/**\nEmbed a value using an embedding model. The type of the value is defined by the embedding model.\n\n@param model - The embedding model to use.\n@param value - The value that should be embedded.\n\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@returns A result object that contains the embedding, the value, and additional information.\n */\nexport async function embed<VALUE = string>({\n model: modelArg,\n value,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n experimental_telemetry: telemetry,\n}: {\n /**\nThe embedding model to use.\n */\n model: EmbeddingModel<VALUE>;\n\n /**\nThe value that should be embedded.\n */\n value: VALUE;\n\n /**\nMaximum number of retries per embedding model call. Set to 0 to disable retries.\n\n@default 2\n */\n maxRetries?: number;\n\n /**\nAbort signal.\n */\n abortSignal?: AbortSignal;\n\n /**\nAdditional headers to include in the request.\nOnly applicable for HTTP-based providers.\n */\n headers?: Record<string, string>;\n\n /**\n Additional provider-specific options. They are passed through\n to the provider from the AI SDK and enable provider-specific\n functionality that can be fully encapsulated in the provider.\n */\n providerOptions?: ProviderOptions;\n\n /**\n * Optional telemetry configuration (experimental).\n */\n experimental_telemetry?: TelemetrySettings;\n}): Promise<EmbedResult<VALUE>> {\n const model = resolveEmbeddingModel<VALUE>(modelArg);\n\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: model,\n telemetry,\n headers,\n settings: { maxRetries },\n });\n\n const tracer = getTracer(telemetry);\n\n return recordSpan({\n name: 'ai.embed',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: 'ai.embed', telemetry }),\n ...baseTelemetryAttributes,\n 'ai.value': { input: () => JSON.stringify(value) },\n },\n }),\n tracer,\n fn: async span => {\n const { embedding, usage, response, providerMetadata } = await retry(() =>\n // nested spans to align with the embedMany telemetry data:\n recordSpan({\n name: 'ai.embed.doEmbed',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.embed.doEmbed',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n 'ai.values': { input: () => [JSON.stringify(value)] },\n },\n }),\n tracer,\n fn: async doEmbedSpan => {\n const modelResponse = await model.doEmbed({\n values: [value],\n abortSignal,\n headers,\n providerOptions,\n });\n\n const embedding = modelResponse.embeddings[0];\n const usage = modelResponse.usage ?? { tokens: NaN };\n\n doEmbedSpan.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.embeddings': {\n output: () =>\n modelResponse.embeddings.map(embedding =>\n JSON.stringify(embedding),\n ),\n },\n 'ai.usage.tokens': usage.tokens,\n },\n }),\n );\n\n return {\n embedding,\n usage,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response,\n };\n },\n }),\n );\n\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.embedding': { output: () => JSON.stringify(embedding) },\n 'ai.usage.tokens': usage.tokens,\n },\n }),\n );\n\n return new DefaultEmbedResult({\n value,\n embedding,\n usage,\n providerMetadata,\n response,\n });\n },\n });\n}\n\nclass DefaultEmbedResult<VALUE> implements EmbedResult<VALUE> {\n readonly value: EmbedResult<VALUE>['value'];\n readonly embedding: EmbedResult<VALUE>['embedding'];\n readonly usage: EmbedResult<VALUE>['usage'];\n readonly providerMetadata: EmbedResult<VALUE>['providerMetadata'];\n readonly response: EmbedResult<VALUE>['response'];\n\n constructor(options: {\n value: EmbedResult<VALUE>['value'];\n embedding: EmbedResult<VALUE>['embedding'];\n usage: EmbedResult<VALUE>['usage'];\n providerMetadata?: EmbedResult<VALUE>['providerMetadata'];\n response?: EmbedResult<VALUE>['response'];\n }) {\n this.value = options.value;\n this.embedding = options.embedding;\n this.usage = options.usage;\n this.providerMetadata = options.providerMetadata;\n this.response = options.response;\n }\n}\n","/**\n * Splits an array into chunks of a specified size.\n *\n * @template T - The type of elements in the array.\n * @param {T[]} array - The array to split.\n * @param {number} chunkSize - The size of each chunk.\n * @returns {T[][]} - A new array containing the chunks.\n */\nexport function splitArray<T>(array: T[], chunkSize: number): T[][] {\n if (chunkSize <= 0) {\n throw new Error('chunkSize must be greater than 0');\n }\n\n const result = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n","import { ProviderOptions } from '@ai-sdk/provider-utils';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { splitArray } from '../util/split-array';\nimport { UnsupportedModelVersionError } from '../error/unsupported-model-version-error';\nimport { assembleOperationName } from '../telemetry/assemble-operation-name';\nimport { getBaseTelemetryAttributes } from '../telemetry/get-base-telemetry-attributes';\nimport { getTracer } from '../telemetry/get-tracer';\nimport { recordSpan } from '../telemetry/record-span';\nimport { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport { Embedding, EmbeddingModel, ProviderMetadata } from '../types';\nimport { resolveEmbeddingModel } from '../model/resolve-model';\nimport { EmbedManyResult } from './embed-many-result';\n\n/**\nEmbed several values using an embedding model. The type of the value is defined\nby the embedding model.\n\n`embedMany` automatically splits large requests into smaller chunks if the model\nhas a limit on how many embeddings can be generated in a single call.\n\n@param model - The embedding model to use.\n@param values - The values that should be embedded.\n\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@returns A result object that contains the embeddings, the value, and additional information.\n */\nexport async function embedMany<VALUE = string>({\n model: modelArg,\n values,\n maxParallelCalls = Infinity,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n providerOptions,\n experimental_telemetry: telemetry,\n}: {\n /**\nThe embedding model to use.\n */\n model: EmbeddingModel<VALUE>;\n\n /**\nThe values that should be embedded.\n */\n values: Array<VALUE>;\n\n /**\nMaximum number of retries per embedding model call. Set to 0 to disable retries.\n\n@default 2\n */\n maxRetries?: number;\n\n /**\nAbort signal.\n */\n abortSignal?: AbortSignal;\n\n /**\nAdditional headers to include in the request.\nOnly applicable for HTTP-based providers.\n */\n headers?: Record<string, string>;\n\n /**\n * Optional telemetry configuration (experimental).\n */\n experimental_telemetry?: TelemetrySettings;\n\n /**\n Additional provider-specific options. They are passed through\n to the provider from the AI SDK and enable provider-specific\n functionality that can be fully encapsulated in the provider.\n */\n providerOptions?: ProviderOptions;\n\n /**\n * Maximum number of concurrent requests.\n *\n * @default Infinity\n */\n maxParallelCalls?: number;\n}): Promise<EmbedManyResult<VALUE>> {\n const model = resolveEmbeddingModel<VALUE>(modelArg);\n\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { maxRetries },\n });\n\n const tracer = getTracer(telemetry);\n\n return recordSpan({\n name: 'ai.embedMany',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: 'ai.embedMany', telemetry }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n 'ai.values': {\n input: () => values.map(value => JSON.stringify(value)),\n },\n },\n }),\n tracer,\n fn: async span => {\n const [maxEmbeddingsPerCall, supportsParallelCalls] = await Promise.all([\n model.maxEmbeddingsPerCall,\n model.supportsParallelCalls,\n ]);\n\n // the model has not specified limits on\n // how many embeddings can be generated in a single call\n if (maxEmbeddingsPerCall == null || maxEmbeddingsPerCall === Infinity) {\n const { embeddings, usage, response, providerMetadata } = await retry(\n () => {\n // nested spans to align with the embedMany telemetry data:\n return recordSpan({\n name: 'ai.embedMany.doEmbed',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.embedMany.doEmbed',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n 'ai.values': {\n input: () => values.map(value => JSON.stringify(value)),\n },\n },\n }),\n tracer,\n fn: async doEmbedSpan => {\n const modelResponse = await model.doEmbed({\n values,\n abortSignal,\n headers,\n providerOptions,\n });\n\n const embeddings = modelResponse.embeddings;\n const usage = modelResponse.usage ?? { tokens: NaN };\n\n doEmbedSpan.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.embeddings': {\n output: () =>\n embeddings.map(embedding =>\n JSON.stringify(embedding),\n ),\n },\n 'ai.usage.tokens': usage.tokens,\n },\n }),\n );\n\n return {\n embeddings,\n usage,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response,\n };\n },\n });\n },\n );\n\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.embeddings': {\n output: () =>\n embeddings.map(embedding => JSON.stringify(embedding)),\n },\n 'ai.usage.tokens': usage.tokens,\n },\n }),\n );\n\n return new DefaultEmbedManyResult({\n values,\n embeddings,\n usage,\n providerMetadata,\n responses: [response],\n });\n }\n\n // split the values into chunks that are small enough for the model:\n const valueChunks = splitArray(values, maxEmbeddingsPerCall);\n\n // serially embed the chunks:\n const embeddings: Array<Embedding> = [];\n const responses: Array<\n | {\n headers?: Record<string, string>;\n body?: unknown;\n }\n | undefined\n > = [];\n let tokens = 0;\n let providerMetadata: ProviderMetadata | undefined;\n\n const parallelChunks = splitArray(\n valueChunks,\n supportsParallelCalls ? maxParallelCalls : 1,\n );\n\n for (const parallelChunk of parallelChunks) {\n const results = await Promise.all(\n parallelChunk.map(chunk => {\n return retry(() => {\n // nested spans to align with the embedMany telemetry data:\n return recordSpan({\n name: 'ai.embedMany.doEmbed',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.embedMany.doEmbed',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n 'ai.values': {\n input: () => chunk.map(value => JSON.stringify(value)),\n },\n },\n }),\n tracer,\n fn: async doEmbedSpan => {\n const modelResponse = await model.doEmbed({\n values: chunk,\n abortSignal,\n headers,\n providerOptions,\n });\n\n const embeddings = modelResponse.embeddings;\n const usage = modelResponse.usage ?? { tokens: NaN };\n\n doEmbedSpan.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.embeddings': {\n output: () =>\n embeddings.map(embedding =>\n JSON.stringify(embedding),\n ),\n },\n 'ai.usage.tokens': usage.tokens,\n },\n }),\n );\n\n return {\n embeddings,\n usage,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response,\n };\n },\n });\n });\n }),\n );\n\n for (const result of results) {\n embeddings.push(...result.embeddings);\n responses.push(result.response);\n tokens += result.usage.tokens;\n if (result.providerMetadata) {\n if (!providerMetadata) {\n providerMetadata = { ...result.providerMetadata };\n } else {\n for (const [providerName, metadata] of Object.entries(\n result.providerMetadata,\n )) {\n providerMetadata[providerName] = {\n ...(providerMetadata[providerName] ?? {}),\n ...metadata,\n };\n }\n }\n }\n }\n }\n\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.embeddings': {\n output: () =>\n embeddings.map(embedding => JSON.stringify(embedding)),\n },\n 'ai.usage.tokens': tokens,\n },\n }),\n );\n\n return new DefaultEmbedManyResult({\n values,\n embeddings,\n usage: { tokens },\n providerMetadata: providerMetadata,\n responses,\n });\n },\n });\n}\n\nclass DefaultEmbedManyResult<VALUE> implements EmbedManyResult<VALUE> {\n readonly values: EmbedManyResult<VALUE>['values'];\n readonly embeddings: EmbedManyResult<VALUE>['embeddings'];\n readonly usage: EmbedManyResult<VALUE>['usage'];\n readonly providerMetadata: EmbedManyResult<VALUE>['providerMetadata'];\n readonly responses: EmbedManyResult<VALUE>['responses'];\n\n constructor(options: {\n values: EmbedManyResult<VALUE>['values'];\n embeddings: EmbedManyResult<VALUE>['embeddings'];\n usage: EmbedManyResult<VALUE>['usage'];\n providerMetadata?: EmbedManyResult<VALUE>['providerMetadata'];\n responses?: EmbedManyResult<VALUE>['responses'];\n }) {\n this.values = options.values;\n this.embeddings = options.embeddings;\n this.usage = options.usage;\n this.providerMetadata = options.providerMetadata;\n this.responses = options.responses;\n }\n}\n","import { ImageModelV2, ImageModelV2ProviderMetadata } from '@ai-sdk/provider';\nimport { ProviderOptions } from '@ai-sdk/provider-utils';\nimport { NoImageGeneratedError } from '../error/no-image-generated-error';\nimport {\n detectMediaType,\n imageMediaTypeSignatures,\n} from '../util/detect-media-type';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { UnsupportedModelVersionError } from '../error/unsupported-model-version-error';\nimport {\n DefaultGeneratedFile,\n GeneratedFile,\n} from '../generate-text/generated-file';\nimport { ImageGenerationWarning } from '../types/image-model';\nimport { ImageModelResponseMetadata } from '../types/image-model-response-metadata';\nimport { GenerateImageResult } from './generate-image-result';\n\n/**\nGenerates images using an image model.\n\n@param model - The image model to use.\n@param prompt - The prompt that should be used to generate the image.\n@param n - Number of images to generate. Default: 1.\n@param size - Size of the images to generate. Must have the format `{width}x{height}`.\n@param aspectRatio - Aspect ratio of the images to generate. Must have the format `{width}:{height}`.\n@param seed - Seed for the image generation.\n@param providerOptions - Additional provider-specific options that are passed through to the provider\nas body parameters.\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@returns A result object that contains the generated images.\n */\nexport async function generateImage({\n model,\n prompt,\n n = 1,\n maxImagesPerCall,\n size,\n aspectRatio,\n seed,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n}: {\n /**\nThe image model to use.\n */\n model: ImageModelV2;\n\n /**\nThe prompt that should be used to generate the image.\n */\n prompt: string;\n\n /**\nNumber of images to generate.\n */\n n?: number;\n\n /**\nNumber of images to generate.\n */\n maxImagesPerCall?: number;\n\n /**\nSize of the images to generate. Must have the format `{width}x{height}`. If not provided, the default size will be used.\n */\n size?: `${number}x${number}`;\n\n /**\nAspect ratio of the images to generate. Must have the format `{width}:{height}`. If not provided, the default aspect ratio will be used.\n */\n aspectRatio?: `${number}:${number}`;\n\n /**\nSeed for the image generation. If not provided, the default seed will be used.\n */\n seed?: number;\n\n /**\nAdditional provider-specific options that are passed through to the provider\nas body parameters.\n\nThe outer record is keyed by the provider name, and the inner\nrecord is keyed by the provider-specific metadata key.\n```ts\n{\n \"openai\": {\n \"style\": \"vivid\"\n }\n}\n```\n */\n providerOptions?: ProviderOptions;\n\n /**\nMaximum number of retries per embedding model call. Set to 0 to disable retries.\n\n@default 2\n */\n maxRetries?: number;\n\n /**\nAbort signal.\n */\n abortSignal?: AbortSignal;\n\n /**\nAdditional headers to include in the request.\nOnly applicable for HTTP-based providers.\n */\n headers?: Record<string, string>;\n}): Promise<GenerateImageResult> {\n if (model.specificationVersion !== 'v2') {\n throw new UnsupportedModelVersionError({\n version: model.specificationVersion,\n provider: model.provider,\n modelId: model.modelId,\n });\n }\n\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n // default to 1 if the model has not specified limits on\n // how many images can be generated in a single call\n const maxImagesPerCallWithDefault =\n maxImagesPerCall ?? (await invokeModelMaxImagesPerCall(model)) ?? 1;\n\n // parallelize calls to the model:\n const callCount = Math.ceil(n / maxImagesPerCallWithDefault);\n const callImageCounts = Array.from({ length: callCount }, (_, i) => {\n if (i < callCount - 1) {\n return maxImagesPerCallWithDefault;\n }\n\n const remainder = n % maxImagesPerCallWithDefault;\n return remainder === 0 ? maxImagesPerCallWithDefault : remainder;\n });\n\n const results = await Promise.all(\n callImageCounts.map(async callImageCount =>\n retry(() =>\n model.doGenerate({\n prompt,\n n: callImageCount,\n abortSignal,\n headers,\n size,\n aspectRatio,\n seed,\n providerOptions: providerOptions ?? {},\n }),\n ),\n ),\n );\n\n // collect result images, warnings, and response metadata\n const images: Array<DefaultGeneratedFile> = [];\n const warnings: Array<ImageGenerationWarning> = [];\n const responses: Array<ImageModelResponseMetadata> = [];\n const providerMetadata: ImageModelV2ProviderMetadata = {};\n for (const result of results) {\n images.push(\n ...result.images.map(\n image =>\n new DefaultGeneratedFile({\n data: image,\n mediaType:\n detectMediaType({\n data: image,\n signatures: imageMediaTypeSignatures,\n }) ?? 'image/png',\n }),\n ),\n );\n warnings.push(...result.warnings);\n\n if (result.providerMetadata) {\n for (const [providerName, metadata] of Object.entries<{\n images: unknown;\n }>(result.providerMetadata)) {\n providerMetadata[providerName] ??= { images: [] };\n providerMetadata[providerName].images.push(\n ...result.providerMetadata[providerName].images,\n );\n }\n }\n\n responses.push(result.response);\n }\n\n if (!images.length) {\n throw new NoImageGeneratedError({ responses });\n }\n\n return new DefaultGenerateImageResult({\n images,\n warnings,\n responses,\n providerMetadata,\n });\n}\n\nclass DefaultGenerateImageResult implements GenerateImageResult {\n readonly images: Array<GeneratedFile>;\n readonly warnings: Array<ImageGenerationWarning>;\n readonly responses: Array<ImageModelResponseMetadata>;\n readonly providerMetadata: ImageModelV2ProviderMetadata;\n\n constructor(options: {\n images: Array<GeneratedFile>;\n warnings: Array<ImageGenerationWarning>;\n responses: Array<ImageModelResponseMetadata>;\n providerMetadata: ImageModelV2ProviderMetadata;\n }) {\n this.images = options.images;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = options.providerMetadata;\n }\n\n get image() {\n return this.images[0];\n }\n}\n\nasync function invokeModelMaxImagesPerCall(model: ImageModelV2) {\n const isFunction = model.maxImagesPerCall instanceof Function;\n\n if (!isFunction) {\n return model.maxImagesPerCall;\n }\n\n return model.maxImagesPerCall({\n modelId: model.modelId,\n });\n}\n","import { JSONValue } from '@ai-sdk/provider';\nimport {\n createIdGenerator,\n InferSchema,\n ProviderOptions,\n Schema,\n} from '@ai-sdk/provider-utils';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport { NoObjectGeneratedError } from '../error/no-object-generated-error';\nimport { extractContentText } from '../generate-text/extract-content-text';\nimport { resolveLanguageModel } from '../model/resolve-model';\nimport { CallSettings } from '../prompt/call-settings';\nimport { convertToLanguageModelPrompt } from '../prompt/convert-to-language-model-prompt';\nimport { prepareCallSettings } from '../prompt/prepare-call-settings';\nimport { Prompt } from '../prompt/prompt';\nimport { standardizePrompt } from '../prompt/standardize-prompt';\nimport { wrapGatewayError } from '../prompt/wrap-gateway-error';\nimport { assembleOperationName } from '../telemetry/assemble-operation-name';\nimport { getBaseTelemetryAttributes } from '../telemetry/get-base-telemetry-attributes';\nimport { getTracer } from '../telemetry/get-tracer';\nimport { recordSpan } from '../telemetry/record-span';\nimport { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';\nimport { stringifyForTelemetry } from '../telemetry/stringify-for-telemetry';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport {\n CallWarning,\n FinishReason,\n LanguageModel,\n} from '../types/language-model';\nimport { LanguageModelRequestMetadata } from '../types/language-model-request-metadata';\nimport { LanguageModelResponseMetadata } from '../types/language-model-response-metadata';\nimport { ProviderMetadata } from '../types/provider-metadata';\nimport { LanguageModelUsage } from '../types/usage';\nimport { prepareHeaders } from '../util/prepare-headers';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { GenerateObjectResult } from './generate-object-result';\nimport { getOutputStrategy } from './output-strategy';\nimport { parseAndValidateObjectResultWithRepair } from './parse-and-validate-object-result';\nimport { RepairTextFunction } from './repair-text';\nimport { validateObjectGenerationInput } from './validate-object-generation-input';\n\nconst originalGenerateId = createIdGenerator({ prefix: 'aiobj', size: 24 });\n\n/**\nGenerate a structured, typed object for a given prompt and schema using a language model.\n\nThis function does not stream the output. If you want to stream the output, use `streamObject` instead.\n\n@param model - The language model to use.\n@param tools - Tools that are accessible to and can be called by the model. The model needs to support calling tools.\n\n@param system - A system message that will be part of the prompt.\n@param prompt - A simple text prompt. You can either use `prompt` or `messages` but not both.\n@param messages - A list of messages. You can either use `prompt` or `messages` but not both.\n\n@param maxOutputTokens - Maximum number of tokens to generate.\n@param temperature - Temperature setting.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topP - Nucleus sampling.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topK - Only sample from the top K options for each subsequent token.\nUsed to remove \"long tail\" low probability responses.\nRecommended for advanced use cases only. You usually only need to use temperature.\n@param presencePenalty - Presence penalty setting.\nIt affects the likelihood of the model to repeat information that is already in the prompt.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param frequencyPenalty - Frequency penalty setting.\nIt affects the likelihood of the model to repeatedly use the same words or phrases.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param stopSequences - Stop sequences.\nIf set, the model will stop generating text when one of the stop sequences is generated.\n@param seed - The seed (integer) to use for random sampling.\nIf set and supported by the model, calls will generate deterministic results.\n\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@param schema - The schema of the object that the model should generate.\n@param schemaName - Optional name of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema name.\n@param schemaDescription - Optional description of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema description.\n\n@param output - The type of the output.\n\n- 'object': The output is an object.\n- 'array': The output is an array.\n- 'enum': The output is an enum.\n- 'no-schema': The output is not a schema.\n\n@param experimental_repairText - A function that attempts to repair the raw output of the model\nto enable JSON parsing.\n\n@param experimental_telemetry - Optional telemetry configuration (experimental).\n\n@param providerOptions - Additional provider-specific options. 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@returns\nA result object that contains the generated object, the finish reason, the token usage, and additional information.\n */\nexport async function generateObject<\n SCHEMA extends\n | z3.Schema\n | z4.core.$ZodType\n | Schema = z4.core.$ZodType<JSONValue>,\n OUTPUT extends\n | 'object'\n | 'array'\n | 'enum'\n | 'no-schema' = InferSchema<SCHEMA> extends string ? 'enum' : 'object',\n RESULT = OUTPUT extends 'array'\n ? Array<InferSchema<SCHEMA>>\n : InferSchema<SCHEMA>,\n>(\n options: Omit<CallSettings, 'stopSequences'> &\n Prompt &\n (OUTPUT extends 'enum'\n ? {\n /**\nThe enum values that the model should use.\n */\n enum: Array<RESULT>;\n mode?: 'json';\n output: 'enum';\n }\n : OUTPUT extends 'no-schema'\n ? {}\n : {\n /**\nThe schema of the object that the model should generate.\n */\n schema: SCHEMA;\n\n /**\nOptional name of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema name.\n */\n schemaName?: string;\n\n /**\nOptional description of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema description.\n */\n schemaDescription?: string;\n\n /**\nThe mode to use for object generation.\n\nThe schema is converted into a JSON schema and used in one of the following ways\n\n- 'auto': The provider will choose the best mode for the model.\n- 'tool': A tool with the JSON schema as parameters is provided and the provider is instructed to use it.\n- 'json': The JSON schema and an instruction are injected into the prompt. If the provider supports JSON mode, it is enabled. If the provider supports JSON grammars, the grammar is used.\n\nPlease note that most providers do not support all modes.\n\nDefault and recommended: 'auto' (best mode for the model).\n */\n mode?: 'auto' | 'json' | 'tool';\n }) & {\n output?: OUTPUT;\n\n /**\n The language model to use.\n */\n model: LanguageModel;\n /**\n A function that attempts to repair the raw output of the model\n to enable JSON parsing.\n */\n experimental_repairText?: RepairTextFunction;\n\n /**\n Optional telemetry configuration (experimental).\n */\n\n experimental_telemetry?: TelemetrySettings;\n\n /**\n Additional provider-specific options. They are passed through\n to the provider from the AI SDK and enable provider-specific\n functionality that can be fully encapsulated in the provider.\n */\n providerOptions?: ProviderOptions;\n\n /**\n * Internal. For test use only. May change without notice.\n */\n _internal?: {\n generateId?: () => string;\n currentDate?: () => Date;\n };\n },\n): Promise<GenerateObjectResult<RESULT>> {\n const {\n model: modelArg,\n output = 'object',\n system,\n prompt,\n messages,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n experimental_repairText: repairText,\n experimental_telemetry: telemetry,\n providerOptions,\n _internal: {\n generateId = originalGenerateId,\n currentDate = () => new Date(),\n } = {},\n ...settings\n } = options;\n\n const model = resolveLanguageModel(modelArg);\n\n const enumValues = 'enum' in options ? options.enum : undefined;\n const {\n schema: inputSchema,\n schemaDescription,\n schemaName,\n } = 'schema' in options ? options : {};\n\n validateObjectGenerationInput({\n output,\n schema: inputSchema,\n schemaName,\n schemaDescription,\n enumValues,\n });\n\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const outputStrategy = getOutputStrategy({\n output,\n schema: inputSchema,\n enumValues,\n });\n\n const callSettings = prepareCallSettings(settings);\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries },\n });\n\n const tracer = getTracer(telemetry);\n\n try {\n return await recordSpan({\n name: 'ai.generateObject',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.generateObject',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n 'ai.prompt': {\n input: () => JSON.stringify({ system, prompt, messages }),\n },\n 'ai.schema':\n outputStrategy.jsonSchema != null\n ? { input: () => JSON.stringify(outputStrategy.jsonSchema) }\n : undefined,\n 'ai.schema.name': schemaName,\n 'ai.schema.description': schemaDescription,\n 'ai.settings.output': outputStrategy.type,\n },\n }),\n tracer,\n fn: async span => {\n let result: string;\n let finishReason: FinishReason;\n let usage: LanguageModelUsage;\n let warnings: CallWarning[] | undefined;\n let response: LanguageModelResponseMetadata;\n let request: LanguageModelRequestMetadata;\n let resultProviderMetadata: ProviderMetadata | undefined;\n\n const standardizedPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n });\n\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: standardizedPrompt,\n supportedUrls: await model.supportedUrls,\n });\n\n const generateResult = await retry(() =>\n recordSpan({\n name: 'ai.generateObject.doGenerate',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.generateObject.doGenerate',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.prompt.messages': {\n input: () => stringifyForTelemetry(promptMessages),\n },\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.system': model.provider,\n 'gen_ai.request.model': model.modelId,\n 'gen_ai.request.frequency_penalty':\n callSettings.frequencyPenalty,\n 'gen_ai.request.max_tokens': callSettings.maxOutputTokens,\n 'gen_ai.request.presence_penalty': callSettings.presencePenalty,\n 'gen_ai.request.temperature': callSettings.temperature,\n 'gen_ai.request.top_k': callSettings.topK,\n 'gen_ai.request.top_p': callSettings.topP,\n },\n }),\n tracer,\n fn: async span => {\n const result = await model.doGenerate({\n responseFormat: {\n type: 'json',\n schema: outputStrategy.jsonSchema,\n name: schemaName,\n description: schemaDescription,\n },\n ...prepareCallSettings(settings),\n prompt: promptMessages,\n providerOptions,\n abortSignal,\n headers,\n });\n\n const responseData = {\n id: result.response?.id ?? generateId(),\n timestamp: result.response?.timestamp ?? currentDate(),\n modelId: result.response?.modelId ?? model.modelId,\n headers: result.response?.headers,\n body: result.response?.body,\n };\n\n const text = extractContentText(result.content);\n\n if (text === undefined) {\n throw new NoObjectGeneratedError({\n message:\n 'No object generated: the model did not return a response.',\n response: responseData,\n usage: result.usage,\n finishReason: result.finishReason,\n });\n }\n\n // Add response information to the span:\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.response.finishReason': result.finishReason,\n 'ai.response.object': { output: () => text },\n 'ai.response.id': responseData.id,\n 'ai.response.model': responseData.modelId,\n 'ai.response.timestamp':\n responseData.timestamp.toISOString(),\n 'ai.response.providerMetadata': JSON.stringify(\n result.providerMetadata,\n ),\n\n // TODO rename telemetry attributes to inputTokens and outputTokens\n 'ai.usage.promptTokens': result.usage.inputTokens,\n 'ai.usage.completionTokens': result.usage.outputTokens,\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.response.finish_reasons': [result.finishReason],\n 'gen_ai.response.id': responseData.id,\n 'gen_ai.response.model': responseData.modelId,\n 'gen_ai.usage.input_tokens': result.usage.inputTokens,\n 'gen_ai.usage.output_tokens': result.usage.outputTokens,\n },\n }),\n );\n\n return { ...result, objectText: text, responseData };\n },\n }),\n );\n\n result = generateResult.objectText;\n finishReason = generateResult.finishReason;\n usage = generateResult.usage;\n warnings = generateResult.warnings;\n resultProviderMetadata = generateResult.providerMetadata;\n request = generateResult.request ?? {};\n response = generateResult.responseData;\n\n const object = await parseAndValidateObjectResultWithRepair(\n result,\n outputStrategy,\n repairText,\n {\n response,\n usage,\n finishReason,\n },\n );\n\n // Add response information to the span:\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.response.finishReason': finishReason,\n 'ai.response.object': {\n output: () => JSON.stringify(object),\n },\n 'ai.response.providerMetadata': JSON.stringify(\n resultProviderMetadata,\n ),\n\n // TODO rename telemetry attributes to inputTokens and outputTokens\n 'ai.usage.promptTokens': usage.inputTokens,\n 'ai.usage.completionTokens': usage.outputTokens,\n },\n }),\n );\n\n return new DefaultGenerateObjectResult({\n object,\n finishReason,\n usage,\n warnings,\n request,\n response,\n providerMetadata: resultProviderMetadata,\n });\n },\n });\n } catch (error) {\n throw wrapGatewayError(error);\n }\n}\n\nclass DefaultGenerateObjectResult<T> implements GenerateObjectResult<T> {\n readonly object: GenerateObjectResult<T>['object'];\n readonly finishReason: GenerateObjectResult<T>['finishReason'];\n readonly usage: GenerateObjectResult<T>['usage'];\n readonly warnings: GenerateObjectResult<T>['warnings'];\n readonly providerMetadata: GenerateObjectResult<T>['providerMetadata'];\n readonly response: GenerateObjectResult<T>['response'];\n readonly request: GenerateObjectResult<T>['request'];\n\n constructor(options: {\n object: GenerateObjectResult<T>['object'];\n finishReason: GenerateObjectResult<T>['finishReason'];\n usage: GenerateObjectResult<T>['usage'];\n warnings: GenerateObjectResult<T>['warnings'];\n providerMetadata: GenerateObjectResult<T>['providerMetadata'];\n response: GenerateObjectResult<T>['response'];\n request: GenerateObjectResult<T>['request'];\n }) {\n this.object = options.object;\n this.finishReason = options.finishReason;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.response = options.response;\n this.request = options.request;\n }\n\n toJsonResponse(init?: ResponseInit): Response {\n return new Response(JSON.stringify(this.object), {\n status: init?.status ?? 200,\n headers: prepareHeaders(init?.headers, {\n 'content-type': 'application/json; charset=utf-8',\n }),\n });\n }\n}\n","import {\n isJSONArray,\n isJSONObject,\n JSONObject,\n JSONSchema7,\n JSONValue,\n TypeValidationError,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\nimport {\n asSchema,\n safeValidateTypes,\n Schema,\n ValidationResult,\n} from '@ai-sdk/provider-utils';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport { NoObjectGeneratedError } from '../error/no-object-generated-error';\nimport {\n AsyncIterableStream,\n createAsyncIterableStream,\n} from '../util/async-iterable-stream';\nimport { DeepPartial } from '../util/deep-partial';\nimport {\n FinishReason,\n LanguageModelResponseMetadata,\n LanguageModelUsage,\n} from '../types';\nimport { ObjectStreamPart } from './stream-object-result';\n\nexport interface OutputStrategy<PARTIAL, RESULT, ELEMENT_STREAM> {\n readonly type: 'object' | 'array' | 'enum' | 'no-schema';\n readonly jsonSchema: JSONSchema7 | undefined;\n\n validatePartialResult({\n value,\n textDelta,\n isFinalDelta,\n }: {\n value: JSONValue;\n textDelta: string;\n isFirstDelta: boolean;\n isFinalDelta: boolean;\n latestObject: PARTIAL | undefined;\n }): Promise<\n ValidationResult<{\n partial: PARTIAL;\n textDelta: string;\n }>\n >;\n validateFinalResult(\n value: JSONValue | undefined,\n context: {\n text: string;\n response: LanguageModelResponseMetadata;\n usage: LanguageModelUsage;\n },\n ): Promise<ValidationResult<RESULT>>;\n\n createElementStream(\n originalStream: ReadableStream<ObjectStreamPart<PARTIAL>>,\n ): ELEMENT_STREAM;\n}\n\nconst noSchemaOutputStrategy: OutputStrategy<JSONValue, JSONValue, never> = {\n type: 'no-schema',\n jsonSchema: undefined,\n\n async validatePartialResult({ value, textDelta }) {\n return { success: true, value: { partial: value, textDelta } };\n },\n\n async validateFinalResult(\n value: JSONValue | undefined,\n context: {\n text: string;\n response: LanguageModelResponseMetadata;\n usage: LanguageModelUsage;\n finishReason: FinishReason;\n },\n ): Promise<ValidationResult<JSONValue>> {\n return value === undefined\n ? {\n success: false,\n error: new NoObjectGeneratedError({\n message: 'No object generated: response did not match schema.',\n text: context.text,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason,\n }),\n }\n : { success: true, value };\n },\n\n createElementStream() {\n throw new UnsupportedFunctionalityError({\n functionality: 'element streams in no-schema mode',\n });\n },\n};\n\nconst objectOutputStrategy = <OBJECT>(\n schema: Schema<OBJECT>,\n): OutputStrategy<DeepPartial<OBJECT>, OBJECT, never> => ({\n type: 'object',\n jsonSchema: schema.jsonSchema,\n\n async validatePartialResult({ value, textDelta }) {\n return {\n success: true,\n value: {\n // Note: currently no validation of partial results:\n partial: value as DeepPartial<OBJECT>,\n textDelta,\n },\n };\n },\n\n async validateFinalResult(\n value: JSONValue | undefined,\n ): Promise<ValidationResult<OBJECT>> {\n return safeValidateTypes({ value, schema });\n },\n\n createElementStream() {\n throw new UnsupportedFunctionalityError({\n functionality: 'element streams in object mode',\n });\n },\n});\n\nconst arrayOutputStrategy = <ELEMENT>(\n schema: Schema<ELEMENT>,\n): OutputStrategy<ELEMENT[], ELEMENT[], AsyncIterableStream<ELEMENT>> => {\n // remove $schema from schema.jsonSchema:\n const { $schema, ...itemSchema } = schema.jsonSchema;\n\n return {\n type: 'enum',\n\n // wrap in object that contains array of elements, since most LLMs will not\n // be able to generate an array directly:\n // possible future optimization: use arrays directly when model supports grammar-guided generation\n jsonSchema: {\n $schema: 'http://json-schema.org/draft-07/schema#',\n type: 'object',\n properties: {\n elements: { type: 'array', items: itemSchema },\n },\n required: ['elements'],\n additionalProperties: false,\n },\n\n async validatePartialResult({\n value,\n latestObject,\n isFirstDelta,\n isFinalDelta,\n }) {\n // check that the value is an object that contains an array of elements:\n if (!isJSONObject(value) || !isJSONArray(value.elements)) {\n return {\n success: false,\n error: new TypeValidationError({\n value,\n cause: 'value must be an object that contains an array of elements',\n }),\n };\n }\n\n const inputArray = value.elements as Array<JSONObject>;\n const resultArray: Array<ELEMENT> = [];\n\n for (let i = 0; i < inputArray.length; i++) {\n const element = inputArray[i];\n const result = await safeValidateTypes({ value: element, schema });\n\n // special treatment for last processed element:\n // ignore parse or validation failures, since they indicate that the\n // last element is incomplete and should not be included in the result,\n // unless it is the final delta\n if (i === inputArray.length - 1 && !isFinalDelta) {\n continue;\n }\n\n if (!result.success) {\n return result;\n }\n\n resultArray.push(result.value);\n }\n\n // calculate delta:\n const publishedElementCount = latestObject?.length ?? 0;\n\n let textDelta = '';\n\n if (isFirstDelta) {\n textDelta += '[';\n }\n\n if (publishedElementCount > 0) {\n textDelta += ',';\n }\n\n textDelta += resultArray\n .slice(publishedElementCount) // only new elements\n .map(element => JSON.stringify(element))\n .join(',');\n\n if (isFinalDelta) {\n textDelta += ']';\n }\n\n return {\n success: true,\n value: {\n partial: resultArray,\n textDelta,\n },\n };\n },\n\n async validateFinalResult(\n value: JSONValue | undefined,\n ): Promise<ValidationResult<Array<ELEMENT>>> {\n // check that the value is an object that contains an array of elements:\n if (!isJSONObject(value) || !isJSONArray(value.elements)) {\n return {\n success: false,\n error: new TypeValidationError({\n value,\n cause: 'value must be an object that contains an array of elements',\n }),\n };\n }\n\n const inputArray = value.elements as Array<JSONObject>;\n\n // check that each element in the array is of the correct type:\n for (const element of inputArray) {\n const result = await safeValidateTypes({ value: element, schema });\n if (!result.success) {\n return result;\n }\n }\n\n return { success: true, value: inputArray as Array<ELEMENT> };\n },\n\n createElementStream(\n originalStream: ReadableStream<ObjectStreamPart<ELEMENT[]>>,\n ) {\n let publishedElements = 0;\n\n return createAsyncIterableStream(\n originalStream.pipeThrough(\n new TransformStream<ObjectStreamPart<ELEMENT[]>, ELEMENT>({\n transform(chunk, controller) {\n switch (chunk.type) {\n case 'object': {\n const array = chunk.object;\n\n // publish new elements one by one:\n for (\n ;\n publishedElements < array.length;\n publishedElements++\n ) {\n controller.enqueue(array[publishedElements]);\n }\n\n break;\n }\n\n case 'text-delta':\n case 'finish':\n case 'error': // suppress error (use onError instead)\n break;\n\n default: {\n const _exhaustiveCheck: never = chunk;\n throw new Error(\n `Unsupported chunk type: ${_exhaustiveCheck}`,\n );\n }\n }\n },\n }),\n ),\n );\n },\n };\n};\n\nconst enumOutputStrategy = <ENUM extends string>(\n enumValues: Array<ENUM>,\n): OutputStrategy<string, ENUM, never> => {\n return {\n type: 'enum',\n\n // wrap in object that contains result, since most LLMs will not\n // be able to generate an enum value directly:\n // possible future optimization: use enums directly when model supports top-level enums\n jsonSchema: {\n $schema: 'http://json-schema.org/draft-07/schema#',\n type: 'object',\n properties: {\n result: { type: 'string', enum: enumValues },\n },\n required: ['result'],\n additionalProperties: false,\n },\n\n async validateFinalResult(\n value: JSONValue | undefined,\n ): Promise<ValidationResult<ENUM>> {\n // check that the value is an object that contains an array of elements:\n if (!isJSONObject(value) || typeof value.result !== 'string') {\n return {\n success: false,\n error: new TypeValidationError({\n value,\n cause:\n 'value must be an object that contains a string in the \"result\" property.',\n }),\n };\n }\n\n const result = value.result as string;\n\n return enumValues.includes(result as ENUM)\n ? { success: true, value: result as ENUM }\n : {\n success: false,\n error: new TypeValidationError({\n value,\n cause: 'value must be a string in the enum',\n }),\n };\n },\n\n async validatePartialResult({ value, textDelta }) {\n if (!isJSONObject(value) || typeof value.result !== 'string') {\n return {\n success: false,\n error: new TypeValidationError({\n value,\n cause:\n 'value must be an object that contains a string in the \"result\" property.',\n }),\n };\n }\n\n const result = value.result as string;\n const possibleEnumValues = enumValues.filter(enumValue =>\n enumValue.startsWith(result),\n );\n\n if (value.result.length === 0 || possibleEnumValues.length === 0) {\n return {\n success: false,\n error: new TypeValidationError({\n value,\n cause: 'value must be a string in the enum',\n }),\n };\n }\n\n return {\n success: true,\n value: {\n partial:\n possibleEnumValues.length > 1 ? result : possibleEnumValues[0],\n textDelta,\n },\n };\n },\n\n createElementStream() {\n // no streaming in enum mode\n throw new UnsupportedFunctionalityError({\n functionality: 'element streams in enum mode',\n });\n },\n };\n};\n\nexport function getOutputStrategy<SCHEMA>({\n output,\n schema,\n enumValues,\n}: {\n output: 'object' | 'array' | 'enum' | 'no-schema';\n schema?:\n | z4.core.$ZodType<SCHEMA, any>\n | z3.Schema<SCHEMA, z3.ZodTypeDef, any>\n | Schema<SCHEMA>;\n enumValues?: Array<SCHEMA>;\n}): OutputStrategy<any, any, any> {\n switch (output) {\n case 'object':\n return objectOutputStrategy(asSchema(schema!));\n case 'array':\n return arrayOutputStrategy(asSchema(schema!));\n case 'enum':\n return enumOutputStrategy(enumValues! as Array<string>);\n case 'no-schema':\n return noSchemaOutputStrategy;\n default: {\n const _exhaustiveCheck: never = output;\n throw new Error(`Unsupported output: ${_exhaustiveCheck}`);\n }\n }\n}\n","import { JSONParseError, TypeValidationError } from '@ai-sdk/provider';\nimport { safeParseJSON } from '@ai-sdk/provider-utils';\nimport { NoObjectGeneratedError } from '../error/no-object-generated-error';\nimport type {\n FinishReason,\n LanguageModelResponseMetadata,\n LanguageModelUsage,\n} from '../types';\nimport type { OutputStrategy } from './output-strategy';\nimport { RepairTextFunction } from './repair-text';\n\n/**\n * Parses and validates a result string by parsing it as JSON and validating against the output strategy.\n *\n * @param result - The result string to parse and validate\n * @param outputStrategy - The output strategy containing validation logic\n * @param context - Additional context for error reporting\n * @returns The validated result\n * @throws NoObjectGeneratedError if parsing or validation fails\n */\nasync function parseAndValidateObjectResult<RESULT>(\n result: string,\n outputStrategy: OutputStrategy<any, RESULT, any>,\n context: {\n response: LanguageModelResponseMetadata;\n usage: LanguageModelUsage;\n finishReason: FinishReason;\n },\n): Promise<RESULT> {\n const parseResult = await safeParseJSON({ text: result });\n\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: 'No object generated: could not parse the response.',\n cause: parseResult.error,\n text: result,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason,\n });\n }\n\n const validationResult = await outputStrategy.validateFinalResult(\n parseResult.value,\n {\n text: result,\n response: context.response,\n usage: context.usage,\n },\n );\n\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: 'No object generated: response did not match schema.',\n cause: validationResult.error,\n text: result,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason,\n });\n }\n\n return validationResult.value;\n}\n\n/**\n * Parses and validates a result string by parsing it as JSON and validating against the output strategy.\n * If the result cannot be parsed, it attempts to repair the result using the repairText function.\n *\n * @param result - The result string to parse and validate\n * @param outputStrategy - The output strategy containing validation logic\n * @param repairText - A function that attempts to repair the result string\n * @param context - Additional context for error reporting\n * @returns The validated result\n * @throws NoObjectGeneratedError if parsing or validation fails\n */\nexport async function parseAndValidateObjectResultWithRepair<RESULT>(\n result: string,\n outputStrategy: OutputStrategy<any, RESULT, any>,\n repairText: RepairTextFunction | undefined,\n context: {\n response: LanguageModelResponseMetadata;\n usage: LanguageModelUsage;\n finishReason: FinishReason;\n },\n): Promise<RESULT> {\n try {\n return await parseAndValidateObjectResult(result, outputStrategy, context);\n } catch (error) {\n if (\n repairText != null &&\n NoObjectGeneratedError.isInstance(error) &&\n (JSONParseError.isInstance(error.cause) ||\n TypeValidationError.isInstance(error.cause))\n ) {\n const repairedText = await repairText({\n text: result,\n error: error.cause,\n });\n if (repairedText === null) {\n throw error;\n }\n return await parseAndValidateObjectResult(\n repairedText,\n outputStrategy,\n context,\n );\n }\n throw error;\n }\n}\n","import { Schema } from '@ai-sdk/provider-utils';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport { InvalidArgumentError } from '../error/invalid-argument-error';\n\nexport function validateObjectGenerationInput({\n output,\n schema,\n schemaName,\n schemaDescription,\n enumValues,\n}: {\n output?: 'object' | 'array' | 'enum' | 'no-schema';\n schema?: z4.core.$ZodType | z3.Schema<any, z3.ZodTypeDef, any> | Schema<any>;\n schemaName?: string;\n schemaDescription?: string;\n enumValues?: Array<unknown>;\n}) {\n if (\n output != null &&\n output !== 'object' &&\n output !== 'array' &&\n output !== 'enum' &&\n output !== 'no-schema'\n ) {\n throw new InvalidArgumentError({\n parameter: 'output',\n value: output,\n message: 'Invalid output type.',\n });\n }\n\n if (output === 'no-schema') {\n if (schema != null) {\n throw new InvalidArgumentError({\n parameter: 'schema',\n value: schema,\n message: 'Schema is not supported for no-schema output.',\n });\n }\n\n if (schemaDescription != null) {\n throw new InvalidArgumentError({\n parameter: 'schemaDescription',\n value: schemaDescription,\n message: 'Schema description is not supported for no-schema output.',\n });\n }\n\n if (schemaName != null) {\n throw new InvalidArgumentError({\n parameter: 'schemaName',\n value: schemaName,\n message: 'Schema name is not supported for no-schema output.',\n });\n }\n\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: 'enumValues',\n value: enumValues,\n message: 'Enum values are not supported for no-schema output.',\n });\n }\n }\n\n if (output === 'object') {\n if (schema == null) {\n throw new InvalidArgumentError({\n parameter: 'schema',\n value: schema,\n message: 'Schema is required for object output.',\n });\n }\n\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: 'enumValues',\n value: enumValues,\n message: 'Enum values are not supported for object output.',\n });\n }\n }\n\n if (output === 'array') {\n if (schema == null) {\n throw new InvalidArgumentError({\n parameter: 'schema',\n value: schema,\n message: 'Element schema is required for array output.',\n });\n }\n\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: 'enumValues',\n value: enumValues,\n message: 'Enum values are not supported for array output.',\n });\n }\n }\n\n if (output === 'enum') {\n if (schema != null) {\n throw new InvalidArgumentError({\n parameter: 'schema',\n value: schema,\n message: 'Schema is not supported for enum output.',\n });\n }\n\n if (schemaDescription != null) {\n throw new InvalidArgumentError({\n parameter: 'schemaDescription',\n value: schemaDescription,\n message: 'Schema description is not supported for enum output.',\n });\n }\n\n if (schemaName != null) {\n throw new InvalidArgumentError({\n parameter: 'schemaName',\n value: schemaName,\n message: 'Schema name is not supported for enum output.',\n });\n }\n\n if (enumValues == null) {\n throw new InvalidArgumentError({\n parameter: 'enumValues',\n value: enumValues,\n message: 'Enum values are required for enum output.',\n });\n }\n\n for (const value of enumValues) {\n if (typeof value !== 'string') {\n throw new InvalidArgumentError({\n parameter: 'enumValues',\n value,\n message: 'Enum values must be strings.',\n });\n }\n }\n }\n}\n","import {\n JSONValue,\n LanguageModelV2CallWarning,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2ProviderMetadata,\n} from '@ai-sdk/provider';\nimport {\n createIdGenerator,\n ProviderOptions,\n type InferSchema,\n type Schema,\n} from '@ai-sdk/provider-utils';\nimport { ServerResponse } from 'http';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport { resolveLanguageModel } from '../model/resolve-model';\nimport { CallSettings } from '../prompt/call-settings';\nimport { convertToLanguageModelPrompt } from '../prompt/convert-to-language-model-prompt';\nimport { prepareCallSettings } from '../prompt/prepare-call-settings';\nimport { Prompt } from '../prompt/prompt';\nimport { standardizePrompt } from '../prompt/standardize-prompt';\nimport { wrapGatewayError } from '../prompt/wrap-gateway-error';\nimport { assembleOperationName } from '../telemetry/assemble-operation-name';\nimport { getBaseTelemetryAttributes } from '../telemetry/get-base-telemetry-attributes';\nimport { getTracer } from '../telemetry/get-tracer';\nimport { recordSpan } from '../telemetry/record-span';\nimport { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';\nimport { stringifyForTelemetry } from '../telemetry/stringify-for-telemetry';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport { createTextStreamResponse } from '../text-stream/create-text-stream-response';\nimport { pipeTextStreamToResponse } from '../text-stream/pipe-text-stream-to-response';\nimport {\n CallWarning,\n FinishReason,\n LanguageModel,\n} from '../types/language-model';\nimport { LanguageModelRequestMetadata } from '../types/language-model-request-metadata';\nimport { LanguageModelResponseMetadata } from '../types/language-model-response-metadata';\nimport { ProviderMetadata } from '../types/provider-metadata';\nimport { LanguageModelUsage } from '../types/usage';\nimport { DeepPartial, isDeepEqualData, parsePartialJson } from '../util';\nimport {\n AsyncIterableStream,\n createAsyncIterableStream,\n} from '../util/async-iterable-stream';\nimport { createStitchableStream } from '../util/create-stitchable-stream';\nimport { DelayedPromise } from '../util/delayed-promise';\nimport { now as originalNow } from '../util/now';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { getOutputStrategy, OutputStrategy } from './output-strategy';\nimport { parseAndValidateObjectResultWithRepair } from './parse-and-validate-object-result';\nimport { RepairTextFunction } from './repair-text';\nimport { ObjectStreamPart, StreamObjectResult } from './stream-object-result';\nimport { validateObjectGenerationInput } from './validate-object-generation-input';\n\nconst originalGenerateId = createIdGenerator({ prefix: 'aiobj', size: 24 });\n\n/**\nCallback that is set using the `onError` option.\n\n@param event - The event that is passed to the callback.\n */\nexport type StreamObjectOnErrorCallback = (event: {\n error: unknown;\n}) => Promise<void> | void;\n\n/**\nCallback that is set using the `onFinish` option.\n\n@param event - The event that is passed to the callback.\n */\nexport type StreamObjectOnFinishCallback<RESULT> = (event: {\n /**\nThe token usage of the generated response.\n*/\n usage: LanguageModelUsage;\n\n /**\nThe generated object. Can be undefined if the final object does not match the schema.\n*/\n object: RESULT | undefined;\n\n /**\nOptional error object. This is e.g. a TypeValidationError when the final object does not match the schema.\n*/\n error: unknown | undefined;\n\n /**\nResponse metadata.\n */\n response: LanguageModelResponseMetadata;\n\n /**\nWarnings from the model provider (e.g. unsupported settings).\n*/\n warnings?: CallWarning[];\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 providerMetadata: ProviderMetadata | undefined;\n}) => Promise<void> | void;\n\n/**\nGenerate a structured, typed object for a given prompt and schema using a language model.\n\nThis function streams the output. If you do not want to stream the output, use `generateObject` instead.\n\n@param model - The language model to use.\n@param tools - Tools that are accessible to and can be called by the model. The model needs to support calling tools.\n\n@param system - A system message that will be part of the prompt.\n@param prompt - A simple text prompt. You can either use `prompt` or `messages` but not both.\n@param messages - A list of messages. You can either use `prompt` or `messages` but not both.\n\n@param maxOutputTokens - Maximum number of tokens to generate.\n@param temperature - Temperature setting.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topP - Nucleus sampling.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topK - Only sample from the top K options for each subsequent token.\nUsed to remove \"long tail\" low probability responses.\nRecommended for advanced use cases only. You usually only need to use temperature.\n@param presencePenalty - Presence penalty setting.\nIt affects the likelihood of the model to repeat information that is already in the prompt.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param frequencyPenalty - Frequency penalty setting.\nIt affects the likelihood of the model to repeatedly use the same words or phrases.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param stopSequences - Stop sequences.\nIf set, the model will stop generating text when one of the stop sequences is generated.\n@param seed - The seed (integer) to use for random sampling.\nIf set and supported by the model, calls will generate deterministic results.\n\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@param schema - The schema of the object that the model should generate.\n@param schemaName - Optional name of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema name.\n@param schemaDescription - Optional description of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema description.\n\n@param output - The type of the output.\n\n- 'object': The output is an object.\n- 'array': The output is an array.\n- 'enum': The output is an enum.\n- 'no-schema': The output is not a schema.\n\n@param experimental_telemetry - Optional telemetry configuration (experimental).\n\n@param providerOptions - Additional provider-specific options. 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@returns\nA result object for accessing the partial object stream and additional information.\n */\nexport function streamObject<\n SCHEMA extends\n | z3.Schema\n | z4.core.$ZodType\n | Schema = z4.core.$ZodType<JSONValue>,\n OUTPUT extends\n | 'object'\n | 'array'\n | 'enum'\n | 'no-schema' = InferSchema<SCHEMA> extends string ? 'enum' : 'object',\n RESULT = OUTPUT extends 'array'\n ? Array<InferSchema<SCHEMA>>\n : InferSchema<SCHEMA>,\n>(\n options: Omit<CallSettings, 'stopSequences'> &\n Prompt &\n (OUTPUT extends 'enum'\n ? {\n /**\nThe enum values that the model should use.\n */\n enum: Array<RESULT>;\n mode?: 'json';\n output: 'enum';\n }\n : OUTPUT extends 'no-schema'\n ? {}\n : {\n /**\nThe schema of the object that the model should generate.\n */\n schema: SCHEMA;\n\n /**\nOptional name of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema name.\n */\n schemaName?: string;\n\n /**\nOptional description of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema description.\n */\n schemaDescription?: string;\n\n /**\nThe mode to use for object generation.\n\nThe schema is converted into a JSON schema and used in one of the following ways\n\n- 'auto': The provider will choose the best mode for the model.\n- 'tool': A tool with the JSON schema as parameters is provided and the provider is instructed to use it.\n- 'json': The JSON schema and an instruction are injected into the prompt. If the provider supports JSON mode, it is enabled. If the provider supports JSON grammars, the grammar is used.\n\nPlease note that most providers do not support all modes.\n\nDefault and recommended: 'auto' (best mode for the model).\n */\n mode?: 'auto' | 'json' | 'tool';\n }) & {\n output?: OUTPUT;\n\n /**\nThe language model to use.\n */\n model: LanguageModel;\n\n /**\nA function that attempts to repair the raw output of the model\nto enable JSON parsing.\n */\n experimental_repairText?: RepairTextFunction;\n\n /**\nOptional telemetry configuration (experimental).\n */\n\n experimental_telemetry?: TelemetrySettings;\n\n /**\nAdditional provider-specific options. 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\n /**\nCallback that is invoked when an error occurs during streaming.\nYou can use it to log errors.\nThe stream processing will pause until the callback promise is resolved.\n */\n onError?: StreamObjectOnErrorCallback;\n\n /**\nCallback that is called when the LLM response and the final object validation are finished.\n*/\n onFinish?: StreamObjectOnFinishCallback<RESULT>;\n\n /**\n * Internal. For test use only. May change without notice.\n */\n _internal?: {\n generateId?: () => string;\n currentDate?: () => Date;\n now?: () => number;\n };\n },\n): StreamObjectResult<\n OUTPUT extends 'enum'\n ? string\n : OUTPUT extends 'array'\n ? RESULT\n : DeepPartial<RESULT>,\n OUTPUT extends 'array' ? RESULT : RESULT,\n OUTPUT extends 'array'\n ? RESULT extends Array<infer U>\n ? AsyncIterableStream<U>\n : never\n : never\n> {\n const {\n model,\n output = 'object',\n system,\n prompt,\n messages,\n maxRetries,\n abortSignal,\n headers,\n experimental_repairText: repairText,\n experimental_telemetry: telemetry,\n providerOptions,\n onError = ({ error }: { error: unknown }) => {\n console.error(error);\n },\n onFinish,\n _internal: {\n generateId = originalGenerateId,\n currentDate = () => new Date(),\n now = originalNow,\n } = {},\n ...settings\n } = options;\n\n const enumValues =\n 'enum' in options && options.enum ? options.enum : undefined;\n\n const {\n schema: inputSchema,\n schemaDescription,\n schemaName,\n } = 'schema' in options ? options : {};\n\n validateObjectGenerationInput({\n output,\n schema: inputSchema,\n schemaName,\n schemaDescription,\n enumValues,\n });\n\n const outputStrategy = getOutputStrategy({\n output,\n schema: inputSchema,\n enumValues,\n });\n\n return new DefaultStreamObjectResult({\n model,\n telemetry,\n headers,\n settings,\n maxRetries,\n abortSignal,\n outputStrategy,\n system,\n prompt,\n messages,\n schemaName,\n schemaDescription,\n providerOptions,\n repairText,\n onError,\n onFinish,\n generateId,\n currentDate,\n now,\n });\n}\n\nclass DefaultStreamObjectResult<PARTIAL, RESULT, ELEMENT_STREAM>\n implements StreamObjectResult<PARTIAL, RESULT, ELEMENT_STREAM>\n{\n private readonly _object = new DelayedPromise<RESULT>();\n private readonly _usage = new DelayedPromise<LanguageModelUsage>();\n private readonly _providerMetadata = new DelayedPromise<\n ProviderMetadata | undefined\n >();\n private readonly _warnings = new DelayedPromise<CallWarning[] | undefined>();\n private readonly _request =\n new DelayedPromise<LanguageModelRequestMetadata>();\n private readonly _response =\n new DelayedPromise<LanguageModelResponseMetadata>();\n private readonly _finishReason = new DelayedPromise<FinishReason>();\n\n private readonly baseStream: ReadableStream<ObjectStreamPart<PARTIAL>>;\n\n private readonly outputStrategy: OutputStrategy<\n PARTIAL,\n RESULT,\n ELEMENT_STREAM\n >;\n\n constructor({\n model: modelArg,\n headers,\n telemetry,\n settings,\n maxRetries: maxRetriesArg,\n abortSignal,\n outputStrategy,\n system,\n prompt,\n messages,\n schemaName,\n schemaDescription,\n providerOptions,\n repairText,\n onError,\n onFinish,\n generateId,\n currentDate,\n now,\n }: {\n model: LanguageModel;\n telemetry: TelemetrySettings | undefined;\n headers: Record<string, string | undefined> | undefined;\n settings: Omit<CallSettings, 'abortSignal' | 'headers'>;\n maxRetries: number | undefined;\n abortSignal: AbortSignal | undefined;\n outputStrategy: OutputStrategy<PARTIAL, RESULT, ELEMENT_STREAM>;\n system: Prompt['system'];\n prompt: Prompt['prompt'];\n messages: Prompt['messages'];\n schemaName: string | undefined;\n schemaDescription: string | undefined;\n providerOptions: ProviderOptions | undefined;\n repairText: RepairTextFunction | undefined;\n onError: StreamObjectOnErrorCallback;\n onFinish: StreamObjectOnFinishCallback<RESULT> | undefined;\n generateId: () => string;\n currentDate: () => Date;\n now: () => number;\n }) {\n const model = resolveLanguageModel(modelArg);\n\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const callSettings = prepareCallSettings(settings);\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries },\n });\n\n const tracer = getTracer(telemetry);\n const self = this;\n\n const stitchableStream =\n createStitchableStream<ObjectStreamPart<PARTIAL>>();\n\n const eventProcessor = new TransformStream<\n ObjectStreamPart<PARTIAL>,\n ObjectStreamPart<PARTIAL>\n >({\n transform(chunk, controller) {\n controller.enqueue(chunk);\n\n if (chunk.type === 'error') {\n onError({ error: wrapGatewayError(chunk.error) });\n }\n },\n });\n\n this.baseStream = stitchableStream.stream.pipeThrough(eventProcessor);\n\n recordSpan({\n name: 'ai.streamObject',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.streamObject',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n 'ai.prompt': {\n input: () => JSON.stringify({ system, prompt, messages }),\n },\n 'ai.schema':\n outputStrategy.jsonSchema != null\n ? { input: () => JSON.stringify(outputStrategy.jsonSchema) }\n : undefined,\n 'ai.schema.name': schemaName,\n 'ai.schema.description': schemaDescription,\n 'ai.settings.output': outputStrategy.type,\n },\n }),\n tracer,\n endWhenDone: false,\n fn: async rootSpan => {\n const standardizedPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n });\n\n const callOptions = {\n responseFormat: {\n type: 'json' as const,\n schema: outputStrategy.jsonSchema,\n name: schemaName,\n description: schemaDescription,\n },\n ...prepareCallSettings(settings),\n prompt: await convertToLanguageModelPrompt({\n prompt: standardizedPrompt,\n supportedUrls: await model.supportedUrls,\n }),\n providerOptions,\n abortSignal,\n headers,\n includeRawChunks: false,\n };\n\n const transformer: Transformer<\n LanguageModelV2StreamPart,\n ObjectStreamInputPart\n > = {\n transform: (chunk, controller) => {\n switch (chunk.type) {\n case 'text-delta':\n controller.enqueue(chunk.delta);\n break;\n case 'response-metadata':\n case 'finish':\n case 'error':\n controller.enqueue(chunk);\n break;\n }\n },\n };\n\n const {\n result: { stream, response, request },\n doStreamSpan,\n startTimestampMs,\n } = await retry(() =>\n recordSpan({\n name: 'ai.streamObject.doStream',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.streamObject.doStream',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.prompt.messages': {\n input: () => stringifyForTelemetry(callOptions.prompt),\n },\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.system': model.provider,\n 'gen_ai.request.model': model.modelId,\n 'gen_ai.request.frequency_penalty':\n callSettings.frequencyPenalty,\n 'gen_ai.request.max_tokens': callSettings.maxOutputTokens,\n 'gen_ai.request.presence_penalty': callSettings.presencePenalty,\n 'gen_ai.request.temperature': callSettings.temperature,\n 'gen_ai.request.top_k': callSettings.topK,\n 'gen_ai.request.top_p': callSettings.topP,\n },\n }),\n tracer,\n endWhenDone: false,\n fn: async doStreamSpan => ({\n startTimestampMs: now(),\n doStreamSpan,\n result: await model.doStream(callOptions),\n }),\n }),\n );\n\n self._request.resolve(request ?? {});\n\n // store information for onFinish callback:\n let warnings: LanguageModelV2CallWarning[] | undefined;\n let usage: LanguageModelUsage = {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n };\n let finishReason: LanguageModelV2FinishReason | undefined;\n let providerMetadata: ProviderMetadata | undefined;\n let object: RESULT | undefined;\n let error: unknown | undefined;\n\n // pipe chunks through a transformation stream that extracts metadata:\n let accumulatedText = '';\n let textDelta = '';\n let fullResponse: {\n id: string;\n timestamp: Date;\n modelId: string;\n } = {\n id: generateId(),\n timestamp: currentDate(),\n modelId: model.modelId,\n };\n\n // Keep track of raw parse result before type validation, since e.g. Zod might\n // change the object by mapping properties.\n let latestObjectJson: JSONValue | undefined = undefined;\n let latestObject: PARTIAL | undefined = undefined;\n let isFirstChunk = true;\n let isFirstDelta = true;\n\n const transformedStream = stream\n .pipeThrough(new TransformStream(transformer))\n .pipeThrough(\n new TransformStream<\n string | ObjectStreamInputPart,\n ObjectStreamPart<PARTIAL>\n >({\n async transform(chunk, controller): Promise<void> {\n if (\n typeof chunk === 'object' &&\n chunk.type === 'stream-start'\n ) {\n warnings = chunk.warnings;\n return; // stream start chunks are sent immediately and do not count as first chunk\n }\n\n // Telemetry event for first chunk:\n if (isFirstChunk) {\n const msToFirstChunk = now() - startTimestampMs;\n\n isFirstChunk = false;\n\n doStreamSpan.addEvent('ai.stream.firstChunk', {\n 'ai.stream.msToFirstChunk': msToFirstChunk,\n });\n\n doStreamSpan.setAttributes({\n 'ai.stream.msToFirstChunk': msToFirstChunk,\n });\n }\n\n // process partial text chunks\n if (typeof chunk === 'string') {\n accumulatedText += chunk;\n textDelta += chunk;\n\n const { value: currentObjectJson, state: parseState } =\n await parsePartialJson(accumulatedText);\n\n if (\n currentObjectJson !== undefined &&\n !isDeepEqualData(latestObjectJson, currentObjectJson)\n ) {\n const validationResult =\n await outputStrategy.validatePartialResult({\n value: currentObjectJson,\n textDelta,\n latestObject,\n isFirstDelta,\n isFinalDelta: parseState === 'successful-parse',\n });\n\n if (\n validationResult.success &&\n !isDeepEqualData(\n latestObject,\n validationResult.value.partial,\n )\n ) {\n // inside inner check to correctly parse the final element in array mode:\n latestObjectJson = currentObjectJson;\n latestObject = validationResult.value.partial;\n\n controller.enqueue({\n type: 'object',\n object: latestObject,\n });\n\n controller.enqueue({\n type: 'text-delta',\n textDelta: validationResult.value.textDelta,\n });\n\n textDelta = '';\n isFirstDelta = false;\n }\n }\n\n return;\n }\n\n switch (chunk.type) {\n case 'response-metadata': {\n fullResponse = {\n id: chunk.id ?? fullResponse.id,\n timestamp: chunk.timestamp ?? fullResponse.timestamp,\n modelId: chunk.modelId ?? fullResponse.modelId,\n };\n break;\n }\n\n case 'finish': {\n // send final text delta:\n if (textDelta !== '') {\n controller.enqueue({ type: 'text-delta', textDelta });\n }\n\n // store finish reason for telemetry:\n finishReason = chunk.finishReason;\n\n // store usage and metadata for promises and onFinish callback:\n usage = chunk.usage;\n providerMetadata = chunk.providerMetadata;\n\n controller.enqueue({\n ...chunk,\n usage,\n response: fullResponse,\n });\n\n // resolve promises that can be resolved now:\n self._usage.resolve(usage);\n self._providerMetadata.resolve(providerMetadata);\n self._response.resolve({\n ...fullResponse,\n headers: response?.headers,\n });\n self._finishReason.resolve(finishReason ?? 'unknown');\n\n try {\n object = await parseAndValidateObjectResultWithRepair(\n accumulatedText,\n outputStrategy,\n repairText,\n {\n response: fullResponse,\n usage,\n finishReason,\n },\n );\n self._object.resolve(object);\n } catch (e) {\n error = e;\n self._object.reject(e);\n }\n break;\n }\n\n default: {\n controller.enqueue(chunk);\n break;\n }\n }\n },\n\n // invoke onFinish callback and resolve toolResults promise when the stream is about to close:\n async flush(controller) {\n try {\n const finalUsage = usage ?? {\n promptTokens: NaN,\n completionTokens: NaN,\n totalTokens: NaN,\n };\n\n doStreamSpan.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.response.finishReason': finishReason,\n 'ai.response.object': {\n output: () => JSON.stringify(object),\n },\n 'ai.response.id': fullResponse.id,\n 'ai.response.model': fullResponse.modelId,\n 'ai.response.timestamp':\n fullResponse.timestamp.toISOString(),\n 'ai.response.providerMetadata':\n JSON.stringify(providerMetadata),\n\n 'ai.usage.inputTokens': finalUsage.inputTokens,\n 'ai.usage.outputTokens': finalUsage.outputTokens,\n 'ai.usage.totalTokens': finalUsage.totalTokens,\n 'ai.usage.reasoningTokens': finalUsage.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n finalUsage.cachedInputTokens,\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.response.finish_reasons': [finishReason],\n 'gen_ai.response.id': fullResponse.id,\n 'gen_ai.response.model': fullResponse.modelId,\n 'gen_ai.usage.input_tokens': finalUsage.inputTokens,\n 'gen_ai.usage.output_tokens': finalUsage.outputTokens,\n },\n }),\n );\n\n // finish doStreamSpan before other operations for correct timing:\n doStreamSpan.end();\n\n // Add response information to the root span:\n rootSpan.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.usage.inputTokens': finalUsage.inputTokens,\n 'ai.usage.outputTokens': finalUsage.outputTokens,\n 'ai.usage.totalTokens': finalUsage.totalTokens,\n 'ai.usage.reasoningTokens': finalUsage.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n finalUsage.cachedInputTokens,\n 'ai.response.object': {\n output: () => JSON.stringify(object),\n },\n 'ai.response.providerMetadata':\n JSON.stringify(providerMetadata),\n },\n }),\n );\n\n // call onFinish callback:\n await onFinish?.({\n usage: finalUsage,\n object,\n error,\n response: {\n ...fullResponse,\n headers: response?.headers,\n },\n warnings,\n providerMetadata,\n });\n } catch (error) {\n controller.enqueue({ type: 'error', error });\n } finally {\n rootSpan.end();\n }\n },\n }),\n );\n\n stitchableStream.addStream(transformedStream);\n },\n })\n .catch(error => {\n // add an empty stream with an error to break the stream:\n stitchableStream.addStream(\n new ReadableStream({\n start(controller) {\n controller.enqueue({ type: 'error', error });\n controller.close();\n },\n }),\n );\n })\n .finally(() => {\n stitchableStream.close();\n });\n\n this.outputStrategy = outputStrategy;\n }\n\n get object() {\n return this._object.promise;\n }\n\n get usage() {\n return this._usage.promise;\n }\n\n get providerMetadata() {\n return this._providerMetadata.promise;\n }\n\n get warnings() {\n return this._warnings.promise;\n }\n\n get request() {\n return this._request.promise;\n }\n\n get response() {\n return this._response.promise;\n }\n\n get finishReason() {\n return this._finishReason.promise;\n }\n\n get partialObjectStream(): AsyncIterableStream<PARTIAL> {\n return createAsyncIterableStream(\n this.baseStream.pipeThrough(\n new TransformStream<ObjectStreamPart<PARTIAL>, PARTIAL>({\n transform(chunk, controller) {\n switch (chunk.type) {\n case 'object':\n controller.enqueue(chunk.object);\n break;\n\n case 'text-delta':\n case 'finish':\n case 'error': // suppress error (use onError instead)\n break;\n\n default: {\n const _exhaustiveCheck: never = chunk;\n throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);\n }\n }\n },\n }),\n ),\n );\n }\n\n get elementStream(): ELEMENT_STREAM {\n return this.outputStrategy.createElementStream(this.baseStream);\n }\n\n get textStream(): AsyncIterableStream<string> {\n return createAsyncIterableStream(\n this.baseStream.pipeThrough(\n new TransformStream<ObjectStreamPart<PARTIAL>, string>({\n transform(chunk, controller) {\n switch (chunk.type) {\n case 'text-delta':\n controller.enqueue(chunk.textDelta);\n break;\n\n case 'object':\n case 'finish':\n case 'error': // suppress error (use onError instead)\n break;\n\n default: {\n const _exhaustiveCheck: never = chunk;\n throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);\n }\n }\n },\n }),\n ),\n );\n }\n\n get fullStream(): AsyncIterableStream<ObjectStreamPart<PARTIAL>> {\n return createAsyncIterableStream(this.baseStream);\n }\n\n pipeTextStreamToResponse(response: ServerResponse, init?: ResponseInit) {\n pipeTextStreamToResponse({\n response,\n textStream: this.textStream,\n ...init,\n });\n }\n\n toTextStreamResponse(init?: ResponseInit): Response {\n return createTextStreamResponse({\n textStream: this.textStream,\n ...init,\n });\n }\n}\n\nexport type ObjectStreamInputPart =\n | string\n | {\n type: 'stream-start';\n warnings: LanguageModelV2CallWarning[];\n }\n | {\n type: 'error';\n error: unknown;\n }\n | {\n type: 'response-metadata';\n id?: string;\n timestamp?: Date;\n modelId?: string;\n }\n | {\n type: 'finish';\n finishReason: LanguageModelV2FinishReason;\n usage: LanguageModelV2Usage;\n providerMetadata?: SharedV2ProviderMetadata;\n };\n","import { InvalidArgumentError } from '../error/invalid-argument-error';\n\n/**\n * Calculates the cosine similarity between two vectors. This is a useful metric for\n * comparing the similarity of two vectors such as embeddings.\n *\n * @param vector1 - The first vector.\n * @param vector2 - The second vector.\n *\n * @returns The cosine similarity between vector1 and vector2.\n * @returns 0 if either vector is the zero vector.\n *\n * @throws {InvalidArgumentError} If the vectors do not have the same length.\n */\nexport function cosineSimilarity(vector1: number[], vector2: number[]): number {\n if (vector1.length !== vector2.length) {\n throw new InvalidArgumentError({\n parameter: 'vector1,vector2',\n value: { vector1Length: vector1.length, vector2Length: vector2.length },\n message: `Vectors must have the same length`,\n });\n }\n\n const n = vector1.length;\n\n if (n === 0) {\n return 0; // Return 0 for empty vectors if no error is thrown\n }\n\n let magnitudeSquared1 = 0;\n let magnitudeSquared2 = 0;\n let dotProduct = 0;\n\n for (let i = 0; i < n; i++) {\n const value1 = vector1[i];\n const value2 = vector2[i];\n\n magnitudeSquared1 += value1 * value1;\n magnitudeSquared2 += value2 * value2;\n dotProduct += value1 * value2;\n }\n\n return magnitudeSquared1 === 0 || magnitudeSquared2 === 0\n ? 0\n : dotProduct /\n (Math.sqrt(magnitudeSquared1) * Math.sqrt(magnitudeSquared2));\n}\n","/**\n * Converts a data URL of type text/* to a text string.\n */\nexport function getTextFromDataUrl(dataUrl: string): string {\n const [header, base64Content] = dataUrl.split(',');\n const mediaType = header.split(';')[0].split(':')[1];\n\n if (mediaType == null || base64Content == null) {\n throw new Error('Invalid data URL format');\n }\n\n try {\n return window.atob(base64Content);\n } catch (error) {\n throw new Error(`Error decoding data URL`);\n }\n}\n","/**\n * Performs a deep-equal comparison of two parsed JSON objects.\n *\n * @param {any} obj1 - The first object to compare.\n * @param {any} obj2 - The second object to compare.\n * @returns {boolean} - Returns true if the two objects are deeply equal, false otherwise.\n */\nexport function isDeepEqualData(obj1: any, obj2: any): boolean {\n // Check for strict equality first\n if (obj1 === obj2) return true;\n\n // Check if either is null or undefined\n if (obj1 == null || obj2 == null) return false;\n\n // Check if both are objects\n if (typeof obj1 !== 'object' && typeof obj2 !== 'object')\n return obj1 === obj2;\n\n // If they are not strictly equal, they both need to be Objects\n if (obj1.constructor !== obj2.constructor) return false;\n\n // Special handling for Date objects\n if (obj1 instanceof Date && obj2 instanceof Date) {\n return obj1.getTime() === obj2.getTime();\n }\n\n // Handle arrays: compare length and then perform a recursive deep comparison on each item\n if (Array.isArray(obj1)) {\n if (obj1.length !== obj2.length) return false;\n for (let i = 0; i < obj1.length; i++) {\n if (!isDeepEqualData(obj1[i], obj2[i])) return false;\n }\n return true; // All array elements matched\n }\n\n // Compare the set of keys in each object\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length) return false;\n\n // Check each key-value pair recursively\n for (const key of keys1) {\n if (!keys2.includes(key)) return false;\n if (!isDeepEqualData(obj1[key], obj2[key])) return false;\n }\n\n return true; // All keys and values matched\n}\n","import { Job } from './job';\n\nexport class SerialJobExecutor {\n private queue: Array<Job> = [];\n private isProcessing = false;\n\n private async processQueue() {\n if (this.isProcessing) {\n return;\n }\n\n this.isProcessing = true;\n\n while (this.queue.length > 0) {\n await this.queue[0]();\n this.queue.shift();\n }\n\n this.isProcessing = false;\n }\n\n async run(job: Job): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.queue.push(async () => {\n try {\n await job();\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n\n void this.processQueue();\n });\n }\n}\n","import { delay as delayFunction } from '@ai-sdk/provider-utils';\n\n/**\n * Creates a ReadableStream that emits the provided values with an optional delay between each value.\n *\n * @param options - The configuration options\n * @param options.chunks - Array of values to be emitted by the stream\n * @param options.initialDelayInMs - Optional initial delay in milliseconds before emitting the first value (default: 0). Can be set to `null` to skip the initial delay. The difference between `initialDelayInMs: null` and `initialDelayInMs: 0` is that `initialDelayInMs: null` will emit the values without any delay, while `initialDelayInMs: 0` will emit the values with a delay of 0 milliseconds.\n * @param options.chunkDelayInMs - Optional delay in milliseconds between emitting each value (default: 0). Can be set to `null` to skip the delay. The difference between `chunkDelayInMs: null` and `chunkDelayInMs: 0` is that `chunkDelayInMs: null` will emit the values without any delay, while `chunkDelayInMs: 0` will emit the values with a delay of 0 milliseconds.\n * @returns A ReadableStream that emits the provided values\n */\nexport function simulateReadableStream<T>({\n chunks,\n initialDelayInMs = 0,\n chunkDelayInMs = 0,\n _internal,\n}: {\n chunks: T[];\n initialDelayInMs?: number | null;\n chunkDelayInMs?: number | null;\n _internal?: {\n delay?: (ms: number | null) => Promise<void>;\n };\n}): ReadableStream<T> {\n const delay = _internal?.delay ?? delayFunction;\n\n let index = 0;\n\n return new ReadableStream({\n async pull(controller) {\n if (index < chunks.length) {\n await delay(index === 0 ? initialDelayInMs : chunkDelayInMs);\n controller.enqueue(chunks[index++]);\n } else {\n controller.close();\n }\n },\n });\n}\n","import { AISDKError } from '@ai-sdk/provider';\nimport { SpeechModelResponseMetadata } from '../types/speech-model-response-metadata';\n\n/**\nError that is thrown when no speech audio was generated.\n */\nexport class NoSpeechGeneratedError extends AISDKError {\n readonly responses: Array<SpeechModelResponseMetadata>;\n\n constructor(options: { responses: Array<SpeechModelResponseMetadata> }) {\n super({\n name: 'AI_NoSpeechGeneratedError',\n message: 'No speech audio generated.',\n });\n\n this.responses = options.responses;\n }\n}\n","import {\n GeneratedFile,\n DefaultGeneratedFile,\n} from '../generate-text/generated-file';\n\n/**\n * A generated audio file.\n */\nexport interface GeneratedAudioFile extends GeneratedFile {\n /**\n * Audio format of the file (e.g., 'mp3', 'wav', etc.)\n */\n readonly format: string;\n}\n\nexport class DefaultGeneratedAudioFile\n extends DefaultGeneratedFile\n implements GeneratedAudioFile\n{\n readonly format: string;\n\n constructor({\n data,\n mediaType,\n }: {\n data: string | Uint8Array;\n mediaType: string;\n }) {\n super({ data, mediaType });\n let format = 'mp3';\n\n // If format is not provided, try to determine it from the media type\n if (mediaType) {\n const mediaTypeParts = mediaType.split('/');\n\n if (mediaTypeParts.length === 2) {\n // Handle special cases for audio formats\n if (mediaType !== 'audio/mpeg') {\n format = mediaTypeParts[1];\n }\n }\n }\n\n if (!format) {\n // TODO this should be an AI SDK error\n throw new Error(\n 'Audio format must be provided or determinable from media type',\n );\n }\n\n this.format = format;\n }\n}\n\nexport class DefaultGeneratedAudioFileWithType extends DefaultGeneratedAudioFile {\n readonly type = 'audio';\n\n constructor(options: {\n data: string | Uint8Array;\n mediaType: string;\n format: string;\n }) {\n super(options);\n }\n}\n","import { JSONValue, SpeechModelV2 } from '@ai-sdk/provider';\nimport { ProviderOptions } from '@ai-sdk/provider-utils';\nimport { NoSpeechGeneratedError } from '../error/no-speech-generated-error';\nimport {\n audioMediaTypeSignatures,\n detectMediaType,\n} from '../util/detect-media-type';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { UnsupportedModelVersionError } from '../error/unsupported-model-version-error';\nimport { SpeechWarning } from '../types/speech-model';\nimport { SpeechModelResponseMetadata } from '../types/speech-model-response-metadata';\nimport { SpeechResult } from './generate-speech-result';\nimport {\n DefaultGeneratedAudioFile,\n GeneratedAudioFile,\n} from './generated-audio-file';\n\n/**\nGenerates speech audio using a speech model.\n\n@param model - The speech model to use.\n@param text - The text to convert to speech.\n@param voice - The voice to use for speech generation.\n@param outputFormat - The output format to use for speech generation e.g. \"mp3\", \"wav\", etc.\n@param instructions - Instructions for the speech generation e.g. \"Speak in a slow and steady tone\".\n@param speed - The speed of the speech generation.\n@param providerOptions - Additional provider-specific options that are passed through to the provider\nas body parameters.\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@returns A result object that contains the generated audio data.\n */\nexport async function generateSpeech({\n model,\n text,\n voice,\n outputFormat,\n instructions,\n speed,\n language,\n providerOptions = {},\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n}: {\n /**\nThe speech model to use.\n */\n model: SpeechModelV2;\n\n /**\nThe text to convert to speech.\n */\n text: string;\n\n /**\nThe voice to use for speech generation.\n */\n voice?: string;\n\n /**\n * The desired output format for the audio e.g. \"mp3\", \"wav\", etc.\n */\n outputFormat?: 'mp3' | 'wav' | (string & {});\n\n /**\n Instructions for the speech generation e.g. \"Speak in a slow and steady tone\".\n */\n instructions?: string;\n\n /**\n The speed of the speech generation.\n */\n speed?: number;\n\n /**\n The language for speech generation. This should be an ISO 639-1 language code (e.g. \"en\", \"es\", \"fr\")\n or \"auto\" for automatic language detection. Provider support varies.\n */\n language?: string;\n\n /**\nAdditional provider-specific options that are passed through to the provider\nas body parameters.\n\nThe outer record is keyed by the provider name, and the inner\nrecord is keyed by the provider-specific metadata key.\n```ts\n{\n \"openai\": {}\n}\n```\n */\n providerOptions?: ProviderOptions;\n\n /**\nMaximum number of retries per speech model call. Set to 0 to disable retries.\n\n@default 2\n */\n maxRetries?: number;\n\n /**\nAbort signal.\n */\n abortSignal?: AbortSignal;\n\n /**\nAdditional headers to include in the request.\nOnly applicable for HTTP-based providers.\n */\n headers?: Record<string, string>;\n}): Promise<SpeechResult> {\n if (model.specificationVersion !== 'v2') {\n throw new UnsupportedModelVersionError({\n version: model.specificationVersion,\n provider: model.provider,\n modelId: model.modelId,\n });\n }\n\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const result = await retry(() =>\n model.doGenerate({\n text,\n voice,\n outputFormat,\n instructions,\n speed,\n language,\n abortSignal,\n headers,\n providerOptions,\n }),\n );\n\n if (!result.audio || result.audio.length === 0) {\n throw new NoSpeechGeneratedError({ responses: [result.response] });\n }\n\n return new DefaultSpeechResult({\n audio: new DefaultGeneratedAudioFile({\n data: result.audio,\n mediaType:\n detectMediaType({\n data: result.audio,\n signatures: audioMediaTypeSignatures,\n }) ?? 'audio/mp3',\n }),\n warnings: result.warnings,\n responses: [result.response],\n providerMetadata: result.providerMetadata,\n });\n}\n\nclass DefaultSpeechResult implements SpeechResult {\n readonly audio: GeneratedAudioFile;\n readonly warnings: Array<SpeechWarning>;\n readonly responses: Array<SpeechModelResponseMetadata>;\n readonly providerMetadata: Record<string, Record<string, JSONValue>>;\n\n constructor(options: {\n audio: GeneratedAudioFile;\n warnings: Array<SpeechWarning>;\n responses: Array<SpeechModelResponseMetadata>;\n providerMetadata: Record<string, Record<string, JSONValue>> | undefined;\n }) {\n this.audio = options.audio;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = options.providerMetadata ?? {};\n }\n}\n","import { LanguageModelV2CallOptions } from '@ai-sdk/provider';\nimport {\n asSchema,\n safeParseJSON,\n safeValidateTypes,\n Schema,\n} from '@ai-sdk/provider-utils';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport { NoObjectGeneratedError } from '../error/no-object-generated-error';\nimport { DeepPartial } from '../util/deep-partial';\nimport { parsePartialJson } from '../util/parse-partial-json';\nimport { FinishReason } from '../types/language-model';\nimport { LanguageModelResponseMetadata } from '../types/language-model-response-metadata';\nimport { LanguageModelUsage } from '../types/usage';\n\nexport interface Output<OUTPUT, PARTIAL> {\n readonly type: 'object' | 'text';\n\n responseFormat: LanguageModelV2CallOptions['responseFormat'];\n\n parsePartial(options: {\n text: string;\n }): Promise<{ partial: PARTIAL } | undefined>;\n\n parseOutput(\n options: { text: string },\n context: {\n response: LanguageModelResponseMetadata;\n usage: LanguageModelUsage;\n finishReason: FinishReason;\n },\n ): Promise<OUTPUT>;\n}\n\nexport const text = (): Output<string, string> => ({\n type: 'text',\n\n responseFormat: { type: 'text' },\n\n async parsePartial({ text }: { text: string }) {\n return { partial: text };\n },\n\n async parseOutput({ text }: { text: string }) {\n return text;\n },\n});\n\nexport const object = <OUTPUT>({\n schema: inputSchema,\n}: {\n schema:\n | z4.core.$ZodType<OUTPUT, any>\n | z3.Schema<OUTPUT, z3.ZodTypeDef, any>\n | Schema<OUTPUT>;\n}): Output<OUTPUT, DeepPartial<OUTPUT>> => {\n const schema = asSchema(inputSchema);\n\n return {\n type: 'object',\n\n responseFormat: {\n type: 'json',\n schema: schema.jsonSchema,\n },\n\n async parsePartial({ text }: { text: string }) {\n const result = await parsePartialJson(text);\n\n switch (result.state) {\n case 'failed-parse':\n case 'undefined-input':\n return undefined;\n\n case 'repaired-parse':\n case 'successful-parse':\n return {\n // Note: currently no validation of partial results:\n partial: result.value as DeepPartial<OUTPUT>,\n };\n\n default: {\n const _exhaustiveCheck: never = result.state;\n throw new Error(`Unsupported parse state: ${_exhaustiveCheck}`);\n }\n }\n },\n\n async parseOutput(\n { text }: { text: string },\n context: {\n response: LanguageModelResponseMetadata;\n usage: LanguageModelUsage;\n finishReason: FinishReason;\n },\n ) {\n const parseResult = await safeParseJSON({ text });\n\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: 'No object generated: could not parse the response.',\n cause: parseResult.error,\n text,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason,\n });\n }\n\n const validationResult = await safeValidateTypes({\n value: parseResult.value,\n schema,\n });\n\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: 'No object generated: response did not match schema.',\n cause: validationResult.error,\n text,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason,\n });\n }\n\n return validationResult.value;\n },\n };\n};\n","import { delay as originalDelay } from '@ai-sdk/provider-utils';\nimport { TextStreamPart } from './stream-text-result';\nimport { ToolSet } from './tool-set';\nimport { InvalidArgumentError } from '@ai-sdk/provider';\n\nconst CHUNKING_REGEXPS = {\n word: /\\S+\\s+/m,\n line: /\\n+/m,\n};\n\n/**\n * Detects the first chunk in a buffer.\n *\n * @param buffer - The buffer to detect the first chunk in.\n *\n * @returns The first detected chunk, or `undefined` if no chunk was detected.\n */\nexport type ChunkDetector = (buffer: string) => string | undefined | null;\n\n/**\n * Smooths text streaming output.\n *\n * @param delayInMs - The delay in milliseconds between each chunk. Defaults to 10ms. Can be set to `null` to skip the delay.\n * @param chunking - Controls how the text is chunked for streaming. Use \"word\" to stream word by word (default), \"line\" to stream line by line, or provide a custom RegExp pattern for custom chunking.\n *\n * @returns A transform stream that smooths text streaming output.\n */\nexport function smoothStream<TOOLS extends ToolSet>({\n delayInMs = 10,\n chunking = 'word',\n _internal: { delay = originalDelay } = {},\n}: {\n delayInMs?: number | null;\n chunking?: 'word' | 'line' | RegExp | ChunkDetector;\n /**\n * Internal. For test use only. May change without notice.\n */\n _internal?: {\n delay?: (delayInMs: number | null) => Promise<void>;\n };\n} = {}): (options: {\n tools: TOOLS;\n}) => TransformStream<TextStreamPart<TOOLS>, TextStreamPart<TOOLS>> {\n let detectChunk: ChunkDetector;\n\n if (typeof chunking === 'function') {\n detectChunk = buffer => {\n const match = chunking(buffer);\n\n if (match == null) {\n return null;\n }\n\n if (!match.length) {\n throw new Error(`Chunking function must return a non-empty string.`);\n }\n\n if (!buffer.startsWith(match)) {\n throw new Error(\n `Chunking function must return a match that is a prefix of the buffer. Received: \"${match}\" expected to start with \"${buffer}\"`,\n );\n }\n\n return match;\n };\n } else {\n const chunkingRegex =\n typeof chunking === 'string' ? CHUNKING_REGEXPS[chunking] : chunking;\n\n if (chunkingRegex == null) {\n throw new InvalidArgumentError({\n argument: 'chunking',\n message: `Chunking must be \"word\" or \"line\" or a RegExp. Received: ${chunking}`,\n });\n }\n\n detectChunk = buffer => {\n const match = chunkingRegex.exec(buffer);\n\n if (!match) {\n return null;\n }\n\n return buffer.slice(0, match.index) + match?.[0];\n };\n }\n\n return () => {\n let buffer = '';\n let id = '';\n\n return new TransformStream<TextStreamPart<TOOLS>, TextStreamPart<TOOLS>>({\n async transform(chunk, controller) {\n if (chunk.type !== 'text-delta') {\n if (buffer.length > 0) {\n controller.enqueue({ type: 'text-delta', text: buffer, id });\n buffer = '';\n }\n\n controller.enqueue(chunk);\n return;\n }\n\n if (chunk.id !== id && buffer.length > 0) {\n controller.enqueue({ type: 'text-delta', text: buffer, id });\n buffer = '';\n }\n\n buffer += chunk.text;\n id = chunk.id;\n\n let match;\n\n while ((match = detectChunk(buffer)) != null) {\n controller.enqueue({ type: 'text-delta', text: match, id });\n buffer = buffer.slice(match.length);\n\n await delay(delayInMs);\n }\n },\n });\n };\n}\n","import {\n LanguageModelV2CallOptions,\n LanguageModelV2Middleware,\n} from '@ai-sdk/provider';\nimport { mergeObjects } from '../util/merge-objects';\n\n/**\n * Applies default settings for a language model.\n */\nexport function defaultSettingsMiddleware({\n settings,\n}: {\n settings: Partial<{\n maxOutputTokens?: LanguageModelV2CallOptions['maxOutputTokens'];\n temperature?: LanguageModelV2CallOptions['temperature'];\n stopSequences?: LanguageModelV2CallOptions['stopSequences'];\n topP?: LanguageModelV2CallOptions['topP'];\n topK?: LanguageModelV2CallOptions['topK'];\n presencePenalty?: LanguageModelV2CallOptions['presencePenalty'];\n frequencyPenalty?: LanguageModelV2CallOptions['frequencyPenalty'];\n responseFormat?: LanguageModelV2CallOptions['responseFormat'];\n seed?: LanguageModelV2CallOptions['seed'];\n tools?: LanguageModelV2CallOptions['tools'];\n toolChoice?: LanguageModelV2CallOptions['toolChoice'];\n headers?: LanguageModelV2CallOptions['headers'];\n providerOptions?: LanguageModelV2CallOptions['providerOptions'];\n }>;\n}): LanguageModelV2Middleware {\n return {\n middlewareVersion: 'v2',\n transformParams: async ({ params }) => {\n return mergeObjects(settings, params) as LanguageModelV2CallOptions;\n },\n };\n}\n","/**\n * Returns the index of the start of the searchedText in the text, or null if it\n * is not found.\n */\nexport function getPotentialStartIndex(\n text: string,\n searchedText: string,\n): number | null {\n // Return null immediately if searchedText is empty.\n if (searchedText.length === 0) {\n return null;\n }\n\n // Check if the searchedText exists as a direct substring of text.\n const directIndex = text.indexOf(searchedText);\n if (directIndex !== -1) {\n return directIndex;\n }\n\n // Otherwise, look for the largest suffix of \"text\" that matches\n // a prefix of \"searchedText\". We go from the end of text inward.\n for (let i = text.length - 1; i >= 0; i--) {\n const suffix = text.substring(i);\n if (searchedText.startsWith(suffix)) {\n return i;\n }\n }\n\n return null;\n}\n","import type {\n LanguageModelV2Content,\n LanguageModelV2Middleware,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider';\nimport { getPotentialStartIndex } from '../util/get-potential-start-index';\n\n/**\n * Extract an XML-tagged reasoning section from the generated text and exposes it\n * as a `reasoning` property on the result.\n *\n * @param tagName - The name of the XML tag to extract reasoning from.\n * @param separator - The separator to use between reasoning and text sections.\n * @param startWithReasoning - Whether to start with reasoning tokens.\n */\nexport function extractReasoningMiddleware({\n tagName,\n separator = '\\n',\n startWithReasoning = false,\n}: {\n tagName: string;\n separator?: string;\n startWithReasoning?: boolean;\n}): LanguageModelV2Middleware {\n const openingTag = `<${tagName}>`;\n const closingTag = `<\\/${tagName}>`;\n\n return {\n middlewareVersion: 'v2',\n wrapGenerate: async ({ doGenerate }) => {\n const { content, ...rest } = await doGenerate();\n\n const transformedContent: LanguageModelV2Content[] = [];\n for (const part of content) {\n if (part.type !== 'text') {\n transformedContent.push(part);\n continue;\n }\n\n const text = startWithReasoning ? openingTag + part.text : part.text;\n\n const regexp = new RegExp(`${openingTag}(.*?)${closingTag}`, 'gs');\n const matches = Array.from(text.matchAll(regexp));\n\n if (!matches.length) {\n transformedContent.push(part);\n continue;\n }\n\n const reasoningText = matches.map(match => match[1]).join(separator);\n\n let textWithoutReasoning = text;\n for (let i = matches.length - 1; i >= 0; i--) {\n const match = matches[i];\n\n const beforeMatch = textWithoutReasoning.slice(0, match.index);\n const afterMatch = textWithoutReasoning.slice(\n match.index! + match[0].length,\n );\n\n textWithoutReasoning =\n beforeMatch +\n (beforeMatch.length > 0 && afterMatch.length > 0 ? separator : '') +\n afterMatch;\n }\n\n transformedContent.push({\n type: 'reasoning',\n text: reasoningText,\n });\n\n transformedContent.push({\n type: 'text',\n text: textWithoutReasoning,\n });\n }\n\n return { content: transformedContent, ...rest };\n },\n\n wrapStream: async ({ doStream }) => {\n const { stream, ...rest } = await doStream();\n\n const reasoningExtractions: Record<\n string,\n {\n isFirstReasoning: boolean;\n isFirstText: boolean;\n afterSwitch: boolean;\n isReasoning: boolean;\n buffer: string;\n idCounter: number;\n textId: string;\n }\n > = {};\n\n return {\n stream: stream.pipeThrough(\n new TransformStream<\n LanguageModelV2StreamPart,\n LanguageModelV2StreamPart\n >({\n transform: (chunk, controller) => {\n if (chunk.type !== 'text-delta') {\n controller.enqueue(chunk);\n return;\n }\n\n if (reasoningExtractions[chunk.id] == null) {\n reasoningExtractions[chunk.id] = {\n isFirstReasoning: true,\n isFirstText: true,\n afterSwitch: false,\n isReasoning: startWithReasoning,\n buffer: '',\n idCounter: 0,\n textId: chunk.id,\n };\n }\n\n const activeExtraction = reasoningExtractions[chunk.id];\n\n activeExtraction.buffer += chunk.delta;\n\n function publish(text: string) {\n if (text.length > 0) {\n const prefix =\n activeExtraction.afterSwitch &&\n (activeExtraction.isReasoning\n ? !activeExtraction.isFirstReasoning\n : !activeExtraction.isFirstText)\n ? separator\n : '';\n\n if (\n activeExtraction.isReasoning &&\n (activeExtraction.afterSwitch ||\n activeExtraction.isFirstReasoning)\n ) {\n controller.enqueue({\n type: 'reasoning-start',\n id: `reasoning-${activeExtraction.idCounter}`,\n });\n }\n\n controller.enqueue(\n activeExtraction.isReasoning\n ? {\n type: 'reasoning-delta',\n delta: prefix + text,\n id: `reasoning-${activeExtraction.idCounter}`,\n }\n : {\n type: 'text-delta',\n delta: prefix + text,\n id: activeExtraction.textId,\n },\n );\n activeExtraction.afterSwitch = false;\n\n if (activeExtraction.isReasoning) {\n activeExtraction.isFirstReasoning = false;\n } else {\n activeExtraction.isFirstText = false;\n }\n }\n }\n\n do {\n const nextTag = activeExtraction.isReasoning\n ? closingTag\n : openingTag;\n\n const startIndex = getPotentialStartIndex(\n activeExtraction.buffer,\n nextTag,\n );\n\n // no opening or closing tag found, publish the buffer\n if (startIndex == null) {\n publish(activeExtraction.buffer);\n activeExtraction.buffer = '';\n break;\n }\n\n // publish text before the tag\n publish(activeExtraction.buffer.slice(0, startIndex));\n\n const foundFullMatch =\n startIndex + nextTag.length <= activeExtraction.buffer.length;\n\n if (foundFullMatch) {\n activeExtraction.buffer = activeExtraction.buffer.slice(\n startIndex + nextTag.length,\n );\n\n // reasoning part finished:\n if (activeExtraction.isReasoning) {\n controller.enqueue({\n type: 'reasoning-end',\n id: `reasoning-${activeExtraction.idCounter++}`,\n });\n }\n\n activeExtraction.isReasoning = !activeExtraction.isReasoning;\n activeExtraction.afterSwitch = true;\n } else {\n activeExtraction.buffer =\n activeExtraction.buffer.slice(startIndex);\n break;\n }\n } while (true);\n },\n }),\n ),\n ...rest,\n };\n },\n };\n}\n","import type {\n LanguageModelV2Middleware,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider';\n\n/**\n * Simulates streaming chunks with the response from a generate call.\n */\nexport function simulateStreamingMiddleware(): LanguageModelV2Middleware {\n return {\n middlewareVersion: 'v2',\n wrapStream: async ({ doGenerate }) => {\n const result = await doGenerate();\n\n let id = 0;\n\n const simulatedStream = new ReadableStream<LanguageModelV2StreamPart>({\n start(controller) {\n controller.enqueue({\n type: 'stream-start',\n warnings: result.warnings,\n });\n\n controller.enqueue({ type: 'response-metadata', ...result.response });\n\n for (const part of result.content) {\n switch (part.type) {\n case 'text': {\n if (part.text.length > 0) {\n controller.enqueue({ type: 'text-start', id: String(id) });\n controller.enqueue({\n type: 'text-delta',\n id: String(id),\n delta: part.text,\n });\n controller.enqueue({ type: 'text-end', id: String(id) });\n id++;\n }\n break;\n }\n case 'reasoning': {\n controller.enqueue({\n type: 'reasoning-start',\n id: String(id),\n providerMetadata: part.providerMetadata,\n });\n controller.enqueue({\n type: 'reasoning-delta',\n id: String(id),\n delta: part.text,\n });\n controller.enqueue({ type: 'reasoning-end', id: String(id) });\n id++;\n break;\n }\n default: {\n controller.enqueue(part);\n break;\n }\n }\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason: result.finishReason,\n usage: result.usage,\n providerMetadata: result.providerMetadata,\n });\n\n controller.close();\n },\n });\n\n return {\n stream: simulatedStream,\n request: result.request,\n response: result.response,\n };\n },\n };\n}\n","import {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2Middleware,\n} from '@ai-sdk/provider';\nimport { asArray } from '../util/as-array';\n\n/**\n * Wraps a LanguageModelV2 instance with middleware functionality.\n * This function allows you to apply middleware to transform parameters,\n * wrap generate operations, and wrap stream operations of a language model.\n *\n * @param options - Configuration options for wrapping the language model.\n * @param options.model - The original LanguageModelV2 instance to be wrapped.\n * @param options.middleware - The middleware to be applied to the language model. When multiple middlewares are provided, the first middleware will transform the input first, and the last middleware will be wrapped directly around the model.\n * @param options.modelId - Optional custom model ID to override the original model's ID.\n * @param options.providerId - Optional custom provider ID to override the original model's provider ID.\n * @returns A new LanguageModelV2 instance with middleware applied.\n */\nexport const wrapLanguageModel = ({\n model,\n middleware: middlewareArg,\n modelId,\n providerId,\n}: {\n model: LanguageModelV2;\n middleware: LanguageModelV2Middleware | LanguageModelV2Middleware[];\n modelId?: string;\n providerId?: string;\n}): LanguageModelV2 => {\n return asArray(middlewareArg)\n .reverse()\n .reduce((wrappedModel, middleware) => {\n return doWrap({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\n\nconst doWrap = ({\n model,\n middleware: {\n transformParams,\n wrapGenerate,\n wrapStream,\n overrideProvider,\n overrideModelId,\n overrideSupportedUrls,\n },\n modelId,\n providerId,\n}: {\n model: LanguageModelV2;\n middleware: LanguageModelV2Middleware;\n modelId?: string;\n providerId?: string;\n}): LanguageModelV2 => {\n async function doTransform({\n params,\n type,\n }: {\n params: LanguageModelV2CallOptions;\n type: 'generate' | 'stream';\n }) {\n return transformParams\n ? await transformParams({ params, type, model })\n : params;\n }\n\n return {\n specificationVersion: 'v2',\n\n provider: providerId ?? overrideProvider?.({ model }) ?? model.provider,\n modelId: modelId ?? overrideModelId?.({ model }) ?? model.modelId,\n supportedUrls: overrideSupportedUrls?.({ model }) ?? model.supportedUrls,\n\n async doGenerate(\n params: LanguageModelV2CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const transformedParams = await doTransform({ params, type: 'generate' });\n const doGenerate = async () => model.doGenerate(transformedParams);\n const doStream = async () => model.doStream(transformedParams);\n return wrapGenerate\n ? wrapGenerate({\n doGenerate,\n doStream,\n params: transformedParams,\n model,\n })\n : doGenerate();\n },\n\n async doStream(\n params: LanguageModelV2CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const transformedParams = await doTransform({ params, type: 'stream' });\n const doGenerate = async () => model.doGenerate(transformedParams);\n const doStream = async () => model.doStream(transformedParams);\n return wrapStream\n ? wrapStream({ doGenerate, doStream, params: transformedParams, model })\n : doStream();\n },\n };\n};\n","import type { LanguageModelV2Middleware, ProviderV2 } from '@ai-sdk/provider';\nimport { wrapLanguageModel } from './wrap-language-model';\n\n/**\n * Wraps a ProviderV2 instance with middleware functionality.\n * This function allows you to apply middleware to all language models\n * from the provider, enabling you to transform parameters, wrap generate\n * operations, and wrap stream operations for every language model.\n *\n * @param options - Configuration options for wrapping the provider.\n * @param options.provider - The original ProviderV2 instance to be wrapped.\n * @param options.languageModelMiddleware - The middleware to be applied to all language models from the provider. When multiple middlewares are provided, the first middleware will transform the input first, and the last middleware will be wrapped directly around the model.\n * @returns A new ProviderV2 instance with middleware applied to all language models.\n */\nexport function wrapProvider({\n provider,\n languageModelMiddleware,\n}: {\n provider: ProviderV2;\n languageModelMiddleware:\n | LanguageModelV2Middleware\n | LanguageModelV2Middleware[];\n}): ProviderV2 {\n const wrappedProvider = {\n languageModel(modelId: string) {\n let model = provider.languageModel(modelId);\n model = wrapLanguageModel({\n model,\n middleware: languageModelMiddleware,\n });\n return model;\n },\n textEmbeddingModel: provider.textEmbeddingModel,\n imageModel: provider.imageModel,\n transcriptionModel: provider.transcriptionModel,\n speechModel: provider.speechModel,\n };\n\n return wrappedProvider;\n}\n","import {\n EmbeddingModelV2,\n ImageModelV2,\n LanguageModelV2,\n NoSuchModelError,\n ProviderV2,\n SpeechModelV2,\n TranscriptionModelV2,\n} from '@ai-sdk/provider';\n\n/**\n * Creates a custom provider with specified language models, text embedding models, image models, transcription models, speech models, and an optional fallback provider.\n *\n * @param {Object} options - The options for creating the custom provider.\n * @param {Record<string, LanguageModel>} [options.languageModels] - A record of language models, where keys are model IDs and values are LanguageModel instances.\n * @param {Record<string, EmbeddingModel<string>>} [options.textEmbeddingModels] - A record of text embedding models, where keys are model IDs and values are EmbeddingModel<string> instances.\n * @param {Record<string, ImageModel>} [options.imageModels] - A record of image models, where keys are model IDs and values are ImageModel instances.\n * @param {Record<string, TranscriptionModel>} [options.transcriptionModels] - A record of transcription models, where keys are model IDs and values are TranscriptionModel instances.\n * @param {Record<string, SpeechModel>} [options.speechModels] - A record of speech models, where keys are model IDs and values are SpeechModel instances.\n * @param {Provider} [options.fallbackProvider] - An optional fallback provider to use when a requested model is not found in the custom provider.\n * @returns {Provider} A Provider object with languageModel, textEmbeddingModel, imageModel, transcriptionModel, and speechModel methods.\n *\n * @throws {NoSuchModelError} Throws when a requested model is not found and no fallback provider is available.\n */\nexport function customProvider<\n LANGUAGE_MODELS extends Record<string, LanguageModelV2>,\n EMBEDDING_MODELS extends Record<string, EmbeddingModelV2<string>>,\n IMAGE_MODELS extends Record<string, ImageModelV2>,\n TRANSCRIPTION_MODELS extends Record<string, TranscriptionModelV2>,\n SPEECH_MODELS extends Record<string, SpeechModelV2>,\n>({\n languageModels,\n textEmbeddingModels,\n imageModels,\n transcriptionModels,\n speechModels,\n fallbackProvider,\n}: {\n languageModels?: LANGUAGE_MODELS;\n textEmbeddingModels?: EMBEDDING_MODELS;\n imageModels?: IMAGE_MODELS;\n transcriptionModels?: TRANSCRIPTION_MODELS;\n speechModels?: SPEECH_MODELS;\n fallbackProvider?: ProviderV2;\n}): ProviderV2 & {\n languageModel(modelId: ExtractModelId<LANGUAGE_MODELS>): LanguageModelV2;\n textEmbeddingModel(\n modelId: ExtractModelId<EMBEDDING_MODELS>,\n ): EmbeddingModelV2<string>;\n imageModel(modelId: ExtractModelId<IMAGE_MODELS>): ImageModelV2;\n transcriptionModel(\n modelId: ExtractModelId<TRANSCRIPTION_MODELS>,\n ): TranscriptionModelV2;\n speechModel(modelId: ExtractModelId<SPEECH_MODELS>): SpeechModelV2;\n} {\n return {\n languageModel(modelId: ExtractModelId<LANGUAGE_MODELS>): LanguageModelV2 {\n if (languageModels != null && modelId in languageModels) {\n return languageModels[modelId];\n }\n\n if (fallbackProvider) {\n return fallbackProvider.languageModel(modelId);\n }\n\n throw new NoSuchModelError({ modelId, modelType: 'languageModel' });\n },\n\n textEmbeddingModel(\n modelId: ExtractModelId<EMBEDDING_MODELS>,\n ): EmbeddingModelV2<string> {\n if (textEmbeddingModels != null && modelId in textEmbeddingModels) {\n return textEmbeddingModels[modelId];\n }\n\n if (fallbackProvider) {\n return fallbackProvider.textEmbeddingModel(modelId);\n }\n\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n },\n\n imageModel(modelId: ExtractModelId<IMAGE_MODELS>): ImageModelV2 {\n if (imageModels != null && modelId in imageModels) {\n return imageModels[modelId];\n }\n\n if (fallbackProvider?.imageModel) {\n return fallbackProvider.imageModel(modelId);\n }\n\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n },\n\n transcriptionModel(\n modelId: ExtractModelId<TRANSCRIPTION_MODELS>,\n ): TranscriptionModelV2 {\n if (transcriptionModels != null && modelId in transcriptionModels) {\n return transcriptionModels[modelId];\n }\n\n if (fallbackProvider?.transcriptionModel) {\n return fallbackProvider.transcriptionModel(modelId);\n }\n\n throw new NoSuchModelError({ modelId, modelType: 'transcriptionModel' });\n },\n\n speechModel(modelId: ExtractModelId<SPEECH_MODELS>): SpeechModelV2 {\n if (speechModels != null && modelId in speechModels) {\n return speechModels[modelId];\n }\n\n if (fallbackProvider?.speechModel) {\n return fallbackProvider.speechModel(modelId);\n }\n\n throw new NoSuchModelError({ modelId, modelType: 'speechModel' });\n },\n };\n}\n\n/**\n * @deprecated Use `customProvider` instead.\n */\nexport const experimental_customProvider = customProvider;\n\ntype ExtractModelId<MODELS extends Record<string, unknown>> = Extract<\n keyof MODELS,\n string\n>;\n","import { AISDKError, NoSuchModelError } from '@ai-sdk/provider';\n\nconst name = 'AI_NoSuchProviderError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class NoSuchProviderError extends NoSuchModelError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly providerId: string;\n readonly availableProviders: string[];\n\n constructor({\n modelId,\n modelType,\n providerId,\n availableProviders,\n message = `No such provider: ${providerId} (available providers: ${availableProviders.join()})`,\n }: {\n modelId: string;\n modelType:\n | 'languageModel'\n | 'textEmbeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel';\n providerId: string;\n availableProviders: string[];\n message?: string;\n }) {\n super({ errorName: name, modelId, modelType, message });\n\n this.providerId = providerId;\n this.availableProviders = availableProviders;\n }\n\n static isInstance(error: unknown): error is NoSuchProviderError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import {\n EmbeddingModelV2,\n ImageModelV2,\n LanguageModelV2,\n LanguageModelV2Middleware,\n NoSuchModelError,\n ProviderV2,\n SpeechModelV2,\n TranscriptionModelV2,\n} from '@ai-sdk/provider';\nimport { NoSuchProviderError } from './no-such-provider-error';\nimport { wrapLanguageModel } from '../middleware/wrap-language-model';\n\ntype ExtractLiteralUnion<T> = T extends string\n ? string extends T\n ? never\n : T\n : never;\n\nexport interface ProviderRegistryProvider<\n PROVIDERS extends Record<string, ProviderV2> = Record<string, ProviderV2>,\n SEPARATOR extends string = ':',\n> {\n languageModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string\n ? `${KEY & string}${SEPARATOR}${ExtractLiteralUnion<Parameters<NonNullable<PROVIDERS[KEY]['languageModel']>>[0]>}`\n : never,\n ): LanguageModelV2;\n languageModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string ? `${KEY & string}${SEPARATOR}${string}` : never,\n ): LanguageModelV2;\n\n textEmbeddingModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string\n ? `${KEY & string}${SEPARATOR}${ExtractLiteralUnion<Parameters<NonNullable<PROVIDERS[KEY]['textEmbeddingModel']>>[0]>}`\n : never,\n ): EmbeddingModelV2<string>;\n textEmbeddingModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string ? `${KEY & string}${SEPARATOR}${string}` : never,\n ): EmbeddingModelV2<string>;\n\n imageModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string\n ? `${KEY & string}${SEPARATOR}${ExtractLiteralUnion<Parameters<NonNullable<PROVIDERS[KEY]['imageModel']>>[0]>}`\n : never,\n ): ImageModelV2;\n imageModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string ? `${KEY & string}${SEPARATOR}${string}` : never,\n ): ImageModelV2;\n\n transcriptionModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string\n ? `${KEY & string}${SEPARATOR}${ExtractLiteralUnion<Parameters<NonNullable<PROVIDERS[KEY]['transcriptionModel']>>[0]>}`\n : never,\n ): TranscriptionModelV2;\n transcriptionModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string ? `${KEY & string}${SEPARATOR}${string}` : never,\n ): TranscriptionModelV2;\n\n speechModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string\n ? `${KEY & string}${SEPARATOR}${ExtractLiteralUnion<Parameters<NonNullable<PROVIDERS[KEY]['speechModel']>>[0]>}`\n : never,\n ): SpeechModelV2;\n speechModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string ? `${KEY & string}${SEPARATOR}${string}` : never,\n ): SpeechModelV2;\n}\n\n/**\n * Creates a registry for the given providers with optional middleware functionality.\n * This function allows you to register multiple providers and optionally apply middleware\n * to all language models from the registry, enabling you to transform parameters, wrap generate\n * operations, and wrap stream operations for every language model accessed through the registry.\n *\n * @param providers - A record of provider instances to be registered in the registry.\n * @param options - Configuration options for the provider registry.\n * @param options.separator - The separator used between provider ID and model ID in the combined identifier. Defaults to ':'.\n * @param options.languageModelMiddleware - Optional middleware to be applied to all language models from the registry. When multiple middlewares are provided, the first middleware will transform the input first, and the last middleware will be wrapped directly around the model.\n * @returns A new ProviderRegistryProvider instance that provides access to all registered providers with optional middleware applied to language models.\n */\nexport function createProviderRegistry<\n PROVIDERS extends Record<string, ProviderV2>,\n SEPARATOR extends string = ':',\n>(\n providers: PROVIDERS,\n {\n separator = ':' as SEPARATOR,\n languageModelMiddleware,\n }: {\n separator?: SEPARATOR;\n languageModelMiddleware?:\n | LanguageModelV2Middleware\n | LanguageModelV2Middleware[];\n } = {},\n): ProviderRegistryProvider<PROVIDERS, SEPARATOR> {\n const registry = new DefaultProviderRegistry<PROVIDERS, SEPARATOR>({\n separator,\n languageModelMiddleware,\n });\n\n for (const [id, provider] of Object.entries(providers)) {\n registry.registerProvider({ id, provider } as {\n id: keyof PROVIDERS;\n provider: PROVIDERS[keyof PROVIDERS];\n });\n }\n\n return registry;\n}\n\n/**\n * @deprecated Use `createProviderRegistry` instead.\n */\nexport const experimental_createProviderRegistry = createProviderRegistry;\n\nclass DefaultProviderRegistry<\n PROVIDERS extends Record<string, ProviderV2>,\n SEPARATOR extends string,\n> implements ProviderRegistryProvider<PROVIDERS, SEPARATOR>\n{\n private providers: PROVIDERS = {} as PROVIDERS;\n private separator: SEPARATOR;\n private languageModelMiddleware?:\n | LanguageModelV2Middleware\n | LanguageModelV2Middleware[];\n\n constructor({\n separator,\n languageModelMiddleware,\n }: {\n separator: SEPARATOR;\n languageModelMiddleware?:\n | LanguageModelV2Middleware\n | LanguageModelV2Middleware[];\n }) {\n this.separator = separator;\n this.languageModelMiddleware = languageModelMiddleware;\n }\n\n registerProvider<K extends keyof PROVIDERS>({\n id,\n provider,\n }: {\n id: K;\n provider: PROVIDERS[K];\n }): void {\n this.providers[id] = provider;\n }\n\n private getProvider(\n id: string,\n modelType:\n | 'languageModel'\n | 'textEmbeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel',\n ): ProviderV2 {\n const provider = this.providers[id as keyof PROVIDERS];\n\n if (provider == null) {\n throw new NoSuchProviderError({\n modelId: id,\n modelType,\n providerId: id,\n availableProviders: Object.keys(this.providers),\n });\n }\n\n return provider;\n }\n\n private splitId(\n id: string,\n modelType:\n | 'languageModel'\n | 'textEmbeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel',\n ): [string, string] {\n const index = id.indexOf(this.separator);\n\n if (index === -1) {\n throw new NoSuchModelError({\n modelId: id,\n modelType,\n message:\n `Invalid ${modelType} id for registry: ${id} ` +\n `(must be in the format \"providerId${this.separator}modelId\")`,\n });\n }\n\n return [id.slice(0, index), id.slice(index + this.separator.length)];\n }\n\n languageModel<KEY extends keyof PROVIDERS>(\n id: `${KEY & string}${SEPARATOR}${string}`,\n ): LanguageModelV2 {\n const [providerId, modelId] = this.splitId(id, 'languageModel');\n let model = this.getProvider(providerId, 'languageModel').languageModel?.(\n modelId,\n );\n\n if (model == null) {\n throw new NoSuchModelError({ modelId: id, modelType: 'languageModel' });\n }\n\n if (this.languageModelMiddleware != null) {\n model = wrapLanguageModel({\n model,\n middleware: this.languageModelMiddleware,\n });\n }\n\n return model;\n }\n\n textEmbeddingModel<KEY extends keyof PROVIDERS>(\n id: `${KEY & string}${SEPARATOR}${string}`,\n ): EmbeddingModelV2<string> {\n const [providerId, modelId] = this.splitId(id, 'textEmbeddingModel');\n const provider = this.getProvider(providerId, 'textEmbeddingModel');\n\n const model = provider.textEmbeddingModel?.(modelId);\n\n if (model == null) {\n throw new NoSuchModelError({\n modelId: id,\n modelType: 'textEmbeddingModel',\n });\n }\n\n return model;\n }\n\n imageModel<KEY extends keyof PROVIDERS>(\n id: `${KEY & string}${SEPARATOR}${string}`,\n ): ImageModelV2 {\n const [providerId, modelId] = this.splitId(id, 'imageModel');\n const provider = this.getProvider(providerId, 'imageModel');\n\n const model = provider.imageModel?.(modelId);\n\n if (model == null) {\n throw new NoSuchModelError({ modelId: id, modelType: 'imageModel' });\n }\n\n return model;\n }\n\n transcriptionModel<KEY extends keyof PROVIDERS>(\n id: `${KEY & string}${SEPARATOR}${string}`,\n ): TranscriptionModelV2 {\n const [providerId, modelId] = this.splitId(id, 'transcriptionModel');\n const provider = this.getProvider(providerId, 'transcriptionModel');\n\n const model = provider.transcriptionModel?.(modelId);\n\n if (model == null) {\n throw new NoSuchModelError({\n modelId: id,\n modelType: 'transcriptionModel',\n });\n }\n\n return model;\n }\n\n speechModel<KEY extends keyof PROVIDERS>(\n id: `${KEY & string}${SEPARATOR}${string}`,\n ): SpeechModelV2 {\n const [providerId, modelId] = this.splitId(id, 'speechModel');\n const provider = this.getProvider(providerId, 'speechModel');\n\n const model = provider.speechModel?.(modelId);\n\n if (model == null) {\n throw new NoSuchModelError({ modelId: id, modelType: 'speechModel' });\n }\n\n return model;\n }\n}\n","import { JSONSchema7 } from '@ai-sdk/provider';\nimport {\n dynamicTool,\n jsonSchema,\n Tool,\n tool,\n ToolCallOptions,\n} from '@ai-sdk/provider-utils';\nimport { z, ZodType } from 'zod/v4';\nimport { MCPClientError } from '../../error/mcp-client-error';\nimport {\n JSONRPCError,\n JSONRPCNotification,\n JSONRPCRequest,\n JSONRPCResponse,\n} from './json-rpc-message';\nimport {\n createMcpTransport,\n isCustomMcpTransport,\n MCPTransport,\n MCPTransportConfig,\n} from './mcp-transport';\nimport {\n CallToolResult,\n CallToolResultSchema,\n Configuration as ClientConfiguration,\n InitializeResultSchema,\n LATEST_PROTOCOL_VERSION,\n ListToolsResult,\n ListToolsResultSchema,\n McpToolSet,\n Notification,\n PaginatedRequest,\n Request,\n RequestOptions,\n ServerCapabilities,\n SUPPORTED_PROTOCOL_VERSIONS,\n ToolSchemas,\n} from './types';\n\nconst CLIENT_VERSION = '1.0.0';\n\nexport interface MCPClientConfig {\n /** Transport configuration for connecting to the MCP server */\n transport: MCPTransportConfig | MCPTransport;\n /** Optional callback for uncaught errors */\n onUncaughtError?: (error: unknown) => void;\n /** Optional client name, defaults to 'ai-sdk-mcp-client' */\n name?: string;\n}\n\nexport async function createMCPClient(\n config: MCPClientConfig,\n): Promise<MCPClient> {\n const client = new DefaultMCPClient(config);\n await client.init();\n return client;\n}\n\nexport interface MCPClient {\n tools<TOOL_SCHEMAS extends ToolSchemas = 'automatic'>(options?: {\n schemas?: TOOL_SCHEMAS;\n }): Promise<McpToolSet<TOOL_SCHEMAS>>;\n\n close: () => Promise<void>;\n}\n\n/**\n * A lightweight MCP Client implementation\n *\n * The primary purpose of this client is tool conversion between MCP<>AI SDK\n * but can later be extended to support other MCP features\n *\n * Tool parameters are automatically inferred from the server's JSON schema\n * if not explicitly provided in the tools configuration\n *\n * This client is meant to be used to communicate with a single server. To communicate and fetch tools across multiple servers, it's recommended to create a new client instance per server.\n *\n * Not supported:\n * - Client options (e.g. sampling, roots) as they are not needed for tool conversion\n * - Accepting notifications\n * - Session management (when passing a sessionId to an instance of the Streamable HTTP transport)\n * - Resumable SSE streams\n */\nclass DefaultMCPClient implements MCPClient {\n private transport: MCPTransport;\n private onUncaughtError?: (error: unknown) => void;\n private clientInfo: ClientConfiguration;\n private requestMessageId = 0;\n private responseHandlers: Map<\n number,\n (response: JSONRPCResponse | Error) => void\n > = new Map();\n private serverCapabilities: ServerCapabilities = {};\n private isClosed = true;\n\n constructor({\n transport: transportConfig,\n name = 'ai-sdk-mcp-client',\n onUncaughtError,\n }: MCPClientConfig) {\n this.onUncaughtError = onUncaughtError;\n\n if (isCustomMcpTransport(transportConfig)) {\n this.transport = transportConfig;\n } else {\n this.transport = createMcpTransport(transportConfig);\n }\n\n this.transport.onclose = () => this.onClose();\n this.transport.onerror = (error: Error) => this.onError(error);\n this.transport.onmessage = message => {\n if ('method' in message) {\n // This lightweight client implementation does not support\n // receiving notifications or requests from server.\n // If we get an unsupported message, we can safely ignore it and pass to the onError handler:\n this.onError(\n new MCPClientError({\n message: 'Unsupported message type',\n }),\n );\n return;\n }\n\n this.onResponse(message);\n };\n\n this.clientInfo = {\n name,\n version: CLIENT_VERSION,\n };\n }\n\n async init(): Promise<this> {\n try {\n await this.transport.start();\n this.isClosed = false;\n\n const result = await this.request({\n request: {\n method: 'initialize',\n params: {\n protocolVersion: LATEST_PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: this.clientInfo,\n },\n },\n resultSchema: InitializeResultSchema,\n });\n\n if (result === undefined) {\n throw new MCPClientError({\n message: 'Server sent invalid initialize result',\n });\n }\n\n if (!SUPPORTED_PROTOCOL_VERSIONS.includes(result.protocolVersion)) {\n throw new MCPClientError({\n message: `Server's protocol version is not supported: ${result.protocolVersion}`,\n });\n }\n\n this.serverCapabilities = result.capabilities;\n\n // Complete initialization handshake:\n await this.notification({\n method: 'notifications/initialized',\n });\n\n return this;\n } catch (error) {\n await this.close();\n throw error;\n }\n }\n\n async close(): Promise<void> {\n if (this.isClosed) return;\n await this.transport?.close();\n this.onClose();\n }\n\n private assertCapability(method: string): void {\n switch (method) {\n case 'initialize':\n break;\n case 'tools/list':\n case 'tools/call':\n if (!this.serverCapabilities.tools) {\n throw new MCPClientError({\n message: `Server does not support tools`,\n });\n }\n break;\n default:\n throw new MCPClientError({\n message: `Unsupported method: ${method}`,\n });\n }\n }\n\n private async request<T extends ZodType<object>>({\n request,\n resultSchema,\n options,\n }: {\n request: Request;\n resultSchema: T;\n options?: RequestOptions;\n }): Promise<z.infer<T>> {\n return new Promise((resolve, reject) => {\n if (this.isClosed) {\n return reject(\n new MCPClientError({\n message: 'Attempted to send a request from a closed client',\n }),\n );\n }\n\n this.assertCapability(request.method);\n\n const signal = options?.signal;\n signal?.throwIfAborted();\n\n const messageId = this.requestMessageId++;\n const jsonrpcRequest: JSONRPCRequest = {\n ...request,\n jsonrpc: '2.0',\n id: messageId,\n };\n\n const cleanup = () => {\n this.responseHandlers.delete(messageId);\n };\n\n this.responseHandlers.set(messageId, response => {\n if (signal?.aborted) {\n return reject(\n new MCPClientError({\n message: 'Request was aborted',\n cause: signal.reason,\n }),\n );\n }\n\n if (response instanceof Error) {\n return reject(response);\n }\n\n try {\n const result = resultSchema.parse(response.result);\n resolve(result);\n } catch (error) {\n const parseError = new MCPClientError({\n message: 'Failed to parse server response',\n cause: error,\n });\n reject(parseError);\n }\n });\n\n this.transport.send(jsonrpcRequest).catch(error => {\n cleanup();\n reject(error);\n });\n });\n }\n\n private async listTools({\n params,\n options,\n }: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n } = {}): Promise<ListToolsResult> {\n try {\n return this.request({\n request: { method: 'tools/list', params },\n resultSchema: ListToolsResultSchema,\n options,\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async callTool({\n name,\n args,\n options,\n }: {\n name: string;\n args: Record<string, unknown>;\n options?: ToolCallOptions;\n }): Promise<CallToolResult> {\n try {\n return this.request({\n request: { method: 'tools/call', params: { name, arguments: args } },\n resultSchema: CallToolResultSchema,\n options: {\n signal: options?.abortSignal,\n },\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async notification(notification: Notification): Promise<void> {\n const jsonrpcNotification: JSONRPCNotification = {\n ...notification,\n jsonrpc: '2.0',\n };\n await this.transport.send(jsonrpcNotification);\n }\n\n /**\n * Returns a set of AI SDK tools from the MCP server\n * @returns A record of tool names to their implementations\n */\n async tools<TOOL_SCHEMAS extends ToolSchemas = 'automatic'>({\n schemas = 'automatic',\n }: {\n schemas?: TOOL_SCHEMAS;\n } = {}): Promise<McpToolSet<TOOL_SCHEMAS>> {\n const tools: Record<string, Tool> = {};\n\n try {\n const listToolsResult = await this.listTools();\n\n for (const { name, description, inputSchema } of listToolsResult.tools) {\n if (schemas !== 'automatic' && !(name in schemas)) {\n continue;\n }\n\n const self = this;\n\n const execute = async (\n args: any,\n options: ToolCallOptions,\n ): Promise<CallToolResult> => {\n options?.abortSignal?.throwIfAborted();\n return self.callTool({ name, args, options });\n };\n\n const toolWithExecute =\n schemas === 'automatic'\n ? dynamicTool({\n description,\n inputSchema: jsonSchema({\n ...inputSchema,\n properties: inputSchema.properties ?? {},\n additionalProperties: false,\n } as JSONSchema7),\n execute,\n })\n : tool({\n description,\n inputSchema: schemas[name].inputSchema,\n execute,\n });\n\n tools[name] = toolWithExecute;\n }\n\n return tools as McpToolSet<TOOL_SCHEMAS>;\n } catch (error) {\n throw error;\n }\n }\n\n private onClose(): void {\n if (this.isClosed) return;\n\n this.isClosed = true;\n const error = new MCPClientError({\n message: 'Connection closed',\n });\n\n for (const handler of this.responseHandlers.values()) {\n handler(error);\n }\n\n this.responseHandlers.clear();\n }\n\n private onError(error: unknown): void {\n if (this.onUncaughtError) {\n this.onUncaughtError(error);\n }\n }\n\n private onResponse(response: JSONRPCResponse | JSONRPCError): void {\n const messageId = Number(response.id);\n const handler = this.responseHandlers.get(messageId);\n\n if (handler === undefined) {\n throw new MCPClientError({\n message: `Protocol error: Received a response for an unknown message ID: ${JSON.stringify(\n response,\n )}`,\n });\n }\n\n this.responseHandlers.delete(messageId);\n\n handler(\n 'result' in response\n ? response\n : new MCPClientError({\n message: response.error.message,\n cause: response.error,\n }),\n );\n }\n}\n","import { EventSourceParserStream } from '@ai-sdk/provider-utils';\nimport { MCPClientError } from '../../error/mcp-client-error';\nimport { JSONRPCMessage, JSONRPCMessageSchema } from './json-rpc-message';\nimport { MCPTransport } from './mcp-transport';\n\nexport class SseMCPTransport implements MCPTransport {\n private endpoint?: URL;\n private abortController?: AbortController;\n private url: URL;\n private connected = false;\n private sseConnection?: {\n close: () => void;\n };\n private headers?: Record<string, string>;\n\n onclose?: () => void;\n onerror?: (error: unknown) => void;\n onmessage?: (message: JSONRPCMessage) => void;\n\n constructor({\n url,\n headers,\n }: {\n url: string;\n headers?: Record<string, string>;\n }) {\n this.url = new URL(url);\n this.headers = headers;\n }\n\n async start(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (this.connected) {\n return resolve();\n }\n\n this.abortController = new AbortController();\n\n const establishConnection = async () => {\n try {\n const headers = new Headers(this.headers);\n headers.set('Accept', 'text/event-stream');\n const response = await fetch(this.url.href, {\n headers,\n signal: this.abortController?.signal,\n });\n\n if (!response.ok || !response.body) {\n const error = new MCPClientError({\n message: `MCP SSE Transport Error: ${response.status} ${response.statusText}`,\n });\n this.onerror?.(error);\n return reject(error);\n }\n\n const stream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream());\n\n const reader = stream.getReader();\n\n const processEvents = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n if (this.connected) {\n this.connected = false;\n throw new MCPClientError({\n message:\n 'MCP SSE Transport Error: Connection closed unexpectedly',\n });\n }\n return;\n }\n\n const { event, data } = value;\n\n if (event === 'endpoint') {\n this.endpoint = new URL(data, this.url);\n\n if (this.endpoint.origin !== this.url.origin) {\n throw new MCPClientError({\n message: `MCP SSE Transport Error: Endpoint origin does not match connection origin: ${this.endpoint.origin}`,\n });\n }\n\n this.connected = true;\n resolve();\n } else if (event === 'message') {\n try {\n const message = JSONRPCMessageSchema.parse(\n JSON.parse(data),\n );\n this.onmessage?.(message);\n } catch (error) {\n const e = new MCPClientError({\n message:\n 'MCP SSE Transport Error: Failed to parse message',\n cause: error,\n });\n this.onerror?.(e);\n // We do not throw here so we continue processing events after reporting the error\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n\n this.onerror?.(error);\n reject(error);\n }\n };\n\n this.sseConnection = {\n close: () => reader.cancel(),\n };\n\n processEvents();\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n\n this.onerror?.(error);\n reject(error);\n }\n };\n\n establishConnection();\n });\n }\n\n async close(): Promise<void> {\n this.connected = false;\n this.sseConnection?.close();\n this.abortController?.abort();\n this.onclose?.();\n }\n\n async send(message: JSONRPCMessage): Promise<void> {\n if (!this.endpoint || !this.connected) {\n throw new MCPClientError({\n message: 'MCP SSE Transport Error: Not connected',\n });\n }\n\n try {\n const headers = new Headers(this.headers);\n headers.set('Content-Type', 'application/json');\n const init = {\n method: 'POST',\n headers,\n body: JSON.stringify(message),\n signal: this.abortController?.signal,\n };\n\n const response = await fetch(this.endpoint, init);\n\n if (!response.ok) {\n const text = await response.text().catch(() => null);\n const error = new MCPClientError({\n message: `MCP SSE Transport Error: POSTing to endpoint (HTTP ${response.status}): ${text}`,\n });\n this.onerror?.(error);\n return;\n }\n } catch (error) {\n this.onerror?.(error);\n return;\n }\n }\n}\n\nexport function deserializeMessage(line: string): JSONRPCMessage {\n return JSONRPCMessageSchema.parse(JSON.parse(line));\n}\n","import { z } from 'zod/v4';\nimport { BaseParamsSchema, RequestSchema, ResultSchema } from './types';\n\nconst JSONRPC_VERSION = '2.0';\n\nconst JSONRPCRequestSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n id: z.union([z.string(), z.number().int()]),\n })\n .merge(RequestSchema)\n .strict();\n\nexport type JSONRPCRequest = z.infer<typeof JSONRPCRequestSchema>;\n\nconst JSONRPCResponseSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n id: z.union([z.string(), z.number().int()]),\n result: ResultSchema,\n })\n .strict();\n\nexport type JSONRPCResponse = z.infer<typeof JSONRPCResponseSchema>;\n\nconst JSONRPCErrorSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n id: z.union([z.string(), z.number().int()]),\n error: z.object({\n code: z.number().int(),\n message: z.string(),\n data: z.optional(z.unknown()),\n }),\n })\n .strict();\n\nexport type JSONRPCError = z.infer<typeof JSONRPCErrorSchema>;\n\nconst JSONRPCNotificationSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n })\n .merge(\n z.object({\n method: z.string(),\n params: z.optional(BaseParamsSchema),\n }),\n )\n .strict();\n\nexport type JSONRPCNotification = z.infer<typeof JSONRPCNotificationSchema>;\n\nexport const JSONRPCMessageSchema = z.union([\n JSONRPCRequestSchema,\n JSONRPCNotificationSchema,\n JSONRPCResponseSchema,\n JSONRPCErrorSchema,\n]);\n\nexport type JSONRPCMessage = z.infer<typeof JSONRPCMessageSchema>;\n","import { z } from 'zod/v4';\nimport { JSONObject } from '@ai-sdk/provider';\nimport { FlexibleSchema, Tool } from '@ai-sdk/provider-utils';\n\nexport const LATEST_PROTOCOL_VERSION = '2025-06-18';\nexport const SUPPORTED_PROTOCOL_VERSIONS = [\n LATEST_PROTOCOL_VERSION,\n '2025-03-26',\n '2024-11-05',\n];\n\nexport type ToolSchemas =\n | Record<string, { inputSchema: FlexibleSchema<JSONObject | unknown> }>\n | 'automatic'\n | undefined;\n\nexport type McpToolSet<TOOL_SCHEMAS extends ToolSchemas = 'automatic'> =\n TOOL_SCHEMAS extends Record<string, { inputSchema: FlexibleSchema<any> }>\n ? {\n [K in keyof TOOL_SCHEMAS]: TOOL_SCHEMAS[K] extends {\n inputSchema: FlexibleSchema<infer INPUT>;\n }\n ? Tool<INPUT, CallToolResult> &\n Required<Pick<Tool<INPUT, CallToolResult>, 'execute'>>\n : never;\n }\n : McpToolSet<Record<string, { inputSchema: FlexibleSchema<unknown> }>>;\n\nconst ClientOrServerImplementationSchema = z.looseObject({\n name: z.string(),\n version: z.string(),\n});\n\nexport type Configuration = z.infer<typeof ClientOrServerImplementationSchema>;\n\nexport const BaseParamsSchema = z.looseObject({\n _meta: z.optional(z.object({}).loose()),\n});\ntype BaseParams = z.infer<typeof BaseParamsSchema>;\nexport const ResultSchema = BaseParamsSchema;\n\nexport const RequestSchema = z.object({\n method: z.string(),\n params: z.optional(BaseParamsSchema),\n});\nexport type Request = z.infer<typeof RequestSchema>;\nexport type RequestOptions = {\n signal?: AbortSignal;\n timeout?: number;\n maxTotalTimeout?: number;\n};\n\nexport type Notification = z.infer<typeof RequestSchema>;\n\nconst ServerCapabilitiesSchema = z.looseObject({\n experimental: z.optional(z.object({}).loose()),\n logging: z.optional(z.object({}).loose()),\n prompts: z.optional(\n z.looseObject({\n listChanged: z.optional(z.boolean()),\n }),\n ),\n resources: z.optional(\n z.looseObject({\n subscribe: z.optional(z.boolean()),\n listChanged: z.optional(z.boolean()),\n }),\n ),\n tools: z.optional(\n z.looseObject({\n listChanged: z.optional(z.boolean()),\n }),\n ),\n});\n\nexport type ServerCapabilities = z.infer<typeof ServerCapabilitiesSchema>;\n\nexport const InitializeResultSchema = ResultSchema.extend({\n protocolVersion: z.string(),\n capabilities: ServerCapabilitiesSchema,\n serverInfo: ClientOrServerImplementationSchema,\n instructions: z.optional(z.string()),\n});\nexport type InitializeResult = z.infer<typeof InitializeResultSchema>;\n\nexport type PaginatedRequest = Request & {\n params?: BaseParams & {\n cursor?: string;\n };\n};\n\nconst PaginatedResultSchema = ResultSchema.extend({\n nextCursor: z.optional(z.string()),\n});\n\nconst ToolSchema = z\n .object({\n name: z.string(),\n description: z.optional(z.string()),\n inputSchema: z\n .object({\n type: z.literal('object'),\n properties: z.optional(z.object({}).loose()),\n })\n .loose(),\n })\n .loose();\nexport type MCPTool = z.infer<typeof ToolSchema>;\nexport const ListToolsResultSchema = PaginatedResultSchema.extend({\n tools: z.array(ToolSchema),\n});\nexport type ListToolsResult = z.infer<typeof ListToolsResultSchema>;\n\nconst TextContentSchema = z\n .object({\n type: z.literal('text'),\n text: z.string(),\n })\n .loose();\nconst ImageContentSchema = z\n .object({\n type: z.literal('image'),\n data: z.base64(),\n mimeType: z.string(),\n })\n .loose();\nconst ResourceContentsSchema = z\n .object({\n /**\n * The URI of this resource.\n */\n uri: z.string(),\n /**\n * The MIME type of this resource, if known.\n */\n mimeType: z.optional(z.string()),\n })\n .loose();\nconst TextResourceContentsSchema = ResourceContentsSchema.extend({\n text: z.string(),\n});\nconst BlobResourceContentsSchema = ResourceContentsSchema.extend({\n blob: z.base64(),\n});\nconst EmbeddedResourceSchema = z\n .object({\n type: z.literal('resource'),\n resource: z.union([TextResourceContentsSchema, BlobResourceContentsSchema]),\n })\n .loose();\n\nexport const CallToolResultSchema = ResultSchema.extend({\n content: z.array(\n z.union([TextContentSchema, ImageContentSchema, EmbeddedResourceSchema]),\n ),\n isError: z.boolean().default(false).optional(),\n}).or(\n ResultSchema.extend({\n toolResult: z.unknown(),\n }),\n);\nexport type CallToolResult = z.infer<typeof CallToolResultSchema>;\n","import { MCPClientError } from '../../error/mcp-client-error';\nimport { JSONRPCMessage } from './json-rpc-message';\nimport { SseMCPTransport } from './mcp-sse-transport';\n\n/**\n * Transport interface for MCP (Model Context Protocol) communication.\n * Maps to the `Transport` interface in the MCP spec.\n */\nexport interface MCPTransport {\n /**\n * Initialize and start the transport\n */\n start(): Promise<void>;\n\n /**\n * Send a JSON-RPC message through the transport\n * @param message The JSON-RPC message to send\n */\n send(message: JSONRPCMessage): Promise<void>;\n\n /**\n * Clean up and close the transport\n */\n close(): Promise<void>;\n\n /**\n * Event handler for transport closure\n */\n onclose?: () => void;\n\n /**\n * Event handler for transport errors\n */\n onerror?: (error: Error) => void;\n\n /**\n * Event handler for received messages\n */\n onmessage?: (message: JSONRPCMessage) => void;\n}\n\nexport type MCPTransportConfig = {\n type: 'sse';\n\n /**\n * The URL of the MCP server.\n */\n url: string;\n\n /**\n * Additional HTTP headers to be sent with requests.\n */\n headers?: Record<string, string>;\n};\n\nexport function createMcpTransport(config: MCPTransportConfig): MCPTransport {\n if (config.type !== 'sse') {\n throw new MCPClientError({\n message:\n 'Unsupported or invalid transport configuration. If you are using a custom transport, make sure it implements the MCPTransport interface.',\n });\n }\n\n return new SseMCPTransport(config);\n}\n\nexport function isCustomMcpTransport(\n transport: MCPTransportConfig | MCPTransport,\n): transport is MCPTransport {\n return (\n 'start' in transport &&\n typeof transport.start === 'function' &&\n 'send' in transport &&\n typeof transport.send === 'function' &&\n 'close' in transport &&\n typeof transport.close === 'function'\n );\n}\n","import { AISDKError } from '@ai-sdk/provider';\nimport { TranscriptionModelResponseMetadata } from '../types/transcription-model-response-metadata';\n\n/**\nError that is thrown when no transcript was generated.\n */\nexport class NoTranscriptGeneratedError extends AISDKError {\n readonly responses: Array<TranscriptionModelResponseMetadata>;\n\n constructor(options: {\n responses: Array<TranscriptionModelResponseMetadata>;\n }) {\n super({\n name: 'AI_NoTranscriptGeneratedError',\n message: 'No transcript generated.',\n });\n\n this.responses = options.responses;\n }\n}\n","import { JSONValue, TranscriptionModelV2 } from '@ai-sdk/provider';\nimport { ProviderOptions } from '@ai-sdk/provider-utils';\nimport { NoTranscriptGeneratedError } from '../error/no-transcript-generated-error';\nimport {\n audioMediaTypeSignatures,\n detectMediaType,\n} from '../util/detect-media-type';\nimport { download } from '../util/download';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { UnsupportedModelVersionError } from '../error/unsupported-model-version-error';\nimport { DataContent } from '../prompt';\nimport { convertDataContentToUint8Array } from '../prompt/data-content';\nimport { TranscriptionWarning } from '../types/transcription-model';\nimport { TranscriptionModelResponseMetadata } from '../types/transcription-model-response-metadata';\nimport { TranscriptionResult } from './transcribe-result';\n\n/**\nGenerates transcripts using a transcription model.\n\n@param model - The transcription model to use.\n@param audio - The audio data to transcribe as DataContent (string | Uint8Array | ArrayBuffer | Buffer) or a URL.\n@param providerOptions - Additional provider-specific options that are passed through to the provider\nas body parameters.\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@returns A result object that contains the generated transcript.\n */\nexport async function transcribe({\n model,\n audio,\n providerOptions = {},\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n}: {\n /**\nThe transcription model to use.\n */\n model: TranscriptionModelV2;\n\n /**\nThe audio data to transcribe.\n */\n audio: DataContent | URL;\n\n /**\nAdditional provider-specific options that are passed through to the provider\nas body parameters.\n\nThe outer record is keyed by the provider name, and the inner\nrecord is keyed by the provider-specific metadata key.\n```ts\n{\n \"openai\": {\n \"temperature\": 0\n }\n}\n```\n */\n providerOptions?: ProviderOptions;\n\n /**\nMaximum number of retries per transcript model call. Set to 0 to disable retries.\n\n@default 2\n */\n maxRetries?: number;\n\n /**\nAbort signal.\n */\n abortSignal?: AbortSignal;\n\n /**\nAdditional headers to include in the request.\nOnly applicable for HTTP-based providers.\n */\n headers?: Record<string, string>;\n}): Promise<TranscriptionResult> {\n if (model.specificationVersion !== 'v2') {\n throw new UnsupportedModelVersionError({\n version: model.specificationVersion,\n provider: model.provider,\n modelId: model.modelId,\n });\n }\n\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const audioData =\n audio instanceof URL\n ? (await download({ url: audio })).data\n : convertDataContentToUint8Array(audio);\n\n const result = await retry(() =>\n model.doGenerate({\n audio: audioData,\n abortSignal,\n headers,\n providerOptions,\n mediaType:\n detectMediaType({\n data: audioData,\n signatures: audioMediaTypeSignatures,\n }) ?? 'audio/wav',\n }),\n );\n\n if (!result.text) {\n throw new NoTranscriptGeneratedError({ responses: [result.response] });\n }\n\n return new DefaultTranscriptionResult({\n text: result.text,\n segments: result.segments,\n language: result.language,\n durationInSeconds: result.durationInSeconds,\n warnings: result.warnings,\n responses: [result.response],\n providerMetadata: result.providerMetadata,\n });\n}\n\nclass DefaultTranscriptionResult implements TranscriptionResult {\n readonly text: string;\n readonly segments: Array<{\n text: string;\n startSecond: number;\n endSecond: number;\n }>;\n readonly language: string | undefined;\n readonly durationInSeconds: number | undefined;\n readonly warnings: Array<TranscriptionWarning>;\n readonly responses: Array<TranscriptionModelResponseMetadata>;\n readonly providerMetadata: Record<string, Record<string, JSONValue>>;\n\n constructor(options: {\n text: string;\n segments: Array<{\n text: string;\n startSecond: number;\n endSecond: number;\n }>;\n language: string | undefined;\n durationInSeconds: number | undefined;\n warnings: Array<TranscriptionWarning>;\n responses: Array<TranscriptionModelResponseMetadata>;\n providerMetadata: Record<string, Record<string, JSONValue>> | undefined;\n }) {\n this.text = options.text;\n this.segments = options.segments;\n this.language = options.language;\n this.durationInSeconds = options.durationInSeconds;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = options.providerMetadata ?? {};\n }\n}\n","import { parseJsonEventStream, ParseResult } from '@ai-sdk/provider-utils';\nimport {\n UIMessageChunk,\n uiMessageChunkSchema,\n} from '../ui-message-stream/ui-message-chunks';\nimport { consumeStream } from '../util/consume-stream';\nimport { processTextStream } from './process-text-stream';\n\n// use function to allow for mocking in tests:\nconst getOriginalFetch = () => fetch;\n\nexport async function callCompletionApi({\n api,\n prompt,\n credentials,\n headers,\n body,\n streamProtocol = 'data',\n setCompletion,\n setLoading,\n setError,\n setAbortController,\n onFinish,\n onError,\n fetch = getOriginalFetch(),\n}: {\n api: string;\n prompt: string;\n credentials: RequestCredentials | undefined;\n headers: HeadersInit | undefined;\n body: Record<string, any>;\n streamProtocol: 'data' | 'text' | undefined;\n setCompletion: (completion: string) => void;\n setLoading: (loading: boolean) => void;\n setError: (error: Error | undefined) => void;\n setAbortController: (abortController: AbortController | null) => void;\n onFinish: ((prompt: string, completion: string) => void) | undefined;\n onError: ((error: Error) => void) | undefined;\n fetch: ReturnType<typeof getOriginalFetch> | undefined;\n}) {\n try {\n setLoading(true);\n setError(undefined);\n\n const abortController = new AbortController();\n setAbortController(abortController);\n\n // Empty the completion immediately.\n setCompletion('');\n\n const response = await fetch(api, {\n method: 'POST',\n body: JSON.stringify({\n prompt,\n ...body,\n }),\n credentials,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n signal: abortController.signal,\n }).catch(err => {\n throw err;\n });\n\n if (!response.ok) {\n throw new Error(\n (await response.text()) ?? 'Failed to fetch the chat response.',\n );\n }\n\n if (!response.body) {\n throw new Error('The response body is empty.');\n }\n\n let result = '';\n\n switch (streamProtocol) {\n case 'text': {\n await processTextStream({\n stream: response.body,\n onTextPart: chunk => {\n result += chunk;\n setCompletion(result);\n },\n });\n break;\n }\n case 'data': {\n await consumeStream({\n stream: parseJsonEventStream({\n stream: response.body,\n schema: uiMessageChunkSchema,\n }).pipeThrough(\n new TransformStream<ParseResult<UIMessageChunk>, UIMessageChunk>({\n async transform(part) {\n if (!part.success) {\n throw part.error;\n }\n\n const streamPart = part.value;\n if (streamPart.type === 'text-delta') {\n result += streamPart.delta;\n setCompletion(result);\n } else if (streamPart.type === 'error') {\n throw new Error(streamPart.errorText);\n }\n },\n }),\n ),\n onError: error => {\n throw error;\n },\n });\n break;\n }\n default: {\n const exhaustiveCheck: never = streamProtocol;\n throw new Error(`Unknown stream protocol: ${exhaustiveCheck}`);\n }\n }\n\n if (onFinish) {\n onFinish(prompt, result);\n }\n\n setAbortController(null);\n return result;\n } catch (err) {\n // Ignore abort errors as they are expected.\n if ((err as any).name === 'AbortError') {\n setAbortController(null);\n return null;\n }\n\n if (err instanceof Error) {\n if (onError) {\n onError(err);\n }\n }\n\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n}\n","export async function processTextStream({\n stream,\n onTextPart,\n}: {\n stream: ReadableStream<Uint8Array>;\n onTextPart: (chunk: string) => Promise<void> | void;\n}): Promise<void> {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n await onTextPart(value);\n }\n}\n","import {\n generateId as generateIdFunc,\n IdGenerator,\n StandardSchemaV1,\n Validator,\n} from '@ai-sdk/provider-utils';\nimport { UIMessageChunk } from '../ui-message-stream/ui-message-chunks';\nimport { consumeStream } from '../util/consume-stream';\nimport { SerialJobExecutor } from '../util/serial-job-executor';\nimport { ChatTransport } from './chat-transport';\nimport { convertFileListToFileUIParts } from './convert-file-list-to-file-ui-parts';\nimport { DefaultChatTransport } from './default-chat-transport';\nimport {\n createStreamingUIMessageState,\n processUIMessageStream,\n StreamingUIMessageState,\n} from './process-ui-message-stream';\nimport {\n InferUIMessageToolCall,\n isToolUIPart,\n type DataUIPart,\n type FileUIPart,\n type InferUIMessageData,\n type InferUIMessageMetadata,\n type InferUIMessageTools,\n type UIDataTypes,\n type UIMessage,\n} from './ui-messages';\n\nexport type CreateUIMessage<UI_MESSAGE extends UIMessage> = Omit<\n UI_MESSAGE,\n 'id' | 'role'\n> & {\n id?: UI_MESSAGE['id'];\n role?: UI_MESSAGE['role'];\n};\n\nexport type UIDataPartSchemas = Record<\n string,\n Validator<any> | StandardSchemaV1<any>\n>;\n\nexport type UIDataTypesToSchemas<T extends UIDataTypes> = {\n [K in keyof T]: Validator<T[K]> | StandardSchemaV1<T[K]>;\n};\n\nexport type InferUIDataParts<T extends UIDataPartSchemas> = {\n [K in keyof T]: T[K] extends Validator<infer U>\n ? U\n : T[K] extends StandardSchemaV1<infer U>\n ? U\n : unknown;\n};\n\nexport type ChatRequestOptions = {\n /**\n Additional headers that should be to be passed to the API endpoint.\n */\n headers?: Record<string, string> | Headers;\n\n /**\n Additional body JSON properties that should be sent to the API endpoint.\n */\n body?: object; // TODO JSONStringifyable\n\n metadata?: unknown;\n};\n\nexport type ChatStatus = 'submitted' | 'streaming' | 'ready' | 'error';\n\ntype ActiveResponse<UI_MESSAGE extends UIMessage> = {\n state: StreamingUIMessageState<UI_MESSAGE>;\n abortController: AbortController;\n};\n\nexport interface ChatState<UI_MESSAGE extends UIMessage> {\n status: ChatStatus;\n\n error: Error | undefined;\n\n messages: UI_MESSAGE[];\n pushMessage: (message: UI_MESSAGE) => void;\n popMessage: () => void;\n replaceMessage: (index: number, message: UI_MESSAGE) => void;\n\n snapshot: <T>(thing: T) => T;\n}\n\nexport type ChatOnErrorCallback = (error: Error) => void;\n\nexport type ChatOnToolCallCallback<UI_MESSAGE extends UIMessage = UIMessage> =\n (options: {\n toolCall: InferUIMessageToolCall<UI_MESSAGE>;\n }) => void | PromiseLike<void>;\n\nexport type ChatOnDataCallback<UI_MESSAGE extends UIMessage> = (\n dataPart: DataUIPart<InferUIMessageData<UI_MESSAGE>>,\n) => void;\n\nexport type ChatOnFinishCallback<UI_MESSAGE extends UIMessage> = (options: {\n message: UI_MESSAGE;\n}) => void;\n\nexport interface ChatInit<UI_MESSAGE extends UIMessage> {\n /**\n * A unique identifier for the chat. If not provided, a random one will be\n * generated.\n */\n id?: string;\n\n messageMetadataSchema?:\n | Validator<InferUIMessageMetadata<UI_MESSAGE>>\n | StandardSchemaV1<InferUIMessageMetadata<UI_MESSAGE>>;\n dataPartSchemas?: UIDataTypesToSchemas<InferUIMessageData<UI_MESSAGE>>;\n\n messages?: UI_MESSAGE[];\n\n /**\n * A way to provide a function that is going to be used for ids for messages and the chat.\n * If not provided the default AI SDK `generateId` is used.\n */\n generateId?: IdGenerator;\n\n transport?: ChatTransport<UI_MESSAGE>;\n\n /**\n * Callback function to be called when an error is encountered.\n */\n onError?: ChatOnErrorCallback;\n\n /**\n Optional callback function that is invoked when a tool call is received.\n Intended for automatic client-side tool execution.\n\n You can optionally return a result for the tool call,\n either synchronously or asynchronously.\n */\n onToolCall?: ChatOnToolCallCallback<UI_MESSAGE>;\n\n /**\n * Optional callback function that is called when the assistant message is finished streaming.\n *\n * @param message The message that was streamed.\n */\n onFinish?: ChatOnFinishCallback<UI_MESSAGE>;\n\n /**\n * Optional callback function that is called when a data part is received.\n *\n * @param data The data part that was received.\n */\n onData?: ChatOnDataCallback<UI_MESSAGE>;\n\n /**\n * When provided, this function will be called when the stream is finished or a tool call is added\n * to determine if the current messages should be resubmitted.\n */\n sendAutomaticallyWhen?: (options: {\n messages: UI_MESSAGE[];\n }) => boolean | PromiseLike<boolean>;\n}\n\nexport abstract class AbstractChat<UI_MESSAGE extends UIMessage> {\n readonly id: string;\n readonly generateId: IdGenerator;\n\n protected state: ChatState<UI_MESSAGE>;\n\n private messageMetadataSchema:\n | Validator<InferUIMessageMetadata<UI_MESSAGE>>\n | StandardSchemaV1<InferUIMessageMetadata<UI_MESSAGE>>\n | undefined;\n private dataPartSchemas:\n | UIDataTypesToSchemas<InferUIMessageData<UI_MESSAGE>>\n | undefined;\n private readonly transport: ChatTransport<UI_MESSAGE>;\n private onError?: ChatInit<UI_MESSAGE>['onError'];\n private onToolCall?: ChatInit<UI_MESSAGE>['onToolCall'];\n private onFinish?: ChatInit<UI_MESSAGE>['onFinish'];\n private onData?: ChatInit<UI_MESSAGE>['onData'];\n private sendAutomaticallyWhen?: ChatInit<UI_MESSAGE>['sendAutomaticallyWhen'];\n\n private activeResponse: ActiveResponse<UI_MESSAGE> | undefined = undefined;\n private jobExecutor = new SerialJobExecutor();\n\n constructor({\n generateId = generateIdFunc,\n id = generateId(),\n transport = new DefaultChatTransport(),\n messageMetadataSchema,\n dataPartSchemas,\n state,\n onError,\n onToolCall,\n onFinish,\n onData,\n sendAutomaticallyWhen,\n }: Omit<ChatInit<UI_MESSAGE>, 'messages'> & {\n state: ChatState<UI_MESSAGE>;\n }) {\n this.id = id;\n this.transport = transport;\n this.generateId = generateId;\n this.messageMetadataSchema = messageMetadataSchema;\n this.dataPartSchemas = dataPartSchemas;\n this.state = state;\n this.onError = onError;\n this.onToolCall = onToolCall;\n this.onFinish = onFinish;\n this.onData = onData;\n this.sendAutomaticallyWhen = sendAutomaticallyWhen;\n }\n\n /**\n * Hook status:\n *\n * - `submitted`: The message has been sent to the API and we're awaiting the start of the response stream.\n * - `streaming`: The response is actively streaming in from the API, receiving chunks of data.\n * - `ready`: The full response has been received and processed; a new user message can be submitted.\n * - `error`: An error occurred during the API request, preventing successful completion.\n */\n get status(): ChatStatus {\n return this.state.status;\n }\n\n protected setStatus({\n status,\n error,\n }: {\n status: ChatStatus;\n error?: Error;\n }) {\n if (this.status === status) return;\n\n this.state.status = status;\n this.state.error = error;\n }\n\n get error() {\n return this.state.error;\n }\n\n get messages(): UI_MESSAGE[] {\n return this.state.messages;\n }\n\n get lastMessage(): UI_MESSAGE | undefined {\n return this.state.messages[this.state.messages.length - 1];\n }\n\n set messages(messages: UI_MESSAGE[]) {\n this.state.messages = messages;\n }\n\n /**\n * Appends or replaces a user message to the chat list. This triggers the API call to fetch\n * the assistant's response.\n *\n * If a messageId is provided, the message will be replaced.\n */\n sendMessage = async (\n message?:\n | (CreateUIMessage<UI_MESSAGE> & {\n text?: never;\n files?: never;\n messageId?: string;\n })\n | {\n text: string;\n files?: FileList | FileUIPart[];\n metadata?: InferUIMessageMetadata<UI_MESSAGE>;\n parts?: never;\n messageId?: string;\n }\n | {\n files: FileList | FileUIPart[];\n metadata?: InferUIMessageMetadata<UI_MESSAGE>;\n parts?: never;\n messageId?: string;\n },\n options?: ChatRequestOptions,\n ): Promise<void> => {\n if (message == null) {\n await this.makeRequest({\n trigger: 'submit-message',\n messageId: this.lastMessage?.id,\n ...options,\n });\n return;\n }\n\n let uiMessage: CreateUIMessage<UI_MESSAGE>;\n\n if ('text' in message || 'files' in message) {\n const fileParts = Array.isArray(message.files)\n ? message.files\n : await convertFileListToFileUIParts(message.files);\n\n uiMessage = {\n parts: [\n ...fileParts,\n ...('text' in message && message.text != null\n ? [{ type: 'text' as const, text: message.text }]\n : []),\n ],\n } as UI_MESSAGE;\n } else {\n uiMessage = message;\n }\n\n if (message.messageId != null) {\n const messageIndex = this.state.messages.findIndex(\n m => m.id === message.messageId,\n );\n\n if (messageIndex === -1) {\n throw new Error(`message with id ${message.messageId} not found`);\n }\n\n if (this.state.messages[messageIndex].role !== 'user') {\n throw new Error(\n `message with id ${message.messageId} is not a user message`,\n );\n }\n\n // remove all messages after the message with the given id\n this.state.messages = this.state.messages.slice(0, messageIndex + 1);\n\n // update the message with the new content\n this.state.replaceMessage(messageIndex, {\n ...uiMessage,\n id: message.messageId,\n role: uiMessage.role ?? 'user',\n metadata: message.metadata,\n } as UI_MESSAGE);\n } else {\n this.state.pushMessage({\n ...uiMessage,\n id: uiMessage.id ?? this.generateId(),\n role: uiMessage.role ?? 'user',\n metadata: message.metadata,\n } as UI_MESSAGE);\n }\n\n await this.makeRequest({\n trigger: 'submit-message',\n messageId: message.messageId,\n ...options,\n });\n };\n\n /**\n * Regenerate the assistant message with the provided message id.\n * If no message id is provided, the last assistant message will be regenerated.\n */\n regenerate = async ({\n messageId,\n ...options\n }: {\n messageId?: string;\n } & ChatRequestOptions = {}): Promise<void> => {\n const messageIndex =\n messageId == null\n ? this.state.messages.length - 1\n : this.state.messages.findIndex(message => message.id === messageId);\n\n if (messageIndex === -1) {\n throw new Error(`message ${messageId} not found`);\n }\n\n // set the messages to the message before the assistant message\n this.state.messages = this.state.messages.slice(\n 0,\n // if the message is a user message, we need to include it in the request:\n this.messages[messageIndex].role === 'assistant'\n ? messageIndex\n : messageIndex + 1,\n );\n\n await this.makeRequest({\n trigger: 'regenerate-message',\n messageId,\n ...options,\n });\n };\n\n /**\n * Attempt to resume an ongoing streaming response.\n */\n resumeStream = async (options: ChatRequestOptions = {}): Promise<void> => {\n await this.makeRequest({ trigger: 'resume-stream', ...options });\n };\n\n /**\n * Clear the error state and set the status to ready if the chat is in an error state.\n */\n clearError = () => {\n if (this.status === 'error') {\n this.state.error = undefined;\n this.setStatus({ status: 'ready' });\n }\n };\n\n addToolResult = async <TOOL extends keyof InferUIMessageTools<UI_MESSAGE>>({\n tool,\n toolCallId,\n output,\n }: {\n tool: TOOL;\n toolCallId: string;\n output: InferUIMessageTools<UI_MESSAGE>[TOOL]['output'];\n }) =>\n this.jobExecutor.run(async () => {\n const messages = this.state.messages;\n const lastMessage = messages[messages.length - 1];\n\n this.state.replaceMessage(messages.length - 1, {\n ...lastMessage,\n parts: lastMessage.parts.map(part =>\n isToolUIPart(part) && part.toolCallId === toolCallId\n ? { ...part, state: 'output-available', output }\n : part,\n ),\n });\n\n // update the active response if it exists\n if (this.activeResponse) {\n this.activeResponse.state.message.parts =\n this.activeResponse.state.message.parts.map(part =>\n isToolUIPart(part) && part.toolCallId === toolCallId\n ? {\n ...part,\n state: 'output-available',\n output,\n errorText: undefined,\n }\n : part,\n );\n }\n\n // automatically send the message if the sendAutomaticallyWhen function returns true\n if (\n this.status !== 'streaming' &&\n this.status !== 'submitted' &&\n this.sendAutomaticallyWhen?.({ messages: this.state.messages })\n ) {\n // no await to avoid deadlocking\n this.makeRequest({\n trigger: 'submit-message',\n messageId: this.lastMessage?.id,\n });\n }\n });\n\n /**\n * Abort the current request immediately, keep the generated tokens if any.\n */\n stop = async () => {\n if (this.status !== 'streaming' && this.status !== 'submitted') return;\n\n if (this.activeResponse?.abortController) {\n this.activeResponse.abortController.abort();\n }\n };\n\n private async makeRequest({\n trigger,\n metadata,\n headers,\n body,\n messageId,\n }: {\n trigger: 'submit-message' | 'resume-stream' | 'regenerate-message';\n messageId?: string;\n } & ChatRequestOptions) {\n this.setStatus({ status: 'submitted', error: undefined });\n\n const lastMessage = this.lastMessage;\n\n try {\n const activeResponse = {\n state: createStreamingUIMessageState({\n lastMessage: this.state.snapshot(lastMessage),\n messageId: this.generateId(),\n }),\n abortController: new AbortController(),\n } as ActiveResponse<UI_MESSAGE>;\n\n this.activeResponse = activeResponse;\n\n let stream: ReadableStream<UIMessageChunk>;\n\n if (trigger === 'resume-stream') {\n const reconnect = await this.transport.reconnectToStream({\n chatId: this.id,\n metadata,\n headers,\n body,\n });\n\n if (reconnect == null) {\n this.setStatus({ status: 'ready' });\n return; // no active stream found, so we do not resume\n }\n\n stream = reconnect;\n } else {\n stream = await this.transport.sendMessages({\n chatId: this.id,\n messages: this.state.messages,\n abortSignal: activeResponse.abortController.signal,\n metadata,\n headers,\n body,\n trigger,\n messageId,\n });\n }\n\n const runUpdateMessageJob = (\n job: (options: {\n state: StreamingUIMessageState<UI_MESSAGE>;\n write: () => void;\n }) => Promise<void>,\n ) =>\n // serialize the job execution to avoid race conditions:\n this.jobExecutor.run(() =>\n job({\n state: activeResponse.state,\n write: () => {\n // streaming is set on first write (before it should be \"submitted\")\n this.setStatus({ status: 'streaming' });\n\n const replaceLastMessage =\n activeResponse.state.message.id === this.lastMessage?.id;\n\n if (replaceLastMessage) {\n this.state.replaceMessage(\n this.state.messages.length - 1,\n activeResponse.state.message,\n );\n } else {\n this.state.pushMessage(activeResponse.state.message);\n }\n },\n }),\n );\n\n await consumeStream({\n stream: processUIMessageStream({\n stream,\n onToolCall: this.onToolCall,\n onData: this.onData,\n messageMetadataSchema: this.messageMetadataSchema,\n dataPartSchemas: this.dataPartSchemas,\n runUpdateMessageJob,\n onError: error => {\n throw error;\n },\n }),\n onError: error => {\n throw error;\n },\n });\n\n this.onFinish?.({ message: activeResponse.state.message });\n\n this.setStatus({ status: 'ready' });\n } catch (err) {\n // Ignore abort errors as they are expected.\n if ((err as any).name === 'AbortError') {\n this.setStatus({ status: 'ready' });\n return null;\n }\n\n if (this.onError && err instanceof Error) {\n this.onError(err);\n }\n\n this.setStatus({ status: 'error', error: err as Error });\n } finally {\n this.activeResponse = undefined;\n }\n\n // automatically send the message if the sendAutomaticallyWhen function returns true\n if (this.sendAutomaticallyWhen?.({ messages: this.state.messages })) {\n await this.makeRequest({\n trigger: 'submit-message',\n messageId: this.lastMessage?.id,\n metadata,\n headers,\n body,\n });\n }\n }\n}\n","import { FileUIPart } from './ui-messages';\n\nexport async function convertFileListToFileUIParts(\n files: FileList | undefined,\n): Promise<Array<FileUIPart>> {\n if (files == null) {\n return [];\n }\n\n // React-native doesn't have a FileList global:\n if (!globalThis.FileList || !(files instanceof globalThis.FileList)) {\n throw new Error('FileList is not supported in the current environment');\n }\n\n return Promise.all(\n Array.from(files).map(async file => {\n const { name, type } = file;\n\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = readerEvent => {\n resolve(readerEvent.target?.result as string);\n };\n reader.onerror = error => reject(error);\n reader.readAsDataURL(file);\n });\n\n return {\n type: 'file',\n mediaType: type,\n filename: name,\n url: dataUrl,\n };\n }),\n );\n}\n","import { parseJsonEventStream, ParseResult } from '@ai-sdk/provider-utils';\nimport {\n UIMessageChunk,\n uiMessageChunkSchema,\n} from '../ui-message-stream/ui-message-chunks';\nimport {\n HttpChatTransport,\n HttpChatTransportInitOptions,\n} from './http-chat-transport';\nimport { UIMessage } from './ui-messages';\n\nexport class DefaultChatTransport<\n UI_MESSAGE extends UIMessage,\n> extends HttpChatTransport<UI_MESSAGE> {\n constructor(options: HttpChatTransportInitOptions<UI_MESSAGE> = {}) {\n super(options);\n }\n\n protected processResponseStream(\n stream: ReadableStream<Uint8Array<ArrayBufferLike>>,\n ): ReadableStream<UIMessageChunk> {\n return parseJsonEventStream({\n stream,\n schema: uiMessageChunkSchema,\n }).pipeThrough(\n new TransformStream<ParseResult<UIMessageChunk>, UIMessageChunk>({\n async transform(chunk, controller) {\n if (!chunk.success) {\n throw chunk.error;\n }\n controller.enqueue(chunk.value);\n },\n }),\n );\n }\n}\n","import { FetchFunction, Resolvable, resolve } from '@ai-sdk/provider-utils';\nimport { UIMessageChunk } from '../ui-message-stream/ui-message-chunks';\nimport { ChatTransport } from './chat-transport';\nimport { UIMessage } from './ui-messages';\n\nexport type PrepareSendMessagesRequest<UI_MESSAGE extends UIMessage> = (\n options: {\n id: string;\n messages: UI_MESSAGE[];\n requestMetadata: unknown;\n body: Record<string, any> | undefined;\n credentials: RequestCredentials | undefined;\n headers: HeadersInit | undefined;\n api: string;\n } & {\n trigger: 'submit-message' | 'regenerate-message';\n messageId: string | undefined;\n },\n) =>\n | {\n body: object;\n headers?: HeadersInit;\n credentials?: RequestCredentials;\n api?: string;\n }\n | PromiseLike<{\n body: object;\n headers?: HeadersInit;\n credentials?: RequestCredentials;\n api?: string;\n }>;\n\nexport type PrepareReconnectToStreamRequest = (options: {\n id: string;\n requestMetadata: unknown;\n body: Record<string, any> | undefined;\n credentials: RequestCredentials | undefined;\n headers: HeadersInit | undefined;\n api: string;\n}) =>\n | {\n headers?: HeadersInit;\n credentials?: RequestCredentials;\n api?: string;\n }\n | PromiseLike<{\n headers?: HeadersInit;\n credentials?: RequestCredentials;\n api?: string;\n }>;\n\n/**\n * Options for the `HttpChatTransport` class.\n *\n * @param UI_MESSAGE - The type of message to be used in the chat.\n */\nexport type HttpChatTransportInitOptions<UI_MESSAGE extends UIMessage> = {\n /**\n * The API URL to be used for the chat transport.\n * Defaults to '/api/chat'.\n */\n api?: string;\n\n /**\n * The credentials mode to be used for the fetch request.\n * Possible values are: 'omit', 'same-origin', 'include'.\n * Defaults to 'same-origin'.\n */\n credentials?: Resolvable<RequestCredentials>;\n\n /**\n * HTTP headers to be sent with the API request.\n */\n headers?: Resolvable<Record<string, string> | Headers>;\n\n /**\n * Extra body object to be sent with the API request.\n * @example\n * Send a `sessionId` to the API along with the messages.\n * ```js\n * useChat({\n * body: {\n * sessionId: '123',\n * }\n * })\n * ```\n */\n body?: Resolvable<object>;\n\n /**\n Custom fetch implementation. You can use it as a middleware to intercept requests,\n or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * When a function is provided, it will be used\n * to prepare the request body for the chat API. This can be useful for\n * customizing the request body based on the messages and data in the chat.\n *\n * @param id The id of the chat.\n * @param messages The current messages in the chat.\n * @param requestBody The request body object passed in the chat request.\n */\n prepareSendMessagesRequest?: PrepareSendMessagesRequest<UI_MESSAGE>;\n\n /**\n * When a function is provided, it will be used\n * to prepare the request body for the chat API. This can be useful for\n * customizing the request body based on the messages and data in the chat.\n *\n * @param id The id of the chat.\n * @param messages The current messages in the chat.\n * @param requestBody The request body object passed in the chat request.\n */\n prepareReconnectToStreamRequest?: PrepareReconnectToStreamRequest;\n};\n\nexport abstract class HttpChatTransport<UI_MESSAGE extends UIMessage>\n implements ChatTransport<UI_MESSAGE>\n{\n protected api: string;\n protected credentials: HttpChatTransportInitOptions<UI_MESSAGE>['credentials'];\n protected headers: HttpChatTransportInitOptions<UI_MESSAGE>['headers'];\n protected body: HttpChatTransportInitOptions<UI_MESSAGE>['body'];\n protected fetch?: FetchFunction;\n protected prepareSendMessagesRequest?: PrepareSendMessagesRequest<UI_MESSAGE>;\n protected prepareReconnectToStreamRequest?: PrepareReconnectToStreamRequest;\n\n constructor({\n api = '/api/chat',\n credentials,\n headers,\n body,\n fetch,\n prepareSendMessagesRequest,\n prepareReconnectToStreamRequest,\n }: HttpChatTransportInitOptions<UI_MESSAGE>) {\n this.api = api;\n this.credentials = credentials;\n this.headers = headers;\n this.body = body;\n this.fetch = fetch;\n this.prepareSendMessagesRequest = prepareSendMessagesRequest;\n this.prepareReconnectToStreamRequest = prepareReconnectToStreamRequest;\n }\n\n async sendMessages({\n abortSignal,\n ...options\n }: Parameters<ChatTransport<UI_MESSAGE>['sendMessages']>[0]) {\n const resolvedBody = await resolve(this.body);\n const resolvedHeaders = await resolve(this.headers);\n const resolvedCredentials = await resolve(this.credentials);\n\n const preparedRequest = await this.prepareSendMessagesRequest?.({\n api: this.api,\n id: options.chatId,\n messages: options.messages,\n body: { ...resolvedBody, ...options.body },\n headers: { ...resolvedHeaders, ...options.headers },\n credentials: resolvedCredentials,\n requestMetadata: options.metadata,\n trigger: options.trigger,\n messageId: options.messageId,\n });\n\n const api = preparedRequest?.api ?? this.api;\n const headers =\n preparedRequest?.headers !== undefined\n ? preparedRequest.headers\n : { ...resolvedHeaders, ...options.headers };\n const body =\n preparedRequest?.body !== undefined\n ? preparedRequest.body\n : {\n ...resolvedBody,\n ...options.body,\n id: options.chatId,\n messages: options.messages,\n trigger: options.trigger,\n messageId: options.messageId,\n };\n const credentials = preparedRequest?.credentials ?? resolvedCredentials;\n\n // avoid caching globalThis.fetch in case it is patched by other libraries\n const fetch = this.fetch ?? globalThis.fetch;\n\n const response = await fetch(api, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify(body),\n credentials,\n signal: abortSignal,\n });\n\n if (!response.ok) {\n throw new Error(\n (await response.text()) ?? 'Failed to fetch the chat response.',\n );\n }\n\n if (!response.body) {\n throw new Error('The response body is empty.');\n }\n\n return this.processResponseStream(response.body);\n }\n\n async reconnectToStream(\n options: Parameters<ChatTransport<UI_MESSAGE>['reconnectToStream']>[0],\n ): Promise<ReadableStream<UIMessageChunk> | null> {\n const resolvedBody = await resolve(this.body);\n const resolvedHeaders = await resolve(this.headers);\n const resolvedCredentials = await resolve(this.credentials);\n\n const preparedRequest = await this.prepareReconnectToStreamRequest?.({\n api: this.api,\n id: options.chatId,\n body: { ...resolvedBody, ...options.body },\n headers: { ...resolvedHeaders, ...options.headers },\n credentials: resolvedCredentials,\n requestMetadata: options.metadata,\n });\n\n const api = preparedRequest?.api ?? `${this.api}/${options.chatId}/stream`;\n const headers =\n preparedRequest?.headers !== undefined\n ? preparedRequest.headers\n : { ...resolvedHeaders, ...options.headers };\n const credentials = preparedRequest?.credentials ?? resolvedCredentials;\n\n // avoid caching globalThis.fetch in case it is patched by other libraries\n const fetch = this.fetch ?? globalThis.fetch;\n\n const response = await fetch(api, {\n method: 'GET',\n headers,\n credentials,\n });\n\n // no active stream found, so we do not resume\n if (response.status === 204) {\n return null;\n }\n\n if (!response.ok) {\n throw new Error(\n (await response.text()) ?? 'Failed to fetch the chat response.',\n );\n }\n\n if (!response.body) {\n throw new Error('The response body is empty.');\n }\n\n return this.processResponseStream(response.body);\n }\n\n protected abstract processResponseStream(\n stream: ReadableStream<Uint8Array<ArrayBufferLike>>,\n ): ReadableStream<UIMessageChunk>;\n}\n","import {\n AssistantContent,\n ModelMessage,\n ToolResultPart,\n} from '@ai-sdk/provider-utils';\nimport { ToolSet } from '../generate-text/tool-set';\nimport { createToolModelOutput } from '../prompt/create-tool-model-output';\nimport { MessageConversionError } from '../prompt/message-conversion-error';\nimport {\n DynamicToolUIPart,\n FileUIPart,\n getToolName,\n isToolUIPart,\n ReasoningUIPart,\n TextUIPart,\n ToolUIPart,\n UIMessage,\n UITools,\n} from './ui-messages';\n\n/**\nConverts an array of messages from useChat into an array of CoreMessages that can be used\nwith the AI core functions (e.g. `streamText`).\n\n@param messages - The messages to convert.\n@param options.tools - The tools to use.\n@param options.ignoreIncompleteToolCalls - Whether to ignore incomplete tool calls. Default is `false`.\n */\nexport function convertToModelMessages(\n messages: Array<Omit<UIMessage, 'id'>>,\n options?: {\n tools?: ToolSet;\n ignoreIncompleteToolCalls?: boolean;\n },\n): ModelMessage[] {\n const modelMessages: ModelMessage[] = [];\n\n if (options?.ignoreIncompleteToolCalls) {\n messages = messages.map(message => ({\n ...message,\n parts: message.parts.filter(\n part =>\n !isToolUIPart(part) ||\n (part.state !== 'input-streaming' &&\n part.state !== 'input-available'),\n ),\n }));\n }\n\n for (const message of messages) {\n switch (message.role) {\n case 'system': {\n const textParts = message.parts.filter(part => part.type === 'text');\n\n const providerMetadata = textParts.reduce((acc, part) => {\n if (part.providerMetadata != null) {\n return { ...acc, ...part.providerMetadata };\n }\n return acc;\n }, {});\n\n modelMessages.push({\n role: 'system',\n content: textParts.map(part => part.text).join(''),\n ...(Object.keys(providerMetadata).length > 0\n ? { providerOptions: providerMetadata }\n : {}),\n });\n break;\n }\n\n case 'user': {\n modelMessages.push({\n role: 'user',\n content: message.parts\n .filter(\n (part): part is TextUIPart | FileUIPart =>\n part.type === 'text' || part.type === 'file',\n )\n .map(part => {\n switch (part.type) {\n case 'text':\n return {\n type: 'text' as const,\n text: part.text,\n ...(part.providerMetadata != null\n ? { providerOptions: part.providerMetadata }\n : {}),\n };\n case 'file':\n return {\n type: 'file' as const,\n mediaType: part.mediaType,\n filename: part.filename,\n data: part.url,\n ...(part.providerMetadata != null\n ? { providerOptions: part.providerMetadata }\n : {}),\n };\n default:\n return part;\n }\n }),\n });\n\n break;\n }\n\n case 'assistant': {\n if (message.parts != null) {\n let block: Array<\n | TextUIPart\n | ToolUIPart<UITools>\n | ReasoningUIPart\n | FileUIPart\n | DynamicToolUIPart\n > = [];\n\n function processBlock() {\n if (block.length === 0) {\n return;\n }\n\n const content: AssistantContent = [];\n\n for (const part of block) {\n if (part.type === 'text') {\n content.push({\n type: 'text' as const,\n text: part.text,\n ...(part.providerMetadata != null\n ? { providerOptions: part.providerMetadata }\n : {}),\n });\n } else if (part.type === 'file') {\n content.push({\n type: 'file' as const,\n mediaType: part.mediaType,\n filename: part.filename,\n data: part.url,\n });\n } else if (part.type === 'reasoning') {\n content.push({\n type: 'reasoning' as const,\n text: part.text,\n providerOptions: part.providerMetadata,\n });\n } else if (part.type === 'dynamic-tool') {\n const toolName = part.toolName;\n\n if (part.state === 'input-streaming') {\n throw new MessageConversionError({\n originalMessage: message,\n message: `incomplete tool input is not supported: ${part.toolCallId}`,\n });\n } else {\n content.push({\n type: 'tool-call' as const,\n toolCallId: part.toolCallId,\n toolName,\n input: part.input,\n ...(part.callProviderMetadata != null\n ? { providerOptions: part.callProviderMetadata }\n : {}),\n });\n }\n } else if (isToolUIPart(part)) {\n const toolName = getToolName(part);\n\n if (part.state === 'input-streaming') {\n throw new MessageConversionError({\n originalMessage: message,\n message: `incomplete tool input is not supported: ${part.toolCallId}`,\n });\n } else {\n content.push({\n type: 'tool-call' as const,\n toolCallId: part.toolCallId,\n toolName,\n input:\n part.state === 'output-error'\n ? (part.input ?? part.rawInput)\n : part.input,\n providerExecuted: part.providerExecuted,\n ...(part.callProviderMetadata != null\n ? { providerOptions: part.callProviderMetadata }\n : {}),\n });\n\n if (\n part.providerExecuted === true &&\n (part.state === 'output-available' ||\n part.state === 'output-error')\n ) {\n content.push({\n type: 'tool-result',\n toolCallId: part.toolCallId,\n toolName,\n output: createToolModelOutput({\n output:\n part.state === 'output-error'\n ? part.errorText\n : part.output,\n tool: options?.tools?.[toolName],\n errorMode:\n part.state === 'output-error' ? 'json' : 'none',\n }),\n });\n }\n }\n } else {\n const _exhaustiveCheck: never = part;\n throw new Error(`Unsupported part: ${_exhaustiveCheck}`);\n }\n }\n\n modelMessages.push({\n role: 'assistant',\n content,\n });\n\n // check if there are tool invocations with results in the block\n const toolParts = block.filter(\n part =>\n (isToolUIPart(part) && part.providerExecuted !== true) ||\n part.type === 'dynamic-tool',\n ) as (ToolUIPart<UITools> | DynamicToolUIPart)[];\n\n // tool message with tool results\n if (toolParts.length > 0) {\n modelMessages.push({\n role: 'tool',\n content: toolParts.map((toolPart): ToolResultPart => {\n switch (toolPart.state) {\n case 'output-error':\n case 'output-available': {\n const toolName =\n toolPart.type === 'dynamic-tool'\n ? toolPart.toolName\n : getToolName(toolPart);\n\n return {\n type: 'tool-result',\n toolCallId: toolPart.toolCallId,\n toolName,\n output: createToolModelOutput({\n output:\n toolPart.state === 'output-error'\n ? toolPart.errorText\n : toolPart.output,\n tool: options?.tools?.[toolName],\n errorMode:\n toolPart.state === 'output-error' ? 'text' : 'none',\n }),\n };\n }\n\n default: {\n throw new MessageConversionError({\n originalMessage: message,\n message: `Unsupported tool part state: ${toolPart.state}`,\n });\n }\n }\n }),\n });\n }\n\n // updates for next block\n block = [];\n }\n\n for (const part of message.parts) {\n if (\n part.type === 'text' ||\n part.type === 'reasoning' ||\n part.type === 'file' ||\n part.type === 'dynamic-tool' ||\n isToolUIPart(part)\n ) {\n block.push(part);\n } else if (part.type === 'step-start') {\n processBlock();\n }\n }\n\n processBlock();\n\n break;\n }\n\n break;\n }\n\n default: {\n const _exhaustiveCheck: never = message.role;\n throw new MessageConversionError({\n originalMessage: message,\n message: `Unsupported role: ${_exhaustiveCheck}`,\n });\n }\n }\n }\n\n return modelMessages;\n}\n\n/**\n@deprecated Use `convertToModelMessages` instead.\n */\n// TODO remove in AI SDK 6\nexport const convertToCoreMessages = convertToModelMessages;\n","import { isToolUIPart, UIMessage } from './ui-messages';\n\n/**\nCheck if the message is an assistant message with completed tool calls.\nThe last step of the message must have at least one tool invocation and\nall tool invocations must have a result.\n */\nexport function lastAssistantMessageIsCompleteWithToolCalls({\n messages,\n}: {\n messages: UIMessage[];\n}): boolean {\n const message = messages[messages.length - 1];\n\n if (!message) {\n return false;\n }\n\n if (message.role !== 'assistant') {\n return false;\n }\n\n const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {\n return part.type === 'step-start' ? index : lastIndex;\n }, -1);\n\n const lastStepToolInvocations = message.parts\n .slice(lastStepStartIndex + 1)\n .filter(part => isToolUIPart(part) || part.type === 'dynamic-tool');\n\n return (\n lastStepToolInvocations.length > 0 &&\n lastStepToolInvocations.every(part => part.state === 'output-available')\n );\n}\n","import { UIMessageChunk } from '../ui-message-stream/ui-message-chunks';\n\nexport function transformTextToUiMessageStream({\n stream,\n}: {\n stream: ReadableStream<string>;\n}) {\n return stream.pipeThrough(\n new TransformStream<string, UIMessageChunk>({\n start(controller) {\n controller.enqueue({ type: 'start' });\n controller.enqueue({ type: 'start-step' });\n controller.enqueue({ type: 'text-start', id: 'text-1' });\n },\n\n async transform(part, controller) {\n controller.enqueue({ type: 'text-delta', id: 'text-1', delta: part });\n },\n\n async flush(controller) {\n controller.enqueue({ type: 'text-end', id: 'text-1' });\n controller.enqueue({ type: 'finish-step' });\n controller.enqueue({ type: 'finish' });\n },\n }),\n );\n}\n","import { UIMessageChunk } from '../ui-message-stream/ui-message-chunks';\nimport {\n HttpChatTransport,\n HttpChatTransportInitOptions,\n} from './http-chat-transport';\nimport { transformTextToUiMessageStream } from './transform-text-to-ui-message-stream';\nimport { UIMessage } from './ui-messages';\n\nexport class TextStreamChatTransport<\n UI_MESSAGE extends UIMessage,\n> extends HttpChatTransport<UI_MESSAGE> {\n constructor(options: HttpChatTransportInitOptions<UI_MESSAGE> = {}) {\n super(options);\n }\n\n protected processResponseStream(\n stream: ReadableStream<Uint8Array<ArrayBufferLike>>,\n ): ReadableStream<UIMessageChunk> {\n return transformTextToUiMessageStream({\n stream: stream.pipeThrough(new TextDecoderStream()),\n });\n }\n}\n","import {\n generateId as generateIdFunc,\n getErrorMessage,\n IdGenerator,\n} from '@ai-sdk/provider-utils';\nimport { UIMessage } from '../ui/ui-messages';\nimport { handleUIMessageStreamFinish } from './handle-ui-message-stream-finish';\nimport { InferUIMessageChunk } from './ui-message-chunks';\nimport { UIMessageStreamOnFinishCallback } from './ui-message-stream-on-finish-callback';\nimport { UIMessageStreamWriter } from './ui-message-stream-writer';\n\nexport function createUIMessageStream<UI_MESSAGE extends UIMessage>({\n execute,\n onError = getErrorMessage,\n originalMessages,\n onFinish,\n generateId = generateIdFunc,\n}: {\n execute: (options: {\n writer: UIMessageStreamWriter<UI_MESSAGE>;\n }) => Promise<void> | void;\n onError?: (error: unknown) => string;\n\n /**\n * The original messages. If they are provided, persistence mode is assumed,\n * and a message ID is provided for the response message.\n */\n originalMessages?: UI_MESSAGE[];\n\n onFinish?: UIMessageStreamOnFinishCallback<UI_MESSAGE>;\n\n generateId?: IdGenerator;\n}): ReadableStream<InferUIMessageChunk<UI_MESSAGE>> {\n let controller!: ReadableStreamDefaultController<\n InferUIMessageChunk<UI_MESSAGE>\n >;\n\n const ongoingStreamPromises: Promise<void>[] = [];\n\n const stream = new ReadableStream({\n start(controllerArg) {\n controller = controllerArg;\n },\n });\n\n function safeEnqueue(data: InferUIMessageChunk<UI_MESSAGE>) {\n try {\n controller.enqueue(data);\n } catch (error) {\n // suppress errors when the stream has been closed\n }\n }\n\n try {\n const result = execute({\n writer: {\n write(part: InferUIMessageChunk<UI_MESSAGE>) {\n safeEnqueue(part);\n },\n merge(streamArg) {\n ongoingStreamPromises.push(\n (async () => {\n const reader = streamArg.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n safeEnqueue(value);\n }\n })().catch(error => {\n safeEnqueue({\n type: 'error',\n errorText: onError(error),\n } as InferUIMessageChunk<UI_MESSAGE>);\n }),\n );\n },\n onError,\n },\n });\n\n if (result) {\n ongoingStreamPromises.push(\n result.catch(error => {\n safeEnqueue({\n type: 'error',\n errorText: onError(error),\n } as InferUIMessageChunk<UI_MESSAGE>);\n }),\n );\n }\n } catch (error) {\n safeEnqueue({\n type: 'error',\n errorText: onError(error),\n } as InferUIMessageChunk<UI_MESSAGE>);\n }\n\n // Wait until all ongoing streams are done. This approach enables merging\n // streams even after execute has returned, as long as there is still an\n // open merged stream. This is important to e.g. forward new streams and\n // from callbacks.\n const waitForStreams: Promise<void> = new Promise(async resolve => {\n while (ongoingStreamPromises.length > 0) {\n await ongoingStreamPromises.shift();\n }\n resolve();\n });\n\n waitForStreams.finally(() => {\n try {\n controller.close();\n } catch (error) {\n // suppress errors when the stream has been closed\n }\n });\n\n return handleUIMessageStreamFinish<UI_MESSAGE>({\n stream,\n messageId: generateId(),\n originalMessages,\n onFinish,\n onError,\n });\n}\n","import { UIMessage } from '../ui/ui-messages';\nimport { UIMessageChunk } from './ui-message-chunks';\nimport {\n createStreamingUIMessageState,\n processUIMessageStream,\n StreamingUIMessageState,\n} from '../ui/process-ui-message-stream';\nimport {\n AsyncIterableStream,\n createAsyncIterableStream,\n} from '../util/async-iterable-stream';\nimport { consumeStream } from '../util/consume-stream';\n\n/**\n * Transforms a stream of `UIMessageChunk`s into an `AsyncIterableStream` of `UIMessage`s.\n *\n * @param options.message - The last assistant message to use as a starting point when the conversation is resumed. Otherwise undefined.\n * @param options.stream - The stream of `UIMessageChunk`s to read.\n * @param options.terminateOnError - Whether to terminate the stream if an error occurs.\n * @param options.onError - A function that is called when an error occurs.\n *\n * @returns An `AsyncIterableStream` of `UIMessage`s. Each stream part is a different state of the same message\n * as it is being completed.\n */\nexport function readUIMessageStream<UI_MESSAGE extends UIMessage>({\n message,\n stream,\n onError,\n terminateOnError = false,\n}: {\n message?: UI_MESSAGE;\n stream: ReadableStream<UIMessageChunk>;\n onError?: (error: unknown) => void;\n terminateOnError?: boolean;\n}): AsyncIterableStream<UI_MESSAGE> {\n let controller: ReadableStreamDefaultController<UI_MESSAGE> | undefined;\n let hasErrored = false;\n\n const outputStream = new ReadableStream<UI_MESSAGE>({\n start(controllerParam) {\n controller = controllerParam;\n },\n });\n\n const state = createStreamingUIMessageState<UI_MESSAGE>({\n messageId: message?.id ?? '',\n lastMessage: message,\n });\n\n const handleError = (error: unknown) => {\n onError?.(error);\n\n if (!hasErrored && terminateOnError) {\n hasErrored = true;\n controller?.error(error);\n }\n };\n\n consumeStream({\n stream: processUIMessageStream({\n stream,\n runUpdateMessageJob(\n job: (options: {\n state: StreamingUIMessageState<UI_MESSAGE>;\n write: () => void;\n }) => Promise<void>,\n ) {\n return job({\n state,\n write: () => {\n controller?.enqueue(structuredClone(state.message));\n },\n });\n },\n onError: handleError,\n }),\n onError: handleError,\n }).finally(() => {\n // Only close if no error occurred. Calling close() on an errored controller\n // throws \"Invalid state: Controller is already closed\" TypeError.\n if (!hasErrored) {\n controller?.close();\n }\n });\n\n return createAsyncIterableStream(outputStream);\n}\n"],"mappings":"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","names":["import_provider_utils","import_provider_utils","import_provider","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","text","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","_a","import_provider_utils","_a","import_provider","import_provider_utils","_a","_a","import_provider_utils","object","name","tool","import_provider","import_provider_utils","import_v4","import_v4","import_v4","import_v4","import_v4","import_gateway","import_provider","_a","name","import_api","name","attributes","import_provider","import_provider_utils","content","import_provider_utils","import_provider_utils","tool","_a","import_provider","tool","generateId","_a","callSettings","tool","span","_b","_c","_d","_e","_f","toolCall","import_provider","import_provider_utils","import_provider_utils","import_v4","import_provider_utils","_a","part","resolve","resolve","_a","_a","import_provider_utils","tool","originalGenerateId","now","generateId","text","_a","includeRawChunks","stream","tool","doStreamSpan","_b","_c","_d","_a","embedding","usage","_a","embeddings","providerMetadata","usage","_a","import_provider_utils","import_provider","import_provider_utils","_a","import_provider","import_provider_utils","originalGenerateId","generateId","_a","span","result","text","object","import_provider_utils","resolve","import_provider_utils","_a","delay","delayFunction","originalGenerateId","generateId","now","doStreamSpan","object","_a","error","import_provider","text","_a","import_provider_utils","text","import_provider_utils","import_provider","delay","originalDelay","text","text","_a","import_provider","import_provider","name","marker","symbol","_a","import_provider","_a","import_provider_utils","import_provider_utils","import_v4","import_v4","resolve","_a","_b","_c","text","name","_a","resolve","import_provider","_a","import_provider_utils","fetch","_a","import_provider_utils","name","resolve","_a","import_provider_utils","import_provider_utils","fetch","_a","generateId","generateIdFunc","_a","tool","processBlock","_a","import_provider_utils","generateId","generateIdFunc","resolve","_a"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/generate-text/generate-text.ts","../src/error/no-output-specified-error.ts","../src/model/resolve-model.ts","../src/error/index.ts","../src/error/invalid-argument-error.ts","../src/error/invalid-stream-part-error.ts","../src/error/invalid-tool-input-error.ts","../src/error/mcp-client-error.ts","../src/error/no-image-generated-error.ts","../src/error/no-object-generated-error.ts","../src/error/no-output-generated-error.ts","../src/error/no-such-tool-error.ts","../src/error/tool-call-repair-error.ts","../src/error/unsupported-model-version-error.ts","../src/prompt/invalid-data-content-error.ts","../src/prompt/invalid-message-role-error.ts","../src/prompt/message-conversion-error.ts","../src/util/download-error.ts","../src/util/retry-error.ts","../src/prompt/convert-to-language-model-prompt.ts","../src/util/detect-media-type.ts","../src/util/download.ts","../src/prompt/data-content.ts","../src/prompt/split-data-url.ts","../src/prompt/prepare-call-settings.ts","../src/prompt/prepare-tools-and-tool-choice.ts","../src/util/is-non-empty-object.ts","../src/prompt/standardize-prompt.ts","../src/prompt/message.ts","../src/types/provider-metadata.ts","../src/types/json-value.ts","../src/prompt/content-part.ts","../src/prompt/wrap-gateway-error.ts","../src/telemetry/assemble-operation-name.ts","../src/telemetry/get-base-telemetry-attributes.ts","../src/telemetry/get-tracer.ts","../src/telemetry/noop-tracer.ts","../src/telemetry/record-span.ts","../src/telemetry/select-telemetry-attributes.ts","../src/telemetry/stringify-for-telemetry.ts","../src/types/usage.ts","../src/util/as-array.ts","../src/util/retry-with-exponential-backoff.ts","../src/util/prepare-retries.ts","../src/generate-text/extract-content-text.ts","../src/generate-text/generated-file.ts","../src/generate-text/parse-tool-call.ts","../src/generate-text/step-result.ts","../src/generate-text/stop-condition.ts","../src/prompt/create-tool-model-output.ts","../src/generate-text/to-response-messages.ts","../src/generate-text/stream-text.ts","../src/util/prepare-headers.ts","../src/text-stream/create-text-stream-response.ts","../src/util/write-to-server-response.ts","../src/text-stream/pipe-text-stream-to-response.ts","../src/ui-message-stream/json-to-sse-transform-stream.ts","../src/ui-message-stream/ui-message-stream-headers.ts","../src/ui-message-stream/create-ui-message-stream-response.ts","../src/ui-message-stream/get-response-ui-message-id.ts","../src/ui/process-ui-message-stream.ts","../src/ui-message-stream/ui-message-chunks.ts","../src/util/merge-objects.ts","../src/util/parse-partial-json.ts","../src/util/fix-json.ts","../src/ui/ui-messages.ts","../src/ui-message-stream/handle-ui-message-stream-finish.ts","../src/ui-message-stream/pipe-ui-message-stream-to-response.ts","../src/util/async-iterable-stream.ts","../src/util/consume-stream.ts","../src/util/create-resolvable-promise.ts","../src/util/create-stitchable-stream.ts","../src/util/delayed-promise.ts","../src/util/filter-stream-errors.ts","../src/util/now.ts","../src/generate-text/run-tools-transformation.ts","../src/agent/agent.ts","../src/embed/embed.ts","../src/util/split-array.ts","../src/embed/embed-many.ts","../src/generate-image/generate-image.ts","../src/generate-object/generate-object.ts","../src/generate-object/output-strategy.ts","../src/generate-object/parse-and-validate-object-result.ts","../src/generate-object/validate-object-generation-input.ts","../src/generate-object/stream-object.ts","../src/util/cosine-similarity.ts","../src/util/data-url.ts","../src/util/is-deep-equal-data.ts","../src/util/serial-job-executor.ts","../src/util/simulate-readable-stream.ts","../src/error/no-speech-generated-error.ts","../src/generate-speech/generated-audio-file.ts","../src/generate-speech/generate-speech.ts","../src/generate-text/output.ts","../src/generate-text/smooth-stream.ts","../src/middleware/default-settings-middleware.ts","../src/util/get-potential-start-index.ts","../src/middleware/extract-reasoning-middleware.ts","../src/middleware/simulate-streaming-middleware.ts","../src/middleware/wrap-language-model.ts","../src/middleware/wrap-provider.ts","../src/registry/custom-provider.ts","../src/registry/no-such-provider-error.ts","../src/registry/provider-registry.ts","../src/tool/mcp/mcp-client.ts","../src/tool/mcp/mcp-sse-transport.ts","../src/tool/mcp/json-rpc-message.ts","../src/tool/mcp/types.ts","../src/tool/mcp/mcp-transport.ts","../src/error/no-transcript-generated-error.ts","../src/transcribe/transcribe.ts","../src/ui/call-completion-api.ts","../src/ui/process-text-stream.ts","../src/ui/chat.ts","../src/ui/convert-file-list-to-file-ui-parts.ts","../src/ui/default-chat-transport.ts","../src/ui/http-chat-transport.ts","../src/ui/convert-to-model-messages.ts","../src/ui/last-assistant-message-is-complete-with-tool-calls.ts","../src/ui/transform-text-to-ui-message-stream.ts","../src/ui/text-stream-chat-transport.ts","../src/ui-message-stream/create-ui-message-stream.ts","../src/ui-message-stream/read-ui-message-stream.ts"],"sourcesContent":["// re-exports:\nexport {\n asSchema,\n createIdGenerator,\n dynamicTool,\n generateId,\n jsonSchema,\n tool,\n zodSchema,\n type IdGenerator,\n type InferToolInput,\n type InferToolOutput,\n type Schema,\n type Tool,\n type ToolCallOptions,\n type ToolExecuteFunction,\n} from '@ai-sdk/provider-utils';\n\n// directory exports\nexport * from './agent';\nexport * from './embed';\nexport * from './error';\nexport * from './generate-image';\nexport * from './generate-object';\nexport * from './generate-speech';\nexport * from './generate-text';\nexport * from './middleware';\nexport * from './prompt';\nexport * from './registry';\nexport * from './text-stream';\nexport * from './tool';\nexport * from './transcribe';\nexport * from './types';\nexport * from './ui';\nexport * from './ui-message-stream';\nexport * from './util';\n\n// telemetry types:\nexport type { TelemetrySettings } from './telemetry/telemetry-settings';\n\n// import globals\nimport './global';\n","import {\n LanguageModelV2,\n LanguageModelV2Content,\n LanguageModelV2ToolCall,\n} from '@ai-sdk/provider';\nimport {\n createIdGenerator,\n executeTool,\n getErrorMessage,\n IdGenerator,\n ProviderOptions,\n} from '@ai-sdk/provider-utils';\nimport { Tracer } from '@opentelemetry/api';\nimport { NoOutputSpecifiedError } from '../error/no-output-specified-error';\nimport { resolveLanguageModel } from '../model/resolve-model';\nimport { ModelMessage } from '../prompt';\nimport { CallSettings } from '../prompt/call-settings';\nimport { convertToLanguageModelPrompt } from '../prompt/convert-to-language-model-prompt';\nimport { prepareCallSettings } from '../prompt/prepare-call-settings';\nimport { prepareToolsAndToolChoice } from '../prompt/prepare-tools-and-tool-choice';\nimport { Prompt } from '../prompt/prompt';\nimport { standardizePrompt } from '../prompt/standardize-prompt';\nimport { wrapGatewayError } from '../prompt/wrap-gateway-error';\nimport { assembleOperationName } from '../telemetry/assemble-operation-name';\nimport { getBaseTelemetryAttributes } from '../telemetry/get-base-telemetry-attributes';\nimport { getTracer } from '../telemetry/get-tracer';\nimport { recordErrorOnSpan, recordSpan } from '../telemetry/record-span';\nimport { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';\nimport { stringifyForTelemetry } from '../telemetry/stringify-for-telemetry';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport { LanguageModel, ToolChoice } from '../types';\nimport { addLanguageModelUsage, LanguageModelUsage } from '../types/usage';\nimport { asArray } from '../util/as-array';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { ContentPart } from './content-part';\nimport { extractContentText } from './extract-content-text';\nimport { GenerateTextResult } from './generate-text-result';\nimport { DefaultGeneratedFile } from './generated-file';\nimport { Output } from './output';\nimport { parseToolCall } from './parse-tool-call';\nimport { PrepareStepFunction } from './prepare-step';\nimport { ResponseMessage } from './response-message';\nimport { DefaultStepResult, StepResult } from './step-result';\nimport {\n isStopConditionMet,\n stepCountIs,\n StopCondition,\n} from './stop-condition';\nimport { toResponseMessages } from './to-response-messages';\nimport { TypedToolCall } from './tool-call';\nimport { ToolCallRepairFunction } from './tool-call-repair-function';\nimport { TypedToolError } from './tool-error';\nimport { ToolOutput } from './tool-output';\nimport { TypedToolResult } from './tool-result';\nimport { ToolSet } from './tool-set';\n\nconst originalGenerateId = createIdGenerator({\n prefix: 'aitxt',\n size: 24,\n});\n\n/**\nCallback that is set using the `onStepFinish` option.\n\n@param stepResult - The result of the step.\n */\nexport type GenerateTextOnStepFinishCallback<TOOLS extends ToolSet> = (\n stepResult: StepResult<TOOLS>,\n) => Promise<void> | void;\n\n/**\nGenerate a text and call tools for a given prompt using a language model.\n\nThis function does not stream the output. If you want to stream the output, use `streamText` instead.\n\n@param model - The language model to use.\n\n@param tools - Tools that are accessible to and can be called by the model. The model needs to support calling tools.\n@param toolChoice - The tool choice strategy. Default: 'auto'.\n\n@param system - A system message that will be part of the prompt.\n@param prompt - A simple text prompt. You can either use `prompt` or `messages` but not both.\n@param messages - A list of messages. You can either use `prompt` or `messages` but not both.\n\n@param maxOutputTokens - Maximum number of tokens to generate.\n@param temperature - Temperature setting.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topP - Nucleus sampling.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topK - Only sample from the top K options for each subsequent token.\nUsed to remove \"long tail\" low probability responses.\nRecommended for advanced use cases only. You usually only need to use temperature.\n@param presencePenalty - Presence penalty setting.\nIt affects the likelihood of the model to repeat information that is already in the prompt.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param frequencyPenalty - Frequency penalty setting.\nIt affects the likelihood of the model to repeatedly use the same words or phrases.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param stopSequences - Stop sequences.\nIf set, the model will stop generating text when one of the stop sequences is generated.\n@param seed - The seed (integer) to use for random sampling.\nIf set and supported by the model, calls will generate deterministic results.\n\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@param experimental_generateMessageId - Generate a unique ID for each message.\n\n@param onStepFinish - Callback that is called when each step (LLM call) is finished, including intermediate steps.\n\n@returns\nA result object that contains the generated text, the results of the tool calls, and additional information.\n */\nexport async function generateText<\n TOOLS extends ToolSet,\n OUTPUT = never,\n OUTPUT_PARTIAL = never,\n>({\n model: modelArg,\n tools,\n toolChoice,\n system,\n prompt,\n messages,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n stopWhen = stepCountIs(1),\n experimental_output: output,\n experimental_telemetry: telemetry,\n providerOptions,\n experimental_activeTools,\n activeTools = experimental_activeTools,\n experimental_prepareStep,\n prepareStep = experimental_prepareStep,\n experimental_repairToolCall: repairToolCall,\n experimental_context,\n _internal: {\n generateId = originalGenerateId,\n currentDate = () => new Date(),\n } = {},\n onStepFinish,\n ...settings\n}: CallSettings &\n Prompt & {\n /**\nThe language model to use.\n */\n model: LanguageModel;\n\n /**\nThe tools that the model can call. The model needs to support calling tools.\n*/\n tools?: TOOLS;\n\n /**\nThe tool choice strategy. Default: 'auto'.\n */\n toolChoice?: ToolChoice<NoInfer<TOOLS>>;\n\n /**\nCondition for stopping the generation when there are tool results in the last step.\nWhen the condition is an array, any of the conditions can be met to stop the generation.\n\n@default stepCountIs(1)\n */\n stopWhen?:\n | StopCondition<NoInfer<TOOLS>>\n | Array<StopCondition<NoInfer<TOOLS>>>;\n\n /**\nOptional telemetry configuration (experimental).\n */\n experimental_telemetry?: TelemetrySettings;\n\n /**\nAdditional provider-specific options. 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\n /**\n * @deprecated Use `activeTools` instead.\n */\n experimental_activeTools?: Array<keyof NoInfer<TOOLS>>;\n\n /**\nLimits the tools that are available for the model to call without\nchanging the tool call and result types in the result.\n */\n activeTools?: Array<keyof NoInfer<TOOLS>>;\n\n /**\nOptional specification for parsing structured outputs from the LLM response.\n */\n experimental_output?: Output<OUTPUT, OUTPUT_PARTIAL>;\n\n /**\n * @deprecated Use `prepareStep` instead.\n */\n experimental_prepareStep?: PrepareStepFunction<NoInfer<TOOLS>>;\n\n /**\nOptional function that you can use to provide different settings for a step.\n */\n prepareStep?: PrepareStepFunction<NoInfer<TOOLS>>;\n\n /**\nA function that attempts to repair a tool call that failed to parse.\n */\n experimental_repairToolCall?: ToolCallRepairFunction<NoInfer<TOOLS>>;\n\n /**\n Callback that is called when each step (LLM call) is finished, including intermediate steps.\n */\n onStepFinish?: GenerateTextOnStepFinishCallback<NoInfer<TOOLS>>;\n\n /**\n * Context that is passed into tool execution.\n *\n * Experimental (can break in patch releases).\n *\n * @default undefined\n */\n experimental_context?: unknown;\n\n /**\n * Internal. For test use only. May change without notice.\n */\n _internal?: {\n generateId?: IdGenerator;\n currentDate?: () => Date;\n };\n }): Promise<GenerateTextResult<TOOLS, OUTPUT>> {\n const model = resolveLanguageModel(modelArg);\n const stopConditions = asArray(stopWhen);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const callSettings = prepareCallSettings(settings);\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries },\n });\n\n const initialPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n });\n\n const tracer = getTracer(telemetry);\n\n try {\n return await recordSpan({\n name: 'ai.generateText',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.generateText',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // model:\n 'ai.model.provider': model.provider,\n 'ai.model.id': model.modelId,\n // specific settings that only make sense on the outer level:\n 'ai.prompt': {\n input: () => JSON.stringify({ system, prompt, messages }),\n },\n },\n }),\n tracer,\n fn: async span => {\n const callSettings = prepareCallSettings(settings);\n\n let currentModelResponse: Awaited<\n ReturnType<LanguageModelV2['doGenerate']>\n > & { response: { id: string; timestamp: Date; modelId: string } };\n let clientToolCalls: Array<TypedToolCall<TOOLS>> = [];\n let clientToolOutputs: Array<ToolOutput<TOOLS>> = [];\n const responseMessages: Array<ResponseMessage> = [];\n const steps: GenerateTextResult<TOOLS, OUTPUT>['steps'] = [];\n\n do {\n const stepInputMessages = [\n ...initialPrompt.messages,\n ...responseMessages,\n ];\n\n const prepareStepResult = await prepareStep?.({\n model,\n steps,\n stepNumber: steps.length,\n messages: stepInputMessages,\n });\n\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: {\n system: prepareStepResult?.system ?? initialPrompt.system,\n messages: prepareStepResult?.messages ?? stepInputMessages,\n },\n supportedUrls: await model.supportedUrls,\n });\n\n const stepModel = resolveLanguageModel(\n prepareStepResult?.model ?? model,\n );\n\n const { toolChoice: stepToolChoice, tools: stepTools } =\n prepareToolsAndToolChoice({\n tools,\n toolChoice: prepareStepResult?.toolChoice ?? toolChoice,\n activeTools: prepareStepResult?.activeTools ?? activeTools,\n });\n\n currentModelResponse = await retry(() =>\n recordSpan({\n name: 'ai.generateText.doGenerate',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.generateText.doGenerate',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // model:\n 'ai.model.provider': stepModel.provider,\n 'ai.model.id': stepModel.modelId,\n // prompt:\n 'ai.prompt.messages': {\n input: () => stringifyForTelemetry(promptMessages),\n },\n 'ai.prompt.tools': {\n // convert the language model level tools:\n input: () => stepTools?.map(tool => JSON.stringify(tool)),\n },\n 'ai.prompt.toolChoice': {\n input: () =>\n stepToolChoice != null\n ? JSON.stringify(stepToolChoice)\n : undefined,\n },\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.system': stepModel.provider,\n 'gen_ai.request.model': stepModel.modelId,\n 'gen_ai.request.frequency_penalty': settings.frequencyPenalty,\n 'gen_ai.request.max_tokens': settings.maxOutputTokens,\n 'gen_ai.request.presence_penalty': settings.presencePenalty,\n 'gen_ai.request.stop_sequences': settings.stopSequences,\n 'gen_ai.request.temperature':\n settings.temperature ?? undefined,\n 'gen_ai.request.top_k': settings.topK,\n 'gen_ai.request.top_p': settings.topP,\n },\n }),\n tracer,\n fn: async span => {\n const result = await stepModel.doGenerate({\n ...callSettings,\n tools: stepTools,\n toolChoice: stepToolChoice,\n responseFormat: output?.responseFormat,\n prompt: promptMessages,\n providerOptions,\n abortSignal,\n headers,\n });\n\n // Fill in default values:\n const responseData = {\n id: result.response?.id ?? generateId(),\n timestamp: result.response?.timestamp ?? currentDate(),\n modelId: result.response?.modelId ?? stepModel.modelId,\n headers: result.response?.headers,\n body: result.response?.body,\n };\n\n // Add response information to the span:\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.response.finishReason': result.finishReason,\n 'ai.response.text': {\n output: () => extractContentText(result.content),\n },\n 'ai.response.toolCalls': {\n output: () => {\n const toolCalls = asToolCalls(result.content);\n return toolCalls == null\n ? undefined\n : JSON.stringify(toolCalls);\n },\n },\n 'ai.response.id': responseData.id,\n 'ai.response.model': responseData.modelId,\n 'ai.response.timestamp':\n responseData.timestamp.toISOString(),\n 'ai.response.providerMetadata': JSON.stringify(\n result.providerMetadata,\n ),\n\n // TODO rename telemetry attributes to inputTokens and outputTokens\n 'ai.usage.promptTokens': result.usage.inputTokens,\n 'ai.usage.completionTokens': result.usage.outputTokens,\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.response.finish_reasons': [result.finishReason],\n 'gen_ai.response.id': responseData.id,\n 'gen_ai.response.model': responseData.modelId,\n 'gen_ai.usage.input_tokens': result.usage.inputTokens,\n 'gen_ai.usage.output_tokens': result.usage.outputTokens,\n },\n }),\n );\n\n return { ...result, response: responseData };\n },\n }),\n );\n\n // parse tool calls:\n const stepToolCalls: TypedToolCall<TOOLS>[] = await Promise.all(\n currentModelResponse.content\n .filter(\n (part): part is LanguageModelV2ToolCall =>\n part.type === 'tool-call',\n )\n .map(toolCall =>\n parseToolCall({\n toolCall,\n tools,\n repairToolCall,\n system,\n messages: stepInputMessages,\n }),\n ),\n );\n\n // notify the tools that the tool calls are available:\n for (const toolCall of stepToolCalls) {\n if (toolCall.invalid) {\n continue; // ignore invalid tool calls\n }\n\n const tool = tools![toolCall.toolName];\n if (tool?.onInputAvailable != null) {\n await tool.onInputAvailable({\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n messages: stepInputMessages,\n abortSignal,\n experimental_context,\n });\n }\n }\n\n // insert error tool outputs for invalid tool calls:\n // TODO AI SDK 6: invalid inputs should not require output parts\n const invalidToolCalls = stepToolCalls.filter(\n toolCall => toolCall.invalid && toolCall.dynamic,\n );\n\n clientToolOutputs = [];\n\n for (const toolCall of invalidToolCalls) {\n clientToolOutputs.push({\n type: 'tool-error',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n error: getErrorMessage(toolCall.error!),\n dynamic: true,\n });\n }\n\n // execute client tool calls:\n clientToolCalls = stepToolCalls.filter(\n toolCall => !toolCall.providerExecuted,\n );\n\n if (tools != null) {\n clientToolOutputs.push(\n ...(await executeTools({\n toolCalls: clientToolCalls.filter(\n toolCall => !toolCall.invalid,\n ),\n tools,\n tracer,\n telemetry,\n messages: stepInputMessages,\n abortSignal,\n experimental_context,\n })),\n );\n }\n\n // content:\n const stepContent = asContent({\n content: currentModelResponse.content,\n toolCalls: stepToolCalls,\n toolOutputs: clientToolOutputs,\n });\n\n // append to messages for potential next step:\n responseMessages.push(\n ...toResponseMessages({\n content: stepContent,\n tools,\n }),\n );\n\n // Add step information (after response messages are updated):\n const currentStepResult: StepResult<TOOLS> = new DefaultStepResult({\n content: stepContent,\n finishReason: currentModelResponse.finishReason,\n usage: currentModelResponse.usage,\n warnings: currentModelResponse.warnings,\n providerMetadata: currentModelResponse.providerMetadata,\n request: currentModelResponse.request ?? {},\n response: {\n ...currentModelResponse.response,\n // deep clone msgs to avoid mutating past messages in multi-step:\n messages: structuredClone(responseMessages),\n },\n });\n\n steps.push(currentStepResult);\n await onStepFinish?.(currentStepResult);\n } while (\n // there are tool calls:\n clientToolCalls.length > 0 &&\n // all current tool calls have outputs (incl. execution errors):\n clientToolOutputs.length === clientToolCalls.length &&\n // continue until a stop condition is met:\n !(await isStopConditionMet({ stopConditions, steps }))\n );\n\n // Add response information to the span:\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.response.finishReason': currentModelResponse.finishReason,\n 'ai.response.text': {\n output: () => extractContentText(currentModelResponse.content),\n },\n 'ai.response.toolCalls': {\n output: () => {\n const toolCalls = asToolCalls(currentModelResponse.content);\n return toolCalls == null\n ? undefined\n : JSON.stringify(toolCalls);\n },\n },\n 'ai.response.providerMetadata': JSON.stringify(\n currentModelResponse.providerMetadata,\n ),\n\n // TODO rename telemetry attributes to inputTokens and outputTokens\n 'ai.usage.promptTokens': currentModelResponse.usage.inputTokens,\n 'ai.usage.completionTokens':\n currentModelResponse.usage.outputTokens,\n },\n }),\n );\n\n const lastStep = steps[steps.length - 1];\n\n return new DefaultGenerateTextResult({\n steps,\n resolvedOutput: await output?.parseOutput(\n { text: lastStep.text },\n {\n response: lastStep.response,\n usage: lastStep.usage,\n finishReason: lastStep.finishReason,\n },\n ),\n });\n },\n });\n } catch (error) {\n throw wrapGatewayError(error);\n }\n}\n\nasync function executeTools<TOOLS extends ToolSet>({\n toolCalls,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n}: {\n toolCalls: Array<TypedToolCall<TOOLS>>;\n tools: TOOLS;\n tracer: Tracer;\n telemetry: TelemetrySettings | undefined;\n messages: ModelMessage[];\n abortSignal: AbortSignal | undefined;\n experimental_context: unknown;\n}): Promise<Array<ToolOutput<TOOLS>>> {\n const toolOutputs = await Promise.all(\n toolCalls.map(async ({ toolCallId, toolName, input }) => {\n const tool = tools[toolName];\n\n if (tool?.execute == null) {\n return undefined;\n }\n\n return recordSpan({\n name: 'ai.toolCall',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.toolCall',\n telemetry,\n }),\n 'ai.toolCall.name': toolName,\n 'ai.toolCall.id': toolCallId,\n 'ai.toolCall.args': {\n output: () => JSON.stringify(input),\n },\n },\n }),\n tracer,\n fn: async span => {\n try {\n const stream = executeTool({\n execute: tool.execute!.bind(tool),\n input,\n options: {\n toolCallId,\n messages,\n abortSignal,\n experimental_context,\n },\n });\n\n let output: unknown;\n for await (const part of stream) {\n if (part.type === 'final') {\n output = part.output;\n }\n }\n try {\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.toolCall.result': {\n output: () => JSON.stringify(output),\n },\n },\n }),\n );\n } catch (ignored) {\n // JSON stringify might fail if the result is not serializable,\n // in which case we just ignore it. In the future we might want to\n // add an optional serialize method to the tool interface and warn\n // if the result is not serializable.\n }\n\n return {\n type: 'tool-result',\n toolCallId,\n toolName,\n input,\n output,\n dynamic: tool.type === 'dynamic',\n } as TypedToolResult<TOOLS>;\n } catch (error) {\n recordErrorOnSpan(span, error);\n return {\n type: 'tool-error',\n toolCallId,\n toolName,\n input,\n error,\n dynamic: tool.type === 'dynamic',\n } as TypedToolError<TOOLS>;\n }\n },\n });\n }),\n );\n\n return toolOutputs.filter(\n (output): output is NonNullable<typeof output> => output != null,\n );\n}\n\nclass DefaultGenerateTextResult<TOOLS extends ToolSet, OUTPUT>\n implements GenerateTextResult<TOOLS, OUTPUT>\n{\n readonly steps: GenerateTextResult<TOOLS, OUTPUT>['steps'];\n\n private readonly resolvedOutput: OUTPUT;\n\n constructor(options: {\n steps: GenerateTextResult<TOOLS, OUTPUT>['steps'];\n resolvedOutput: OUTPUT;\n }) {\n this.steps = options.steps;\n this.resolvedOutput = options.resolvedOutput;\n }\n\n private get finalStep() {\n return this.steps[this.steps.length - 1];\n }\n\n get content() {\n return this.finalStep.content;\n }\n\n get text() {\n return this.finalStep.text;\n }\n\n get files() {\n return this.finalStep.files;\n }\n\n get reasoningText() {\n return this.finalStep.reasoningText;\n }\n\n get reasoning() {\n return this.finalStep.reasoning;\n }\n\n get toolCalls() {\n return this.finalStep.toolCalls;\n }\n\n get staticToolCalls() {\n return this.finalStep.staticToolCalls;\n }\n\n get dynamicToolCalls() {\n return this.finalStep.dynamicToolCalls;\n }\n\n get toolResults() {\n return this.finalStep.toolResults;\n }\n\n get staticToolResults() {\n return this.finalStep.staticToolResults;\n }\n\n get dynamicToolResults() {\n return this.finalStep.dynamicToolResults;\n }\n\n get sources() {\n return this.finalStep.sources;\n }\n\n get finishReason() {\n return this.finalStep.finishReason;\n }\n\n get warnings() {\n return this.finalStep.warnings;\n }\n\n get providerMetadata() {\n return this.finalStep.providerMetadata;\n }\n\n get response() {\n return this.finalStep.response;\n }\n\n get request() {\n return this.finalStep.request;\n }\n\n get usage() {\n return this.finalStep.usage;\n }\n\n get totalUsage() {\n return this.steps.reduce(\n (totalUsage, step) => {\n return addLanguageModelUsage(totalUsage, step.usage);\n },\n {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n reasoningTokens: undefined,\n cachedInputTokens: undefined,\n } as LanguageModelUsage,\n );\n }\n\n get experimental_output() {\n if (this.resolvedOutput == null) {\n throw new NoOutputSpecifiedError();\n }\n\n return this.resolvedOutput;\n }\n}\n\nfunction asToolCalls(content: Array<LanguageModelV2Content>) {\n const parts = content.filter(\n (part): part is LanguageModelV2ToolCall => part.type === 'tool-call',\n );\n\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.map(toolCall => ({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n }));\n}\n\nfunction asContent<TOOLS extends ToolSet>({\n content,\n toolCalls,\n toolOutputs,\n}: {\n content: Array<LanguageModelV2Content>;\n toolCalls: Array<TypedToolCall<TOOLS>>;\n toolOutputs: Array<ToolOutput<TOOLS>>;\n}): Array<ContentPart<TOOLS>> {\n return [\n ...content.map(part => {\n switch (part.type) {\n case 'text':\n case 'reasoning':\n case 'source':\n return part;\n\n case 'file': {\n return {\n type: 'file' as const,\n file: new DefaultGeneratedFile(part),\n };\n }\n\n case 'tool-call': {\n return toolCalls.find(\n toolCall => toolCall.toolCallId === part.toolCallId,\n )!;\n }\n\n case 'tool-result': {\n const toolCall = toolCalls.find(\n toolCall => toolCall.toolCallId === part.toolCallId,\n )!;\n\n if (toolCall == null) {\n throw new Error(`Tool call ${part.toolCallId} not found.`);\n }\n\n if (part.isError) {\n return {\n type: 'tool-error' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName as keyof TOOLS & string,\n input: toolCall.input,\n error: part.result,\n providerExecuted: true,\n dynamic: toolCall.dynamic,\n } as TypedToolError<TOOLS>;\n }\n\n return {\n type: 'tool-result' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName as keyof TOOLS & string,\n input: toolCall.input,\n output: part.result,\n providerExecuted: true,\n dynamic: toolCall.dynamic,\n } as TypedToolResult<TOOLS>;\n }\n }\n }),\n ...toolOutputs,\n ];\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_NoOutputSpecifiedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\nThrown when no output type is specified and output-related methods are called.\n */\nexport class NoOutputSpecifiedError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message = 'No output specified.' }: { message?: string } = {}) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is NoOutputSpecifiedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { gateway } from '@ai-sdk/gateway';\nimport {\n EmbeddingModelV2,\n LanguageModelV2,\n ProviderV2,\n} from '@ai-sdk/provider';\nimport { UnsupportedModelVersionError } from '../error';\nimport { EmbeddingModel } from '../types/embedding-model';\nimport { LanguageModel } from '../types/language-model';\n\nexport function resolveLanguageModel(model: LanguageModel): LanguageModelV2 {\n if (typeof model !== 'string') {\n if (model.specificationVersion !== 'v2') {\n throw new UnsupportedModelVersionError({\n version: model.specificationVersion,\n provider: model.provider,\n modelId: model.modelId,\n });\n }\n\n return model;\n }\n\n return getGlobalProvider().languageModel(model);\n}\n\nexport function resolveEmbeddingModel<VALUE = string>(\n model: EmbeddingModel<VALUE>,\n): EmbeddingModelV2<VALUE> {\n if (typeof model !== 'string') {\n if (model.specificationVersion !== 'v2') {\n throw new UnsupportedModelVersionError({\n version: model.specificationVersion,\n provider: model.provider,\n modelId: model.modelId,\n });\n }\n\n return model;\n }\n\n // TODO AI SDK 6: figure out how to cleanly support different generic types\n return getGlobalProvider().textEmbeddingModel(\n model,\n ) as EmbeddingModelV2<VALUE>;\n}\n\nfunction getGlobalProvider(): ProviderV2 {\n return globalThis.AI_SDK_DEFAULT_PROVIDER ?? gateway;\n}\n","export {\n AISDKError,\n APICallError,\n EmptyResponseBodyError,\n InvalidPromptError,\n InvalidResponseDataError,\n JSONParseError,\n LoadAPIKeyError,\n NoContentGeneratedError,\n NoSuchModelError,\n TypeValidationError,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\n\nexport { InvalidArgumentError } from './invalid-argument-error';\nexport { InvalidStreamPartError } from './invalid-stream-part-error';\nexport { InvalidToolInputError } from './invalid-tool-input-error';\nexport { MCPClientError } from './mcp-client-error';\nexport { NoImageGeneratedError } from './no-image-generated-error';\nexport { NoObjectGeneratedError } from './no-object-generated-error';\nexport { NoOutputGeneratedError } from './no-output-generated-error';\nexport { NoOutputSpecifiedError } from './no-output-specified-error';\nexport { NoSuchToolError } from './no-such-tool-error';\nexport { ToolCallRepairError } from './tool-call-repair-error';\nexport { UnsupportedModelVersionError } from './unsupported-model-version-error';\n\nexport { InvalidDataContentError } from '../prompt/invalid-data-content-error';\nexport { InvalidMessageRoleError } from '../prompt/invalid-message-role-error';\nexport { MessageConversionError } from '../prompt/message-conversion-error';\nexport { DownloadError } from '../util/download-error';\nexport { RetryError } from '../util/retry-error';\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_InvalidArgumentError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class InvalidArgumentError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly parameter: string;\n readonly value: unknown;\n\n constructor({\n parameter,\n value,\n message,\n }: {\n parameter: string;\n value: unknown;\n message: string;\n }) {\n super({\n name,\n message: `Invalid argument for parameter ${parameter}: ${message}`,\n });\n\n this.parameter = parameter;\n this.value = value;\n }\n\n static isInstance(error: unknown): error is InvalidArgumentError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\nimport { SingleRequestTextStreamPart } from '../generate-text/run-tools-transformation';\n\nconst name = 'AI_InvalidStreamPartError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class InvalidStreamPartError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly chunk: SingleRequestTextStreamPart<any>;\n\n constructor({\n chunk,\n message,\n }: {\n chunk: SingleRequestTextStreamPart<any>;\n message: string;\n }) {\n super({ name, message });\n\n this.chunk = chunk;\n }\n\n static isInstance(error: unknown): error is InvalidStreamPartError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError, getErrorMessage } from '@ai-sdk/provider';\n\nconst name = 'AI_InvalidToolInputError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class InvalidToolInputError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly toolName: string;\n readonly toolInput: string;\n\n constructor({\n toolInput,\n toolName,\n cause,\n message = `Invalid input for tool ${toolName}: ${getErrorMessage(cause)}`,\n }: {\n message?: string;\n toolInput: string;\n toolName: string;\n cause: unknown;\n }) {\n super({ name, message, cause });\n\n this.toolInput = toolInput;\n this.toolName = toolName;\n }\n\n static isInstance(error: unknown): error is InvalidToolInputError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_MCPClientError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * An error occurred with the MCP client.\n */\nexport class MCPClientError extends AISDKError {\n private readonly [symbol] = true;\n\n constructor({\n name = 'MCPClientError',\n message,\n cause,\n }: {\n name?: string;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n }\n\n static isInstance(error: unknown): error is MCPClientError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\nimport { ImageModelResponseMetadata } from '../types/image-model-response-metadata';\n\nconst name = 'AI_NoImageGeneratedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\nThrown when no image could be generated. This can have multiple causes:\n\n- The model failed to generate a response.\n- The model generated a response that could not be parsed.\n */\nexport class NoImageGeneratedError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n /**\nThe response metadata for each call.\n */\n readonly responses: Array<ImageModelResponseMetadata> | undefined;\n\n constructor({\n message = 'No image generated.',\n cause,\n responses,\n }: {\n message?: string;\n cause?: Error;\n responses?: Array<ImageModelResponseMetadata>;\n }) {\n super({ name, message, cause });\n\n this.responses = responses;\n }\n\n static isInstance(error: unknown): error is NoImageGeneratedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\nimport { FinishReason } from '../types/language-model';\nimport { LanguageModelResponseMetadata } from '../types/language-model-response-metadata';\nimport { LanguageModelUsage } from '../types/usage';\n\nconst name = 'AI_NoObjectGeneratedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\nThrown when no object could be generated. This can have several causes:\n\n- The model failed to generate a response.\n- The model generated a response that could not be parsed.\n- The model generated a response that could not be validated against the schema.\n\nThe error contains the following properties:\n\n- `text`: The text that was generated by the model. This can be the raw text or the tool call text, depending on the model.\n */\nexport class NoObjectGeneratedError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n /**\n The text that was generated by the model. This can be the raw text or the tool call text, depending on the model.\n */\n readonly text: string | undefined;\n\n /**\n The response metadata.\n */\n readonly response: LanguageModelResponseMetadata | undefined;\n\n /**\n The usage of the model.\n */\n readonly usage: LanguageModelUsage | undefined;\n\n /**\n Reason why the model finished generating a response.\n */\n readonly finishReason: FinishReason | undefined;\n\n constructor({\n message = 'No object generated.',\n cause,\n text,\n response,\n usage,\n finishReason,\n }: {\n message?: string;\n cause?: Error;\n text?: string;\n response: LanguageModelResponseMetadata;\n usage: LanguageModelUsage;\n finishReason: FinishReason;\n }) {\n super({ name, message, cause });\n\n this.text = text;\n this.response = response;\n this.usage = usage;\n this.finishReason = finishReason;\n }\n\n static isInstance(error: unknown): error is NoObjectGeneratedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n\nexport function verifyNoObjectGeneratedError(\n error: unknown,\n expected: {\n message: string;\n response: LanguageModelResponseMetadata & {\n body?: string;\n };\n usage: LanguageModelUsage;\n finishReason: FinishReason;\n },\n) {\n expect(NoObjectGeneratedError.isInstance(error)).toBeTruthy();\n const noObjectGeneratedError = error as NoObjectGeneratedError;\n expect(noObjectGeneratedError.message).toEqual(expected.message);\n expect(noObjectGeneratedError.response).toEqual(expected.response);\n expect(noObjectGeneratedError.usage).toEqual(expected.usage);\n expect(noObjectGeneratedError.finishReason).toEqual(expected.finishReason);\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_NoOutputGeneratedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\nThrown when no LLM output was generated, e.g. because of errors.\n */\nexport class NoOutputGeneratedError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({\n message = 'No output generated.',\n cause,\n }: {\n message?: string;\n cause?: Error;\n } = {}) {\n super({ name, message, cause });\n }\n\n static isInstance(error: unknown): error is NoOutputGeneratedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_NoSuchToolError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class NoSuchToolError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly toolName: string;\n readonly availableTools: string[] | undefined;\n\n constructor({\n toolName,\n availableTools = undefined,\n message = `Model tried to call unavailable tool '${toolName}'. ${\n availableTools === undefined\n ? 'No tools are available.'\n : `Available tools: ${availableTools.join(', ')}.`\n }`,\n }: {\n toolName: string;\n availableTools?: string[] | undefined;\n message?: string;\n }) {\n super({ name, message });\n\n this.toolName = toolName;\n this.availableTools = availableTools;\n }\n\n static isInstance(error: unknown): error is NoSuchToolError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError, getErrorMessage } from '@ai-sdk/provider';\nimport { InvalidToolInputError } from './invalid-tool-input-error';\nimport { NoSuchToolError } from './no-such-tool-error';\n\nconst name = 'AI_ToolCallRepairError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class ToolCallRepairError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly originalError: NoSuchToolError | InvalidToolInputError;\n\n constructor({\n cause,\n originalError,\n message = `Error repairing tool call: ${getErrorMessage(cause)}`,\n }: {\n message?: string;\n cause: unknown;\n originalError: NoSuchToolError | InvalidToolInputError;\n }) {\n super({ name, message, cause });\n this.originalError = originalError;\n }\n\n static isInstance(error: unknown): error is ToolCallRepairError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\n/**\nError that is thrown when a model with an unsupported version is used.\n */\nexport class UnsupportedModelVersionError extends AISDKError {\n readonly version: string;\n readonly provider: string;\n readonly modelId: string;\n\n constructor(options: { version: string; provider: string; modelId: string }) {\n super({\n name: 'AI_UnsupportedModelVersionError',\n message:\n `Unsupported model version ${options.version} for provider \"${options.provider}\" and model \"${options.modelId}\". ` +\n `AI SDK 5 only supports models that implement specification version \"v2\".`,\n });\n\n this.version = options.version;\n this.provider = options.provider;\n this.modelId = options.modelId;\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_InvalidDataContentError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class InvalidDataContentError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly content: unknown;\n\n constructor({\n content,\n cause,\n message = `Invalid data content. Expected a base64 string, Uint8Array, ArrayBuffer, or Buffer, but got ${typeof content}.`,\n }: {\n content: unknown;\n cause?: unknown;\n message?: string;\n }) {\n super({ name, message, cause });\n\n this.content = content;\n }\n\n static isInstance(error: unknown): error is InvalidDataContentError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_InvalidMessageRoleError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class InvalidMessageRoleError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly role: string;\n\n constructor({\n role,\n message = `Invalid message role: '${role}'. Must be one of: \"system\", \"user\", \"assistant\", \"tool\".`,\n }: {\n role: string;\n message?: string;\n }) {\n super({ name, message });\n\n this.role = role;\n }\n\n static isInstance(error: unknown): error is InvalidMessageRoleError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\nimport { UIMessage } from '../ui/ui-messages';\n\nconst name = 'AI_MessageConversionError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class MessageConversionError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly originalMessage: Omit<UIMessage, 'id'>;\n\n constructor({\n originalMessage,\n message,\n }: {\n originalMessage: Omit<UIMessage, 'id'>;\n message: string;\n }) {\n super({ name, message });\n\n this.originalMessage = originalMessage;\n }\n\n static isInstance(error: unknown): error is MessageConversionError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_DownloadError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class DownloadError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly url: string;\n readonly statusCode?: number;\n readonly statusText?: string;\n\n constructor({\n url,\n statusCode,\n statusText,\n cause,\n message = cause == null\n ? `Failed to download ${url}: ${statusCode} ${statusText}`\n : `Failed to download ${url}: ${cause}`,\n }: {\n url: string;\n statusCode?: number;\n statusText?: string;\n message?: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n\n this.url = url;\n this.statusCode = statusCode;\n this.statusText = statusText;\n }\n\n static isInstance(error: unknown): error is DownloadError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_RetryError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport type RetryErrorReason =\n | 'maxRetriesExceeded'\n | 'errorNotRetryable'\n | 'abort';\n\nexport class RetryError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n // note: property order determines debugging output\n readonly reason: RetryErrorReason;\n readonly lastError: unknown;\n readonly errors: Array<unknown>;\n\n constructor({\n message,\n reason,\n errors,\n }: {\n message: string;\n reason: RetryErrorReason;\n errors: Array<unknown>;\n }) {\n super({ name, message });\n\n this.reason = reason;\n this.errors = errors;\n\n // separate our last error to make debugging via log easier:\n this.lastError = errors[errors.length - 1];\n }\n\n static isInstance(error: unknown): error is RetryError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import {\n LanguageModelV2FilePart,\n LanguageModelV2Message,\n LanguageModelV2Prompt,\n LanguageModelV2TextPart,\n} from '@ai-sdk/provider';\nimport {\n DataContent,\n FilePart,\n ImagePart,\n isUrlSupported,\n ModelMessage,\n TextPart,\n} from '@ai-sdk/provider-utils';\nimport {\n detectMediaType,\n imageMediaTypeSignatures,\n} from '../util/detect-media-type';\nimport { download } from '../util/download';\nimport { convertToLanguageModelV2DataContent } from './data-content';\nimport { InvalidMessageRoleError } from './invalid-message-role-error';\nimport { StandardizedPrompt } from './standardize-prompt';\n\nexport async function convertToLanguageModelPrompt({\n prompt,\n supportedUrls,\n downloadImplementation = download,\n}: {\n prompt: StandardizedPrompt;\n supportedUrls: Record<string, RegExp[]>;\n downloadImplementation?: typeof download;\n}): Promise<LanguageModelV2Prompt> {\n const downloadedAssets = await downloadAssets(\n prompt.messages,\n downloadImplementation,\n supportedUrls,\n );\n\n return [\n ...(prompt.system != null\n ? [{ role: 'system' as const, content: prompt.system }]\n : []),\n ...prompt.messages.map(message =>\n convertToLanguageModelMessage({ message, downloadedAssets }),\n ),\n ];\n}\n\n/**\n * Convert a ModelMessage to a LanguageModelV2Message.\n *\n * @param message The ModelMessage to convert.\n * @param downloadedAssets A map of URLs to their downloaded data. Only\n * available if the model does not support URLs, null otherwise.\n */\nexport function convertToLanguageModelMessage({\n message,\n downloadedAssets,\n}: {\n message: ModelMessage;\n downloadedAssets: Record<\n string,\n { mediaType: string | undefined; data: Uint8Array }\n >;\n}): LanguageModelV2Message {\n const role = message.role;\n switch (role) {\n case 'system': {\n return {\n role: 'system',\n content: message.content,\n providerOptions: message.providerOptions,\n };\n }\n\n case 'user': {\n if (typeof message.content === 'string') {\n return {\n role: 'user',\n content: [{ type: 'text', text: message.content }],\n providerOptions: message.providerOptions,\n };\n }\n\n return {\n role: 'user',\n content: message.content\n .map(part => convertPartToLanguageModelPart(part, downloadedAssets))\n // remove empty text parts:\n .filter(part => part.type !== 'text' || part.text !== ''),\n providerOptions: message.providerOptions,\n };\n }\n\n case 'assistant': {\n if (typeof message.content === 'string') {\n return {\n role: 'assistant',\n content: [{ type: 'text', text: message.content }],\n providerOptions: message.providerOptions,\n };\n }\n\n return {\n role: 'assistant',\n content: message.content\n .filter(\n // remove empty text parts:\n part => part.type !== 'text' || part.text !== '',\n )\n .map(part => {\n const providerOptions = part.providerOptions;\n\n switch (part.type) {\n case 'file': {\n const { data, mediaType } = convertToLanguageModelV2DataContent(\n part.data,\n );\n return {\n type: 'file',\n data,\n filename: part.filename,\n mediaType: mediaType ?? part.mediaType,\n providerOptions,\n };\n }\n case 'reasoning': {\n return {\n type: 'reasoning',\n text: part.text,\n providerOptions,\n };\n }\n case 'text': {\n return {\n type: 'text' as const,\n text: part.text,\n providerOptions,\n };\n }\n case 'tool-call': {\n return {\n type: 'tool-call' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n providerExecuted: part.providerExecuted,\n providerOptions,\n };\n }\n case 'tool-result': {\n return {\n type: 'tool-result' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: part.output,\n providerOptions,\n };\n }\n }\n }),\n providerOptions: message.providerOptions,\n };\n }\n\n case 'tool': {\n return {\n role: 'tool',\n content: message.content.map(part => ({\n type: 'tool-result' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: part.output,\n providerOptions: part.providerOptions,\n })),\n providerOptions: message.providerOptions,\n };\n }\n\n default: {\n const _exhaustiveCheck: never = role;\n throw new InvalidMessageRoleError({ role: _exhaustiveCheck });\n }\n }\n}\n\n/**\n * Downloads images and files from URLs in the messages.\n */\nasync function downloadAssets(\n messages: ModelMessage[],\n downloadImplementation: typeof download,\n supportedUrls: Record<string, RegExp[]>,\n): Promise<\n Record<string, { mediaType: string | undefined; data: Uint8Array }>\n> {\n const urls = messages\n .filter(message => message.role === 'user')\n .map(message => message.content)\n .filter((content): content is Array<TextPart | ImagePart | FilePart> =>\n Array.isArray(content),\n )\n .flat()\n .filter(\n (part): part is ImagePart | FilePart =>\n part.type === 'image' || part.type === 'file',\n )\n .map(part => {\n const mediaType =\n part.mediaType ?? (part.type === 'image' ? 'image/*' : undefined);\n\n let data = part.type === 'image' ? part.image : part.data;\n if (typeof data === 'string') {\n try {\n data = new URL(data);\n } catch (ignored) {}\n }\n\n return { mediaType, data };\n })\n /**\n * Filter out URLs that the model supports natively, so we don't download them.\n */\n .filter(\n (part): part is { mediaType: string; data: URL } =>\n part.data instanceof URL &&\n part.mediaType != null &&\n !isUrlSupported({\n url: part.data.toString(),\n mediaType: part.mediaType,\n supportedUrls,\n }),\n )\n .map(part => part.data);\n\n // download in parallel:\n const downloadedImages = await Promise.all(\n urls.map(async url => ({\n url,\n data: await downloadImplementation({ url }),\n })),\n );\n\n return Object.fromEntries(\n downloadedImages.map(({ url, data }) => [url.toString(), data]),\n );\n}\n\n/**\n * Convert part of a message to a LanguageModelV2Part.\n * @param part The part to convert.\n * @param downloadedAssets A map of URLs to their downloaded data. Only\n * available if the model does not support URLs, null otherwise.\n *\n * @returns The converted part.\n */\nfunction convertPartToLanguageModelPart(\n part: TextPart | ImagePart | FilePart,\n downloadedAssets: Record<\n string,\n { mediaType: string | undefined; data: Uint8Array }\n >,\n): LanguageModelV2TextPart | LanguageModelV2FilePart {\n if (part.type === 'text') {\n return {\n type: 'text',\n text: part.text,\n providerOptions: part.providerOptions,\n };\n }\n\n let originalData: DataContent | URL;\n const type = part.type;\n switch (type) {\n case 'image':\n originalData = part.image;\n break;\n case 'file':\n originalData = part.data;\n\n break;\n default:\n throw new Error(`Unsupported part type: ${type}`);\n }\n\n const { data: convertedData, mediaType: convertedMediaType } =\n convertToLanguageModelV2DataContent(originalData);\n\n let mediaType: string | undefined = convertedMediaType ?? part.mediaType;\n let data: Uint8Array | string | URL = convertedData; // binary | base64 | url\n\n // If the content is a URL, we check if it was downloaded:\n if (data instanceof URL) {\n const downloadedFile = downloadedAssets[data.toString()];\n if (downloadedFile) {\n data = downloadedFile.data;\n mediaType ??= downloadedFile.mediaType;\n }\n }\n\n // Now that we have the normalized data either as a URL or a Uint8Array,\n // we can create the LanguageModelV2Part.\n switch (type) {\n case 'image': {\n // When possible, try to detect the media type automatically\n // to deal with incorrect media type inputs.\n // When detection fails, use provided media type.\n if (data instanceof Uint8Array || typeof data === 'string') {\n mediaType =\n detectMediaType({ data, signatures: imageMediaTypeSignatures }) ??\n mediaType;\n }\n\n return {\n type: 'file',\n mediaType: mediaType ?? 'image/*', // any image\n filename: undefined,\n data,\n providerOptions: part.providerOptions,\n };\n }\n\n case 'file': {\n // We must have a mediaType for files, if not, throw an error.\n if (mediaType == null) {\n throw new Error(`Media type is missing for file part`);\n }\n\n return {\n type: 'file',\n mediaType,\n filename: part.filename,\n data,\n providerOptions: part.providerOptions,\n };\n }\n }\n}\n","import { convertBase64ToUint8Array } from '@ai-sdk/provider-utils';\n\nexport const imageMediaTypeSignatures = [\n {\n mediaType: 'image/gif' as const,\n bytesPrefix: [0x47, 0x49, 0x46],\n base64Prefix: 'R0lG',\n },\n {\n mediaType: 'image/png' as const,\n bytesPrefix: [0x89, 0x50, 0x4e, 0x47],\n base64Prefix: 'iVBORw',\n },\n {\n mediaType: 'image/jpeg' as const,\n bytesPrefix: [0xff, 0xd8],\n base64Prefix: '/9j/',\n },\n {\n mediaType: 'image/webp' as const,\n bytesPrefix: [0x52, 0x49, 0x46, 0x46],\n base64Prefix: 'UklGRg',\n },\n {\n mediaType: 'image/bmp' as const,\n bytesPrefix: [0x42, 0x4d],\n base64Prefix: 'Qk',\n },\n {\n mediaType: 'image/tiff' as const,\n bytesPrefix: [0x49, 0x49, 0x2a, 0x00],\n base64Prefix: 'SUkqAA',\n },\n {\n mediaType: 'image/tiff' as const,\n bytesPrefix: [0x4d, 0x4d, 0x00, 0x2a],\n base64Prefix: 'TU0AKg',\n },\n {\n mediaType: 'image/avif' as const,\n bytesPrefix: [\n 0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66,\n ],\n base64Prefix: 'AAAAIGZ0eXBhdmlm',\n },\n {\n mediaType: 'image/heic' as const,\n bytesPrefix: [\n 0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x63,\n ],\n base64Prefix: 'AAAAIGZ0eXBoZWlj',\n },\n] as const;\n\nexport const audioMediaTypeSignatures = [\n {\n mediaType: 'audio/mpeg' as const,\n bytesPrefix: [0xff, 0xfb],\n base64Prefix: '//s=',\n },\n {\n mediaType: 'audio/wav' as const,\n bytesPrefix: [0x52, 0x49, 0x46, 0x46],\n base64Prefix: 'UklGR',\n },\n {\n mediaType: 'audio/ogg' as const,\n bytesPrefix: [0x4f, 0x67, 0x67, 0x53],\n base64Prefix: 'T2dnUw',\n },\n {\n mediaType: 'audio/flac' as const,\n bytesPrefix: [0x66, 0x4c, 0x61, 0x43],\n base64Prefix: 'ZkxhQw',\n },\n {\n mediaType: 'audio/aac' as const,\n bytesPrefix: [0x40, 0x15, 0x00, 0x00],\n base64Prefix: 'QBUA',\n },\n {\n mediaType: 'audio/mp4' as const,\n bytesPrefix: [0x66, 0x74, 0x79, 0x70],\n base64Prefix: 'ZnR5cA',\n },\n {\n mediaType: 'audio/webm',\n bytesPrefix: [0x1a, 0x45, 0xdf, 0xa3],\n base64Prefix: 'GkXf',\n },\n] as const;\n\nconst stripID3 = (data: Uint8Array | string) => {\n const bytes =\n typeof data === 'string' ? convertBase64ToUint8Array(data) : data;\n const id3Size =\n ((bytes[6] & 0x7f) << 21) |\n ((bytes[7] & 0x7f) << 14) |\n ((bytes[8] & 0x7f) << 7) |\n (bytes[9] & 0x7f);\n\n // The raw MP3 starts here\n return bytes.slice(id3Size + 10);\n};\n\nfunction stripID3TagsIfPresent(data: Uint8Array | string): Uint8Array | string {\n const hasId3 =\n (typeof data === 'string' && data.startsWith('SUQz')) ||\n (typeof data !== 'string' &&\n data.length > 10 &&\n data[0] === 0x49 && // 'I'\n data[1] === 0x44 && // 'D'\n data[2] === 0x33); // '3'\n\n return hasId3 ? stripID3(data) : data;\n}\n\n/**\n * Detect the media IANA media type of a file using a list of signatures.\n *\n * @param data - The file data.\n * @param signatures - The signatures to use for detection.\n * @returns The media type of the file.\n */\nexport function detectMediaType({\n data,\n signatures,\n}: {\n data: Uint8Array | string;\n signatures: typeof audioMediaTypeSignatures | typeof imageMediaTypeSignatures;\n}): (typeof signatures)[number]['mediaType'] | undefined {\n const processedData = stripID3TagsIfPresent(data);\n\n for (const signature of signatures) {\n if (\n typeof processedData === 'string'\n ? processedData.startsWith(signature.base64Prefix)\n : processedData.length >= signature.bytesPrefix.length &&\n signature.bytesPrefix.every(\n (byte, index) => processedData[index] === byte,\n )\n ) {\n return signature.mediaType;\n }\n }\n\n return undefined;\n}\n","import { DownloadError } from './download-error';\n\nexport async function download({ url }: { url: URL }): Promise<{\n data: Uint8Array;\n mediaType: string | undefined;\n}> {\n const urlText = url.toString();\n try {\n const response = await fetch(urlText);\n\n if (!response.ok) {\n throw new DownloadError({\n url: urlText,\n statusCode: response.status,\n statusText: response.statusText,\n });\n }\n\n return {\n data: new Uint8Array(await response.arrayBuffer()),\n mediaType: response.headers.get('content-type') ?? undefined,\n };\n } catch (error) {\n if (DownloadError.isInstance(error)) {\n throw error;\n }\n\n throw new DownloadError({ url: urlText, cause: error });\n }\n}\n","import { AISDKError, LanguageModelV2DataContent } from '@ai-sdk/provider';\nimport {\n convertBase64ToUint8Array,\n convertUint8ArrayToBase64,\n DataContent,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { InvalidDataContentError } from './invalid-data-content-error';\nimport { splitDataUrl } from './split-data-url';\n\n/**\n@internal\n */\nexport const dataContentSchema: z.ZodType<DataContent> = z.union([\n z.string(),\n z.instanceof(Uint8Array),\n z.instanceof(ArrayBuffer),\n z.custom<Buffer>(\n // Buffer might not be available in some environments such as CloudFlare:\n (value: unknown): value is Buffer =>\n globalThis.Buffer?.isBuffer(value) ?? false,\n { message: 'Must be a Buffer' },\n ),\n]);\n\nexport function convertToLanguageModelV2DataContent(\n content: DataContent | URL,\n): {\n data: LanguageModelV2DataContent;\n mediaType: string | undefined;\n} {\n // Buffer & Uint8Array:\n if (content instanceof Uint8Array) {\n return { data: content, mediaType: undefined };\n }\n\n // ArrayBuffer needs conversion to Uint8Array (lightweight):\n if (content instanceof ArrayBuffer) {\n return { data: new Uint8Array(content), mediaType: undefined };\n }\n\n // Attempt to create a URL from the data. If it fails, we can assume the data\n // is not a URL and likely some other sort of data.\n if (typeof content === 'string') {\n try {\n content = new URL(content);\n } catch (error) {\n // ignored\n }\n }\n\n // Extract data from data URL:\n if (content instanceof URL && content.protocol === 'data:') {\n const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(\n content.toString(),\n );\n\n if (dataUrlMediaType == null || base64Content == null) {\n throw new AISDKError({\n name: 'InvalidDataContentError',\n message: `Invalid data URL format in content ${content.toString()}`,\n });\n }\n\n return { data: base64Content, mediaType: dataUrlMediaType };\n }\n\n return { data: content, mediaType: undefined };\n}\n\n/**\nConverts data content to a base64-encoded string.\n\n@param content - Data content to convert.\n@returns Base64-encoded string.\n*/\nexport function convertDataContentToBase64String(content: DataContent): string {\n if (typeof content === 'string') {\n return content;\n }\n\n if (content instanceof ArrayBuffer) {\n return convertUint8ArrayToBase64(new Uint8Array(content));\n }\n\n return convertUint8ArrayToBase64(content);\n}\n\n/**\nConverts data content to a Uint8Array.\n\n@param content - Data content to convert.\n@returns Uint8Array.\n */\nexport function convertDataContentToUint8Array(\n content: DataContent,\n): Uint8Array {\n if (content instanceof Uint8Array) {\n return content;\n }\n\n if (typeof content === 'string') {\n try {\n return convertBase64ToUint8Array(content);\n } catch (error) {\n throw new InvalidDataContentError({\n message:\n 'Invalid data content. Content string is not a base64-encoded media.',\n content,\n cause: error,\n });\n }\n }\n\n if (content instanceof ArrayBuffer) {\n return new Uint8Array(content);\n }\n\n throw new InvalidDataContentError({ content });\n}\n\n/**\n * Converts a Uint8Array to a string of text.\n *\n * @param uint8Array - The Uint8Array to convert.\n * @returns The converted string.\n */\nexport function convertUint8ArrayToText(uint8Array: Uint8Array): string {\n try {\n return new TextDecoder().decode(uint8Array);\n } catch (error) {\n throw new Error('Error decoding Uint8Array to text');\n }\n}\n","export function splitDataUrl(dataUrl: string): {\n mediaType: string | undefined;\n base64Content: string | undefined;\n} {\n try {\n const [header, base64Content] = dataUrl.split(',');\n return {\n mediaType: header.split(';')[0].split(':')[1],\n base64Content,\n };\n } catch (error) {\n return {\n mediaType: undefined,\n base64Content: undefined,\n };\n }\n}\n","import { InvalidArgumentError } from '../error/invalid-argument-error';\nimport { CallSettings } from './call-settings';\n\n/**\n * Validates call settings and returns a new object with limited values.\n */\nexport function prepareCallSettings({\n maxOutputTokens,\n temperature,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n seed,\n stopSequences,\n}: Omit<CallSettings, 'abortSignal' | 'headers' | 'maxRetries'>): Omit<\n CallSettings,\n 'abortSignal' | 'headers' | 'maxRetries'\n> {\n if (maxOutputTokens != null) {\n if (!Number.isInteger(maxOutputTokens)) {\n throw new InvalidArgumentError({\n parameter: 'maxOutputTokens',\n value: maxOutputTokens,\n message: 'maxOutputTokens must be an integer',\n });\n }\n\n if (maxOutputTokens < 1) {\n throw new InvalidArgumentError({\n parameter: 'maxOutputTokens',\n value: maxOutputTokens,\n message: 'maxOutputTokens must be >= 1',\n });\n }\n }\n\n if (temperature != null) {\n if (typeof temperature !== 'number') {\n throw new InvalidArgumentError({\n parameter: 'temperature',\n value: temperature,\n message: 'temperature must be a number',\n });\n }\n }\n\n if (topP != null) {\n if (typeof topP !== 'number') {\n throw new InvalidArgumentError({\n parameter: 'topP',\n value: topP,\n message: 'topP must be a number',\n });\n }\n }\n\n if (topK != null) {\n if (typeof topK !== 'number') {\n throw new InvalidArgumentError({\n parameter: 'topK',\n value: topK,\n message: 'topK must be a number',\n });\n }\n }\n\n if (presencePenalty != null) {\n if (typeof presencePenalty !== 'number') {\n throw new InvalidArgumentError({\n parameter: 'presencePenalty',\n value: presencePenalty,\n message: 'presencePenalty must be a number',\n });\n }\n }\n\n if (frequencyPenalty != null) {\n if (typeof frequencyPenalty !== 'number') {\n throw new InvalidArgumentError({\n parameter: 'frequencyPenalty',\n value: frequencyPenalty,\n message: 'frequencyPenalty must be a number',\n });\n }\n }\n\n if (seed != null) {\n if (!Number.isInteger(seed)) {\n throw new InvalidArgumentError({\n parameter: 'seed',\n value: seed,\n message: 'seed must be an integer',\n });\n }\n }\n\n return {\n maxOutputTokens,\n temperature,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n stopSequences,\n seed,\n };\n}\n","import {\n LanguageModelV2FunctionTool,\n LanguageModelV2ProviderDefinedTool,\n LanguageModelV2ToolChoice,\n} from '@ai-sdk/provider';\nimport { asSchema } from '@ai-sdk/provider-utils';\nimport { isNonEmptyObject } from '../util/is-non-empty-object';\nimport { ToolSet } from '../generate-text';\nimport { ToolChoice } from '../types/language-model';\n\nexport function prepareToolsAndToolChoice<TOOLS extends ToolSet>({\n tools,\n toolChoice,\n activeTools,\n}: {\n tools: TOOLS | undefined;\n toolChoice: ToolChoice<TOOLS> | undefined;\n activeTools: Array<keyof TOOLS> | undefined;\n}): {\n tools:\n | Array<LanguageModelV2FunctionTool | LanguageModelV2ProviderDefinedTool>\n | undefined;\n toolChoice: LanguageModelV2ToolChoice | undefined;\n} {\n if (!isNonEmptyObject(tools)) {\n return {\n tools: undefined,\n toolChoice: undefined,\n };\n }\n\n // when activeTools is provided, we only include the tools that are in the list:\n const filteredTools =\n activeTools != null\n ? Object.entries(tools).filter(([name]) =>\n activeTools.includes(name as keyof TOOLS),\n )\n : Object.entries(tools);\n\n return {\n tools: filteredTools.map(([name, tool]) => {\n const toolType = tool.type;\n switch (toolType) {\n case undefined:\n case 'dynamic':\n case 'function':\n return {\n type: 'function' as const,\n name,\n description: tool.description,\n inputSchema: asSchema(tool.inputSchema).jsonSchema,\n providerOptions: tool.providerOptions,\n };\n case 'provider-defined':\n return {\n type: 'provider-defined' as const,\n name,\n id: tool.id,\n args: tool.args,\n };\n default: {\n const exhaustiveCheck: never = toolType;\n throw new Error(`Unsupported tool type: ${exhaustiveCheck}`);\n }\n }\n }),\n toolChoice:\n toolChoice == null\n ? { type: 'auto' }\n : typeof toolChoice === 'string'\n ? { type: toolChoice }\n : { type: 'tool' as const, toolName: toolChoice.toolName as string },\n };\n}\n","export function isNonEmptyObject(\n object: Record<string, unknown> | undefined | null,\n): object is Record<string, unknown> {\n return object != null && Object.keys(object).length > 0;\n}\n","import { InvalidPromptError } from '@ai-sdk/provider';\nimport { ModelMessage, safeValidateTypes } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { modelMessageSchema } from './message';\nimport { Prompt } from './prompt';\n\nexport type StandardizedPrompt = {\n /**\n * System message.\n */\n system?: string;\n\n /**\n * Messages.\n */\n messages: ModelMessage[];\n};\n\nexport async function standardizePrompt(\n prompt: Prompt,\n): Promise<StandardizedPrompt> {\n if (prompt.prompt == null && prompt.messages == null) {\n throw new InvalidPromptError({\n prompt,\n message: 'prompt or messages must be defined',\n });\n }\n\n if (prompt.prompt != null && prompt.messages != null) {\n throw new InvalidPromptError({\n prompt,\n message: 'prompt and messages cannot be defined at the same time',\n });\n }\n\n // validate that system is a string\n if (prompt.system != null && typeof prompt.system !== 'string') {\n throw new InvalidPromptError({\n prompt,\n message: 'system must be a string',\n });\n }\n\n let messages: ModelMessage[];\n\n if (prompt.prompt != null && typeof prompt.prompt === 'string') {\n messages = [{ role: 'user', content: prompt.prompt }];\n } else if (prompt.prompt != null && Array.isArray(prompt.prompt)) {\n messages = prompt.prompt;\n } else if (prompt.messages != null) {\n messages = prompt.messages;\n } else {\n throw new InvalidPromptError({\n prompt,\n message: 'prompt or messages must be defined',\n });\n }\n\n if (messages.length === 0) {\n throw new InvalidPromptError({\n prompt,\n message: 'messages must not be empty',\n });\n }\n\n const validationResult = await safeValidateTypes({\n value: messages,\n schema: z.array(modelMessageSchema),\n });\n\n if (!validationResult.success) {\n throw new InvalidPromptError({\n prompt,\n message:\n 'The messages must be a ModelMessage[]. ' +\n 'If you have passed a UIMessage[], you can use convertToModelMessages to convert them.',\n cause: validationResult.error,\n });\n }\n\n return {\n messages,\n system: prompt.system,\n };\n}\n","import {\n AssistantModelMessage,\n ModelMessage,\n SystemModelMessage,\n ToolModelMessage,\n UserModelMessage,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { providerMetadataSchema } from '../types/provider-metadata';\nimport {\n filePartSchema,\n imagePartSchema,\n reasoningPartSchema,\n textPartSchema,\n toolCallPartSchema,\n toolResultPartSchema,\n} from './content-part';\n\n/**\n@deprecated Use `SystemModelMessage` instead.\n */\n// TODO remove in AI SDK 6\nexport type CoreSystemMessage = SystemModelMessage;\n\nexport const systemModelMessageSchema: z.ZodType<SystemModelMessage> = z.object(\n {\n role: z.literal('system'),\n content: z.string(),\n providerOptions: providerMetadataSchema.optional(),\n },\n);\n\n/**\n@deprecated Use `systemModelMessageSchema` instead.\n */\n// TODO remove in AI SDK 6\nexport const coreSystemMessageSchema = systemModelMessageSchema;\n\n/**\n@deprecated Use `UserModelMessage` instead.\n */\n// TODO remove in AI SDK 6\nexport type CoreUserMessage = UserModelMessage;\n\nexport const userModelMessageSchema: z.ZodType<UserModelMessage> = z.object({\n role: z.literal('user'),\n content: z.union([\n z.string(),\n z.array(z.union([textPartSchema, imagePartSchema, filePartSchema])),\n ]),\n providerOptions: providerMetadataSchema.optional(),\n});\n\n/**\n@deprecated Use `userModelMessageSchema` instead.\n */\n// TODO remove in AI SDK 6\nexport const coreUserMessageSchema = userModelMessageSchema;\n\n/**\n@deprecated Use `AssistantModelMessage` instead.\n */\n// TODO remove in AI SDK 6\nexport type CoreAssistantMessage = AssistantModelMessage;\n\nexport const assistantModelMessageSchema: z.ZodType<AssistantModelMessage> =\n z.object({\n role: z.literal('assistant'),\n content: z.union([\n z.string(),\n z.array(\n z.union([\n textPartSchema,\n filePartSchema,\n reasoningPartSchema,\n toolCallPartSchema,\n toolResultPartSchema,\n ]),\n ),\n ]),\n providerOptions: providerMetadataSchema.optional(),\n });\n\n/**\n@deprecated Use `assistantModelMessageSchema` instead.\n */\n// TODO remove in AI SDK 6\nexport const coreAssistantMessageSchema = assistantModelMessageSchema;\n\n/**\n@deprecated Use `ToolModelMessage` instead.\n */\n// TODO remove in AI SDK 6\nexport type CoreToolMessage = ToolModelMessage;\n\nexport const toolModelMessageSchema: z.ZodType<ToolModelMessage> = z.object({\n role: z.literal('tool'),\n content: z.array(toolResultPartSchema),\n providerOptions: providerMetadataSchema.optional(),\n});\n\n/**\n@deprecated Use `toolModelMessageSchema` instead.\n */\n// TODO remove in AI SDK 6\nexport const coreToolMessageSchema = toolModelMessageSchema;\n\n/**\n@deprecated Use `ModelMessage` instead.\n */\n// TODO remove in AI SDK 6\nexport type CoreMessage = ModelMessage;\n\nexport const modelMessageSchema: z.ZodType<ModelMessage> = z.union([\n systemModelMessageSchema,\n userModelMessageSchema,\n assistantModelMessageSchema,\n toolModelMessageSchema,\n]);\n\n/**\n@deprecated Use `modelMessageSchema` instead.\n */\n// TODO remove in AI SDK 6\nexport const coreMessageSchema: z.ZodType<CoreMessage> = modelMessageSchema;\n","import { SharedV2ProviderMetadata } from '@ai-sdk/provider';\nimport { z } from 'zod/v4';\nimport { jsonValueSchema } from './json-value';\n\n/**\nAdditional provider-specific metadata that is returned from the provider.\n\nThis is needed to enable provider-specific functionality that can be\nfully encapsulated in the provider.\n */\nexport type ProviderMetadata = SharedV2ProviderMetadata;\n\nexport const providerMetadataSchema: z.ZodType<ProviderMetadata> = z.record(\n z.string(),\n z.record(z.string(), jsonValueSchema),\n);\n","import { JSONValue as OriginalJSONValue } from '@ai-sdk/provider';\nimport { z } from 'zod/v4';\n\nexport const jsonValueSchema: z.ZodType<JSONValue> = z.lazy(() =>\n z.union([\n z.null(),\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.string(), jsonValueSchema),\n z.array(jsonValueSchema),\n ]),\n);\n\nexport type JSONValue = OriginalJSONValue;\n","import { LanguageModelV2ToolResultOutput } from '@ai-sdk/provider';\nimport {\n FilePart,\n ImagePart,\n ProviderOptions,\n ReasoningPart,\n TextPart,\n ToolResultPart,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { jsonValueSchema } from '../types/json-value';\nimport { providerMetadataSchema } from '../types/provider-metadata';\nimport { dataContentSchema } from './data-content';\n\n/**\n@internal\n */\nexport const textPartSchema: z.ZodType<TextPart> = z.object({\n type: z.literal('text'),\n text: z.string(),\n providerOptions: providerMetadataSchema.optional(),\n});\n\n/**\n@internal\n */\nexport const imagePartSchema: z.ZodType<ImagePart> = z.object({\n type: z.literal('image'),\n image: z.union([dataContentSchema, z.instanceof(URL)]),\n mediaType: z.string().optional(),\n providerOptions: providerMetadataSchema.optional(),\n});\n\n/**\n@internal\n */\nexport const filePartSchema: z.ZodType<FilePart> = z.object({\n type: z.literal('file'),\n data: z.union([dataContentSchema, z.instanceof(URL)]),\n filename: z.string().optional(),\n mediaType: z.string(),\n providerOptions: providerMetadataSchema.optional(),\n});\n\n/**\n@internal\n */\nexport const reasoningPartSchema: z.ZodType<ReasoningPart> = z.object({\n type: z.literal('reasoning'),\n text: z.string(),\n providerOptions: providerMetadataSchema.optional(),\n});\n\n/**\nTool call content part of a prompt. It contains a tool call (usually generated by the AI model).\n */\nexport interface ToolCallPart {\n type: 'tool-call';\n\n /**\nID of the tool call. This ID is used to match the tool call with the tool result.\n */\n toolCallId: string;\n\n /**\nName of the tool that is being called.\n */\n toolName: string;\n\n /**\nArguments of the tool call. This is a JSON-serializable object that matches the tool's input schema.\n */\n input: unknown;\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}\n\n/**\n@internal\n */\nexport const toolCallPartSchema: z.ZodType<ToolCallPart> = z.object({\n type: z.literal('tool-call'),\n toolCallId: z.string(),\n toolName: z.string(),\n input: z.unknown(),\n providerOptions: providerMetadataSchema.optional(),\n providerExecuted: z.boolean().optional(),\n}) as z.ZodType<ToolCallPart>; // necessary bc input is optional on Zod type\n\n/**\n@internal\n */\nexport const outputSchema: z.ZodType<LanguageModelV2ToolResultOutput> =\n z.discriminatedUnion('type', [\n z.object({\n type: z.literal('text'),\n value: z.string(),\n }),\n z.object({\n type: z.literal('json'),\n value: jsonValueSchema,\n }),\n z.object({\n type: z.literal('error-text'),\n value: z.string(),\n }),\n z.object({\n type: z.literal('error-json'),\n value: jsonValueSchema,\n }),\n z.object({\n type: z.literal('content'),\n value: z.array(\n z.union([\n z.object({\n type: z.literal('text'),\n text: z.string(),\n }),\n z.object({\n type: z.literal('media'),\n data: z.string(),\n mediaType: z.string(),\n }),\n ]),\n ),\n }),\n ]);\n\n/**\n@internal\n */\nexport const toolResultPartSchema: z.ZodType<ToolResultPart> = z.object({\n type: z.literal('tool-result'),\n toolCallId: z.string(),\n toolName: z.string(),\n output: outputSchema,\n providerOptions: providerMetadataSchema.optional(),\n}) as z.ZodType<ToolResultPart>; // necessary bc result is optional on Zod type\n","import {\n GatewayAuthenticationError,\n GatewayModelNotFoundError,\n} from '@ai-sdk/gateway';\nimport { AISDKError } from '@ai-sdk/provider';\n\nexport function wrapGatewayError(error: unknown): unknown {\n if (\n GatewayAuthenticationError.isInstance(error) ||\n GatewayModelNotFoundError.isInstance(error)\n ) {\n return new AISDKError({\n name: 'GatewayError',\n message:\n 'Vercel AI Gateway access failed. ' +\n 'If you want to use AI SDK providers directly, use the providers, e.g. @ai-sdk/openai, ' +\n 'or register a different global default provider.',\n cause: error,\n });\n }\n\n return error;\n}\n","import { TelemetrySettings } from './telemetry-settings';\n\nexport function assembleOperationName({\n operationId,\n telemetry,\n}: {\n operationId: string;\n telemetry?: TelemetrySettings;\n}) {\n return {\n // standardized operation and resource name:\n 'operation.name': `${operationId}${\n telemetry?.functionId != null ? ` ${telemetry.functionId}` : ''\n }`,\n 'resource.name': telemetry?.functionId,\n\n // detailed, AI SDK specific data:\n 'ai.operationId': operationId,\n 'ai.telemetry.functionId': telemetry?.functionId,\n };\n}\n","import { Attributes } from '@opentelemetry/api';\nimport { CallSettings } from '../prompt/call-settings';\nimport { TelemetrySettings } from './telemetry-settings';\n\nexport function getBaseTelemetryAttributes({\n model,\n settings,\n telemetry,\n headers,\n}: {\n model: { modelId: string; provider: string };\n settings: Omit<CallSettings, 'abortSignal' | 'headers' | 'temperature'>;\n telemetry: TelemetrySettings | undefined;\n headers: Record<string, string | undefined> | undefined;\n}): Attributes {\n return {\n 'ai.model.provider': model.provider,\n 'ai.model.id': model.modelId,\n\n // settings:\n ...Object.entries(settings).reduce((attributes, [key, value]) => {\n attributes[`ai.settings.${key}`] = value;\n return attributes;\n }, {} as Attributes),\n\n // add metadata as attributes:\n ...Object.entries(telemetry?.metadata ?? {}).reduce(\n (attributes, [key, value]) => {\n attributes[`ai.telemetry.metadata.${key}`] = value;\n return attributes;\n },\n {} as Attributes,\n ),\n\n // request headers\n ...Object.entries(headers ?? {}).reduce((attributes, [key, value]) => {\n if (value !== undefined) {\n attributes[`ai.request.headers.${key}`] = value;\n }\n return attributes;\n }, {} as Attributes),\n };\n}\n","import { Tracer, trace } from '@opentelemetry/api';\nimport { noopTracer } from './noop-tracer';\n\nexport function getTracer({\n isEnabled = false,\n tracer,\n}: {\n isEnabled?: boolean;\n tracer?: Tracer;\n} = {}): Tracer {\n if (!isEnabled) {\n return noopTracer;\n }\n\n if (tracer) {\n return tracer;\n }\n\n return trace.getTracer('ai');\n}\n","import { Span, SpanContext, Tracer } from '@opentelemetry/api';\n\n/**\n * Tracer implementation that does nothing (null object).\n */\nexport const noopTracer: Tracer = {\n startSpan(): Span {\n return noopSpan;\n },\n\n startActiveSpan<F extends (span: Span) => unknown>(\n name: unknown,\n arg1: unknown,\n arg2?: unknown,\n arg3?: F,\n ): ReturnType<any> {\n if (typeof arg1 === 'function') {\n return arg1(noopSpan);\n }\n if (typeof arg2 === 'function') {\n return arg2(noopSpan);\n }\n if (typeof arg3 === 'function') {\n return arg3(noopSpan);\n }\n },\n};\n\nconst noopSpan: Span = {\n spanContext() {\n return noopSpanContext;\n },\n setAttribute() {\n return this;\n },\n setAttributes() {\n return this;\n },\n addEvent() {\n return this;\n },\n addLink() {\n return this;\n },\n addLinks() {\n return this;\n },\n setStatus() {\n return this;\n },\n updateName() {\n return this;\n },\n end() {\n return this;\n },\n isRecording() {\n return false;\n },\n recordException() {\n return this;\n },\n};\n\nconst noopSpanContext: SpanContext = {\n traceId: '',\n spanId: '',\n traceFlags: 0,\n};\n","import { Attributes, Span, Tracer, SpanStatusCode } from '@opentelemetry/api';\n\nexport function recordSpan<T>({\n name,\n tracer,\n attributes,\n fn,\n endWhenDone = true,\n}: {\n name: string;\n tracer: Tracer;\n attributes: Attributes;\n fn: (span: Span) => Promise<T>;\n endWhenDone?: boolean;\n}) {\n return tracer.startActiveSpan(name, { attributes }, async span => {\n try {\n const result = await fn(span);\n\n if (endWhenDone) {\n span.end();\n }\n\n return result;\n } catch (error) {\n try {\n recordErrorOnSpan(span, error);\n } finally {\n // always stop the span when there is an error:\n span.end();\n }\n\n throw error;\n }\n });\n}\n\n/**\n * Record an error on a span. If the error is an instance of Error, an exception event will be recorded on the span, otherwise\n * the span will be set to an error status.\n *\n * @param span - The span to record the error on.\n * @param error - The error to record on the span.\n */\nexport function recordErrorOnSpan(span: Span, error: unknown) {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { TelemetrySettings } from './telemetry-settings';\n\nexport function selectTelemetryAttributes({\n telemetry,\n attributes,\n}: {\n telemetry?: TelemetrySettings;\n attributes: {\n [attributeKey: string]:\n | AttributeValue\n | { input: () => AttributeValue | undefined }\n | { output: () => AttributeValue | undefined }\n | undefined;\n };\n}): Attributes {\n // when telemetry is disabled, return an empty object to avoid serialization overhead:\n if (telemetry?.isEnabled !== true) {\n return {};\n }\n\n return Object.entries(attributes).reduce((attributes, [key, value]) => {\n if (value == null) {\n return attributes;\n }\n\n // input value, check if it should be recorded:\n if (\n typeof value === 'object' &&\n 'input' in value &&\n typeof value.input === 'function'\n ) {\n // default to true:\n if (telemetry?.recordInputs === false) {\n return attributes;\n }\n\n const result = value.input();\n\n return result == null ? attributes : { ...attributes, [key]: result };\n }\n\n // output value, check if it should be recorded:\n if (\n typeof value === 'object' &&\n 'output' in value &&\n typeof value.output === 'function'\n ) {\n // default to true:\n if (telemetry?.recordOutputs === false) {\n return attributes;\n }\n\n const result = value.output();\n\n return result == null ? attributes : { ...attributes, [key]: result };\n }\n\n // value is an attribute value already:\n return { ...attributes, [key]: value };\n }, {});\n}\n","import {\n LanguageModelV2Message,\n LanguageModelV2Prompt,\n} from '@ai-sdk/provider';\nimport { convertDataContentToBase64String } from '../prompt/data-content';\n\n/**\n * Helper utility to serialize prompt content for OpenTelemetry tracing.\n * It is initially created because normalized LanguageModelV1Prompt carries\n * images as Uint8Arrays, on which JSON.stringify acts weirdly, converting\n * them to objects with stringified indices as keys, e.g. {\"0\": 42, \"1\": 69 }.\n */\nexport function stringifyForTelemetry(prompt: LanguageModelV2Prompt): string {\n return JSON.stringify(\n prompt.map((message: LanguageModelV2Message) => ({\n ...message,\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content.map(part =>\n part.type === 'file'\n ? {\n ...part,\n data:\n part.data instanceof Uint8Array\n ? convertDataContentToBase64String(part.data)\n : part.data,\n }\n : part,\n ),\n })),\n );\n}\n","import { LanguageModelV2Usage } from '@ai-sdk/provider';\n\n/**\nRepresents the number of tokens used in a prompt and completion.\n */\nexport type LanguageModelUsage = LanguageModelV2Usage;\n\n/**\nRepresents the number of tokens used in an embedding.\n */\n// TODO replace with EmbeddingModelV2Usage\nexport type EmbeddingModelUsage = {\n /**\nThe number of tokens used in the embedding.\n */\n tokens: number;\n};\n\nexport function addLanguageModelUsage(\n usage1: LanguageModelUsage,\n usage2: LanguageModelUsage,\n): LanguageModelUsage {\n return {\n inputTokens: addTokenCounts(usage1.inputTokens, usage2.inputTokens),\n outputTokens: addTokenCounts(usage1.outputTokens, usage2.outputTokens),\n totalTokens: addTokenCounts(usage1.totalTokens, usage2.totalTokens),\n reasoningTokens: addTokenCounts(\n usage1.reasoningTokens,\n usage2.reasoningTokens,\n ),\n cachedInputTokens: addTokenCounts(\n usage1.cachedInputTokens,\n usage2.cachedInputTokens,\n ),\n };\n}\n\nfunction addTokenCounts(\n tokenCount1: number | undefined,\n tokenCount2: number | undefined,\n): number | undefined {\n return tokenCount1 == null && tokenCount2 == null\n ? undefined\n : (tokenCount1 ?? 0) + (tokenCount2 ?? 0);\n}\n","export function asArray<T>(value: T | T[] | undefined): T[] {\n return value === undefined ? [] : Array.isArray(value) ? value : [value];\n}\n","import { APICallError } from '@ai-sdk/provider';\nimport { delay, getErrorMessage, isAbortError } from '@ai-sdk/provider-utils';\nimport { RetryError } from './retry-error';\n\nexport type RetryFunction = <OUTPUT>(\n fn: () => PromiseLike<OUTPUT>,\n) => PromiseLike<OUTPUT>;\n\nfunction getRetryDelayInMs({\n error,\n exponentialBackoffDelay,\n}: {\n error: APICallError;\n exponentialBackoffDelay: number;\n}): number {\n const headers = error.responseHeaders;\n\n if (!headers) return exponentialBackoffDelay;\n\n let ms: number | undefined;\n\n // retry-ms is more precise than retry-after and used by e.g. OpenAI\n const retryAfterMs = headers['retry-after-ms'];\n if (retryAfterMs) {\n const timeoutMs = parseFloat(retryAfterMs);\n if (!Number.isNaN(timeoutMs)) {\n ms = timeoutMs;\n }\n }\n\n // About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After\n const retryAfter = headers['retry-after'];\n if (retryAfter && ms === undefined) {\n const timeoutSeconds = parseFloat(retryAfter);\n if (!Number.isNaN(timeoutSeconds)) {\n ms = timeoutSeconds * 1000;\n } else {\n ms = Date.parse(retryAfter) - Date.now();\n }\n }\n\n // check that the delay is reasonable:\n if (\n ms != null &&\n !Number.isNaN(ms) &&\n 0 <= ms &&\n (ms < 60 * 1000 || ms < exponentialBackoffDelay)\n ) {\n return ms;\n }\n\n return exponentialBackoffDelay;\n}\n\n/**\nThe `retryWithExponentialBackoffRespectingRetryHeaders` strategy retries a failed API call with an exponential backoff,\nwhile respecting rate limit headers (retry-after-ms and retry-after) if they are provided and reasonable (0-60 seconds).\nYou can configure the maximum number of retries, the initial delay, and the backoff factor.\n */\nexport const retryWithExponentialBackoffRespectingRetryHeaders =\n ({\n maxRetries = 2,\n initialDelayInMs = 2000,\n backoffFactor = 2,\n abortSignal,\n }: {\n maxRetries?: number;\n initialDelayInMs?: number;\n backoffFactor?: number;\n abortSignal?: AbortSignal;\n } = {}): RetryFunction =>\n async <OUTPUT>(f: () => PromiseLike<OUTPUT>) =>\n _retryWithExponentialBackoff(f, {\n maxRetries,\n delayInMs: initialDelayInMs,\n backoffFactor,\n abortSignal,\n });\n\nasync function _retryWithExponentialBackoff<OUTPUT>(\n f: () => PromiseLike<OUTPUT>,\n {\n maxRetries,\n delayInMs,\n backoffFactor,\n abortSignal,\n }: {\n maxRetries: number;\n delayInMs: number;\n backoffFactor: number;\n abortSignal: AbortSignal | undefined;\n },\n errors: unknown[] = [],\n): Promise<OUTPUT> {\n try {\n return await f();\n } catch (error) {\n if (isAbortError(error)) {\n throw error; // don't retry when the request was aborted\n }\n\n if (maxRetries === 0) {\n throw error; // don't wrap the error when retries are disabled\n }\n\n const errorMessage = getErrorMessage(error);\n const newErrors = [...errors, error];\n const tryNumber = newErrors.length;\n\n if (tryNumber > maxRetries) {\n throw new RetryError({\n message: `Failed after ${tryNumber} attempts. Last error: ${errorMessage}`,\n reason: 'maxRetriesExceeded',\n errors: newErrors,\n });\n }\n\n if (\n error instanceof Error &&\n APICallError.isInstance(error) &&\n error.isRetryable === true &&\n tryNumber <= maxRetries\n ) {\n await delay(\n getRetryDelayInMs({\n error,\n exponentialBackoffDelay: delayInMs,\n }),\n { abortSignal },\n );\n\n return _retryWithExponentialBackoff(\n f,\n {\n maxRetries,\n delayInMs: backoffFactor * delayInMs,\n backoffFactor,\n abortSignal,\n },\n newErrors,\n );\n }\n\n if (tryNumber === 1) {\n throw error; // don't wrap the error when a non-retryable error occurs on the first try\n }\n\n throw new RetryError({\n message: `Failed after ${tryNumber} attempts with non-retryable error: '${errorMessage}'`,\n reason: 'errorNotRetryable',\n errors: newErrors,\n });\n }\n}\n","import { InvalidArgumentError } from '../error/invalid-argument-error';\nimport {\n RetryFunction,\n retryWithExponentialBackoffRespectingRetryHeaders,\n} from '../util/retry-with-exponential-backoff';\n\n/**\n * Validate and prepare retries.\n */\nexport function prepareRetries({\n maxRetries,\n abortSignal,\n}: {\n maxRetries: number | undefined;\n abortSignal: AbortSignal | undefined;\n}): {\n maxRetries: number;\n retry: RetryFunction;\n} {\n if (maxRetries != null) {\n if (!Number.isInteger(maxRetries)) {\n throw new InvalidArgumentError({\n parameter: 'maxRetries',\n value: maxRetries,\n message: 'maxRetries must be an integer',\n });\n }\n\n if (maxRetries < 0) {\n throw new InvalidArgumentError({\n parameter: 'maxRetries',\n value: maxRetries,\n message: 'maxRetries must be >= 0',\n });\n }\n }\n\n const maxRetriesResult = maxRetries ?? 2;\n\n return {\n maxRetries: maxRetriesResult,\n retry: retryWithExponentialBackoffRespectingRetryHeaders({\n maxRetries: maxRetriesResult,\n abortSignal,\n }),\n };\n}\n","import { LanguageModelV2Content, LanguageModelV2Text } from '@ai-sdk/provider';\n\nexport function extractContentText(\n content: LanguageModelV2Content[],\n): string | undefined {\n const parts = content.filter(\n (content): content is LanguageModelV2Text => content.type === 'text',\n );\n\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.map(content => content.text).join('');\n}\n","import {\n convertBase64ToUint8Array,\n convertUint8ArrayToBase64,\n} from '@ai-sdk/provider-utils';\n\n/**\n * A generated file.\n */\nexport interface GeneratedFile {\n /**\nFile as a base64 encoded string.\n */\n readonly base64: string;\n\n /**\nFile as a Uint8Array.\n */\n readonly uint8Array: Uint8Array;\n\n /**\nThe IANA media type of the file.\n\n@see https://www.iana.org/assignments/media-types/media-types.xhtml\n */\n readonly mediaType: string;\n}\n\nexport class DefaultGeneratedFile implements GeneratedFile {\n private base64Data: string | undefined;\n private uint8ArrayData: Uint8Array | undefined;\n\n readonly mediaType: string;\n\n constructor({\n data,\n mediaType,\n }: {\n data: string | Uint8Array;\n mediaType: string;\n }) {\n const isUint8Array = data instanceof Uint8Array;\n this.base64Data = isUint8Array ? undefined : data;\n this.uint8ArrayData = isUint8Array ? data : undefined;\n this.mediaType = mediaType;\n }\n\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get base64() {\n if (this.base64Data == null) {\n this.base64Data = convertUint8ArrayToBase64(this.uint8ArrayData!);\n }\n return this.base64Data;\n }\n\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get uint8Array() {\n if (this.uint8ArrayData == null) {\n this.uint8ArrayData = convertBase64ToUint8Array(this.base64Data!);\n }\n return this.uint8ArrayData;\n }\n}\n\nexport class DefaultGeneratedFileWithType extends DefaultGeneratedFile {\n readonly type = 'file';\n\n constructor(options: { data: string | Uint8Array; mediaType: string }) {\n super(options);\n }\n}\n","import { LanguageModelV2ToolCall } from '@ai-sdk/provider';\nimport {\n asSchema,\n ModelMessage,\n safeParseJSON,\n safeValidateTypes,\n} from '@ai-sdk/provider-utils';\nimport { InvalidToolInputError } from '../error/invalid-tool-input-error';\nimport { NoSuchToolError } from '../error/no-such-tool-error';\nimport { ToolCallRepairError } from '../error/tool-call-repair-error';\nimport { TypedToolCall } from './tool-call';\nimport { ToolCallRepairFunction } from './tool-call-repair-function';\nimport { ToolSet } from './tool-set';\n\nexport async function parseToolCall<TOOLS extends ToolSet>({\n toolCall,\n tools,\n repairToolCall,\n system,\n messages,\n}: {\n toolCall: LanguageModelV2ToolCall;\n tools: TOOLS | undefined;\n repairToolCall: ToolCallRepairFunction<TOOLS> | undefined;\n system: string | undefined;\n messages: ModelMessage[];\n}): Promise<TypedToolCall<TOOLS>> {\n try {\n if (tools == null) {\n throw new NoSuchToolError({ toolName: toolCall.toolName });\n }\n\n try {\n return await doParseToolCall({ toolCall, tools });\n } catch (error) {\n if (\n repairToolCall == null ||\n !(\n NoSuchToolError.isInstance(error) ||\n InvalidToolInputError.isInstance(error)\n )\n ) {\n throw error;\n }\n\n let repairedToolCall: LanguageModelV2ToolCall | null = null;\n\n try {\n repairedToolCall = await repairToolCall({\n toolCall,\n tools,\n inputSchema: ({ toolName }) => {\n const { inputSchema } = tools[toolName];\n return asSchema(inputSchema).jsonSchema;\n },\n system,\n messages,\n error,\n });\n } catch (repairError) {\n throw new ToolCallRepairError({\n cause: repairError,\n originalError: error,\n });\n }\n\n // no repaired tool call returned\n if (repairedToolCall == null) {\n throw error;\n }\n\n return await doParseToolCall({ toolCall: repairedToolCall, tools });\n }\n } catch (error) {\n // TODO AI SDK 6: special invalid tool call parts\n return {\n type: 'tool-call',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n dynamic: true,\n invalid: true,\n error,\n };\n }\n}\n\nasync function doParseToolCall<TOOLS extends ToolSet>({\n toolCall,\n tools,\n}: {\n toolCall: LanguageModelV2ToolCall;\n tools: TOOLS;\n}): Promise<TypedToolCall<TOOLS>> {\n const toolName = toolCall.toolName as keyof TOOLS & string;\n\n const tool = tools[toolName];\n\n if (tool == null) {\n throw new NoSuchToolError({\n toolName: toolCall.toolName,\n availableTools: Object.keys(tools),\n });\n }\n\n const schema = asSchema(tool.inputSchema);\n\n // when the tool call has no arguments, we try passing an empty object to the schema\n // (many LLMs generate empty strings for tool calls with no arguments)\n const parseResult =\n toolCall.input.trim() === ''\n ? await safeValidateTypes({ value: {}, schema })\n : await safeParseJSON({ text: toolCall.input, schema });\n\n if (parseResult.success === false) {\n throw new InvalidToolInputError({\n toolName,\n toolInput: toolCall.input,\n cause: parseResult.error,\n });\n }\n\n return tool.type === 'dynamic'\n ? {\n type: 'tool-call',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: parseResult.value,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n dynamic: true,\n }\n : {\n type: 'tool-call',\n toolCallId: toolCall.toolCallId,\n toolName,\n input: parseResult.value,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n };\n}\n","import { ReasoningPart } from '@ai-sdk/provider-utils';\nimport {\n CallWarning,\n FinishReason,\n LanguageModelRequestMetadata,\n LanguageModelResponseMetadata,\n ProviderMetadata,\n} from '../types';\nimport { Source } from '../types/language-model';\nimport { LanguageModelUsage } from '../types/usage';\nimport { ContentPart } from './content-part';\nimport { GeneratedFile } from './generated-file';\nimport { ResponseMessage } from './response-message';\nimport { DynamicToolCall, StaticToolCall, TypedToolCall } from './tool-call';\nimport {\n DynamicToolResult,\n StaticToolResult,\n TypedToolResult,\n} from './tool-result';\nimport { ToolSet } from './tool-set';\n\n/**\n * The result of a single step in the generation process.\n */\nexport type StepResult<TOOLS extends ToolSet> = {\n /**\nThe content that was generated in the last step.\n */\n readonly content: Array<ContentPart<TOOLS>>;\n\n /**\nThe generated text.\n*/\n readonly text: string;\n\n /**\nThe reasoning that was generated during the generation.\n*/\n readonly reasoning: Array<ReasoningPart>;\n\n /**\nThe reasoning text that was generated during the generation.\n*/\n readonly reasoningText: string | undefined;\n\n /**\nThe files that were generated during the generation.\n*/\n readonly files: Array<GeneratedFile>;\n\n /**\nThe sources that were used to generate the text.\n*/\n readonly sources: Array<Source>;\n\n /**\nThe tool calls that were made during the generation.\n*/\n readonly toolCalls: Array<TypedToolCall<TOOLS>>;\n\n /**\nThe static tool calls that were made in the last step.\n*/\n readonly staticToolCalls: Array<StaticToolCall<TOOLS>>;\n\n /**\nThe dynamic tool calls that were made in the last step.\n*/\n readonly dynamicToolCalls: Array<DynamicToolCall>;\n\n /**\nThe results of the tool calls.\n*/\n readonly toolResults: Array<TypedToolResult<TOOLS>>;\n\n /**\nThe static tool results that were made in the last step.\n*/\n readonly staticToolResults: Array<StaticToolResult<TOOLS>>;\n\n /**\nThe dynamic tool results that were made in the last step.\n*/\n readonly dynamicToolResults: Array<DynamicToolResult>;\n\n /**\nThe reason why the generation finished.\n*/\n readonly finishReason: FinishReason;\n\n /**\nThe token usage of the generated text.\n*/\n readonly usage: LanguageModelUsage;\n\n /**\nWarnings from the model provider (e.g. unsupported settings).\n*/\n readonly warnings: CallWarning[] | undefined;\n\n /**\nAdditional request information.\n */\n readonly request: LanguageModelRequestMetadata;\n\n /**\nAdditional response information.\n*/\n readonly response: LanguageModelResponseMetadata & {\n /**\nThe response messages that were generated during the call.\nResponse messages can be either assistant messages or tool messages.\nThey contain a generated id.\n*/\n readonly messages: Array<ResponseMessage>;\n\n /**\nResponse body (available only for providers that use HTTP requests).\n */\n body?: unknown;\n };\n\n /**\nAdditional provider-specific metadata. They are passed through\nfrom the provider to the AI SDK and enable provider-specific\nresults that can be fully encapsulated in the provider.\n */\n readonly providerMetadata: ProviderMetadata | undefined;\n};\n\nexport class DefaultStepResult<TOOLS extends ToolSet>\n implements StepResult<TOOLS>\n{\n readonly content: StepResult<TOOLS>['content'];\n readonly finishReason: StepResult<TOOLS>['finishReason'];\n readonly usage: StepResult<TOOLS>['usage'];\n readonly warnings: StepResult<TOOLS>['warnings'];\n readonly request: StepResult<TOOLS>['request'];\n readonly response: StepResult<TOOLS>['response'];\n readonly providerMetadata: StepResult<TOOLS>['providerMetadata'];\n\n constructor({\n content,\n finishReason,\n usage,\n warnings,\n request,\n response,\n providerMetadata,\n }: {\n content: StepResult<TOOLS>['content'];\n finishReason: StepResult<TOOLS>['finishReason'];\n usage: StepResult<TOOLS>['usage'];\n warnings: StepResult<TOOLS>['warnings'];\n request: StepResult<TOOLS>['request'];\n response: StepResult<TOOLS>['response'];\n providerMetadata: StepResult<TOOLS>['providerMetadata'];\n }) {\n this.content = content;\n this.finishReason = finishReason;\n this.usage = usage;\n this.warnings = warnings;\n this.request = request;\n this.response = response;\n this.providerMetadata = providerMetadata;\n }\n\n get text() {\n return this.content\n .filter(part => part.type === 'text')\n .map(part => part.text)\n .join('');\n }\n\n get reasoning() {\n return this.content.filter(part => part.type === 'reasoning');\n }\n\n get reasoningText() {\n return this.reasoning.length === 0\n ? undefined\n : this.reasoning.map(part => part.text).join('');\n }\n\n get files() {\n return this.content\n .filter(part => part.type === 'file')\n .map(part => part.file);\n }\n\n get sources() {\n return this.content.filter(part => part.type === 'source');\n }\n\n get toolCalls() {\n return this.content.filter(part => part.type === 'tool-call');\n }\n\n get staticToolCalls() {\n return this.toolCalls.filter(\n (toolCall): toolCall is StaticToolCall<TOOLS> =>\n toolCall.dynamic === false,\n );\n }\n\n get dynamicToolCalls() {\n return this.toolCalls.filter(\n (toolCall): toolCall is DynamicToolCall => toolCall.dynamic === true,\n );\n }\n\n get toolResults() {\n return this.content.filter(part => part.type === 'tool-result');\n }\n\n get staticToolResults() {\n return this.toolResults.filter(\n (toolResult): toolResult is StaticToolResult<TOOLS> =>\n toolResult.dynamic === false,\n );\n }\n\n get dynamicToolResults() {\n return this.toolResults.filter(\n (toolResult): toolResult is DynamicToolResult =>\n toolResult.dynamic === true,\n );\n }\n}\n","import { StepResult } from './step-result';\nimport { ToolSet } from './tool-set';\n\nexport type StopCondition<TOOLS extends ToolSet> = (options: {\n steps: Array<StepResult<TOOLS>>;\n}) => PromiseLike<boolean> | boolean;\n\nexport function stepCountIs(stepCount: number): StopCondition<any> {\n return ({ steps }) => steps.length === stepCount;\n}\n\nexport function hasToolCall(toolName: string): StopCondition<any> {\n return ({ steps }) =>\n steps[steps.length - 1]?.toolCalls?.some(\n toolCall => toolCall.toolName === toolName,\n ) ?? false;\n}\n\nexport async function isStopConditionMet<TOOLS extends ToolSet>({\n stopConditions,\n steps,\n}: {\n stopConditions: Array<StopCondition<TOOLS>>;\n steps: Array<StepResult<TOOLS>>;\n}): Promise<boolean> {\n return (\n await Promise.all(stopConditions.map(condition => condition({ steps })))\n ).some(result => result);\n}\n","import {\n getErrorMessage,\n JSONValue,\n LanguageModelV2ToolResultOutput,\n} from '@ai-sdk/provider';\nimport { Tool } from '@ai-sdk/provider-utils';\n\nexport function createToolModelOutput({\n output,\n tool,\n errorMode,\n}: {\n output: unknown;\n tool: Tool | undefined;\n errorMode: 'none' | 'text' | 'json';\n}): LanguageModelV2ToolResultOutput {\n if (errorMode === 'text') {\n return { type: 'error-text', value: getErrorMessage(output) };\n } else if (errorMode === 'json') {\n return { type: 'error-json', value: toJSONValue(output) };\n }\n\n if (tool?.toModelOutput) {\n return tool.toModelOutput(output);\n }\n\n return typeof output === 'string'\n ? { type: 'text', value: output }\n : { type: 'json', value: toJSONValue(output) };\n}\n\nfunction toJSONValue(value: unknown): JSONValue {\n return value === undefined ? null : (value as JSONValue);\n}\n","import {\n AssistantContent,\n AssistantModelMessage,\n ToolContent,\n ToolModelMessage,\n} from '../prompt';\nimport { createToolModelOutput } from '../prompt/create-tool-model-output';\nimport { ContentPart } from './content-part';\nimport { ToolSet } from './tool-set';\n\n/**\nConverts the result of a `generateText` or `streamText` call to a list of response messages.\n */\nexport function toResponseMessages<TOOLS extends ToolSet>({\n content: inputContent,\n tools,\n}: {\n content: Array<ContentPart<TOOLS>>;\n tools: TOOLS | undefined;\n}): Array<AssistantModelMessage | ToolModelMessage> {\n const responseMessages: Array<AssistantModelMessage | ToolModelMessage> = [];\n\n const content: AssistantContent = inputContent\n .filter(part => part.type !== 'source')\n .filter(\n part =>\n (part.type !== 'tool-result' || part.providerExecuted) &&\n (part.type !== 'tool-error' || part.providerExecuted),\n )\n .filter(part => part.type !== 'text' || part.text.length > 0)\n .map(part => {\n switch (part.type) {\n case 'text':\n return {\n type: 'text',\n text: part.text,\n providerOptions: part.providerMetadata,\n };\n case 'reasoning':\n return {\n type: 'reasoning',\n text: part.text,\n providerOptions: part.providerMetadata,\n };\n case 'file':\n return {\n type: 'file',\n data: part.file.base64,\n mediaType: part.file.mediaType,\n providerOptions: part.providerMetadata,\n };\n case 'tool-call':\n return {\n type: 'tool-call',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n providerExecuted: part.providerExecuted,\n providerOptions: part.providerMetadata,\n };\n case 'tool-result':\n return {\n type: 'tool-result',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: createToolModelOutput({\n tool: tools?.[part.toolName],\n output: part.output,\n errorMode: 'none',\n }),\n providerExecuted: true,\n providerOptions: part.providerMetadata,\n };\n case 'tool-error':\n return {\n type: 'tool-result',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: createToolModelOutput({\n tool: tools?.[part.toolName],\n output: part.error,\n errorMode: 'json',\n }),\n providerOptions: part.providerMetadata,\n };\n }\n });\n\n if (content.length > 0) {\n responseMessages.push({\n role: 'assistant',\n content,\n });\n }\n\n const toolResultContent: ToolContent = inputContent\n .filter(part => part.type === 'tool-result' || part.type === 'tool-error')\n .filter(part => !part.providerExecuted)\n .map(toolResult => ({\n type: 'tool-result',\n toolCallId: toolResult.toolCallId,\n toolName: toolResult.toolName,\n output: createToolModelOutput({\n tool: tools?.[toolResult.toolName],\n output:\n toolResult.type === 'tool-result'\n ? toolResult.output\n : toolResult.error,\n errorMode: toolResult.type === 'tool-error' ? 'text' : 'none',\n }),\n }));\n\n if (toolResultContent.length > 0) {\n responseMessages.push({\n role: 'tool',\n content: toolResultContent,\n });\n }\n\n return responseMessages;\n}\n","import {\n getErrorMessage,\n LanguageModelV2,\n LanguageModelV2CallWarning,\n} from '@ai-sdk/provider';\nimport {\n createIdGenerator,\n IdGenerator,\n isAbortError,\n ProviderOptions,\n} from '@ai-sdk/provider-utils';\nimport { Span } from '@opentelemetry/api';\nimport { ServerResponse } from 'node:http';\nimport { NoOutputGeneratedError } from '../error';\nimport { NoOutputSpecifiedError } from '../error/no-output-specified-error';\nimport { resolveLanguageModel } from '../model/resolve-model';\nimport { CallSettings } from '../prompt/call-settings';\nimport { convertToLanguageModelPrompt } from '../prompt/convert-to-language-model-prompt';\nimport { prepareCallSettings } from '../prompt/prepare-call-settings';\nimport { prepareToolsAndToolChoice } from '../prompt/prepare-tools-and-tool-choice';\nimport { Prompt } from '../prompt/prompt';\nimport { standardizePrompt } from '../prompt/standardize-prompt';\nimport { wrapGatewayError } from '../prompt/wrap-gateway-error';\nimport { assembleOperationName } from '../telemetry/assemble-operation-name';\nimport { getBaseTelemetryAttributes } from '../telemetry/get-base-telemetry-attributes';\nimport { getTracer } from '../telemetry/get-tracer';\nimport { recordSpan } from '../telemetry/record-span';\nimport { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';\nimport { stringifyForTelemetry } from '../telemetry/stringify-for-telemetry';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport { createTextStreamResponse } from '../text-stream/create-text-stream-response';\nimport { pipeTextStreamToResponse } from '../text-stream/pipe-text-stream-to-response';\nimport { LanguageModelRequestMetadata } from '../types';\nimport {\n CallWarning,\n FinishReason,\n LanguageModel,\n ToolChoice,\n} from '../types/language-model';\nimport { ProviderMetadata } from '../types/provider-metadata';\nimport { addLanguageModelUsage, LanguageModelUsage } from '../types/usage';\nimport { UIMessage } from '../ui';\nimport { createUIMessageStreamResponse } from '../ui-message-stream/create-ui-message-stream-response';\nimport { getResponseUIMessageId } from '../ui-message-stream/get-response-ui-message-id';\nimport { handleUIMessageStreamFinish } from '../ui-message-stream/handle-ui-message-stream-finish';\nimport { pipeUIMessageStreamToResponse } from '../ui-message-stream/pipe-ui-message-stream-to-response';\nimport {\n InferUIMessageChunk,\n UIMessageChunk,\n} from '../ui-message-stream/ui-message-chunks';\nimport { UIMessageStreamResponseInit } from '../ui-message-stream/ui-message-stream-response-init';\nimport { InferUIMessageData, InferUIMessageMetadata } from '../ui/ui-messages';\nimport { asArray } from '../util/as-array';\nimport {\n AsyncIterableStream,\n createAsyncIterableStream,\n} from '../util/async-iterable-stream';\nimport { consumeStream } from '../util/consume-stream';\nimport { createStitchableStream } from '../util/create-stitchable-stream';\nimport { DelayedPromise } from '../util/delayed-promise';\nimport { filterStreamErrors } from '../util/filter-stream-errors';\nimport { now as originalNow } from '../util/now';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { ContentPart } from './content-part';\nimport { Output } from './output';\nimport { PrepareStepFunction } from './prepare-step';\nimport { ResponseMessage } from './response-message';\nimport {\n runToolsTransformation,\n SingleRequestTextStreamPart,\n} from './run-tools-transformation';\nimport { DefaultStepResult, StepResult } from './step-result';\nimport {\n isStopConditionMet,\n stepCountIs,\n StopCondition,\n} from './stop-condition';\nimport {\n ConsumeStreamOptions,\n StreamTextResult,\n TextStreamPart,\n UIMessageStreamOptions,\n} from './stream-text-result';\nimport { toResponseMessages } from './to-response-messages';\nimport { TypedToolCall } from './tool-call';\nimport { ToolCallRepairFunction } from './tool-call-repair-function';\nimport { ToolOutput } from './tool-output';\nimport { ToolSet } from './tool-set';\n\nconst originalGenerateId = createIdGenerator({\n prefix: 'aitxt',\n size: 24,\n});\n\n/**\nA transformation that is applied to the stream.\n\n@param stopStream - A function that stops the source stream.\n@param tools - The tools that are accessible to and can be called by the model. The model needs to support calling tools.\n */\nexport type StreamTextTransform<TOOLS extends ToolSet> = (options: {\n tools: TOOLS; // for type inference\n stopStream: () => void;\n}) => TransformStream<TextStreamPart<TOOLS>, TextStreamPart<TOOLS>>;\n\n/**\nCallback that is set using the `onError` option.\n\n@param event - The event that is passed to the callback.\n */\nexport type StreamTextOnErrorCallback = (event: {\n error: unknown;\n}) => PromiseLike<void> | void;\n\n/**\nCallback that is set using the `onStepFinish` option.\n\n@param stepResult - The result of the step.\n */\nexport type StreamTextOnStepFinishCallback<TOOLS extends ToolSet> = (\n stepResult: StepResult<TOOLS>,\n) => PromiseLike<void> | void;\n\n/**\nCallback that is set using the `onChunk` option.\n\n@param event - The event that is passed to the callback.\n */\nexport type StreamTextOnChunkCallback<TOOLS extends ToolSet> = (event: {\n chunk: Extract<\n TextStreamPart<TOOLS>,\n {\n type:\n | 'text-delta'\n | 'reasoning-delta'\n | 'source'\n | 'tool-call'\n | 'tool-input-start'\n | 'tool-input-delta'\n | 'tool-result'\n | 'raw';\n }\n >;\n}) => PromiseLike<void> | void;\n\n/**\nCallback that is set using the `onFinish` option.\n\n@param event - The event that is passed to the callback.\n */\nexport type StreamTextOnFinishCallback<TOOLS extends ToolSet> = (\n event: StepResult<TOOLS> & {\n /**\nDetails for all steps.\n */\n readonly steps: StepResult<TOOLS>[];\n\n /**\nTotal usage for all steps. This is the sum of the usage of all steps.\n */\n readonly totalUsage: LanguageModelUsage;\n },\n) => PromiseLike<void> | void;\n\n/**\nCallback that is set using the `onAbort` option.\n\n@param event - The event that is passed to the callback.\n */\nexport type StreamTextOnAbortCallback<TOOLS extends ToolSet> = (event: {\n /**\nDetails for all previously finished steps.\n */\n readonly steps: StepResult<TOOLS>[];\n}) => PromiseLike<void> | void;\n\n/**\nGenerate a text and call tools for a given prompt using a language model.\n\nThis function streams the output. If you do not want to stream the output, use `generateText` instead.\n\n@param model - The language model to use.\n@param tools - Tools that are accessible to and can be called by the model. The model needs to support calling tools.\n\n@param system - A system message that will be part of the prompt.\n@param prompt - A simple text prompt. You can either use `prompt` or `messages` but not both.\n@param messages - A list of messages. You can either use `prompt` or `messages` but not both.\n\n@param maxOutputTokens - Maximum number of tokens to generate.\n@param temperature - Temperature setting.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topP - Nucleus sampling.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topK - Only sample from the top K options for each subsequent token.\nUsed to remove \"long tail\" low probability responses.\nRecommended for advanced use cases only. You usually only need to use temperature.\n@param presencePenalty - Presence penalty setting.\nIt affects the likelihood of the model to repeat information that is already in the prompt.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param frequencyPenalty - Frequency penalty setting.\nIt affects the likelihood of the model to repeatedly use the same words or phrases.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param stopSequences - Stop sequences.\nIf set, the model will stop generating text when one of the stop sequences is generated.\n@param seed - The seed (integer) to use for random sampling.\nIf set and supported by the model, calls will generate deterministic results.\n\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@param maxSteps - Maximum number of sequential LLM calls (steps), e.g. when you use tool calls.\n\n@param onChunk - Callback that is called for each chunk of the stream. The stream processing will pause until the callback promise is resolved.\n@param onError - Callback that is called when an error occurs during streaming. You can use it to log errors.\n@param onStepFinish - Callback that is called when each step (LLM call) is finished, including intermediate steps.\n@param onFinish - Callback that is called when the LLM response and all request tool executions\n(for tools that have an `execute` function) are finished.\n\n@return\nA result object for accessing different stream types and additional information.\n */\nexport function streamText<\n TOOLS extends ToolSet,\n OUTPUT = never,\n PARTIAL_OUTPUT = never,\n>({\n model,\n tools,\n toolChoice,\n system,\n prompt,\n messages,\n maxRetries,\n abortSignal,\n headers,\n stopWhen = stepCountIs(1),\n experimental_output: output,\n experimental_telemetry: telemetry,\n prepareStep,\n providerOptions,\n experimental_activeTools,\n activeTools = experimental_activeTools,\n experimental_repairToolCall: repairToolCall,\n experimental_transform: transform,\n includeRawChunks = false,\n onChunk,\n onError = ({ error }) => {\n console.error(error);\n },\n onFinish,\n onAbort,\n onStepFinish,\n experimental_context,\n _internal: {\n now = originalNow,\n generateId = originalGenerateId,\n currentDate = () => new Date(),\n } = {},\n ...settings\n}: CallSettings &\n Prompt & {\n /**\nThe language model to use.\n */\n model: LanguageModel;\n\n /**\nThe tools that the model can call. The model needs to support calling tools.\n */\n tools?: TOOLS;\n\n /**\nThe tool choice strategy. Default: 'auto'.\n */\n toolChoice?: ToolChoice<TOOLS>;\n\n /**\nCondition for stopping the generation when there are tool results in the last step.\nWhen the condition is an array, any of the conditions can be met to stop the generation.\n\n@default stepCountIs(1)\n */\n stopWhen?:\n | StopCondition<NoInfer<TOOLS>>\n | Array<StopCondition<NoInfer<TOOLS>>>;\n\n /**\nOptional telemetry configuration (experimental).\n */\n experimental_telemetry?: TelemetrySettings;\n\n /**\nAdditional provider-specific options. 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\n /**\n * @deprecated Use `activeTools` instead.\n */\n experimental_activeTools?: Array<keyof NoInfer<TOOLS>>;\n\n /**\n Limits the tools that are available for the model to call without\n changing the tool call and result types in the result.\n */\n activeTools?: Array<keyof NoInfer<TOOLS>>;\n\n /**\nOptional specification for parsing structured outputs from the LLM response.\n */\n experimental_output?: Output<OUTPUT, PARTIAL_OUTPUT>;\n\n /**\nOptional function that you can use to provide different settings for a step.\n\n@param options - The options for the step.\n@param options.steps - The steps that have been executed so far.\n@param options.stepNumber - The number of the step that is being executed.\n@param options.model - The model that is being used.\n\n@returns An object that contains the settings for the step.\nIf you return undefined (or for undefined settings), the settings from the outer level will be used.\n */\n prepareStep?: PrepareStepFunction<NoInfer<TOOLS>>;\n\n /**\nA function that attempts to repair a tool call that failed to parse.\n */\n experimental_repairToolCall?: ToolCallRepairFunction<TOOLS>;\n\n /**\nOptional stream transformations.\nThey are applied in the order they are provided.\nThe stream transformations must maintain the stream structure for streamText to work correctly.\n */\n experimental_transform?:\n | StreamTextTransform<TOOLS>\n | Array<StreamTextTransform<TOOLS>>;\n\n /**\nWhether to include raw chunks from the provider in the stream.\nWhen enabled, you will receive raw chunks with type 'raw' that contain the unprocessed data from the provider.\nThis allows access to cutting-edge provider features not yet wrapped by the AI SDK.\nDefaults to false.\n */\n includeRawChunks?: boolean;\n\n /**\nCallback that is called for each chunk of the stream.\nThe stream processing will pause until the callback promise is resolved.\n */\n onChunk?: StreamTextOnChunkCallback<TOOLS>;\n\n /**\nCallback that is invoked when an error occurs during streaming.\nYou can use it to log errors.\nThe stream processing will pause until the callback promise is resolved.\n */\n onError?: StreamTextOnErrorCallback;\n\n /**\nCallback that is called when the LLM response and all request tool executions\n(for tools that have an `execute` function) are finished.\n\nThe usage is the combined usage of all steps.\n */\n onFinish?: StreamTextOnFinishCallback<TOOLS>;\n\n onAbort?: StreamTextOnAbortCallback<TOOLS>;\n\n /**\nCallback that is called when each step (LLM call) is finished, including intermediate steps.\n */\n onStepFinish?: StreamTextOnStepFinishCallback<TOOLS>;\n\n /**\n * Context that is passed into tool execution.\n *\n * Experimental (can break in patch releases).\n *\n * @default undefined\n */\n experimental_context?: unknown;\n\n /**\nInternal. For test use only. May change without notice.\n */\n _internal?: {\n now?: () => number;\n generateId?: IdGenerator;\n currentDate?: () => Date;\n };\n }): StreamTextResult<TOOLS, PARTIAL_OUTPUT> {\n return new DefaultStreamTextResult<TOOLS, OUTPUT, PARTIAL_OUTPUT>({\n model: resolveLanguageModel(model),\n telemetry,\n headers,\n settings,\n maxRetries,\n abortSignal,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n transforms: asArray(transform),\n activeTools,\n repairToolCall,\n stopConditions: asArray(stopWhen),\n output,\n providerOptions,\n prepareStep,\n includeRawChunks,\n onChunk,\n onError,\n onFinish,\n onAbort,\n onStepFinish,\n now,\n currentDate,\n generateId,\n experimental_context,\n });\n}\n\ntype EnrichedStreamPart<TOOLS extends ToolSet, PARTIAL_OUTPUT> = {\n part: TextStreamPart<TOOLS>;\n partialOutput: PARTIAL_OUTPUT | undefined;\n};\n\nfunction createOutputTransformStream<\n TOOLS extends ToolSet,\n OUTPUT,\n PARTIAL_OUTPUT,\n>(\n output: Output<OUTPUT, PARTIAL_OUTPUT> | undefined,\n): TransformStream<\n TextStreamPart<TOOLS>,\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>\n> {\n if (!output) {\n return new TransformStream<\n TextStreamPart<TOOLS>,\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>\n >({\n transform(chunk, controller) {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n },\n });\n }\n\n let firstTextChunkId: string | undefined = undefined;\n let text = '';\n let textChunk = '';\n let lastPublishedJson = '';\n\n function publishTextChunk({\n controller,\n partialOutput = undefined,\n }: {\n controller: TransformStreamDefaultController<\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>\n >;\n partialOutput?: PARTIAL_OUTPUT;\n }) {\n controller.enqueue({\n part: {\n type: 'text-delta',\n id: firstTextChunkId!,\n text: textChunk,\n },\n partialOutput,\n });\n textChunk = '';\n }\n\n return new TransformStream<\n TextStreamPart<TOOLS>,\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>\n >({\n async transform(chunk, controller) {\n // ensure that we publish the last text chunk before the step finish:\n if (chunk.type === 'finish-step' && textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n\n if (\n chunk.type !== 'text-delta' &&\n chunk.type !== 'text-start' &&\n chunk.type !== 'text-end'\n ) {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n // we have to pick a text chunk which contains the json text\n // since we are streaming, we have to pick the first text chunk\n if (firstTextChunkId == null) {\n firstTextChunkId = chunk.id;\n } else if (chunk.id !== firstTextChunkId) {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n if (chunk.type === 'text-start') {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n if (chunk.type === 'text-end') {\n if (textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n text += chunk.text;\n textChunk += chunk.text;\n\n // only publish if partial json can be parsed:\n const result = await output.parsePartial({ text });\n if (result != null) {\n // only send new json if it has changed:\n const currentJson = JSON.stringify(result.partial);\n if (currentJson !== lastPublishedJson) {\n publishTextChunk({ controller, partialOutput: result.partial });\n lastPublishedJson = currentJson;\n }\n }\n },\n });\n}\n\nclass DefaultStreamTextResult<TOOLS extends ToolSet, OUTPUT, PARTIAL_OUTPUT>\n implements StreamTextResult<TOOLS, PARTIAL_OUTPUT>\n{\n private readonly _totalUsage = new DelayedPromise<\n Awaited<StreamTextResult<TOOLS, PARTIAL_OUTPUT>['usage']>\n >();\n private readonly _finishReason = new DelayedPromise<\n Awaited<StreamTextResult<TOOLS, PARTIAL_OUTPUT>['finishReason']>\n >();\n private readonly _steps = new DelayedPromise<\n Awaited<StreamTextResult<TOOLS, PARTIAL_OUTPUT>['steps']>\n >();\n\n private readonly addStream: (\n stream: ReadableStream<TextStreamPart<TOOLS>>,\n ) => void;\n\n private readonly closeStream: () => void;\n\n private baseStream: ReadableStream<EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>>;\n\n private output: Output<OUTPUT, PARTIAL_OUTPUT> | undefined;\n\n private includeRawChunks: boolean;\n\n private tools: TOOLS | undefined;\n\n constructor({\n model,\n telemetry,\n headers,\n settings,\n maxRetries: maxRetriesArg,\n abortSignal,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n transforms,\n activeTools,\n repairToolCall,\n stopConditions,\n output,\n providerOptions,\n prepareStep,\n includeRawChunks,\n now,\n currentDate,\n generateId,\n onChunk,\n onError,\n onFinish,\n onAbort,\n onStepFinish,\n experimental_context,\n }: {\n model: LanguageModelV2;\n telemetry: TelemetrySettings | undefined;\n headers: Record<string, string | undefined> | undefined;\n settings: Omit<CallSettings, 'abortSignal' | 'headers'>;\n maxRetries: number | undefined;\n abortSignal: AbortSignal | undefined;\n system: Prompt['system'];\n prompt: Prompt['prompt'];\n messages: Prompt['messages'];\n tools: TOOLS | undefined;\n toolChoice: ToolChoice<TOOLS> | undefined;\n transforms: Array<StreamTextTransform<TOOLS>>;\n activeTools: Array<keyof TOOLS> | undefined;\n repairToolCall: ToolCallRepairFunction<TOOLS> | undefined;\n stopConditions: Array<StopCondition<NoInfer<TOOLS>>>;\n output: Output<OUTPUT, PARTIAL_OUTPUT> | undefined;\n providerOptions: ProviderOptions | undefined;\n prepareStep: PrepareStepFunction<NoInfer<TOOLS>> | undefined;\n includeRawChunks: boolean;\n now: () => number;\n currentDate: () => Date;\n generateId: () => string;\n experimental_context: unknown;\n\n // callbacks:\n onChunk: undefined | StreamTextOnChunkCallback<TOOLS>;\n onError: StreamTextOnErrorCallback;\n onFinish: undefined | StreamTextOnFinishCallback<TOOLS>;\n onAbort: undefined | StreamTextOnAbortCallback<TOOLS>;\n onStepFinish: undefined | StreamTextOnStepFinishCallback<TOOLS>;\n }) {\n this.output = output;\n this.includeRawChunks = includeRawChunks;\n this.tools = tools;\n\n // promise to ensure that the step has been fully processed by the event processor\n // before a new step is started. This is required because the continuation condition\n // needs the updated steps to determine if another step is needed.\n let stepFinish!: DelayedPromise<void>;\n\n let recordedContent: Array<ContentPart<TOOLS>> = [];\n const recordedResponseMessages: Array<ResponseMessage> = [];\n let recordedFinishReason: FinishReason | undefined = undefined;\n let recordedTotalUsage: LanguageModelUsage | undefined = undefined;\n let recordedRequest: LanguageModelRequestMetadata = {};\n let recordedWarnings: Array<CallWarning> = [];\n const recordedSteps: StepResult<TOOLS>[] = [];\n\n let rootSpan!: Span;\n\n let activeTextContent: Record<\n string,\n {\n type: 'text';\n text: string;\n providerMetadata: ProviderMetadata | undefined;\n }\n > = {};\n\n let activeReasoningContent: Record<\n string,\n {\n type: 'reasoning';\n text: string;\n providerMetadata: ProviderMetadata | undefined;\n }\n > = {};\n\n const eventProcessor = new TransformStream<\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>,\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>\n >({\n async transform(chunk, controller) {\n controller.enqueue(chunk); // forward the chunk to the next stream\n\n const { part } = chunk;\n\n if (\n part.type === 'text-delta' ||\n part.type === 'reasoning-delta' ||\n part.type === 'source' ||\n part.type === 'tool-call' ||\n part.type === 'tool-result' ||\n part.type === 'tool-input-start' ||\n part.type === 'tool-input-delta' ||\n part.type === 'raw'\n ) {\n await onChunk?.({ chunk: part });\n }\n\n if (part.type === 'error') {\n await onError({ error: wrapGatewayError(part.error) });\n }\n\n if (part.type === 'text-start') {\n activeTextContent[part.id] = {\n type: 'text',\n text: '',\n providerMetadata: part.providerMetadata,\n };\n\n recordedContent.push(activeTextContent[part.id]);\n }\n\n if (part.type === 'text-delta') {\n const activeText = activeTextContent[part.id];\n\n if (activeText == null) {\n controller.enqueue({\n part: {\n type: 'error',\n error: `text part ${part.id} not found`,\n },\n partialOutput: undefined,\n });\n return;\n }\n\n activeText.text += part.text;\n activeText.providerMetadata =\n part.providerMetadata ?? activeText.providerMetadata;\n }\n\n if (part.type === 'text-end') {\n delete activeTextContent[part.id];\n }\n\n if (part.type === 'reasoning-start') {\n activeReasoningContent[part.id] = {\n type: 'reasoning',\n text: '',\n providerMetadata: part.providerMetadata,\n };\n\n recordedContent.push(activeReasoningContent[part.id]);\n }\n\n if (part.type === 'reasoning-delta') {\n const activeReasoning = activeReasoningContent[part.id];\n\n if (activeReasoning == null) {\n controller.enqueue({\n part: {\n type: 'error',\n error: `reasoning part ${part.id} not found`,\n },\n partialOutput: undefined,\n });\n return;\n }\n\n activeReasoning.text += part.text;\n activeReasoning.providerMetadata =\n part.providerMetadata ?? activeReasoning.providerMetadata;\n }\n\n if (part.type === 'reasoning-end') {\n const activeReasoning = activeReasoningContent[part.id];\n\n if (activeReasoning == null) {\n controller.enqueue({\n part: {\n type: 'error',\n error: `reasoning part ${part.id} not found`,\n },\n partialOutput: undefined,\n });\n return;\n }\n\n activeReasoning.providerMetadata =\n part.providerMetadata ?? activeReasoning.providerMetadata;\n\n delete activeReasoningContent[part.id];\n }\n\n if (part.type === 'file') {\n recordedContent.push({ type: 'file', file: part.file });\n }\n\n if (part.type === 'source') {\n recordedContent.push(part);\n }\n\n if (part.type === 'tool-call') {\n recordedContent.push(part);\n }\n\n if (part.type === 'tool-result' && !part.preliminary) {\n recordedContent.push(part);\n }\n\n if (part.type === 'tool-error') {\n recordedContent.push(part);\n }\n\n if (part.type === 'start-step') {\n recordedRequest = part.request;\n recordedWarnings = part.warnings;\n }\n\n if (part.type === 'finish-step') {\n const stepMessages = toResponseMessages({\n content: recordedContent,\n tools,\n });\n\n // Add step information (after response messages are updated):\n const currentStepResult: StepResult<TOOLS> = new DefaultStepResult({\n content: recordedContent,\n finishReason: part.finishReason,\n usage: part.usage,\n warnings: recordedWarnings,\n request: recordedRequest,\n response: {\n ...part.response,\n messages: [...recordedResponseMessages, ...stepMessages],\n },\n providerMetadata: part.providerMetadata,\n });\n\n await onStepFinish?.(currentStepResult);\n\n recordedSteps.push(currentStepResult);\n\n recordedContent = [];\n activeReasoningContent = {};\n activeTextContent = {};\n\n recordedResponseMessages.push(...stepMessages);\n\n // resolve the promise to signal that the step has been fully processed\n // by the event processor:\n stepFinish.resolve();\n }\n\n if (part.type === 'finish') {\n recordedTotalUsage = part.totalUsage;\n recordedFinishReason = part.finishReason;\n }\n },\n\n async flush(controller) {\n try {\n if (recordedSteps.length === 0) {\n const error = new NoOutputGeneratedError({\n message: 'No output generated. Check the stream for errors.',\n });\n\n self._finishReason.reject(error);\n self._totalUsage.reject(error);\n self._steps.reject(error);\n\n return; // no steps recorded (e.g. in error scenario)\n }\n\n // derived:\n const finishReason = recordedFinishReason ?? 'unknown';\n const totalUsage = recordedTotalUsage ?? {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n };\n\n // from finish:\n self._finishReason.resolve(finishReason);\n self._totalUsage.resolve(totalUsage);\n\n // aggregate results:\n self._steps.resolve(recordedSteps);\n\n // call onFinish callback:\n const finalStep = recordedSteps[recordedSteps.length - 1];\n await onFinish?.({\n finishReason,\n totalUsage,\n usage: finalStep.usage,\n content: finalStep.content,\n text: finalStep.text,\n reasoningText: finalStep.reasoningText,\n reasoning: finalStep.reasoning,\n files: finalStep.files,\n sources: finalStep.sources,\n toolCalls: finalStep.toolCalls,\n staticToolCalls: finalStep.staticToolCalls,\n dynamicToolCalls: finalStep.dynamicToolCalls,\n toolResults: finalStep.toolResults,\n staticToolResults: finalStep.staticToolResults,\n dynamicToolResults: finalStep.dynamicToolResults,\n request: finalStep.request,\n response: finalStep.response,\n warnings: finalStep.warnings,\n providerMetadata: finalStep.providerMetadata,\n steps: recordedSteps,\n });\n\n // Add response information to the root span:\n rootSpan.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.response.finishReason': finishReason,\n 'ai.response.text': { output: () => finalStep.text },\n 'ai.response.toolCalls': {\n output: () =>\n finalStep.toolCalls?.length\n ? JSON.stringify(finalStep.toolCalls)\n : undefined,\n },\n 'ai.response.providerMetadata': JSON.stringify(\n finalStep.providerMetadata,\n ),\n\n 'ai.usage.inputTokens': totalUsage.inputTokens,\n 'ai.usage.outputTokens': totalUsage.outputTokens,\n 'ai.usage.totalTokens': totalUsage.totalTokens,\n 'ai.usage.reasoningTokens': totalUsage.reasoningTokens,\n 'ai.usage.cachedInputTokens': totalUsage.cachedInputTokens,\n },\n }),\n );\n } catch (error) {\n controller.error(error);\n } finally {\n rootSpan.end();\n }\n },\n });\n\n // initialize the stitchable stream and the transformed stream:\n const stitchableStream = createStitchableStream<TextStreamPart<TOOLS>>();\n this.addStream = stitchableStream.addStream;\n this.closeStream = stitchableStream.close;\n\n let stream = stitchableStream.stream;\n\n // filter out abort errors:\n stream = filterStreamErrors(stream, ({ error, controller }) => {\n if (isAbortError(error) && abortSignal?.aborted) {\n onAbort?.({ steps: recordedSteps });\n controller.enqueue({ type: 'abort' });\n controller.close();\n } else {\n controller.error(error);\n }\n });\n\n // add a stream that emits a start event:\n stream = stream.pipeThrough(\n new TransformStream<TextStreamPart<TOOLS>, TextStreamPart<TOOLS>>({\n start(controller) {\n controller.enqueue({ type: 'start' });\n },\n }),\n );\n\n // transform the stream before output parsing\n // to enable replacement of stream segments:\n for (const transform of transforms) {\n stream = stream.pipeThrough(\n transform({\n tools: tools as TOOLS,\n stopStream() {\n stitchableStream.terminate();\n },\n }),\n );\n }\n\n this.baseStream = stream\n .pipeThrough(createOutputTransformStream(output))\n .pipeThrough(eventProcessor);\n\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const tracer = getTracer(telemetry);\n\n const callSettings = prepareCallSettings(settings);\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries },\n });\n\n const self = this;\n\n recordSpan({\n name: 'ai.streamText',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: 'ai.streamText', telemetry }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n 'ai.prompt': {\n input: () => JSON.stringify({ system, prompt, messages }),\n },\n },\n }),\n tracer,\n endWhenDone: false,\n fn: async rootSpanArg => {\n rootSpan = rootSpanArg;\n\n async function streamStep({\n currentStep,\n responseMessages,\n usage,\n }: {\n currentStep: number;\n responseMessages: Array<ResponseMessage>;\n usage: LanguageModelUsage;\n }) {\n const includeRawChunks = self.includeRawChunks;\n\n stepFinish = new DelayedPromise<void>();\n\n const initialPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n });\n\n const stepInputMessages = [\n ...initialPrompt.messages,\n ...responseMessages,\n ];\n\n const prepareStepResult = await prepareStep?.({\n model,\n steps: recordedSteps,\n stepNumber: recordedSteps.length,\n messages: stepInputMessages,\n });\n\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: {\n system: prepareStepResult?.system ?? initialPrompt.system,\n messages: prepareStepResult?.messages ?? stepInputMessages,\n },\n supportedUrls: await model.supportedUrls,\n });\n\n const stepModel = resolveLanguageModel(\n prepareStepResult?.model ?? model,\n );\n\n const { toolChoice: stepToolChoice, tools: stepTools } =\n prepareToolsAndToolChoice({\n tools,\n toolChoice: prepareStepResult?.toolChoice ?? toolChoice,\n activeTools: prepareStepResult?.activeTools ?? activeTools,\n });\n\n const {\n result: { stream, response, request },\n doStreamSpan,\n startTimestampMs,\n } = await retry(() =>\n recordSpan({\n name: 'ai.streamText.doStream',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.streamText.doStream',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // model:\n 'ai.model.provider': stepModel.provider,\n 'ai.model.id': stepModel.modelId,\n // prompt:\n 'ai.prompt.messages': {\n input: () => stringifyForTelemetry(promptMessages),\n },\n 'ai.prompt.tools': {\n // convert the language model level tools:\n input: () => stepTools?.map(tool => JSON.stringify(tool)),\n },\n 'ai.prompt.toolChoice': {\n input: () =>\n stepToolChoice != null\n ? JSON.stringify(stepToolChoice)\n : undefined,\n },\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.system': stepModel.provider,\n 'gen_ai.request.model': stepModel.modelId,\n 'gen_ai.request.frequency_penalty':\n callSettings.frequencyPenalty,\n 'gen_ai.request.max_tokens': callSettings.maxOutputTokens,\n 'gen_ai.request.presence_penalty':\n callSettings.presencePenalty,\n 'gen_ai.request.stop_sequences': callSettings.stopSequences,\n 'gen_ai.request.temperature': callSettings.temperature,\n 'gen_ai.request.top_k': callSettings.topK,\n 'gen_ai.request.top_p': callSettings.topP,\n },\n }),\n tracer,\n endWhenDone: false,\n fn: async doStreamSpan => {\n return {\n startTimestampMs: now(), // get before the call\n doStreamSpan,\n result: await stepModel.doStream({\n ...callSettings,\n tools: stepTools,\n toolChoice: stepToolChoice,\n responseFormat: output?.responseFormat,\n prompt: promptMessages,\n providerOptions,\n abortSignal,\n headers,\n includeRawChunks,\n }),\n };\n },\n }),\n );\n\n const streamWithToolResults = runToolsTransformation({\n tools,\n generatorStream: stream,\n tracer,\n telemetry,\n system,\n messages: stepInputMessages,\n repairToolCall,\n abortSignal,\n experimental_context,\n });\n\n const stepRequest = request ?? {};\n const stepToolCalls: TypedToolCall<TOOLS>[] = [];\n const stepToolOutputs: ToolOutput<TOOLS>[] = [];\n let warnings: LanguageModelV2CallWarning[] | undefined;\n\n const activeToolCallToolNames: Record<string, string> = {};\n\n let stepFinishReason: FinishReason = 'unknown';\n let stepUsage: LanguageModelUsage = {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n };\n let stepProviderMetadata: ProviderMetadata | undefined;\n let stepFirstChunk = true;\n let stepResponse: { id: string; timestamp: Date; modelId: string } = {\n id: generateId(),\n timestamp: currentDate(),\n modelId: model.modelId,\n };\n\n // raw text as it comes from the provider. recorded for telemetry.\n let activeText = '';\n\n self.addStream(\n streamWithToolResults.pipeThrough(\n new TransformStream<\n SingleRequestTextStreamPart<TOOLS>,\n TextStreamPart<TOOLS>\n >({\n async transform(chunk, controller): Promise<void> {\n if (chunk.type === 'stream-start') {\n warnings = chunk.warnings;\n return; // stream start chunks are sent immediately and do not count as first chunk\n }\n\n if (stepFirstChunk) {\n // Telemetry for first chunk:\n const msToFirstChunk = now() - startTimestampMs;\n\n stepFirstChunk = false;\n\n doStreamSpan.addEvent('ai.stream.firstChunk', {\n 'ai.response.msToFirstChunk': msToFirstChunk,\n });\n\n doStreamSpan.setAttributes({\n 'ai.response.msToFirstChunk': msToFirstChunk,\n });\n\n // Step start:\n controller.enqueue({\n type: 'start-step',\n request: stepRequest,\n warnings: warnings ?? [],\n });\n }\n\n const chunkType = chunk.type;\n switch (chunkType) {\n case 'text-start':\n case 'text-end': {\n controller.enqueue(chunk);\n break;\n }\n\n case 'text-delta': {\n if (chunk.delta.length > 0) {\n controller.enqueue({\n type: 'text-delta',\n id: chunk.id,\n text: chunk.delta,\n providerMetadata: chunk.providerMetadata,\n });\n activeText += chunk.delta;\n }\n break;\n }\n\n case 'reasoning-start':\n case 'reasoning-end': {\n controller.enqueue(chunk);\n break;\n }\n\n case 'reasoning-delta': {\n controller.enqueue({\n type: 'reasoning-delta',\n id: chunk.id,\n text: chunk.delta,\n providerMetadata: chunk.providerMetadata,\n });\n break;\n }\n\n case 'tool-call': {\n controller.enqueue(chunk);\n // store tool calls for onFinish callback and toolCalls promise:\n stepToolCalls.push(chunk);\n break;\n }\n\n case 'tool-result': {\n controller.enqueue(chunk);\n\n if (!chunk.preliminary) {\n stepToolOutputs.push(chunk);\n }\n\n break;\n }\n\n case 'tool-error': {\n controller.enqueue(chunk);\n stepToolOutputs.push(chunk);\n break;\n }\n\n case 'response-metadata': {\n stepResponse = {\n id: chunk.id ?? stepResponse.id,\n timestamp: chunk.timestamp ?? stepResponse.timestamp,\n modelId: chunk.modelId ?? stepResponse.modelId,\n };\n break;\n }\n\n case 'finish': {\n // Note: tool executions might not be finished yet when the finish event is emitted.\n // store usage and finish reason for promises and onFinish callback:\n stepUsage = chunk.usage;\n stepFinishReason = chunk.finishReason;\n stepProviderMetadata = chunk.providerMetadata;\n\n // Telemetry for finish event timing\n // (since tool executions can take longer and distort calculations)\n const msToFinish = now() - startTimestampMs;\n doStreamSpan.addEvent('ai.stream.finish');\n doStreamSpan.setAttributes({\n 'ai.response.msToFinish': msToFinish,\n 'ai.response.avgOutputTokensPerSecond':\n (1000 * (stepUsage.outputTokens ?? 0)) / msToFinish,\n });\n\n break;\n }\n\n case 'file': {\n controller.enqueue(chunk);\n break;\n }\n\n case 'source': {\n controller.enqueue(chunk);\n break;\n }\n\n case 'tool-input-start': {\n activeToolCallToolNames[chunk.id] = chunk.toolName;\n\n const tool = tools?.[chunk.toolName];\n if (tool?.onInputStart != null) {\n await tool.onInputStart({\n toolCallId: chunk.id,\n messages: stepInputMessages,\n abortSignal,\n experimental_context,\n });\n }\n\n controller.enqueue({\n ...chunk,\n dynamic: tool?.type === 'dynamic',\n });\n break;\n }\n\n case 'tool-input-end': {\n delete activeToolCallToolNames[chunk.id];\n controller.enqueue(chunk);\n break;\n }\n\n case 'tool-input-delta': {\n const toolName = activeToolCallToolNames[chunk.id];\n const tool = tools?.[toolName];\n\n if (tool?.onInputDelta != null) {\n await tool.onInputDelta({\n inputTextDelta: chunk.delta,\n toolCallId: chunk.id,\n messages: stepInputMessages,\n abortSignal,\n experimental_context,\n });\n }\n\n controller.enqueue(chunk);\n break;\n }\n\n case 'error': {\n controller.enqueue(chunk);\n stepFinishReason = 'error';\n break;\n }\n\n case 'raw': {\n if (includeRawChunks) {\n controller.enqueue(chunk);\n }\n break;\n }\n\n default: {\n const exhaustiveCheck: never = chunkType;\n throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);\n }\n }\n },\n\n // invoke onFinish callback and resolve toolResults promise when the stream is about to close:\n async flush(controller) {\n const stepToolCallsJson =\n stepToolCalls.length > 0\n ? JSON.stringify(stepToolCalls)\n : undefined;\n\n // record telemetry information first to ensure best effort timing\n try {\n doStreamSpan.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.response.finishReason': stepFinishReason,\n 'ai.response.text': {\n output: () => activeText,\n },\n 'ai.response.toolCalls': {\n output: () => stepToolCallsJson,\n },\n 'ai.response.id': stepResponse.id,\n 'ai.response.model': stepResponse.modelId,\n 'ai.response.timestamp':\n stepResponse.timestamp.toISOString(),\n 'ai.response.providerMetadata':\n JSON.stringify(stepProviderMetadata),\n\n 'ai.usage.inputTokens': stepUsage.inputTokens,\n 'ai.usage.outputTokens': stepUsage.outputTokens,\n 'ai.usage.totalTokens': stepUsage.totalTokens,\n 'ai.usage.reasoningTokens': stepUsage.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n stepUsage.cachedInputTokens,\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.response.finish_reasons': [stepFinishReason],\n 'gen_ai.response.id': stepResponse.id,\n 'gen_ai.response.model': stepResponse.modelId,\n 'gen_ai.usage.input_tokens': stepUsage.inputTokens,\n 'gen_ai.usage.output_tokens': stepUsage.outputTokens,\n },\n }),\n );\n } catch (error) {\n // ignore error setting telemetry attributes\n } finally {\n // finish doStreamSpan before other operations for correct timing:\n doStreamSpan.end();\n }\n\n controller.enqueue({\n type: 'finish-step',\n finishReason: stepFinishReason,\n usage: stepUsage,\n providerMetadata: stepProviderMetadata,\n response: {\n ...stepResponse,\n headers: response?.headers,\n },\n });\n\n const combinedUsage = addLanguageModelUsage(usage, stepUsage);\n\n // wait for the step to be fully processed by the event processor\n // to ensure that the recorded steps are complete:\n await stepFinish.promise;\n\n const clientToolCalls = stepToolCalls.filter(\n toolCall => toolCall.providerExecuted !== true,\n );\n const clientToolOutputs = stepToolOutputs.filter(\n toolOutput => toolOutput.providerExecuted !== true,\n );\n\n if (\n clientToolCalls.length > 0 &&\n // all current tool calls have outputs (incl. execution errors):\n clientToolOutputs.length === clientToolCalls.length &&\n // continue until a stop condition is met:\n !(await isStopConditionMet({\n stopConditions,\n steps: recordedSteps,\n }))\n ) {\n // append to messages for the next step:\n responseMessages.push(\n ...toResponseMessages({\n content:\n // use transformed content to create the messages for the next step:\n recordedSteps[recordedSteps.length - 1].content,\n tools,\n }),\n );\n\n try {\n await streamStep({\n currentStep: currentStep + 1,\n responseMessages,\n usage: combinedUsage,\n });\n } catch (error) {\n controller.enqueue({\n type: 'error',\n error,\n });\n\n self.closeStream();\n }\n } else {\n controller.enqueue({\n type: 'finish',\n finishReason: stepFinishReason,\n totalUsage: combinedUsage,\n });\n\n self.closeStream(); // close the stitchable stream\n }\n },\n }),\n ),\n );\n }\n\n // add the initial stream to the stitchable stream\n await streamStep({\n currentStep: 0,\n responseMessages: [],\n usage: {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n },\n });\n },\n }).catch(error => {\n // add an error stream part and close the streams:\n self.addStream(\n new ReadableStream({\n start(controller) {\n controller.enqueue({ type: 'error', error });\n controller.close();\n },\n }),\n );\n self.closeStream();\n });\n }\n\n get steps() {\n // when any of the promises are accessed, the stream is consumed\n // so it resolves without needing to consume the stream separately\n this.consumeStream();\n\n return this._steps.promise;\n }\n\n private get finalStep() {\n return this.steps.then(steps => steps[steps.length - 1]);\n }\n\n get content() {\n return this.finalStep.then(step => step.content);\n }\n\n get warnings() {\n return this.finalStep.then(step => step.warnings);\n }\n\n get providerMetadata() {\n return this.finalStep.then(step => step.providerMetadata);\n }\n\n get text() {\n return this.finalStep.then(step => step.text);\n }\n\n get reasoningText() {\n return this.finalStep.then(step => step.reasoningText);\n }\n\n get reasoning() {\n return this.finalStep.then(step => step.reasoning);\n }\n\n get sources() {\n return this.finalStep.then(step => step.sources);\n }\n\n get files() {\n return this.finalStep.then(step => step.files);\n }\n\n get toolCalls() {\n return this.finalStep.then(step => step.toolCalls);\n }\n\n get staticToolCalls() {\n return this.finalStep.then(step => step.staticToolCalls);\n }\n\n get dynamicToolCalls() {\n return this.finalStep.then(step => step.dynamicToolCalls);\n }\n\n get toolResults() {\n return this.finalStep.then(step => step.toolResults);\n }\n\n get staticToolResults() {\n return this.finalStep.then(step => step.staticToolResults);\n }\n\n get dynamicToolResults() {\n return this.finalStep.then(step => step.dynamicToolResults);\n }\n\n get usage() {\n return this.finalStep.then(step => step.usage);\n }\n\n get request() {\n return this.finalStep.then(step => step.request);\n }\n\n get response() {\n return this.finalStep.then(step => step.response);\n }\n\n get totalUsage() {\n // when any of the promises are accessed, the stream is consumed\n // so it resolves without needing to consume the stream separately\n this.consumeStream();\n\n return this._totalUsage.promise;\n }\n\n get finishReason() {\n // when any of the promises are accessed, the stream is consumed\n // so it resolves without needing to consume the stream separately\n this.consumeStream();\n\n return this._finishReason.promise;\n }\n\n /**\nSplit out a new stream from the original stream.\nThe original stream is replaced to allow for further splitting,\nsince we do not know how many times the stream will be split.\n\nNote: this leads to buffering the stream content on the server.\nHowever, the LLM results are expected to be small enough to not cause issues.\n */\n private teeStream() {\n const [stream1, stream2] = this.baseStream.tee();\n this.baseStream = stream2;\n return stream1;\n }\n\n get textStream(): AsyncIterableStream<string> {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream<EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>, string>({\n transform({ part }, controller) {\n if (part.type === 'text-delta') {\n controller.enqueue(part.text);\n }\n },\n }),\n ),\n );\n }\n\n get fullStream(): AsyncIterableStream<TextStreamPart<TOOLS>> {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream<\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>,\n TextStreamPart<TOOLS>\n >({\n transform({ part }, controller) {\n controller.enqueue(part);\n },\n }),\n ),\n );\n }\n\n async consumeStream(options?: ConsumeStreamOptions): Promise<void> {\n try {\n await consumeStream({\n stream: this.fullStream,\n onError: options?.onError,\n });\n } catch (error) {\n options?.onError?.(error);\n }\n }\n\n get experimental_partialOutputStream(): AsyncIterableStream<PARTIAL_OUTPUT> {\n if (this.output == null) {\n throw new NoOutputSpecifiedError();\n }\n\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream<\n EnrichedStreamPart<TOOLS, PARTIAL_OUTPUT>,\n PARTIAL_OUTPUT\n >({\n transform({ partialOutput }, controller) {\n if (partialOutput != null) {\n controller.enqueue(partialOutput);\n }\n },\n }),\n ),\n );\n }\n\n toUIMessageStream<UI_MESSAGE extends UIMessage>({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning = true,\n sendSources = false,\n sendStart = true,\n sendFinish = true,\n onError = getErrorMessage,\n }: UIMessageStreamOptions<UI_MESSAGE> = {}): AsyncIterableStream<\n InferUIMessageChunk<UI_MESSAGE>\n > {\n const responseMessageId =\n generateMessageId != null\n ? getResponseUIMessageId({\n originalMessages,\n responseMessageId: generateMessageId,\n })\n : undefined;\n\n const toolNamesByCallId: Record<string, string> = {};\n\n const isDynamic = (toolCallId: string) => {\n const toolName = toolNamesByCallId[toolCallId];\n const dynamic = this.tools?.[toolName]?.type === 'dynamic';\n return dynamic ? true : undefined; // only send when dynamic to reduce data transfer\n };\n\n const baseStream = this.fullStream.pipeThrough(\n new TransformStream<\n TextStreamPart<TOOLS>,\n UIMessageChunk<\n InferUIMessageMetadata<UI_MESSAGE>,\n InferUIMessageData<UI_MESSAGE>\n >\n >({\n transform: async (part, controller) => {\n const messageMetadataValue = messageMetadata?.({ part });\n\n const partType = part.type;\n switch (partType) {\n case 'text-start': {\n controller.enqueue({\n type: 'text-start',\n id: part.id,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n break;\n }\n\n case 'text-delta': {\n controller.enqueue({\n type: 'text-delta',\n id: part.id,\n delta: part.text,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n break;\n }\n\n case 'text-end': {\n controller.enqueue({\n type: 'text-end',\n id: part.id,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n break;\n }\n\n case 'reasoning-start': {\n controller.enqueue({\n type: 'reasoning-start',\n id: part.id,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n break;\n }\n\n case 'reasoning-delta': {\n if (sendReasoning) {\n controller.enqueue({\n type: 'reasoning-delta',\n id: part.id,\n delta: part.text,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n }\n break;\n }\n\n case 'reasoning-end': {\n controller.enqueue({\n type: 'reasoning-end',\n id: part.id,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n break;\n }\n\n case 'file': {\n controller.enqueue({\n type: 'file',\n mediaType: part.file.mediaType,\n url: `data:${part.file.mediaType};base64,${part.file.base64}`,\n });\n break;\n }\n\n case 'source': {\n if (sendSources && part.sourceType === 'url') {\n controller.enqueue({\n type: 'source-url',\n sourceId: part.id,\n url: part.url,\n title: part.title,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n }\n\n if (sendSources && part.sourceType === 'document') {\n controller.enqueue({\n type: 'source-document',\n sourceId: part.id,\n mediaType: part.mediaType,\n title: part.title,\n filename: part.filename,\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n });\n }\n break;\n }\n\n case 'tool-input-start': {\n toolNamesByCallId[part.id] = part.toolName;\n const dynamic = isDynamic(part.id);\n\n controller.enqueue({\n type: 'tool-input-start',\n toolCallId: part.id,\n toolName: part.toolName,\n ...(part.providerExecuted != null\n ? { providerExecuted: part.providerExecuted }\n : {}),\n ...(dynamic != null ? { dynamic } : {}),\n });\n break;\n }\n\n case 'tool-input-delta': {\n controller.enqueue({\n type: 'tool-input-delta',\n toolCallId: part.id,\n inputTextDelta: part.delta,\n });\n break;\n }\n\n case 'tool-call': {\n toolNamesByCallId[part.toolCallId] = part.toolName;\n const dynamic = isDynamic(part.toolCallId);\n\n if (part.invalid) {\n controller.enqueue({\n type: 'tool-input-error',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...(part.providerExecuted != null\n ? { providerExecuted: part.providerExecuted }\n : {}),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n ...(dynamic != null ? { dynamic } : {}),\n errorText: onError(part.error),\n });\n } else {\n controller.enqueue({\n type: 'tool-input-available',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...(part.providerExecuted != null\n ? { providerExecuted: part.providerExecuted }\n : {}),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : {}),\n ...(dynamic != null ? { dynamic } : {}),\n });\n }\n\n break;\n }\n\n case 'tool-result': {\n const dynamic = isDynamic(part.toolCallId);\n\n controller.enqueue({\n type: 'tool-output-available',\n toolCallId: part.toolCallId,\n output: part.output,\n ...(part.providerExecuted != null\n ? { providerExecuted: part.providerExecuted }\n : {}),\n ...(part.preliminary != null\n ? { preliminary: part.preliminary }\n : {}),\n ...(dynamic != null ? { dynamic } : {}),\n });\n break;\n }\n\n case 'tool-error': {\n const dynamic = isDynamic(part.toolCallId);\n\n controller.enqueue({\n type: 'tool-output-error',\n toolCallId: part.toolCallId,\n errorText: onError(part.error),\n ...(part.providerExecuted != null\n ? { providerExecuted: part.providerExecuted }\n : {}),\n ...(dynamic != null ? { dynamic } : {}),\n });\n break;\n }\n\n case 'error': {\n controller.enqueue({\n type: 'error',\n errorText: onError(part.error),\n });\n break;\n }\n\n case 'start-step': {\n controller.enqueue({ type: 'start-step' });\n break;\n }\n\n case 'finish-step': {\n controller.enqueue({ type: 'finish-step' });\n break;\n }\n\n case 'start': {\n if (sendStart) {\n controller.enqueue({\n type: 'start',\n ...(messageMetadataValue != null\n ? { messageMetadata: messageMetadataValue }\n : {}),\n ...(responseMessageId != null\n ? { messageId: responseMessageId }\n : {}),\n });\n }\n break;\n }\n\n case 'finish': {\n if (sendFinish) {\n controller.enqueue({\n type: 'finish',\n ...(messageMetadataValue != null\n ? { messageMetadata: messageMetadataValue }\n : {}),\n });\n }\n break;\n }\n\n case 'abort': {\n controller.enqueue(part);\n break;\n }\n\n case 'tool-input-end': {\n break;\n }\n\n case 'raw': {\n // Raw chunks are not included in UI message streams\n // as they contain provider-specific data for developer use\n break;\n }\n\n default: {\n const exhaustiveCheck: never = partType;\n throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);\n }\n }\n\n // start and finish events already have metadata\n // so we only need to send metadata for other parts\n if (\n messageMetadataValue != null &&\n partType !== 'start' &&\n partType !== 'finish'\n ) {\n controller.enqueue({\n type: 'message-metadata',\n messageMetadata: messageMetadataValue,\n });\n }\n },\n }),\n );\n\n return createAsyncIterableStream(\n handleUIMessageStreamFinish<UI_MESSAGE>({\n stream: baseStream,\n messageId: responseMessageId ?? generateMessageId?.(),\n originalMessages,\n onFinish,\n onError,\n }),\n );\n }\n\n pipeUIMessageStreamToResponse<UI_MESSAGE extends UIMessage>(\n response: ServerResponse,\n {\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n ...init\n }: UIMessageStreamResponseInit & UIMessageStreamOptions<UI_MESSAGE> = {},\n ) {\n pipeUIMessageStreamToResponse({\n response,\n stream: this.toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n }),\n ...init,\n });\n }\n\n pipeTextStreamToResponse(response: ServerResponse, init?: ResponseInit) {\n pipeTextStreamToResponse({\n response,\n textStream: this.textStream,\n ...init,\n });\n }\n\n toUIMessageStreamResponse<UI_MESSAGE extends UIMessage>({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n ...init\n }: UIMessageStreamResponseInit &\n UIMessageStreamOptions<UI_MESSAGE> = {}): Response {\n return createUIMessageStreamResponse({\n stream: this.toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n }),\n ...init,\n });\n }\n\n toTextStreamResponse(init?: ResponseInit): Response {\n return createTextStreamResponse({\n textStream: this.textStream,\n ...init,\n });\n }\n}\n","export function prepareHeaders(\n headers: HeadersInit | undefined,\n defaultHeaders: Record<string, string>,\n): Headers {\n const responseHeaders = new Headers(headers ?? {});\n\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (!responseHeaders.has(key)) {\n responseHeaders.set(key, value);\n }\n }\n\n return responseHeaders;\n}\n","import { prepareHeaders } from '../util/prepare-headers';\n\nexport function createTextStreamResponse({\n status,\n statusText,\n headers,\n textStream,\n}: ResponseInit & {\n textStream: ReadableStream<string>;\n}): Response {\n return new Response(textStream.pipeThrough(new TextEncoderStream()), {\n status: status ?? 200,\n statusText,\n headers: prepareHeaders(headers, {\n 'content-type': 'text/plain; charset=utf-8',\n }),\n });\n}\n","import { ServerResponse } from 'node:http';\n\n/**\n * Writes the content of a stream to a server response.\n */\nexport function writeToServerResponse({\n response,\n status,\n statusText,\n headers,\n stream,\n}: {\n response: ServerResponse;\n status?: number;\n statusText?: string;\n headers?: Record<string, string | number | string[]>;\n stream: ReadableStream<Uint8Array>;\n}): void {\n response.writeHead(status ?? 200, statusText, headers);\n\n const reader = stream.getReader();\n const read = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n response.write(value);\n }\n } catch (error) {\n throw error;\n } finally {\n response.end();\n }\n };\n\n read();\n}\n","import { ServerResponse } from 'node:http';\nimport { prepareHeaders } from '../util/prepare-headers';\nimport { writeToServerResponse } from '../util/write-to-server-response';\n\nexport function pipeTextStreamToResponse({\n response,\n status,\n statusText,\n headers,\n textStream,\n}: {\n response: ServerResponse;\n textStream: ReadableStream<string>;\n} & ResponseInit): void {\n writeToServerResponse({\n response,\n status,\n statusText,\n headers: Object.fromEntries(\n prepareHeaders(headers, {\n 'content-type': 'text/plain; charset=utf-8',\n }).entries(),\n ),\n stream: textStream.pipeThrough(new TextEncoderStream()),\n });\n}\n","export class JsonToSseTransformStream extends TransformStream<unknown, string> {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\\n\\n`);\n },\n flush(controller) {\n controller.enqueue('data: [DONE]\\n\\n');\n },\n });\n }\n}\n","export const UI_MESSAGE_STREAM_HEADERS = {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n connection: 'keep-alive',\n 'x-vercel-ai-ui-message-stream': 'v1',\n 'x-accel-buffering': 'no', // disable nginx buffering\n};\n","import { prepareHeaders } from '../util/prepare-headers';\nimport { JsonToSseTransformStream } from './json-to-sse-transform-stream';\nimport { UI_MESSAGE_STREAM_HEADERS } from './ui-message-stream-headers';\nimport { UIMessageChunk } from './ui-message-chunks';\nimport { UIMessageStreamResponseInit } from './ui-message-stream-response-init';\n\nexport function createUIMessageStreamResponse({\n status,\n statusText,\n headers,\n stream,\n consumeSseStream,\n}: UIMessageStreamResponseInit & {\n stream: ReadableStream<UIMessageChunk>;\n}): Response {\n let sseStream = stream.pipeThrough(new JsonToSseTransformStream());\n\n // when the consumeSseStream is provided, we need to tee the stream\n // and send the second part to the consumeSseStream function\n // so that it can be consumed by the client independently\n if (consumeSseStream) {\n const [stream1, stream2] = sseStream.tee();\n sseStream = stream1;\n consumeSseStream({ stream: stream2 }); // no await (do not block the response)\n }\n\n return new Response(sseStream.pipeThrough(new TextEncoderStream()), {\n status,\n statusText,\n headers: prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS),\n });\n}\n","import { IdGenerator } from '@ai-sdk/provider-utils';\nimport { UIMessage } from '../ui/ui-messages';\n\nexport function getResponseUIMessageId({\n originalMessages,\n responseMessageId,\n}: {\n originalMessages: UIMessage[] | undefined;\n responseMessageId: string | IdGenerator;\n}) {\n // when there are no original messages (i.e. no persistence),\n // the assistant message id generation is handled on the client side.\n if (originalMessages == null) {\n return undefined;\n }\n\n const lastMessage = originalMessages[originalMessages.length - 1];\n\n return lastMessage?.role === 'assistant'\n ? lastMessage.id\n : typeof responseMessageId === 'function'\n ? responseMessageId()\n : responseMessageId;\n}\n","import {\n StandardSchemaV1,\n validateTypes,\n Validator,\n} from '@ai-sdk/provider-utils';\nimport { ProviderMetadata } from '../types';\nimport {\n DataUIMessageChunk,\n InferUIMessageChunk,\n isDataUIMessageChunk,\n UIMessageChunk,\n} from '../ui-message-stream/ui-message-chunks';\nimport { ErrorHandler } from '../util/error-handler';\nimport { mergeObjects } from '../util/merge-objects';\nimport { parsePartialJson } from '../util/parse-partial-json';\nimport { UIDataTypesToSchemas } from './chat';\nimport {\n DataUIPart,\n DynamicToolUIPart,\n getToolName,\n InferUIMessageData,\n InferUIMessageMetadata,\n InferUIMessageToolCall,\n InferUIMessageTools,\n isToolUIPart,\n ReasoningUIPart,\n TextUIPart,\n ToolUIPart,\n UIMessage,\n UIMessagePart,\n} from './ui-messages';\n\nexport type StreamingUIMessageState<UI_MESSAGE extends UIMessage> = {\n message: UI_MESSAGE;\n activeTextParts: Record<string, TextUIPart>;\n activeReasoningParts: Record<string, ReasoningUIPart>;\n partialToolCalls: Record<\n string,\n { text: string; index: number; toolName: string; dynamic?: boolean }\n >;\n};\n\nexport function createStreamingUIMessageState<UI_MESSAGE extends UIMessage>({\n lastMessage,\n messageId,\n}: {\n lastMessage: UI_MESSAGE | undefined;\n messageId: string;\n}): StreamingUIMessageState<UI_MESSAGE> {\n return {\n message:\n lastMessage?.role === 'assistant'\n ? lastMessage\n : ({\n id: messageId,\n metadata: undefined,\n role: 'assistant',\n parts: [] as UIMessagePart<\n InferUIMessageData<UI_MESSAGE>,\n InferUIMessageTools<UI_MESSAGE>\n >[],\n } as UI_MESSAGE),\n activeTextParts: {},\n activeReasoningParts: {},\n partialToolCalls: {},\n };\n}\n\nexport function processUIMessageStream<UI_MESSAGE extends UIMessage>({\n stream,\n messageMetadataSchema,\n dataPartSchemas,\n runUpdateMessageJob,\n onError,\n onToolCall,\n onData,\n}: {\n // input stream is not fully typed yet:\n stream: ReadableStream<UIMessageChunk>;\n messageMetadataSchema?:\n | Validator<InferUIMessageMetadata<UI_MESSAGE>>\n | StandardSchemaV1<InferUIMessageMetadata<UI_MESSAGE>>;\n dataPartSchemas?: UIDataTypesToSchemas<InferUIMessageData<UI_MESSAGE>>;\n onToolCall?: (options: {\n toolCall: InferUIMessageToolCall<UI_MESSAGE>;\n }) => void | PromiseLike<void>;\n onData?: (dataPart: DataUIPart<InferUIMessageData<UI_MESSAGE>>) => void;\n runUpdateMessageJob: (\n job: (options: {\n state: StreamingUIMessageState<UI_MESSAGE>;\n write: () => void;\n }) => Promise<void>,\n ) => Promise<void>;\n onError: ErrorHandler;\n}): ReadableStream<InferUIMessageChunk<UI_MESSAGE>> {\n return stream.pipeThrough(\n new TransformStream<UIMessageChunk, InferUIMessageChunk<UI_MESSAGE>>({\n async transform(chunk, controller) {\n await runUpdateMessageJob(async ({ state, write }) => {\n function getToolInvocation(toolCallId: string) {\n const toolInvocations = state.message.parts.filter(isToolUIPart);\n\n const toolInvocation = toolInvocations.find(\n invocation => invocation.toolCallId === toolCallId,\n );\n\n if (toolInvocation == null) {\n throw new Error(\n 'tool-output-error must be preceded by a tool-input-available',\n );\n }\n\n return toolInvocation;\n }\n\n function getDynamicToolInvocation(toolCallId: string) {\n const toolInvocations = state.message.parts.filter(\n part => part.type === 'dynamic-tool',\n ) as DynamicToolUIPart[];\n\n const toolInvocation = toolInvocations.find(\n invocation => invocation.toolCallId === toolCallId,\n );\n\n if (toolInvocation == null) {\n throw new Error(\n 'tool-output-error must be preceded by a tool-input-available',\n );\n }\n\n return toolInvocation;\n }\n\n function updateToolPart(\n options: {\n toolName: keyof InferUIMessageTools<UI_MESSAGE> & string;\n toolCallId: string;\n providerExecuted?: boolean;\n } & (\n | {\n state: 'input-streaming';\n input: unknown;\n providerExecuted?: boolean;\n }\n | {\n state: 'input-available';\n input: unknown;\n providerExecuted?: boolean;\n providerMetadata?: ProviderMetadata;\n }\n | {\n state: 'output-available';\n input: unknown;\n output: unknown;\n providerExecuted?: boolean;\n preliminary?: boolean;\n }\n | {\n state: 'output-error';\n input: unknown;\n rawInput?: unknown;\n errorText: string;\n providerExecuted?: boolean;\n providerMetadata?: ProviderMetadata;\n }\n ),\n ) {\n const part = state.message.parts.find(\n part =>\n isToolUIPart(part) && part.toolCallId === options.toolCallId,\n ) as ToolUIPart<InferUIMessageTools<UI_MESSAGE>> | undefined;\n\n const anyOptions = options as any;\n const anyPart = part as any;\n\n if (part != null) {\n part.state = options.state;\n anyPart.input = anyOptions.input;\n anyPart.output = anyOptions.output;\n anyPart.errorText = anyOptions.errorText;\n anyPart.rawInput = anyOptions.rawInput;\n anyPart.preliminary = anyOptions.preliminary;\n\n // once providerExecuted is set, it stays for streaming\n anyPart.providerExecuted =\n anyOptions.providerExecuted ?? part.providerExecuted;\n\n if (\n anyOptions.providerMetadata != null &&\n part.state === 'input-available'\n ) {\n part.callProviderMetadata = anyOptions.providerMetadata;\n }\n } else {\n state.message.parts.push({\n type: `tool-${options.toolName}`,\n toolCallId: options.toolCallId,\n state: options.state,\n input: anyOptions.input,\n output: anyOptions.output,\n rawInput: anyOptions.rawInput,\n errorText: anyOptions.errorText,\n providerExecuted: anyOptions.providerExecuted,\n preliminary: anyOptions.preliminary,\n ...(anyOptions.providerMetadata != null\n ? { callProviderMetadata: anyOptions.providerMetadata }\n : {}),\n } as ToolUIPart<InferUIMessageTools<UI_MESSAGE>>);\n }\n }\n\n function updateDynamicToolPart(\n options: {\n toolName: keyof InferUIMessageTools<UI_MESSAGE> & string;\n toolCallId: string;\n providerExecuted?: boolean;\n } & (\n | {\n state: 'input-streaming';\n input: unknown;\n }\n | {\n state: 'input-available';\n input: unknown;\n providerMetadata?: ProviderMetadata;\n }\n | {\n state: 'output-available';\n input: unknown;\n output: unknown;\n preliminary: boolean | undefined;\n }\n | {\n state: 'output-error';\n input: unknown;\n errorText: string;\n providerMetadata?: ProviderMetadata;\n }\n ),\n ) {\n const part = state.message.parts.find(\n part =>\n part.type === 'dynamic-tool' &&\n part.toolCallId === options.toolCallId,\n ) as DynamicToolUIPart | undefined;\n\n const anyOptions = options as any;\n const anyPart = part as any;\n\n if (part != null) {\n part.state = options.state;\n anyPart.toolName = options.toolName;\n anyPart.input = anyOptions.input;\n anyPart.output = anyOptions.output;\n anyPart.errorText = anyOptions.errorText;\n anyPart.rawInput = anyOptions.rawInput ?? anyPart.rawInput;\n anyPart.preliminary = anyOptions.preliminary;\n\n if (\n anyOptions.providerMetadata != null &&\n part.state === 'input-available'\n ) {\n part.callProviderMetadata = anyOptions.providerMetadata;\n }\n } else {\n state.message.parts.push({\n type: 'dynamic-tool',\n toolName: options.toolName,\n toolCallId: options.toolCallId,\n state: options.state,\n input: anyOptions.input,\n output: anyOptions.output,\n errorText: anyOptions.errorText,\n preliminary: anyOptions.preliminary,\n ...(anyOptions.providerMetadata != null\n ? { callProviderMetadata: anyOptions.providerMetadata }\n : {}),\n } as DynamicToolUIPart);\n }\n }\n\n async function updateMessageMetadata(metadata: unknown) {\n if (metadata != null) {\n const mergedMetadata =\n state.message.metadata != null\n ? mergeObjects(state.message.metadata, metadata)\n : metadata;\n\n if (messageMetadataSchema != null) {\n await validateTypes({\n value: mergedMetadata,\n schema: messageMetadataSchema,\n });\n }\n\n state.message.metadata =\n mergedMetadata as InferUIMessageMetadata<UI_MESSAGE>;\n }\n }\n\n switch (chunk.type) {\n case 'text-start': {\n const textPart: TextUIPart = {\n type: 'text',\n text: '',\n providerMetadata: chunk.providerMetadata,\n state: 'streaming',\n };\n state.activeTextParts[chunk.id] = textPart;\n state.message.parts.push(textPart);\n write();\n break;\n }\n\n case 'text-delta': {\n const textPart = state.activeTextParts[chunk.id];\n textPart.text += chunk.delta;\n textPart.providerMetadata =\n chunk.providerMetadata ?? textPart.providerMetadata;\n write();\n break;\n }\n\n case 'text-end': {\n const textPart = state.activeTextParts[chunk.id];\n textPart.state = 'done';\n textPart.providerMetadata =\n chunk.providerMetadata ?? textPart.providerMetadata;\n delete state.activeTextParts[chunk.id];\n write();\n break;\n }\n\n case 'reasoning-start': {\n const reasoningPart: ReasoningUIPart = {\n type: 'reasoning',\n text: '',\n providerMetadata: chunk.providerMetadata,\n state: 'streaming',\n };\n state.activeReasoningParts[chunk.id] = reasoningPart;\n state.message.parts.push(reasoningPart);\n write();\n break;\n }\n\n case 'reasoning-delta': {\n const reasoningPart = state.activeReasoningParts[chunk.id];\n reasoningPart.text += chunk.delta;\n reasoningPart.providerMetadata =\n chunk.providerMetadata ?? reasoningPart.providerMetadata;\n write();\n break;\n }\n\n case 'reasoning-end': {\n const reasoningPart = state.activeReasoningParts[chunk.id];\n reasoningPart.providerMetadata =\n chunk.providerMetadata ?? reasoningPart.providerMetadata;\n reasoningPart.state = 'done';\n delete state.activeReasoningParts[chunk.id];\n\n write();\n break;\n }\n\n case 'file': {\n state.message.parts.push({\n type: 'file',\n mediaType: chunk.mediaType,\n url: chunk.url,\n });\n\n write();\n break;\n }\n\n case 'source-url': {\n state.message.parts.push({\n type: 'source-url',\n sourceId: chunk.sourceId,\n url: chunk.url,\n title: chunk.title,\n providerMetadata: chunk.providerMetadata,\n });\n\n write();\n break;\n }\n\n case 'source-document': {\n state.message.parts.push({\n type: 'source-document',\n sourceId: chunk.sourceId,\n mediaType: chunk.mediaType,\n title: chunk.title,\n filename: chunk.filename,\n providerMetadata: chunk.providerMetadata,\n });\n\n write();\n break;\n }\n\n case 'tool-input-start': {\n const toolInvocations = state.message.parts.filter(isToolUIPart);\n\n // add the partial tool call to the map\n state.partialToolCalls[chunk.toolCallId] = {\n text: '',\n toolName: chunk.toolName,\n index: toolInvocations.length,\n dynamic: chunk.dynamic,\n };\n\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: 'input-streaming',\n input: undefined,\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: 'input-streaming',\n input: undefined,\n providerExecuted: chunk.providerExecuted,\n });\n }\n\n write();\n break;\n }\n\n case 'tool-input-delta': {\n const partialToolCall = state.partialToolCalls[chunk.toolCallId];\n\n partialToolCall.text += chunk.inputTextDelta;\n\n const { value: partialArgs } = await parsePartialJson(\n partialToolCall.text,\n );\n\n if (partialToolCall.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: partialToolCall.toolName,\n state: 'input-streaming',\n input: partialArgs,\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: partialToolCall.toolName,\n state: 'input-streaming',\n input: partialArgs,\n });\n }\n\n write();\n break;\n }\n\n case 'tool-input-available': {\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: 'input-available',\n input: chunk.input,\n providerMetadata: chunk.providerMetadata,\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: 'input-available',\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n });\n }\n\n write();\n\n // invoke the onToolCall callback if it exists. This is blocking.\n // In the future we should make this non-blocking, which\n // requires additional state management for error handling etc.\n // Skip calling onToolCall for provider-executed tools since they are already executed\n if (onToolCall && !chunk.providerExecuted) {\n await onToolCall({\n toolCall: chunk as InferUIMessageToolCall<UI_MESSAGE>,\n });\n }\n break;\n }\n\n case 'tool-input-error': {\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: 'output-error',\n input: chunk.input,\n errorText: chunk.errorText,\n providerMetadata: chunk.providerMetadata,\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: 'output-error',\n input: undefined,\n rawInput: chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n });\n }\n\n write();\n break;\n }\n\n case 'tool-output-available': {\n if (chunk.dynamic) {\n const toolInvocation = getDynamicToolInvocation(\n chunk.toolCallId,\n );\n\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: toolInvocation.toolName,\n state: 'output-available',\n input: (toolInvocation as any).input,\n output: chunk.output,\n preliminary: chunk.preliminary,\n });\n } else {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: getToolName(toolInvocation),\n state: 'output-available',\n input: (toolInvocation as any).input,\n output: chunk.output,\n providerExecuted: chunk.providerExecuted,\n preliminary: chunk.preliminary,\n });\n }\n\n write();\n break;\n }\n\n case 'tool-output-error': {\n if (chunk.dynamic) {\n const toolInvocation = getDynamicToolInvocation(\n chunk.toolCallId,\n );\n\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: toolInvocation.toolName,\n state: 'output-error',\n input: (toolInvocation as any).input,\n errorText: chunk.errorText,\n });\n } else {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: getToolName(toolInvocation),\n state: 'output-error',\n input: (toolInvocation as any).input,\n rawInput: (toolInvocation as any).rawInput,\n errorText: chunk.errorText,\n });\n }\n\n write();\n break;\n }\n\n case 'start-step': {\n // add a step boundary part to the message\n state.message.parts.push({ type: 'step-start' });\n break;\n }\n\n case 'finish-step': {\n // reset the current text and reasoning parts\n state.activeTextParts = {};\n state.activeReasoningParts = {};\n break;\n }\n\n case 'start': {\n if (chunk.messageId != null) {\n state.message.id = chunk.messageId;\n }\n\n await updateMessageMetadata(chunk.messageMetadata);\n\n if (chunk.messageId != null || chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n\n case 'finish': {\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n\n case 'message-metadata': {\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n\n case 'error': {\n onError?.(new Error(chunk.errorText));\n break;\n }\n\n default: {\n if (isDataUIMessageChunk(chunk)) {\n // validate data chunk if dataPartSchemas is provided\n if (dataPartSchemas?.[chunk.type] != null) {\n await validateTypes({\n value: chunk.data,\n schema: dataPartSchemas[chunk.type],\n });\n }\n\n // cast, validation is done above\n const dataChunk = chunk as DataUIMessageChunk<\n InferUIMessageData<UI_MESSAGE>\n >;\n\n // transient parts are not added to the message state\n if (dataChunk.transient) {\n onData?.(dataChunk);\n break;\n }\n\n const existingUIPart =\n dataChunk.id != null\n ? (state.message.parts.find(\n chunkArg =>\n dataChunk.type === chunkArg.type &&\n dataChunk.id === chunkArg.id,\n ) as\n | DataUIPart<InferUIMessageData<UI_MESSAGE>>\n | undefined)\n : undefined;\n\n if (existingUIPart != null) {\n existingUIPart.data = dataChunk.data;\n } else {\n state.message.parts.push(dataChunk);\n }\n\n onData?.(dataChunk);\n\n write();\n }\n }\n }\n\n controller.enqueue(chunk as InferUIMessageChunk<UI_MESSAGE>);\n });\n },\n }),\n );\n}\n","import { z } from 'zod/v4';\nimport {\n ProviderMetadata,\n providerMetadataSchema,\n} from '../types/provider-metadata';\nimport {\n InferUIMessageData,\n InferUIMessageMetadata,\n UIDataTypes,\n UIMessage,\n} from '../ui/ui-messages';\nimport { ValueOf } from '../util/value-of';\n\nexport const uiMessageChunkSchema = z.union([\n z.strictObject({\n type: z.literal('text-start'),\n id: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('text-delta'),\n id: z.string(),\n delta: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('text-end'),\n id: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('error'),\n errorText: z.string(),\n }),\n z.strictObject({\n type: z.literal('tool-input-start'),\n toolCallId: z.string(),\n toolName: z.string(),\n providerExecuted: z.boolean().optional(),\n dynamic: z.boolean().optional(),\n }),\n z.strictObject({\n type: z.literal('tool-input-delta'),\n toolCallId: z.string(),\n inputTextDelta: z.string(),\n }),\n z.strictObject({\n type: z.literal('tool-input-available'),\n toolCallId: z.string(),\n toolName: z.string(),\n input: z.unknown(),\n providerExecuted: z.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n dynamic: z.boolean().optional(),\n }),\n z.strictObject({\n type: z.literal('tool-input-error'),\n toolCallId: z.string(),\n toolName: z.string(),\n input: z.unknown(),\n providerExecuted: z.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n dynamic: z.boolean().optional(),\n errorText: z.string(),\n }),\n z.strictObject({\n type: z.literal('tool-output-available'),\n toolCallId: z.string(),\n output: z.unknown(),\n providerExecuted: z.boolean().optional(),\n dynamic: z.boolean().optional(),\n preliminary: z.boolean().optional(),\n }),\n z.strictObject({\n type: z.literal('tool-output-error'),\n toolCallId: z.string(),\n errorText: z.string(),\n providerExecuted: z.boolean().optional(),\n dynamic: z.boolean().optional(),\n }),\n z.strictObject({\n type: z.literal('reasoning'),\n text: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('reasoning-start'),\n id: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('reasoning-delta'),\n id: z.string(),\n delta: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('reasoning-end'),\n id: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('reasoning-part-finish'),\n }),\n z.strictObject({\n type: z.literal('source-url'),\n sourceId: z.string(),\n url: z.string(),\n title: z.string().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('source-document'),\n sourceId: z.string(),\n mediaType: z.string(),\n title: z.string(),\n filename: z.string().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.literal('file'),\n url: z.string(),\n mediaType: z.string(),\n providerMetadata: providerMetadataSchema.optional(),\n }),\n z.strictObject({\n type: z.string().startsWith('data-'),\n id: z.string().optional(),\n data: z.unknown(),\n transient: z.boolean().optional(),\n }),\n z.strictObject({\n type: z.literal('start-step'),\n }),\n z.strictObject({\n type: z.literal('finish-step'),\n }),\n z.strictObject({\n type: z.literal('start'),\n messageId: z.string().optional(),\n messageMetadata: z.unknown().optional(),\n }),\n z.strictObject({\n type: z.literal('finish'),\n messageMetadata: z.unknown().optional(),\n }),\n z.strictObject({\n type: z.literal('abort'),\n }),\n z.strictObject({\n type: z.literal('message-metadata'),\n messageMetadata: z.unknown(),\n }),\n]);\n\nexport type DataUIMessageChunk<DATA_TYPES extends UIDataTypes> = ValueOf<{\n [NAME in keyof DATA_TYPES & string]: {\n type: `data-${NAME}`;\n id?: string;\n data: DATA_TYPES[NAME];\n transient?: boolean;\n };\n}>;\n\nexport type UIMessageChunk<\n METADATA = unknown,\n DATA_TYPES extends UIDataTypes = UIDataTypes,\n> =\n | {\n type: 'text-start';\n id: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'text-delta';\n delta: string;\n id: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'text-end';\n id: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'reasoning-start';\n id: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'reasoning-delta';\n id: string;\n delta: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'reasoning-end';\n id: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'error';\n errorText: string;\n }\n | {\n type: 'tool-input-available';\n toolCallId: string;\n toolName: string;\n input: unknown;\n providerExecuted?: boolean;\n providerMetadata?: ProviderMetadata;\n dynamic?: boolean;\n }\n | {\n type: 'tool-input-error';\n toolCallId: string;\n toolName: string;\n input: unknown;\n providerExecuted?: boolean;\n providerMetadata?: ProviderMetadata;\n dynamic?: boolean;\n errorText: string;\n }\n | {\n type: 'tool-output-available';\n toolCallId: string;\n output: unknown;\n providerExecuted?: boolean;\n dynamic?: boolean;\n preliminary?: boolean;\n }\n | {\n type: 'tool-output-error';\n toolCallId: string;\n errorText: string;\n providerExecuted?: boolean;\n dynamic?: boolean;\n }\n | {\n type: 'tool-input-start';\n toolCallId: string;\n toolName: string;\n providerExecuted?: boolean;\n dynamic?: boolean;\n }\n | {\n type: 'tool-input-delta';\n toolCallId: string;\n inputTextDelta: string;\n }\n | {\n type: 'source-url';\n sourceId: string;\n url: string;\n title?: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'source-document';\n sourceId: string;\n mediaType: string;\n title: string;\n filename?: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'file';\n url: string;\n mediaType: string;\n }\n | DataUIMessageChunk<DATA_TYPES>\n | {\n type: 'start-step';\n }\n | {\n type: 'finish-step';\n }\n | {\n type: 'start';\n messageId?: string;\n messageMetadata?: METADATA;\n }\n | {\n type: 'finish';\n messageMetadata?: METADATA;\n }\n | {\n type: 'abort';\n }\n | {\n type: 'message-metadata';\n messageMetadata: METADATA;\n };\n\nexport function isDataUIMessageChunk(\n chunk: UIMessageChunk,\n): chunk is DataUIMessageChunk<UIDataTypes> {\n return chunk.type.startsWith('data-');\n}\n\nexport type InferUIMessageChunk<T extends UIMessage> = UIMessageChunk<\n InferUIMessageMetadata<T>,\n InferUIMessageData<T>\n>;\n","/**\n * Deeply merges two objects together.\n * - Properties from the `overrides` object override those in the `base` object with the same key.\n * - For nested objects, the merge is performed recursively (deep merge).\n * - Arrays are replaced, not merged.\n * - Primitive values are replaced.\n * - If both `base` and `overrides` are undefined, returns undefined.\n * - If one of `base` or `overrides` is undefined, returns the other.\n *\n * @param base The target object to merge into\n * @param overrides The source object to merge from\n * @returns A new object with the merged properties, or undefined if both inputs are undefined\n */\nexport function mergeObjects<T extends object, U extends object>(\n base: T | undefined,\n overrides: U | undefined,\n): (T & U) | T | U | undefined {\n // If both inputs are undefined, return undefined\n if (base === undefined && overrides === undefined) {\n return undefined;\n }\n\n // If target is undefined, return source\n if (base === undefined) {\n return overrides;\n }\n\n // If source is undefined, return target\n if (overrides === undefined) {\n return base;\n }\n\n // Create a new object to avoid mutating the inputs\n const result = { ...base } as T & U;\n\n // Iterate through all keys in the source object\n for (const key in overrides) {\n if (Object.prototype.hasOwnProperty.call(overrides, key)) {\n const overridesValue = overrides[key];\n\n // Skip if the overrides value is undefined\n if (overridesValue === undefined) continue;\n\n // Get the base value if it exists\n const baseValue =\n key in base ? base[key as unknown as keyof T] : undefined;\n\n // Check if both values are objects that can be deeply merged\n const isSourceObject =\n overridesValue !== null &&\n typeof overridesValue === 'object' &&\n !Array.isArray(overridesValue) &&\n !(overridesValue instanceof Date) &&\n !(overridesValue instanceof RegExp);\n\n const isTargetObject =\n baseValue !== null &&\n baseValue !== undefined &&\n typeof baseValue === 'object' &&\n !Array.isArray(baseValue) &&\n !(baseValue instanceof Date) &&\n !(baseValue instanceof RegExp);\n\n // If both values are mergeable objects, merge them recursively\n if (isSourceObject && isTargetObject) {\n result[key as keyof (T & U)] = mergeObjects(\n baseValue as object,\n overridesValue as object,\n ) as any;\n } else {\n // For primitives, arrays, or when one value is not a mergeable object,\n // simply override with the source value\n result[key as keyof (T & U)] = overridesValue as any;\n }\n }\n }\n\n return result;\n}\n","import { JSONValue } from '@ai-sdk/provider';\nimport { safeParseJSON } from '@ai-sdk/provider-utils';\nimport { fixJson } from './fix-json';\n\nexport async function parsePartialJson(jsonText: string | undefined): Promise<{\n value: JSONValue | undefined;\n state:\n | 'undefined-input'\n | 'successful-parse'\n | 'repaired-parse'\n | 'failed-parse';\n}> {\n if (jsonText === undefined) {\n return { value: undefined, state: 'undefined-input' };\n }\n\n let result = await safeParseJSON({ text: jsonText });\n\n if (result.success) {\n return { value: result.value, state: 'successful-parse' };\n }\n\n result = await safeParseJSON({ text: fixJson(jsonText) });\n\n if (result.success) {\n return { value: result.value, state: 'repaired-parse' };\n }\n\n return { value: undefined, state: 'failed-parse' };\n}\n","type State =\n | 'ROOT'\n | 'FINISH'\n | 'INSIDE_STRING'\n | 'INSIDE_STRING_ESCAPE'\n | 'INSIDE_LITERAL'\n | 'INSIDE_NUMBER'\n | 'INSIDE_OBJECT_START'\n | 'INSIDE_OBJECT_KEY'\n | 'INSIDE_OBJECT_AFTER_KEY'\n | 'INSIDE_OBJECT_BEFORE_VALUE'\n | 'INSIDE_OBJECT_AFTER_VALUE'\n | 'INSIDE_OBJECT_AFTER_COMMA'\n | 'INSIDE_ARRAY_START'\n | 'INSIDE_ARRAY_AFTER_VALUE'\n | 'INSIDE_ARRAY_AFTER_COMMA';\n\n// Implemented as a scanner with additional fixing\n// that performs a single linear time scan pass over the partial JSON.\n//\n// The states should ideally match relevant states from the JSON spec:\n// https://www.json.org/json-en.html\n//\n// Please note that invalid JSON is not considered/covered, because it\n// is assumed that the resulting JSON will be processed by a standard\n// JSON parser that will detect any invalid JSON.\nexport function fixJson(input: string): string {\n const stack: State[] = ['ROOT'];\n let lastValidIndex = -1;\n let literalStart: number | null = null;\n\n function processValueStart(char: string, i: number, swapState: State) {\n {\n switch (char) {\n case '\"': {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push('INSIDE_STRING');\n break;\n }\n\n case 'f':\n case 't':\n case 'n': {\n lastValidIndex = i;\n literalStart = i;\n stack.pop();\n stack.push(swapState);\n stack.push('INSIDE_LITERAL');\n break;\n }\n\n case '-': {\n stack.pop();\n stack.push(swapState);\n stack.push('INSIDE_NUMBER');\n break;\n }\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push('INSIDE_NUMBER');\n break;\n }\n\n case '{': {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push('INSIDE_OBJECT_START');\n break;\n }\n\n case '[': {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push('INSIDE_ARRAY_START');\n break;\n }\n }\n }\n }\n\n function processAfterObjectValue(char: string, i: number) {\n switch (char) {\n case ',': {\n stack.pop();\n stack.push('INSIDE_OBJECT_AFTER_COMMA');\n break;\n }\n case '}': {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n }\n\n function processAfterArrayValue(char: string, i: number) {\n switch (char) {\n case ',': {\n stack.pop();\n stack.push('INSIDE_ARRAY_AFTER_COMMA');\n break;\n }\n case ']': {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n }\n\n for (let i = 0; i < input.length; i++) {\n const char = input[i];\n const currentState = stack[stack.length - 1];\n\n switch (currentState) {\n case 'ROOT':\n processValueStart(char, i, 'FINISH');\n break;\n\n case 'INSIDE_OBJECT_START': {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push('INSIDE_OBJECT_KEY');\n break;\n }\n case '}': {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n break;\n }\n\n case 'INSIDE_OBJECT_AFTER_COMMA': {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push('INSIDE_OBJECT_KEY');\n break;\n }\n }\n break;\n }\n\n case 'INSIDE_OBJECT_KEY': {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push('INSIDE_OBJECT_AFTER_KEY');\n break;\n }\n }\n break;\n }\n\n case 'INSIDE_OBJECT_AFTER_KEY': {\n switch (char) {\n case ':': {\n stack.pop();\n stack.push('INSIDE_OBJECT_BEFORE_VALUE');\n\n break;\n }\n }\n break;\n }\n\n case 'INSIDE_OBJECT_BEFORE_VALUE': {\n processValueStart(char, i, 'INSIDE_OBJECT_AFTER_VALUE');\n break;\n }\n\n case 'INSIDE_OBJECT_AFTER_VALUE': {\n processAfterObjectValue(char, i);\n break;\n }\n\n case 'INSIDE_STRING': {\n switch (char) {\n case '\"': {\n stack.pop();\n lastValidIndex = i;\n break;\n }\n\n case '\\\\': {\n stack.push('INSIDE_STRING_ESCAPE');\n break;\n }\n\n default: {\n lastValidIndex = i;\n }\n }\n\n break;\n }\n\n case 'INSIDE_ARRAY_START': {\n switch (char) {\n case ']': {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n\n default: {\n lastValidIndex = i;\n processValueStart(char, i, 'INSIDE_ARRAY_AFTER_VALUE');\n break;\n }\n }\n break;\n }\n\n case 'INSIDE_ARRAY_AFTER_VALUE': {\n switch (char) {\n case ',': {\n stack.pop();\n stack.push('INSIDE_ARRAY_AFTER_COMMA');\n break;\n }\n\n case ']': {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n\n default: {\n lastValidIndex = i;\n break;\n }\n }\n\n break;\n }\n\n case 'INSIDE_ARRAY_AFTER_COMMA': {\n processValueStart(char, i, 'INSIDE_ARRAY_AFTER_VALUE');\n break;\n }\n\n case 'INSIDE_STRING_ESCAPE': {\n stack.pop();\n lastValidIndex = i;\n\n break;\n }\n\n case 'INSIDE_NUMBER': {\n switch (char) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n lastValidIndex = i;\n break;\n }\n\n case 'e':\n case 'E':\n case '-':\n case '.': {\n break;\n }\n\n case ',': {\n stack.pop();\n\n if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i);\n }\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i);\n }\n\n break;\n }\n\n case '}': {\n stack.pop();\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i);\n }\n\n break;\n }\n\n case ']': {\n stack.pop();\n\n if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i);\n }\n\n break;\n }\n\n default: {\n stack.pop();\n break;\n }\n }\n\n break;\n }\n\n case 'INSIDE_LITERAL': {\n const partialLiteral = input.substring(literalStart!, i + 1);\n\n if (\n !'false'.startsWith(partialLiteral) &&\n !'true'.startsWith(partialLiteral) &&\n !'null'.startsWith(partialLiteral)\n ) {\n stack.pop();\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i);\n } else if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i);\n }\n } else {\n lastValidIndex = i;\n }\n\n break;\n }\n }\n }\n\n let result = input.slice(0, lastValidIndex + 1);\n\n for (let i = stack.length - 1; i >= 0; i--) {\n const state = stack[i];\n\n switch (state) {\n case 'INSIDE_STRING': {\n result += '\"';\n break;\n }\n\n case 'INSIDE_OBJECT_KEY':\n case 'INSIDE_OBJECT_AFTER_KEY':\n case 'INSIDE_OBJECT_AFTER_COMMA':\n case 'INSIDE_OBJECT_START':\n case 'INSIDE_OBJECT_BEFORE_VALUE':\n case 'INSIDE_OBJECT_AFTER_VALUE': {\n result += '}';\n break;\n }\n\n case 'INSIDE_ARRAY_START':\n case 'INSIDE_ARRAY_AFTER_COMMA':\n case 'INSIDE_ARRAY_AFTER_VALUE': {\n result += ']';\n break;\n }\n\n case 'INSIDE_LITERAL': {\n const partialLiteral = input.substring(literalStart!, input.length);\n\n if ('true'.startsWith(partialLiteral)) {\n result += 'true'.slice(partialLiteral.length);\n } else if ('false'.startsWith(partialLiteral)) {\n result += 'false'.slice(partialLiteral.length);\n } else if ('null'.startsWith(partialLiteral)) {\n result += 'null'.slice(partialLiteral.length);\n }\n }\n }\n }\n\n return result;\n}\n","import {\n InferToolInput,\n InferToolOutput,\n Tool,\n ToolCall,\n} from '@ai-sdk/provider-utils';\nimport { ToolSet } from '../generate-text';\nimport { ProviderMetadata } from '../types/provider-metadata';\nimport { DeepPartial } from '../util/deep-partial';\nimport { ValueOf } from '../util/value-of';\n\n/**\nThe data types that can be used in the UI message for the UI message data parts.\n */\nexport type UIDataTypes = Record<string, unknown>;\n\nexport type UITool = {\n input: unknown;\n output: unknown | undefined;\n};\n\n/**\n * Infer the input and output types of a tool so it can be used as a UI tool.\n */\nexport type InferUITool<TOOL extends Tool> = {\n input: InferToolInput<TOOL>;\n output: InferToolOutput<TOOL>;\n};\n\n/**\n * Infer the input and output types of a tool set so it can be used as a UI tool set.\n */\nexport type InferUITools<TOOLS extends ToolSet> = {\n [NAME in keyof TOOLS & string]: InferUITool<TOOLS[NAME]>;\n};\n\nexport type UITools = Record<string, UITool>;\n\n/**\nAI SDK UI Messages. They are used in the client and to communicate between the frontend and the API routes.\n */\nexport interface UIMessage<\n METADATA = unknown,\n DATA_PARTS extends UIDataTypes = UIDataTypes,\n TOOLS extends UITools = UITools,\n> {\n /**\nA unique identifier for the message.\n */\n id: string;\n\n /**\nThe role of the message.\n */\n role: 'system' | 'user' | 'assistant';\n\n /**\nThe metadata of the message.\n */\n metadata?: METADATA;\n\n /**\nThe parts of the message. Use this for rendering the message in the UI.\n\nSystem messages should be avoided (set the system prompt on the server instead).\nThey can have text parts.\n\nUser messages can have text parts and file parts.\n\nAssistant messages can have text, reasoning, tool invocation, and file parts.\n */\n parts: Array<UIMessagePart<DATA_PARTS, TOOLS>>;\n}\n\nexport type UIMessagePart<\n DATA_TYPES extends UIDataTypes,\n TOOLS extends UITools,\n> =\n | TextUIPart\n | ReasoningUIPart\n | ToolUIPart<TOOLS>\n | DynamicToolUIPart\n | SourceUrlUIPart\n | SourceDocumentUIPart\n | FileUIPart\n | DataUIPart<DATA_TYPES>\n | StepStartUIPart;\n\n/**\n * A text part of a message.\n */\nexport type TextUIPart = {\n type: 'text';\n\n /**\n * The text content.\n */\n text: string;\n\n /**\n * The state of the text part.\n */\n state?: 'streaming' | 'done';\n\n /**\n * The provider metadata.\n */\n providerMetadata?: ProviderMetadata;\n};\n\n/**\n * A reasoning part of a message.\n */\nexport type ReasoningUIPart = {\n type: 'reasoning';\n\n /**\n * The reasoning text.\n */\n text: string;\n\n /**\n * The state of the reasoning part.\n */\n state?: 'streaming' | 'done';\n\n /**\n * The provider metadata.\n */\n providerMetadata?: ProviderMetadata;\n};\n\n/**\n * A source part of a message.\n */\nexport type SourceUrlUIPart = {\n type: 'source-url';\n sourceId: string;\n url: string;\n title?: string;\n providerMetadata?: ProviderMetadata;\n};\n\n/**\n * A document source part of a message.\n */\nexport type SourceDocumentUIPart = {\n type: 'source-document';\n sourceId: string;\n mediaType: string;\n title: string;\n filename?: string;\n providerMetadata?: ProviderMetadata;\n};\n\n/**\n * A file part of a message.\n */\nexport type FileUIPart = {\n type: 'file';\n\n /**\n * IANA media type of the file.\n *\n * @see https://www.iana.org/assignments/media-types/media-types.xhtml\n */\n mediaType: string;\n\n /**\n * Optional filename of the file.\n */\n filename?: string;\n\n /**\n * The URL of the file.\n * It can either be a URL to a hosted file or a [Data URL](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs).\n */\n url: string;\n\n /**\n * The provider metadata.\n */\n providerMetadata?: ProviderMetadata;\n};\n\n/**\n * A step boundary part of a message.\n */\nexport type StepStartUIPart = {\n type: 'step-start';\n};\n\nexport type DataUIPart<DATA_TYPES extends UIDataTypes> = ValueOf<{\n [NAME in keyof DATA_TYPES & string]: {\n type: `data-${NAME}`;\n id?: string;\n data: DATA_TYPES[NAME];\n };\n}>;\n\nexport type ToolUIPart<TOOLS extends UITools = UITools> = ValueOf<{\n [NAME in keyof TOOLS & string]: {\n type: `tool-${NAME}`;\n toolCallId: string;\n } & (\n | {\n state: 'input-streaming';\n input: DeepPartial<TOOLS[NAME]['input']> | undefined;\n providerExecuted?: boolean;\n output?: never;\n errorText?: never;\n }\n | {\n state: 'input-available';\n input: TOOLS[NAME]['input'];\n providerExecuted?: boolean;\n output?: never;\n errorText?: never;\n callProviderMetadata?: ProviderMetadata;\n }\n | {\n state: 'output-available';\n input: TOOLS[NAME]['input'];\n output: TOOLS[NAME]['output'];\n errorText?: never;\n providerExecuted?: boolean;\n callProviderMetadata?: ProviderMetadata;\n preliminary?: boolean;\n }\n | {\n state: 'output-error'; // TODO AI SDK 6: change to 'error' state\n input: TOOLS[NAME]['input'] | undefined;\n rawInput?: unknown; // TODO AI SDK 6: remove this field, input should be unknown\n output?: never;\n errorText: string;\n providerExecuted?: boolean;\n callProviderMetadata?: ProviderMetadata;\n }\n );\n}>;\n\nexport type DynamicToolUIPart = {\n type: 'dynamic-tool';\n toolName: string;\n toolCallId: string;\n} & (\n | {\n state: 'input-streaming';\n input: unknown | undefined;\n output?: never;\n errorText?: never;\n }\n | {\n state: 'input-available';\n input: unknown;\n output?: never;\n errorText?: never;\n callProviderMetadata?: ProviderMetadata;\n }\n | {\n state: 'output-available';\n input: unknown;\n output: unknown;\n errorText?: never;\n callProviderMetadata?: ProviderMetadata;\n preliminary?: boolean;\n }\n | {\n state: 'output-error'; // TODO AI SDK 6: change to 'error' state\n input: unknown;\n output?: never;\n errorText: string;\n callProviderMetadata?: ProviderMetadata;\n }\n);\n\nexport function isToolUIPart<TOOLS extends UITools>(\n part: UIMessagePart<UIDataTypes, TOOLS>,\n): part is ToolUIPart<TOOLS> {\n return part.type.startsWith('tool-');\n}\n\nexport function getToolName<TOOLS extends UITools>(\n part: ToolUIPart<TOOLS>,\n): keyof TOOLS {\n return part.type.split('-').slice(1).join('-') as keyof TOOLS;\n}\n\nexport type InferUIMessageMetadata<T extends UIMessage> =\n T extends UIMessage<infer METADATA> ? METADATA : unknown;\n\nexport type InferUIMessageData<T extends UIMessage> =\n T extends UIMessage<unknown, infer DATA_TYPES> ? DATA_TYPES : UIDataTypes;\n\nexport type InferUIMessageTools<T extends UIMessage> =\n T extends UIMessage<unknown, UIDataTypes, infer TOOLS> ? TOOLS : UITools;\n\nexport type InferUIMessageToolOutputs<UI_MESSAGE extends UIMessage> =\n InferUIMessageTools<UI_MESSAGE>[keyof InferUIMessageTools<UI_MESSAGE>]['output'];\n\nexport type InferUIMessageToolCall<UI_MESSAGE extends UIMessage> =\n | ValueOf<{\n [NAME in keyof InferUIMessageTools<UI_MESSAGE>]: ToolCall<\n NAME & string,\n InferUIMessageTools<UI_MESSAGE>[NAME] extends { input: infer INPUT }\n ? INPUT\n : never\n > & { dynamic?: false };\n }>\n | (ToolCall<string, unknown> & { dynamic: true });\n","import {\n createStreamingUIMessageState,\n processUIMessageStream,\n StreamingUIMessageState,\n} from '../ui/process-ui-message-stream';\nimport { UIMessage } from '../ui/ui-messages';\nimport { ErrorHandler } from '../util/error-handler';\nimport { InferUIMessageChunk, UIMessageChunk } from './ui-message-chunks';\nimport { UIMessageStreamOnFinishCallback } from './ui-message-stream-on-finish-callback';\n\nexport function handleUIMessageStreamFinish<UI_MESSAGE extends UIMessage>({\n messageId,\n originalMessages = [],\n onFinish,\n onError,\n stream,\n}: {\n stream: ReadableStream<InferUIMessageChunk<UI_MESSAGE>>;\n\n /**\n * The message ID to use for the response message.\n * If not provided, no id will be set for the response message.\n */\n messageId?: string;\n\n /**\n * The original messages.\n */\n originalMessages?: UI_MESSAGE[];\n\n onError: ErrorHandler;\n\n onFinish?: UIMessageStreamOnFinishCallback<UI_MESSAGE>;\n}): ReadableStream<InferUIMessageChunk<UI_MESSAGE>> {\n // last message is only relevant for assistant messages\n let lastMessage: UI_MESSAGE | undefined =\n originalMessages?.[originalMessages.length - 1];\n if (lastMessage?.role !== 'assistant') {\n lastMessage = undefined;\n } else {\n // appending to the last message, so we need to use the same id\n messageId = lastMessage.id;\n }\n\n let isAborted = false;\n\n const idInjectedStream = stream.pipeThrough(\n new TransformStream<\n InferUIMessageChunk<UI_MESSAGE>,\n InferUIMessageChunk<UI_MESSAGE>\n >({\n transform(chunk, controller) {\n // when there is no messageId in the start chunk,\n // but the user checked for persistence,\n // inject the messageId into the chunk\n if (chunk.type === 'start') {\n const startChunk = chunk as UIMessageChunk & { type: 'start' };\n if (startChunk.messageId == null && messageId != null) {\n startChunk.messageId = messageId;\n }\n }\n\n if (chunk.type === 'abort') {\n isAborted = true;\n }\n\n controller.enqueue(chunk);\n },\n }),\n );\n\n if (onFinish == null) {\n return idInjectedStream;\n }\n\n const state = createStreamingUIMessageState<UI_MESSAGE>({\n lastMessage: lastMessage\n ? (structuredClone(lastMessage) as UI_MESSAGE)\n : undefined,\n messageId: messageId ?? '', // will be overridden by the stream\n });\n\n const runUpdateMessageJob = async (\n job: (options: {\n state: StreamingUIMessageState<UI_MESSAGE>;\n write: () => void;\n }) => Promise<void>,\n ) => {\n await job({ state, write: () => {} });\n };\n\n return processUIMessageStream<UI_MESSAGE>({\n stream: idInjectedStream,\n runUpdateMessageJob,\n onError,\n }).pipeThrough(\n new TransformStream<\n InferUIMessageChunk<UI_MESSAGE>,\n InferUIMessageChunk<UI_MESSAGE>\n >({\n transform(chunk, controller) {\n controller.enqueue(chunk);\n },\n\n async flush() {\n const isContinuation = state.message.id === lastMessage?.id;\n await onFinish({\n isAborted,\n isContinuation,\n responseMessage: state.message as UI_MESSAGE,\n messages: [\n ...(isContinuation\n ? originalMessages.slice(0, -1)\n : originalMessages),\n state.message,\n ] as UI_MESSAGE[],\n });\n },\n }),\n );\n}\n","import { ServerResponse } from 'node:http';\nimport { prepareHeaders } from '../util/prepare-headers';\nimport { writeToServerResponse } from '../util/write-to-server-response';\nimport { JsonToSseTransformStream } from './json-to-sse-transform-stream';\nimport { UI_MESSAGE_STREAM_HEADERS } from './ui-message-stream-headers';\nimport { UIMessageChunk } from './ui-message-chunks';\nimport { UIMessageStreamResponseInit } from './ui-message-stream-response-init';\n\nexport function pipeUIMessageStreamToResponse({\n response,\n status,\n statusText,\n headers,\n stream,\n consumeSseStream,\n}: {\n response: ServerResponse;\n stream: ReadableStream<UIMessageChunk>;\n} & UIMessageStreamResponseInit): void {\n let sseStream = stream.pipeThrough(new JsonToSseTransformStream());\n\n // when the consumeSseStream is provided, we need to tee the stream\n // and send the second part to the consumeSseStream function\n // so that it can be consumed by the client independently\n if (consumeSseStream) {\n const [stream1, stream2] = sseStream.tee();\n sseStream = stream1;\n consumeSseStream({ stream: stream2 }); // no await (do not block the response)\n }\n\n writeToServerResponse({\n response,\n status,\n statusText,\n headers: Object.fromEntries(\n prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS).entries(),\n ),\n stream: sseStream.pipeThrough(new TextEncoderStream()),\n });\n}\n","export type AsyncIterableStream<T> = AsyncIterable<T> & ReadableStream<T>;\n\nexport function createAsyncIterableStream<T>(\n source: ReadableStream<T>,\n): AsyncIterableStream<T> {\n const stream = source.pipeThrough(new TransformStream<T, T>());\n\n (stream as AsyncIterableStream<T>)[Symbol.asyncIterator] = () => {\n const reader = stream.getReader();\n return {\n async next(): Promise<IteratorResult<T>> {\n const { done, value } = await reader.read();\n return done ? { done: true, value: undefined } : { done: false, value };\n },\n };\n };\n\n return stream as AsyncIterableStream<T>;\n}\n","/**\n * Consumes a ReadableStream until it's fully read.\n *\n * This function reads the stream chunk by chunk until the stream is exhausted.\n * It doesn't process or return the data from the stream; it simply ensures\n * that the entire stream is read.\n *\n * @param {ReadableStream} stream - The ReadableStream to be consumed.\n * @returns {Promise<void>} A promise that resolves when the stream is fully consumed.\n */\nexport async function consumeStream({\n stream,\n onError,\n}: {\n stream: ReadableStream;\n onError?: (error: unknown) => void;\n}): Promise<void> {\n const reader = stream.getReader();\n try {\n while (true) {\n const { done } = await reader.read();\n if (done) break;\n }\n } catch (error) {\n onError?.(error);\n } finally {\n reader.releaseLock();\n }\n}\n","import { ErrorHandler } from './error-handler';\n\n/**\n * Creates a Promise with externally accessible resolve and reject functions.\n *\n * @template T - The type of the value that the Promise will resolve to.\n * @returns An object containing:\n * - promise: A Promise that can be resolved or rejected externally.\n * - resolve: A function to resolve the Promise with a value of type T.\n * - reject: A function to reject the Promise with an error.\n */\nexport function createResolvablePromise<T = any>(): {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: ErrorHandler;\n} {\n let resolve: (value: T) => void;\n let reject: ErrorHandler;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return {\n promise,\n resolve: resolve!,\n reject: reject!,\n };\n}\n","import { createResolvablePromise } from './create-resolvable-promise';\n\n/**\n * Creates a stitchable stream that can pipe one stream at a time.\n *\n * @template T - The type of values emitted by the streams.\n * @returns {Object} An object containing the stitchable stream and control methods.\n */\nexport function createStitchableStream<T>(): {\n stream: ReadableStream<T>;\n addStream: (innerStream: ReadableStream<T>) => void;\n close: () => void;\n terminate: () => void;\n} {\n let innerStreamReaders: ReadableStreamDefaultReader<T>[] = [];\n let controller: ReadableStreamDefaultController<T> | null = null;\n let isClosed = false;\n let waitForNewStream = createResolvablePromise<void>();\n\n const terminate = () => {\n isClosed = true;\n waitForNewStream.resolve();\n\n innerStreamReaders.forEach(reader => reader.cancel());\n innerStreamReaders = [];\n controller?.close();\n };\n\n const processPull = async () => {\n // Case 1: Outer stream is closed and no more inner streams\n if (isClosed && innerStreamReaders.length === 0) {\n controller?.close();\n return;\n }\n\n // Case 2: No inner streams available, but outer stream is open\n // wait for a new inner stream to be added or the outer stream to close\n if (innerStreamReaders.length === 0) {\n waitForNewStream = createResolvablePromise<void>();\n await waitForNewStream.promise;\n return processPull();\n }\n\n try {\n const { value, done } = await innerStreamReaders[0].read();\n\n if (done) {\n // Case 3: Current inner stream is done\n innerStreamReaders.shift(); // Remove the finished stream\n\n // Continue pulling from the next stream if available\n if (innerStreamReaders.length > 0) {\n await processPull();\n } else if (isClosed) {\n controller?.close();\n }\n } else {\n // Case 4: Current inner stream returns an item\n controller?.enqueue(value);\n }\n } catch (error) {\n // Case 5: Current inner stream throws an error\n controller?.error(error);\n innerStreamReaders.shift(); // Remove the errored stream\n terminate(); // we have errored, terminate all streams\n }\n };\n\n return {\n stream: new ReadableStream<T>({\n start(controllerParam) {\n controller = controllerParam;\n },\n pull: processPull,\n async cancel() {\n for (const reader of innerStreamReaders) {\n await reader.cancel();\n }\n innerStreamReaders = [];\n isClosed = true;\n },\n }),\n addStream: (innerStream: ReadableStream<T>) => {\n if (isClosed) {\n throw new Error('Cannot add inner stream: outer stream is closed');\n }\n\n innerStreamReaders.push(innerStream.getReader());\n waitForNewStream.resolve();\n },\n\n /**\n * Gracefully close the outer stream. This will let the inner streams\n * finish processing and then close the outer stream.\n */\n close: () => {\n isClosed = true;\n waitForNewStream.resolve();\n\n if (innerStreamReaders.length === 0) {\n controller?.close();\n }\n },\n\n /**\n * Immediately close the outer stream. This will cancel all inner streams\n * and close the outer stream.\n */\n terminate,\n };\n}\n","/**\n * Delayed promise. It is only constructed once the value is accessed.\n * This is useful to avoid unhandled promise rejections when the promise is created\n * but not accessed.\n */\nexport class DelayedPromise<T> {\n private status:\n | { type: 'pending' }\n | { type: 'resolved'; value: T }\n | { type: 'rejected'; error: unknown } = { type: 'pending' };\n private _promise: Promise<T> | undefined;\n private _resolve: undefined | ((value: T) => void) = undefined;\n private _reject: undefined | ((error: unknown) => void) = undefined;\n\n get promise(): Promise<T> {\n if (this._promise) {\n return this._promise;\n }\n\n this._promise = new Promise<T>((resolve, reject) => {\n if (this.status.type === 'resolved') {\n resolve(this.status.value);\n } else if (this.status.type === 'rejected') {\n reject(this.status.error);\n }\n\n this._resolve = resolve;\n this._reject = reject;\n });\n\n return this._promise;\n }\n\n resolve(value: T): void {\n this.status = { type: 'resolved', value };\n\n if (this._promise) {\n this._resolve?.(value);\n }\n }\n\n reject(error: unknown): void {\n this.status = { type: 'rejected', error };\n\n if (this._promise) {\n this._reject?.(error);\n }\n }\n}\n","export function filterStreamErrors<T>(\n readable: ReadableStream<T>,\n onError: ({\n error,\n controller,\n }: {\n error: unknown;\n controller: ReadableStreamDefaultController<T>;\n }) => Promise<void> | void,\n): ReadableStream<T> {\n return new ReadableStream<T>({\n async start(controller) {\n const reader = readable.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n break;\n }\n controller.enqueue(value);\n }\n } catch (error) {\n await onError({ error, controller });\n }\n },\n cancel(reason) {\n return readable.cancel(reason);\n },\n });\n}\n","// Shim for performance.now() to support environments that don't have it:\nexport function now(): number {\n return globalThis?.performance?.now() ?? Date.now();\n}\n","import {\n LanguageModelV2CallWarning,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider';\nimport {\n executeTool,\n generateId,\n getErrorMessage,\n ModelMessage,\n} from '@ai-sdk/provider-utils';\nimport { Tracer } from '@opentelemetry/api';\nimport { assembleOperationName } from '../telemetry/assemble-operation-name';\nimport { recordErrorOnSpan, recordSpan } from '../telemetry/record-span';\nimport { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport { FinishReason, LanguageModelUsage, ProviderMetadata } from '../types';\nimport { Source } from '../types/language-model';\nimport { DefaultGeneratedFileWithType, GeneratedFile } from './generated-file';\nimport { parseToolCall } from './parse-tool-call';\nimport { TypedToolCall } from './tool-call';\nimport { ToolCallRepairFunction } from './tool-call-repair-function';\nimport { TypedToolError } from './tool-error';\nimport { TypedToolResult } from './tool-result';\nimport { ToolSet } from './tool-set';\n\nexport type SingleRequestTextStreamPart<TOOLS extends ToolSet> =\n // Text blocks:\n | {\n type: 'text-start';\n providerMetadata?: ProviderMetadata;\n id: string;\n }\n | {\n type: 'text-delta';\n id: string;\n providerMetadata?: ProviderMetadata;\n delta: string;\n }\n | {\n type: 'text-end';\n providerMetadata?: ProviderMetadata;\n id: string;\n }\n\n // Reasoning blocks:\n | {\n type: 'reasoning-start';\n providerMetadata?: ProviderMetadata;\n id: string;\n }\n | {\n type: 'reasoning-delta';\n id: string;\n providerMetadata?: ProviderMetadata;\n delta: string;\n }\n | {\n type: 'reasoning-end';\n id: string;\n providerMetadata?: ProviderMetadata;\n }\n\n // Tool calls:\n | {\n type: 'tool-input-start';\n id: string;\n toolName: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'tool-input-delta';\n id: string;\n delta: string;\n providerMetadata?: ProviderMetadata;\n }\n | {\n type: 'tool-input-end';\n id: string;\n providerMetadata?: ProviderMetadata;\n }\n | ({ type: 'source' } & Source)\n | { type: 'file'; file: GeneratedFile } // different because of GeneratedFile object\n | ({ type: 'tool-call' } & TypedToolCall<TOOLS>)\n | ({ type: 'tool-result' } & TypedToolResult<TOOLS>)\n | ({ type: 'tool-error' } & TypedToolError<TOOLS>)\n | { type: 'file'; file: GeneratedFile } // different because of GeneratedFile object\n | { type: 'stream-start'; warnings: LanguageModelV2CallWarning[] }\n | {\n type: 'response-metadata';\n id?: string;\n timestamp?: Date;\n modelId?: string;\n }\n | {\n type: 'finish';\n finishReason: FinishReason;\n usage: LanguageModelUsage;\n providerMetadata?: ProviderMetadata;\n }\n | { type: 'error'; error: unknown }\n | { type: 'raw'; rawValue: unknown };\n\nexport function runToolsTransformation<TOOLS extends ToolSet>({\n tools,\n generatorStream,\n tracer,\n telemetry,\n system,\n messages,\n abortSignal,\n repairToolCall,\n experimental_context,\n}: {\n tools: TOOLS | undefined;\n generatorStream: ReadableStream<LanguageModelV2StreamPart>;\n tracer: Tracer;\n telemetry: TelemetrySettings | undefined;\n system: string | undefined;\n messages: ModelMessage[];\n abortSignal: AbortSignal | undefined;\n repairToolCall: ToolCallRepairFunction<TOOLS> | undefined;\n experimental_context: unknown;\n}): ReadableStream<SingleRequestTextStreamPart<TOOLS>> {\n // tool results stream\n let toolResultsStreamController: ReadableStreamDefaultController<\n SingleRequestTextStreamPart<TOOLS>\n > | null = null;\n const toolResultsStream = new ReadableStream<\n SingleRequestTextStreamPart<TOOLS>\n >({\n start(controller) {\n toolResultsStreamController = controller;\n },\n });\n\n // keep track of outstanding tool results for stream closing:\n const outstandingToolResults = new Set<string>();\n\n // keep track of tool inputs for provider-side tool results\n const toolInputs = new Map<string, unknown>();\n\n let canClose = false;\n let finishChunk:\n | (SingleRequestTextStreamPart<TOOLS> & { type: 'finish' })\n | undefined = undefined;\n\n function attemptClose() {\n // close the tool results controller if no more outstanding tool calls\n if (canClose && outstandingToolResults.size === 0) {\n // we delay sending the finish chunk until all tool results (incl. delayed ones)\n // are received to ensure that the frontend receives tool results before a message\n // finish event arrives.\n if (finishChunk != null) {\n toolResultsStreamController!.enqueue(finishChunk);\n }\n\n toolResultsStreamController!.close();\n }\n }\n\n // forward stream\n const forwardStream = new TransformStream<\n LanguageModelV2StreamPart,\n SingleRequestTextStreamPart<TOOLS>\n >({\n async transform(\n chunk: LanguageModelV2StreamPart,\n controller: TransformStreamDefaultController<\n SingleRequestTextStreamPart<TOOLS>\n >,\n ) {\n const chunkType = chunk.type;\n\n switch (chunkType) {\n // forward:\n case 'stream-start':\n case 'text-start':\n case 'text-delta':\n case 'text-end':\n case 'reasoning-start':\n case 'reasoning-delta':\n case 'reasoning-end':\n case 'tool-input-start':\n case 'tool-input-delta':\n case 'tool-input-end':\n case 'source':\n case 'response-metadata':\n case 'error':\n case 'raw': {\n controller.enqueue(chunk);\n break;\n }\n\n case 'file': {\n controller.enqueue({\n type: 'file',\n file: new DefaultGeneratedFileWithType({\n data: chunk.data,\n mediaType: chunk.mediaType,\n }),\n });\n break;\n }\n\n case 'finish': {\n finishChunk = {\n type: 'finish',\n finishReason: chunk.finishReason,\n usage: chunk.usage,\n providerMetadata: chunk.providerMetadata,\n };\n break;\n }\n\n // process tool call:\n case 'tool-call': {\n try {\n const toolCall = await parseToolCall({\n toolCall: chunk,\n tools,\n repairToolCall,\n system,\n messages,\n });\n\n controller.enqueue(toolCall);\n\n // handle invalid tool calls:\n if (toolCall.invalid) {\n toolResultsStreamController!.enqueue({\n type: 'tool-error',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n error: getErrorMessage(toolCall.error!),\n dynamic: true,\n });\n\n break;\n }\n\n const tool = tools![toolCall.toolName];\n\n toolInputs.set(toolCall.toolCallId, toolCall.input);\n\n if (tool.onInputAvailable != null) {\n await tool.onInputAvailable({\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n messages,\n abortSignal,\n experimental_context,\n });\n }\n\n // Only execute tools that are not provider-executed:\n if (tool.execute != null && toolCall.providerExecuted !== true) {\n const toolExecutionId = generateId(); // use our own id to guarantee uniqueness\n outstandingToolResults.add(toolExecutionId);\n\n // Note: we don't await the tool execution here (by leaving out 'await' on recordSpan),\n // because we want to process the next chunk as soon as possible.\n // This is important for the case where the tool execution takes a long time.\n recordSpan({\n name: 'ai.toolCall',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.toolCall',\n telemetry,\n }),\n 'ai.toolCall.name': toolCall.toolName,\n 'ai.toolCall.id': toolCall.toolCallId,\n 'ai.toolCall.args': {\n output: () => JSON.stringify(toolCall.input),\n },\n },\n }),\n tracer,\n fn: async span => {\n let output: unknown;\n\n try {\n const stream = executeTool({\n execute: tool.execute!.bind(tool),\n input: toolCall.input,\n options: {\n toolCallId: toolCall.toolCallId,\n messages,\n abortSignal,\n experimental_context,\n },\n });\n\n for await (const part of stream) {\n toolResultsStreamController!.enqueue({\n ...toolCall,\n type: 'tool-result',\n output: part.output,\n ...(part.type === 'preliminary' && {\n preliminary: true,\n }),\n });\n\n if (part.type === 'final') {\n output = part.output;\n }\n }\n } catch (error) {\n recordErrorOnSpan(span, error);\n toolResultsStreamController!.enqueue({\n ...toolCall,\n type: 'tool-error',\n error,\n } satisfies TypedToolError<TOOLS>);\n\n outstandingToolResults.delete(toolExecutionId);\n attemptClose();\n return;\n }\n\n outstandingToolResults.delete(toolExecutionId);\n attemptClose();\n\n // record telemetry\n try {\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.toolCall.result': {\n output: () => JSON.stringify(output),\n },\n },\n }),\n );\n } catch (ignored) {\n // JSON stringify might fail if the result is not serializable,\n // in which case we just ignore it. In the future we might want to\n // add an optional serialize method to the tool interface and warn\n // if the result is not serializable.\n }\n },\n });\n }\n } catch (error) {\n toolResultsStreamController!.enqueue({ type: 'error', error });\n }\n\n break;\n }\n\n case 'tool-result': {\n const toolName = chunk.toolName as keyof TOOLS & string;\n\n if (chunk.isError) {\n toolResultsStreamController!.enqueue({\n type: 'tool-error',\n toolCallId: chunk.toolCallId,\n toolName,\n input: toolInputs.get(chunk.toolCallId),\n providerExecuted: chunk.providerExecuted,\n error: chunk.result,\n } as TypedToolError<TOOLS>);\n } else {\n controller.enqueue({\n type: 'tool-result',\n toolCallId: chunk.toolCallId,\n toolName,\n input: toolInputs.get(chunk.toolCallId),\n output: chunk.result,\n providerExecuted: chunk.providerExecuted,\n } as TypedToolResult<TOOLS>);\n }\n break;\n }\n\n default: {\n const _exhaustiveCheck: never = chunkType;\n throw new Error(`Unhandled chunk type: ${_exhaustiveCheck}`);\n }\n }\n },\n\n flush() {\n canClose = true;\n attemptClose();\n },\n });\n\n // combine the generator stream and the tool results stream\n return new ReadableStream<SingleRequestTextStreamPart<TOOLS>>({\n async start(controller) {\n // need to wait for both pipes so there are no dangling promises that\n // can cause uncaught promise rejections when the stream is aborted\n return Promise.all([\n generatorStream.pipeThrough(forwardStream).pipeTo(\n new WritableStream({\n write(chunk) {\n controller.enqueue(chunk);\n },\n close() {\n // the generator stream controller is automatically closed when it's consumed\n },\n }),\n ),\n toolResultsStream.pipeTo(\n new WritableStream({\n write(chunk) {\n controller.enqueue(chunk);\n },\n close() {\n controller.close();\n },\n }),\n ),\n ]);\n },\n });\n}\n","import { IdGenerator, ProviderOptions } from '@ai-sdk/provider-utils';\nimport {\n generateText,\n GenerateTextOnStepFinishCallback,\n} from '../generate-text/generate-text';\nimport { GenerateTextResult } from '../generate-text/generate-text-result';\nimport { Output } from '../generate-text/output';\nimport { PrepareStepFunction } from '../generate-text/prepare-step';\nimport { StopCondition } from '../generate-text/stop-condition';\nimport { streamText } from '../generate-text/stream-text';\nimport { StreamTextResult } from '../generate-text/stream-text-result';\nimport { ToolCallRepairFunction } from '../generate-text/tool-call-repair-function';\nimport { ToolSet } from '../generate-text/tool-set';\nimport { CallSettings } from '../prompt/call-settings';\nimport { Prompt } from '../prompt/prompt';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport { LanguageModel, ToolChoice } from '../types/language-model';\nimport { ProviderMetadata } from '../types/provider-metadata';\n\nexport type AgentSettings<\n TOOLS extends ToolSet,\n OUTPUT = never,\n OUTPUT_PARTIAL = never,\n> = CallSettings & {\n /**\n * The system prompt to use.\n */\n system?: string;\n\n /**\nThe language model to use.\n */\n model: LanguageModel;\n\n /**\nThe tools that the model can call. The model needs to support calling tools.\n*/\n tools?: TOOLS;\n\n /**\nThe tool choice strategy. Default: 'auto'.\n */\n toolChoice?: ToolChoice<NoInfer<TOOLS>>;\n\n /**\nCondition for stopping the generation when there are tool results in the last step.\nWhen the condition is an array, any of the conditions can be met to stop the generation.\n\n@default stepCountIs(1)\n */\n stopWhen?:\n | StopCondition<NoInfer<TOOLS>>\n | Array<StopCondition<NoInfer<TOOLS>>>;\n\n /**\nOptional telemetry configuration (experimental).\n */\n experimental_telemetry?: TelemetrySettings;\n\n /**\nLimits the tools that are available for the model to call without\nchanging the tool call and result types in the result.\n */\n activeTools?: Array<keyof NoInfer<TOOLS>>;\n\n /**\nOptional specification for parsing structured outputs from the LLM response.\n */\n experimental_output?: Output<OUTPUT, OUTPUT_PARTIAL>;\n\n /**\n * @deprecated Use `prepareStep` instead.\n */\n experimental_prepareStep?: PrepareStepFunction<NoInfer<TOOLS>>;\n\n /**\nOptional function that you can use to provide different settings for a step.\n */\n prepareStep?: PrepareStepFunction<NoInfer<TOOLS>>;\n\n /**\nA function that attempts to repair a tool call that failed to parse.\n */\n experimental_repairToolCall?: ToolCallRepairFunction<NoInfer<TOOLS>>;\n\n /**\n Callback that is called when each step (LLM call) is finished, including intermediate steps.\n */\n onStepFinish?: GenerateTextOnStepFinishCallback<NoInfer<TOOLS>>;\n\n /**\n * Context that is passed into tool calls.\n *\n * Experimental (can break in patch releases).\n *\n * @default undefined\n */\n experimental_context?: unknown;\n\n /**\n * Internal. For test use only. May change without notice.\n */\n _internal?: {\n generateId?: IdGenerator;\n currentDate?: () => Date;\n };\n};\n\nexport class Agent<\n TOOLS extends ToolSet,\n OUTPUT = never,\n OUTPUT_PARTIAL = never,\n> {\n private readonly settings: AgentSettings<TOOLS, OUTPUT, OUTPUT_PARTIAL>;\n\n constructor(settings: AgentSettings<TOOLS, OUTPUT, OUTPUT_PARTIAL>) {\n this.settings = settings;\n }\n\n async generate(\n options: Prompt & {\n /**\nAdditional provider-specific metadata. They are passed through\nfrom the provider to the AI SDK and enable provider-specific\nresults that can be fully encapsulated in the provider.\n */\n providerMetadata?: ProviderMetadata;\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 },\n ): Promise<GenerateTextResult<TOOLS, OUTPUT>> {\n return generateText({ ...this.settings, ...options });\n }\n\n stream(\n options: Prompt & {\n /**\nAdditional provider-specific metadata. They are passed through\nfrom the provider to the AI SDK and enable provider-specific\nresults that can be fully encapsulated in the provider.\n */\n providerMetadata?: ProviderMetadata;\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 },\n ): StreamTextResult<TOOLS, OUTPUT_PARTIAL> {\n return streamText({ ...this.settings, ...options });\n }\n}\n","import { ProviderOptions } from '@ai-sdk/provider-utils';\nimport { resolveEmbeddingModel } from '../model/resolve-model';\nimport { assembleOperationName } from '../telemetry/assemble-operation-name';\nimport { getBaseTelemetryAttributes } from '../telemetry/get-base-telemetry-attributes';\nimport { getTracer } from '../telemetry/get-tracer';\nimport { recordSpan } from '../telemetry/record-span';\nimport { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport { EmbeddingModel } from '../types';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { EmbedResult } from './embed-result';\n\n/**\nEmbed a value using an embedding model. The type of the value is defined by the embedding model.\n\n@param model - The embedding model to use.\n@param value - The value that should be embedded.\n\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@returns A result object that contains the embedding, the value, and additional information.\n */\nexport async function embed<VALUE = string>({\n model: modelArg,\n value,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n experimental_telemetry: telemetry,\n}: {\n /**\nThe embedding model to use.\n */\n model: EmbeddingModel<VALUE>;\n\n /**\nThe value that should be embedded.\n */\n value: VALUE;\n\n /**\nMaximum number of retries per embedding model call. Set to 0 to disable retries.\n\n@default 2\n */\n maxRetries?: number;\n\n /**\nAbort signal.\n */\n abortSignal?: AbortSignal;\n\n /**\nAdditional headers to include in the request.\nOnly applicable for HTTP-based providers.\n */\n headers?: Record<string, string>;\n\n /**\n Additional provider-specific options. They are passed through\n to the provider from the AI SDK and enable provider-specific\n functionality that can be fully encapsulated in the provider.\n */\n providerOptions?: ProviderOptions;\n\n /**\n * Optional telemetry configuration (experimental).\n */\n experimental_telemetry?: TelemetrySettings;\n}): Promise<EmbedResult<VALUE>> {\n const model = resolveEmbeddingModel<VALUE>(modelArg);\n\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: model,\n telemetry,\n headers,\n settings: { maxRetries },\n });\n\n const tracer = getTracer(telemetry);\n\n return recordSpan({\n name: 'ai.embed',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: 'ai.embed', telemetry }),\n ...baseTelemetryAttributes,\n 'ai.value': { input: () => JSON.stringify(value) },\n },\n }),\n tracer,\n fn: async span => {\n const { embedding, usage, response, providerMetadata } = await retry(() =>\n // nested spans to align with the embedMany telemetry data:\n recordSpan({\n name: 'ai.embed.doEmbed',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.embed.doEmbed',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n 'ai.values': { input: () => [JSON.stringify(value)] },\n },\n }),\n tracer,\n fn: async doEmbedSpan => {\n const modelResponse = await model.doEmbed({\n values: [value],\n abortSignal,\n headers,\n providerOptions,\n });\n\n const embedding = modelResponse.embeddings[0];\n const usage = modelResponse.usage ?? { tokens: NaN };\n\n doEmbedSpan.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.embeddings': {\n output: () =>\n modelResponse.embeddings.map(embedding =>\n JSON.stringify(embedding),\n ),\n },\n 'ai.usage.tokens': usage.tokens,\n },\n }),\n );\n\n return {\n embedding,\n usage,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response,\n };\n },\n }),\n );\n\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.embedding': { output: () => JSON.stringify(embedding) },\n 'ai.usage.tokens': usage.tokens,\n },\n }),\n );\n\n return new DefaultEmbedResult({\n value,\n embedding,\n usage,\n providerMetadata,\n response,\n });\n },\n });\n}\n\nclass DefaultEmbedResult<VALUE> implements EmbedResult<VALUE> {\n readonly value: EmbedResult<VALUE>['value'];\n readonly embedding: EmbedResult<VALUE>['embedding'];\n readonly usage: EmbedResult<VALUE>['usage'];\n readonly providerMetadata: EmbedResult<VALUE>['providerMetadata'];\n readonly response: EmbedResult<VALUE>['response'];\n\n constructor(options: {\n value: EmbedResult<VALUE>['value'];\n embedding: EmbedResult<VALUE>['embedding'];\n usage: EmbedResult<VALUE>['usage'];\n providerMetadata?: EmbedResult<VALUE>['providerMetadata'];\n response?: EmbedResult<VALUE>['response'];\n }) {\n this.value = options.value;\n this.embedding = options.embedding;\n this.usage = options.usage;\n this.providerMetadata = options.providerMetadata;\n this.response = options.response;\n }\n}\n","/**\n * Splits an array into chunks of a specified size.\n *\n * @template T - The type of elements in the array.\n * @param {T[]} array - The array to split.\n * @param {number} chunkSize - The size of each chunk.\n * @returns {T[][]} - A new array containing the chunks.\n */\nexport function splitArray<T>(array: T[], chunkSize: number): T[][] {\n if (chunkSize <= 0) {\n throw new Error('chunkSize must be greater than 0');\n }\n\n const result = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n","import { ProviderOptions } from '@ai-sdk/provider-utils';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { splitArray } from '../util/split-array';\nimport { UnsupportedModelVersionError } from '../error/unsupported-model-version-error';\nimport { assembleOperationName } from '../telemetry/assemble-operation-name';\nimport { getBaseTelemetryAttributes } from '../telemetry/get-base-telemetry-attributes';\nimport { getTracer } from '../telemetry/get-tracer';\nimport { recordSpan } from '../telemetry/record-span';\nimport { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport { Embedding, EmbeddingModel, ProviderMetadata } from '../types';\nimport { resolveEmbeddingModel } from '../model/resolve-model';\nimport { EmbedManyResult } from './embed-many-result';\n\n/**\nEmbed several values using an embedding model. The type of the value is defined\nby the embedding model.\n\n`embedMany` automatically splits large requests into smaller chunks if the model\nhas a limit on how many embeddings can be generated in a single call.\n\n@param model - The embedding model to use.\n@param values - The values that should be embedded.\n\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@returns A result object that contains the embeddings, the value, and additional information.\n */\nexport async function embedMany<VALUE = string>({\n model: modelArg,\n values,\n maxParallelCalls = Infinity,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n providerOptions,\n experimental_telemetry: telemetry,\n}: {\n /**\nThe embedding model to use.\n */\n model: EmbeddingModel<VALUE>;\n\n /**\nThe values that should be embedded.\n */\n values: Array<VALUE>;\n\n /**\nMaximum number of retries per embedding model call. Set to 0 to disable retries.\n\n@default 2\n */\n maxRetries?: number;\n\n /**\nAbort signal.\n */\n abortSignal?: AbortSignal;\n\n /**\nAdditional headers to include in the request.\nOnly applicable for HTTP-based providers.\n */\n headers?: Record<string, string>;\n\n /**\n * Optional telemetry configuration (experimental).\n */\n experimental_telemetry?: TelemetrySettings;\n\n /**\n Additional provider-specific options. They are passed through\n to the provider from the AI SDK and enable provider-specific\n functionality that can be fully encapsulated in the provider.\n */\n providerOptions?: ProviderOptions;\n\n /**\n * Maximum number of concurrent requests.\n *\n * @default Infinity\n */\n maxParallelCalls?: number;\n}): Promise<EmbedManyResult<VALUE>> {\n const model = resolveEmbeddingModel<VALUE>(modelArg);\n\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { maxRetries },\n });\n\n const tracer = getTracer(telemetry);\n\n return recordSpan({\n name: 'ai.embedMany',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: 'ai.embedMany', telemetry }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n 'ai.values': {\n input: () => values.map(value => JSON.stringify(value)),\n },\n },\n }),\n tracer,\n fn: async span => {\n const [maxEmbeddingsPerCall, supportsParallelCalls] = await Promise.all([\n model.maxEmbeddingsPerCall,\n model.supportsParallelCalls,\n ]);\n\n // the model has not specified limits on\n // how many embeddings can be generated in a single call\n if (maxEmbeddingsPerCall == null || maxEmbeddingsPerCall === Infinity) {\n const { embeddings, usage, response, providerMetadata } = await retry(\n () => {\n // nested spans to align with the embedMany telemetry data:\n return recordSpan({\n name: 'ai.embedMany.doEmbed',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.embedMany.doEmbed',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n 'ai.values': {\n input: () => values.map(value => JSON.stringify(value)),\n },\n },\n }),\n tracer,\n fn: async doEmbedSpan => {\n const modelResponse = await model.doEmbed({\n values,\n abortSignal,\n headers,\n providerOptions,\n });\n\n const embeddings = modelResponse.embeddings;\n const usage = modelResponse.usage ?? { tokens: NaN };\n\n doEmbedSpan.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.embeddings': {\n output: () =>\n embeddings.map(embedding =>\n JSON.stringify(embedding),\n ),\n },\n 'ai.usage.tokens': usage.tokens,\n },\n }),\n );\n\n return {\n embeddings,\n usage,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response,\n };\n },\n });\n },\n );\n\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.embeddings': {\n output: () =>\n embeddings.map(embedding => JSON.stringify(embedding)),\n },\n 'ai.usage.tokens': usage.tokens,\n },\n }),\n );\n\n return new DefaultEmbedManyResult({\n values,\n embeddings,\n usage,\n providerMetadata,\n responses: [response],\n });\n }\n\n // split the values into chunks that are small enough for the model:\n const valueChunks = splitArray(values, maxEmbeddingsPerCall);\n\n // serially embed the chunks:\n const embeddings: Array<Embedding> = [];\n const responses: Array<\n | {\n headers?: Record<string, string>;\n body?: unknown;\n }\n | undefined\n > = [];\n let tokens = 0;\n let providerMetadata: ProviderMetadata | undefined;\n\n const parallelChunks = splitArray(\n valueChunks,\n supportsParallelCalls ? maxParallelCalls : 1,\n );\n\n for (const parallelChunk of parallelChunks) {\n const results = await Promise.all(\n parallelChunk.map(chunk => {\n return retry(() => {\n // nested spans to align with the embedMany telemetry data:\n return recordSpan({\n name: 'ai.embedMany.doEmbed',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.embedMany.doEmbed',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n 'ai.values': {\n input: () => chunk.map(value => JSON.stringify(value)),\n },\n },\n }),\n tracer,\n fn: async doEmbedSpan => {\n const modelResponse = await model.doEmbed({\n values: chunk,\n abortSignal,\n headers,\n providerOptions,\n });\n\n const embeddings = modelResponse.embeddings;\n const usage = modelResponse.usage ?? { tokens: NaN };\n\n doEmbedSpan.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.embeddings': {\n output: () =>\n embeddings.map(embedding =>\n JSON.stringify(embedding),\n ),\n },\n 'ai.usage.tokens': usage.tokens,\n },\n }),\n );\n\n return {\n embeddings,\n usage,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response,\n };\n },\n });\n });\n }),\n );\n\n for (const result of results) {\n embeddings.push(...result.embeddings);\n responses.push(result.response);\n tokens += result.usage.tokens;\n if (result.providerMetadata) {\n if (!providerMetadata) {\n providerMetadata = { ...result.providerMetadata };\n } else {\n for (const [providerName, metadata] of Object.entries(\n result.providerMetadata,\n )) {\n providerMetadata[providerName] = {\n ...(providerMetadata[providerName] ?? {}),\n ...metadata,\n };\n }\n }\n }\n }\n }\n\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.embeddings': {\n output: () =>\n embeddings.map(embedding => JSON.stringify(embedding)),\n },\n 'ai.usage.tokens': tokens,\n },\n }),\n );\n\n return new DefaultEmbedManyResult({\n values,\n embeddings,\n usage: { tokens },\n providerMetadata: providerMetadata,\n responses,\n });\n },\n });\n}\n\nclass DefaultEmbedManyResult<VALUE> implements EmbedManyResult<VALUE> {\n readonly values: EmbedManyResult<VALUE>['values'];\n readonly embeddings: EmbedManyResult<VALUE>['embeddings'];\n readonly usage: EmbedManyResult<VALUE>['usage'];\n readonly providerMetadata: EmbedManyResult<VALUE>['providerMetadata'];\n readonly responses: EmbedManyResult<VALUE>['responses'];\n\n constructor(options: {\n values: EmbedManyResult<VALUE>['values'];\n embeddings: EmbedManyResult<VALUE>['embeddings'];\n usage: EmbedManyResult<VALUE>['usage'];\n providerMetadata?: EmbedManyResult<VALUE>['providerMetadata'];\n responses?: EmbedManyResult<VALUE>['responses'];\n }) {\n this.values = options.values;\n this.embeddings = options.embeddings;\n this.usage = options.usage;\n this.providerMetadata = options.providerMetadata;\n this.responses = options.responses;\n }\n}\n","import { ImageModelV2, ImageModelV2ProviderMetadata } from '@ai-sdk/provider';\nimport { ProviderOptions } from '@ai-sdk/provider-utils';\nimport { NoImageGeneratedError } from '../error/no-image-generated-error';\nimport {\n detectMediaType,\n imageMediaTypeSignatures,\n} from '../util/detect-media-type';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { UnsupportedModelVersionError } from '../error/unsupported-model-version-error';\nimport {\n DefaultGeneratedFile,\n GeneratedFile,\n} from '../generate-text/generated-file';\nimport { ImageGenerationWarning } from '../types/image-model';\nimport { ImageModelResponseMetadata } from '../types/image-model-response-metadata';\nimport { GenerateImageResult } from './generate-image-result';\n\n/**\nGenerates images using an image model.\n\n@param model - The image model to use.\n@param prompt - The prompt that should be used to generate the image.\n@param n - Number of images to generate. Default: 1.\n@param size - Size of the images to generate. Must have the format `{width}x{height}`.\n@param aspectRatio - Aspect ratio of the images to generate. Must have the format `{width}:{height}`.\n@param seed - Seed for the image generation.\n@param providerOptions - Additional provider-specific options that are passed through to the provider\nas body parameters.\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@returns A result object that contains the generated images.\n */\nexport async function generateImage({\n model,\n prompt,\n n = 1,\n maxImagesPerCall,\n size,\n aspectRatio,\n seed,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n}: {\n /**\nThe image model to use.\n */\n model: ImageModelV2;\n\n /**\nThe prompt that should be used to generate the image.\n */\n prompt: string;\n\n /**\nNumber of images to generate.\n */\n n?: number;\n\n /**\nNumber of images to generate.\n */\n maxImagesPerCall?: number;\n\n /**\nSize of the images to generate. Must have the format `{width}x{height}`. If not provided, the default size will be used.\n */\n size?: `${number}x${number}`;\n\n /**\nAspect ratio of the images to generate. Must have the format `{width}:{height}`. If not provided, the default aspect ratio will be used.\n */\n aspectRatio?: `${number}:${number}`;\n\n /**\nSeed for the image generation. If not provided, the default seed will be used.\n */\n seed?: number;\n\n /**\nAdditional provider-specific options that are passed through to the provider\nas body parameters.\n\nThe outer record is keyed by the provider name, and the inner\nrecord is keyed by the provider-specific metadata key.\n```ts\n{\n \"openai\": {\n \"style\": \"vivid\"\n }\n}\n```\n */\n providerOptions?: ProviderOptions;\n\n /**\nMaximum number of retries per embedding model call. Set to 0 to disable retries.\n\n@default 2\n */\n maxRetries?: number;\n\n /**\nAbort signal.\n */\n abortSignal?: AbortSignal;\n\n /**\nAdditional headers to include in the request.\nOnly applicable for HTTP-based providers.\n */\n headers?: Record<string, string>;\n}): Promise<GenerateImageResult> {\n if (model.specificationVersion !== 'v2') {\n throw new UnsupportedModelVersionError({\n version: model.specificationVersion,\n provider: model.provider,\n modelId: model.modelId,\n });\n }\n\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n // default to 1 if the model has not specified limits on\n // how many images can be generated in a single call\n const maxImagesPerCallWithDefault =\n maxImagesPerCall ?? (await invokeModelMaxImagesPerCall(model)) ?? 1;\n\n // parallelize calls to the model:\n const callCount = Math.ceil(n / maxImagesPerCallWithDefault);\n const callImageCounts = Array.from({ length: callCount }, (_, i) => {\n if (i < callCount - 1) {\n return maxImagesPerCallWithDefault;\n }\n\n const remainder = n % maxImagesPerCallWithDefault;\n return remainder === 0 ? maxImagesPerCallWithDefault : remainder;\n });\n\n const results = await Promise.all(\n callImageCounts.map(async callImageCount =>\n retry(() =>\n model.doGenerate({\n prompt,\n n: callImageCount,\n abortSignal,\n headers,\n size,\n aspectRatio,\n seed,\n providerOptions: providerOptions ?? {},\n }),\n ),\n ),\n );\n\n // collect result images, warnings, and response metadata\n const images: Array<DefaultGeneratedFile> = [];\n const warnings: Array<ImageGenerationWarning> = [];\n const responses: Array<ImageModelResponseMetadata> = [];\n const providerMetadata: ImageModelV2ProviderMetadata = {};\n for (const result of results) {\n images.push(\n ...result.images.map(\n image =>\n new DefaultGeneratedFile({\n data: image,\n mediaType:\n detectMediaType({\n data: image,\n signatures: imageMediaTypeSignatures,\n }) ?? 'image/png',\n }),\n ),\n );\n warnings.push(...result.warnings);\n\n if (result.providerMetadata) {\n for (const [providerName, metadata] of Object.entries<{\n images: unknown;\n }>(result.providerMetadata)) {\n providerMetadata[providerName] ??= { images: [] };\n providerMetadata[providerName].images.push(\n ...result.providerMetadata[providerName].images,\n );\n }\n }\n\n responses.push(result.response);\n }\n\n if (!images.length) {\n throw new NoImageGeneratedError({ responses });\n }\n\n return new DefaultGenerateImageResult({\n images,\n warnings,\n responses,\n providerMetadata,\n });\n}\n\nclass DefaultGenerateImageResult implements GenerateImageResult {\n readonly images: Array<GeneratedFile>;\n readonly warnings: Array<ImageGenerationWarning>;\n readonly responses: Array<ImageModelResponseMetadata>;\n readonly providerMetadata: ImageModelV2ProviderMetadata;\n\n constructor(options: {\n images: Array<GeneratedFile>;\n warnings: Array<ImageGenerationWarning>;\n responses: Array<ImageModelResponseMetadata>;\n providerMetadata: ImageModelV2ProviderMetadata;\n }) {\n this.images = options.images;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = options.providerMetadata;\n }\n\n get image() {\n return this.images[0];\n }\n}\n\nasync function invokeModelMaxImagesPerCall(model: ImageModelV2) {\n const isFunction = model.maxImagesPerCall instanceof Function;\n\n if (!isFunction) {\n return model.maxImagesPerCall;\n }\n\n return model.maxImagesPerCall({\n modelId: model.modelId,\n });\n}\n","import { JSONValue } from '@ai-sdk/provider';\nimport {\n createIdGenerator,\n InferSchema,\n ProviderOptions,\n Schema,\n} from '@ai-sdk/provider-utils';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport { NoObjectGeneratedError } from '../error/no-object-generated-error';\nimport { extractContentText } from '../generate-text/extract-content-text';\nimport { resolveLanguageModel } from '../model/resolve-model';\nimport { CallSettings } from '../prompt/call-settings';\nimport { convertToLanguageModelPrompt } from '../prompt/convert-to-language-model-prompt';\nimport { prepareCallSettings } from '../prompt/prepare-call-settings';\nimport { Prompt } from '../prompt/prompt';\nimport { standardizePrompt } from '../prompt/standardize-prompt';\nimport { wrapGatewayError } from '../prompt/wrap-gateway-error';\nimport { assembleOperationName } from '../telemetry/assemble-operation-name';\nimport { getBaseTelemetryAttributes } from '../telemetry/get-base-telemetry-attributes';\nimport { getTracer } from '../telemetry/get-tracer';\nimport { recordSpan } from '../telemetry/record-span';\nimport { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';\nimport { stringifyForTelemetry } from '../telemetry/stringify-for-telemetry';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport {\n CallWarning,\n FinishReason,\n LanguageModel,\n} from '../types/language-model';\nimport { LanguageModelRequestMetadata } from '../types/language-model-request-metadata';\nimport { LanguageModelResponseMetadata } from '../types/language-model-response-metadata';\nimport { ProviderMetadata } from '../types/provider-metadata';\nimport { LanguageModelUsage } from '../types/usage';\nimport { prepareHeaders } from '../util/prepare-headers';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { GenerateObjectResult } from './generate-object-result';\nimport { getOutputStrategy } from './output-strategy';\nimport { parseAndValidateObjectResultWithRepair } from './parse-and-validate-object-result';\nimport { RepairTextFunction } from './repair-text';\nimport { validateObjectGenerationInput } from './validate-object-generation-input';\n\nconst originalGenerateId = createIdGenerator({ prefix: 'aiobj', size: 24 });\n\n/**\nGenerate a structured, typed object for a given prompt and schema using a language model.\n\nThis function does not stream the output. If you want to stream the output, use `streamObject` instead.\n\n@param model - The language model to use.\n@param tools - Tools that are accessible to and can be called by the model. The model needs to support calling tools.\n\n@param system - A system message that will be part of the prompt.\n@param prompt - A simple text prompt. You can either use `prompt` or `messages` but not both.\n@param messages - A list of messages. You can either use `prompt` or `messages` but not both.\n\n@param maxOutputTokens - Maximum number of tokens to generate.\n@param temperature - Temperature setting.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topP - Nucleus sampling.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topK - Only sample from the top K options for each subsequent token.\nUsed to remove \"long tail\" low probability responses.\nRecommended for advanced use cases only. You usually only need to use temperature.\n@param presencePenalty - Presence penalty setting.\nIt affects the likelihood of the model to repeat information that is already in the prompt.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param frequencyPenalty - Frequency penalty setting.\nIt affects the likelihood of the model to repeatedly use the same words or phrases.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param stopSequences - Stop sequences.\nIf set, the model will stop generating text when one of the stop sequences is generated.\n@param seed - The seed (integer) to use for random sampling.\nIf set and supported by the model, calls will generate deterministic results.\n\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@param schema - The schema of the object that the model should generate.\n@param schemaName - Optional name of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema name.\n@param schemaDescription - Optional description of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema description.\n\n@param output - The type of the output.\n\n- 'object': The output is an object.\n- 'array': The output is an array.\n- 'enum': The output is an enum.\n- 'no-schema': The output is not a schema.\n\n@param experimental_repairText - A function that attempts to repair the raw output of the model\nto enable JSON parsing.\n\n@param experimental_telemetry - Optional telemetry configuration (experimental).\n\n@param providerOptions - Additional provider-specific options. 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@returns\nA result object that contains the generated object, the finish reason, the token usage, and additional information.\n */\nexport async function generateObject<\n SCHEMA extends\n | z3.Schema\n | z4.core.$ZodType\n | Schema = z4.core.$ZodType<JSONValue>,\n OUTPUT extends\n | 'object'\n | 'array'\n | 'enum'\n | 'no-schema' = InferSchema<SCHEMA> extends string ? 'enum' : 'object',\n RESULT = OUTPUT extends 'array'\n ? Array<InferSchema<SCHEMA>>\n : InferSchema<SCHEMA>,\n>(\n options: Omit<CallSettings, 'stopSequences'> &\n Prompt &\n (OUTPUT extends 'enum'\n ? {\n /**\nThe enum values that the model should use.\n */\n enum: Array<RESULT>;\n mode?: 'json';\n output: 'enum';\n }\n : OUTPUT extends 'no-schema'\n ? {}\n : {\n /**\nThe schema of the object that the model should generate.\n */\n schema: SCHEMA;\n\n /**\nOptional name of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema name.\n */\n schemaName?: string;\n\n /**\nOptional description of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema description.\n */\n schemaDescription?: string;\n\n /**\nThe mode to use for object generation.\n\nThe schema is converted into a JSON schema and used in one of the following ways\n\n- 'auto': The provider will choose the best mode for the model.\n- 'tool': A tool with the JSON schema as parameters is provided and the provider is instructed to use it.\n- 'json': The JSON schema and an instruction are injected into the prompt. If the provider supports JSON mode, it is enabled. If the provider supports JSON grammars, the grammar is used.\n\nPlease note that most providers do not support all modes.\n\nDefault and recommended: 'auto' (best mode for the model).\n */\n mode?: 'auto' | 'json' | 'tool';\n }) & {\n output?: OUTPUT;\n\n /**\n The language model to use.\n */\n model: LanguageModel;\n /**\n A function that attempts to repair the raw output of the model\n to enable JSON parsing.\n */\n experimental_repairText?: RepairTextFunction;\n\n /**\n Optional telemetry configuration (experimental).\n */\n\n experimental_telemetry?: TelemetrySettings;\n\n /**\n Additional provider-specific options. They are passed through\n to the provider from the AI SDK and enable provider-specific\n functionality that can be fully encapsulated in the provider.\n */\n providerOptions?: ProviderOptions;\n\n /**\n * Internal. For test use only. May change without notice.\n */\n _internal?: {\n generateId?: () => string;\n currentDate?: () => Date;\n };\n },\n): Promise<GenerateObjectResult<RESULT>> {\n const {\n model: modelArg,\n output = 'object',\n system,\n prompt,\n messages,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n experimental_repairText: repairText,\n experimental_telemetry: telemetry,\n providerOptions,\n _internal: {\n generateId = originalGenerateId,\n currentDate = () => new Date(),\n } = {},\n ...settings\n } = options;\n\n const model = resolveLanguageModel(modelArg);\n\n const enumValues = 'enum' in options ? options.enum : undefined;\n const {\n schema: inputSchema,\n schemaDescription,\n schemaName,\n } = 'schema' in options ? options : {};\n\n validateObjectGenerationInput({\n output,\n schema: inputSchema,\n schemaName,\n schemaDescription,\n enumValues,\n });\n\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const outputStrategy = getOutputStrategy({\n output,\n schema: inputSchema,\n enumValues,\n });\n\n const callSettings = prepareCallSettings(settings);\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries },\n });\n\n const tracer = getTracer(telemetry);\n\n try {\n return await recordSpan({\n name: 'ai.generateObject',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.generateObject',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n 'ai.prompt': {\n input: () => JSON.stringify({ system, prompt, messages }),\n },\n 'ai.schema':\n outputStrategy.jsonSchema != null\n ? { input: () => JSON.stringify(outputStrategy.jsonSchema) }\n : undefined,\n 'ai.schema.name': schemaName,\n 'ai.schema.description': schemaDescription,\n 'ai.settings.output': outputStrategy.type,\n },\n }),\n tracer,\n fn: async span => {\n let result: string;\n let finishReason: FinishReason;\n let usage: LanguageModelUsage;\n let warnings: CallWarning[] | undefined;\n let response: LanguageModelResponseMetadata;\n let request: LanguageModelRequestMetadata;\n let resultProviderMetadata: ProviderMetadata | undefined;\n\n const standardizedPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n });\n\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: standardizedPrompt,\n supportedUrls: await model.supportedUrls,\n });\n\n const generateResult = await retry(() =>\n recordSpan({\n name: 'ai.generateObject.doGenerate',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.generateObject.doGenerate',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.prompt.messages': {\n input: () => stringifyForTelemetry(promptMessages),\n },\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.system': model.provider,\n 'gen_ai.request.model': model.modelId,\n 'gen_ai.request.frequency_penalty':\n callSettings.frequencyPenalty,\n 'gen_ai.request.max_tokens': callSettings.maxOutputTokens,\n 'gen_ai.request.presence_penalty': callSettings.presencePenalty,\n 'gen_ai.request.temperature': callSettings.temperature,\n 'gen_ai.request.top_k': callSettings.topK,\n 'gen_ai.request.top_p': callSettings.topP,\n },\n }),\n tracer,\n fn: async span => {\n const result = await model.doGenerate({\n responseFormat: {\n type: 'json',\n schema: outputStrategy.jsonSchema,\n name: schemaName,\n description: schemaDescription,\n },\n ...prepareCallSettings(settings),\n prompt: promptMessages,\n providerOptions,\n abortSignal,\n headers,\n });\n\n const responseData = {\n id: result.response?.id ?? generateId(),\n timestamp: result.response?.timestamp ?? currentDate(),\n modelId: result.response?.modelId ?? model.modelId,\n headers: result.response?.headers,\n body: result.response?.body,\n };\n\n const text = extractContentText(result.content);\n\n if (text === undefined) {\n throw new NoObjectGeneratedError({\n message:\n 'No object generated: the model did not return a response.',\n response: responseData,\n usage: result.usage,\n finishReason: result.finishReason,\n });\n }\n\n // Add response information to the span:\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.response.finishReason': result.finishReason,\n 'ai.response.object': { output: () => text },\n 'ai.response.id': responseData.id,\n 'ai.response.model': responseData.modelId,\n 'ai.response.timestamp':\n responseData.timestamp.toISOString(),\n 'ai.response.providerMetadata': JSON.stringify(\n result.providerMetadata,\n ),\n\n // TODO rename telemetry attributes to inputTokens and outputTokens\n 'ai.usage.promptTokens': result.usage.inputTokens,\n 'ai.usage.completionTokens': result.usage.outputTokens,\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.response.finish_reasons': [result.finishReason],\n 'gen_ai.response.id': responseData.id,\n 'gen_ai.response.model': responseData.modelId,\n 'gen_ai.usage.input_tokens': result.usage.inputTokens,\n 'gen_ai.usage.output_tokens': result.usage.outputTokens,\n },\n }),\n );\n\n return { ...result, objectText: text, responseData };\n },\n }),\n );\n\n result = generateResult.objectText;\n finishReason = generateResult.finishReason;\n usage = generateResult.usage;\n warnings = generateResult.warnings;\n resultProviderMetadata = generateResult.providerMetadata;\n request = generateResult.request ?? {};\n response = generateResult.responseData;\n\n const object = await parseAndValidateObjectResultWithRepair(\n result,\n outputStrategy,\n repairText,\n {\n response,\n usage,\n finishReason,\n },\n );\n\n // Add response information to the span:\n span.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.response.finishReason': finishReason,\n 'ai.response.object': {\n output: () => JSON.stringify(object),\n },\n 'ai.response.providerMetadata': JSON.stringify(\n resultProviderMetadata,\n ),\n\n // TODO rename telemetry attributes to inputTokens and outputTokens\n 'ai.usage.promptTokens': usage.inputTokens,\n 'ai.usage.completionTokens': usage.outputTokens,\n },\n }),\n );\n\n return new DefaultGenerateObjectResult({\n object,\n finishReason,\n usage,\n warnings,\n request,\n response,\n providerMetadata: resultProviderMetadata,\n });\n },\n });\n } catch (error) {\n throw wrapGatewayError(error);\n }\n}\n\nclass DefaultGenerateObjectResult<T> implements GenerateObjectResult<T> {\n readonly object: GenerateObjectResult<T>['object'];\n readonly finishReason: GenerateObjectResult<T>['finishReason'];\n readonly usage: GenerateObjectResult<T>['usage'];\n readonly warnings: GenerateObjectResult<T>['warnings'];\n readonly providerMetadata: GenerateObjectResult<T>['providerMetadata'];\n readonly response: GenerateObjectResult<T>['response'];\n readonly request: GenerateObjectResult<T>['request'];\n\n constructor(options: {\n object: GenerateObjectResult<T>['object'];\n finishReason: GenerateObjectResult<T>['finishReason'];\n usage: GenerateObjectResult<T>['usage'];\n warnings: GenerateObjectResult<T>['warnings'];\n providerMetadata: GenerateObjectResult<T>['providerMetadata'];\n response: GenerateObjectResult<T>['response'];\n request: GenerateObjectResult<T>['request'];\n }) {\n this.object = options.object;\n this.finishReason = options.finishReason;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.response = options.response;\n this.request = options.request;\n }\n\n toJsonResponse(init?: ResponseInit): Response {\n return new Response(JSON.stringify(this.object), {\n status: init?.status ?? 200,\n headers: prepareHeaders(init?.headers, {\n 'content-type': 'application/json; charset=utf-8',\n }),\n });\n }\n}\n","import {\n isJSONArray,\n isJSONObject,\n JSONObject,\n JSONSchema7,\n JSONValue,\n TypeValidationError,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\nimport {\n asSchema,\n safeValidateTypes,\n Schema,\n ValidationResult,\n} from '@ai-sdk/provider-utils';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport { NoObjectGeneratedError } from '../error/no-object-generated-error';\nimport {\n AsyncIterableStream,\n createAsyncIterableStream,\n} from '../util/async-iterable-stream';\nimport { DeepPartial } from '../util/deep-partial';\nimport {\n FinishReason,\n LanguageModelResponseMetadata,\n LanguageModelUsage,\n} from '../types';\nimport { ObjectStreamPart } from './stream-object-result';\n\nexport interface OutputStrategy<PARTIAL, RESULT, ELEMENT_STREAM> {\n readonly type: 'object' | 'array' | 'enum' | 'no-schema';\n readonly jsonSchema: JSONSchema7 | undefined;\n\n validatePartialResult({\n value,\n textDelta,\n isFinalDelta,\n }: {\n value: JSONValue;\n textDelta: string;\n isFirstDelta: boolean;\n isFinalDelta: boolean;\n latestObject: PARTIAL | undefined;\n }): Promise<\n ValidationResult<{\n partial: PARTIAL;\n textDelta: string;\n }>\n >;\n validateFinalResult(\n value: JSONValue | undefined,\n context: {\n text: string;\n response: LanguageModelResponseMetadata;\n usage: LanguageModelUsage;\n },\n ): Promise<ValidationResult<RESULT>>;\n\n createElementStream(\n originalStream: ReadableStream<ObjectStreamPart<PARTIAL>>,\n ): ELEMENT_STREAM;\n}\n\nconst noSchemaOutputStrategy: OutputStrategy<JSONValue, JSONValue, never> = {\n type: 'no-schema',\n jsonSchema: undefined,\n\n async validatePartialResult({ value, textDelta }) {\n return { success: true, value: { partial: value, textDelta } };\n },\n\n async validateFinalResult(\n value: JSONValue | undefined,\n context: {\n text: string;\n response: LanguageModelResponseMetadata;\n usage: LanguageModelUsage;\n finishReason: FinishReason;\n },\n ): Promise<ValidationResult<JSONValue>> {\n return value === undefined\n ? {\n success: false,\n error: new NoObjectGeneratedError({\n message: 'No object generated: response did not match schema.',\n text: context.text,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason,\n }),\n }\n : { success: true, value };\n },\n\n createElementStream() {\n throw new UnsupportedFunctionalityError({\n functionality: 'element streams in no-schema mode',\n });\n },\n};\n\nconst objectOutputStrategy = <OBJECT>(\n schema: Schema<OBJECT>,\n): OutputStrategy<DeepPartial<OBJECT>, OBJECT, never> => ({\n type: 'object',\n jsonSchema: schema.jsonSchema,\n\n async validatePartialResult({ value, textDelta }) {\n return {\n success: true,\n value: {\n // Note: currently no validation of partial results:\n partial: value as DeepPartial<OBJECT>,\n textDelta,\n },\n };\n },\n\n async validateFinalResult(\n value: JSONValue | undefined,\n ): Promise<ValidationResult<OBJECT>> {\n return safeValidateTypes({ value, schema });\n },\n\n createElementStream() {\n throw new UnsupportedFunctionalityError({\n functionality: 'element streams in object mode',\n });\n },\n});\n\nconst arrayOutputStrategy = <ELEMENT>(\n schema: Schema<ELEMENT>,\n): OutputStrategy<ELEMENT[], ELEMENT[], AsyncIterableStream<ELEMENT>> => {\n // remove $schema from schema.jsonSchema:\n const { $schema, ...itemSchema } = schema.jsonSchema;\n\n return {\n type: 'enum',\n\n // wrap in object that contains array of elements, since most LLMs will not\n // be able to generate an array directly:\n // possible future optimization: use arrays directly when model supports grammar-guided generation\n jsonSchema: {\n $schema: 'http://json-schema.org/draft-07/schema#',\n type: 'object',\n properties: {\n elements: { type: 'array', items: itemSchema },\n },\n required: ['elements'],\n additionalProperties: false,\n },\n\n async validatePartialResult({\n value,\n latestObject,\n isFirstDelta,\n isFinalDelta,\n }) {\n // check that the value is an object that contains an array of elements:\n if (!isJSONObject(value) || !isJSONArray(value.elements)) {\n return {\n success: false,\n error: new TypeValidationError({\n value,\n cause: 'value must be an object that contains an array of elements',\n }),\n };\n }\n\n const inputArray = value.elements as Array<JSONObject>;\n const resultArray: Array<ELEMENT> = [];\n\n for (let i = 0; i < inputArray.length; i++) {\n const element = inputArray[i];\n const result = await safeValidateTypes({ value: element, schema });\n\n // special treatment for last processed element:\n // ignore parse or validation failures, since they indicate that the\n // last element is incomplete and should not be included in the result,\n // unless it is the final delta\n if (i === inputArray.length - 1 && !isFinalDelta) {\n continue;\n }\n\n if (!result.success) {\n return result;\n }\n\n resultArray.push(result.value);\n }\n\n // calculate delta:\n const publishedElementCount = latestObject?.length ?? 0;\n\n let textDelta = '';\n\n if (isFirstDelta) {\n textDelta += '[';\n }\n\n if (publishedElementCount > 0) {\n textDelta += ',';\n }\n\n textDelta += resultArray\n .slice(publishedElementCount) // only new elements\n .map(element => JSON.stringify(element))\n .join(',');\n\n if (isFinalDelta) {\n textDelta += ']';\n }\n\n return {\n success: true,\n value: {\n partial: resultArray,\n textDelta,\n },\n };\n },\n\n async validateFinalResult(\n value: JSONValue | undefined,\n ): Promise<ValidationResult<Array<ELEMENT>>> {\n // check that the value is an object that contains an array of elements:\n if (!isJSONObject(value) || !isJSONArray(value.elements)) {\n return {\n success: false,\n error: new TypeValidationError({\n value,\n cause: 'value must be an object that contains an array of elements',\n }),\n };\n }\n\n const inputArray = value.elements as Array<JSONObject>;\n\n // check that each element in the array is of the correct type:\n for (const element of inputArray) {\n const result = await safeValidateTypes({ value: element, schema });\n if (!result.success) {\n return result;\n }\n }\n\n return { success: true, value: inputArray as Array<ELEMENT> };\n },\n\n createElementStream(\n originalStream: ReadableStream<ObjectStreamPart<ELEMENT[]>>,\n ) {\n let publishedElements = 0;\n\n return createAsyncIterableStream(\n originalStream.pipeThrough(\n new TransformStream<ObjectStreamPart<ELEMENT[]>, ELEMENT>({\n transform(chunk, controller) {\n switch (chunk.type) {\n case 'object': {\n const array = chunk.object;\n\n // publish new elements one by one:\n for (\n ;\n publishedElements < array.length;\n publishedElements++\n ) {\n controller.enqueue(array[publishedElements]);\n }\n\n break;\n }\n\n case 'text-delta':\n case 'finish':\n case 'error': // suppress error (use onError instead)\n break;\n\n default: {\n const _exhaustiveCheck: never = chunk;\n throw new Error(\n `Unsupported chunk type: ${_exhaustiveCheck}`,\n );\n }\n }\n },\n }),\n ),\n );\n },\n };\n};\n\nconst enumOutputStrategy = <ENUM extends string>(\n enumValues: Array<ENUM>,\n): OutputStrategy<string, ENUM, never> => {\n return {\n type: 'enum',\n\n // wrap in object that contains result, since most LLMs will not\n // be able to generate an enum value directly:\n // possible future optimization: use enums directly when model supports top-level enums\n jsonSchema: {\n $schema: 'http://json-schema.org/draft-07/schema#',\n type: 'object',\n properties: {\n result: { type: 'string', enum: enumValues },\n },\n required: ['result'],\n additionalProperties: false,\n },\n\n async validateFinalResult(\n value: JSONValue | undefined,\n ): Promise<ValidationResult<ENUM>> {\n // check that the value is an object that contains an array of elements:\n if (!isJSONObject(value) || typeof value.result !== 'string') {\n return {\n success: false,\n error: new TypeValidationError({\n value,\n cause:\n 'value must be an object that contains a string in the \"result\" property.',\n }),\n };\n }\n\n const result = value.result as string;\n\n return enumValues.includes(result as ENUM)\n ? { success: true, value: result as ENUM }\n : {\n success: false,\n error: new TypeValidationError({\n value,\n cause: 'value must be a string in the enum',\n }),\n };\n },\n\n async validatePartialResult({ value, textDelta }) {\n if (!isJSONObject(value) || typeof value.result !== 'string') {\n return {\n success: false,\n error: new TypeValidationError({\n value,\n cause:\n 'value must be an object that contains a string in the \"result\" property.',\n }),\n };\n }\n\n const result = value.result as string;\n const possibleEnumValues = enumValues.filter(enumValue =>\n enumValue.startsWith(result),\n );\n\n if (value.result.length === 0 || possibleEnumValues.length === 0) {\n return {\n success: false,\n error: new TypeValidationError({\n value,\n cause: 'value must be a string in the enum',\n }),\n };\n }\n\n return {\n success: true,\n value: {\n partial:\n possibleEnumValues.length > 1 ? result : possibleEnumValues[0],\n textDelta,\n },\n };\n },\n\n createElementStream() {\n // no streaming in enum mode\n throw new UnsupportedFunctionalityError({\n functionality: 'element streams in enum mode',\n });\n },\n };\n};\n\nexport function getOutputStrategy<SCHEMA>({\n output,\n schema,\n enumValues,\n}: {\n output: 'object' | 'array' | 'enum' | 'no-schema';\n schema?:\n | z4.core.$ZodType<SCHEMA, any>\n | z3.Schema<SCHEMA, z3.ZodTypeDef, any>\n | Schema<SCHEMA>;\n enumValues?: Array<SCHEMA>;\n}): OutputStrategy<any, any, any> {\n switch (output) {\n case 'object':\n return objectOutputStrategy(asSchema(schema!));\n case 'array':\n return arrayOutputStrategy(asSchema(schema!));\n case 'enum':\n return enumOutputStrategy(enumValues! as Array<string>);\n case 'no-schema':\n return noSchemaOutputStrategy;\n default: {\n const _exhaustiveCheck: never = output;\n throw new Error(`Unsupported output: ${_exhaustiveCheck}`);\n }\n }\n}\n","import { JSONParseError, TypeValidationError } from '@ai-sdk/provider';\nimport { safeParseJSON } from '@ai-sdk/provider-utils';\nimport { NoObjectGeneratedError } from '../error/no-object-generated-error';\nimport type {\n FinishReason,\n LanguageModelResponseMetadata,\n LanguageModelUsage,\n} from '../types';\nimport type { OutputStrategy } from './output-strategy';\nimport { RepairTextFunction } from './repair-text';\n\n/**\n * Parses and validates a result string by parsing it as JSON and validating against the output strategy.\n *\n * @param result - The result string to parse and validate\n * @param outputStrategy - The output strategy containing validation logic\n * @param context - Additional context for error reporting\n * @returns The validated result\n * @throws NoObjectGeneratedError if parsing or validation fails\n */\nasync function parseAndValidateObjectResult<RESULT>(\n result: string,\n outputStrategy: OutputStrategy<any, RESULT, any>,\n context: {\n response: LanguageModelResponseMetadata;\n usage: LanguageModelUsage;\n finishReason: FinishReason;\n },\n): Promise<RESULT> {\n const parseResult = await safeParseJSON({ text: result });\n\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: 'No object generated: could not parse the response.',\n cause: parseResult.error,\n text: result,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason,\n });\n }\n\n const validationResult = await outputStrategy.validateFinalResult(\n parseResult.value,\n {\n text: result,\n response: context.response,\n usage: context.usage,\n },\n );\n\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: 'No object generated: response did not match schema.',\n cause: validationResult.error,\n text: result,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason,\n });\n }\n\n return validationResult.value;\n}\n\n/**\n * Parses and validates a result string by parsing it as JSON and validating against the output strategy.\n * If the result cannot be parsed, it attempts to repair the result using the repairText function.\n *\n * @param result - The result string to parse and validate\n * @param outputStrategy - The output strategy containing validation logic\n * @param repairText - A function that attempts to repair the result string\n * @param context - Additional context for error reporting\n * @returns The validated result\n * @throws NoObjectGeneratedError if parsing or validation fails\n */\nexport async function parseAndValidateObjectResultWithRepair<RESULT>(\n result: string,\n outputStrategy: OutputStrategy<any, RESULT, any>,\n repairText: RepairTextFunction | undefined,\n context: {\n response: LanguageModelResponseMetadata;\n usage: LanguageModelUsage;\n finishReason: FinishReason;\n },\n): Promise<RESULT> {\n try {\n return await parseAndValidateObjectResult(result, outputStrategy, context);\n } catch (error) {\n if (\n repairText != null &&\n NoObjectGeneratedError.isInstance(error) &&\n (JSONParseError.isInstance(error.cause) ||\n TypeValidationError.isInstance(error.cause))\n ) {\n const repairedText = await repairText({\n text: result,\n error: error.cause,\n });\n if (repairedText === null) {\n throw error;\n }\n return await parseAndValidateObjectResult(\n repairedText,\n outputStrategy,\n context,\n );\n }\n throw error;\n }\n}\n","import { Schema } from '@ai-sdk/provider-utils';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport { InvalidArgumentError } from '../error/invalid-argument-error';\n\nexport function validateObjectGenerationInput({\n output,\n schema,\n schemaName,\n schemaDescription,\n enumValues,\n}: {\n output?: 'object' | 'array' | 'enum' | 'no-schema';\n schema?: z4.core.$ZodType | z3.Schema<any, z3.ZodTypeDef, any> | Schema<any>;\n schemaName?: string;\n schemaDescription?: string;\n enumValues?: Array<unknown>;\n}) {\n if (\n output != null &&\n output !== 'object' &&\n output !== 'array' &&\n output !== 'enum' &&\n output !== 'no-schema'\n ) {\n throw new InvalidArgumentError({\n parameter: 'output',\n value: output,\n message: 'Invalid output type.',\n });\n }\n\n if (output === 'no-schema') {\n if (schema != null) {\n throw new InvalidArgumentError({\n parameter: 'schema',\n value: schema,\n message: 'Schema is not supported for no-schema output.',\n });\n }\n\n if (schemaDescription != null) {\n throw new InvalidArgumentError({\n parameter: 'schemaDescription',\n value: schemaDescription,\n message: 'Schema description is not supported for no-schema output.',\n });\n }\n\n if (schemaName != null) {\n throw new InvalidArgumentError({\n parameter: 'schemaName',\n value: schemaName,\n message: 'Schema name is not supported for no-schema output.',\n });\n }\n\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: 'enumValues',\n value: enumValues,\n message: 'Enum values are not supported for no-schema output.',\n });\n }\n }\n\n if (output === 'object') {\n if (schema == null) {\n throw new InvalidArgumentError({\n parameter: 'schema',\n value: schema,\n message: 'Schema is required for object output.',\n });\n }\n\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: 'enumValues',\n value: enumValues,\n message: 'Enum values are not supported for object output.',\n });\n }\n }\n\n if (output === 'array') {\n if (schema == null) {\n throw new InvalidArgumentError({\n parameter: 'schema',\n value: schema,\n message: 'Element schema is required for array output.',\n });\n }\n\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: 'enumValues',\n value: enumValues,\n message: 'Enum values are not supported for array output.',\n });\n }\n }\n\n if (output === 'enum') {\n if (schema != null) {\n throw new InvalidArgumentError({\n parameter: 'schema',\n value: schema,\n message: 'Schema is not supported for enum output.',\n });\n }\n\n if (schemaDescription != null) {\n throw new InvalidArgumentError({\n parameter: 'schemaDescription',\n value: schemaDescription,\n message: 'Schema description is not supported for enum output.',\n });\n }\n\n if (schemaName != null) {\n throw new InvalidArgumentError({\n parameter: 'schemaName',\n value: schemaName,\n message: 'Schema name is not supported for enum output.',\n });\n }\n\n if (enumValues == null) {\n throw new InvalidArgumentError({\n parameter: 'enumValues',\n value: enumValues,\n message: 'Enum values are required for enum output.',\n });\n }\n\n for (const value of enumValues) {\n if (typeof value !== 'string') {\n throw new InvalidArgumentError({\n parameter: 'enumValues',\n value,\n message: 'Enum values must be strings.',\n });\n }\n }\n }\n}\n","import {\n JSONValue,\n LanguageModelV2CallWarning,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2ProviderMetadata,\n} from '@ai-sdk/provider';\nimport {\n createIdGenerator,\n ProviderOptions,\n type InferSchema,\n type Schema,\n} from '@ai-sdk/provider-utils';\nimport { ServerResponse } from 'http';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport { resolveLanguageModel } from '../model/resolve-model';\nimport { CallSettings } from '../prompt/call-settings';\nimport { convertToLanguageModelPrompt } from '../prompt/convert-to-language-model-prompt';\nimport { prepareCallSettings } from '../prompt/prepare-call-settings';\nimport { Prompt } from '../prompt/prompt';\nimport { standardizePrompt } from '../prompt/standardize-prompt';\nimport { wrapGatewayError } from '../prompt/wrap-gateway-error';\nimport { assembleOperationName } from '../telemetry/assemble-operation-name';\nimport { getBaseTelemetryAttributes } from '../telemetry/get-base-telemetry-attributes';\nimport { getTracer } from '../telemetry/get-tracer';\nimport { recordSpan } from '../telemetry/record-span';\nimport { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';\nimport { stringifyForTelemetry } from '../telemetry/stringify-for-telemetry';\nimport { TelemetrySettings } from '../telemetry/telemetry-settings';\nimport { createTextStreamResponse } from '../text-stream/create-text-stream-response';\nimport { pipeTextStreamToResponse } from '../text-stream/pipe-text-stream-to-response';\nimport {\n CallWarning,\n FinishReason,\n LanguageModel,\n} from '../types/language-model';\nimport { LanguageModelRequestMetadata } from '../types/language-model-request-metadata';\nimport { LanguageModelResponseMetadata } from '../types/language-model-response-metadata';\nimport { ProviderMetadata } from '../types/provider-metadata';\nimport { LanguageModelUsage } from '../types/usage';\nimport { DeepPartial, isDeepEqualData, parsePartialJson } from '../util';\nimport {\n AsyncIterableStream,\n createAsyncIterableStream,\n} from '../util/async-iterable-stream';\nimport { createStitchableStream } from '../util/create-stitchable-stream';\nimport { DelayedPromise } from '../util/delayed-promise';\nimport { now as originalNow } from '../util/now';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { getOutputStrategy, OutputStrategy } from './output-strategy';\nimport { parseAndValidateObjectResultWithRepair } from './parse-and-validate-object-result';\nimport { RepairTextFunction } from './repair-text';\nimport { ObjectStreamPart, StreamObjectResult } from './stream-object-result';\nimport { validateObjectGenerationInput } from './validate-object-generation-input';\n\nconst originalGenerateId = createIdGenerator({ prefix: 'aiobj', size: 24 });\n\n/**\nCallback that is set using the `onError` option.\n\n@param event - The event that is passed to the callback.\n */\nexport type StreamObjectOnErrorCallback = (event: {\n error: unknown;\n}) => Promise<void> | void;\n\n/**\nCallback that is set using the `onFinish` option.\n\n@param event - The event that is passed to the callback.\n */\nexport type StreamObjectOnFinishCallback<RESULT> = (event: {\n /**\nThe token usage of the generated response.\n*/\n usage: LanguageModelUsage;\n\n /**\nThe generated object. Can be undefined if the final object does not match the schema.\n*/\n object: RESULT | undefined;\n\n /**\nOptional error object. This is e.g. a TypeValidationError when the final object does not match the schema.\n*/\n error: unknown | undefined;\n\n /**\nResponse metadata.\n */\n response: LanguageModelResponseMetadata;\n\n /**\nWarnings from the model provider (e.g. unsupported settings).\n*/\n warnings?: CallWarning[];\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 providerMetadata: ProviderMetadata | undefined;\n}) => Promise<void> | void;\n\n/**\nGenerate a structured, typed object for a given prompt and schema using a language model.\n\nThis function streams the output. If you do not want to stream the output, use `generateObject` instead.\n\n@param model - The language model to use.\n@param tools - Tools that are accessible to and can be called by the model. The model needs to support calling tools.\n\n@param system - A system message that will be part of the prompt.\n@param prompt - A simple text prompt. You can either use `prompt` or `messages` but not both.\n@param messages - A list of messages. You can either use `prompt` or `messages` but not both.\n\n@param maxOutputTokens - Maximum number of tokens to generate.\n@param temperature - Temperature setting.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topP - Nucleus sampling.\nThe value is passed through to the provider. The range depends on the provider and model.\nIt is recommended to set either `temperature` or `topP`, but not both.\n@param topK - Only sample from the top K options for each subsequent token.\nUsed to remove \"long tail\" low probability responses.\nRecommended for advanced use cases only. You usually only need to use temperature.\n@param presencePenalty - Presence penalty setting.\nIt affects the likelihood of the model to repeat information that is already in the prompt.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param frequencyPenalty - Frequency penalty setting.\nIt affects the likelihood of the model to repeatedly use the same words or phrases.\nThe value is passed through to the provider. The range depends on the provider and model.\n@param stopSequences - Stop sequences.\nIf set, the model will stop generating text when one of the stop sequences is generated.\n@param seed - The seed (integer) to use for random sampling.\nIf set and supported by the model, calls will generate deterministic results.\n\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@param schema - The schema of the object that the model should generate.\n@param schemaName - Optional name of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema name.\n@param schemaDescription - Optional description of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema description.\n\n@param output - The type of the output.\n\n- 'object': The output is an object.\n- 'array': The output is an array.\n- 'enum': The output is an enum.\n- 'no-schema': The output is not a schema.\n\n@param experimental_telemetry - Optional telemetry configuration (experimental).\n\n@param providerOptions - Additional provider-specific options. 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@returns\nA result object for accessing the partial object stream and additional information.\n */\nexport function streamObject<\n SCHEMA extends\n | z3.Schema\n | z4.core.$ZodType\n | Schema = z4.core.$ZodType<JSONValue>,\n OUTPUT extends\n | 'object'\n | 'array'\n | 'enum'\n | 'no-schema' = InferSchema<SCHEMA> extends string ? 'enum' : 'object',\n RESULT = OUTPUT extends 'array'\n ? Array<InferSchema<SCHEMA>>\n : InferSchema<SCHEMA>,\n>(\n options: Omit<CallSettings, 'stopSequences'> &\n Prompt &\n (OUTPUT extends 'enum'\n ? {\n /**\nThe enum values that the model should use.\n */\n enum: Array<RESULT>;\n mode?: 'json';\n output: 'enum';\n }\n : OUTPUT extends 'no-schema'\n ? {}\n : {\n /**\nThe schema of the object that the model should generate.\n */\n schema: SCHEMA;\n\n /**\nOptional name of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema name.\n */\n schemaName?: string;\n\n /**\nOptional description of the output that should be generated.\nUsed by some providers for additional LLM guidance, e.g.\nvia tool or schema description.\n */\n schemaDescription?: string;\n\n /**\nThe mode to use for object generation.\n\nThe schema is converted into a JSON schema and used in one of the following ways\n\n- 'auto': The provider will choose the best mode for the model.\n- 'tool': A tool with the JSON schema as parameters is provided and the provider is instructed to use it.\n- 'json': The JSON schema and an instruction are injected into the prompt. If the provider supports JSON mode, it is enabled. If the provider supports JSON grammars, the grammar is used.\n\nPlease note that most providers do not support all modes.\n\nDefault and recommended: 'auto' (best mode for the model).\n */\n mode?: 'auto' | 'json' | 'tool';\n }) & {\n output?: OUTPUT;\n\n /**\nThe language model to use.\n */\n model: LanguageModel;\n\n /**\nA function that attempts to repair the raw output of the model\nto enable JSON parsing.\n */\n experimental_repairText?: RepairTextFunction;\n\n /**\nOptional telemetry configuration (experimental).\n */\n\n experimental_telemetry?: TelemetrySettings;\n\n /**\nAdditional provider-specific options. 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\n /**\nCallback that is invoked when an error occurs during streaming.\nYou can use it to log errors.\nThe stream processing will pause until the callback promise is resolved.\n */\n onError?: StreamObjectOnErrorCallback;\n\n /**\nCallback that is called when the LLM response and the final object validation are finished.\n*/\n onFinish?: StreamObjectOnFinishCallback<RESULT>;\n\n /**\n * Internal. For test use only. May change without notice.\n */\n _internal?: {\n generateId?: () => string;\n currentDate?: () => Date;\n now?: () => number;\n };\n },\n): StreamObjectResult<\n OUTPUT extends 'enum'\n ? string\n : OUTPUT extends 'array'\n ? RESULT\n : DeepPartial<RESULT>,\n OUTPUT extends 'array' ? RESULT : RESULT,\n OUTPUT extends 'array'\n ? RESULT extends Array<infer U>\n ? AsyncIterableStream<U>\n : never\n : never\n> {\n const {\n model,\n output = 'object',\n system,\n prompt,\n messages,\n maxRetries,\n abortSignal,\n headers,\n experimental_repairText: repairText,\n experimental_telemetry: telemetry,\n providerOptions,\n onError = ({ error }: { error: unknown }) => {\n console.error(error);\n },\n onFinish,\n _internal: {\n generateId = originalGenerateId,\n currentDate = () => new Date(),\n now = originalNow,\n } = {},\n ...settings\n } = options;\n\n const enumValues =\n 'enum' in options && options.enum ? options.enum : undefined;\n\n const {\n schema: inputSchema,\n schemaDescription,\n schemaName,\n } = 'schema' in options ? options : {};\n\n validateObjectGenerationInput({\n output,\n schema: inputSchema,\n schemaName,\n schemaDescription,\n enumValues,\n });\n\n const outputStrategy = getOutputStrategy({\n output,\n schema: inputSchema,\n enumValues,\n });\n\n return new DefaultStreamObjectResult({\n model,\n telemetry,\n headers,\n settings,\n maxRetries,\n abortSignal,\n outputStrategy,\n system,\n prompt,\n messages,\n schemaName,\n schemaDescription,\n providerOptions,\n repairText,\n onError,\n onFinish,\n generateId,\n currentDate,\n now,\n });\n}\n\nclass DefaultStreamObjectResult<PARTIAL, RESULT, ELEMENT_STREAM>\n implements StreamObjectResult<PARTIAL, RESULT, ELEMENT_STREAM>\n{\n private readonly _object = new DelayedPromise<RESULT>();\n private readonly _usage = new DelayedPromise<LanguageModelUsage>();\n private readonly _providerMetadata = new DelayedPromise<\n ProviderMetadata | undefined\n >();\n private readonly _warnings = new DelayedPromise<CallWarning[] | undefined>();\n private readonly _request =\n new DelayedPromise<LanguageModelRequestMetadata>();\n private readonly _response =\n new DelayedPromise<LanguageModelResponseMetadata>();\n private readonly _finishReason = new DelayedPromise<FinishReason>();\n\n private readonly baseStream: ReadableStream<ObjectStreamPart<PARTIAL>>;\n\n private readonly outputStrategy: OutputStrategy<\n PARTIAL,\n RESULT,\n ELEMENT_STREAM\n >;\n\n constructor({\n model: modelArg,\n headers,\n telemetry,\n settings,\n maxRetries: maxRetriesArg,\n abortSignal,\n outputStrategy,\n system,\n prompt,\n messages,\n schemaName,\n schemaDescription,\n providerOptions,\n repairText,\n onError,\n onFinish,\n generateId,\n currentDate,\n now,\n }: {\n model: LanguageModel;\n telemetry: TelemetrySettings | undefined;\n headers: Record<string, string | undefined> | undefined;\n settings: Omit<CallSettings, 'abortSignal' | 'headers'>;\n maxRetries: number | undefined;\n abortSignal: AbortSignal | undefined;\n outputStrategy: OutputStrategy<PARTIAL, RESULT, ELEMENT_STREAM>;\n system: Prompt['system'];\n prompt: Prompt['prompt'];\n messages: Prompt['messages'];\n schemaName: string | undefined;\n schemaDescription: string | undefined;\n providerOptions: ProviderOptions | undefined;\n repairText: RepairTextFunction | undefined;\n onError: StreamObjectOnErrorCallback;\n onFinish: StreamObjectOnFinishCallback<RESULT> | undefined;\n generateId: () => string;\n currentDate: () => Date;\n now: () => number;\n }) {\n const model = resolveLanguageModel(modelArg);\n\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const callSettings = prepareCallSettings(settings);\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries },\n });\n\n const tracer = getTracer(telemetry);\n const self = this;\n\n const stitchableStream =\n createStitchableStream<ObjectStreamPart<PARTIAL>>();\n\n const eventProcessor = new TransformStream<\n ObjectStreamPart<PARTIAL>,\n ObjectStreamPart<PARTIAL>\n >({\n transform(chunk, controller) {\n controller.enqueue(chunk);\n\n if (chunk.type === 'error') {\n onError({ error: wrapGatewayError(chunk.error) });\n }\n },\n });\n\n this.baseStream = stitchableStream.stream.pipeThrough(eventProcessor);\n\n recordSpan({\n name: 'ai.streamObject',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.streamObject',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n 'ai.prompt': {\n input: () => JSON.stringify({ system, prompt, messages }),\n },\n 'ai.schema':\n outputStrategy.jsonSchema != null\n ? { input: () => JSON.stringify(outputStrategy.jsonSchema) }\n : undefined,\n 'ai.schema.name': schemaName,\n 'ai.schema.description': schemaDescription,\n 'ai.settings.output': outputStrategy.type,\n },\n }),\n tracer,\n endWhenDone: false,\n fn: async rootSpan => {\n const standardizedPrompt = await standardizePrompt({\n system,\n prompt,\n messages,\n });\n\n const callOptions = {\n responseFormat: {\n type: 'json' as const,\n schema: outputStrategy.jsonSchema,\n name: schemaName,\n description: schemaDescription,\n },\n ...prepareCallSettings(settings),\n prompt: await convertToLanguageModelPrompt({\n prompt: standardizedPrompt,\n supportedUrls: await model.supportedUrls,\n }),\n providerOptions,\n abortSignal,\n headers,\n includeRawChunks: false,\n };\n\n const transformer: Transformer<\n LanguageModelV2StreamPart,\n ObjectStreamInputPart\n > = {\n transform: (chunk, controller) => {\n switch (chunk.type) {\n case 'text-delta':\n controller.enqueue(chunk.delta);\n break;\n case 'response-metadata':\n case 'finish':\n case 'error':\n controller.enqueue(chunk);\n break;\n }\n },\n };\n\n const {\n result: { stream, response, request },\n doStreamSpan,\n startTimestampMs,\n } = await retry(() =>\n recordSpan({\n name: 'ai.streamObject.doStream',\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: 'ai.streamObject.doStream',\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.prompt.messages': {\n input: () => stringifyForTelemetry(callOptions.prompt),\n },\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.system': model.provider,\n 'gen_ai.request.model': model.modelId,\n 'gen_ai.request.frequency_penalty':\n callSettings.frequencyPenalty,\n 'gen_ai.request.max_tokens': callSettings.maxOutputTokens,\n 'gen_ai.request.presence_penalty': callSettings.presencePenalty,\n 'gen_ai.request.temperature': callSettings.temperature,\n 'gen_ai.request.top_k': callSettings.topK,\n 'gen_ai.request.top_p': callSettings.topP,\n },\n }),\n tracer,\n endWhenDone: false,\n fn: async doStreamSpan => ({\n startTimestampMs: now(),\n doStreamSpan,\n result: await model.doStream(callOptions),\n }),\n }),\n );\n\n self._request.resolve(request ?? {});\n\n // store information for onFinish callback:\n let warnings: LanguageModelV2CallWarning[] | undefined;\n let usage: LanguageModelUsage = {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n };\n let finishReason: LanguageModelV2FinishReason | undefined;\n let providerMetadata: ProviderMetadata | undefined;\n let object: RESULT | undefined;\n let error: unknown | undefined;\n\n // pipe chunks through a transformation stream that extracts metadata:\n let accumulatedText = '';\n let textDelta = '';\n let fullResponse: {\n id: string;\n timestamp: Date;\n modelId: string;\n } = {\n id: generateId(),\n timestamp: currentDate(),\n modelId: model.modelId,\n };\n\n // Keep track of raw parse result before type validation, since e.g. Zod might\n // change the object by mapping properties.\n let latestObjectJson: JSONValue | undefined = undefined;\n let latestObject: PARTIAL | undefined = undefined;\n let isFirstChunk = true;\n let isFirstDelta = true;\n\n const transformedStream = stream\n .pipeThrough(new TransformStream(transformer))\n .pipeThrough(\n new TransformStream<\n string | ObjectStreamInputPart,\n ObjectStreamPart<PARTIAL>\n >({\n async transform(chunk, controller): Promise<void> {\n if (\n typeof chunk === 'object' &&\n chunk.type === 'stream-start'\n ) {\n warnings = chunk.warnings;\n return; // stream start chunks are sent immediately and do not count as first chunk\n }\n\n // Telemetry event for first chunk:\n if (isFirstChunk) {\n const msToFirstChunk = now() - startTimestampMs;\n\n isFirstChunk = false;\n\n doStreamSpan.addEvent('ai.stream.firstChunk', {\n 'ai.stream.msToFirstChunk': msToFirstChunk,\n });\n\n doStreamSpan.setAttributes({\n 'ai.stream.msToFirstChunk': msToFirstChunk,\n });\n }\n\n // process partial text chunks\n if (typeof chunk === 'string') {\n accumulatedText += chunk;\n textDelta += chunk;\n\n const { value: currentObjectJson, state: parseState } =\n await parsePartialJson(accumulatedText);\n\n if (\n currentObjectJson !== undefined &&\n !isDeepEqualData(latestObjectJson, currentObjectJson)\n ) {\n const validationResult =\n await outputStrategy.validatePartialResult({\n value: currentObjectJson,\n textDelta,\n latestObject,\n isFirstDelta,\n isFinalDelta: parseState === 'successful-parse',\n });\n\n if (\n validationResult.success &&\n !isDeepEqualData(\n latestObject,\n validationResult.value.partial,\n )\n ) {\n // inside inner check to correctly parse the final element in array mode:\n latestObjectJson = currentObjectJson;\n latestObject = validationResult.value.partial;\n\n controller.enqueue({\n type: 'object',\n object: latestObject,\n });\n\n controller.enqueue({\n type: 'text-delta',\n textDelta: validationResult.value.textDelta,\n });\n\n textDelta = '';\n isFirstDelta = false;\n }\n }\n\n return;\n }\n\n switch (chunk.type) {\n case 'response-metadata': {\n fullResponse = {\n id: chunk.id ?? fullResponse.id,\n timestamp: chunk.timestamp ?? fullResponse.timestamp,\n modelId: chunk.modelId ?? fullResponse.modelId,\n };\n break;\n }\n\n case 'finish': {\n // send final text delta:\n if (textDelta !== '') {\n controller.enqueue({ type: 'text-delta', textDelta });\n }\n\n // store finish reason for telemetry:\n finishReason = chunk.finishReason;\n\n // store usage and metadata for promises and onFinish callback:\n usage = chunk.usage;\n providerMetadata = chunk.providerMetadata;\n\n controller.enqueue({\n ...chunk,\n usage,\n response: fullResponse,\n });\n\n // resolve promises that can be resolved now:\n self._usage.resolve(usage);\n self._providerMetadata.resolve(providerMetadata);\n self._response.resolve({\n ...fullResponse,\n headers: response?.headers,\n });\n self._finishReason.resolve(finishReason ?? 'unknown');\n\n try {\n object = await parseAndValidateObjectResultWithRepair(\n accumulatedText,\n outputStrategy,\n repairText,\n {\n response: fullResponse,\n usage,\n finishReason,\n },\n );\n self._object.resolve(object);\n } catch (e) {\n error = e;\n self._object.reject(e);\n }\n break;\n }\n\n default: {\n controller.enqueue(chunk);\n break;\n }\n }\n },\n\n // invoke onFinish callback and resolve toolResults promise when the stream is about to close:\n async flush(controller) {\n try {\n const finalUsage = usage ?? {\n promptTokens: NaN,\n completionTokens: NaN,\n totalTokens: NaN,\n };\n\n doStreamSpan.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.response.finishReason': finishReason,\n 'ai.response.object': {\n output: () => JSON.stringify(object),\n },\n 'ai.response.id': fullResponse.id,\n 'ai.response.model': fullResponse.modelId,\n 'ai.response.timestamp':\n fullResponse.timestamp.toISOString(),\n 'ai.response.providerMetadata':\n JSON.stringify(providerMetadata),\n\n 'ai.usage.inputTokens': finalUsage.inputTokens,\n 'ai.usage.outputTokens': finalUsage.outputTokens,\n 'ai.usage.totalTokens': finalUsage.totalTokens,\n 'ai.usage.reasoningTokens': finalUsage.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n finalUsage.cachedInputTokens,\n\n // standardized gen-ai llm span attributes:\n 'gen_ai.response.finish_reasons': [finishReason],\n 'gen_ai.response.id': fullResponse.id,\n 'gen_ai.response.model': fullResponse.modelId,\n 'gen_ai.usage.input_tokens': finalUsage.inputTokens,\n 'gen_ai.usage.output_tokens': finalUsage.outputTokens,\n },\n }),\n );\n\n // finish doStreamSpan before other operations for correct timing:\n doStreamSpan.end();\n\n // Add response information to the root span:\n rootSpan.setAttributes(\n selectTelemetryAttributes({\n telemetry,\n attributes: {\n 'ai.usage.inputTokens': finalUsage.inputTokens,\n 'ai.usage.outputTokens': finalUsage.outputTokens,\n 'ai.usage.totalTokens': finalUsage.totalTokens,\n 'ai.usage.reasoningTokens': finalUsage.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n finalUsage.cachedInputTokens,\n 'ai.response.object': {\n output: () => JSON.stringify(object),\n },\n 'ai.response.providerMetadata':\n JSON.stringify(providerMetadata),\n },\n }),\n );\n\n // call onFinish callback:\n await onFinish?.({\n usage: finalUsage,\n object,\n error,\n response: {\n ...fullResponse,\n headers: response?.headers,\n },\n warnings,\n providerMetadata,\n });\n } catch (error) {\n controller.enqueue({ type: 'error', error });\n } finally {\n rootSpan.end();\n }\n },\n }),\n );\n\n stitchableStream.addStream(transformedStream);\n },\n })\n .catch(error => {\n // add an empty stream with an error to break the stream:\n stitchableStream.addStream(\n new ReadableStream({\n start(controller) {\n controller.enqueue({ type: 'error', error });\n controller.close();\n },\n }),\n );\n })\n .finally(() => {\n stitchableStream.close();\n });\n\n this.outputStrategy = outputStrategy;\n }\n\n get object() {\n return this._object.promise;\n }\n\n get usage() {\n return this._usage.promise;\n }\n\n get providerMetadata() {\n return this._providerMetadata.promise;\n }\n\n get warnings() {\n return this._warnings.promise;\n }\n\n get request() {\n return this._request.promise;\n }\n\n get response() {\n return this._response.promise;\n }\n\n get finishReason() {\n return this._finishReason.promise;\n }\n\n get partialObjectStream(): AsyncIterableStream<PARTIAL> {\n return createAsyncIterableStream(\n this.baseStream.pipeThrough(\n new TransformStream<ObjectStreamPart<PARTIAL>, PARTIAL>({\n transform(chunk, controller) {\n switch (chunk.type) {\n case 'object':\n controller.enqueue(chunk.object);\n break;\n\n case 'text-delta':\n case 'finish':\n case 'error': // suppress error (use onError instead)\n break;\n\n default: {\n const _exhaustiveCheck: never = chunk;\n throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);\n }\n }\n },\n }),\n ),\n );\n }\n\n get elementStream(): ELEMENT_STREAM {\n return this.outputStrategy.createElementStream(this.baseStream);\n }\n\n get textStream(): AsyncIterableStream<string> {\n return createAsyncIterableStream(\n this.baseStream.pipeThrough(\n new TransformStream<ObjectStreamPart<PARTIAL>, string>({\n transform(chunk, controller) {\n switch (chunk.type) {\n case 'text-delta':\n controller.enqueue(chunk.textDelta);\n break;\n\n case 'object':\n case 'finish':\n case 'error': // suppress error (use onError instead)\n break;\n\n default: {\n const _exhaustiveCheck: never = chunk;\n throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);\n }\n }\n },\n }),\n ),\n );\n }\n\n get fullStream(): AsyncIterableStream<ObjectStreamPart<PARTIAL>> {\n return createAsyncIterableStream(this.baseStream);\n }\n\n pipeTextStreamToResponse(response: ServerResponse, init?: ResponseInit) {\n pipeTextStreamToResponse({\n response,\n textStream: this.textStream,\n ...init,\n });\n }\n\n toTextStreamResponse(init?: ResponseInit): Response {\n return createTextStreamResponse({\n textStream: this.textStream,\n ...init,\n });\n }\n}\n\nexport type ObjectStreamInputPart =\n | string\n | {\n type: 'stream-start';\n warnings: LanguageModelV2CallWarning[];\n }\n | {\n type: 'error';\n error: unknown;\n }\n | {\n type: 'response-metadata';\n id?: string;\n timestamp?: Date;\n modelId?: string;\n }\n | {\n type: 'finish';\n finishReason: LanguageModelV2FinishReason;\n usage: LanguageModelV2Usage;\n providerMetadata?: SharedV2ProviderMetadata;\n };\n","import { InvalidArgumentError } from '../error/invalid-argument-error';\n\n/**\n * Calculates the cosine similarity between two vectors. This is a useful metric for\n * comparing the similarity of two vectors such as embeddings.\n *\n * @param vector1 - The first vector.\n * @param vector2 - The second vector.\n *\n * @returns The cosine similarity between vector1 and vector2.\n * @returns 0 if either vector is the zero vector.\n *\n * @throws {InvalidArgumentError} If the vectors do not have the same length.\n */\nexport function cosineSimilarity(vector1: number[], vector2: number[]): number {\n if (vector1.length !== vector2.length) {\n throw new InvalidArgumentError({\n parameter: 'vector1,vector2',\n value: { vector1Length: vector1.length, vector2Length: vector2.length },\n message: `Vectors must have the same length`,\n });\n }\n\n const n = vector1.length;\n\n if (n === 0) {\n return 0; // Return 0 for empty vectors if no error is thrown\n }\n\n let magnitudeSquared1 = 0;\n let magnitudeSquared2 = 0;\n let dotProduct = 0;\n\n for (let i = 0; i < n; i++) {\n const value1 = vector1[i];\n const value2 = vector2[i];\n\n magnitudeSquared1 += value1 * value1;\n magnitudeSquared2 += value2 * value2;\n dotProduct += value1 * value2;\n }\n\n return magnitudeSquared1 === 0 || magnitudeSquared2 === 0\n ? 0\n : dotProduct /\n (Math.sqrt(magnitudeSquared1) * Math.sqrt(magnitudeSquared2));\n}\n","/**\n * Converts a data URL of type text/* to a text string.\n */\nexport function getTextFromDataUrl(dataUrl: string): string {\n const [header, base64Content] = dataUrl.split(',');\n const mediaType = header.split(';')[0].split(':')[1];\n\n if (mediaType == null || base64Content == null) {\n throw new Error('Invalid data URL format');\n }\n\n try {\n return window.atob(base64Content);\n } catch (error) {\n throw new Error(`Error decoding data URL`);\n }\n}\n","/**\n * Performs a deep-equal comparison of two parsed JSON objects.\n *\n * @param {any} obj1 - The first object to compare.\n * @param {any} obj2 - The second object to compare.\n * @returns {boolean} - Returns true if the two objects are deeply equal, false otherwise.\n */\nexport function isDeepEqualData(obj1: any, obj2: any): boolean {\n // Check for strict equality first\n if (obj1 === obj2) return true;\n\n // Check if either is null or undefined\n if (obj1 == null || obj2 == null) return false;\n\n // Check if both are objects\n if (typeof obj1 !== 'object' && typeof obj2 !== 'object')\n return obj1 === obj2;\n\n // If they are not strictly equal, they both need to be Objects\n if (obj1.constructor !== obj2.constructor) return false;\n\n // Special handling for Date objects\n if (obj1 instanceof Date && obj2 instanceof Date) {\n return obj1.getTime() === obj2.getTime();\n }\n\n // Handle arrays: compare length and then perform a recursive deep comparison on each item\n if (Array.isArray(obj1)) {\n if (obj1.length !== obj2.length) return false;\n for (let i = 0; i < obj1.length; i++) {\n if (!isDeepEqualData(obj1[i], obj2[i])) return false;\n }\n return true; // All array elements matched\n }\n\n // Compare the set of keys in each object\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length) return false;\n\n // Check each key-value pair recursively\n for (const key of keys1) {\n if (!keys2.includes(key)) return false;\n if (!isDeepEqualData(obj1[key], obj2[key])) return false;\n }\n\n return true; // All keys and values matched\n}\n","import { Job } from './job';\n\nexport class SerialJobExecutor {\n private queue: Array<Job> = [];\n private isProcessing = false;\n\n private async processQueue() {\n if (this.isProcessing) {\n return;\n }\n\n this.isProcessing = true;\n\n while (this.queue.length > 0) {\n await this.queue[0]();\n this.queue.shift();\n }\n\n this.isProcessing = false;\n }\n\n async run(job: Job): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.queue.push(async () => {\n try {\n await job();\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n\n void this.processQueue();\n });\n }\n}\n","import { delay as delayFunction } from '@ai-sdk/provider-utils';\n\n/**\n * Creates a ReadableStream that emits the provided values with an optional delay between each value.\n *\n * @param options - The configuration options\n * @param options.chunks - Array of values to be emitted by the stream\n * @param options.initialDelayInMs - Optional initial delay in milliseconds before emitting the first value (default: 0). Can be set to `null` to skip the initial delay. The difference between `initialDelayInMs: null` and `initialDelayInMs: 0` is that `initialDelayInMs: null` will emit the values without any delay, while `initialDelayInMs: 0` will emit the values with a delay of 0 milliseconds.\n * @param options.chunkDelayInMs - Optional delay in milliseconds between emitting each value (default: 0). Can be set to `null` to skip the delay. The difference between `chunkDelayInMs: null` and `chunkDelayInMs: 0` is that `chunkDelayInMs: null` will emit the values without any delay, while `chunkDelayInMs: 0` will emit the values with a delay of 0 milliseconds.\n * @returns A ReadableStream that emits the provided values\n */\nexport function simulateReadableStream<T>({\n chunks,\n initialDelayInMs = 0,\n chunkDelayInMs = 0,\n _internal,\n}: {\n chunks: T[];\n initialDelayInMs?: number | null;\n chunkDelayInMs?: number | null;\n _internal?: {\n delay?: (ms: number | null) => Promise<void>;\n };\n}): ReadableStream<T> {\n const delay = _internal?.delay ?? delayFunction;\n\n let index = 0;\n\n return new ReadableStream({\n async pull(controller) {\n if (index < chunks.length) {\n await delay(index === 0 ? initialDelayInMs : chunkDelayInMs);\n controller.enqueue(chunks[index++]);\n } else {\n controller.close();\n }\n },\n });\n}\n","import { AISDKError } from '@ai-sdk/provider';\nimport { SpeechModelResponseMetadata } from '../types/speech-model-response-metadata';\n\n/**\nError that is thrown when no speech audio was generated.\n */\nexport class NoSpeechGeneratedError extends AISDKError {\n readonly responses: Array<SpeechModelResponseMetadata>;\n\n constructor(options: { responses: Array<SpeechModelResponseMetadata> }) {\n super({\n name: 'AI_NoSpeechGeneratedError',\n message: 'No speech audio generated.',\n });\n\n this.responses = options.responses;\n }\n}\n","import {\n GeneratedFile,\n DefaultGeneratedFile,\n} from '../generate-text/generated-file';\n\n/**\n * A generated audio file.\n */\nexport interface GeneratedAudioFile extends GeneratedFile {\n /**\n * Audio format of the file (e.g., 'mp3', 'wav', etc.)\n */\n readonly format: string;\n}\n\nexport class DefaultGeneratedAudioFile\n extends DefaultGeneratedFile\n implements GeneratedAudioFile\n{\n readonly format: string;\n\n constructor({\n data,\n mediaType,\n }: {\n data: string | Uint8Array;\n mediaType: string;\n }) {\n super({ data, mediaType });\n let format = 'mp3';\n\n // If format is not provided, try to determine it from the media type\n if (mediaType) {\n const mediaTypeParts = mediaType.split('/');\n\n if (mediaTypeParts.length === 2) {\n // Handle special cases for audio formats\n if (mediaType !== 'audio/mpeg') {\n format = mediaTypeParts[1];\n }\n }\n }\n\n if (!format) {\n // TODO this should be an AI SDK error\n throw new Error(\n 'Audio format must be provided or determinable from media type',\n );\n }\n\n this.format = format;\n }\n}\n\nexport class DefaultGeneratedAudioFileWithType extends DefaultGeneratedAudioFile {\n readonly type = 'audio';\n\n constructor(options: {\n data: string | Uint8Array;\n mediaType: string;\n format: string;\n }) {\n super(options);\n }\n}\n","import { JSONValue, SpeechModelV2 } from '@ai-sdk/provider';\nimport { ProviderOptions } from '@ai-sdk/provider-utils';\nimport { NoSpeechGeneratedError } from '../error/no-speech-generated-error';\nimport {\n audioMediaTypeSignatures,\n detectMediaType,\n} from '../util/detect-media-type';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { UnsupportedModelVersionError } from '../error/unsupported-model-version-error';\nimport { SpeechWarning } from '../types/speech-model';\nimport { SpeechModelResponseMetadata } from '../types/speech-model-response-metadata';\nimport { SpeechResult } from './generate-speech-result';\nimport {\n DefaultGeneratedAudioFile,\n GeneratedAudioFile,\n} from './generated-audio-file';\n\n/**\nGenerates speech audio using a speech model.\n\n@param model - The speech model to use.\n@param text - The text to convert to speech.\n@param voice - The voice to use for speech generation.\n@param outputFormat - The output format to use for speech generation e.g. \"mp3\", \"wav\", etc.\n@param instructions - Instructions for the speech generation e.g. \"Speak in a slow and steady tone\".\n@param speed - The speed of the speech generation.\n@param providerOptions - Additional provider-specific options that are passed through to the provider\nas body parameters.\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@returns A result object that contains the generated audio data.\n */\nexport async function generateSpeech({\n model,\n text,\n voice,\n outputFormat,\n instructions,\n speed,\n language,\n providerOptions = {},\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n}: {\n /**\nThe speech model to use.\n */\n model: SpeechModelV2;\n\n /**\nThe text to convert to speech.\n */\n text: string;\n\n /**\nThe voice to use for speech generation.\n */\n voice?: string;\n\n /**\n * The desired output format for the audio e.g. \"mp3\", \"wav\", etc.\n */\n outputFormat?: 'mp3' | 'wav' | (string & {});\n\n /**\n Instructions for the speech generation e.g. \"Speak in a slow and steady tone\".\n */\n instructions?: string;\n\n /**\n The speed of the speech generation.\n */\n speed?: number;\n\n /**\n The language for speech generation. This should be an ISO 639-1 language code (e.g. \"en\", \"es\", \"fr\")\n or \"auto\" for automatic language detection. Provider support varies.\n */\n language?: string;\n\n /**\nAdditional provider-specific options that are passed through to the provider\nas body parameters.\n\nThe outer record is keyed by the provider name, and the inner\nrecord is keyed by the provider-specific metadata key.\n```ts\n{\n \"openai\": {}\n}\n```\n */\n providerOptions?: ProviderOptions;\n\n /**\nMaximum number of retries per speech model call. Set to 0 to disable retries.\n\n@default 2\n */\n maxRetries?: number;\n\n /**\nAbort signal.\n */\n abortSignal?: AbortSignal;\n\n /**\nAdditional headers to include in the request.\nOnly applicable for HTTP-based providers.\n */\n headers?: Record<string, string>;\n}): Promise<SpeechResult> {\n if (model.specificationVersion !== 'v2') {\n throw new UnsupportedModelVersionError({\n version: model.specificationVersion,\n provider: model.provider,\n modelId: model.modelId,\n });\n }\n\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const result = await retry(() =>\n model.doGenerate({\n text,\n voice,\n outputFormat,\n instructions,\n speed,\n language,\n abortSignal,\n headers,\n providerOptions,\n }),\n );\n\n if (!result.audio || result.audio.length === 0) {\n throw new NoSpeechGeneratedError({ responses: [result.response] });\n }\n\n return new DefaultSpeechResult({\n audio: new DefaultGeneratedAudioFile({\n data: result.audio,\n mediaType:\n detectMediaType({\n data: result.audio,\n signatures: audioMediaTypeSignatures,\n }) ?? 'audio/mp3',\n }),\n warnings: result.warnings,\n responses: [result.response],\n providerMetadata: result.providerMetadata,\n });\n}\n\nclass DefaultSpeechResult implements SpeechResult {\n readonly audio: GeneratedAudioFile;\n readonly warnings: Array<SpeechWarning>;\n readonly responses: Array<SpeechModelResponseMetadata>;\n readonly providerMetadata: Record<string, Record<string, JSONValue>>;\n\n constructor(options: {\n audio: GeneratedAudioFile;\n warnings: Array<SpeechWarning>;\n responses: Array<SpeechModelResponseMetadata>;\n providerMetadata: Record<string, Record<string, JSONValue>> | undefined;\n }) {\n this.audio = options.audio;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = options.providerMetadata ?? {};\n }\n}\n","import { LanguageModelV2CallOptions } from '@ai-sdk/provider';\nimport {\n asSchema,\n safeParseJSON,\n safeValidateTypes,\n Schema,\n} from '@ai-sdk/provider-utils';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport { NoObjectGeneratedError } from '../error/no-object-generated-error';\nimport { DeepPartial } from '../util/deep-partial';\nimport { parsePartialJson } from '../util/parse-partial-json';\nimport { FinishReason } from '../types/language-model';\nimport { LanguageModelResponseMetadata } from '../types/language-model-response-metadata';\nimport { LanguageModelUsage } from '../types/usage';\n\nexport interface Output<OUTPUT, PARTIAL> {\n readonly type: 'object' | 'text';\n\n responseFormat: LanguageModelV2CallOptions['responseFormat'];\n\n parsePartial(options: {\n text: string;\n }): Promise<{ partial: PARTIAL } | undefined>;\n\n parseOutput(\n options: { text: string },\n context: {\n response: LanguageModelResponseMetadata;\n usage: LanguageModelUsage;\n finishReason: FinishReason;\n },\n ): Promise<OUTPUT>;\n}\n\nexport const text = (): Output<string, string> => ({\n type: 'text',\n\n responseFormat: { type: 'text' },\n\n async parsePartial({ text }: { text: string }) {\n return { partial: text };\n },\n\n async parseOutput({ text }: { text: string }) {\n return text;\n },\n});\n\nexport const object = <OUTPUT>({\n schema: inputSchema,\n}: {\n schema:\n | z4.core.$ZodType<OUTPUT, any>\n | z3.Schema<OUTPUT, z3.ZodTypeDef, any>\n | Schema<OUTPUT>;\n}): Output<OUTPUT, DeepPartial<OUTPUT>> => {\n const schema = asSchema(inputSchema);\n\n return {\n type: 'object',\n\n responseFormat: {\n type: 'json',\n schema: schema.jsonSchema,\n },\n\n async parsePartial({ text }: { text: string }) {\n const result = await parsePartialJson(text);\n\n switch (result.state) {\n case 'failed-parse':\n case 'undefined-input':\n return undefined;\n\n case 'repaired-parse':\n case 'successful-parse':\n return {\n // Note: currently no validation of partial results:\n partial: result.value as DeepPartial<OUTPUT>,\n };\n\n default: {\n const _exhaustiveCheck: never = result.state;\n throw new Error(`Unsupported parse state: ${_exhaustiveCheck}`);\n }\n }\n },\n\n async parseOutput(\n { text }: { text: string },\n context: {\n response: LanguageModelResponseMetadata;\n usage: LanguageModelUsage;\n finishReason: FinishReason;\n },\n ) {\n const parseResult = await safeParseJSON({ text });\n\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: 'No object generated: could not parse the response.',\n cause: parseResult.error,\n text,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason,\n });\n }\n\n const validationResult = await safeValidateTypes({\n value: parseResult.value,\n schema,\n });\n\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: 'No object generated: response did not match schema.',\n cause: validationResult.error,\n text,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason,\n });\n }\n\n return validationResult.value;\n },\n };\n};\n","import { delay as originalDelay } from '@ai-sdk/provider-utils';\nimport { TextStreamPart } from './stream-text-result';\nimport { ToolSet } from './tool-set';\nimport { InvalidArgumentError } from '@ai-sdk/provider';\n\nconst CHUNKING_REGEXPS = {\n word: /\\S+\\s+/m,\n line: /\\n+/m,\n};\n\n/**\n * Detects the first chunk in a buffer.\n *\n * @param buffer - The buffer to detect the first chunk in.\n *\n * @returns The first detected chunk, or `undefined` if no chunk was detected.\n */\nexport type ChunkDetector = (buffer: string) => string | undefined | null;\n\n/**\n * Smooths text streaming output.\n *\n * @param delayInMs - The delay in milliseconds between each chunk. Defaults to 10ms. Can be set to `null` to skip the delay.\n * @param chunking - Controls how the text is chunked for streaming. Use \"word\" to stream word by word (default), \"line\" to stream line by line, or provide a custom RegExp pattern for custom chunking.\n *\n * @returns A transform stream that smooths text streaming output.\n */\nexport function smoothStream<TOOLS extends ToolSet>({\n delayInMs = 10,\n chunking = 'word',\n _internal: { delay = originalDelay } = {},\n}: {\n delayInMs?: number | null;\n chunking?: 'word' | 'line' | RegExp | ChunkDetector;\n /**\n * Internal. For test use only. May change without notice.\n */\n _internal?: {\n delay?: (delayInMs: number | null) => Promise<void>;\n };\n} = {}): (options: {\n tools: TOOLS;\n}) => TransformStream<TextStreamPart<TOOLS>, TextStreamPart<TOOLS>> {\n let detectChunk: ChunkDetector;\n\n if (typeof chunking === 'function') {\n detectChunk = buffer => {\n const match = chunking(buffer);\n\n if (match == null) {\n return null;\n }\n\n if (!match.length) {\n throw new Error(`Chunking function must return a non-empty string.`);\n }\n\n if (!buffer.startsWith(match)) {\n throw new Error(\n `Chunking function must return a match that is a prefix of the buffer. Received: \"${match}\" expected to start with \"${buffer}\"`,\n );\n }\n\n return match;\n };\n } else {\n const chunkingRegex =\n typeof chunking === 'string' ? CHUNKING_REGEXPS[chunking] : chunking;\n\n if (chunkingRegex == null) {\n throw new InvalidArgumentError({\n argument: 'chunking',\n message: `Chunking must be \"word\" or \"line\" or a RegExp. Received: ${chunking}`,\n });\n }\n\n detectChunk = buffer => {\n const match = chunkingRegex.exec(buffer);\n\n if (!match) {\n return null;\n }\n\n return buffer.slice(0, match.index) + match?.[0];\n };\n }\n\n return () => {\n let buffer = '';\n let id = '';\n\n return new TransformStream<TextStreamPart<TOOLS>, TextStreamPart<TOOLS>>({\n async transform(chunk, controller) {\n if (chunk.type !== 'text-delta') {\n if (buffer.length > 0) {\n controller.enqueue({ type: 'text-delta', text: buffer, id });\n buffer = '';\n }\n\n controller.enqueue(chunk);\n return;\n }\n\n if (chunk.id !== id && buffer.length > 0) {\n controller.enqueue({ type: 'text-delta', text: buffer, id });\n buffer = '';\n }\n\n buffer += chunk.text;\n id = chunk.id;\n\n let match;\n\n while ((match = detectChunk(buffer)) != null) {\n controller.enqueue({ type: 'text-delta', text: match, id });\n buffer = buffer.slice(match.length);\n\n await delay(delayInMs);\n }\n },\n });\n };\n}\n","import {\n LanguageModelV2CallOptions,\n LanguageModelV2Middleware,\n} from '@ai-sdk/provider';\nimport { mergeObjects } from '../util/merge-objects';\n\n/**\n * Applies default settings for a language model.\n */\nexport function defaultSettingsMiddleware({\n settings,\n}: {\n settings: Partial<{\n maxOutputTokens?: LanguageModelV2CallOptions['maxOutputTokens'];\n temperature?: LanguageModelV2CallOptions['temperature'];\n stopSequences?: LanguageModelV2CallOptions['stopSequences'];\n topP?: LanguageModelV2CallOptions['topP'];\n topK?: LanguageModelV2CallOptions['topK'];\n presencePenalty?: LanguageModelV2CallOptions['presencePenalty'];\n frequencyPenalty?: LanguageModelV2CallOptions['frequencyPenalty'];\n responseFormat?: LanguageModelV2CallOptions['responseFormat'];\n seed?: LanguageModelV2CallOptions['seed'];\n tools?: LanguageModelV2CallOptions['tools'];\n toolChoice?: LanguageModelV2CallOptions['toolChoice'];\n headers?: LanguageModelV2CallOptions['headers'];\n providerOptions?: LanguageModelV2CallOptions['providerOptions'];\n }>;\n}): LanguageModelV2Middleware {\n return {\n middlewareVersion: 'v2',\n transformParams: async ({ params }) => {\n return mergeObjects(settings, params) as LanguageModelV2CallOptions;\n },\n };\n}\n","/**\n * Returns the index of the start of the searchedText in the text, or null if it\n * is not found.\n */\nexport function getPotentialStartIndex(\n text: string,\n searchedText: string,\n): number | null {\n // Return null immediately if searchedText is empty.\n if (searchedText.length === 0) {\n return null;\n }\n\n // Check if the searchedText exists as a direct substring of text.\n const directIndex = text.indexOf(searchedText);\n if (directIndex !== -1) {\n return directIndex;\n }\n\n // Otherwise, look for the largest suffix of \"text\" that matches\n // a prefix of \"searchedText\". We go from the end of text inward.\n for (let i = text.length - 1; i >= 0; i--) {\n const suffix = text.substring(i);\n if (searchedText.startsWith(suffix)) {\n return i;\n }\n }\n\n return null;\n}\n","import type {\n LanguageModelV2Content,\n LanguageModelV2Middleware,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider';\nimport { getPotentialStartIndex } from '../util/get-potential-start-index';\n\n/**\n * Extract an XML-tagged reasoning section from the generated text and exposes it\n * as a `reasoning` property on the result.\n *\n * @param tagName - The name of the XML tag to extract reasoning from.\n * @param separator - The separator to use between reasoning and text sections.\n * @param startWithReasoning - Whether to start with reasoning tokens.\n */\nexport function extractReasoningMiddleware({\n tagName,\n separator = '\\n',\n startWithReasoning = false,\n}: {\n tagName: string;\n separator?: string;\n startWithReasoning?: boolean;\n}): LanguageModelV2Middleware {\n const openingTag = `<${tagName}>`;\n const closingTag = `<\\/${tagName}>`;\n\n return {\n middlewareVersion: 'v2',\n wrapGenerate: async ({ doGenerate }) => {\n const { content, ...rest } = await doGenerate();\n\n const transformedContent: LanguageModelV2Content[] = [];\n for (const part of content) {\n if (part.type !== 'text') {\n transformedContent.push(part);\n continue;\n }\n\n const text = startWithReasoning ? openingTag + part.text : part.text;\n\n const regexp = new RegExp(`${openingTag}(.*?)${closingTag}`, 'gs');\n const matches = Array.from(text.matchAll(regexp));\n\n if (!matches.length) {\n transformedContent.push(part);\n continue;\n }\n\n const reasoningText = matches.map(match => match[1]).join(separator);\n\n let textWithoutReasoning = text;\n for (let i = matches.length - 1; i >= 0; i--) {\n const match = matches[i];\n\n const beforeMatch = textWithoutReasoning.slice(0, match.index);\n const afterMatch = textWithoutReasoning.slice(\n match.index! + match[0].length,\n );\n\n textWithoutReasoning =\n beforeMatch +\n (beforeMatch.length > 0 && afterMatch.length > 0 ? separator : '') +\n afterMatch;\n }\n\n transformedContent.push({\n type: 'reasoning',\n text: reasoningText,\n });\n\n transformedContent.push({\n type: 'text',\n text: textWithoutReasoning,\n });\n }\n\n return { content: transformedContent, ...rest };\n },\n\n wrapStream: async ({ doStream }) => {\n const { stream, ...rest } = await doStream();\n\n const reasoningExtractions: Record<\n string,\n {\n isFirstReasoning: boolean;\n isFirstText: boolean;\n afterSwitch: boolean;\n isReasoning: boolean;\n buffer: string;\n idCounter: number;\n textId: string;\n }\n > = {};\n\n let delayedTextStart: LanguageModelV2StreamPart | undefined;\n\n return {\n stream: stream.pipeThrough(\n new TransformStream<\n LanguageModelV2StreamPart,\n LanguageModelV2StreamPart\n >({\n transform: (chunk, controller) => {\n // do not send `text-start` before `reasoning-start`\n // https://github.com/vercel/ai/issues/7774\n if (chunk.type === 'text-start') {\n delayedTextStart = chunk;\n return;\n }\n\n if (chunk.type === 'text-end' && delayedTextStart) {\n controller.enqueue(delayedTextStart);\n delayedTextStart = undefined;\n }\n\n if (chunk.type !== 'text-delta') {\n controller.enqueue(chunk);\n return;\n }\n\n if (reasoningExtractions[chunk.id] == null) {\n reasoningExtractions[chunk.id] = {\n isFirstReasoning: true,\n isFirstText: true,\n afterSwitch: false,\n isReasoning: startWithReasoning,\n buffer: '',\n idCounter: 0,\n textId: chunk.id,\n };\n }\n\n const activeExtraction = reasoningExtractions[chunk.id];\n\n activeExtraction.buffer += chunk.delta;\n\n function publish(text: string) {\n if (text.length > 0) {\n const prefix =\n activeExtraction.afterSwitch &&\n (activeExtraction.isReasoning\n ? !activeExtraction.isFirstReasoning\n : !activeExtraction.isFirstText)\n ? separator\n : '';\n\n if (\n activeExtraction.isReasoning &&\n (activeExtraction.afterSwitch ||\n activeExtraction.isFirstReasoning)\n ) {\n controller.enqueue({\n type: 'reasoning-start',\n id: `reasoning-${activeExtraction.idCounter}`,\n });\n }\n\n if (activeExtraction.isReasoning) {\n controller.enqueue({\n type: 'reasoning-delta',\n delta: prefix + text,\n id: `reasoning-${activeExtraction.idCounter}`,\n });\n } else {\n if (delayedTextStart) {\n controller.enqueue(delayedTextStart);\n delayedTextStart = undefined;\n }\n controller.enqueue({\n type: 'text-delta',\n delta: prefix + text,\n id: activeExtraction.textId,\n });\n }\n activeExtraction.afterSwitch = false;\n\n if (activeExtraction.isReasoning) {\n activeExtraction.isFirstReasoning = false;\n } else {\n activeExtraction.isFirstText = false;\n }\n }\n }\n\n do {\n const nextTag = activeExtraction.isReasoning\n ? closingTag\n : openingTag;\n\n const startIndex = getPotentialStartIndex(\n activeExtraction.buffer,\n nextTag,\n );\n\n // no opening or closing tag found, publish the buffer\n if (startIndex == null) {\n publish(activeExtraction.buffer);\n activeExtraction.buffer = '';\n break;\n }\n\n // publish text before the tag\n publish(activeExtraction.buffer.slice(0, startIndex));\n\n const foundFullMatch =\n startIndex + nextTag.length <= activeExtraction.buffer.length;\n\n if (foundFullMatch) {\n activeExtraction.buffer = activeExtraction.buffer.slice(\n startIndex + nextTag.length,\n );\n\n // reasoning part finished:\n if (activeExtraction.isReasoning) {\n controller.enqueue({\n type: 'reasoning-end',\n id: `reasoning-${activeExtraction.idCounter++}`,\n });\n }\n\n activeExtraction.isReasoning = !activeExtraction.isReasoning;\n activeExtraction.afterSwitch = true;\n } else {\n activeExtraction.buffer =\n activeExtraction.buffer.slice(startIndex);\n break;\n }\n } while (true);\n },\n }),\n ),\n ...rest,\n };\n },\n };\n}\n","import type {\n LanguageModelV2Middleware,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider';\n\n/**\n * Simulates streaming chunks with the response from a generate call.\n */\nexport function simulateStreamingMiddleware(): LanguageModelV2Middleware {\n return {\n middlewareVersion: 'v2',\n wrapStream: async ({ doGenerate }) => {\n const result = await doGenerate();\n\n let id = 0;\n\n const simulatedStream = new ReadableStream<LanguageModelV2StreamPart>({\n start(controller) {\n controller.enqueue({\n type: 'stream-start',\n warnings: result.warnings,\n });\n\n controller.enqueue({ type: 'response-metadata', ...result.response });\n\n for (const part of result.content) {\n switch (part.type) {\n case 'text': {\n if (part.text.length > 0) {\n controller.enqueue({ type: 'text-start', id: String(id) });\n controller.enqueue({\n type: 'text-delta',\n id: String(id),\n delta: part.text,\n });\n controller.enqueue({ type: 'text-end', id: String(id) });\n id++;\n }\n break;\n }\n case 'reasoning': {\n controller.enqueue({\n type: 'reasoning-start',\n id: String(id),\n providerMetadata: part.providerMetadata,\n });\n controller.enqueue({\n type: 'reasoning-delta',\n id: String(id),\n delta: part.text,\n });\n controller.enqueue({ type: 'reasoning-end', id: String(id) });\n id++;\n break;\n }\n default: {\n controller.enqueue(part);\n break;\n }\n }\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason: result.finishReason,\n usage: result.usage,\n providerMetadata: result.providerMetadata,\n });\n\n controller.close();\n },\n });\n\n return {\n stream: simulatedStream,\n request: result.request,\n response: result.response,\n };\n },\n };\n}\n","import {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2Middleware,\n} from '@ai-sdk/provider';\nimport { asArray } from '../util/as-array';\n\n/**\n * Wraps a LanguageModelV2 instance with middleware functionality.\n * This function allows you to apply middleware to transform parameters,\n * wrap generate operations, and wrap stream operations of a language model.\n *\n * @param options - Configuration options for wrapping the language model.\n * @param options.model - The original LanguageModelV2 instance to be wrapped.\n * @param options.middleware - The middleware to be applied to the language model. When multiple middlewares are provided, the first middleware will transform the input first, and the last middleware will be wrapped directly around the model.\n * @param options.modelId - Optional custom model ID to override the original model's ID.\n * @param options.providerId - Optional custom provider ID to override the original model's provider ID.\n * @returns A new LanguageModelV2 instance with middleware applied.\n */\nexport const wrapLanguageModel = ({\n model,\n middleware: middlewareArg,\n modelId,\n providerId,\n}: {\n model: LanguageModelV2;\n middleware: LanguageModelV2Middleware | LanguageModelV2Middleware[];\n modelId?: string;\n providerId?: string;\n}): LanguageModelV2 => {\n return asArray(middlewareArg)\n .reverse()\n .reduce((wrappedModel, middleware) => {\n return doWrap({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\n\nconst doWrap = ({\n model,\n middleware: {\n transformParams,\n wrapGenerate,\n wrapStream,\n overrideProvider,\n overrideModelId,\n overrideSupportedUrls,\n },\n modelId,\n providerId,\n}: {\n model: LanguageModelV2;\n middleware: LanguageModelV2Middleware;\n modelId?: string;\n providerId?: string;\n}): LanguageModelV2 => {\n async function doTransform({\n params,\n type,\n }: {\n params: LanguageModelV2CallOptions;\n type: 'generate' | 'stream';\n }) {\n return transformParams\n ? await transformParams({ params, type, model })\n : params;\n }\n\n return {\n specificationVersion: 'v2',\n\n provider: providerId ?? overrideProvider?.({ model }) ?? model.provider,\n modelId: modelId ?? overrideModelId?.({ model }) ?? model.modelId,\n supportedUrls: overrideSupportedUrls?.({ model }) ?? model.supportedUrls,\n\n async doGenerate(\n params: LanguageModelV2CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const transformedParams = await doTransform({ params, type: 'generate' });\n const doGenerate = async () => model.doGenerate(transformedParams);\n const doStream = async () => model.doStream(transformedParams);\n return wrapGenerate\n ? wrapGenerate({\n doGenerate,\n doStream,\n params: transformedParams,\n model,\n })\n : doGenerate();\n },\n\n async doStream(\n params: LanguageModelV2CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const transformedParams = await doTransform({ params, type: 'stream' });\n const doGenerate = async () => model.doGenerate(transformedParams);\n const doStream = async () => model.doStream(transformedParams);\n return wrapStream\n ? wrapStream({ doGenerate, doStream, params: transformedParams, model })\n : doStream();\n },\n };\n};\n","import type { LanguageModelV2Middleware, ProviderV2 } from '@ai-sdk/provider';\nimport { wrapLanguageModel } from './wrap-language-model';\n\n/**\n * Wraps a ProviderV2 instance with middleware functionality.\n * This function allows you to apply middleware to all language models\n * from the provider, enabling you to transform parameters, wrap generate\n * operations, and wrap stream operations for every language model.\n *\n * @param options - Configuration options for wrapping the provider.\n * @param options.provider - The original ProviderV2 instance to be wrapped.\n * @param options.languageModelMiddleware - The middleware to be applied to all language models from the provider. When multiple middlewares are provided, the first middleware will transform the input first, and the last middleware will be wrapped directly around the model.\n * @returns A new ProviderV2 instance with middleware applied to all language models.\n */\nexport function wrapProvider({\n provider,\n languageModelMiddleware,\n}: {\n provider: ProviderV2;\n languageModelMiddleware:\n | LanguageModelV2Middleware\n | LanguageModelV2Middleware[];\n}): ProviderV2 {\n const wrappedProvider = {\n languageModel(modelId: string) {\n let model = provider.languageModel(modelId);\n model = wrapLanguageModel({\n model,\n middleware: languageModelMiddleware,\n });\n return model;\n },\n textEmbeddingModel: provider.textEmbeddingModel,\n imageModel: provider.imageModel,\n transcriptionModel: provider.transcriptionModel,\n speechModel: provider.speechModel,\n };\n\n return wrappedProvider;\n}\n","import {\n EmbeddingModelV2,\n ImageModelV2,\n LanguageModelV2,\n NoSuchModelError,\n ProviderV2,\n SpeechModelV2,\n TranscriptionModelV2,\n} from '@ai-sdk/provider';\n\n/**\n * Creates a custom provider with specified language models, text embedding models, image models, transcription models, speech models, and an optional fallback provider.\n *\n * @param {Object} options - The options for creating the custom provider.\n * @param {Record<string, LanguageModel>} [options.languageModels] - A record of language models, where keys are model IDs and values are LanguageModel instances.\n * @param {Record<string, EmbeddingModel<string>>} [options.textEmbeddingModels] - A record of text embedding models, where keys are model IDs and values are EmbeddingModel<string> instances.\n * @param {Record<string, ImageModel>} [options.imageModels] - A record of image models, where keys are model IDs and values are ImageModel instances.\n * @param {Record<string, TranscriptionModel>} [options.transcriptionModels] - A record of transcription models, where keys are model IDs and values are TranscriptionModel instances.\n * @param {Record<string, SpeechModel>} [options.speechModels] - A record of speech models, where keys are model IDs and values are SpeechModel instances.\n * @param {Provider} [options.fallbackProvider] - An optional fallback provider to use when a requested model is not found in the custom provider.\n * @returns {Provider} A Provider object with languageModel, textEmbeddingModel, imageModel, transcriptionModel, and speechModel methods.\n *\n * @throws {NoSuchModelError} Throws when a requested model is not found and no fallback provider is available.\n */\nexport function customProvider<\n LANGUAGE_MODELS extends Record<string, LanguageModelV2>,\n EMBEDDING_MODELS extends Record<string, EmbeddingModelV2<string>>,\n IMAGE_MODELS extends Record<string, ImageModelV2>,\n TRANSCRIPTION_MODELS extends Record<string, TranscriptionModelV2>,\n SPEECH_MODELS extends Record<string, SpeechModelV2>,\n>({\n languageModels,\n textEmbeddingModels,\n imageModels,\n transcriptionModels,\n speechModels,\n fallbackProvider,\n}: {\n languageModels?: LANGUAGE_MODELS;\n textEmbeddingModels?: EMBEDDING_MODELS;\n imageModels?: IMAGE_MODELS;\n transcriptionModels?: TRANSCRIPTION_MODELS;\n speechModels?: SPEECH_MODELS;\n fallbackProvider?: ProviderV2;\n}): ProviderV2 & {\n languageModel(modelId: ExtractModelId<LANGUAGE_MODELS>): LanguageModelV2;\n textEmbeddingModel(\n modelId: ExtractModelId<EMBEDDING_MODELS>,\n ): EmbeddingModelV2<string>;\n imageModel(modelId: ExtractModelId<IMAGE_MODELS>): ImageModelV2;\n transcriptionModel(\n modelId: ExtractModelId<TRANSCRIPTION_MODELS>,\n ): TranscriptionModelV2;\n speechModel(modelId: ExtractModelId<SPEECH_MODELS>): SpeechModelV2;\n} {\n return {\n languageModel(modelId: ExtractModelId<LANGUAGE_MODELS>): LanguageModelV2 {\n if (languageModels != null && modelId in languageModels) {\n return languageModels[modelId];\n }\n\n if (fallbackProvider) {\n return fallbackProvider.languageModel(modelId);\n }\n\n throw new NoSuchModelError({ modelId, modelType: 'languageModel' });\n },\n\n textEmbeddingModel(\n modelId: ExtractModelId<EMBEDDING_MODELS>,\n ): EmbeddingModelV2<string> {\n if (textEmbeddingModels != null && modelId in textEmbeddingModels) {\n return textEmbeddingModels[modelId];\n }\n\n if (fallbackProvider) {\n return fallbackProvider.textEmbeddingModel(modelId);\n }\n\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n },\n\n imageModel(modelId: ExtractModelId<IMAGE_MODELS>): ImageModelV2 {\n if (imageModels != null && modelId in imageModels) {\n return imageModels[modelId];\n }\n\n if (fallbackProvider?.imageModel) {\n return fallbackProvider.imageModel(modelId);\n }\n\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n },\n\n transcriptionModel(\n modelId: ExtractModelId<TRANSCRIPTION_MODELS>,\n ): TranscriptionModelV2 {\n if (transcriptionModels != null && modelId in transcriptionModels) {\n return transcriptionModels[modelId];\n }\n\n if (fallbackProvider?.transcriptionModel) {\n return fallbackProvider.transcriptionModel(modelId);\n }\n\n throw new NoSuchModelError({ modelId, modelType: 'transcriptionModel' });\n },\n\n speechModel(modelId: ExtractModelId<SPEECH_MODELS>): SpeechModelV2 {\n if (speechModels != null && modelId in speechModels) {\n return speechModels[modelId];\n }\n\n if (fallbackProvider?.speechModel) {\n return fallbackProvider.speechModel(modelId);\n }\n\n throw new NoSuchModelError({ modelId, modelType: 'speechModel' });\n },\n };\n}\n\n/**\n * @deprecated Use `customProvider` instead.\n */\nexport const experimental_customProvider = customProvider;\n\ntype ExtractModelId<MODELS extends Record<string, unknown>> = Extract<\n keyof MODELS,\n string\n>;\n","import { AISDKError, NoSuchModelError } from '@ai-sdk/provider';\n\nconst name = 'AI_NoSuchProviderError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class NoSuchProviderError extends NoSuchModelError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly providerId: string;\n readonly availableProviders: string[];\n\n constructor({\n modelId,\n modelType,\n providerId,\n availableProviders,\n message = `No such provider: ${providerId} (available providers: ${availableProviders.join()})`,\n }: {\n modelId: string;\n modelType:\n | 'languageModel'\n | 'textEmbeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel';\n providerId: string;\n availableProviders: string[];\n message?: string;\n }) {\n super({ errorName: name, modelId, modelType, message });\n\n this.providerId = providerId;\n this.availableProviders = availableProviders;\n }\n\n static isInstance(error: unknown): error is NoSuchProviderError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import {\n EmbeddingModelV2,\n ImageModelV2,\n LanguageModelV2,\n LanguageModelV2Middleware,\n NoSuchModelError,\n ProviderV2,\n SpeechModelV2,\n TranscriptionModelV2,\n} from '@ai-sdk/provider';\nimport { NoSuchProviderError } from './no-such-provider-error';\nimport { wrapLanguageModel } from '../middleware/wrap-language-model';\n\ntype ExtractLiteralUnion<T> = T extends string\n ? string extends T\n ? never\n : T\n : never;\n\nexport interface ProviderRegistryProvider<\n PROVIDERS extends Record<string, ProviderV2> = Record<string, ProviderV2>,\n SEPARATOR extends string = ':',\n> {\n languageModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string\n ? `${KEY & string}${SEPARATOR}${ExtractLiteralUnion<Parameters<NonNullable<PROVIDERS[KEY]['languageModel']>>[0]>}`\n : never,\n ): LanguageModelV2;\n languageModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string ? `${KEY & string}${SEPARATOR}${string}` : never,\n ): LanguageModelV2;\n\n textEmbeddingModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string\n ? `${KEY & string}${SEPARATOR}${ExtractLiteralUnion<Parameters<NonNullable<PROVIDERS[KEY]['textEmbeddingModel']>>[0]>}`\n : never,\n ): EmbeddingModelV2<string>;\n textEmbeddingModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string ? `${KEY & string}${SEPARATOR}${string}` : never,\n ): EmbeddingModelV2<string>;\n\n imageModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string\n ? `${KEY & string}${SEPARATOR}${ExtractLiteralUnion<Parameters<NonNullable<PROVIDERS[KEY]['imageModel']>>[0]>}`\n : never,\n ): ImageModelV2;\n imageModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string ? `${KEY & string}${SEPARATOR}${string}` : never,\n ): ImageModelV2;\n\n transcriptionModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string\n ? `${KEY & string}${SEPARATOR}${ExtractLiteralUnion<Parameters<NonNullable<PROVIDERS[KEY]['transcriptionModel']>>[0]>}`\n : never,\n ): TranscriptionModelV2;\n transcriptionModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string ? `${KEY & string}${SEPARATOR}${string}` : never,\n ): TranscriptionModelV2;\n\n speechModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string\n ? `${KEY & string}${SEPARATOR}${ExtractLiteralUnion<Parameters<NonNullable<PROVIDERS[KEY]['speechModel']>>[0]>}`\n : never,\n ): SpeechModelV2;\n speechModel<KEY extends keyof PROVIDERS>(\n id: KEY extends string ? `${KEY & string}${SEPARATOR}${string}` : never,\n ): SpeechModelV2;\n}\n\n/**\n * Creates a registry for the given providers with optional middleware functionality.\n * This function allows you to register multiple providers and optionally apply middleware\n * to all language models from the registry, enabling you to transform parameters, wrap generate\n * operations, and wrap stream operations for every language model accessed through the registry.\n *\n * @param providers - A record of provider instances to be registered in the registry.\n * @param options - Configuration options for the provider registry.\n * @param options.separator - The separator used between provider ID and model ID in the combined identifier. Defaults to ':'.\n * @param options.languageModelMiddleware - Optional middleware to be applied to all language models from the registry. When multiple middlewares are provided, the first middleware will transform the input first, and the last middleware will be wrapped directly around the model.\n * @returns A new ProviderRegistryProvider instance that provides access to all registered providers with optional middleware applied to language models.\n */\nexport function createProviderRegistry<\n PROVIDERS extends Record<string, ProviderV2>,\n SEPARATOR extends string = ':',\n>(\n providers: PROVIDERS,\n {\n separator = ':' as SEPARATOR,\n languageModelMiddleware,\n }: {\n separator?: SEPARATOR;\n languageModelMiddleware?:\n | LanguageModelV2Middleware\n | LanguageModelV2Middleware[];\n } = {},\n): ProviderRegistryProvider<PROVIDERS, SEPARATOR> {\n const registry = new DefaultProviderRegistry<PROVIDERS, SEPARATOR>({\n separator,\n languageModelMiddleware,\n });\n\n for (const [id, provider] of Object.entries(providers)) {\n registry.registerProvider({ id, provider } as {\n id: keyof PROVIDERS;\n provider: PROVIDERS[keyof PROVIDERS];\n });\n }\n\n return registry;\n}\n\n/**\n * @deprecated Use `createProviderRegistry` instead.\n */\nexport const experimental_createProviderRegistry = createProviderRegistry;\n\nclass DefaultProviderRegistry<\n PROVIDERS extends Record<string, ProviderV2>,\n SEPARATOR extends string,\n> implements ProviderRegistryProvider<PROVIDERS, SEPARATOR>\n{\n private providers: PROVIDERS = {} as PROVIDERS;\n private separator: SEPARATOR;\n private languageModelMiddleware?:\n | LanguageModelV2Middleware\n | LanguageModelV2Middleware[];\n\n constructor({\n separator,\n languageModelMiddleware,\n }: {\n separator: SEPARATOR;\n languageModelMiddleware?:\n | LanguageModelV2Middleware\n | LanguageModelV2Middleware[];\n }) {\n this.separator = separator;\n this.languageModelMiddleware = languageModelMiddleware;\n }\n\n registerProvider<K extends keyof PROVIDERS>({\n id,\n provider,\n }: {\n id: K;\n provider: PROVIDERS[K];\n }): void {\n this.providers[id] = provider;\n }\n\n private getProvider(\n id: string,\n modelType:\n | 'languageModel'\n | 'textEmbeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel',\n ): ProviderV2 {\n const provider = this.providers[id as keyof PROVIDERS];\n\n if (provider == null) {\n throw new NoSuchProviderError({\n modelId: id,\n modelType,\n providerId: id,\n availableProviders: Object.keys(this.providers),\n });\n }\n\n return provider;\n }\n\n private splitId(\n id: string,\n modelType:\n | 'languageModel'\n | 'textEmbeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel',\n ): [string, string] {\n const index = id.indexOf(this.separator);\n\n if (index === -1) {\n throw new NoSuchModelError({\n modelId: id,\n modelType,\n message:\n `Invalid ${modelType} id for registry: ${id} ` +\n `(must be in the format \"providerId${this.separator}modelId\")`,\n });\n }\n\n return [id.slice(0, index), id.slice(index + this.separator.length)];\n }\n\n languageModel<KEY extends keyof PROVIDERS>(\n id: `${KEY & string}${SEPARATOR}${string}`,\n ): LanguageModelV2 {\n const [providerId, modelId] = this.splitId(id, 'languageModel');\n let model = this.getProvider(providerId, 'languageModel').languageModel?.(\n modelId,\n );\n\n if (model == null) {\n throw new NoSuchModelError({ modelId: id, modelType: 'languageModel' });\n }\n\n if (this.languageModelMiddleware != null) {\n model = wrapLanguageModel({\n model,\n middleware: this.languageModelMiddleware,\n });\n }\n\n return model;\n }\n\n textEmbeddingModel<KEY extends keyof PROVIDERS>(\n id: `${KEY & string}${SEPARATOR}${string}`,\n ): EmbeddingModelV2<string> {\n const [providerId, modelId] = this.splitId(id, 'textEmbeddingModel');\n const provider = this.getProvider(providerId, 'textEmbeddingModel');\n\n const model = provider.textEmbeddingModel?.(modelId);\n\n if (model == null) {\n throw new NoSuchModelError({\n modelId: id,\n modelType: 'textEmbeddingModel',\n });\n }\n\n return model;\n }\n\n imageModel<KEY extends keyof PROVIDERS>(\n id: `${KEY & string}${SEPARATOR}${string}`,\n ): ImageModelV2 {\n const [providerId, modelId] = this.splitId(id, 'imageModel');\n const provider = this.getProvider(providerId, 'imageModel');\n\n const model = provider.imageModel?.(modelId);\n\n if (model == null) {\n throw new NoSuchModelError({ modelId: id, modelType: 'imageModel' });\n }\n\n return model;\n }\n\n transcriptionModel<KEY extends keyof PROVIDERS>(\n id: `${KEY & string}${SEPARATOR}${string}`,\n ): TranscriptionModelV2 {\n const [providerId, modelId] = this.splitId(id, 'transcriptionModel');\n const provider = this.getProvider(providerId, 'transcriptionModel');\n\n const model = provider.transcriptionModel?.(modelId);\n\n if (model == null) {\n throw new NoSuchModelError({\n modelId: id,\n modelType: 'transcriptionModel',\n });\n }\n\n return model;\n }\n\n speechModel<KEY extends keyof PROVIDERS>(\n id: `${KEY & string}${SEPARATOR}${string}`,\n ): SpeechModelV2 {\n const [providerId, modelId] = this.splitId(id, 'speechModel');\n const provider = this.getProvider(providerId, 'speechModel');\n\n const model = provider.speechModel?.(modelId);\n\n if (model == null) {\n throw new NoSuchModelError({ modelId: id, modelType: 'speechModel' });\n }\n\n return model;\n }\n}\n","import { JSONSchema7 } from '@ai-sdk/provider';\nimport {\n dynamicTool,\n jsonSchema,\n Tool,\n tool,\n ToolCallOptions,\n} from '@ai-sdk/provider-utils';\nimport { z, ZodType } from 'zod/v4';\nimport { MCPClientError } from '../../error/mcp-client-error';\nimport {\n JSONRPCError,\n JSONRPCNotification,\n JSONRPCRequest,\n JSONRPCResponse,\n} from './json-rpc-message';\nimport {\n createMcpTransport,\n isCustomMcpTransport,\n MCPTransport,\n MCPTransportConfig,\n} from './mcp-transport';\nimport {\n CallToolResult,\n CallToolResultSchema,\n Configuration as ClientConfiguration,\n InitializeResultSchema,\n LATEST_PROTOCOL_VERSION,\n ListToolsResult,\n ListToolsResultSchema,\n McpToolSet,\n Notification,\n PaginatedRequest,\n Request,\n RequestOptions,\n ServerCapabilities,\n SUPPORTED_PROTOCOL_VERSIONS,\n ToolSchemas,\n} from './types';\n\nconst CLIENT_VERSION = '1.0.0';\n\nexport interface MCPClientConfig {\n /** Transport configuration for connecting to the MCP server */\n transport: MCPTransportConfig | MCPTransport;\n /** Optional callback for uncaught errors */\n onUncaughtError?: (error: unknown) => void;\n /** Optional client name, defaults to 'ai-sdk-mcp-client' */\n name?: string;\n}\n\nexport async function createMCPClient(\n config: MCPClientConfig,\n): Promise<MCPClient> {\n const client = new DefaultMCPClient(config);\n await client.init();\n return client;\n}\n\nexport interface MCPClient {\n tools<TOOL_SCHEMAS extends ToolSchemas = 'automatic'>(options?: {\n schemas?: TOOL_SCHEMAS;\n }): Promise<McpToolSet<TOOL_SCHEMAS>>;\n\n close: () => Promise<void>;\n}\n\n/**\n * A lightweight MCP Client implementation\n *\n * The primary purpose of this client is tool conversion between MCP<>AI SDK\n * but can later be extended to support other MCP features\n *\n * Tool parameters are automatically inferred from the server's JSON schema\n * if not explicitly provided in the tools configuration\n *\n * This client is meant to be used to communicate with a single server. To communicate and fetch tools across multiple servers, it's recommended to create a new client instance per server.\n *\n * Not supported:\n * - Client options (e.g. sampling, roots) as they are not needed for tool conversion\n * - Accepting notifications\n * - Session management (when passing a sessionId to an instance of the Streamable HTTP transport)\n * - Resumable SSE streams\n */\nclass DefaultMCPClient implements MCPClient {\n private transport: MCPTransport;\n private onUncaughtError?: (error: unknown) => void;\n private clientInfo: ClientConfiguration;\n private requestMessageId = 0;\n private responseHandlers: Map<\n number,\n (response: JSONRPCResponse | Error) => void\n > = new Map();\n private serverCapabilities: ServerCapabilities = {};\n private isClosed = true;\n\n constructor({\n transport: transportConfig,\n name = 'ai-sdk-mcp-client',\n onUncaughtError,\n }: MCPClientConfig) {\n this.onUncaughtError = onUncaughtError;\n\n if (isCustomMcpTransport(transportConfig)) {\n this.transport = transportConfig;\n } else {\n this.transport = createMcpTransport(transportConfig);\n }\n\n this.transport.onclose = () => this.onClose();\n this.transport.onerror = (error: Error) => this.onError(error);\n this.transport.onmessage = message => {\n if ('method' in message) {\n // This lightweight client implementation does not support\n // receiving notifications or requests from server.\n // If we get an unsupported message, we can safely ignore it and pass to the onError handler:\n this.onError(\n new MCPClientError({\n message: 'Unsupported message type',\n }),\n );\n return;\n }\n\n this.onResponse(message);\n };\n\n this.clientInfo = {\n name,\n version: CLIENT_VERSION,\n };\n }\n\n async init(): Promise<this> {\n try {\n await this.transport.start();\n this.isClosed = false;\n\n const result = await this.request({\n request: {\n method: 'initialize',\n params: {\n protocolVersion: LATEST_PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: this.clientInfo,\n },\n },\n resultSchema: InitializeResultSchema,\n });\n\n if (result === undefined) {\n throw new MCPClientError({\n message: 'Server sent invalid initialize result',\n });\n }\n\n if (!SUPPORTED_PROTOCOL_VERSIONS.includes(result.protocolVersion)) {\n throw new MCPClientError({\n message: `Server's protocol version is not supported: ${result.protocolVersion}`,\n });\n }\n\n this.serverCapabilities = result.capabilities;\n\n // Complete initialization handshake:\n await this.notification({\n method: 'notifications/initialized',\n });\n\n return this;\n } catch (error) {\n await this.close();\n throw error;\n }\n }\n\n async close(): Promise<void> {\n if (this.isClosed) return;\n await this.transport?.close();\n this.onClose();\n }\n\n private assertCapability(method: string): void {\n switch (method) {\n case 'initialize':\n break;\n case 'tools/list':\n case 'tools/call':\n if (!this.serverCapabilities.tools) {\n throw new MCPClientError({\n message: `Server does not support tools`,\n });\n }\n break;\n default:\n throw new MCPClientError({\n message: `Unsupported method: ${method}`,\n });\n }\n }\n\n private async request<T extends ZodType<object>>({\n request,\n resultSchema,\n options,\n }: {\n request: Request;\n resultSchema: T;\n options?: RequestOptions;\n }): Promise<z.infer<T>> {\n return new Promise((resolve, reject) => {\n if (this.isClosed) {\n return reject(\n new MCPClientError({\n message: 'Attempted to send a request from a closed client',\n }),\n );\n }\n\n this.assertCapability(request.method);\n\n const signal = options?.signal;\n signal?.throwIfAborted();\n\n const messageId = this.requestMessageId++;\n const jsonrpcRequest: JSONRPCRequest = {\n ...request,\n jsonrpc: '2.0',\n id: messageId,\n };\n\n const cleanup = () => {\n this.responseHandlers.delete(messageId);\n };\n\n this.responseHandlers.set(messageId, response => {\n if (signal?.aborted) {\n return reject(\n new MCPClientError({\n message: 'Request was aborted',\n cause: signal.reason,\n }),\n );\n }\n\n if (response instanceof Error) {\n return reject(response);\n }\n\n try {\n const result = resultSchema.parse(response.result);\n resolve(result);\n } catch (error) {\n const parseError = new MCPClientError({\n message: 'Failed to parse server response',\n cause: error,\n });\n reject(parseError);\n }\n });\n\n this.transport.send(jsonrpcRequest).catch(error => {\n cleanup();\n reject(error);\n });\n });\n }\n\n private async listTools({\n params,\n options,\n }: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n } = {}): Promise<ListToolsResult> {\n try {\n return this.request({\n request: { method: 'tools/list', params },\n resultSchema: ListToolsResultSchema,\n options,\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async callTool({\n name,\n args,\n options,\n }: {\n name: string;\n args: Record<string, unknown>;\n options?: ToolCallOptions;\n }): Promise<CallToolResult> {\n try {\n return this.request({\n request: { method: 'tools/call', params: { name, arguments: args } },\n resultSchema: CallToolResultSchema,\n options: {\n signal: options?.abortSignal,\n },\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async notification(notification: Notification): Promise<void> {\n const jsonrpcNotification: JSONRPCNotification = {\n ...notification,\n jsonrpc: '2.0',\n };\n await this.transport.send(jsonrpcNotification);\n }\n\n /**\n * Returns a set of AI SDK tools from the MCP server\n * @returns A record of tool names to their implementations\n */\n async tools<TOOL_SCHEMAS extends ToolSchemas = 'automatic'>({\n schemas = 'automatic',\n }: {\n schemas?: TOOL_SCHEMAS;\n } = {}): Promise<McpToolSet<TOOL_SCHEMAS>> {\n const tools: Record<string, Tool> = {};\n\n try {\n const listToolsResult = await this.listTools();\n\n for (const { name, description, inputSchema } of listToolsResult.tools) {\n if (schemas !== 'automatic' && !(name in schemas)) {\n continue;\n }\n\n const self = this;\n\n const execute = async (\n args: any,\n options: ToolCallOptions,\n ): Promise<CallToolResult> => {\n options?.abortSignal?.throwIfAborted();\n return self.callTool({ name, args, options });\n };\n\n const toolWithExecute =\n schemas === 'automatic'\n ? dynamicTool({\n description,\n inputSchema: jsonSchema({\n ...inputSchema,\n properties: inputSchema.properties ?? {},\n additionalProperties: false,\n } as JSONSchema7),\n execute,\n })\n : tool({\n description,\n inputSchema: schemas[name].inputSchema,\n execute,\n });\n\n tools[name] = toolWithExecute;\n }\n\n return tools as McpToolSet<TOOL_SCHEMAS>;\n } catch (error) {\n throw error;\n }\n }\n\n private onClose(): void {\n if (this.isClosed) return;\n\n this.isClosed = true;\n const error = new MCPClientError({\n message: 'Connection closed',\n });\n\n for (const handler of this.responseHandlers.values()) {\n handler(error);\n }\n\n this.responseHandlers.clear();\n }\n\n private onError(error: unknown): void {\n if (this.onUncaughtError) {\n this.onUncaughtError(error);\n }\n }\n\n private onResponse(response: JSONRPCResponse | JSONRPCError): void {\n const messageId = Number(response.id);\n const handler = this.responseHandlers.get(messageId);\n\n if (handler === undefined) {\n throw new MCPClientError({\n message: `Protocol error: Received a response for an unknown message ID: ${JSON.stringify(\n response,\n )}`,\n });\n }\n\n this.responseHandlers.delete(messageId);\n\n handler(\n 'result' in response\n ? response\n : new MCPClientError({\n message: response.error.message,\n cause: response.error,\n }),\n );\n }\n}\n","import { EventSourceParserStream } from '@ai-sdk/provider-utils';\nimport { MCPClientError } from '../../error/mcp-client-error';\nimport { JSONRPCMessage, JSONRPCMessageSchema } from './json-rpc-message';\nimport { MCPTransport } from './mcp-transport';\n\nexport class SseMCPTransport implements MCPTransport {\n private endpoint?: URL;\n private abortController?: AbortController;\n private url: URL;\n private connected = false;\n private sseConnection?: {\n close: () => void;\n };\n private headers?: Record<string, string>;\n\n onclose?: () => void;\n onerror?: (error: unknown) => void;\n onmessage?: (message: JSONRPCMessage) => void;\n\n constructor({\n url,\n headers,\n }: {\n url: string;\n headers?: Record<string, string>;\n }) {\n this.url = new URL(url);\n this.headers = headers;\n }\n\n async start(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (this.connected) {\n return resolve();\n }\n\n this.abortController = new AbortController();\n\n const establishConnection = async () => {\n try {\n const headers = new Headers(this.headers);\n headers.set('Accept', 'text/event-stream');\n const response = await fetch(this.url.href, {\n headers,\n signal: this.abortController?.signal,\n });\n\n if (!response.ok || !response.body) {\n const error = new MCPClientError({\n message: `MCP SSE Transport Error: ${response.status} ${response.statusText}`,\n });\n this.onerror?.(error);\n return reject(error);\n }\n\n const stream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream());\n\n const reader = stream.getReader();\n\n const processEvents = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n if (this.connected) {\n this.connected = false;\n throw new MCPClientError({\n message:\n 'MCP SSE Transport Error: Connection closed unexpectedly',\n });\n }\n return;\n }\n\n const { event, data } = value;\n\n if (event === 'endpoint') {\n this.endpoint = new URL(data, this.url);\n\n if (this.endpoint.origin !== this.url.origin) {\n throw new MCPClientError({\n message: `MCP SSE Transport Error: Endpoint origin does not match connection origin: ${this.endpoint.origin}`,\n });\n }\n\n this.connected = true;\n resolve();\n } else if (event === 'message') {\n try {\n const message = JSONRPCMessageSchema.parse(\n JSON.parse(data),\n );\n this.onmessage?.(message);\n } catch (error) {\n const e = new MCPClientError({\n message:\n 'MCP SSE Transport Error: Failed to parse message',\n cause: error,\n });\n this.onerror?.(e);\n // We do not throw here so we continue processing events after reporting the error\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n\n this.onerror?.(error);\n reject(error);\n }\n };\n\n this.sseConnection = {\n close: () => reader.cancel(),\n };\n\n processEvents();\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n\n this.onerror?.(error);\n reject(error);\n }\n };\n\n establishConnection();\n });\n }\n\n async close(): Promise<void> {\n this.connected = false;\n this.sseConnection?.close();\n this.abortController?.abort();\n this.onclose?.();\n }\n\n async send(message: JSONRPCMessage): Promise<void> {\n if (!this.endpoint || !this.connected) {\n throw new MCPClientError({\n message: 'MCP SSE Transport Error: Not connected',\n });\n }\n\n try {\n const headers = new Headers(this.headers);\n headers.set('Content-Type', 'application/json');\n const init = {\n method: 'POST',\n headers,\n body: JSON.stringify(message),\n signal: this.abortController?.signal,\n };\n\n const response = await fetch(this.endpoint, init);\n\n if (!response.ok) {\n const text = await response.text().catch(() => null);\n const error = new MCPClientError({\n message: `MCP SSE Transport Error: POSTing to endpoint (HTTP ${response.status}): ${text}`,\n });\n this.onerror?.(error);\n return;\n }\n } catch (error) {\n this.onerror?.(error);\n return;\n }\n }\n}\n\nexport function deserializeMessage(line: string): JSONRPCMessage {\n return JSONRPCMessageSchema.parse(JSON.parse(line));\n}\n","import { z } from 'zod/v4';\nimport { BaseParamsSchema, RequestSchema, ResultSchema } from './types';\n\nconst JSONRPC_VERSION = '2.0';\n\nconst JSONRPCRequestSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n id: z.union([z.string(), z.number().int()]),\n })\n .merge(RequestSchema)\n .strict();\n\nexport type JSONRPCRequest = z.infer<typeof JSONRPCRequestSchema>;\n\nconst JSONRPCResponseSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n id: z.union([z.string(), z.number().int()]),\n result: ResultSchema,\n })\n .strict();\n\nexport type JSONRPCResponse = z.infer<typeof JSONRPCResponseSchema>;\n\nconst JSONRPCErrorSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n id: z.union([z.string(), z.number().int()]),\n error: z.object({\n code: z.number().int(),\n message: z.string(),\n data: z.optional(z.unknown()),\n }),\n })\n .strict();\n\nexport type JSONRPCError = z.infer<typeof JSONRPCErrorSchema>;\n\nconst JSONRPCNotificationSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n })\n .merge(\n z.object({\n method: z.string(),\n params: z.optional(BaseParamsSchema),\n }),\n )\n .strict();\n\nexport type JSONRPCNotification = z.infer<typeof JSONRPCNotificationSchema>;\n\nexport const JSONRPCMessageSchema = z.union([\n JSONRPCRequestSchema,\n JSONRPCNotificationSchema,\n JSONRPCResponseSchema,\n JSONRPCErrorSchema,\n]);\n\nexport type JSONRPCMessage = z.infer<typeof JSONRPCMessageSchema>;\n","import { z } from 'zod/v4';\nimport { JSONObject } from '@ai-sdk/provider';\nimport { FlexibleSchema, Tool } from '@ai-sdk/provider-utils';\n\nexport const LATEST_PROTOCOL_VERSION = '2025-06-18';\nexport const SUPPORTED_PROTOCOL_VERSIONS = [\n LATEST_PROTOCOL_VERSION,\n '2025-03-26',\n '2024-11-05',\n];\n\nexport type ToolSchemas =\n | Record<string, { inputSchema: FlexibleSchema<JSONObject | unknown> }>\n | 'automatic'\n | undefined;\n\nexport type McpToolSet<TOOL_SCHEMAS extends ToolSchemas = 'automatic'> =\n TOOL_SCHEMAS extends Record<string, { inputSchema: FlexibleSchema<any> }>\n ? {\n [K in keyof TOOL_SCHEMAS]: TOOL_SCHEMAS[K] extends {\n inputSchema: FlexibleSchema<infer INPUT>;\n }\n ? Tool<INPUT, CallToolResult> &\n Required<Pick<Tool<INPUT, CallToolResult>, 'execute'>>\n : never;\n }\n : McpToolSet<Record<string, { inputSchema: FlexibleSchema<unknown> }>>;\n\nconst ClientOrServerImplementationSchema = z.looseObject({\n name: z.string(),\n version: z.string(),\n});\n\nexport type Configuration = z.infer<typeof ClientOrServerImplementationSchema>;\n\nexport const BaseParamsSchema = z.looseObject({\n _meta: z.optional(z.object({}).loose()),\n});\ntype BaseParams = z.infer<typeof BaseParamsSchema>;\nexport const ResultSchema = BaseParamsSchema;\n\nexport const RequestSchema = z.object({\n method: z.string(),\n params: z.optional(BaseParamsSchema),\n});\nexport type Request = z.infer<typeof RequestSchema>;\nexport type RequestOptions = {\n signal?: AbortSignal;\n timeout?: number;\n maxTotalTimeout?: number;\n};\n\nexport type Notification = z.infer<typeof RequestSchema>;\n\nconst ServerCapabilitiesSchema = z.looseObject({\n experimental: z.optional(z.object({}).loose()),\n logging: z.optional(z.object({}).loose()),\n prompts: z.optional(\n z.looseObject({\n listChanged: z.optional(z.boolean()),\n }),\n ),\n resources: z.optional(\n z.looseObject({\n subscribe: z.optional(z.boolean()),\n listChanged: z.optional(z.boolean()),\n }),\n ),\n tools: z.optional(\n z.looseObject({\n listChanged: z.optional(z.boolean()),\n }),\n ),\n});\n\nexport type ServerCapabilities = z.infer<typeof ServerCapabilitiesSchema>;\n\nexport const InitializeResultSchema = ResultSchema.extend({\n protocolVersion: z.string(),\n capabilities: ServerCapabilitiesSchema,\n serverInfo: ClientOrServerImplementationSchema,\n instructions: z.optional(z.string()),\n});\nexport type InitializeResult = z.infer<typeof InitializeResultSchema>;\n\nexport type PaginatedRequest = Request & {\n params?: BaseParams & {\n cursor?: string;\n };\n};\n\nconst PaginatedResultSchema = ResultSchema.extend({\n nextCursor: z.optional(z.string()),\n});\n\nconst ToolSchema = z\n .object({\n name: z.string(),\n description: z.optional(z.string()),\n inputSchema: z\n .object({\n type: z.literal('object'),\n properties: z.optional(z.object({}).loose()),\n })\n .loose(),\n })\n .loose();\nexport type MCPTool = z.infer<typeof ToolSchema>;\nexport const ListToolsResultSchema = PaginatedResultSchema.extend({\n tools: z.array(ToolSchema),\n});\nexport type ListToolsResult = z.infer<typeof ListToolsResultSchema>;\n\nconst TextContentSchema = z\n .object({\n type: z.literal('text'),\n text: z.string(),\n })\n .loose();\nconst ImageContentSchema = z\n .object({\n type: z.literal('image'),\n data: z.base64(),\n mimeType: z.string(),\n })\n .loose();\nconst ResourceContentsSchema = z\n .object({\n /**\n * The URI of this resource.\n */\n uri: z.string(),\n /**\n * The MIME type of this resource, if known.\n */\n mimeType: z.optional(z.string()),\n })\n .loose();\nconst TextResourceContentsSchema = ResourceContentsSchema.extend({\n text: z.string(),\n});\nconst BlobResourceContentsSchema = ResourceContentsSchema.extend({\n blob: z.base64(),\n});\nconst EmbeddedResourceSchema = z\n .object({\n type: z.literal('resource'),\n resource: z.union([TextResourceContentsSchema, BlobResourceContentsSchema]),\n })\n .loose();\n\nexport const CallToolResultSchema = ResultSchema.extend({\n content: z.array(\n z.union([TextContentSchema, ImageContentSchema, EmbeddedResourceSchema]),\n ),\n isError: z.boolean().default(false).optional(),\n}).or(\n ResultSchema.extend({\n toolResult: z.unknown(),\n }),\n);\nexport type CallToolResult = z.infer<typeof CallToolResultSchema>;\n","import { MCPClientError } from '../../error/mcp-client-error';\nimport { JSONRPCMessage } from './json-rpc-message';\nimport { SseMCPTransport } from './mcp-sse-transport';\n\n/**\n * Transport interface for MCP (Model Context Protocol) communication.\n * Maps to the `Transport` interface in the MCP spec.\n */\nexport interface MCPTransport {\n /**\n * Initialize and start the transport\n */\n start(): Promise<void>;\n\n /**\n * Send a JSON-RPC message through the transport\n * @param message The JSON-RPC message to send\n */\n send(message: JSONRPCMessage): Promise<void>;\n\n /**\n * Clean up and close the transport\n */\n close(): Promise<void>;\n\n /**\n * Event handler for transport closure\n */\n onclose?: () => void;\n\n /**\n * Event handler for transport errors\n */\n onerror?: (error: Error) => void;\n\n /**\n * Event handler for received messages\n */\n onmessage?: (message: JSONRPCMessage) => void;\n}\n\nexport type MCPTransportConfig = {\n type: 'sse';\n\n /**\n * The URL of the MCP server.\n */\n url: string;\n\n /**\n * Additional HTTP headers to be sent with requests.\n */\n headers?: Record<string, string>;\n};\n\nexport function createMcpTransport(config: MCPTransportConfig): MCPTransport {\n if (config.type !== 'sse') {\n throw new MCPClientError({\n message:\n 'Unsupported or invalid transport configuration. If you are using a custom transport, make sure it implements the MCPTransport interface.',\n });\n }\n\n return new SseMCPTransport(config);\n}\n\nexport function isCustomMcpTransport(\n transport: MCPTransportConfig | MCPTransport,\n): transport is MCPTransport {\n return (\n 'start' in transport &&\n typeof transport.start === 'function' &&\n 'send' in transport &&\n typeof transport.send === 'function' &&\n 'close' in transport &&\n typeof transport.close === 'function'\n );\n}\n","import { AISDKError } from '@ai-sdk/provider';\nimport { TranscriptionModelResponseMetadata } from '../types/transcription-model-response-metadata';\n\n/**\nError that is thrown when no transcript was generated.\n */\nexport class NoTranscriptGeneratedError extends AISDKError {\n readonly responses: Array<TranscriptionModelResponseMetadata>;\n\n constructor(options: {\n responses: Array<TranscriptionModelResponseMetadata>;\n }) {\n super({\n name: 'AI_NoTranscriptGeneratedError',\n message: 'No transcript generated.',\n });\n\n this.responses = options.responses;\n }\n}\n","import { JSONValue, TranscriptionModelV2 } from '@ai-sdk/provider';\nimport { ProviderOptions } from '@ai-sdk/provider-utils';\nimport { NoTranscriptGeneratedError } from '../error/no-transcript-generated-error';\nimport {\n audioMediaTypeSignatures,\n detectMediaType,\n} from '../util/detect-media-type';\nimport { download } from '../util/download';\nimport { prepareRetries } from '../util/prepare-retries';\nimport { UnsupportedModelVersionError } from '../error/unsupported-model-version-error';\nimport { DataContent } from '../prompt';\nimport { convertDataContentToUint8Array } from '../prompt/data-content';\nimport { TranscriptionWarning } from '../types/transcription-model';\nimport { TranscriptionModelResponseMetadata } from '../types/transcription-model-response-metadata';\nimport { TranscriptionResult } from './transcribe-result';\n\n/**\nGenerates transcripts using a transcription model.\n\n@param model - The transcription model to use.\n@param audio - The audio data to transcribe as DataContent (string | Uint8Array | ArrayBuffer | Buffer) or a URL.\n@param providerOptions - Additional provider-specific options that are passed through to the provider\nas body parameters.\n@param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.\n@param abortSignal - An optional abort signal that can be used to cancel the call.\n@param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.\n\n@returns A result object that contains the generated transcript.\n */\nexport async function transcribe({\n model,\n audio,\n providerOptions = {},\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n}: {\n /**\nThe transcription model to use.\n */\n model: TranscriptionModelV2;\n\n /**\nThe audio data to transcribe.\n */\n audio: DataContent | URL;\n\n /**\nAdditional provider-specific options that are passed through to the provider\nas body parameters.\n\nThe outer record is keyed by the provider name, and the inner\nrecord is keyed by the provider-specific metadata key.\n```ts\n{\n \"openai\": {\n \"temperature\": 0\n }\n}\n```\n */\n providerOptions?: ProviderOptions;\n\n /**\nMaximum number of retries per transcript model call. Set to 0 to disable retries.\n\n@default 2\n */\n maxRetries?: number;\n\n /**\nAbort signal.\n */\n abortSignal?: AbortSignal;\n\n /**\nAdditional headers to include in the request.\nOnly applicable for HTTP-based providers.\n */\n headers?: Record<string, string>;\n}): Promise<TranscriptionResult> {\n if (model.specificationVersion !== 'v2') {\n throw new UnsupportedModelVersionError({\n version: model.specificationVersion,\n provider: model.provider,\n modelId: model.modelId,\n });\n }\n\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal,\n });\n\n const audioData =\n audio instanceof URL\n ? (await download({ url: audio })).data\n : convertDataContentToUint8Array(audio);\n\n const result = await retry(() =>\n model.doGenerate({\n audio: audioData,\n abortSignal,\n headers,\n providerOptions,\n mediaType:\n detectMediaType({\n data: audioData,\n signatures: audioMediaTypeSignatures,\n }) ?? 'audio/wav',\n }),\n );\n\n if (!result.text) {\n throw new NoTranscriptGeneratedError({ responses: [result.response] });\n }\n\n return new DefaultTranscriptionResult({\n text: result.text,\n segments: result.segments,\n language: result.language,\n durationInSeconds: result.durationInSeconds,\n warnings: result.warnings,\n responses: [result.response],\n providerMetadata: result.providerMetadata,\n });\n}\n\nclass DefaultTranscriptionResult implements TranscriptionResult {\n readonly text: string;\n readonly segments: Array<{\n text: string;\n startSecond: number;\n endSecond: number;\n }>;\n readonly language: string | undefined;\n readonly durationInSeconds: number | undefined;\n readonly warnings: Array<TranscriptionWarning>;\n readonly responses: Array<TranscriptionModelResponseMetadata>;\n readonly providerMetadata: Record<string, Record<string, JSONValue>>;\n\n constructor(options: {\n text: string;\n segments: Array<{\n text: string;\n startSecond: number;\n endSecond: number;\n }>;\n language: string | undefined;\n durationInSeconds: number | undefined;\n warnings: Array<TranscriptionWarning>;\n responses: Array<TranscriptionModelResponseMetadata>;\n providerMetadata: Record<string, Record<string, JSONValue>> | undefined;\n }) {\n this.text = options.text;\n this.segments = options.segments;\n this.language = options.language;\n this.durationInSeconds = options.durationInSeconds;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = options.providerMetadata ?? {};\n }\n}\n","import { parseJsonEventStream, ParseResult } from '@ai-sdk/provider-utils';\nimport {\n UIMessageChunk,\n uiMessageChunkSchema,\n} from '../ui-message-stream/ui-message-chunks';\nimport { consumeStream } from '../util/consume-stream';\nimport { processTextStream } from './process-text-stream';\n\n// use function to allow for mocking in tests:\nconst getOriginalFetch = () => fetch;\n\nexport async function callCompletionApi({\n api,\n prompt,\n credentials,\n headers,\n body,\n streamProtocol = 'data',\n setCompletion,\n setLoading,\n setError,\n setAbortController,\n onFinish,\n onError,\n fetch = getOriginalFetch(),\n}: {\n api: string;\n prompt: string;\n credentials: RequestCredentials | undefined;\n headers: HeadersInit | undefined;\n body: Record<string, any>;\n streamProtocol: 'data' | 'text' | undefined;\n setCompletion: (completion: string) => void;\n setLoading: (loading: boolean) => void;\n setError: (error: Error | undefined) => void;\n setAbortController: (abortController: AbortController | null) => void;\n onFinish: ((prompt: string, completion: string) => void) | undefined;\n onError: ((error: Error) => void) | undefined;\n fetch: ReturnType<typeof getOriginalFetch> | undefined;\n}) {\n try {\n setLoading(true);\n setError(undefined);\n\n const abortController = new AbortController();\n setAbortController(abortController);\n\n // Empty the completion immediately.\n setCompletion('');\n\n const response = await fetch(api, {\n method: 'POST',\n body: JSON.stringify({\n prompt,\n ...body,\n }),\n credentials,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n signal: abortController.signal,\n }).catch(err => {\n throw err;\n });\n\n if (!response.ok) {\n throw new Error(\n (await response.text()) ?? 'Failed to fetch the chat response.',\n );\n }\n\n if (!response.body) {\n throw new Error('The response body is empty.');\n }\n\n let result = '';\n\n switch (streamProtocol) {\n case 'text': {\n await processTextStream({\n stream: response.body,\n onTextPart: chunk => {\n result += chunk;\n setCompletion(result);\n },\n });\n break;\n }\n case 'data': {\n await consumeStream({\n stream: parseJsonEventStream({\n stream: response.body,\n schema: uiMessageChunkSchema,\n }).pipeThrough(\n new TransformStream<ParseResult<UIMessageChunk>, UIMessageChunk>({\n async transform(part) {\n if (!part.success) {\n throw part.error;\n }\n\n const streamPart = part.value;\n if (streamPart.type === 'text-delta') {\n result += streamPart.delta;\n setCompletion(result);\n } else if (streamPart.type === 'error') {\n throw new Error(streamPart.errorText);\n }\n },\n }),\n ),\n onError: error => {\n throw error;\n },\n });\n break;\n }\n default: {\n const exhaustiveCheck: never = streamProtocol;\n throw new Error(`Unknown stream protocol: ${exhaustiveCheck}`);\n }\n }\n\n if (onFinish) {\n onFinish(prompt, result);\n }\n\n setAbortController(null);\n return result;\n } catch (err) {\n // Ignore abort errors as they are expected.\n if ((err as any).name === 'AbortError') {\n setAbortController(null);\n return null;\n }\n\n if (err instanceof Error) {\n if (onError) {\n onError(err);\n }\n }\n\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n}\n","export async function processTextStream({\n stream,\n onTextPart,\n}: {\n stream: ReadableStream<Uint8Array>;\n onTextPart: (chunk: string) => Promise<void> | void;\n}): Promise<void> {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n await onTextPart(value);\n }\n}\n","import {\n generateId as generateIdFunc,\n IdGenerator,\n StandardSchemaV1,\n Validator,\n} from '@ai-sdk/provider-utils';\nimport { UIMessageChunk } from '../ui-message-stream/ui-message-chunks';\nimport { consumeStream } from '../util/consume-stream';\nimport { SerialJobExecutor } from '../util/serial-job-executor';\nimport { ChatTransport } from './chat-transport';\nimport { convertFileListToFileUIParts } from './convert-file-list-to-file-ui-parts';\nimport { DefaultChatTransport } from './default-chat-transport';\nimport {\n createStreamingUIMessageState,\n processUIMessageStream,\n StreamingUIMessageState,\n} from './process-ui-message-stream';\nimport {\n InferUIMessageToolCall,\n isToolUIPart,\n type DataUIPart,\n type FileUIPart,\n type InferUIMessageData,\n type InferUIMessageMetadata,\n type InferUIMessageTools,\n type UIDataTypes,\n type UIMessage,\n} from './ui-messages';\n\nexport type CreateUIMessage<UI_MESSAGE extends UIMessage> = Omit<\n UI_MESSAGE,\n 'id' | 'role'\n> & {\n id?: UI_MESSAGE['id'];\n role?: UI_MESSAGE['role'];\n};\n\nexport type UIDataPartSchemas = Record<\n string,\n Validator<any> | StandardSchemaV1<any>\n>;\n\nexport type UIDataTypesToSchemas<T extends UIDataTypes> = {\n [K in keyof T]: Validator<T[K]> | StandardSchemaV1<T[K]>;\n};\n\nexport type InferUIDataParts<T extends UIDataPartSchemas> = {\n [K in keyof T]: T[K] extends Validator<infer U>\n ? U\n : T[K] extends StandardSchemaV1<infer U>\n ? U\n : unknown;\n};\n\nexport type ChatRequestOptions = {\n /**\n Additional headers that should be to be passed to the API endpoint.\n */\n headers?: Record<string, string> | Headers;\n\n /**\n Additional body JSON properties that should be sent to the API endpoint.\n */\n body?: object; // TODO JSONStringifyable\n\n metadata?: unknown;\n};\n\nexport type ChatStatus = 'submitted' | 'streaming' | 'ready' | 'error';\n\ntype ActiveResponse<UI_MESSAGE extends UIMessage> = {\n state: StreamingUIMessageState<UI_MESSAGE>;\n abortController: AbortController;\n};\n\nexport interface ChatState<UI_MESSAGE extends UIMessage> {\n status: ChatStatus;\n\n error: Error | undefined;\n\n messages: UI_MESSAGE[];\n pushMessage: (message: UI_MESSAGE) => void;\n popMessage: () => void;\n replaceMessage: (index: number, message: UI_MESSAGE) => void;\n\n snapshot: <T>(thing: T) => T;\n}\n\nexport type ChatOnErrorCallback = (error: Error) => void;\n\nexport type ChatOnToolCallCallback<UI_MESSAGE extends UIMessage = UIMessage> =\n (options: {\n toolCall: InferUIMessageToolCall<UI_MESSAGE>;\n }) => void | PromiseLike<void>;\n\nexport type ChatOnDataCallback<UI_MESSAGE extends UIMessage> = (\n dataPart: DataUIPart<InferUIMessageData<UI_MESSAGE>>,\n) => void;\n\nexport type ChatOnFinishCallback<UI_MESSAGE extends UIMessage> = (options: {\n message: UI_MESSAGE;\n}) => void;\n\nexport interface ChatInit<UI_MESSAGE extends UIMessage> {\n /**\n * A unique identifier for the chat. If not provided, a random one will be\n * generated.\n */\n id?: string;\n\n messageMetadataSchema?:\n | Validator<InferUIMessageMetadata<UI_MESSAGE>>\n | StandardSchemaV1<InferUIMessageMetadata<UI_MESSAGE>>;\n dataPartSchemas?: UIDataTypesToSchemas<InferUIMessageData<UI_MESSAGE>>;\n\n messages?: UI_MESSAGE[];\n\n /**\n * A way to provide a function that is going to be used for ids for messages and the chat.\n * If not provided the default AI SDK `generateId` is used.\n */\n generateId?: IdGenerator;\n\n transport?: ChatTransport<UI_MESSAGE>;\n\n /**\n * Callback function to be called when an error is encountered.\n */\n onError?: ChatOnErrorCallback;\n\n /**\n Optional callback function that is invoked when a tool call is received.\n Intended for automatic client-side tool execution.\n\n You can optionally return a result for the tool call,\n either synchronously or asynchronously.\n */\n onToolCall?: ChatOnToolCallCallback<UI_MESSAGE>;\n\n /**\n * Optional callback function that is called when the assistant message is finished streaming.\n *\n * @param message The message that was streamed.\n */\n onFinish?: ChatOnFinishCallback<UI_MESSAGE>;\n\n /**\n * Optional callback function that is called when a data part is received.\n *\n * @param data The data part that was received.\n */\n onData?: ChatOnDataCallback<UI_MESSAGE>;\n\n /**\n * When provided, this function will be called when the stream is finished or a tool call is added\n * to determine if the current messages should be resubmitted.\n */\n sendAutomaticallyWhen?: (options: {\n messages: UI_MESSAGE[];\n }) => boolean | PromiseLike<boolean>;\n}\n\nexport abstract class AbstractChat<UI_MESSAGE extends UIMessage> {\n readonly id: string;\n readonly generateId: IdGenerator;\n\n protected state: ChatState<UI_MESSAGE>;\n\n private messageMetadataSchema:\n | Validator<InferUIMessageMetadata<UI_MESSAGE>>\n | StandardSchemaV1<InferUIMessageMetadata<UI_MESSAGE>>\n | undefined;\n private dataPartSchemas:\n | UIDataTypesToSchemas<InferUIMessageData<UI_MESSAGE>>\n | undefined;\n private readonly transport: ChatTransport<UI_MESSAGE>;\n private onError?: ChatInit<UI_MESSAGE>['onError'];\n private onToolCall?: ChatInit<UI_MESSAGE>['onToolCall'];\n private onFinish?: ChatInit<UI_MESSAGE>['onFinish'];\n private onData?: ChatInit<UI_MESSAGE>['onData'];\n private sendAutomaticallyWhen?: ChatInit<UI_MESSAGE>['sendAutomaticallyWhen'];\n\n private activeResponse: ActiveResponse<UI_MESSAGE> | undefined = undefined;\n private jobExecutor = new SerialJobExecutor();\n\n constructor({\n generateId = generateIdFunc,\n id = generateId(),\n transport = new DefaultChatTransport(),\n messageMetadataSchema,\n dataPartSchemas,\n state,\n onError,\n onToolCall,\n onFinish,\n onData,\n sendAutomaticallyWhen,\n }: Omit<ChatInit<UI_MESSAGE>, 'messages'> & {\n state: ChatState<UI_MESSAGE>;\n }) {\n this.id = id;\n this.transport = transport;\n this.generateId = generateId;\n this.messageMetadataSchema = messageMetadataSchema;\n this.dataPartSchemas = dataPartSchemas;\n this.state = state;\n this.onError = onError;\n this.onToolCall = onToolCall;\n this.onFinish = onFinish;\n this.onData = onData;\n this.sendAutomaticallyWhen = sendAutomaticallyWhen;\n }\n\n /**\n * Hook status:\n *\n * - `submitted`: The message has been sent to the API and we're awaiting the start of the response stream.\n * - `streaming`: The response is actively streaming in from the API, receiving chunks of data.\n * - `ready`: The full response has been received and processed; a new user message can be submitted.\n * - `error`: An error occurred during the API request, preventing successful completion.\n */\n get status(): ChatStatus {\n return this.state.status;\n }\n\n protected setStatus({\n status,\n error,\n }: {\n status: ChatStatus;\n error?: Error;\n }) {\n if (this.status === status) return;\n\n this.state.status = status;\n this.state.error = error;\n }\n\n get error() {\n return this.state.error;\n }\n\n get messages(): UI_MESSAGE[] {\n return this.state.messages;\n }\n\n get lastMessage(): UI_MESSAGE | undefined {\n return this.state.messages[this.state.messages.length - 1];\n }\n\n set messages(messages: UI_MESSAGE[]) {\n this.state.messages = messages;\n }\n\n /**\n * Appends or replaces a user message to the chat list. This triggers the API call to fetch\n * the assistant's response.\n *\n * If a messageId is provided, the message will be replaced.\n */\n sendMessage = async (\n message?:\n | (CreateUIMessage<UI_MESSAGE> & {\n text?: never;\n files?: never;\n messageId?: string;\n })\n | {\n text: string;\n files?: FileList | FileUIPart[];\n metadata?: InferUIMessageMetadata<UI_MESSAGE>;\n parts?: never;\n messageId?: string;\n }\n | {\n files: FileList | FileUIPart[];\n metadata?: InferUIMessageMetadata<UI_MESSAGE>;\n parts?: never;\n messageId?: string;\n },\n options?: ChatRequestOptions,\n ): Promise<void> => {\n if (message == null) {\n await this.makeRequest({\n trigger: 'submit-message',\n messageId: this.lastMessage?.id,\n ...options,\n });\n return;\n }\n\n let uiMessage: CreateUIMessage<UI_MESSAGE>;\n\n if ('text' in message || 'files' in message) {\n const fileParts = Array.isArray(message.files)\n ? message.files\n : await convertFileListToFileUIParts(message.files);\n\n uiMessage = {\n parts: [\n ...fileParts,\n ...('text' in message && message.text != null\n ? [{ type: 'text' as const, text: message.text }]\n : []),\n ],\n } as UI_MESSAGE;\n } else {\n uiMessage = message;\n }\n\n if (message.messageId != null) {\n const messageIndex = this.state.messages.findIndex(\n m => m.id === message.messageId,\n );\n\n if (messageIndex === -1) {\n throw new Error(`message with id ${message.messageId} not found`);\n }\n\n if (this.state.messages[messageIndex].role !== 'user') {\n throw new Error(\n `message with id ${message.messageId} is not a user message`,\n );\n }\n\n // remove all messages after the message with the given id\n this.state.messages = this.state.messages.slice(0, messageIndex + 1);\n\n // update the message with the new content\n this.state.replaceMessage(messageIndex, {\n ...uiMessage,\n id: message.messageId,\n role: uiMessage.role ?? 'user',\n metadata: message.metadata,\n } as UI_MESSAGE);\n } else {\n this.state.pushMessage({\n ...uiMessage,\n id: uiMessage.id ?? this.generateId(),\n role: uiMessage.role ?? 'user',\n metadata: message.metadata,\n } as UI_MESSAGE);\n }\n\n await this.makeRequest({\n trigger: 'submit-message',\n messageId: message.messageId,\n ...options,\n });\n };\n\n /**\n * Regenerate the assistant message with the provided message id.\n * If no message id is provided, the last assistant message will be regenerated.\n */\n regenerate = async ({\n messageId,\n ...options\n }: {\n messageId?: string;\n } & ChatRequestOptions = {}): Promise<void> => {\n const messageIndex =\n messageId == null\n ? this.state.messages.length - 1\n : this.state.messages.findIndex(message => message.id === messageId);\n\n if (messageIndex === -1) {\n throw new Error(`message ${messageId} not found`);\n }\n\n // set the messages to the message before the assistant message\n this.state.messages = this.state.messages.slice(\n 0,\n // if the message is a user message, we need to include it in the request:\n this.messages[messageIndex].role === 'assistant'\n ? messageIndex\n : messageIndex + 1,\n );\n\n await this.makeRequest({\n trigger: 'regenerate-message',\n messageId,\n ...options,\n });\n };\n\n /**\n * Attempt to resume an ongoing streaming response.\n */\n resumeStream = async (options: ChatRequestOptions = {}): Promise<void> => {\n await this.makeRequest({ trigger: 'resume-stream', ...options });\n };\n\n /**\n * Clear the error state and set the status to ready if the chat is in an error state.\n */\n clearError = () => {\n if (this.status === 'error') {\n this.state.error = undefined;\n this.setStatus({ status: 'ready' });\n }\n };\n\n addToolResult = async <TOOL extends keyof InferUIMessageTools<UI_MESSAGE>>({\n tool,\n toolCallId,\n output,\n }: {\n tool: TOOL;\n toolCallId: string;\n output: InferUIMessageTools<UI_MESSAGE>[TOOL]['output'];\n }) =>\n this.jobExecutor.run(async () => {\n const messages = this.state.messages;\n const lastMessage = messages[messages.length - 1];\n\n this.state.replaceMessage(messages.length - 1, {\n ...lastMessage,\n parts: lastMessage.parts.map(part =>\n isToolUIPart(part) && part.toolCallId === toolCallId\n ? { ...part, state: 'output-available', output }\n : part,\n ),\n });\n\n // update the active response if it exists\n if (this.activeResponse) {\n this.activeResponse.state.message.parts =\n this.activeResponse.state.message.parts.map(part =>\n isToolUIPart(part) && part.toolCallId === toolCallId\n ? {\n ...part,\n state: 'output-available',\n output,\n errorText: undefined,\n }\n : part,\n );\n }\n\n // automatically send the message if the sendAutomaticallyWhen function returns true\n if (\n this.status !== 'streaming' &&\n this.status !== 'submitted' &&\n this.sendAutomaticallyWhen?.({ messages: this.state.messages })\n ) {\n // no await to avoid deadlocking\n this.makeRequest({\n trigger: 'submit-message',\n messageId: this.lastMessage?.id,\n });\n }\n });\n\n /**\n * Abort the current request immediately, keep the generated tokens if any.\n */\n stop = async () => {\n if (this.status !== 'streaming' && this.status !== 'submitted') return;\n\n if (this.activeResponse?.abortController) {\n this.activeResponse.abortController.abort();\n }\n };\n\n private async makeRequest({\n trigger,\n metadata,\n headers,\n body,\n messageId,\n }: {\n trigger: 'submit-message' | 'resume-stream' | 'regenerate-message';\n messageId?: string;\n } & ChatRequestOptions) {\n this.setStatus({ status: 'submitted', error: undefined });\n\n const lastMessage = this.lastMessage;\n\n try {\n const activeResponse = {\n state: createStreamingUIMessageState({\n lastMessage: this.state.snapshot(lastMessage),\n messageId: this.generateId(),\n }),\n abortController: new AbortController(),\n } as ActiveResponse<UI_MESSAGE>;\n\n this.activeResponse = activeResponse;\n\n let stream: ReadableStream<UIMessageChunk>;\n\n if (trigger === 'resume-stream') {\n const reconnect = await this.transport.reconnectToStream({\n chatId: this.id,\n metadata,\n headers,\n body,\n });\n\n if (reconnect == null) {\n this.setStatus({ status: 'ready' });\n return; // no active stream found, so we do not resume\n }\n\n stream = reconnect;\n } else {\n stream = await this.transport.sendMessages({\n chatId: this.id,\n messages: this.state.messages,\n abortSignal: activeResponse.abortController.signal,\n metadata,\n headers,\n body,\n trigger,\n messageId,\n });\n }\n\n const runUpdateMessageJob = (\n job: (options: {\n state: StreamingUIMessageState<UI_MESSAGE>;\n write: () => void;\n }) => Promise<void>,\n ) =>\n // serialize the job execution to avoid race conditions:\n this.jobExecutor.run(() =>\n job({\n state: activeResponse.state,\n write: () => {\n // streaming is set on first write (before it should be \"submitted\")\n this.setStatus({ status: 'streaming' });\n\n const replaceLastMessage =\n activeResponse.state.message.id === this.lastMessage?.id;\n\n if (replaceLastMessage) {\n this.state.replaceMessage(\n this.state.messages.length - 1,\n activeResponse.state.message,\n );\n } else {\n this.state.pushMessage(activeResponse.state.message);\n }\n },\n }),\n );\n\n await consumeStream({\n stream: processUIMessageStream({\n stream,\n onToolCall: this.onToolCall,\n onData: this.onData,\n messageMetadataSchema: this.messageMetadataSchema,\n dataPartSchemas: this.dataPartSchemas,\n runUpdateMessageJob,\n onError: error => {\n throw error;\n },\n }),\n onError: error => {\n throw error;\n },\n });\n\n this.onFinish?.({ message: activeResponse.state.message });\n\n this.setStatus({ status: 'ready' });\n } catch (err) {\n // Ignore abort errors as they are expected.\n if ((err as any).name === 'AbortError') {\n this.setStatus({ status: 'ready' });\n return null;\n }\n\n if (this.onError && err instanceof Error) {\n this.onError(err);\n }\n\n this.setStatus({ status: 'error', error: err as Error });\n } finally {\n this.activeResponse = undefined;\n }\n\n // automatically send the message if the sendAutomaticallyWhen function returns true\n if (this.sendAutomaticallyWhen?.({ messages: this.state.messages })) {\n await this.makeRequest({\n trigger: 'submit-message',\n messageId: this.lastMessage?.id,\n metadata,\n headers,\n body,\n });\n }\n }\n}\n","import { FileUIPart } from './ui-messages';\n\nexport async function convertFileListToFileUIParts(\n files: FileList | undefined,\n): Promise<Array<FileUIPart>> {\n if (files == null) {\n return [];\n }\n\n // React-native doesn't have a FileList global:\n if (!globalThis.FileList || !(files instanceof globalThis.FileList)) {\n throw new Error('FileList is not supported in the current environment');\n }\n\n return Promise.all(\n Array.from(files).map(async file => {\n const { name, type } = file;\n\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = readerEvent => {\n resolve(readerEvent.target?.result as string);\n };\n reader.onerror = error => reject(error);\n reader.readAsDataURL(file);\n });\n\n return {\n type: 'file',\n mediaType: type,\n filename: name,\n url: dataUrl,\n };\n }),\n );\n}\n","import { parseJsonEventStream, ParseResult } from '@ai-sdk/provider-utils';\nimport {\n UIMessageChunk,\n uiMessageChunkSchema,\n} from '../ui-message-stream/ui-message-chunks';\nimport {\n HttpChatTransport,\n HttpChatTransportInitOptions,\n} from './http-chat-transport';\nimport { UIMessage } from './ui-messages';\n\nexport class DefaultChatTransport<\n UI_MESSAGE extends UIMessage,\n> extends HttpChatTransport<UI_MESSAGE> {\n constructor(options: HttpChatTransportInitOptions<UI_MESSAGE> = {}) {\n super(options);\n }\n\n protected processResponseStream(\n stream: ReadableStream<Uint8Array<ArrayBufferLike>>,\n ): ReadableStream<UIMessageChunk> {\n return parseJsonEventStream({\n stream,\n schema: uiMessageChunkSchema,\n }).pipeThrough(\n new TransformStream<ParseResult<UIMessageChunk>, UIMessageChunk>({\n async transform(chunk, controller) {\n if (!chunk.success) {\n throw chunk.error;\n }\n controller.enqueue(chunk.value);\n },\n }),\n );\n }\n}\n","import { FetchFunction, Resolvable, resolve } from '@ai-sdk/provider-utils';\nimport { UIMessageChunk } from '../ui-message-stream/ui-message-chunks';\nimport { ChatTransport } from './chat-transport';\nimport { UIMessage } from './ui-messages';\n\nexport type PrepareSendMessagesRequest<UI_MESSAGE extends UIMessage> = (\n options: {\n id: string;\n messages: UI_MESSAGE[];\n requestMetadata: unknown;\n body: Record<string, any> | undefined;\n credentials: RequestCredentials | undefined;\n headers: HeadersInit | undefined;\n api: string;\n } & {\n trigger: 'submit-message' | 'regenerate-message';\n messageId: string | undefined;\n },\n) =>\n | {\n body: object;\n headers?: HeadersInit;\n credentials?: RequestCredentials;\n api?: string;\n }\n | PromiseLike<{\n body: object;\n headers?: HeadersInit;\n credentials?: RequestCredentials;\n api?: string;\n }>;\n\nexport type PrepareReconnectToStreamRequest = (options: {\n id: string;\n requestMetadata: unknown;\n body: Record<string, any> | undefined;\n credentials: RequestCredentials | undefined;\n headers: HeadersInit | undefined;\n api: string;\n}) =>\n | {\n headers?: HeadersInit;\n credentials?: RequestCredentials;\n api?: string;\n }\n | PromiseLike<{\n headers?: HeadersInit;\n credentials?: RequestCredentials;\n api?: string;\n }>;\n\n/**\n * Options for the `HttpChatTransport` class.\n *\n * @param UI_MESSAGE - The type of message to be used in the chat.\n */\nexport type HttpChatTransportInitOptions<UI_MESSAGE extends UIMessage> = {\n /**\n * The API URL to be used for the chat transport.\n * Defaults to '/api/chat'.\n */\n api?: string;\n\n /**\n * The credentials mode to be used for the fetch request.\n * Possible values are: 'omit', 'same-origin', 'include'.\n * Defaults to 'same-origin'.\n */\n credentials?: Resolvable<RequestCredentials>;\n\n /**\n * HTTP headers to be sent with the API request.\n */\n headers?: Resolvable<Record<string, string> | Headers>;\n\n /**\n * Extra body object to be sent with the API request.\n * @example\n * Send a `sessionId` to the API along with the messages.\n * ```js\n * useChat({\n * body: {\n * sessionId: '123',\n * }\n * })\n * ```\n */\n body?: Resolvable<object>;\n\n /**\n Custom fetch implementation. You can use it as a middleware to intercept requests,\n or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * When a function is provided, it will be used\n * to prepare the request body for the chat API. This can be useful for\n * customizing the request body based on the messages and data in the chat.\n *\n * @param id The id of the chat.\n * @param messages The current messages in the chat.\n * @param requestBody The request body object passed in the chat request.\n */\n prepareSendMessagesRequest?: PrepareSendMessagesRequest<UI_MESSAGE>;\n\n /**\n * When a function is provided, it will be used\n * to prepare the request body for the chat API. This can be useful for\n * customizing the request body based on the messages and data in the chat.\n *\n * @param id The id of the chat.\n * @param messages The current messages in the chat.\n * @param requestBody The request body object passed in the chat request.\n */\n prepareReconnectToStreamRequest?: PrepareReconnectToStreamRequest;\n};\n\nexport abstract class HttpChatTransport<UI_MESSAGE extends UIMessage>\n implements ChatTransport<UI_MESSAGE>\n{\n protected api: string;\n protected credentials: HttpChatTransportInitOptions<UI_MESSAGE>['credentials'];\n protected headers: HttpChatTransportInitOptions<UI_MESSAGE>['headers'];\n protected body: HttpChatTransportInitOptions<UI_MESSAGE>['body'];\n protected fetch?: FetchFunction;\n protected prepareSendMessagesRequest?: PrepareSendMessagesRequest<UI_MESSAGE>;\n protected prepareReconnectToStreamRequest?: PrepareReconnectToStreamRequest;\n\n constructor({\n api = '/api/chat',\n credentials,\n headers,\n body,\n fetch,\n prepareSendMessagesRequest,\n prepareReconnectToStreamRequest,\n }: HttpChatTransportInitOptions<UI_MESSAGE>) {\n this.api = api;\n this.credentials = credentials;\n this.headers = headers;\n this.body = body;\n this.fetch = fetch;\n this.prepareSendMessagesRequest = prepareSendMessagesRequest;\n this.prepareReconnectToStreamRequest = prepareReconnectToStreamRequest;\n }\n\n async sendMessages({\n abortSignal,\n ...options\n }: Parameters<ChatTransport<UI_MESSAGE>['sendMessages']>[0]) {\n const resolvedBody = await resolve(this.body);\n const resolvedHeaders = await resolve(this.headers);\n const resolvedCredentials = await resolve(this.credentials);\n\n const preparedRequest = await this.prepareSendMessagesRequest?.({\n api: this.api,\n id: options.chatId,\n messages: options.messages,\n body: { ...resolvedBody, ...options.body },\n headers: { ...resolvedHeaders, ...options.headers },\n credentials: resolvedCredentials,\n requestMetadata: options.metadata,\n trigger: options.trigger,\n messageId: options.messageId,\n });\n\n const api = preparedRequest?.api ?? this.api;\n const headers =\n preparedRequest?.headers !== undefined\n ? preparedRequest.headers\n : { ...resolvedHeaders, ...options.headers };\n const body =\n preparedRequest?.body !== undefined\n ? preparedRequest.body\n : {\n ...resolvedBody,\n ...options.body,\n id: options.chatId,\n messages: options.messages,\n trigger: options.trigger,\n messageId: options.messageId,\n };\n const credentials = preparedRequest?.credentials ?? resolvedCredentials;\n\n // avoid caching globalThis.fetch in case it is patched by other libraries\n const fetch = this.fetch ?? globalThis.fetch;\n\n const response = await fetch(api, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify(body),\n credentials,\n signal: abortSignal,\n });\n\n if (!response.ok) {\n throw new Error(\n (await response.text()) ?? 'Failed to fetch the chat response.',\n );\n }\n\n if (!response.body) {\n throw new Error('The response body is empty.');\n }\n\n return this.processResponseStream(response.body);\n }\n\n async reconnectToStream(\n options: Parameters<ChatTransport<UI_MESSAGE>['reconnectToStream']>[0],\n ): Promise<ReadableStream<UIMessageChunk> | null> {\n const resolvedBody = await resolve(this.body);\n const resolvedHeaders = await resolve(this.headers);\n const resolvedCredentials = await resolve(this.credentials);\n\n const preparedRequest = await this.prepareReconnectToStreamRequest?.({\n api: this.api,\n id: options.chatId,\n body: { ...resolvedBody, ...options.body },\n headers: { ...resolvedHeaders, ...options.headers },\n credentials: resolvedCredentials,\n requestMetadata: options.metadata,\n });\n\n const api = preparedRequest?.api ?? `${this.api}/${options.chatId}/stream`;\n const headers =\n preparedRequest?.headers !== undefined\n ? preparedRequest.headers\n : { ...resolvedHeaders, ...options.headers };\n const credentials = preparedRequest?.credentials ?? resolvedCredentials;\n\n // avoid caching globalThis.fetch in case it is patched by other libraries\n const fetch = this.fetch ?? globalThis.fetch;\n\n const response = await fetch(api, {\n method: 'GET',\n headers,\n credentials,\n });\n\n // no active stream found, so we do not resume\n if (response.status === 204) {\n return null;\n }\n\n if (!response.ok) {\n throw new Error(\n (await response.text()) ?? 'Failed to fetch the chat response.',\n );\n }\n\n if (!response.body) {\n throw new Error('The response body is empty.');\n }\n\n return this.processResponseStream(response.body);\n }\n\n protected abstract processResponseStream(\n stream: ReadableStream<Uint8Array<ArrayBufferLike>>,\n ): ReadableStream<UIMessageChunk>;\n}\n","import {\n AssistantContent,\n ModelMessage,\n ToolResultPart,\n} from '@ai-sdk/provider-utils';\nimport { ToolSet } from '../generate-text/tool-set';\nimport { createToolModelOutput } from '../prompt/create-tool-model-output';\nimport { MessageConversionError } from '../prompt/message-conversion-error';\nimport {\n DynamicToolUIPart,\n FileUIPart,\n getToolName,\n isToolUIPart,\n ReasoningUIPart,\n TextUIPart,\n ToolUIPart,\n UIMessage,\n UITools,\n} from './ui-messages';\n\n/**\nConverts an array of messages from useChat into an array of CoreMessages that can be used\nwith the AI core functions (e.g. `streamText`).\n\n@param messages - The messages to convert.\n@param options.tools - The tools to use.\n@param options.ignoreIncompleteToolCalls - Whether to ignore incomplete tool calls. Default is `false`.\n */\nexport function convertToModelMessages(\n messages: Array<Omit<UIMessage, 'id'>>,\n options?: {\n tools?: ToolSet;\n ignoreIncompleteToolCalls?: boolean;\n },\n): ModelMessage[] {\n const modelMessages: ModelMessage[] = [];\n\n if (options?.ignoreIncompleteToolCalls) {\n messages = messages.map(message => ({\n ...message,\n parts: message.parts.filter(\n part =>\n !isToolUIPart(part) ||\n (part.state !== 'input-streaming' &&\n part.state !== 'input-available'),\n ),\n }));\n }\n\n for (const message of messages) {\n switch (message.role) {\n case 'system': {\n const textParts = message.parts.filter(part => part.type === 'text');\n\n const providerMetadata = textParts.reduce((acc, part) => {\n if (part.providerMetadata != null) {\n return { ...acc, ...part.providerMetadata };\n }\n return acc;\n }, {});\n\n modelMessages.push({\n role: 'system',\n content: textParts.map(part => part.text).join(''),\n ...(Object.keys(providerMetadata).length > 0\n ? { providerOptions: providerMetadata }\n : {}),\n });\n break;\n }\n\n case 'user': {\n modelMessages.push({\n role: 'user',\n content: message.parts\n .filter(\n (part): part is TextUIPart | FileUIPart =>\n part.type === 'text' || part.type === 'file',\n )\n .map(part => {\n switch (part.type) {\n case 'text':\n return {\n type: 'text' as const,\n text: part.text,\n ...(part.providerMetadata != null\n ? { providerOptions: part.providerMetadata }\n : {}),\n };\n case 'file':\n return {\n type: 'file' as const,\n mediaType: part.mediaType,\n filename: part.filename,\n data: part.url,\n ...(part.providerMetadata != null\n ? { providerOptions: part.providerMetadata }\n : {}),\n };\n default:\n return part;\n }\n }),\n });\n\n break;\n }\n\n case 'assistant': {\n if (message.parts != null) {\n let block: Array<\n | TextUIPart\n | ToolUIPart<UITools>\n | ReasoningUIPart\n | FileUIPart\n | DynamicToolUIPart\n > = [];\n\n function processBlock() {\n if (block.length === 0) {\n return;\n }\n\n const content: AssistantContent = [];\n\n for (const part of block) {\n if (part.type === 'text') {\n content.push({\n type: 'text' as const,\n text: part.text,\n ...(part.providerMetadata != null\n ? { providerOptions: part.providerMetadata }\n : {}),\n });\n } else if (part.type === 'file') {\n content.push({\n type: 'file' as const,\n mediaType: part.mediaType,\n filename: part.filename,\n data: part.url,\n });\n } else if (part.type === 'reasoning') {\n content.push({\n type: 'reasoning' as const,\n text: part.text,\n providerOptions: part.providerMetadata,\n });\n } else if (part.type === 'dynamic-tool') {\n const toolName = part.toolName;\n\n if (part.state === 'input-streaming') {\n throw new MessageConversionError({\n originalMessage: message,\n message: `incomplete tool input is not supported: ${part.toolCallId}`,\n });\n } else {\n content.push({\n type: 'tool-call' as const,\n toolCallId: part.toolCallId,\n toolName,\n input: part.input,\n ...(part.callProviderMetadata != null\n ? { providerOptions: part.callProviderMetadata }\n : {}),\n });\n }\n } else if (isToolUIPart(part)) {\n const toolName = getToolName(part);\n\n if (part.state === 'input-streaming') {\n throw new MessageConversionError({\n originalMessage: message,\n message: `incomplete tool input is not supported: ${part.toolCallId}`,\n });\n } else {\n content.push({\n type: 'tool-call' as const,\n toolCallId: part.toolCallId,\n toolName,\n input:\n part.state === 'output-error'\n ? (part.input ?? part.rawInput)\n : part.input,\n providerExecuted: part.providerExecuted,\n ...(part.callProviderMetadata != null\n ? { providerOptions: part.callProviderMetadata }\n : {}),\n });\n\n if (\n part.providerExecuted === true &&\n (part.state === 'output-available' ||\n part.state === 'output-error')\n ) {\n content.push({\n type: 'tool-result',\n toolCallId: part.toolCallId,\n toolName,\n output: createToolModelOutput({\n output:\n part.state === 'output-error'\n ? part.errorText\n : part.output,\n tool: options?.tools?.[toolName],\n errorMode:\n part.state === 'output-error' ? 'json' : 'none',\n }),\n });\n }\n }\n } else {\n const _exhaustiveCheck: never = part;\n throw new Error(`Unsupported part: ${_exhaustiveCheck}`);\n }\n }\n\n modelMessages.push({\n role: 'assistant',\n content,\n });\n\n // check if there are tool invocations with results in the block\n const toolParts = block.filter(\n part =>\n (isToolUIPart(part) && part.providerExecuted !== true) ||\n part.type === 'dynamic-tool',\n ) as (ToolUIPart<UITools> | DynamicToolUIPart)[];\n\n // tool message with tool results\n if (toolParts.length > 0) {\n modelMessages.push({\n role: 'tool',\n content: toolParts.map((toolPart): ToolResultPart => {\n switch (toolPart.state) {\n case 'output-error':\n case 'output-available': {\n const toolName =\n toolPart.type === 'dynamic-tool'\n ? toolPart.toolName\n : getToolName(toolPart);\n\n return {\n type: 'tool-result',\n toolCallId: toolPart.toolCallId,\n toolName,\n output: createToolModelOutput({\n output:\n toolPart.state === 'output-error'\n ? toolPart.errorText\n : toolPart.output,\n tool: options?.tools?.[toolName],\n errorMode:\n toolPart.state === 'output-error' ? 'text' : 'none',\n }),\n };\n }\n\n default: {\n throw new MessageConversionError({\n originalMessage: message,\n message: `Unsupported tool part state: ${toolPart.state}`,\n });\n }\n }\n }),\n });\n }\n\n // updates for next block\n block = [];\n }\n\n for (const part of message.parts) {\n if (\n part.type === 'text' ||\n part.type === 'reasoning' ||\n part.type === 'file' ||\n part.type === 'dynamic-tool' ||\n isToolUIPart(part)\n ) {\n block.push(part);\n } else if (part.type === 'step-start') {\n processBlock();\n }\n }\n\n processBlock();\n\n break;\n }\n\n break;\n }\n\n default: {\n const _exhaustiveCheck: never = message.role;\n throw new MessageConversionError({\n originalMessage: message,\n message: `Unsupported role: ${_exhaustiveCheck}`,\n });\n }\n }\n }\n\n return modelMessages;\n}\n\n/**\n@deprecated Use `convertToModelMessages` instead.\n */\n// TODO remove in AI SDK 6\nexport const convertToCoreMessages = convertToModelMessages;\n","import { isToolUIPart, UIMessage } from './ui-messages';\n\n/**\nCheck if the message is an assistant message with completed tool calls.\nThe last step of the message must have at least one tool invocation and\nall tool invocations must have a result.\n */\nexport function lastAssistantMessageIsCompleteWithToolCalls({\n messages,\n}: {\n messages: UIMessage[];\n}): boolean {\n const message = messages[messages.length - 1];\n\n if (!message) {\n return false;\n }\n\n if (message.role !== 'assistant') {\n return false;\n }\n\n const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {\n return part.type === 'step-start' ? index : lastIndex;\n }, -1);\n\n const lastStepToolInvocations = message.parts\n .slice(lastStepStartIndex + 1)\n .filter(part => isToolUIPart(part) || part.type === 'dynamic-tool');\n\n return (\n lastStepToolInvocations.length > 0 &&\n lastStepToolInvocations.every(part => part.state === 'output-available')\n );\n}\n","import { UIMessageChunk } from '../ui-message-stream/ui-message-chunks';\n\nexport function transformTextToUiMessageStream({\n stream,\n}: {\n stream: ReadableStream<string>;\n}) {\n return stream.pipeThrough(\n new TransformStream<string, UIMessageChunk>({\n start(controller) {\n controller.enqueue({ type: 'start' });\n controller.enqueue({ type: 'start-step' });\n controller.enqueue({ type: 'text-start', id: 'text-1' });\n },\n\n async transform(part, controller) {\n controller.enqueue({ type: 'text-delta', id: 'text-1', delta: part });\n },\n\n async flush(controller) {\n controller.enqueue({ type: 'text-end', id: 'text-1' });\n controller.enqueue({ type: 'finish-step' });\n controller.enqueue({ type: 'finish' });\n },\n }),\n );\n}\n","import { UIMessageChunk } from '../ui-message-stream/ui-message-chunks';\nimport {\n HttpChatTransport,\n HttpChatTransportInitOptions,\n} from './http-chat-transport';\nimport { transformTextToUiMessageStream } from './transform-text-to-ui-message-stream';\nimport { UIMessage } from './ui-messages';\n\nexport class TextStreamChatTransport<\n UI_MESSAGE extends UIMessage,\n> extends HttpChatTransport<UI_MESSAGE> {\n constructor(options: HttpChatTransportInitOptions<UI_MESSAGE> = {}) {\n super(options);\n }\n\n protected processResponseStream(\n stream: ReadableStream<Uint8Array<ArrayBufferLike>>,\n ): ReadableStream<UIMessageChunk> {\n return transformTextToUiMessageStream({\n stream: stream.pipeThrough(new TextDecoderStream()),\n });\n }\n}\n","import {\n generateId as generateIdFunc,\n getErrorMessage,\n IdGenerator,\n} from '@ai-sdk/provider-utils';\nimport { UIMessage } from '../ui/ui-messages';\nimport { handleUIMessageStreamFinish } from './handle-ui-message-stream-finish';\nimport { InferUIMessageChunk } from './ui-message-chunks';\nimport { UIMessageStreamOnFinishCallback } from './ui-message-stream-on-finish-callback';\nimport { UIMessageStreamWriter } from './ui-message-stream-writer';\n\nexport function createUIMessageStream<UI_MESSAGE extends UIMessage>({\n execute,\n onError = getErrorMessage,\n originalMessages,\n onFinish,\n generateId = generateIdFunc,\n}: {\n execute: (options: {\n writer: UIMessageStreamWriter<UI_MESSAGE>;\n }) => Promise<void> | void;\n onError?: (error: unknown) => string;\n\n /**\n * The original messages. If they are provided, persistence mode is assumed,\n * and a message ID is provided for the response message.\n */\n originalMessages?: UI_MESSAGE[];\n\n onFinish?: UIMessageStreamOnFinishCallback<UI_MESSAGE>;\n\n generateId?: IdGenerator;\n}): ReadableStream<InferUIMessageChunk<UI_MESSAGE>> {\n let controller!: ReadableStreamDefaultController<\n InferUIMessageChunk<UI_MESSAGE>\n >;\n\n const ongoingStreamPromises: Promise<void>[] = [];\n\n const stream = new ReadableStream({\n start(controllerArg) {\n controller = controllerArg;\n },\n });\n\n function safeEnqueue(data: InferUIMessageChunk<UI_MESSAGE>) {\n try {\n controller.enqueue(data);\n } catch (error) {\n // suppress errors when the stream has been closed\n }\n }\n\n try {\n const result = execute({\n writer: {\n write(part: InferUIMessageChunk<UI_MESSAGE>) {\n safeEnqueue(part);\n },\n merge(streamArg) {\n ongoingStreamPromises.push(\n (async () => {\n const reader = streamArg.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n safeEnqueue(value);\n }\n })().catch(error => {\n safeEnqueue({\n type: 'error',\n errorText: onError(error),\n } as InferUIMessageChunk<UI_MESSAGE>);\n }),\n );\n },\n onError,\n },\n });\n\n if (result) {\n ongoingStreamPromises.push(\n result.catch(error => {\n safeEnqueue({\n type: 'error',\n errorText: onError(error),\n } as InferUIMessageChunk<UI_MESSAGE>);\n }),\n );\n }\n } catch (error) {\n safeEnqueue({\n type: 'error',\n errorText: onError(error),\n } as InferUIMessageChunk<UI_MESSAGE>);\n }\n\n // Wait until all ongoing streams are done. This approach enables merging\n // streams even after execute has returned, as long as there is still an\n // open merged stream. This is important to e.g. forward new streams and\n // from callbacks.\n const waitForStreams: Promise<void> = new Promise(async resolve => {\n while (ongoingStreamPromises.length > 0) {\n await ongoingStreamPromises.shift();\n }\n resolve();\n });\n\n waitForStreams.finally(() => {\n try {\n controller.close();\n } catch (error) {\n // suppress errors when the stream has been closed\n }\n });\n\n return handleUIMessageStreamFinish<UI_MESSAGE>({\n stream,\n messageId: generateId(),\n originalMessages,\n onFinish,\n onError,\n });\n}\n","import { UIMessage } from '../ui/ui-messages';\nimport { UIMessageChunk } from './ui-message-chunks';\nimport {\n createStreamingUIMessageState,\n processUIMessageStream,\n StreamingUIMessageState,\n} from '../ui/process-ui-message-stream';\nimport {\n AsyncIterableStream,\n createAsyncIterableStream,\n} from '../util/async-iterable-stream';\nimport { consumeStream } from '../util/consume-stream';\n\n/**\n * Transforms a stream of `UIMessageChunk`s into an `AsyncIterableStream` of `UIMessage`s.\n *\n * @param options.message - The last assistant message to use as a starting point when the conversation is resumed. Otherwise undefined.\n * @param options.stream - The stream of `UIMessageChunk`s to read.\n * @param options.terminateOnError - Whether to terminate the stream if an error occurs.\n * @param options.onError - A function that is called when an error occurs.\n *\n * @returns An `AsyncIterableStream` of `UIMessage`s. Each stream part is a different state of the same message\n * as it is being completed.\n */\nexport function readUIMessageStream<UI_MESSAGE extends UIMessage>({\n message,\n stream,\n onError,\n terminateOnError = false,\n}: {\n message?: UI_MESSAGE;\n stream: ReadableStream<UIMessageChunk>;\n onError?: (error: unknown) => void;\n terminateOnError?: boolean;\n}): AsyncIterableStream<UI_MESSAGE> {\n let controller: ReadableStreamDefaultController<UI_MESSAGE> | undefined;\n let hasErrored = false;\n\n const outputStream = new ReadableStream<UI_MESSAGE>({\n start(controllerParam) {\n controller = controllerParam;\n },\n });\n\n const state = createStreamingUIMessageState<UI_MESSAGE>({\n messageId: message?.id ?? '',\n lastMessage: message,\n });\n\n const handleError = (error: unknown) => {\n onError?.(error);\n\n if (!hasErrored && terminateOnError) {\n hasErrored = true;\n controller?.error(error);\n }\n };\n\n consumeStream({\n stream: processUIMessageStream({\n stream,\n runUpdateMessageJob(\n job: (options: {\n state: StreamingUIMessageState<UI_MESSAGE>;\n write: () => void;\n }) => Promise<void>,\n ) {\n return job({\n state,\n write: () => {\n controller?.enqueue(structuredClone(state.message));\n },\n });\n },\n onError: handleError,\n }),\n onError: handleError,\n }).finally(() => {\n // Only close if no error occurred. Calling close() on an errored controller\n // throws \"Invalid state: Controller is already closed\" TypeError.\n if (!hasErrored) {\n controller?.close();\n }\n });\n\n return createAsyncIterableStream(outputStream);\n}\n"],"mappings":"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","names":["import_provider_utils","import_provider_utils","import_provider","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","text","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","import_provider","name","marker","symbol","_a","_a","import_provider_utils","_a","import_provider","import_provider_utils","_a","_a","import_provider_utils","object","name","tool","import_provider","import_provider_utils","import_v4","import_v4","import_v4","import_v4","import_v4","import_gateway","import_provider","_a","name","import_api","name","attributes","import_provider","import_provider_utils","content","import_provider_utils","import_provider_utils","tool","_a","import_provider","tool","generateId","_a","callSettings","tool","span","_b","_c","_d","_e","_f","toolCall","import_provider","import_provider_utils","import_provider_utils","import_v4","import_provider_utils","_a","part","resolve","resolve","_a","_a","import_provider_utils","tool","originalGenerateId","now","generateId","text","_a","includeRawChunks","stream","tool","doStreamSpan","_b","_c","_d","_a","embedding","usage","_a","embeddings","providerMetadata","usage","_a","import_provider_utils","import_provider","import_provider_utils","_a","import_provider","import_provider_utils","originalGenerateId","generateId","_a","span","result","text","object","import_provider_utils","resolve","import_provider_utils","_a","delay","delayFunction","originalGenerateId","generateId","now","doStreamSpan","object","_a","error","import_provider","text","_a","import_provider_utils","text","import_provider_utils","import_provider","delay","originalDelay","text","text","_a","import_provider","import_provider","name","marker","symbol","_a","import_provider","_a","import_provider_utils","import_provider_utils","import_v4","import_v4","resolve","_a","_b","_c","text","name","_a","resolve","import_provider","_a","import_provider_utils","fetch","_a","import_provider_utils","name","resolve","_a","import_provider_utils","import_provider_utils","fetch","_a","generateId","generateIdFunc","_a","tool","processBlock","_a","import_provider_utils","generateId","generateIdFunc","resolve","_a"]}