/* eslint-disable no-empty */ /* eslint-disable no-async-promise-executor */ "use strict" var __defProp = Object.defineProperty var __getOwnPropDesc = Object.getOwnPropertyDescriptor var __getOwnPropNames = Object.getOwnPropertyNames var __hasOwnProp = Object.prototype.hasOwnProperty var __export = (target, all) => { for (var name14 in all) __defProp(target, name14, { get: all[name14], enumerable: true }) } var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }) } return to } var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod) // streams/index.ts var streams_exports = {} __export(streams_exports, { AISDKError: () => import_provider16.AISDKError, APICallError: () => import_provider16.APICallError, AssistantResponse: () => AssistantResponse, DownloadError: () => DownloadError, EmptyResponseBodyError: () => import_provider16.EmptyResponseBodyError, InvalidArgumentError: () => InvalidArgumentError, InvalidDataContentError: () => InvalidDataContentError, InvalidMessageRoleError: () => InvalidMessageRoleError, InvalidPromptError: () => import_provider16.InvalidPromptError, InvalidResponseDataError: () => import_provider16.InvalidResponseDataError, InvalidToolArgumentsError: () => InvalidToolArgumentsError, JSONParseError: () => import_provider16.JSONParseError, LangChainAdapter: () => langchain_adapter_exports, LlamaIndexAdapter: () => llamaindex_adapter_exports, LoadAPIKeyError: () => import_provider16.LoadAPIKeyError, MessageConversionError: () => MessageConversionError, NoContentGeneratedError: () => import_provider16.NoContentGeneratedError, NoObjectGeneratedError: () => NoObjectGeneratedError, NoOutputSpecifiedError: () => NoOutputSpecifiedError, NoSuchModelError: () => import_provider16.NoSuchModelError, NoSuchProviderError: () => NoSuchProviderError, NoSuchToolError: () => NoSuchToolError, Output: () => output_exports, RetryError: () => RetryError, StreamData: () => StreamData, ToolCallRepairError: () => ToolCallRepairError, ToolExecutionError: () => ToolExecutionError, TypeValidationError: () => import_provider16.TypeValidationError, UnsupportedFunctionalityError: () => import_provider16.UnsupportedFunctionalityError, appendResponseMessages: () => appendResponseMessages, convertToCoreMessages: () => convertToCoreMessages, cosineSimilarity: () => cosineSimilarity, createDataStream: () => createDataStream, createDataStreamResponse: () => createDataStreamResponse, createIdGenerator: () => import_provider_utils12.createIdGenerator, embed: () => embed, embedMany: () => embedMany, experimental_createProviderRegistry: () => experimental_createProviderRegistry, experimental_customProvider: () => experimental_customProvider, experimental_generateImage: () => generateImage, experimental_wrapLanguageModel: () => experimental_wrapLanguageModel, formatAssistantStreamPart: () => import_ui_utils9.formatAssistantStreamPart, formatDataStreamPart: () => import_ui_utils9.formatDataStreamPart, generateId: () => import_provider_utils12.generateId, generateObject: () => generateObject, generateText: () => generateText, jsonSchema: () => import_ui_utils9.jsonSchema, parseAssistantStreamPart: () => import_ui_utils9.parseAssistantStreamPart, parseDataStreamPart: () => import_ui_utils9.parseDataStreamPart, pipeDataStreamToResponse: () => pipeDataStreamToResponse, processDataStream: () => import_ui_utils9.processDataStream, processTextStream: () => import_ui_utils9.processTextStream, simulateReadableStream: () => simulateReadableStream, smoothStream: () => smoothStream, streamObject: () => streamObject, streamText: () => streamText, tool: () => tool }) module.exports = __toCommonJS(streams_exports) // core/index.ts var import_provider_utils12 = require("@ai-sdk/provider-utils") var import_ui_utils9 = require("@ai-sdk/ui-utils") // core/data-stream/create-data-stream.ts var import_ui_utils = require("@ai-sdk/ui-utils") function createDataStream({ execute, onError = () => "An error occurred." // mask error messages for safety by default }) { let controller const ongoingStreamPromises = [] const stream = new ReadableStream({ start(controllerArg) { controller = controllerArg } }) function safeEnqueue(data) { try { controller.enqueue(data) } catch (error) { console.error(error) } } try { const result = execute({ writeData(data) { safeEnqueue((0, import_ui_utils.formatDataStreamPart)("data", [data])) }, writeMessageAnnotation(annotation) { safeEnqueue((0, import_ui_utils.formatDataStreamPart)("message_annotations", [annotation])) }, merge(streamArg) { ongoingStreamPromises.push( (async () => { const reader = streamArg.getReader() while (true) { const { done, value } = await reader.read() if (done) break safeEnqueue(value) } })().catch((error) => { safeEnqueue((0, import_ui_utils.formatDataStreamPart)("error", onError(error))) }) ) }, onError }) if (result) { ongoingStreamPromises.push( result.catch((error) => { safeEnqueue((0, import_ui_utils.formatDataStreamPart)("error", onError(error))) }) ) } } catch (error) { safeEnqueue((0, import_ui_utils.formatDataStreamPart)("error", onError(error))) } const waitForStreams = new Promise(async (resolve) => { while (ongoingStreamPromises.length > 0) { await ongoingStreamPromises.shift() } resolve() }) waitForStreams.finally(() => { try { controller.close() } catch (error) { console.error(error) } }) return stream } // core/util/prepare-response-headers.ts function prepareResponseHeaders(headers, { contentType, dataStreamVersion }) { const responseHeaders = new Headers(headers != null ? headers : {}) if (!responseHeaders.has("Content-Type")) { responseHeaders.set("Content-Type", contentType) } if (dataStreamVersion !== void 0) { responseHeaders.set("X-Vercel-AI-Data-Stream", dataStreamVersion) } return responseHeaders } // core/data-stream/create-data-stream-response.ts function createDataStreamResponse({ status, statusText, headers, execute, onError }) { return new Response( createDataStream({ execute, onError }).pipeThrough(new TextEncoderStream()), { status, statusText, headers: prepareResponseHeaders(headers, { contentType: "text/plain; charset=utf-8", dataStreamVersion: "v1" }) } ) } // core/util/prepare-outgoing-http-headers.ts function prepareOutgoingHttpHeaders(headers, { contentType, dataStreamVersion }) { const outgoingHeaders = {} if (headers != null) { for (const [key, value] of Object.entries(headers)) { outgoingHeaders[key] = value } } if (outgoingHeaders["Content-Type"] == null) { outgoingHeaders["Content-Type"] = contentType } if (dataStreamVersion !== void 0) { outgoingHeaders["X-Vercel-AI-Data-Stream"] = dataStreamVersion } return outgoingHeaders } // core/util/write-to-server-response.ts function writeToServerResponse({ response, status, statusText, headers, stream }) { response.writeHead(status != null ? status : 200, statusText, headers) const reader = stream.getReader() const read = async () => { try { while (true) { const { done, value } = await reader.read() if (done) break response.write(value) } } catch (error) { console.error(error) } finally { response.end() } } read() } // core/data-stream/pipe-data-stream-to-response.ts function pipeDataStreamToResponse(response, { status, statusText, headers, execute, onError }) { writeToServerResponse({ response, status, statusText, headers: prepareOutgoingHttpHeaders(headers, { contentType: "text/plain; charset=utf-8", dataStreamVersion: "v1" }), stream: createDataStream({ execute, onError }).pipeThrough( new TextEncoderStream() ) }) } // errors/invalid-argument-error.ts var import_provider = require("@ai-sdk/provider") var name = "AI_InvalidArgumentError" var marker = `vercel.ai.error.${name}` var symbol = Symbol.for(marker) var _a var InvalidArgumentError = class extends import_provider.AISDKError { constructor({ parameter, value, message }) { super({ name, message: `Invalid argument for parameter ${parameter}: ${message}` }) this[_a] = true this.parameter = parameter this.value = value } static isInstance(error) { return import_provider.AISDKError.hasMarker(error, marker) } } _a = symbol // util/retry-with-exponential-backoff.ts var import_provider3 = require("@ai-sdk/provider") var import_provider_utils = require("@ai-sdk/provider-utils") // util/delay.ts async function delay(delayInMs) { return delayInMs == null ? Promise.resolve() : new Promise((resolve) => setTimeout(resolve, delayInMs)) } // util/retry-error.ts var import_provider2 = require("@ai-sdk/provider") var name2 = "AI_RetryError" var marker2 = `vercel.ai.error.${name2}` var symbol2 = Symbol.for(marker2) var _a2 var RetryError = class extends import_provider2.AISDKError { constructor({ message, reason, errors }) { super({ name: name2, message }) this[_a2] = true this.reason = reason this.errors = errors this.lastError = errors[errors.length - 1] } static isInstance(error) { return import_provider2.AISDKError.hasMarker(error, marker2) } } _a2 = symbol2 // util/retry-with-exponential-backoff.ts var retryWithExponentialBackoff = ({ maxRetries = 2, initialDelayInMs = 2e3, backoffFactor = 2 } = {}) => async (f) => _retryWithExponentialBackoff(f, { maxRetries, delayInMs: initialDelayInMs, backoffFactor }) async function _retryWithExponentialBackoff(f, { maxRetries, delayInMs, backoffFactor }, errors = []) { try { return await f() } catch (error) { if ((0, import_provider_utils.isAbortError)(error)) { throw error } if (maxRetries === 0) { throw error } const errorMessage = (0, import_provider_utils.getErrorMessage)(error) const newErrors = [...errors, error] const tryNumber = newErrors.length if (tryNumber > maxRetries) { throw new RetryError({ message: `Failed after ${tryNumber} attempts. Last error: ${errorMessage}`, reason: "maxRetriesExceeded", errors: newErrors }) } if (error instanceof Error && import_provider3.APICallError.isInstance(error) && error.isRetryable === true && tryNumber <= maxRetries) { await delay(delayInMs) return _retryWithExponentialBackoff( f, { maxRetries, delayInMs: backoffFactor * delayInMs, backoffFactor }, newErrors ) } if (tryNumber === 1) { throw error } throw new RetryError({ message: `Failed after ${tryNumber} attempts with non-retryable error: '${errorMessage}'`, reason: "errorNotRetryable", errors: newErrors }) } } // core/prompt/prepare-retries.ts function prepareRetries({ maxRetries }) { if (maxRetries != null) { if (!Number.isInteger(maxRetries)) { throw new InvalidArgumentError({ parameter: "maxRetries", value: maxRetries, message: "maxRetries must be an integer" }) } if (maxRetries < 0) { throw new InvalidArgumentError({ parameter: "maxRetries", value: maxRetries, message: "maxRetries must be >= 0" }) } } const maxRetriesResult = maxRetries != null ? maxRetries : 2 return { maxRetries: maxRetriesResult, retry: retryWithExponentialBackoff({ maxRetries: maxRetriesResult }) } } // core/telemetry/assemble-operation-name.ts function assembleOperationName({ operationId, telemetry }) { return { // standardized operation and resource name: "operation.name": `${operationId}${(telemetry == null ? void 0 : telemetry.functionId) != null ? ` ${telemetry.functionId}` : ""}`, "resource.name": telemetry == null ? void 0 : telemetry.functionId, // detailed, AI SDK specific data: "ai.operationId": operationId, "ai.telemetry.functionId": telemetry == null ? void 0 : telemetry.functionId } } // core/telemetry/get-base-telemetry-attributes.ts function getBaseTelemetryAttributes({ model, settings, telemetry, headers }) { var _a14 return { "ai.model.provider": model.provider, "ai.model.id": model.modelId, // settings: ...Object.entries(settings).reduce((attributes, [key, value]) => { attributes[`ai.settings.${key}`] = value return attributes }, {}), // add metadata as attributes: ...Object.entries((_a14 = telemetry == null ? void 0 : telemetry.metadata) != null ? _a14 : {}).reduce( (attributes, [key, value]) => { attributes[`ai.telemetry.metadata.${key}`] = value return attributes }, {} ), // request headers ...Object.entries(headers != null ? headers : {}).reduce((attributes, [key, value]) => { if (value !== void 0) { attributes[`ai.request.headers.${key}`] = value } return attributes }, {}) } } // core/telemetry/get-tracer.ts var import_api = require("@opentelemetry/api") // core/telemetry/noop-tracer.ts var noopTracer = { startSpan() { return noopSpan }, startActiveSpan(name14, arg1, arg2, arg3) { if (typeof arg1 === "function") { return arg1(noopSpan) } if (typeof arg2 === "function") { return arg2(noopSpan) } if (typeof arg3 === "function") { return arg3(noopSpan) } } } var noopSpan = { spanContext() { return noopSpanContext }, setAttribute() { return this }, setAttributes() { return this }, addEvent() { return this }, addLink() { return this }, addLinks() { return this }, setStatus() { return this }, updateName() { return this }, end() { return this }, isRecording() { return false }, recordException() { return this } } var noopSpanContext = { traceId: "", spanId: "", traceFlags: 0 } // core/telemetry/get-tracer.ts function getTracer({ isEnabled = false, tracer } = {}) { if (!isEnabled) { return noopTracer } if (tracer) { return tracer } return import_api.trace.getTracer("ai") } // core/telemetry/record-span.ts var import_api2 = require("@opentelemetry/api") function recordSpan({ name: name14, tracer, attributes, fn, endWhenDone = true }) { return tracer.startActiveSpan(name14, { attributes }, async (span) => { try { const result = await fn(span) if (endWhenDone) { span.end() } return result } catch (error) { try { if (error instanceof Error) { span.recordException({ name: error.name, message: error.message, stack: error.stack }) span.setStatus({ code: import_api2.SpanStatusCode.ERROR, message: error.message }) } else { span.setStatus({ code: import_api2.SpanStatusCode.ERROR }) } } finally { span.end() } throw error } }) } // core/telemetry/select-telemetry-attributes.ts function selectTelemetryAttributes({ telemetry, attributes }) { if ((telemetry == null ? void 0 : telemetry.isEnabled) !== true) { return {} } return Object.entries(attributes).reduce((attributes2, [key, value]) => { if (value === void 0) { return attributes2 } if (typeof value === "object" && "input" in value && typeof value.input === "function") { if ((telemetry == null ? void 0 : telemetry.recordInputs) === false) { return attributes2 } const result = value.input() return result === void 0 ? attributes2 : { ...attributes2, [key]: result } } if (typeof value === "object" && "output" in value && typeof value.output === "function") { if ((telemetry == null ? void 0 : telemetry.recordOutputs) === false) { return attributes2 } const result = value.output() return result === void 0 ? attributes2 : { ...attributes2, [key]: result } } return { ...attributes2, [key]: value } }, {}) } // core/embed/embed.ts async function embed({ model, value, maxRetries: maxRetriesArg, abortSignal, headers, experimental_telemetry: telemetry }) { const { maxRetries, retry } = prepareRetries({ maxRetries: maxRetriesArg }) const baseTelemetryAttributes = getBaseTelemetryAttributes({ model, telemetry, headers, settings: { maxRetries } }) const tracer = getTracer(telemetry) return recordSpan({ name: "ai.embed", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.embed", telemetry }), ...baseTelemetryAttributes, "ai.value": { input: () => JSON.stringify(value) } } }), tracer, fn: async (span) => { const { embedding, usage, rawResponse } = await retry( () => ( // nested spans to align with the embedMany telemetry data: recordSpan({ name: "ai.embed.doEmbed", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.embed.doEmbed", telemetry }), ...baseTelemetryAttributes, // specific settings that only make sense on the outer level: "ai.values": { input: () => [JSON.stringify(value)] } } }), tracer, fn: async (doEmbedSpan) => { var _a14 const modelResponse = await model.doEmbed({ values: [value], abortSignal, headers }) const embedding2 = modelResponse.embeddings[0] const usage2 = (_a14 = modelResponse.usage) != null ? _a14 : { tokens: NaN } doEmbedSpan.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.embeddings": { output: () => modelResponse.embeddings.map( (embedding3) => JSON.stringify(embedding3) ) }, "ai.usage.tokens": usage2.tokens } }) ) return { embedding: embedding2, usage: usage2, rawResponse: modelResponse.rawResponse } } }) ) ) span.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.embedding": { output: () => JSON.stringify(embedding) }, "ai.usage.tokens": usage.tokens } }) ) return new DefaultEmbedResult({ value, embedding, usage, rawResponse }) } }) } var DefaultEmbedResult = class { constructor(options) { this.value = options.value this.embedding = options.embedding this.usage = options.usage this.rawResponse = options.rawResponse } } // core/util/split-array.ts function splitArray(array, chunkSize) { if (chunkSize <= 0) { throw new Error("chunkSize must be greater than 0") } const result = [] for (let i = 0; i < array.length; i += chunkSize) { result.push(array.slice(i, i + chunkSize)) } return result } // core/embed/embed-many.ts async function embedMany({ model, values, maxRetries: maxRetriesArg, abortSignal, headers, experimental_telemetry: telemetry }) { const { maxRetries, retry } = prepareRetries({ maxRetries: maxRetriesArg }) const baseTelemetryAttributes = getBaseTelemetryAttributes({ model, telemetry, headers, settings: { maxRetries } }) const tracer = getTracer(telemetry) return recordSpan({ name: "ai.embedMany", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.embedMany", telemetry }), ...baseTelemetryAttributes, // specific settings that only make sense on the outer level: "ai.values": { input: () => values.map((value) => JSON.stringify(value)) } } }), tracer, fn: async (span) => { const maxEmbeddingsPerCall = model.maxEmbeddingsPerCall if (maxEmbeddingsPerCall == null) { const { embeddings: embeddings2, usage } = await retry(() => { return recordSpan({ name: "ai.embedMany.doEmbed", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.embedMany.doEmbed", telemetry }), ...baseTelemetryAttributes, // specific settings that only make sense on the outer level: "ai.values": { input: () => values.map((value) => JSON.stringify(value)) } } }), tracer, fn: async (doEmbedSpan) => { var _a14 const modelResponse = await model.doEmbed({ values, abortSignal, headers }) const embeddings3 = modelResponse.embeddings const usage2 = (_a14 = modelResponse.usage) != null ? _a14 : { tokens: NaN } doEmbedSpan.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.embeddings": { output: () => embeddings3.map((embedding) => JSON.stringify(embedding)) }, "ai.usage.tokens": usage2.tokens } }) ) return { embeddings: embeddings3, usage: usage2 } } }) }) span.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.embeddings": { output: () => embeddings2.map((embedding) => JSON.stringify(embedding)) }, "ai.usage.tokens": usage.tokens } }) ) return new DefaultEmbedManyResult({ values, embeddings: embeddings2, usage }) } const valueChunks = splitArray(values, maxEmbeddingsPerCall) const embeddings = [] let tokens = 0 for (const chunk of valueChunks) { const { embeddings: responseEmbeddings, usage } = await retry(() => { return recordSpan({ name: "ai.embedMany.doEmbed", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.embedMany.doEmbed", telemetry }), ...baseTelemetryAttributes, // specific settings that only make sense on the outer level: "ai.values": { input: () => chunk.map((value) => JSON.stringify(value)) } } }), tracer, fn: async (doEmbedSpan) => { var _a14 const modelResponse = await model.doEmbed({ values: chunk, abortSignal, headers }) const embeddings2 = modelResponse.embeddings const usage2 = (_a14 = modelResponse.usage) != null ? _a14 : { tokens: NaN } doEmbedSpan.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.embeddings": { output: () => embeddings2.map((embedding) => JSON.stringify(embedding)) }, "ai.usage.tokens": usage2.tokens } }) ) return { embeddings: embeddings2, usage: usage2 } } }) }) embeddings.push(...responseEmbeddings) tokens += usage.tokens } span.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.embeddings": { output: () => embeddings.map((embedding) => JSON.stringify(embedding)) }, "ai.usage.tokens": tokens } }) ) return new DefaultEmbedManyResult({ values, embeddings, usage: { tokens } }) } }) } var DefaultEmbedManyResult = class { constructor(options) { this.values = options.values this.embeddings = options.embeddings this.usage = options.usage } } // core/generate-image/generate-image.ts var import_provider_utils2 = require("@ai-sdk/provider-utils") async function generateImage({ model, prompt, n = 1, size, aspectRatio, seed, providerOptions, maxRetries: maxRetriesArg, abortSignal, headers }) { var _a14 const { retry } = prepareRetries({ maxRetries: maxRetriesArg }) const maxImagesPerCall = (_a14 = model.maxImagesPerCall) != null ? _a14 : 1 const callCount = Math.ceil(n / maxImagesPerCall) const callImageCounts = Array.from({ length: callCount }, (_, i) => { if (i < callCount - 1) { return maxImagesPerCall } const remainder = n % maxImagesPerCall return remainder === 0 ? maxImagesPerCall : remainder }) const results = await Promise.all( callImageCounts.map( async (callImageCount) => retry( () => model.doGenerate({ prompt, n: callImageCount, abortSignal, headers, size, aspectRatio, seed, providerOptions: providerOptions != null ? providerOptions : {} }) ) ) ) const images = [] const warnings = [] for (const result of results) { images.push( ...result.images.map((image) => new DefaultGeneratedImage({ image })) ) warnings.push(...result.warnings) } return new DefaultGenerateImageResult({ images, warnings }) } var DefaultGenerateImageResult = class { constructor(options) { this.images = options.images this.warnings = options.warnings } get image() { return this.images[0] } } var DefaultGeneratedImage = class { constructor({ image }) { const isUint8Array = image instanceof Uint8Array this.base64Data = isUint8Array ? void 0 : image this.uint8ArrayData = isUint8Array ? image : void 0 } // lazy conversion with caching to avoid unnecessary conversion overhead: get base64() { if (this.base64Data == null) { this.base64Data = (0, import_provider_utils2.convertUint8ArrayToBase64)(this.uint8ArrayData) } return this.base64Data } // lazy conversion with caching to avoid unnecessary conversion overhead: get uint8Array() { if (this.uint8ArrayData == null) { this.uint8ArrayData = (0, import_provider_utils2.convertBase64ToUint8Array)(this.base64Data) } return this.uint8ArrayData } } // core/generate-object/generate-object.ts var import_provider_utils6 = require("@ai-sdk/provider-utils") // errors/no-object-generated-error.ts var import_provider4 = require("@ai-sdk/provider") var name3 = "AI_NoObjectGeneratedError" var marker3 = `vercel.ai.error.${name3}` var symbol3 = Symbol.for(marker3) var _a3 var NoObjectGeneratedError = class extends import_provider4.AISDKError { constructor({ message = "No object generated.", cause, text: text2, response, usage }) { super({ name: name3, message, cause }) this[_a3] = true this.text = text2 this.response = response this.usage = usage } static isInstance(error) { return import_provider4.AISDKError.hasMarker(error, marker3) } } _a3 = symbol3 // util/download-error.ts var import_provider5 = require("@ai-sdk/provider") var name4 = "AI_DownloadError" var marker4 = `vercel.ai.error.${name4}` var symbol4 = Symbol.for(marker4) var _a4 var DownloadError = class extends import_provider5.AISDKError { constructor({ url, statusCode, statusText, cause, message = cause == null ? `Failed to download ${url}: ${statusCode} ${statusText}` : `Failed to download ${url}: ${cause}` }) { super({ name: name4, message, cause }) this[_a4] = true this.url = url this.statusCode = statusCode this.statusText = statusText } static isInstance(error) { return import_provider5.AISDKError.hasMarker(error, marker4) } } _a4 = symbol4 // util/download.ts async function download({ url, fetchImplementation = fetch }) { var _a14 const urlText = url.toString() try { const response = await fetchImplementation(urlText) if (!response.ok) { throw new DownloadError({ url: urlText, statusCode: response.status, statusText: response.statusText }) } return { data: new Uint8Array(await response.arrayBuffer()), mimeType: (_a14 = response.headers.get("content-type")) != null ? _a14 : void 0 } } catch (error) { if (DownloadError.isInstance(error)) { throw error } throw new DownloadError({ url: urlText, cause: error }) } } // core/util/detect-image-mimetype.ts var mimeTypeSignatures = [ { mimeType: "image/gif", bytes: [71, 73, 70] }, { mimeType: "image/png", bytes: [137, 80, 78, 71] }, { mimeType: "image/jpeg", bytes: [255, 216] }, { mimeType: "image/webp", bytes: [82, 73, 70, 70] } ] function detectImageMimeType(image) { for (const { bytes, mimeType } of mimeTypeSignatures) { if (image.length >= bytes.length && bytes.every((byte, index) => image[index] === byte)) { return mimeType } } return void 0 } // core/prompt/data-content.ts var import_provider_utils3 = require("@ai-sdk/provider-utils") // core/prompt/invalid-data-content-error.ts var import_provider6 = require("@ai-sdk/provider") var name5 = "AI_InvalidDataContentError" var marker5 = `vercel.ai.error.${name5}` var symbol5 = Symbol.for(marker5) var _a5 var InvalidDataContentError = class extends import_provider6.AISDKError { constructor({ content, cause, message = `Invalid data content. Expected a base64 string, Uint8Array, ArrayBuffer, or Buffer, but got ${typeof content}.` }) { super({ name: name5, message, cause }) this[_a5] = true this.content = content } static isInstance(error) { return import_provider6.AISDKError.hasMarker(error, marker5) } } _a5 = symbol5 // core/prompt/data-content.ts var import_zod = require("zod") var dataContentSchema = import_zod.z.union([ import_zod.z.string(), import_zod.z.instanceof(Uint8Array), import_zod.z.instanceof(ArrayBuffer), import_zod.z.custom( // Buffer might not be available in some environments such as CloudFlare: (value) => { var _a14, _b return (_b = (_a14 = globalThis.Buffer) == null ? void 0 : _a14.isBuffer(value)) != null ? _b : false }, { message: "Must be a Buffer" } ) ]) function convertDataContentToBase64String(content) { if (typeof content === "string") { return content } if (content instanceof ArrayBuffer) { return (0, import_provider_utils3.convertUint8ArrayToBase64)(new Uint8Array(content)) } return (0, import_provider_utils3.convertUint8ArrayToBase64)(content) } function convertDataContentToUint8Array(content) { if (content instanceof Uint8Array) { return content } if (typeof content === "string") { try { return (0, import_provider_utils3.convertBase64ToUint8Array)(content) } catch (error) { throw new InvalidDataContentError({ message: "Invalid data content. Content string is not a base64-encoded media.", content, cause: error }) } } if (content instanceof ArrayBuffer) { return new Uint8Array(content) } throw new InvalidDataContentError({ content }) } function convertUint8ArrayToText(uint8Array) { try { return new TextDecoder().decode(uint8Array) } catch (error) { throw new Error("Error decoding Uint8Array to text") } } // core/prompt/invalid-message-role-error.ts var import_provider7 = require("@ai-sdk/provider") var name6 = "AI_InvalidMessageRoleError" var marker6 = `vercel.ai.error.${name6}` var symbol6 = Symbol.for(marker6) var _a6 var InvalidMessageRoleError = class extends import_provider7.AISDKError { constructor({ role, message = `Invalid message role: '${role}'. Must be one of: "system", "user", "assistant", "tool".` }) { super({ name: name6, message }) this[_a6] = true this.role = role } static isInstance(error) { return import_provider7.AISDKError.hasMarker(error, marker6) } } _a6 = symbol6 // core/prompt/split-data-url.ts function splitDataUrl(dataUrl) { try { const [header, base64Content] = dataUrl.split(",") return { mimeType: header.split(";")[0].split(":")[1], base64Content } } catch (error) { return { mimeType: void 0, base64Content: void 0 } } } // core/prompt/convert-to-language-model-prompt.ts async function convertToLanguageModelPrompt({ prompt, modelSupportsImageUrls = true, modelSupportsUrl = () => false, downloadImplementation = download }) { const downloadedAssets = await downloadAssets( prompt.messages, downloadImplementation, modelSupportsImageUrls, modelSupportsUrl ) return [ ...prompt.system != null ? [{ role: "system", content: prompt.system }] : [], ...prompt.messages.map( (message) => convertToLanguageModelMessage(message, downloadedAssets) ) ] } function convertToLanguageModelMessage(message, downloadedAssets) { const role = message.role switch (role) { case "system": { return { role: "system", content: message.content, providerMetadata: message.experimental_providerMetadata } } case "user": { if (typeof message.content === "string") { return { role: "user", content: [{ type: "text", text: message.content }], providerMetadata: message.experimental_providerMetadata } } return { role: "user", content: message.content.map((part) => convertPartToLanguageModelPart(part, downloadedAssets)).filter((part) => part.type !== "text" || part.text !== ""), providerMetadata: message.experimental_providerMetadata } } case "assistant": { if (typeof message.content === "string") { return { role: "assistant", content: [{ type: "text", text: message.content }], providerMetadata: message.experimental_providerMetadata } } return { role: "assistant", content: message.content.filter( // remove empty text parts: (part) => part.type !== "text" || part.text !== "" ).map((part) => { const { experimental_providerMetadata, ...rest } = part return { ...rest, providerMetadata: experimental_providerMetadata } }), providerMetadata: message.experimental_providerMetadata } } case "tool": { return { role: "tool", content: message.content.map((part) => ({ type: "tool-result", toolCallId: part.toolCallId, toolName: part.toolName, result: part.result, content: part.experimental_content, isError: part.isError, providerMetadata: part.experimental_providerMetadata })), providerMetadata: message.experimental_providerMetadata } } default: { const _exhaustiveCheck = role throw new InvalidMessageRoleError({ role: _exhaustiveCheck }) } } } async function downloadAssets(messages, downloadImplementation, modelSupportsImageUrls, modelSupportsUrl) { const urls = messages.filter((message) => message.role === "user").map((message) => message.content).filter( (content) => Array.isArray(content) ).flat().filter( (part) => part.type === "image" || part.type === "file" ).filter( (part) => !(part.type === "image" && modelSupportsImageUrls === true) ).map((part) => part.type === "image" ? part.image : part.data).map( (part) => ( // support string urls: typeof part === "string" && (part.startsWith("http:") || part.startsWith("https:")) ? new URL(part) : part ) ).filter((image) => image instanceof URL).filter((url) => !modelSupportsUrl(url)) const downloadedImages = await Promise.all( urls.map(async (url) => ({ url, data: await downloadImplementation({ url }) })) ) return Object.fromEntries( downloadedImages.map(({ url, data }) => [url.toString(), data]) ) } function convertPartToLanguageModelPart(part, downloadedAssets) { var _a14 if (part.type === "text") { return { type: "text", text: part.text, providerMetadata: part.experimental_providerMetadata } } let mimeType = part.mimeType let data let content let normalizedData const type = part.type switch (type) { case "image": data = part.image break case "file": data = part.data break default: throw new Error(`Unsupported part type: ${type}`) } try { content = typeof data === "string" ? new URL(data) : data } catch (error) { content = data } if (content instanceof URL) { if (content.protocol === "data:") { const { mimeType: dataUrlMimeType, base64Content } = splitDataUrl( content.toString() ) if (dataUrlMimeType == null || base64Content == null) { throw new Error(`Invalid data URL format in part ${type}`) } mimeType = dataUrlMimeType normalizedData = convertDataContentToUint8Array(base64Content) } else { const downloadedFile = downloadedAssets[content.toString()] if (downloadedFile) { normalizedData = downloadedFile.data mimeType != null ? mimeType : mimeType = downloadedFile.mimeType } else { normalizedData = content } } } else { normalizedData = convertDataContentToUint8Array(content) } switch (type) { case "image": { if (normalizedData instanceof Uint8Array) { mimeType = (_a14 = detectImageMimeType(normalizedData)) != null ? _a14 : mimeType } return { type: "image", image: normalizedData, mimeType, providerMetadata: part.experimental_providerMetadata } } case "file": { if (mimeType == null) { throw new Error(`Mime type is missing for file part`) } return { type: "file", data: normalizedData instanceof Uint8Array ? convertDataContentToBase64String(normalizedData) : normalizedData, mimeType, providerMetadata: part.experimental_providerMetadata } } } } // core/prompt/prepare-call-settings.ts function prepareCallSettings({ maxTokens, temperature, topP, topK, presencePenalty, frequencyPenalty, stopSequences, seed }) { if (maxTokens != null) { if (!Number.isInteger(maxTokens)) { throw new InvalidArgumentError({ parameter: "maxTokens", value: maxTokens, message: "maxTokens must be an integer" }) } if (maxTokens < 1) { throw new InvalidArgumentError({ parameter: "maxTokens", value: maxTokens, message: "maxTokens must be >= 1" }) } } if (temperature != null) { if (typeof temperature !== "number") { throw new InvalidArgumentError({ parameter: "temperature", value: temperature, message: "temperature must be a number" }) } } if (topP != null) { if (typeof topP !== "number") { throw new InvalidArgumentError({ parameter: "topP", value: topP, message: "topP must be a number" }) } } if (topK != null) { if (typeof topK !== "number") { throw new InvalidArgumentError({ parameter: "topK", value: topK, message: "topK must be a number" }) } } if (presencePenalty != null) { if (typeof presencePenalty !== "number") { throw new InvalidArgumentError({ parameter: "presencePenalty", value: presencePenalty, message: "presencePenalty must be a number" }) } } if (frequencyPenalty != null) { if (typeof frequencyPenalty !== "number") { throw new InvalidArgumentError({ parameter: "frequencyPenalty", value: frequencyPenalty, message: "frequencyPenalty must be a number" }) } } if (seed != null) { if (!Number.isInteger(seed)) { throw new InvalidArgumentError({ parameter: "seed", value: seed, message: "seed must be an integer" }) } } return { maxTokens, temperature: temperature != null ? temperature : 0, topP, topK, presencePenalty, frequencyPenalty, stopSequences: stopSequences != null && stopSequences.length > 0 ? stopSequences : void 0, seed } } // core/prompt/standardize-prompt.ts var import_provider9 = require("@ai-sdk/provider") var import_provider_utils4 = require("@ai-sdk/provider-utils") var import_zod7 = require("zod") // core/prompt/message.ts var import_zod6 = require("zod") // core/types/provider-metadata.ts var import_zod3 = require("zod") // core/types/json-value.ts var import_zod2 = require("zod") var jsonValueSchema = import_zod2.z.lazy( () => import_zod2.z.union([ import_zod2.z.null(), import_zod2.z.string(), import_zod2.z.number(), import_zod2.z.boolean(), import_zod2.z.record(import_zod2.z.string(), jsonValueSchema), import_zod2.z.array(jsonValueSchema) ]) ) // core/types/provider-metadata.ts var providerMetadataSchema = import_zod3.z.record( import_zod3.z.string(), import_zod3.z.record(import_zod3.z.string(), jsonValueSchema) ) // core/prompt/content-part.ts var import_zod5 = require("zod") // core/prompt/tool-result-content.ts var import_zod4 = require("zod") var toolResultContentSchema = import_zod4.z.array( import_zod4.z.union([ import_zod4.z.object({ type: import_zod4.z.literal("text"), text: import_zod4.z.string() }), import_zod4.z.object({ type: import_zod4.z.literal("image"), data: import_zod4.z.string(), mimeType: import_zod4.z.string().optional() }) ]) ) // core/prompt/content-part.ts var textPartSchema = import_zod5.z.object({ type: import_zod5.z.literal("text"), text: import_zod5.z.string(), experimental_providerMetadata: providerMetadataSchema.optional() }) var imagePartSchema = import_zod5.z.object({ type: import_zod5.z.literal("image"), image: import_zod5.z.union([dataContentSchema, import_zod5.z.instanceof(URL)]), mimeType: import_zod5.z.string().optional(), experimental_providerMetadata: providerMetadataSchema.optional() }) var filePartSchema = import_zod5.z.object({ type: import_zod5.z.literal("file"), data: import_zod5.z.union([dataContentSchema, import_zod5.z.instanceof(URL)]), mimeType: import_zod5.z.string(), experimental_providerMetadata: providerMetadataSchema.optional() }) var toolCallPartSchema = import_zod5.z.object({ type: import_zod5.z.literal("tool-call"), toolCallId: import_zod5.z.string(), toolName: import_zod5.z.string(), args: import_zod5.z.unknown() }) var toolResultPartSchema = import_zod5.z.object({ type: import_zod5.z.literal("tool-result"), toolCallId: import_zod5.z.string(), toolName: import_zod5.z.string(), result: import_zod5.z.unknown(), content: toolResultContentSchema.optional(), isError: import_zod5.z.boolean().optional(), experimental_providerMetadata: providerMetadataSchema.optional() }) // core/prompt/message.ts var coreSystemMessageSchema = import_zod6.z.object({ role: import_zod6.z.literal("system"), content: import_zod6.z.string(), experimental_providerMetadata: providerMetadataSchema.optional() }) var coreUserMessageSchema = import_zod6.z.object({ role: import_zod6.z.literal("user"), content: import_zod6.z.union([ import_zod6.z.string(), import_zod6.z.array(import_zod6.z.union([textPartSchema, imagePartSchema, filePartSchema])) ]), experimental_providerMetadata: providerMetadataSchema.optional() }) var coreAssistantMessageSchema = import_zod6.z.object({ role: import_zod6.z.literal("assistant"), content: import_zod6.z.union([ import_zod6.z.string(), import_zod6.z.array(import_zod6.z.union([textPartSchema, toolCallPartSchema])) ]), experimental_providerMetadata: providerMetadataSchema.optional() }) var coreToolMessageSchema = import_zod6.z.object({ role: import_zod6.z.literal("tool"), content: import_zod6.z.array(toolResultPartSchema), experimental_providerMetadata: providerMetadataSchema.optional() }) var coreMessageSchema = import_zod6.z.union([ coreSystemMessageSchema, coreUserMessageSchema, coreAssistantMessageSchema, coreToolMessageSchema ]) // core/prompt/detect-prompt-type.ts function detectPromptType(prompt) { if (!Array.isArray(prompt)) { return "other" } if (prompt.length === 0) { return "messages" } const characteristics = prompt.map(detectSingleMessageCharacteristics) if (characteristics.some((c) => c === "has-ui-specific-parts")) { return "ui-messages" } else if (characteristics.every( (c) => c === "has-core-specific-parts" || c === "message" )) { return "messages" } else { return "other" } } function detectSingleMessageCharacteristics(message) { if (typeof message === "object" && message !== null && (message.role === "function" || // UI-only role message.role === "data" || // UI-only role "toolInvocations" in message || // UI-specific field "experimental_attachments" in message)) { return "has-ui-specific-parts" } else if (typeof message === "object" && message !== null && "content" in message && (Array.isArray(message.content) || // Core messages can have array content "experimental_providerMetadata" in message)) { return "has-core-specific-parts" } else if (typeof message === "object" && message !== null && "role" in message && "content" in message && typeof message.content === "string" && ["system", "user", "assistant", "tool"].includes(message.role)) { return "message" } else { return "other" } } // core/prompt/attachments-to-parts.ts function attachmentsToParts(attachments) { var _a14, _b, _c const parts = [] for (const attachment of attachments) { let url try { url = new URL(attachment.url) } catch (error) { throw new Error(`Invalid URL: ${attachment.url}`) } switch (url.protocol) { case "http:": case "https:": { if ((_a14 = attachment.contentType) == null ? void 0 : _a14.startsWith("image/")) { parts.push({ type: "image", image: url }) } else { if (!attachment.contentType) { throw new Error( "If the attachment is not an image, it must specify a content type" ) } parts.push({ type: "file", data: url, mimeType: attachment.contentType }) } break } case "data:": { let header let base64Content let mimeType try { [header, base64Content] = attachment.url.split(",") mimeType = header.split(";")[0].split(":")[1] } catch (error) { throw new Error(`Error processing data URL: ${attachment.url}`) } if (mimeType == null || base64Content == null) { throw new Error(`Invalid data URL format: ${attachment.url}`) } if ((_b = attachment.contentType) == null ? void 0 : _b.startsWith("image/")) { parts.push({ type: "image", image: convertDataContentToUint8Array(base64Content) }) } else if ((_c = attachment.contentType) == null ? void 0 : _c.startsWith("text/")) { parts.push({ type: "text", text: convertUint8ArrayToText( convertDataContentToUint8Array(base64Content) ) }) } else { if (!attachment.contentType) { throw new Error( "If the attachment is not an image or text, it must specify a content type" ) } parts.push({ type: "file", data: base64Content, mimeType: attachment.contentType }) } break } default: { throw new Error(`Unsupported URL protocol: ${url.protocol}`) } } } return parts } // core/prompt/message-conversion-error.ts var import_provider8 = require("@ai-sdk/provider") var name7 = "AI_MessageConversionError" var marker7 = `vercel.ai.error.${name7}` var symbol7 = Symbol.for(marker7) var _a7 var MessageConversionError = class extends import_provider8.AISDKError { constructor({ originalMessage, message }) { super({ name: name7, message }) this[_a7] = true this.originalMessage = originalMessage } static isInstance(error) { return import_provider8.AISDKError.hasMarker(error, marker7) } } _a7 = symbol7 // core/prompt/convert-to-core-messages.ts function convertToCoreMessages(messages, options) { var _a14 const tools = (_a14 = options == null ? void 0 : options.tools) != null ? _a14 : {} const coreMessages = [] for (const message of messages) { const { role, content, toolInvocations, experimental_attachments } = message switch (role) { case "system": { coreMessages.push({ role: "system", content }) break } case "user": { coreMessages.push({ role: "user", content: experimental_attachments ? [ { type: "text", text: content }, ...attachmentsToParts(experimental_attachments) ] : content }) break } case "assistant": { if (toolInvocations == null || toolInvocations.length === 0) { coreMessages.push({ role: "assistant", content }) break } coreMessages.push({ role: "assistant", content: [ { type: "text", text: content }, ...toolInvocations.map( ({ toolCallId, toolName, args }) => ({ type: "tool-call", toolCallId, toolName, args }) ) ] }) coreMessages.push({ role: "tool", content: toolInvocations.map((toolInvocation) => { if (!("result" in toolInvocation)) { throw new MessageConversionError({ originalMessage: message, message: "ToolInvocation must have a result: " + JSON.stringify(toolInvocation) }) } const { toolCallId, toolName, result } = toolInvocation const tool2 = tools[toolName] return (tool2 == null ? void 0 : tool2.experimental_toToolResultContent) != null ? { type: "tool-result", toolCallId, toolName, result: tool2.experimental_toToolResultContent(result), experimental_content: tool2.experimental_toToolResultContent(result) } : { type: "tool-result", toolCallId, toolName, result } }) }) break } case "data": { break } default: { const _exhaustiveCheck = role throw new MessageConversionError({ originalMessage: message, message: `Unsupported role: ${_exhaustiveCheck}` }) } } } return coreMessages } // core/prompt/standardize-prompt.ts function standardizePrompt({ prompt, tools }) { if (prompt.prompt == null && prompt.messages == null) { throw new import_provider9.InvalidPromptError({ prompt, message: "prompt or messages must be defined" }) } if (prompt.prompt != null && prompt.messages != null) { throw new import_provider9.InvalidPromptError({ prompt, message: "prompt and messages cannot be defined at the same time" }) } if (prompt.system != null && typeof prompt.system !== "string") { throw new import_provider9.InvalidPromptError({ prompt, message: "system must be a string" }) } if (prompt.prompt != null) { if (typeof prompt.prompt !== "string") { throw new import_provider9.InvalidPromptError({ prompt, message: "prompt must be a string" }) } return { type: "prompt", system: prompt.system, messages: [ { role: "user", content: prompt.prompt } ] } } if (prompt.messages != null) { const promptType = detectPromptType(prompt.messages) if (promptType === "other") { throw new import_provider9.InvalidPromptError({ prompt, message: "messages must be an array of CoreMessage or UIMessage" }) } const messages = promptType === "ui-messages" ? convertToCoreMessages(prompt.messages, { tools }) : prompt.messages const validationResult = (0, import_provider_utils4.safeValidateTypes)({ value: messages, schema: import_zod7.z.array(coreMessageSchema) }) if (!validationResult.success) { throw new import_provider9.InvalidPromptError({ prompt, message: "messages must be an array of CoreMessage or UIMessage", cause: validationResult.error }) } return { type: "messages", messages, system: prompt.system } } throw new Error("unreachable") } // core/types/usage.ts function calculateLanguageModelUsage({ promptTokens, completionTokens }) { return { promptTokens, completionTokens, totalTokens: promptTokens + completionTokens } } function addLanguageModelUsage(usage1, usage2) { return { promptTokens: usage1.promptTokens + usage2.promptTokens, completionTokens: usage1.completionTokens + usage2.completionTokens, totalTokens: usage1.totalTokens + usage2.totalTokens } } // core/generate-object/inject-json-instruction.ts var DEFAULT_SCHEMA_PREFIX = "JSON schema:" var DEFAULT_SCHEMA_SUFFIX = "You MUST answer with a JSON object that matches the JSON schema above." var DEFAULT_GENERIC_SUFFIX = "You MUST answer with JSON." function injectJsonInstruction({ prompt, schema, schemaPrefix = schema != null ? DEFAULT_SCHEMA_PREFIX : void 0, schemaSuffix = schema != null ? DEFAULT_SCHEMA_SUFFIX : DEFAULT_GENERIC_SUFFIX }) { return [ prompt != null && prompt.length > 0 ? prompt : void 0, prompt != null && prompt.length > 0 ? "" : void 0, // add a newline if prompt is not null schemaPrefix, schema != null ? JSON.stringify(schema) : void 0, schemaSuffix ].filter((line) => line != null).join("\n") } // core/generate-object/output-strategy.ts var import_provider10 = require("@ai-sdk/provider") var import_provider_utils5 = require("@ai-sdk/provider-utils") var import_ui_utils2 = require("@ai-sdk/ui-utils") // core/util/async-iterable-stream.ts function createAsyncIterableStream(source) { const stream = source.pipeThrough(new TransformStream()) stream[Symbol.asyncIterator] = () => { const reader = stream.getReader() return { async next() { const { done, value } = await reader.read() return done ? { done: true, value: void 0 } : { done: false, value } } } } return stream } // core/generate-object/output-strategy.ts var noSchemaOutputStrategy = { type: "no-schema", jsonSchema: void 0, validatePartialResult({ value, textDelta }) { return { success: true, value: { partial: value, textDelta } } }, validateFinalResult(value, context) { return value === void 0 ? { success: false, error: new NoObjectGeneratedError({ message: "No object generated: response did not match schema.", text: context.text, response: context.response, usage: context.usage }) } : { success: true, value } }, createElementStream() { throw new import_provider10.UnsupportedFunctionalityError({ functionality: "element streams in no-schema mode" }) } } var objectOutputStrategy = (schema) => ({ type: "object", jsonSchema: schema.jsonSchema, validatePartialResult({ value, textDelta }) { return { success: true, value: { // Note: currently no validation of partial results: partial: value, textDelta } } }, validateFinalResult(value) { return (0, import_provider_utils5.safeValidateTypes)({ value, schema }) }, createElementStream() { throw new import_provider10.UnsupportedFunctionalityError({ functionality: "element streams in object mode" }) } }) var arrayOutputStrategy = (schema) => { const { $schema, ...itemSchema } = schema.jsonSchema return { type: "enum", // wrap in object that contains array of elements, since most LLMs will not // be able to generate an array directly: // possible future optimization: use arrays directly when model supports grammar-guided generation jsonSchema: { $schema: "https://json-schema.org/draft/2019-09/schema#", type: "object", properties: { elements: { type: "array", items: itemSchema } }, required: ["elements"], additionalProperties: false }, validatePartialResult({ value, latestObject, isFirstDelta, isFinalDelta }) { var _a14 if (!(0, import_provider10.isJSONObject)(value) || !(0, import_provider10.isJSONArray)(value.elements)) { return { success: false, error: new import_provider10.TypeValidationError({ value, cause: "value must be an object that contains an array of elements" }) } } const inputArray = value.elements const resultArray = [] for (let i = 0; i < inputArray.length; i++) { const element = inputArray[i] const result = (0, import_provider_utils5.safeValidateTypes)({ value: element, schema }) if (i === inputArray.length - 1 && !isFinalDelta) { continue } if (!result.success) { return result } resultArray.push(result.value) } const publishedElementCount = (_a14 = latestObject == null ? void 0 : latestObject.length) != null ? _a14 : 0 let textDelta = "" if (isFirstDelta) { textDelta += "[" } if (publishedElementCount > 0) { textDelta += "," } textDelta += resultArray.slice(publishedElementCount).map((element) => JSON.stringify(element)).join(",") if (isFinalDelta) { textDelta += "]" } return { success: true, value: { partial: resultArray, textDelta } } }, validateFinalResult(value) { if (!(0, import_provider10.isJSONObject)(value) || !(0, import_provider10.isJSONArray)(value.elements)) { return { success: false, error: new import_provider10.TypeValidationError({ value, cause: "value must be an object that contains an array of elements" }) } } const inputArray = value.elements for (const element of inputArray) { const result = (0, import_provider_utils5.safeValidateTypes)({ value: element, schema }) if (!result.success) { return result } } return { success: true, value: inputArray } }, createElementStream(originalStream) { let publishedElements = 0 return createAsyncIterableStream( originalStream.pipeThrough( new TransformStream({ transform(chunk, controller) { switch (chunk.type) { case "object": { const array = chunk.object for (; publishedElements < array.length; publishedElements++) { controller.enqueue(array[publishedElements]) } break } case "text-delta": case "finish": break case "error": controller.error(chunk.error) break default: { const _exhaustiveCheck = chunk throw new Error( `Unsupported chunk type: ${_exhaustiveCheck}` ) } } } }) ) ) } } } var enumOutputStrategy = (enumValues) => { return { type: "enum", // wrap in object that contains result, since most LLMs will not // be able to generate an enum value directly: // possible future optimization: use enums directly when model supports top-level enums jsonSchema: { $schema: "https://json-schema.org/draft/2019-09/schema#", type: "object", properties: { result: { type: "string", enum: enumValues } }, required: ["result"], additionalProperties: false }, validateFinalResult(value) { if (!(0, import_provider10.isJSONObject)(value) || typeof value.result !== "string") { return { success: false, error: new import_provider10.TypeValidationError({ value, cause: 'value must be an object that contains a string in the "result" property.' }) } } const result = value.result return enumValues.includes(result) ? { success: true, value: result } : { success: false, error: new import_provider10.TypeValidationError({ value, cause: "value must be a string in the enum" }) } }, validatePartialResult() { throw new import_provider10.UnsupportedFunctionalityError({ functionality: "partial results in enum mode" }) }, createElementStream() { throw new import_provider10.UnsupportedFunctionalityError({ functionality: "element streams in enum mode" }) } } } function getOutputStrategy({ output, schema, enumValues }) { switch (output) { case "object": return objectOutputStrategy((0, import_ui_utils2.asSchema)(schema)) case "array": return arrayOutputStrategy((0, import_ui_utils2.asSchema)(schema)) case "enum": return enumOutputStrategy(enumValues) case "no-schema": return noSchemaOutputStrategy default: { const _exhaustiveCheck = output throw new Error(`Unsupported output: ${_exhaustiveCheck}`) } } } // core/generate-object/validate-object-generation-input.ts function validateObjectGenerationInput({ output, mode, schema, schemaName, schemaDescription, enumValues }) { if (output != null && output !== "object" && output !== "array" && output !== "enum" && output !== "no-schema") { throw new InvalidArgumentError({ parameter: "output", value: output, message: "Invalid output type." }) } if (output === "no-schema") { if (mode === "auto" || mode === "tool") { throw new InvalidArgumentError({ parameter: "mode", value: mode, message: 'Mode must be "json" for no-schema output.' }) } if (schema != null) { throw new InvalidArgumentError({ parameter: "schema", value: schema, message: "Schema is not supported for no-schema output." }) } if (schemaDescription != null) { throw new InvalidArgumentError({ parameter: "schemaDescription", value: schemaDescription, message: "Schema description is not supported for no-schema output." }) } if (schemaName != null) { throw new InvalidArgumentError({ parameter: "schemaName", value: schemaName, message: "Schema name is not supported for no-schema output." }) } if (enumValues != null) { throw new InvalidArgumentError({ parameter: "enumValues", value: enumValues, message: "Enum values are not supported for no-schema output." }) } } if (output === "object") { if (schema == null) { throw new InvalidArgumentError({ parameter: "schema", value: schema, message: "Schema is required for object output." }) } if (enumValues != null) { throw new InvalidArgumentError({ parameter: "enumValues", value: enumValues, message: "Enum values are not supported for object output." }) } } if (output === "array") { if (schema == null) { throw new InvalidArgumentError({ parameter: "schema", value: schema, message: "Element schema is required for array output." }) } if (enumValues != null) { throw new InvalidArgumentError({ parameter: "enumValues", value: enumValues, message: "Enum values are not supported for array output." }) } } if (output === "enum") { if (schema != null) { throw new InvalidArgumentError({ parameter: "schema", value: schema, message: "Schema is not supported for enum output." }) } if (schemaDescription != null) { throw new InvalidArgumentError({ parameter: "schemaDescription", value: schemaDescription, message: "Schema description is not supported for enum output." }) } if (schemaName != null) { throw new InvalidArgumentError({ parameter: "schemaName", value: schemaName, message: "Schema name is not supported for enum output." }) } if (enumValues == null) { throw new InvalidArgumentError({ parameter: "enumValues", value: enumValues, message: "Enum values are required for enum output." }) } for (const value of enumValues) { if (typeof value !== "string") { throw new InvalidArgumentError({ parameter: "enumValues", value, message: "Enum values must be strings." }) } } } } // core/generate-object/generate-object.ts var originalGenerateId = (0, import_provider_utils6.createIdGenerator)({ prefix: "aiobj", size: 24 }) async function generateObject({ model, enum: enumValues, // rename bc enum is reserved by typescript schema: inputSchema, schemaName, schemaDescription, mode, output = "object", system, prompt, messages, maxRetries: maxRetriesArg, abortSignal, headers, experimental_telemetry: telemetry, experimental_providerMetadata: providerMetadata, _internal: { generateId: generateId3 = originalGenerateId, currentDate = () => /* @__PURE__ */ new Date() } = {}, ...settings }) { validateObjectGenerationInput({ output, mode, schema: inputSchema, schemaName, schemaDescription, enumValues }) const { maxRetries, retry } = prepareRetries({ maxRetries: maxRetriesArg }) const outputStrategy = getOutputStrategy({ output, schema: inputSchema, enumValues }) if (outputStrategy.type === "no-schema" && mode === void 0) { mode = "json" } const baseTelemetryAttributes = getBaseTelemetryAttributes({ model, telemetry, headers, settings: { ...settings, maxRetries } }) const tracer = getTracer(telemetry) return recordSpan({ name: "ai.generateObject", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.generateObject", telemetry }), ...baseTelemetryAttributes, // specific settings that only make sense on the outer level: "ai.prompt": { input: () => JSON.stringify({ system, prompt, messages }) }, "ai.schema": outputStrategy.jsonSchema != null ? { input: () => JSON.stringify(outputStrategy.jsonSchema) } : void 0, "ai.schema.name": schemaName, "ai.schema.description": schemaDescription, "ai.settings.output": outputStrategy.type, "ai.settings.mode": mode } }), tracer, fn: async (span) => { var _a14, _b if (mode === "auto" || mode == null) { mode = model.defaultObjectGenerationMode } let result let finishReason let usage let warnings let rawResponse let response let request let logprobs let resultProviderMetadata switch (mode) { case "json": { const standardizedPrompt = standardizePrompt({ prompt: { system: outputStrategy.jsonSchema == null ? injectJsonInstruction({ prompt: system }) : model.supportsStructuredOutputs ? system : injectJsonInstruction({ prompt: system, schema: outputStrategy.jsonSchema }), prompt, messages }, tools: void 0 }) const promptMessages = await convertToLanguageModelPrompt({ prompt: standardizedPrompt, modelSupportsImageUrls: model.supportsImageUrls, modelSupportsUrl: model.supportsUrl }) const generateResult = await retry( () => recordSpan({ name: "ai.generateObject.doGenerate", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.generateObject.doGenerate", telemetry }), ...baseTelemetryAttributes, "ai.prompt.format": { input: () => standardizedPrompt.type }, "ai.prompt.messages": { input: () => JSON.stringify(promptMessages) }, "ai.settings.mode": mode, // standardized gen-ai llm span attributes: "gen_ai.system": model.provider, "gen_ai.request.model": model.modelId, "gen_ai.request.frequency_penalty": settings.frequencyPenalty, "gen_ai.request.max_tokens": settings.maxTokens, "gen_ai.request.presence_penalty": settings.presencePenalty, "gen_ai.request.temperature": settings.temperature, "gen_ai.request.top_k": settings.topK, "gen_ai.request.top_p": settings.topP } }), tracer, fn: async (span2) => { var _a15, _b2, _c, _d, _e, _f const result2 = await model.doGenerate({ mode: { type: "object-json", schema: outputStrategy.jsonSchema, name: schemaName, description: schemaDescription }, ...prepareCallSettings(settings), inputFormat: standardizedPrompt.type, prompt: promptMessages, providerMetadata, abortSignal, headers }) const responseData = { id: (_b2 = (_a15 = result2.response) == null ? void 0 : _a15.id) != null ? _b2 : generateId3(), timestamp: (_d = (_c = result2.response) == null ? void 0 : _c.timestamp) != null ? _d : currentDate(), modelId: (_f = (_e = result2.response) == null ? void 0 : _e.modelId) != null ? _f : model.modelId } if (result2.text === void 0) { throw new NoObjectGeneratedError({ message: "No object generated: the model did not return a response.", response: responseData, usage: calculateLanguageModelUsage(result2.usage) }) } span2.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.response.finishReason": result2.finishReason, "ai.response.object": { output: () => result2.text }, "ai.response.id": responseData.id, "ai.response.model": responseData.modelId, "ai.response.timestamp": responseData.timestamp.toISOString(), "ai.usage.promptTokens": result2.usage.promptTokens, "ai.usage.completionTokens": result2.usage.completionTokens, // standardized gen-ai llm span attributes: "gen_ai.response.finish_reasons": [result2.finishReason], "gen_ai.response.id": responseData.id, "gen_ai.response.model": responseData.modelId, "gen_ai.usage.prompt_tokens": result2.usage.promptTokens, "gen_ai.usage.completion_tokens": result2.usage.completionTokens } }) ) return { ...result2, objectText: result2.text, responseData } } }) ) result = generateResult.objectText finishReason = generateResult.finishReason usage = generateResult.usage warnings = generateResult.warnings rawResponse = generateResult.rawResponse logprobs = generateResult.logprobs resultProviderMetadata = generateResult.providerMetadata request = (_a14 = generateResult.request) != null ? _a14 : {} response = generateResult.responseData break } case "tool": { const standardizedPrompt = standardizePrompt({ prompt: { system, prompt, messages }, tools: void 0 }) const promptMessages = await convertToLanguageModelPrompt({ prompt: standardizedPrompt, modelSupportsImageUrls: model.supportsImageUrls, modelSupportsUrl: model.supportsUrl }) const inputFormat = standardizedPrompt.type const generateResult = await retry( () => recordSpan({ name: "ai.generateObject.doGenerate", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.generateObject.doGenerate", telemetry }), ...baseTelemetryAttributes, "ai.prompt.format": { input: () => inputFormat }, "ai.prompt.messages": { input: () => JSON.stringify(promptMessages) }, "ai.settings.mode": mode, // standardized gen-ai llm span attributes: "gen_ai.system": model.provider, "gen_ai.request.model": model.modelId, "gen_ai.request.frequency_penalty": settings.frequencyPenalty, "gen_ai.request.max_tokens": settings.maxTokens, "gen_ai.request.presence_penalty": settings.presencePenalty, "gen_ai.request.temperature": settings.temperature, "gen_ai.request.top_k": settings.topK, "gen_ai.request.top_p": settings.topP } }), tracer, fn: async (span2) => { var _a15, _b2, _c, _d, _e, _f, _g, _h const result2 = await model.doGenerate({ mode: { type: "object-tool", tool: { type: "function", name: schemaName != null ? schemaName : "json", description: schemaDescription != null ? schemaDescription : "Respond with a JSON object.", parameters: outputStrategy.jsonSchema } }, ...prepareCallSettings(settings), inputFormat, prompt: promptMessages, providerMetadata, abortSignal, headers }) const objectText = (_b2 = (_a15 = result2.toolCalls) == null ? void 0 : _a15[0]) == null ? void 0 : _b2.args const responseData = { id: (_d = (_c = result2.response) == null ? void 0 : _c.id) != null ? _d : generateId3(), timestamp: (_f = (_e = result2.response) == null ? void 0 : _e.timestamp) != null ? _f : currentDate(), modelId: (_h = (_g = result2.response) == null ? void 0 : _g.modelId) != null ? _h : model.modelId } if (objectText === void 0) { throw new NoObjectGeneratedError({ message: "No object generated: the tool was not called.", response: responseData, usage: calculateLanguageModelUsage(result2.usage) }) } span2.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.response.finishReason": result2.finishReason, "ai.response.object": { output: () => objectText }, "ai.response.id": responseData.id, "ai.response.model": responseData.modelId, "ai.response.timestamp": responseData.timestamp.toISOString(), "ai.usage.promptTokens": result2.usage.promptTokens, "ai.usage.completionTokens": result2.usage.completionTokens, // standardized gen-ai llm span attributes: "gen_ai.response.finish_reasons": [result2.finishReason], "gen_ai.response.id": responseData.id, "gen_ai.response.model": responseData.modelId, "gen_ai.usage.input_tokens": result2.usage.promptTokens, "gen_ai.usage.output_tokens": result2.usage.completionTokens } }) ) return { ...result2, objectText, responseData } } }) ) result = generateResult.objectText finishReason = generateResult.finishReason usage = generateResult.usage warnings = generateResult.warnings rawResponse = generateResult.rawResponse logprobs = generateResult.logprobs resultProviderMetadata = generateResult.providerMetadata request = (_b = generateResult.request) != null ? _b : {} response = generateResult.responseData break } case void 0: { throw new Error( "Model does not have a default object generation mode." ) } default: { const _exhaustiveCheck = mode throw new Error(`Unsupported mode: ${_exhaustiveCheck}`) } } const parseResult = (0, import_provider_utils6.safeParseJSON)({ text: result }) if (!parseResult.success) { throw new NoObjectGeneratedError({ message: "No object generated: could not parse the response.", cause: parseResult.error, text: result, response, usage: calculateLanguageModelUsage(usage) }) } const validationResult = outputStrategy.validateFinalResult( parseResult.value, { text: result, response, usage: calculateLanguageModelUsage(usage) } ) if (!validationResult.success) { throw new NoObjectGeneratedError({ message: "No object generated: response did not match schema.", cause: validationResult.error, text: result, response, usage: calculateLanguageModelUsage(usage) }) } span.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.response.finishReason": finishReason, "ai.response.object": { output: () => JSON.stringify(validationResult.value) }, "ai.usage.promptTokens": usage.promptTokens, "ai.usage.completionTokens": usage.completionTokens } }) ) return new DefaultGenerateObjectResult({ object: validationResult.value, finishReason, usage: calculateLanguageModelUsage(usage), warnings, request, response: { ...response, headers: rawResponse == null ? void 0 : rawResponse.headers }, logprobs, providerMetadata: resultProviderMetadata }) } }) } var DefaultGenerateObjectResult = class { constructor(options) { this.object = options.object this.finishReason = options.finishReason this.usage = options.usage this.warnings = options.warnings this.experimental_providerMetadata = options.providerMetadata this.response = options.response this.request = options.request this.logprobs = options.logprobs } toJsonResponse(init) { var _a14 return new Response(JSON.stringify(this.object), { status: (_a14 = init == null ? void 0 : init.status) != null ? _a14 : 200, headers: prepareResponseHeaders(init == null ? void 0 : init.headers, { contentType: "application/json; charset=utf-8" }) }) } } // core/generate-object/stream-object.ts var import_provider_utils7 = require("@ai-sdk/provider-utils") var import_ui_utils3 = require("@ai-sdk/ui-utils") // util/delayed-promise.ts var DelayedPromise = class { constructor() { this.status = { type: "pending" } this._resolve = void 0 this._reject = void 0 } get value() { if (this.promise) { return this.promise } this.promise = new Promise((resolve, reject) => { if (this.status.type === "resolved") { resolve(this.status.value) } else if (this.status.type === "rejected") { reject(this.status.error) } this._resolve = resolve this._reject = reject }) return this.promise } resolve(value) { var _a14 this.status = { type: "resolved", value } if (this.promise) { (_a14 = this._resolve) == null ? void 0 : _a14.call(this, value) } } reject(error) { var _a14 this.status = { type: "rejected", error } if (this.promise) { (_a14 = this._reject) == null ? void 0 : _a14.call(this, error) } } } // util/create-resolvable-promise.ts function createResolvablePromise() { let resolve let reject const promise = new Promise((res, rej) => { resolve = res reject = rej }) return { promise, resolve, reject } } // core/util/create-stitchable-stream.ts function createStitchableStream() { let innerStreamReaders = [] let controller = null let isClosed = false let waitForNewStream = createResolvablePromise() const processPull = async () => { if (isClosed && innerStreamReaders.length === 0) { controller == null ? void 0 : controller.close() return } if (innerStreamReaders.length === 0) { waitForNewStream = createResolvablePromise() await waitForNewStream.promise return processPull() } try { const { value, done } = await innerStreamReaders[0].read() if (done) { innerStreamReaders.shift() if (innerStreamReaders.length > 0) { await processPull() } else if (isClosed) { controller == null ? void 0 : controller.close() } } else { controller == null ? void 0 : controller.enqueue(value) } } catch (error) { controller == null ? void 0 : controller.error(error) innerStreamReaders.shift() if (isClosed && innerStreamReaders.length === 0) { controller == null ? void 0 : controller.close() } } } return { stream: new ReadableStream({ start(controllerParam) { controller = controllerParam }, pull: processPull, async cancel() { for (const reader of innerStreamReaders) { await reader.cancel() } innerStreamReaders = [] isClosed = true } }), addStream: (innerStream) => { if (isClosed) { throw new Error("Cannot add inner stream: outer stream is closed") } innerStreamReaders.push(innerStream.getReader()) waitForNewStream.resolve() }, /** * Gracefully close the outer stream. This will let the inner streams * finish processing and then close the outer stream. */ close: () => { isClosed = true waitForNewStream.resolve() if (innerStreamReaders.length === 0) { controller == null ? void 0 : controller.close() } }, /** * Immediately close the outer stream. This will cancel all inner streams * and close the outer stream. */ terminate: () => { isClosed = true waitForNewStream.resolve() innerStreamReaders.forEach((reader) => reader.cancel()) innerStreamReaders = [] controller == null ? void 0 : controller.close() } } } // core/util/now.ts function now() { var _a14, _b return (_b = (_a14 = globalThis == null ? void 0 : globalThis.performance) == null ? void 0 : _a14.now()) != null ? _b : Date.now() } // core/generate-object/stream-object.ts var originalGenerateId2 = (0, import_provider_utils7.createIdGenerator)({ prefix: "aiobj", size: 24 }) function streamObject({ model, schema: inputSchema, schemaName, schemaDescription, mode, output = "object", system, prompt, messages, maxRetries, abortSignal, headers, experimental_telemetry: telemetry, experimental_providerMetadata: providerMetadata, onFinish, _internal: { generateId: generateId3 = originalGenerateId2, currentDate = () => /* @__PURE__ */ new Date(), now: now2 = now } = {}, ...settings }) { validateObjectGenerationInput({ output, mode, schema: inputSchema, schemaName, schemaDescription }) const outputStrategy = getOutputStrategy({ output, schema: inputSchema }) if (outputStrategy.type === "no-schema" && mode === void 0) { mode = "json" } return new DefaultStreamObjectResult({ model, telemetry, headers, settings, maxRetries, abortSignal, outputStrategy, system, prompt, messages, schemaName, schemaDescription, inputProviderMetadata: providerMetadata, mode, onFinish, generateId: generateId3, currentDate, now: now2 }) } var DefaultStreamObjectResult = class { constructor({ model, headers, telemetry, settings, maxRetries: maxRetriesArg, abortSignal, outputStrategy, system, prompt, messages, schemaName, schemaDescription, inputProviderMetadata, mode, onFinish, generateId: generateId3, currentDate, now: now2 }) { this.objectPromise = new DelayedPromise() this.usagePromise = new DelayedPromise() this.providerMetadataPromise = new DelayedPromise() this.warningsPromise = new DelayedPromise() this.requestPromise = new DelayedPromise() this.responsePromise = new DelayedPromise() this.stitchableStream = createStitchableStream() const { maxRetries, retry } = prepareRetries({ maxRetries: maxRetriesArg }) const baseTelemetryAttributes = getBaseTelemetryAttributes({ model, telemetry, headers, settings: { ...settings, maxRetries } }) const tracer = getTracer(telemetry) const self = this recordSpan({ name: "ai.streamObject", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.streamObject", telemetry }), ...baseTelemetryAttributes, // specific settings that only make sense on the outer level: "ai.prompt": { input: () => JSON.stringify({ system, prompt, messages }) }, "ai.schema": outputStrategy.jsonSchema != null ? { input: () => JSON.stringify(outputStrategy.jsonSchema) } : void 0, "ai.schema.name": schemaName, "ai.schema.description": schemaDescription, "ai.settings.output": outputStrategy.type, "ai.settings.mode": mode } }), tracer, endWhenDone: false, fn: async (rootSpan) => { if (mode === "auto" || mode == null) { mode = model.defaultObjectGenerationMode } let callOptions let transformer switch (mode) { case "json": { const standardizedPrompt = standardizePrompt({ prompt: { system: outputStrategy.jsonSchema == null ? injectJsonInstruction({ prompt: system }) : model.supportsStructuredOutputs ? system : injectJsonInstruction({ prompt: system, schema: outputStrategy.jsonSchema }), prompt, messages }, tools: void 0 }) callOptions = { mode: { type: "object-json", schema: outputStrategy.jsonSchema, name: schemaName, description: schemaDescription }, ...prepareCallSettings(settings), inputFormat: standardizedPrompt.type, prompt: await convertToLanguageModelPrompt({ prompt: standardizedPrompt, modelSupportsImageUrls: model.supportsImageUrls, modelSupportsUrl: model.supportsUrl }), providerMetadata: inputProviderMetadata, abortSignal, headers } transformer = { transform: (chunk, controller) => { switch (chunk.type) { case "text-delta": controller.enqueue(chunk.textDelta) break case "response-metadata": case "finish": case "error": controller.enqueue(chunk) break } } } break } case "tool": { const standardizedPrompt = standardizePrompt({ prompt: { system, prompt, messages }, tools: void 0 }) callOptions = { mode: { type: "object-tool", tool: { type: "function", name: schemaName != null ? schemaName : "json", description: schemaDescription != null ? schemaDescription : "Respond with a JSON object.", parameters: outputStrategy.jsonSchema } }, ...prepareCallSettings(settings), inputFormat: standardizedPrompt.type, prompt: await convertToLanguageModelPrompt({ prompt: standardizedPrompt, modelSupportsImageUrls: model.supportsImageUrls, modelSupportsUrl: model.supportsUrl }), providerMetadata: inputProviderMetadata, abortSignal, headers } transformer = { transform(chunk, controller) { switch (chunk.type) { case "tool-call-delta": controller.enqueue(chunk.argsTextDelta) break case "response-metadata": case "finish": case "error": controller.enqueue(chunk) break } } } break } case void 0: { throw new Error( "Model does not have a default object generation mode." ) } default: { const _exhaustiveCheck = mode throw new Error(`Unsupported mode: ${_exhaustiveCheck}`) } } const { result: { stream, warnings, rawResponse, request }, doStreamSpan, startTimestampMs } = await retry( () => recordSpan({ name: "ai.streamObject.doStream", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.streamObject.doStream", telemetry }), ...baseTelemetryAttributes, "ai.prompt.format": { input: () => callOptions.inputFormat }, "ai.prompt.messages": { input: () => JSON.stringify(callOptions.prompt) }, "ai.settings.mode": mode, // standardized gen-ai llm span attributes: "gen_ai.system": model.provider, "gen_ai.request.model": model.modelId, "gen_ai.request.frequency_penalty": settings.frequencyPenalty, "gen_ai.request.max_tokens": settings.maxTokens, "gen_ai.request.presence_penalty": settings.presencePenalty, "gen_ai.request.temperature": settings.temperature, "gen_ai.request.top_k": settings.topK, "gen_ai.request.top_p": settings.topP } }), tracer, endWhenDone: false, fn: async (doStreamSpan2) => ({ startTimestampMs: now2(), doStreamSpan: doStreamSpan2, result: await model.doStream(callOptions) }) }) ) self.requestPromise.resolve(request != null ? request : {}) let usage let finishReason let providerMetadata let object2 let error let accumulatedText = "" let textDelta = "" let response = { id: generateId3(), timestamp: currentDate(), modelId: model.modelId } let latestObjectJson = void 0 let latestObject = void 0 let isFirstChunk = true let isFirstDelta = true const transformedStream = stream.pipeThrough(new TransformStream(transformer)).pipeThrough( new TransformStream({ async transform(chunk, controller) { var _a14, _b, _c if (isFirstChunk) { const msToFirstChunk = now2() - startTimestampMs isFirstChunk = false doStreamSpan.addEvent("ai.stream.firstChunk", { "ai.stream.msToFirstChunk": msToFirstChunk }) doStreamSpan.setAttributes({ "ai.stream.msToFirstChunk": msToFirstChunk }) } if (typeof chunk === "string") { accumulatedText += chunk textDelta += chunk const { value: currentObjectJson, state: parseState } = (0, import_ui_utils3.parsePartialJson)(accumulatedText) if (currentObjectJson !== void 0 && !(0, import_ui_utils3.isDeepEqualData)(latestObjectJson, currentObjectJson)) { const validationResult = outputStrategy.validatePartialResult({ value: currentObjectJson, textDelta, latestObject, isFirstDelta, isFinalDelta: parseState === "successful-parse" }) if (validationResult.success && !(0, import_ui_utils3.isDeepEqualData)( latestObject, validationResult.value.partial )) { latestObjectJson = currentObjectJson latestObject = validationResult.value.partial controller.enqueue({ type: "object", object: latestObject }) controller.enqueue({ type: "text-delta", textDelta: validationResult.value.textDelta }) textDelta = "" isFirstDelta = false } } return } switch (chunk.type) { case "response-metadata": { response = { id: (_a14 = chunk.id) != null ? _a14 : response.id, timestamp: (_b = chunk.timestamp) != null ? _b : response.timestamp, modelId: (_c = chunk.modelId) != null ? _c : response.modelId } break } case "finish": { if (textDelta !== "") { controller.enqueue({ type: "text-delta", textDelta }) } finishReason = chunk.finishReason usage = calculateLanguageModelUsage(chunk.usage) providerMetadata = chunk.providerMetadata controller.enqueue({ ...chunk, usage, response }) self.usagePromise.resolve(usage) self.providerMetadataPromise.resolve(providerMetadata) self.responsePromise.resolve({ ...response, headers: rawResponse == null ? void 0 : rawResponse.headers }) const validationResult = outputStrategy.validateFinalResult( latestObjectJson, { text: accumulatedText, response, usage } ) if (validationResult.success) { object2 = validationResult.value self.objectPromise.resolve(object2) } else { error = new NoObjectGeneratedError({ message: "No object generated: response did not match schema.", cause: validationResult.error, text: accumulatedText, response, usage }) self.objectPromise.reject(error) } break } default: { controller.enqueue(chunk) break } } }, // invoke onFinish callback and resolve toolResults promise when the stream is about to close: async flush(controller) { try { const finalUsage = usage != null ? usage : { promptTokens: NaN, completionTokens: NaN, totalTokens: NaN } doStreamSpan.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.response.finishReason": finishReason, "ai.response.object": { output: () => JSON.stringify(object2) }, "ai.response.id": response.id, "ai.response.model": response.modelId, "ai.response.timestamp": response.timestamp.toISOString(), "ai.usage.promptTokens": finalUsage.promptTokens, "ai.usage.completionTokens": finalUsage.completionTokens, // standardized gen-ai llm span attributes: "gen_ai.response.finish_reasons": [finishReason], "gen_ai.response.id": response.id, "gen_ai.response.model": response.modelId, "gen_ai.usage.input_tokens": finalUsage.promptTokens, "gen_ai.usage.output_tokens": finalUsage.completionTokens } }) ) doStreamSpan.end() rootSpan.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.usage.promptTokens": finalUsage.promptTokens, "ai.usage.completionTokens": finalUsage.completionTokens, "ai.response.object": { output: () => JSON.stringify(object2) } } }) ) await (onFinish == null ? void 0 : onFinish({ usage: finalUsage, object: object2, error, response: { ...response, headers: rawResponse == null ? void 0 : rawResponse.headers }, warnings, experimental_providerMetadata: providerMetadata })) } catch (error2) { controller.error(error2) } finally { rootSpan.end() } } }) ) self.stitchableStream.addStream(transformedStream) } }).catch((error) => { self.stitchableStream.addStream( new ReadableStream({ start(controller) { controller.error(error) } }) ) }).finally(() => { self.stitchableStream.close() }) this.outputStrategy = outputStrategy } get object() { return this.objectPromise.value } get usage() { return this.usagePromise.value } get experimental_providerMetadata() { return this.providerMetadataPromise.value } get warnings() { return this.warningsPromise.value } get request() { return this.requestPromise.value } get response() { return this.responsePromise.value } get partialObjectStream() { return createAsyncIterableStream( this.stitchableStream.stream.pipeThrough( new TransformStream({ transform(chunk, controller) { switch (chunk.type) { case "object": controller.enqueue(chunk.object) break case "text-delta": case "finish": break case "error": controller.error(chunk.error) break default: { const _exhaustiveCheck = chunk throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`) } } } }) ) ) } get elementStream() { return this.outputStrategy.createElementStream( this.stitchableStream.stream ) } get textStream() { return createAsyncIterableStream( this.stitchableStream.stream.pipeThrough( new TransformStream({ transform(chunk, controller) { switch (chunk.type) { case "text-delta": controller.enqueue(chunk.textDelta) break case "object": case "finish": break case "error": controller.error(chunk.error) break default: { const _exhaustiveCheck = chunk throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`) } } } }) ) ) } get fullStream() { return createAsyncIterableStream(this.stitchableStream.stream) } pipeTextStreamToResponse(response, init) { writeToServerResponse({ response, status: init == null ? void 0 : init.status, statusText: init == null ? void 0 : init.statusText, headers: prepareOutgoingHttpHeaders(init == null ? void 0 : init.headers, { contentType: "text/plain; charset=utf-8" }), stream: this.textStream.pipeThrough(new TextEncoderStream()) }) } toTextStreamResponse(init) { var _a14 return new Response(this.textStream.pipeThrough(new TextEncoderStream()), { status: (_a14 = init == null ? void 0 : init.status) != null ? _a14 : 200, headers: prepareResponseHeaders(init == null ? void 0 : init.headers, { contentType: "text/plain; charset=utf-8" }) }) } } // core/generate-text/generate-text.ts var import_provider_utils9 = require("@ai-sdk/provider-utils") // errors/no-output-specified-error.ts var import_provider11 = require("@ai-sdk/provider") var name8 = "AI_NoOutputSpecifiedError" var marker8 = `vercel.ai.error.${name8}` var symbol8 = Symbol.for(marker8) var _a8 var NoOutputSpecifiedError = class extends import_provider11.AISDKError { // used in isInstance constructor({ message = "No output specified." } = {}) { super({ name: name8, message }) this[_a8] = true } static isInstance(error) { return import_provider11.AISDKError.hasMarker(error, marker8) } } _a8 = symbol8 // errors/tool-execution-error.ts var import_provider12 = require("@ai-sdk/provider") var name9 = "AI_ToolExecutionError" var marker9 = `vercel.ai.error.${name9}` var symbol9 = Symbol.for(marker9) var _a9 var ToolExecutionError = class extends import_provider12.AISDKError { constructor({ toolArgs, toolName, toolCallId, cause, message = `Error executing tool ${toolName}: ${(0, import_provider12.getErrorMessage)(cause)}` }) { super({ name: name9, message, cause }) this[_a9] = true this.toolArgs = toolArgs this.toolName = toolName this.toolCallId = toolCallId } static isInstance(error) { return import_provider12.AISDKError.hasMarker(error, marker9) } } _a9 = symbol9 // core/prompt/prepare-tools-and-tool-choice.ts var import_ui_utils4 = require("@ai-sdk/ui-utils") // core/util/is-non-empty-object.ts function isNonEmptyObject(object2) { return object2 != null && Object.keys(object2).length > 0 } // core/prompt/prepare-tools-and-tool-choice.ts function prepareToolsAndToolChoice({ tools, toolChoice, activeTools }) { if (!isNonEmptyObject(tools)) { return { tools: void 0, toolChoice: void 0 } } const filteredTools = activeTools != null ? Object.entries(tools).filter( ([name14]) => activeTools.includes(name14) ) : Object.entries(tools) return { tools: filteredTools.map(([name14, tool2]) => { const toolType = tool2.type switch (toolType) { case void 0: case "function": return { type: "function", name: name14, description: tool2.description, parameters: (0, import_ui_utils4.asSchema)(tool2.parameters).jsonSchema } case "provider-defined": return { type: "provider-defined", name: name14, id: tool2.id, args: tool2.args } default: { const exhaustiveCheck = toolType throw new Error(`Unsupported tool type: ${exhaustiveCheck}`) } } }), toolChoice: toolChoice == null ? { type: "auto" } : typeof toolChoice === "string" ? { type: toolChoice } : { type: "tool", toolName: toolChoice.toolName } } } // core/util/split-on-last-whitespace.ts var lastWhitespaceRegexp = /^([\s\S]*?)(\s+)(\S*)$/ function splitOnLastWhitespace(text2) { const match = text2.match(lastWhitespaceRegexp) return match ? { prefix: match[1], whitespace: match[2], suffix: match[3] } : void 0 } // core/util/remove-text-after-last-whitespace.ts function removeTextAfterLastWhitespace(text2) { const match = splitOnLastWhitespace(text2) return match ? match.prefix + match.whitespace : text2 } // core/generate-text/parse-tool-call.ts var import_provider_utils8 = require("@ai-sdk/provider-utils") var import_ui_utils5 = require("@ai-sdk/ui-utils") // errors/invalid-tool-arguments-error.ts var import_provider13 = require("@ai-sdk/provider") var name10 = "AI_InvalidToolArgumentsError" var marker10 = `vercel.ai.error.${name10}` var symbol10 = Symbol.for(marker10) var _a10 var InvalidToolArgumentsError = class extends import_provider13.AISDKError { constructor({ toolArgs, toolName, cause, message = `Invalid arguments for tool ${toolName}: ${(0, import_provider13.getErrorMessage)( cause )}` }) { super({ name: name10, message, cause }) this[_a10] = true this.toolArgs = toolArgs this.toolName = toolName } static isInstance(error) { return import_provider13.AISDKError.hasMarker(error, marker10) } } _a10 = symbol10 // errors/no-such-tool-error.ts var import_provider14 = require("@ai-sdk/provider") var name11 = "AI_NoSuchToolError" var marker11 = `vercel.ai.error.${name11}` var symbol11 = Symbol.for(marker11) var _a11 var NoSuchToolError = class extends import_provider14.AISDKError { constructor({ toolName, availableTools = void 0, message = `Model tried to call unavailable tool '${toolName}'. ${availableTools === void 0 ? "No tools are available." : `Available tools: ${availableTools.join(", ")}.`}` }) { super({ name: name11, message }) this[_a11] = true this.toolName = toolName this.availableTools = availableTools } static isInstance(error) { return import_provider14.AISDKError.hasMarker(error, marker11) } } _a11 = symbol11 // errors/tool-call-repair-error.ts var import_provider15 = require("@ai-sdk/provider") var name12 = "AI_ToolCallRepairError" var marker12 = `vercel.ai.error.${name12}` var symbol12 = Symbol.for(marker12) var _a12 var ToolCallRepairError = class extends import_provider15.AISDKError { constructor({ cause, originalError, message = `Error repairing tool call: ${(0, import_provider15.getErrorMessage)(cause)}` }) { super({ name: name12, message, cause }) this[_a12] = true this.originalError = originalError } static isInstance(error) { return import_provider15.AISDKError.hasMarker(error, marker12) } } _a12 = symbol12 // core/generate-text/parse-tool-call.ts async function parseToolCall({ toolCall, tools, repairToolCall, system, messages }) { if (tools == null) { throw new NoSuchToolError({ toolName: toolCall.toolName }) } try { return await doParseToolCall({ toolCall, tools }) } catch (error) { if (repairToolCall == null || !(NoSuchToolError.isInstance(error) || InvalidToolArgumentsError.isInstance(error))) { throw error } let repairedToolCall = null try { repairedToolCall = await repairToolCall({ toolCall, tools, parameterSchema: ({ toolName }) => (0, import_ui_utils5.asSchema)(tools[toolName].parameters).jsonSchema, system, messages, error }) } catch (repairError) { throw new ToolCallRepairError({ cause: repairError, originalError: error }) } if (repairedToolCall == null) { throw error } return await doParseToolCall({ toolCall: repairedToolCall, tools }) } } async function doParseToolCall({ toolCall, tools }) { const toolName = toolCall.toolName const tool2 = tools[toolName] if (tool2 == null) { throw new NoSuchToolError({ toolName: toolCall.toolName, availableTools: Object.keys(tools) }) } const schema = (0, import_ui_utils5.asSchema)(tool2.parameters) const parseResult = toolCall.args.trim() === "" ? (0, import_provider_utils8.safeValidateTypes)({ value: {}, schema }) : (0, import_provider_utils8.safeParseJSON)({ text: toolCall.args, schema }) if (parseResult.success === false) { throw new InvalidToolArgumentsError({ toolName, toolArgs: toolCall.args, cause: parseResult.error }) } return { type: "tool-call", toolCallId: toolCall.toolCallId, toolName, args: parseResult.value } } // core/generate-text/to-response-messages.ts function toResponseMessages({ text: text2 = "", tools, toolCalls, toolResults, messageId, generateMessageId }) { const responseMessages = [] responseMessages.push({ role: "assistant", content: [{ type: "text", text: text2 }, ...toolCalls], id: messageId }) if (toolResults.length > 0) { responseMessages.push({ role: "tool", id: generateMessageId(), content: toolResults.map((toolResult) => { const tool2 = tools[toolResult.toolName] return (tool2 == null ? void 0 : tool2.experimental_toToolResultContent) != null ? { type: "tool-result", toolCallId: toolResult.toolCallId, toolName: toolResult.toolName, result: tool2.experimental_toToolResultContent(toolResult.result), experimental_content: tool2.experimental_toToolResultContent( toolResult.result ) } : { type: "tool-result", toolCallId: toolResult.toolCallId, toolName: toolResult.toolName, result: toolResult.result } }) }) } return responseMessages } // core/generate-text/generate-text.ts var originalGenerateId3 = (0, import_provider_utils9.createIdGenerator)({ prefix: "aitxt", size: 24 }) var originalGenerateMessageId = (0, import_provider_utils9.createIdGenerator)({ prefix: "msg", size: 24 }) async function generateText({ model, tools, toolChoice, system, prompt, messages, maxRetries: maxRetriesArg, abortSignal, headers, maxSteps = 1, experimental_generateMessageId: generateMessageId = originalGenerateMessageId, experimental_output: output, experimental_continueSteps: continueSteps = false, experimental_telemetry: telemetry, experimental_providerMetadata: providerMetadata, experimental_activeTools: activeTools, experimental_repairToolCall: repairToolCall, _internal: { generateId: generateId3 = originalGenerateId3, currentDate = () => /* @__PURE__ */ new Date() } = {}, onStepFinish, ...settings }) { var _a14 if (maxSteps < 1) { throw new InvalidArgumentError({ parameter: "maxSteps", value: maxSteps, message: "maxSteps must be at least 1" }) } const { maxRetries, retry } = prepareRetries({ maxRetries: maxRetriesArg }) const baseTelemetryAttributes = getBaseTelemetryAttributes({ model, telemetry, headers, settings: { ...settings, maxRetries } }) const initialPrompt = standardizePrompt({ prompt: { system: (_a14 = output == null ? void 0 : output.injectIntoSystemPrompt({ system, model })) != null ? _a14 : system, prompt, messages }, tools }) const tracer = getTracer(telemetry) return recordSpan({ name: "ai.generateText", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.generateText", telemetry }), ...baseTelemetryAttributes, // specific settings that only make sense on the outer level: "ai.prompt": { input: () => JSON.stringify({ system, prompt, messages }) }, "ai.settings.maxSteps": maxSteps } }), tracer, fn: async (span) => { var _a15, _b, _c, _d, _e, _f const mode = { type: "regular", ...prepareToolsAndToolChoice({ tools, toolChoice, activeTools }) } const callSettings = prepareCallSettings(settings) let currentModelResponse let currentToolCalls = [] let currentToolResults = [] let stepCount = 0 const responseMessages = [] let text2 = "" const steps = [] let usage = { completionTokens: 0, promptTokens: 0, totalTokens: 0 } let stepType = "initial" do { const promptFormat = stepCount === 0 ? initialPrompt.type : "messages" const stepInputMessages = [ ...initialPrompt.messages, ...responseMessages ] const promptMessages = await convertToLanguageModelPrompt({ prompt: { type: promptFormat, system: initialPrompt.system, messages: stepInputMessages }, modelSupportsImageUrls: model.supportsImageUrls, modelSupportsUrl: model.supportsUrl }) currentModelResponse = await retry( () => recordSpan({ name: "ai.generateText.doGenerate", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.generateText.doGenerate", telemetry }), ...baseTelemetryAttributes, "ai.prompt.format": { input: () => promptFormat }, "ai.prompt.messages": { input: () => JSON.stringify(promptMessages) }, "ai.prompt.tools": { // convert the language model level tools: input: () => { var _a16 return (_a16 = mode.tools) == null ? void 0 : _a16.map((tool2) => JSON.stringify(tool2)) } }, "ai.prompt.toolChoice": { input: () => mode.toolChoice != null ? JSON.stringify(mode.toolChoice) : void 0 }, // standardized gen-ai llm span attributes: "gen_ai.system": model.provider, "gen_ai.request.model": model.modelId, "gen_ai.request.frequency_penalty": settings.frequencyPenalty, "gen_ai.request.max_tokens": settings.maxTokens, "gen_ai.request.presence_penalty": settings.presencePenalty, "gen_ai.request.stop_sequences": settings.stopSequences, "gen_ai.request.temperature": settings.temperature, "gen_ai.request.top_k": settings.topK, "gen_ai.request.top_p": settings.topP } }), tracer, fn: async (span2) => { var _a16, _b2, _c2, _d2, _e2, _f2 const result = await model.doGenerate({ mode, ...callSettings, inputFormat: promptFormat, responseFormat: output == null ? void 0 : output.responseFormat({ model }), prompt: promptMessages, providerMetadata, abortSignal, headers }) const responseData = { id: (_b2 = (_a16 = result.response) == null ? void 0 : _a16.id) != null ? _b2 : generateId3(), timestamp: (_d2 = (_c2 = result.response) == null ? void 0 : _c2.timestamp) != null ? _d2 : currentDate(), modelId: (_f2 = (_e2 = result.response) == null ? void 0 : _e2.modelId) != null ? _f2 : model.modelId } span2.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.response.finishReason": result.finishReason, "ai.response.text": { output: () => result.text }, "ai.response.toolCalls": { output: () => JSON.stringify(result.toolCalls) }, "ai.response.id": responseData.id, "ai.response.model": responseData.modelId, "ai.response.timestamp": responseData.timestamp.toISOString(), "ai.usage.promptTokens": result.usage.promptTokens, "ai.usage.completionTokens": result.usage.completionTokens, // standardized gen-ai llm span attributes: "gen_ai.response.finish_reasons": [result.finishReason], "gen_ai.response.id": responseData.id, "gen_ai.response.model": responseData.modelId, "gen_ai.usage.input_tokens": result.usage.promptTokens, "gen_ai.usage.output_tokens": result.usage.completionTokens } }) ) return { ...result, response: responseData } } }) ) currentToolCalls = await Promise.all( ((_a15 = currentModelResponse.toolCalls) != null ? _a15 : []).map( (toolCall) => parseToolCall({ toolCall, tools, repairToolCall, system, messages: stepInputMessages }) ) ) currentToolResults = tools == null ? [] : await executeTools({ toolCalls: currentToolCalls, tools, tracer, telemetry, messages: stepInputMessages, abortSignal }) const currentUsage = calculateLanguageModelUsage( currentModelResponse.usage ) usage = addLanguageModelUsage(usage, currentUsage) let nextStepType = "done" if (++stepCount < maxSteps) { if (continueSteps && currentModelResponse.finishReason === "length" && // only use continue when there are no tool calls: currentToolCalls.length === 0) { nextStepType = "continue" } else if ( // there are tool calls: currentToolCalls.length > 0 && // all current tool calls have results: currentToolResults.length === currentToolCalls.length ) { nextStepType = "tool-result" } } const originalText = (_b = currentModelResponse.text) != null ? _b : "" const stepTextLeadingWhitespaceTrimmed = stepType === "continue" && // only for continue steps text2.trimEnd() !== text2 ? originalText.trimStart() : originalText const stepText = nextStepType === "continue" ? removeTextAfterLastWhitespace(stepTextLeadingWhitespaceTrimmed) : stepTextLeadingWhitespaceTrimmed text2 = nextStepType === "continue" || stepType === "continue" ? text2 + stepText : stepText if (stepType === "continue") { const lastMessage = responseMessages[responseMessages.length - 1] if (typeof lastMessage.content === "string") { lastMessage.content += stepText } else { lastMessage.content.push({ text: stepText, type: "text" }) } } else { responseMessages.push( ...toResponseMessages({ text: text2, tools: tools != null ? tools : {}, toolCalls: currentToolCalls, toolResults: currentToolResults, messageId: generateMessageId(), generateMessageId }) ) } const currentStepResult = { stepType, text: stepText, toolCalls: currentToolCalls, toolResults: currentToolResults, finishReason: currentModelResponse.finishReason, usage: currentUsage, warnings: currentModelResponse.warnings, logprobs: currentModelResponse.logprobs, request: (_c = currentModelResponse.request) != null ? _c : {}, response: { ...currentModelResponse.response, headers: (_d = currentModelResponse.rawResponse) == null ? void 0 : _d.headers, // deep clone msgs to avoid mutating past messages in multi-step: messages: structuredClone(responseMessages) }, experimental_providerMetadata: currentModelResponse.providerMetadata, isContinued: nextStepType === "continue" } steps.push(currentStepResult) await (onStepFinish == null ? void 0 : onStepFinish(currentStepResult)) stepType = nextStepType } while (stepType !== "done") span.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.response.finishReason": currentModelResponse.finishReason, "ai.response.text": { output: () => currentModelResponse.text }, "ai.response.toolCalls": { output: () => JSON.stringify(currentModelResponse.toolCalls) }, "ai.usage.promptTokens": currentModelResponse.usage.promptTokens, "ai.usage.completionTokens": currentModelResponse.usage.completionTokens } }) ) return new DefaultGenerateTextResult({ text: text2, outputResolver: () => { if (output == null) { throw new NoOutputSpecifiedError() } return output.parseOutput( { text: text2 }, { response: currentModelResponse.response, usage } ) }, toolCalls: currentToolCalls, toolResults: currentToolResults, finishReason: currentModelResponse.finishReason, usage, warnings: currentModelResponse.warnings, request: (_e = currentModelResponse.request) != null ? _e : {}, response: { ...currentModelResponse.response, headers: (_f = currentModelResponse.rawResponse) == null ? void 0 : _f.headers, messages: responseMessages }, logprobs: currentModelResponse.logprobs, steps, providerMetadata: currentModelResponse.providerMetadata }) } }) } async function executeTools({ toolCalls, tools, tracer, telemetry, messages, abortSignal }) { const toolResults = await Promise.all( toolCalls.map(async ({ toolCallId, toolName, args }) => { const tool2 = tools[toolName] if ((tool2 == null ? void 0 : tool2.execute) == null) { return void 0 } const result = await recordSpan({ name: "ai.toolCall", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.toolCall", telemetry }), "ai.toolCall.name": toolName, "ai.toolCall.id": toolCallId, "ai.toolCall.args": { output: () => JSON.stringify(args) } } }), tracer, fn: async (span) => { try { const result2 = await tool2.execute(args, { toolCallId, messages, abortSignal }) try { span.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.toolCall.result": { output: () => JSON.stringify(result2) } } }) ) } catch (ignored) { console.error(ignored) } return result2 } catch (error) { throw new ToolExecutionError({ toolCallId, toolName, toolArgs: args, cause: error }) } } }) return { type: "tool-result", toolCallId, toolName, args, result } }) ) return toolResults.filter( (result) => result != null ) } var DefaultGenerateTextResult = class { constructor(options) { this.text = options.text this.toolCalls = options.toolCalls this.toolResults = options.toolResults this.finishReason = options.finishReason this.usage = options.usage this.warnings = options.warnings this.request = options.request this.response = options.response this.steps = options.steps this.experimental_providerMetadata = options.providerMetadata this.logprobs = options.logprobs this.outputResolver = options.outputResolver } get experimental_output() { return this.outputResolver() } } // core/generate-text/output.ts var output_exports = {} __export(output_exports, { object: () => object, text: () => text }) var import_provider_utils10 = require("@ai-sdk/provider-utils") var import_ui_utils6 = require("@ai-sdk/ui-utils") // errors/index.ts var import_provider16 = require("@ai-sdk/provider") // core/generate-text/output.ts var text = () => ({ type: "text", responseFormat: () => ({ type: "text" }), injectIntoSystemPrompt({ system }) { return system }, parsePartial({ text: text2 }) { return { partial: text2 } }, parseOutput({ text: text2 }) { return text2 } }) var object = ({ schema: inputSchema }) => { const schema = (0, import_ui_utils6.asSchema)(inputSchema) return { type: "object", responseFormat: ({ model }) => ({ type: "json", schema: model.supportsStructuredOutputs ? schema.jsonSchema : void 0 }), injectIntoSystemPrompt({ system, model }) { return model.supportsStructuredOutputs ? system : injectJsonInstruction({ prompt: system, schema: schema.jsonSchema }) }, parsePartial({ text: text2 }) { const result = (0, import_ui_utils6.parsePartialJson)(text2) switch (result.state) { case "failed-parse": case "undefined-input": return void 0 case "repaired-parse": case "successful-parse": return { // Note: currently no validation of partial results: partial: result.value } default: { const _exhaustiveCheck = result.state throw new Error(`Unsupported parse state: ${_exhaustiveCheck}`) } } }, parseOutput({ text: text2 }, context) { const parseResult = (0, import_provider_utils10.safeParseJSON)({ text: text2 }) if (!parseResult.success) { throw new NoObjectGeneratedError({ message: "No object generated: could not parse the response.", cause: parseResult.error, text: text2, response: context.response, usage: context.usage }) } const validationResult = (0, import_provider_utils10.safeValidateTypes)({ value: parseResult.value, schema }) if (!validationResult.success) { throw new NoObjectGeneratedError({ message: "No object generated: response did not match schema.", cause: validationResult.error, text: text2, response: context.response, usage: context.usage }) } return validationResult.value } } } // core/generate-text/smooth-stream.ts var import_provider17 = require("@ai-sdk/provider") var CHUNKING_REGEXPS = { word: /\s*\S+\s+/m, line: /[^\n]*\n/m } function smoothStream({ delayInMs = 10, chunking = "word", _internal: { delay: delay2 = delay } = {} } = {}) { const chunkingRegexp = typeof chunking === "string" ? CHUNKING_REGEXPS[chunking] : chunking if (chunkingRegexp == null) { throw new import_provider17.InvalidArgumentError({ argument: "chunking", message: `Chunking must be "word" or "line" or a RegExp. Received: ${chunking}` }) } return () => { let buffer = "" return new TransformStream({ async transform(chunk, controller) { if (chunk.type === "step-finish") { if (buffer.length > 0) { controller.enqueue({ type: "text-delta", textDelta: buffer }) buffer = "" } controller.enqueue(chunk) return } if (chunk.type !== "text-delta") { controller.enqueue(chunk) return } buffer += chunk.textDelta let match while ((match = chunkingRegexp.exec(buffer)) != null) { const chunk2 = match[0] controller.enqueue({ type: "text-delta", textDelta: chunk2 }) buffer = buffer.slice(chunk2.length) await delay2(delayInMs) } } }) } } // core/generate-text/stream-text.ts var import_provider_utils11 = require("@ai-sdk/provider-utils") var import_ui_utils8 = require("@ai-sdk/ui-utils") // util/as-array.ts function asArray(value) { return value === void 0 ? [] : Array.isArray(value) ? value : [value] } // core/util/merge-streams.ts function mergeStreams(stream1, stream2) { const reader1 = stream1.getReader() const reader2 = stream2.getReader() let lastRead1 = void 0 let lastRead2 = void 0 let stream1Done = false let stream2Done = false async function readStream1(controller) { try { if (lastRead1 == null) { lastRead1 = reader1.read() } const result = await lastRead1 lastRead1 = void 0 if (!result.done) { controller.enqueue(result.value) } else { controller.close() } } catch (error) { controller.error(error) } } async function readStream2(controller) { try { if (lastRead2 == null) { lastRead2 = reader2.read() } const result = await lastRead2 lastRead2 = void 0 if (!result.done) { controller.enqueue(result.value) } else { controller.close() } } catch (error) { controller.error(error) } } return new ReadableStream({ async pull(controller) { try { if (stream1Done) { await readStream2(controller) return } if (stream2Done) { await readStream1(controller) return } if (lastRead1 == null) { lastRead1 = reader1.read() } if (lastRead2 == null) { lastRead2 = reader2.read() } const { result, reader } = await Promise.race([ lastRead1.then((result2) => ({ result: result2, reader: reader1 })), lastRead2.then((result2) => ({ result: result2, reader: reader2 })) ]) if (!result.done) { controller.enqueue(result.value) } if (reader === reader1) { lastRead1 = void 0 if (result.done) { await readStream2(controller) stream1Done = true } } else { lastRead2 = void 0 if (result.done) { stream2Done = true await readStream1(controller) } } } catch (error) { controller.error(error) } }, cancel() { reader1.cancel() reader2.cancel() } }) } // core/generate-text/run-tools-transformation.ts var import_ui_utils7 = require("@ai-sdk/ui-utils") function runToolsTransformation({ tools, generatorStream, toolCallStreaming, tracer, telemetry, system, messages, abortSignal, repairToolCall }) { let toolResultsStreamController = null const toolResultsStream = new ReadableStream({ start(controller) { toolResultsStreamController = controller } }) const activeToolCalls = {} const outstandingToolResults = /* @__PURE__ */ new Set() let canClose = false let finishChunk = void 0 function attemptClose() { if (canClose && outstandingToolResults.size === 0) { if (finishChunk != null) { toolResultsStreamController.enqueue(finishChunk) } toolResultsStreamController.close() } } const forwardStream = new TransformStream({ async transform(chunk, controller) { const chunkType = chunk.type switch (chunkType) { case "text-delta": case "response-metadata": case "error": { controller.enqueue(chunk) break } case "tool-call-delta": { if (toolCallStreaming) { if (!activeToolCalls[chunk.toolCallId]) { controller.enqueue({ type: "tool-call-streaming-start", toolCallId: chunk.toolCallId, toolName: chunk.toolName }) activeToolCalls[chunk.toolCallId] = true } controller.enqueue({ type: "tool-call-delta", toolCallId: chunk.toolCallId, toolName: chunk.toolName, argsTextDelta: chunk.argsTextDelta }) } break } case "tool-call": { try { const toolCall = await parseToolCall({ toolCall: chunk, tools, repairToolCall, system, messages }) controller.enqueue(toolCall) const tool2 = tools[toolCall.toolName] if (tool2.execute != null) { const toolExecutionId = (0, import_ui_utils7.generateId)() outstandingToolResults.add(toolExecutionId) recordSpan({ name: "ai.toolCall", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.toolCall", telemetry }), "ai.toolCall.name": toolCall.toolName, "ai.toolCall.id": toolCall.toolCallId, "ai.toolCall.args": { output: () => JSON.stringify(toolCall.args) } } }), tracer, fn: async (span) => tool2.execute(toolCall.args, { toolCallId: toolCall.toolCallId, messages, abortSignal }).then( (result) => { toolResultsStreamController.enqueue({ ...toolCall, type: "tool-result", result }) outstandingToolResults.delete(toolExecutionId) attemptClose() try { span.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.toolCall.result": { output: () => JSON.stringify(result) } } }) ) } catch (ignored) { } }, (error) => { toolResultsStreamController.enqueue({ type: "error", error: new ToolExecutionError({ toolCallId: toolCall.toolCallId, toolName: toolCall.toolName, toolArgs: toolCall.args, cause: error }) }) outstandingToolResults.delete(toolExecutionId) attemptClose() } ) }) } } catch (error) { toolResultsStreamController.enqueue({ type: "error", error }) } break } case "finish": { finishChunk = { type: "finish", finishReason: chunk.finishReason, logprobs: chunk.logprobs, usage: calculateLanguageModelUsage(chunk.usage), experimental_providerMetadata: chunk.providerMetadata } break } default: { const _exhaustiveCheck = chunkType throw new Error(`Unhandled chunk type: ${_exhaustiveCheck}`) } } }, flush() { canClose = true attemptClose() } }) return new ReadableStream({ async start(controller) { return Promise.all([ generatorStream.pipeThrough(forwardStream).pipeTo( new WritableStream({ write(chunk) { controller.enqueue(chunk) }, close() { } }) ), toolResultsStream.pipeTo( new WritableStream({ write(chunk) { controller.enqueue(chunk) }, close() { controller.close() } }) ) ]) } }) } // core/generate-text/stream-text.ts var originalGenerateId4 = (0, import_provider_utils11.createIdGenerator)({ prefix: "aitxt", size: 24 }) var originalGenerateMessageId2 = (0, import_provider_utils11.createIdGenerator)({ prefix: "msg", size: 24 }) function streamText({ model, tools, toolChoice, system, prompt, messages, maxRetries, abortSignal, headers, maxSteps = 1, experimental_generateMessageId: generateMessageId = originalGenerateMessageId2, experimental_output: output, experimental_continueSteps: continueSteps = false, experimental_telemetry: telemetry, experimental_providerMetadata: providerMetadata, experimental_toolCallStreaming: toolCallStreaming = false, experimental_activeTools: activeTools, experimental_repairToolCall: repairToolCall, experimental_transform: transform, onChunk, onFinish, onStepFinish, _internal: { now: now2 = now, generateId: generateId3 = originalGenerateId4, currentDate = () => /* @__PURE__ */ new Date() } = {}, ...settings }) { return new DefaultStreamTextResult({ model, telemetry, headers, settings, maxRetries, abortSignal, system, prompt, messages, tools, toolChoice, toolCallStreaming, transforms: asArray(transform), activeTools, repairToolCall, maxSteps, output, continueSteps, providerMetadata, onChunk, onFinish, onStepFinish, now: now2, currentDate, generateId: generateId3, generateMessageId }) } function createOutputTransformStream(output) { if (!output) { return new TransformStream({ transform(chunk, controller) { controller.enqueue({ part: chunk, partialOutput: void 0 }) } }) } let text2 = "" let textChunk = "" let lastPublishedJson = "" return new TransformStream({ transform(chunk, controller) { if (chunk.type !== "text-delta") { controller.enqueue({ part: chunk, partialOutput: void 0 }) return } text2 += chunk.textDelta textChunk += chunk.textDelta const result = output.parsePartial({ text: text2 }) if (result != null) { const currentJson = JSON.stringify(result.partial) if (currentJson !== lastPublishedJson) { controller.enqueue({ part: { type: "text-delta", textDelta: textChunk }, partialOutput: result.partial }) lastPublishedJson = currentJson textChunk = "" } } }, flush(controller) { if (textChunk.length > 0) { controller.enqueue({ part: { type: "text-delta", textDelta: textChunk }, partialOutput: void 0 }) } } }) } var DefaultStreamTextResult = class { constructor({ model, telemetry, headers, settings, maxRetries: maxRetriesArg, abortSignal, system, prompt, messages, tools, toolChoice, toolCallStreaming, transforms, activeTools, repairToolCall, maxSteps, output, continueSteps, providerMetadata, onChunk, onFinish, onStepFinish, now: now2, currentDate, generateId: generateId3, generateMessageId }) { this.warningsPromise = new DelayedPromise() this.usagePromise = new DelayedPromise() this.finishReasonPromise = new DelayedPromise() this.providerMetadataPromise = new DelayedPromise() this.textPromise = new DelayedPromise() this.toolCallsPromise = new DelayedPromise() this.toolResultsPromise = new DelayedPromise() this.requestPromise = new DelayedPromise() this.responsePromise = new DelayedPromise() this.stepsPromise = new DelayedPromise() var _a14 if (maxSteps < 1) { throw new InvalidArgumentError({ parameter: "maxSteps", value: maxSteps, message: "maxSteps must be at least 1" }) } this.output = output let recordedStepText = "" let recordedContinuationText = "" let recordedFullText = "" const recordedResponse = { id: generateId3(), timestamp: currentDate(), modelId: model.modelId, messages: [] } let recordedToolCalls = [] let recordedToolResults = [] let recordedFinishReason = void 0 let recordedUsage = void 0 let stepType = "initial" const recordedSteps = [] let rootSpan const eventProcessor = new TransformStream({ async transform(chunk, controller) { controller.enqueue(chunk) const { part } = chunk if (part.type === "text-delta" || part.type === "tool-call" || part.type === "tool-result" || part.type === "tool-call-streaming-start" || part.type === "tool-call-delta") { await (onChunk == null ? void 0 : onChunk({ chunk: part })) } if (part.type === "text-delta") { recordedStepText += part.textDelta recordedContinuationText += part.textDelta recordedFullText += part.textDelta } if (part.type === "tool-call") { recordedToolCalls.push(part) } if (part.type === "tool-result") { recordedToolResults.push(part) } if (part.type === "step-finish") { const stepMessages = toResponseMessages({ text: recordedContinuationText, tools: tools != null ? tools : {}, toolCalls: recordedToolCalls, toolResults: recordedToolResults, messageId: part.messageId, generateMessageId }) const currentStep = recordedSteps.length let nextStepType = "done" if (currentStep + 1 < maxSteps) { if (continueSteps && part.finishReason === "length" && // only use continue when there are no tool calls: recordedToolCalls.length === 0) { nextStepType = "continue" } else if ( // there are tool calls: recordedToolCalls.length > 0 && // all current tool calls have results: recordedToolResults.length === recordedToolCalls.length ) { nextStepType = "tool-result" } } const currentStepResult = { stepType, text: recordedStepText, toolCalls: recordedToolCalls, toolResults: recordedToolResults, finishReason: part.finishReason, usage: part.usage, warnings: part.warnings, logprobs: part.logprobs, request: part.request, response: { ...part.response, messages: [...recordedResponse.messages, ...stepMessages] }, experimental_providerMetadata: part.experimental_providerMetadata, isContinued: part.isContinued } await (onStepFinish == null ? void 0 : onStepFinish(currentStepResult)) recordedSteps.push(currentStepResult) recordedToolCalls = [] recordedToolResults = [] recordedStepText = "" if (nextStepType !== "done") { stepType = nextStepType } if (nextStepType !== "continue") { recordedResponse.messages.push(...stepMessages) recordedContinuationText = "" } } if (part.type === "finish") { recordedResponse.id = part.response.id recordedResponse.timestamp = part.response.timestamp recordedResponse.modelId = part.response.modelId recordedResponse.headers = part.response.headers recordedUsage = part.usage recordedFinishReason = part.finishReason } }, async flush(controller) { var _a15 try { if (recordedSteps.length === 0) { return } const lastStep = recordedSteps[recordedSteps.length - 1] self.warningsPromise.resolve(lastStep.warnings) self.requestPromise.resolve(lastStep.request) self.responsePromise.resolve(lastStep.response) self.toolCallsPromise.resolve(lastStep.toolCalls) self.toolResultsPromise.resolve(lastStep.toolResults) self.providerMetadataPromise.resolve( lastStep.experimental_providerMetadata ) const finishReason = recordedFinishReason != null ? recordedFinishReason : "unknown" const usage = recordedUsage != null ? recordedUsage : { completionTokens: NaN, promptTokens: NaN, totalTokens: NaN } self.finishReasonPromise.resolve(finishReason) self.usagePromise.resolve(usage) self.textPromise.resolve(recordedFullText) self.stepsPromise.resolve(recordedSteps) await (onFinish == null ? void 0 : onFinish({ finishReason, logprobs: void 0, usage, text: recordedFullText, toolCalls: lastStep.toolCalls, toolResults: lastStep.toolResults, request: (_a15 = lastStep.request) != null ? _a15 : {}, response: lastStep.response, warnings: lastStep.warnings, experimental_providerMetadata: lastStep.experimental_providerMetadata, steps: recordedSteps })) rootSpan.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.response.finishReason": finishReason, "ai.response.text": { output: () => recordedFullText }, "ai.response.toolCalls": { output: () => { var _a16 return ((_a16 = lastStep.toolCalls) == null ? void 0 : _a16.length) ? JSON.stringify(lastStep.toolCalls) : void 0 } }, "ai.usage.promptTokens": usage.promptTokens, "ai.usage.completionTokens": usage.completionTokens } }) ) } catch (error) { controller.error(error) } finally { rootSpan.end() } } }) const stitchableStream = createStitchableStream() this.addStream = stitchableStream.addStream this.closeStream = stitchableStream.close let stream = stitchableStream.stream for (const transform of transforms) { stream = stream.pipeThrough( transform({ tools, stopStream() { stitchableStream.terminate() } }) ) } this.baseStream = stream.pipeThrough(createOutputTransformStream(output)).pipeThrough(eventProcessor) const { maxRetries, retry } = prepareRetries({ maxRetries: maxRetriesArg }) const tracer = getTracer(telemetry) const baseTelemetryAttributes = getBaseTelemetryAttributes({ model, telemetry, headers, settings: { ...settings, maxRetries } }) const initialPrompt = standardizePrompt({ prompt: { system: (_a14 = output == null ? void 0 : output.injectIntoSystemPrompt({ system, model })) != null ? _a14 : system, prompt, messages }, tools }) const self = this recordSpan({ name: "ai.streamText", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.streamText", telemetry }), ...baseTelemetryAttributes, // specific settings that only make sense on the outer level: "ai.prompt": { input: () => JSON.stringify({ system, prompt, messages }) }, "ai.settings.maxSteps": maxSteps } }), tracer, endWhenDone: false, fn: async (rootSpanArg) => { rootSpan = rootSpanArg async function streamStep({ currentStep, responseMessages, usage, stepType: stepType2, previousStepText, hasLeadingWhitespace, messageId }) { const promptFormat = responseMessages.length === 0 ? initialPrompt.type : "messages" const stepInputMessages = [ ...initialPrompt.messages, ...responseMessages ] const promptMessages = await convertToLanguageModelPrompt({ prompt: { type: promptFormat, system: initialPrompt.system, messages: stepInputMessages }, modelSupportsImageUrls: model.supportsImageUrls, modelSupportsUrl: model.supportsUrl }) const mode = { type: "regular", ...prepareToolsAndToolChoice({ tools, toolChoice, activeTools }) } const { result: { stream: stream2, warnings, rawResponse, request }, doStreamSpan, startTimestampMs } = await retry( () => recordSpan({ name: "ai.streamText.doStream", attributes: selectTelemetryAttributes({ telemetry, attributes: { ...assembleOperationName({ operationId: "ai.streamText.doStream", telemetry }), ...baseTelemetryAttributes, "ai.prompt.format": { input: () => promptFormat }, "ai.prompt.messages": { input: () => JSON.stringify(promptMessages) }, "ai.prompt.tools": { // convert the language model level tools: input: () => { var _a15 return (_a15 = mode.tools) == null ? void 0 : _a15.map((tool2) => JSON.stringify(tool2)) } }, "ai.prompt.toolChoice": { input: () => mode.toolChoice != null ? JSON.stringify(mode.toolChoice) : void 0 }, // standardized gen-ai llm span attributes: "gen_ai.system": model.provider, "gen_ai.request.model": model.modelId, "gen_ai.request.frequency_penalty": settings.frequencyPenalty, "gen_ai.request.max_tokens": settings.maxTokens, "gen_ai.request.presence_penalty": settings.presencePenalty, "gen_ai.request.stop_sequences": settings.stopSequences, "gen_ai.request.temperature": settings.temperature, "gen_ai.request.top_k": settings.topK, "gen_ai.request.top_p": settings.topP } }), tracer, endWhenDone: false, fn: async (doStreamSpan2) => ({ startTimestampMs: now2(), // get before the call doStreamSpan: doStreamSpan2, result: await model.doStream({ mode, ...prepareCallSettings(settings), inputFormat: promptFormat, responseFormat: output == null ? void 0 : output.responseFormat({ model }), prompt: promptMessages, providerMetadata, abortSignal, headers }) }) }) ) const transformedStream = runToolsTransformation({ tools, generatorStream: stream2, toolCallStreaming, tracer, telemetry, system, messages: stepInputMessages, repairToolCall, abortSignal }) const stepRequest = request != null ? request : {} const stepToolCalls = [] const stepToolResults = [] let stepFinishReason = "unknown" let stepUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 } let stepProviderMetadata let stepFirstChunk = true let stepText = "" let fullStepText = stepType2 === "continue" ? previousStepText : "" let stepLogProbs let stepResponse = { id: generateId3(), timestamp: currentDate(), modelId: model.modelId } let chunkBuffer = "" let chunkTextPublished = false let inWhitespacePrefix = true let hasWhitespaceSuffix = false async function publishTextChunk({ controller, chunk }) { controller.enqueue(chunk) stepText += chunk.textDelta fullStepText += chunk.textDelta chunkTextPublished = true hasWhitespaceSuffix = chunk.textDelta.trimEnd() !== chunk.textDelta } self.addStream( transformedStream.pipeThrough( new TransformStream({ async transform(chunk, controller) { var _a15, _b, _c if (stepFirstChunk) { const msToFirstChunk = now2() - startTimestampMs stepFirstChunk = false doStreamSpan.addEvent("ai.stream.firstChunk", { "ai.response.msToFirstChunk": msToFirstChunk }) doStreamSpan.setAttributes({ "ai.response.msToFirstChunk": msToFirstChunk }) controller.enqueue({ type: "step-start", messageId, request: stepRequest, warnings: warnings != null ? warnings : [] }) } if (chunk.type === "text-delta" && chunk.textDelta.length === 0) { return } const chunkType = chunk.type switch (chunkType) { case "text-delta": { if (continueSteps) { const trimmedChunkText = inWhitespacePrefix && hasLeadingWhitespace ? chunk.textDelta.trimStart() : chunk.textDelta if (trimmedChunkText.length === 0) { break } inWhitespacePrefix = false chunkBuffer += trimmedChunkText const split = splitOnLastWhitespace(chunkBuffer) if (split != null) { chunkBuffer = split.suffix await publishTextChunk({ controller, chunk: { type: "text-delta", textDelta: split.prefix + split.whitespace } }) } } else { await publishTextChunk({ controller, chunk }) } break } case "tool-call": { controller.enqueue(chunk) stepToolCalls.push(chunk) break } case "tool-result": { controller.enqueue(chunk) stepToolResults.push(chunk) break } case "response-metadata": { stepResponse = { id: (_a15 = chunk.id) != null ? _a15 : stepResponse.id, timestamp: (_b = chunk.timestamp) != null ? _b : stepResponse.timestamp, modelId: (_c = chunk.modelId) != null ? _c : stepResponse.modelId } break } case "finish": { stepUsage = chunk.usage stepFinishReason = chunk.finishReason stepProviderMetadata = chunk.experimental_providerMetadata stepLogProbs = chunk.logprobs const msToFinish = now2() - startTimestampMs doStreamSpan.addEvent("ai.stream.finish") doStreamSpan.setAttributes({ "ai.response.msToFinish": msToFinish, "ai.response.avgCompletionTokensPerSecond": 1e3 * stepUsage.completionTokens / msToFinish }) break } case "tool-call-streaming-start": case "tool-call-delta": { controller.enqueue(chunk) break } case "error": { controller.enqueue(chunk) stepFinishReason = "error" break } default: { const exhaustiveCheck = chunkType throw new Error(`Unknown chunk type: ${exhaustiveCheck}`) } } }, // invoke onFinish callback and resolve toolResults promise when the stream is about to close: async flush(controller) { const stepToolCallsJson = stepToolCalls.length > 0 ? JSON.stringify(stepToolCalls) : void 0 let nextStepType = "done" if (currentStep + 1 < maxSteps) { if (continueSteps && stepFinishReason === "length" && // only use continue when there are no tool calls: stepToolCalls.length === 0) { nextStepType = "continue" } else if ( // there are tool calls: stepToolCalls.length > 0 && // all current tool calls have results: stepToolResults.length === stepToolCalls.length ) { nextStepType = "tool-result" } } if (continueSteps && chunkBuffer.length > 0 && (nextStepType !== "continue" || // when the next step is a regular step, publish the buffer stepType2 === "continue" && !chunkTextPublished)) { await publishTextChunk({ controller, chunk: { type: "text-delta", textDelta: chunkBuffer } }) chunkBuffer = "" } try { doStreamSpan.setAttributes( selectTelemetryAttributes({ telemetry, attributes: { "ai.response.finishReason": stepFinishReason, "ai.response.text": { output: () => stepText }, "ai.response.toolCalls": { output: () => stepToolCallsJson }, "ai.response.id": stepResponse.id, "ai.response.model": stepResponse.modelId, "ai.response.timestamp": stepResponse.timestamp.toISOString(), "ai.usage.promptTokens": stepUsage.promptTokens, "ai.usage.completionTokens": stepUsage.completionTokens, // standardized gen-ai llm span attributes: "gen_ai.response.finish_reasons": [stepFinishReason], "gen_ai.response.id": stepResponse.id, "gen_ai.response.model": stepResponse.modelId, "gen_ai.usage.input_tokens": stepUsage.promptTokens, "gen_ai.usage.output_tokens": stepUsage.completionTokens } }) ) } catch (error) { } finally { doStreamSpan.end() } controller.enqueue({ type: "step-finish", finishReason: stepFinishReason, usage: stepUsage, experimental_providerMetadata: stepProviderMetadata, logprobs: stepLogProbs, request: stepRequest, response: { ...stepResponse, headers: rawResponse == null ? void 0 : rawResponse.headers }, warnings, isContinued: nextStepType === "continue", messageId }) const combinedUsage = addLanguageModelUsage(usage, stepUsage) if (nextStepType === "done") { controller.enqueue({ type: "finish", finishReason: stepFinishReason, usage: combinedUsage, experimental_providerMetadata: stepProviderMetadata, logprobs: stepLogProbs, response: { ...stepResponse, headers: rawResponse == null ? void 0 : rawResponse.headers } }) self.closeStream() } else { if (stepType2 === "continue") { const lastMessage = responseMessages[responseMessages.length - 1] if (typeof lastMessage.content === "string") { lastMessage.content += stepText } else { lastMessage.content.push({ text: stepText, type: "text" }) } } else { responseMessages.push( ...toResponseMessages({ text: stepText, tools: tools != null ? tools : {}, toolCalls: stepToolCalls, toolResults: stepToolResults, messageId, generateMessageId }) ) } await streamStep({ currentStep: currentStep + 1, responseMessages, usage: combinedUsage, stepType: nextStepType, previousStepText: fullStepText, hasLeadingWhitespace: hasWhitespaceSuffix, messageId: ( // keep the same id when continuing a step: nextStepType === "continue" ? messageId : generateMessageId() ) }) } } }) ) ) } await streamStep({ currentStep: 0, responseMessages: [], usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 }, previousStepText: "", stepType: "initial", hasLeadingWhitespace: false, messageId: generateMessageId() }) } }).catch((error) => { self.addStream( new ReadableStream({ start(controller) { controller.enqueue({ type: "error", error }) controller.close() } }) ) self.closeStream() }) } get warnings() { return this.warningsPromise.value } get usage() { return this.usagePromise.value } get finishReason() { return this.finishReasonPromise.value } get experimental_providerMetadata() { return this.providerMetadataPromise.value } get text() { return this.textPromise.value } get toolCalls() { return this.toolCallsPromise.value } get toolResults() { return this.toolResultsPromise.value } get request() { return this.requestPromise.value } get response() { return this.responsePromise.value } get steps() { return this.stepsPromise.value } /** Split out a new stream from the original stream. The original stream is replaced to allow for further splitting, since we do not know how many times the stream will be split. Note: this leads to buffering the stream content on the server. However, the LLM results are expected to be small enough to not cause issues. */ teeStream() { const [stream1, stream2] = this.baseStream.tee() this.baseStream = stream2 return stream1 } get textStream() { return createAsyncIterableStream( this.teeStream().pipeThrough( new TransformStream({ transform({ part }, controller) { if (part.type === "text-delta") { controller.enqueue(part.textDelta) } else if (part.type === "error") { controller.error(part.error) } } }) ) ) } get fullStream() { return createAsyncIterableStream( this.teeStream().pipeThrough( new TransformStream({ transform({ part }, controller) { controller.enqueue(part) } }) ) ) } get experimental_partialOutputStream() { if (this.output == null) { throw new NoOutputSpecifiedError() } return createAsyncIterableStream( this.teeStream().pipeThrough( new TransformStream({ transform({ partialOutput }, controller) { if (partialOutput != null) { controller.enqueue(partialOutput) } } }) ) ) } toDataStreamInternal({ getErrorMessage: getErrorMessage5 = () => "An error occurred.", // mask error messages for safety by default sendUsage = true } = {}) { let aggregatedResponse = "" const callbackTransformer = new TransformStream({ async transform(chunk, controller) { controller.enqueue(chunk) if (chunk.type === "text-delta") { aggregatedResponse += chunk.textDelta } } }) const streamPartsTransformer = new TransformStream({ transform: async (chunk, controller) => { const chunkType = chunk.type switch (chunkType) { case "text-delta": { controller.enqueue((0, import_ui_utils8.formatDataStreamPart)("text", chunk.textDelta)) break } case "tool-call-streaming-start": { controller.enqueue( (0, import_ui_utils8.formatDataStreamPart)("tool_call_streaming_start", { toolCallId: chunk.toolCallId, toolName: chunk.toolName }) ) break } case "tool-call-delta": { controller.enqueue( (0, import_ui_utils8.formatDataStreamPart)("tool_call_delta", { toolCallId: chunk.toolCallId, argsTextDelta: chunk.argsTextDelta }) ) break } case "tool-call": { controller.enqueue( (0, import_ui_utils8.formatDataStreamPart)("tool_call", { toolCallId: chunk.toolCallId, toolName: chunk.toolName, args: chunk.args }) ) break } case "tool-result": { controller.enqueue( (0, import_ui_utils8.formatDataStreamPart)("tool_result", { toolCallId: chunk.toolCallId, result: chunk.result }) ) break } case "error": { controller.enqueue( (0, import_ui_utils8.formatDataStreamPart)("error", getErrorMessage5(chunk.error)) ) break } case "step-start": { controller.enqueue( (0, import_ui_utils8.formatDataStreamPart)("start_step", { messageId: chunk.messageId }) ) break } case "step-finish": { controller.enqueue( (0, import_ui_utils8.formatDataStreamPart)("finish_step", { finishReason: chunk.finishReason, usage: sendUsage ? { promptTokens: chunk.usage.promptTokens, completionTokens: chunk.usage.completionTokens } : void 0, isContinued: chunk.isContinued }) ) break } case "finish": { controller.enqueue( (0, import_ui_utils8.formatDataStreamPart)("finish_message", { finishReason: chunk.finishReason, usage: sendUsage ? { promptTokens: chunk.usage.promptTokens, completionTokens: chunk.usage.completionTokens } : void 0 }) ) break } default: { const exhaustiveCheck = chunkType throw new Error(`Unknown chunk type: ${exhaustiveCheck}`) } } } }) return this.fullStream.pipeThrough(callbackTransformer).pipeThrough(streamPartsTransformer) } pipeDataStreamToResponse(response, { status, statusText, headers, data, getErrorMessage: getErrorMessage5, sendUsage } = {}) { writeToServerResponse({ response, status, statusText, headers: prepareOutgoingHttpHeaders(headers, { contentType: "text/plain; charset=utf-8", dataStreamVersion: "v1" }), stream: this.toDataStream({ data, getErrorMessage: getErrorMessage5, sendUsage }) }) } pipeTextStreamToResponse(response, init) { writeToServerResponse({ response, status: init == null ? void 0 : init.status, statusText: init == null ? void 0 : init.statusText, headers: prepareOutgoingHttpHeaders(init == null ? void 0 : init.headers, { contentType: "text/plain; charset=utf-8" }), stream: this.textStream.pipeThrough(new TextEncoderStream()) }) } // TODO breaking change 5.0: remove pipeThrough(new TextEncoderStream()) toDataStream(options) { const stream = this.toDataStreamInternal({ getErrorMessage: options == null ? void 0 : options.getErrorMessage, sendUsage: options == null ? void 0 : options.sendUsage }).pipeThrough(new TextEncoderStream()) return (options == null ? void 0 : options.data) ? mergeStreams(options == null ? void 0 : options.data.stream, stream) : stream } mergeIntoDataStream(writer) { writer.merge( this.toDataStreamInternal({ getErrorMessage: writer.onError }) ) } toDataStreamResponse({ headers, status, statusText, data, getErrorMessage: getErrorMessage5, sendUsage } = {}) { return new Response( this.toDataStream({ data, getErrorMessage: getErrorMessage5, sendUsage }), { status, statusText, headers: prepareResponseHeaders(headers, { contentType: "text/plain; charset=utf-8", dataStreamVersion: "v1" }) } ) } toTextStreamResponse(init) { var _a14 return new Response(this.textStream.pipeThrough(new TextEncoderStream()), { status: (_a14 = init == null ? void 0 : init.status) != null ? _a14 : 200, headers: prepareResponseHeaders(init == null ? void 0 : init.headers, { contentType: "text/plain; charset=utf-8" }) }) } } // core/middleware/wrap-language-model.ts var experimental_wrapLanguageModel = ({ model, middleware: { transformParams, wrapGenerate, wrapStream }, modelId, providerId }) => { async function doTransform({ params, type }) { return transformParams ? await transformParams({ params, type }) : params } return { specificationVersion: "v1", provider: providerId != null ? providerId : model.provider, modelId: modelId != null ? modelId : model.modelId, defaultObjectGenerationMode: model.defaultObjectGenerationMode, supportsImageUrls: model.supportsImageUrls, supportsUrl: model.supportsUrl, supportsStructuredOutputs: model.supportsStructuredOutputs, async doGenerate(params) { const transformedParams = await doTransform({ params, type: "generate" }) const doGenerate = async () => model.doGenerate(transformedParams) return wrapGenerate ? wrapGenerate({ doGenerate, params: transformedParams, model }) : doGenerate() }, async doStream(params) { const transformedParams = await doTransform({ params, type: "stream" }) const doStream = async () => model.doStream(transformedParams) return wrapStream ? wrapStream({ doStream, params: transformedParams, model }) : doStream() } } } // core/prompt/append-response-messages.ts function appendResponseMessages({ messages, responseMessages }) { var _a14 const clonedMessages = structuredClone(messages) for (const message of responseMessages) { const role = message.role switch (role) { case "assistant": { clonedMessages.push({ role: "assistant", id: message.id, createdAt: /* @__PURE__ */ new Date(), // generate a createdAt date for the message, will be overridden by the client // only include text in the content: content: typeof message.content === "string" ? message.content : message.content.filter((part) => part.type === "text").map((part) => part.text).join(""), // separate tool calls from the content: toolInvocations: (typeof message.content === "string" ? [] : message.content.filter((part) => part.type === "tool-call")).map((call) => ({ state: "call", ...call })) }) break } case "tool": { const previousMessage = clonedMessages[clonedMessages.length - 1]; (_a14 = previousMessage.toolInvocations) != null ? _a14 : previousMessage.toolInvocations = [] if (previousMessage.role !== "assistant") { throw new Error( `Tool result must follow an assistant message: ${previousMessage.role}` ) } for (const part of message.content) { const toolCall = previousMessage.toolInvocations.find( (call) => call.toolCallId === part.toolCallId ) if (!toolCall) { throw new Error("Tool call not found in previous message") } toolCall.state = "result" const toolResult = toolCall toolResult.result = part.result } break } default: { const _exhaustiveCheck = role throw new Error(`Unsupported message role: ${_exhaustiveCheck}`) } } } return clonedMessages } // core/registry/custom-provider.ts var import_provider18 = require("@ai-sdk/provider") function experimental_customProvider({ languageModels, textEmbeddingModels, fallbackProvider }) { return { languageModel(modelId) { if (languageModels != null && modelId in languageModels) { return languageModels[modelId] } if (fallbackProvider) { return fallbackProvider.languageModel(modelId) } throw new import_provider18.NoSuchModelError({ modelId, modelType: "languageModel" }) }, textEmbeddingModel(modelId) { if (textEmbeddingModels != null && modelId in textEmbeddingModels) { return textEmbeddingModels[modelId] } if (fallbackProvider) { return fallbackProvider.textEmbeddingModel(modelId) } throw new import_provider18.NoSuchModelError({ modelId, modelType: "textEmbeddingModel" }) } } } // core/registry/no-such-provider-error.ts var import_provider19 = require("@ai-sdk/provider") var name13 = "AI_NoSuchProviderError" var marker13 = `vercel.ai.error.${name13}` var symbol13 = Symbol.for(marker13) var _a13 var NoSuchProviderError = class extends import_provider19.NoSuchModelError { constructor({ modelId, modelType, providerId, availableProviders, message = `No such provider: ${providerId} (available providers: ${availableProviders.join()})` }) { super({ errorName: name13, modelId, modelType, message }) this[_a13] = true this.providerId = providerId this.availableProviders = availableProviders } static isInstance(error) { return import_provider19.AISDKError.hasMarker(error, marker13) } } _a13 = symbol13 // core/registry/provider-registry.ts var import_provider20 = require("@ai-sdk/provider") function experimental_createProviderRegistry(providers) { const registry = new DefaultProviderRegistry() for (const [id, provider] of Object.entries(providers)) { registry.registerProvider({ id, provider }) } return registry } var DefaultProviderRegistry = class { constructor() { this.providers = {} } registerProvider({ id, provider }) { this.providers[id] = provider } getProvider(id) { const provider = this.providers[id] if (provider == null) { throw new NoSuchProviderError({ modelId: id, modelType: "languageModel", providerId: id, availableProviders: Object.keys(this.providers) }) } return provider } splitId(id, modelType) { const index = id.indexOf(":") if (index === -1) { throw new import_provider20.NoSuchModelError({ modelId: id, modelType, message: `Invalid ${modelType} id for registry: ${id} (must be in the format "providerId:modelId")` }) } return [id.slice(0, index), id.slice(index + 1)] } languageModel(id) { var _a14, _b const [providerId, modelId] = this.splitId(id, "languageModel") const model = (_b = (_a14 = this.getProvider(providerId)).languageModel) == null ? void 0 : _b.call(_a14, modelId) if (model == null) { throw new import_provider20.NoSuchModelError({ modelId: id, modelType: "languageModel" }) } return model } textEmbeddingModel(id) { var _a14 const [providerId, modelId] = this.splitId(id, "textEmbeddingModel") const provider = this.getProvider(providerId) const model = (_a14 = provider.textEmbeddingModel) == null ? void 0 : _a14.call(provider, modelId) if (model == null) { throw new import_provider20.NoSuchModelError({ modelId: id, modelType: "textEmbeddingModel" }) } return model } /** * @deprecated Use `textEmbeddingModel` instead. */ textEmbedding(id) { return this.textEmbeddingModel(id) } } // core/tool/tool.ts function tool(tool2) { return tool2 } // core/util/cosine-similarity.ts function cosineSimilarity(vector1, vector2, options = { throwErrorForEmptyVectors: false }) { const { throwErrorForEmptyVectors } = options if (vector1.length !== vector2.length) { throw new Error( `Vectors must have the same length (vector1: ${vector1.length} elements, vector2: ${vector2.length} elements)` ) } if (throwErrorForEmptyVectors && vector1.length === 0) { throw new InvalidArgumentError({ parameter: "vector1", value: vector1, message: "Vectors cannot be empty" }) } const magnitude1 = magnitude(vector1) const magnitude2 = magnitude(vector2) if (magnitude1 === 0 || magnitude2 === 0) { return 0 } return dotProduct(vector1, vector2) / (magnitude1 * magnitude2) } function dotProduct(vector1, vector2) { return vector1.reduce( (accumulator, value, index) => accumulator + value * vector2[index], 0 ) } function magnitude(vector) { return Math.sqrt(dotProduct(vector, vector)) } // core/util/simulate-readable-stream.ts function simulateReadableStream({ chunks, initialDelayInMs = 0, chunkDelayInMs = 0, _internal }) { var _a14 const delay2 = (_a14 = _internal == null ? void 0 : _internal.delay) != null ? _a14 : delay let index = 0 return new ReadableStream({ async pull(controller) { if (index < chunks.length) { await delay2(index === 0 ? initialDelayInMs : chunkDelayInMs) controller.enqueue(chunks[index++]) } else { controller.close() } } }) } // streams/assistant-response.ts var import_ui_utils10 = require("@ai-sdk/ui-utils") function AssistantResponse({ threadId, messageId }, process2) { const stream = new ReadableStream({ async start(controller) { var _a14 const textEncoder = new TextEncoder() const sendMessage = (message) => { controller.enqueue( textEncoder.encode( (0, import_ui_utils10.formatAssistantStreamPart)("assistant_message", message) ) ) } const sendDataMessage = (message) => { controller.enqueue( textEncoder.encode( (0, import_ui_utils10.formatAssistantStreamPart)("data_message", message) ) ) } const sendError = (errorMessage) => { controller.enqueue( textEncoder.encode((0, import_ui_utils10.formatAssistantStreamPart)("error", errorMessage)) ) } const forwardStream = async (stream2) => { var _a15, _b let result = void 0 for await (const value of stream2) { switch (value.event) { case "thread.message.created": { controller.enqueue( textEncoder.encode( (0, import_ui_utils10.formatAssistantStreamPart)("assistant_message", { id: value.data.id, role: "assistant", content: [{ type: "text", text: { value: "" } }] }) ) ) break } case "thread.message.delta": { const content = (_a15 = value.data.delta.content) == null ? void 0 : _a15[0] if ((content == null ? void 0 : content.type) === "text" && ((_b = content.text) == null ? void 0 : _b.value) != null) { controller.enqueue( textEncoder.encode( (0, import_ui_utils10.formatAssistantStreamPart)("text", content.text.value) ) ) } break } case "thread.run.completed": case "thread.run.requires_action": { result = value.data break } } } return result } controller.enqueue( textEncoder.encode( (0, import_ui_utils10.formatAssistantStreamPart)("assistant_control_data", { threadId, messageId }) ) ) try { await process2({ sendMessage, sendDataMessage, forwardStream }) } catch (error) { sendError((_a14 = error.message) != null ? _a14 : `${error}`) } finally { controller.close() } }, pull(controller) { }, cancel() { } }) return new Response(stream, { status: 200, headers: { "Content-Type": "text/plain; charset=utf-8" } }) } // streams/langchain-adapter.ts var langchain_adapter_exports = {} __export(langchain_adapter_exports, { mergeIntoDataStream: () => mergeIntoDataStream, toDataStream: () => toDataStream, toDataStreamResponse: () => toDataStreamResponse }) var import_ui_utils11 = require("@ai-sdk/ui-utils") // streams/stream-callbacks.ts function createCallbacksTransformer(callbacks = {}) { const textEncoder = new TextEncoder() let aggregatedResponse = "" return new TransformStream({ async start() { if (callbacks.onStart) await callbacks.onStart() }, async transform(message, controller) { controller.enqueue(textEncoder.encode(message)) aggregatedResponse += message if (callbacks.onToken) await callbacks.onToken(message) if (callbacks.onText && typeof message === "string") { await callbacks.onText(message) } }, async flush() { if (callbacks.onCompletion) { await callbacks.onCompletion(aggregatedResponse) } if (callbacks.onFinal) { await callbacks.onFinal(aggregatedResponse) } } }) } // streams/langchain-adapter.ts function toDataStreamInternal(stream, callbacks) { return stream.pipeThrough( new TransformStream({ transform: async (value, controller) => { var _a14 if (typeof value === "string") { controller.enqueue(value) return } if ("event" in value) { if (value.event === "on_chat_model_stream") { forwardAIMessageChunk( (_a14 = value.data) == null ? void 0 : _a14.chunk, controller ) } return } forwardAIMessageChunk(value, controller) } }) ).pipeThrough(createCallbacksTransformer(callbacks)).pipeThrough(new TextDecoderStream()).pipeThrough( new TransformStream({ transform: async (chunk, controller) => { controller.enqueue((0, import_ui_utils11.formatDataStreamPart)("text", chunk)) } }) ) } function toDataStream(stream, callbacks) { return toDataStreamInternal(stream, callbacks).pipeThrough( new TextEncoderStream() ) } function toDataStreamResponse(stream, options) { var _a14 const dataStream = toDataStreamInternal( stream, options == null ? void 0 : options.callbacks ).pipeThrough(new TextEncoderStream()) const data = options == null ? void 0 : options.data const init = options == null ? void 0 : options.init const responseStream = data ? mergeStreams(data.stream, dataStream) : dataStream return new Response(responseStream, { status: (_a14 = init == null ? void 0 : init.status) != null ? _a14 : 200, statusText: init == null ? void 0 : init.statusText, headers: prepareResponseHeaders(init == null ? void 0 : init.headers, { contentType: "text/plain; charset=utf-8", dataStreamVersion: "v1" }) }) } function mergeIntoDataStream(stream, options) { options.dataStream.merge(toDataStreamInternal(stream, options.callbacks)) } function forwardAIMessageChunk(chunk, controller) { if (typeof chunk.content === "string") { controller.enqueue(chunk.content) } else { const content = chunk.content for (const item of content) { if (item.type === "text") { controller.enqueue(item.text) } } } } // streams/llamaindex-adapter.ts var llamaindex_adapter_exports = {} __export(llamaindex_adapter_exports, { mergeIntoDataStream: () => mergeIntoDataStream2, toDataStream: () => toDataStream2, toDataStreamResponse: () => toDataStreamResponse2 }) var import_provider_utils13 = require("@ai-sdk/provider-utils") var import_ui_utils12 = require("@ai-sdk/ui-utils") function toDataStreamInternal2(stream, callbacks) { const trimStart = trimStartOfStream() return (0, import_provider_utils13.convertAsyncIteratorToReadableStream)(stream[Symbol.asyncIterator]()).pipeThrough( new TransformStream({ async transform(message, controller) { controller.enqueue(trimStart(message.delta)) } }) ).pipeThrough(createCallbacksTransformer(callbacks)).pipeThrough(new TextDecoderStream()).pipeThrough( new TransformStream({ transform: async (chunk, controller) => { controller.enqueue((0, import_ui_utils12.formatDataStreamPart)("text", chunk)) } }) ) } function toDataStream2(stream, callbacks) { return toDataStreamInternal2(stream, callbacks).pipeThrough( new TextEncoderStream() ) } function toDataStreamResponse2(stream, options = {}) { var _a14 const { init, data, callbacks } = options const dataStream = toDataStreamInternal2(stream, callbacks).pipeThrough( new TextEncoderStream() ) const responseStream = data ? mergeStreams(data.stream, dataStream) : dataStream return new Response(responseStream, { status: (_a14 = init == null ? void 0 : init.status) != null ? _a14 : 200, statusText: init == null ? void 0 : init.statusText, headers: prepareResponseHeaders(init == null ? void 0 : init.headers, { contentType: "text/plain; charset=utf-8", dataStreamVersion: "v1" }) }) } function mergeIntoDataStream2(stream, options) { options.dataStream.merge(toDataStreamInternal2(stream, options.callbacks)) } function trimStartOfStream() { let isStreamStart = true return (text2) => { if (isStreamStart) { text2 = text2.trimStart() if (text2) isStreamStart = false } return text2 } } // streams/stream-data.ts var import_ui_utils13 = require("@ai-sdk/ui-utils") // util/constants.ts var HANGING_STREAM_WARNING_TIME_MS = 15 * 1e3 // streams/stream-data.ts var StreamData = class { constructor() { this.encoder = new TextEncoder() this.controller = null this.isClosed = false this.warningTimeout = null const self = this this.stream = new ReadableStream({ start: async (controller) => { self.controller = controller if (process.env.NODE_ENV === "development") { self.warningTimeout = setTimeout(() => { console.warn( "The data stream is hanging. Did you forget to close it with `data.close()`?" ) }, HANGING_STREAM_WARNING_TIME_MS) } }, pull: (controller) => { }, cancel: (reason) => { this.isClosed = true } }) } async close() { if (this.isClosed) { throw new Error("Data Stream has already been closed.") } if (!this.controller) { throw new Error("Stream controller is not initialized.") } this.controller.close() this.isClosed = true if (this.warningTimeout) { clearTimeout(this.warningTimeout) } } append(value) { if (this.isClosed) { throw new Error("Data Stream has already been closed.") } if (!this.controller) { throw new Error("Stream controller is not initialized.") } this.controller.enqueue( this.encoder.encode((0, import_ui_utils13.formatDataStreamPart)("data", [value])) ) } appendMessageAnnotation(value) { if (this.isClosed) { throw new Error("Data Stream has already been closed.") } if (!this.controller) { throw new Error("Stream controller is not initialized.") } this.controller.enqueue( this.encoder.encode((0, import_ui_utils13.formatDataStreamPart)("message_annotations", [value])) ) } } // Annotate the CommonJS export names for ESM import in node: module.exports = { // AISDKError, // APICallError, AssistantResponse, DownloadError, // EmptyResponseBodyError, InvalidArgumentError, InvalidDataContentError, InvalidMessageRoleError, // InvalidPromptError, // InvalidResponseDataError, InvalidToolArgumentsError, // JSONParseError, // LangChainAdapter, // LlamaIndexAdapter, // LoadAPIKeyError, MessageConversionError, // NoContentGeneratedError, NoObjectGeneratedError, NoOutputSpecifiedError, // NoSuchModelError, NoSuchProviderError, NoSuchToolError, // Output, RetryError, StreamData, ToolCallRepairError, ToolExecutionError, // TypeValidationError, // UnsupportedFunctionalityError, appendResponseMessages, convertToCoreMessages, cosineSimilarity, createDataStream, createDataStreamResponse, // createIdGenerator, embed, embedMany, experimental_createProviderRegistry, experimental_customProvider, // experimental_generateImage, experimental_wrapLanguageModel, // formatAssistantStreamPart, // formatDataStreamPart, // generateId, generateObject, generateText, // jsonSchema, // parseAssistantStreamPart, // parseDataStreamPart, pipeDataStreamToResponse, // processDataStream, // processTextStream, simulateReadableStream, smoothStream, streamObject, streamText, tool }