import { fileURLToPath as __eveFileURLToPath } from "node:url"; import { dirname as __eveDirname } from "node:path"; __eveDirname(__eveFileURLToPath(import.meta.url)); import { n as __exportAll } from "../_runtime.mjs"; import { $ as AISDKError, A as safeParseJSON, B as boolean, C as isProviderReference, D as readResponseWithSizeLimit, E as lazySchema, F as zodSchema, G as never, H as discriminatedUnion, I as _enum, J as record, K as number, L as _instanceof, N as validateTypes, O as resolve, P as withUserAgentSuffix, Q as unknown, R as _null, S as isFullMediaType, U as lazy, V as custom, W as literal, X as string, Y as strictObject, Z as union, _ as filterNullable, b as isBuffer, c as asArray, d as convertBase64ToUint8Array, et as APICallError, f as convertUint8ArrayToBase64, g as fetchWithValidatedRedirects, h as executeTool, it as getErrorMessage, j as safeValidateTypes, k as retryWithExponentialBackoff, l as asSchema, m as detectMediaType, n as GatewayError, nt as TypeValidationError, o as DelayedPromise, p as createIdGenerator, q as object$1, r as gateway, rt as UnsupportedFunctionalityError, s as DownloadError, t as GatewayAuthenticationError, tt as InvalidPromptError, u as cancelResponseBody, v as getRuntimeEnvironmentUserAgent, w as isUrlSupported, x as isExecutableTool, y as isAbortError, z as array$1 } from "./@ai-sdk/gateway+[...].mjs"; //#region node_modules/ai/dist/index.js var dist_exports = /* @__PURE__ */ __exportAll({ AI_SDK_TELEMETRY_TRACING_CHANNEL: () => "ai:telemetry", DefaultGeneratedFile: () => DefaultGeneratedFile, Experimental_Agent: () => ToolLoopAgent, InvalidArgumentError: () => InvalidArgumentError, InvalidDataContentError: () => InvalidDataContentError, InvalidMessageRoleError: () => InvalidMessageRoleError, InvalidToolApprovalError: () => InvalidToolApprovalError, InvalidToolApprovalSignatureError: () => InvalidToolApprovalSignatureError, InvalidToolInputError: () => InvalidToolInputError, JsonToSseTransformStream: () => JsonToSseTransformStream, MissingToolResultsError: () => MissingToolResultsError, NoObjectGeneratedError: () => NoObjectGeneratedError, NoOutputGeneratedError: () => NoOutputGeneratedError, NoSuchToolError: () => NoSuchToolError, Output: () => output_exports, RetryError: () => RetryError, ToolCallNotFoundForApprovalError: () => ToolCallNotFoundForApprovalError, ToolCallRepairError: () => ToolCallRepairError, ToolLoopAgent: () => ToolLoopAgent, UIMessageStreamError: () => UIMessageStreamError, UI_MESSAGE_STREAM_HEADERS: () => UI_MESSAGE_STREAM_HEADERS, UnsupportedModelVersionError: () => UnsupportedModelVersionError, assistantModelMessageSchema: () => assistantModelMessageSchema, consumeStream: () => consumeStream, convertDataContentToBase64String: () => convertDataContentToBase64String, createDownload: () => createDownload, createTextStreamResponse: () => createTextStreamResponse, createUIMessageStreamResponse: () => createUIMessageStreamResponse, experimental_filterActiveTools: () => filterActiveTools, experimental_streamLanguageModelCall: () => streamLanguageModelCall, gateway: () => gateway, generateText: () => generateText, getChunkTimeoutMs: () => getChunkTimeoutMs, getStaticToolName: () => getStaticToolName, getStepTimeoutMs: () => getStepTimeoutMs, getToolTimeoutMs: () => getToolTimeoutMs, getTotalTimeoutMs: () => getTotalTimeoutMs, isDynamicToolUIPart: () => isDynamicToolUIPart, isStaticToolUIPart: () => isStaticToolUIPart, isStepCount: () => isStepCount, isToolUIPart: () => isToolUIPart, modelMessageSchema: () => modelMessageSchema, parsePartialJson: () => parsePartialJson, pipeTextStreamToResponse: () => pipeTextStreamToResponse, pipeUIMessageStreamToResponse: () => pipeUIMessageStreamToResponse, registerTelemetry: () => registerTelemetry, stepCountIs: () => isStepCount, streamText: () => streamText, systemModelMessageSchema: () => systemModelMessageSchema, toTextStream: () => toTextStream, toUIMessageChunk: () => toUIMessageChunk, toUIMessageStream: () => toUIMessageStream, toolModelMessageSchema: () => toolModelMessageSchema, userModelMessageSchema: () => userModelMessageSchema }); var __defProp = Object.defineProperty; var __export = (target, all) => { for (var name22 in all) __defProp(target, name22, { get: all[name22], enumerable: true }); }; var name = "AI_InvalidArgumentError"; var marker = `vercel.ai.error.${name}`; var symbol = Symbol.for(marker); var _a; var InvalidArgumentError = class extends 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 AISDKError.hasMarker(error, marker); } }; _a = symbol; var name3 = "AI_InvalidToolApprovalError"; var marker3 = `vercel.ai.error.${name3}`; var symbol3 = Symbol.for(marker3); var _a3; var InvalidToolApprovalError = class extends AISDKError { constructor({ approvalId }) { super({ name: name3, message: `Tool approval response references unknown approvalId: "${approvalId}". No matching tool-approval-request found in message history.` }); this[_a3] = true; this.approvalId = approvalId; } static isInstance(error) { return AISDKError.hasMarker(error, marker3); } }; _a3 = symbol3; var name4 = "AI_InvalidToolApprovalSignatureError"; var marker4 = `vercel.ai.error.${name4}`; var symbol4 = Symbol.for(marker4); var _a4; var InvalidToolApprovalSignatureError = class extends AISDKError { constructor({ approvalId, toolCallId, reason }) { super({ name: name4, message: `Tool approval signature verification failed for approval "${approvalId}" (tool call "${toolCallId}"): ${reason}` }); this[_a4] = true; this.approvalId = approvalId; this.toolCallId = toolCallId; } static isInstance(error) { return AISDKError.hasMarker(error, marker4); } }; _a4 = symbol4; var name5 = "AI_InvalidToolInputError"; var marker5 = `vercel.ai.error.${name5}`; var symbol5 = Symbol.for(marker5); var _a5; var InvalidToolInputError = class extends AISDKError { constructor({ toolInput, toolName, cause, message = `Invalid input for tool ${toolName}: ${getErrorMessage(cause)}` }) { super({ name: name5, message, cause }); this[_a5] = true; this.toolInput = toolInput; this.toolName = toolName; } static isInstance(error) { return AISDKError.hasMarker(error, marker5); } }; _a5 = symbol5; var name6 = "AI_ToolCallNotFoundForApprovalError"; var marker6 = `vercel.ai.error.${name6}`; var symbol6 = Symbol.for(marker6); var _a6; var ToolCallNotFoundForApprovalError = class extends AISDKError { constructor({ toolCallId, approvalId }) { super({ name: name6, message: `Tool call "${toolCallId}" not found for approval request "${approvalId}".` }); this[_a6] = true; this.toolCallId = toolCallId; this.approvalId = approvalId; } static isInstance(error) { return AISDKError.hasMarker(error, marker6); } }; _a6 = symbol6; var name7 = "AI_MissingToolResultsError"; var marker7 = `vercel.ai.error.${name7}`; var symbol7 = Symbol.for(marker7); var _a7; var MissingToolResultsError = class extends AISDKError { constructor({ toolCallIds }) { super({ name: name7, message: `Tool result${toolCallIds.length > 1 ? "s are" : " is"} missing for tool call${toolCallIds.length > 1 ? "s" : ""} ${toolCallIds.join(", ")}.` }); this[_a7] = true; this.toolCallIds = toolCallIds; } static isInstance(error) { return AISDKError.hasMarker(error, marker7); } }; _a7 = symbol7; var name9 = "AI_NoObjectGeneratedError"; var marker9 = `vercel.ai.error.${name9}`; var symbol9 = Symbol.for(marker9); var _a9; var NoObjectGeneratedError = class extends AISDKError { constructor({ message = "No object generated.", cause, text: text2, response, usage, finishReason }) { super({ name: name9, message, cause }); this[_a9] = true; this.text = text2; this.response = response; this.usage = usage; this.finishReason = finishReason; } static isInstance(error) { return AISDKError.hasMarker(error, marker9); } }; _a9 = symbol9; var name10 = "AI_NoOutputGeneratedError"; var marker10 = `vercel.ai.error.${name10}`; var symbol10 = Symbol.for(marker10); var _a10; var NoOutputGeneratedError = class extends AISDKError { constructor({ message = "No output generated.", cause } = {}) { super({ name: name10, message, cause }); this[_a10] = true; } static isInstance(error) { return AISDKError.hasMarker(error, marker10); } }; _a10 = symbol10; var name14 = "AI_NoSuchToolError"; var marker14 = `vercel.ai.error.${name14}`; var symbol14 = Symbol.for(marker14); var _a14; var NoSuchToolError = class extends 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: name14, message }); this[_a14] = true; this.toolName = toolName; this.availableTools = availableTools; } static isInstance(error) { return AISDKError.hasMarker(error, marker14); } }; _a14 = symbol14; var name15 = "AI_ToolCallRepairError"; var marker15 = `vercel.ai.error.${name15}`; var symbol15 = Symbol.for(marker15); var _a15; var ToolCallRepairError = class extends AISDKError { constructor({ cause, originalError, message = `Error repairing tool call: ${getErrorMessage(cause)}` }) { super({ name: name15, message, cause }); this[_a15] = true; this.originalError = originalError; } static isInstance(error) { return AISDKError.hasMarker(error, marker15); } }; _a15 = symbol15; var UnsupportedModelVersionError = class extends AISDKError { constructor(options) { super({ name: "AI_UnsupportedModelVersionError", message: `Unsupported model version ${options.version} for provider "${options.provider}" and model "${options.modelId}". AI SDK 5 only supports models that implement specification version "v2".` }); this.version = options.version; this.provider = options.provider; this.modelId = options.modelId; } }; var name16 = "AI_UIMessageStreamError"; var marker16 = `vercel.ai.error.${name16}`; var symbol16 = Symbol.for(marker16); var _a16; var UIMessageStreamError = class extends AISDKError { constructor({ chunkType, chunkId, message }) { super({ name: name16, message }); this[_a16] = true; this.chunkType = chunkType; this.chunkId = chunkId; } static isInstance(error) { return AISDKError.hasMarker(error, marker16); } }; _a16 = symbol16; var name17 = "AI_InvalidDataContentError"; var marker17 = `vercel.ai.error.${name17}`; var symbol17 = Symbol.for(marker17); var _a17; var InvalidDataContentError = class extends AISDKError { constructor({ content, cause, message = `Invalid data content. Expected a base64 string, Uint8Array, ArrayBuffer, or Buffer, but got ${typeof content}.` }) { super({ name: name17, message, cause }); this[_a17] = true; this.content = content; } static isInstance(error) { return AISDKError.hasMarker(error, marker17); } }; _a17 = symbol17; var name18 = "AI_InvalidMessageRoleError"; var marker18 = `vercel.ai.error.${name18}`; var symbol18 = Symbol.for(marker18); var _a18; var InvalidMessageRoleError = class extends AISDKError { constructor({ role, message = `Invalid message role: '${role}'. Must be one of: "system", "user", "assistant", "tool".` }) { super({ name: name18, message }); this[_a18] = true; this.role = role; } static isInstance(error) { return AISDKError.hasMarker(error, marker18); } }; _a18 = symbol18; var name20 = "AI_RetryError"; var marker20 = `vercel.ai.error.${name20}`; var symbol20 = Symbol.for(marker20); var _a20; var RetryError = class extends AISDKError { constructor({ message, reason, errors }) { super({ name: name20, message }); this[_a20] = true; this.reason = reason; this.errors = errors; this.lastError = errors[errors.length - 1]; } static isInstance(error) { return AISDKError.hasMarker(error, marker20); } }; _a20 = symbol20; function formatWarning({ warning, provider, model }) { const prefix = `AI SDK Warning${provider != null && model != null ? ` (${provider} / ${model})` : ""}:`; switch (warning.type) { case "unsupported": { let message = `${prefix} The feature "${warning.feature}" is not supported.`; if (warning.details) message += ` ${warning.details}`; return message; } case "compatibility": { let message = `${prefix} The feature "${warning.feature}" is used in a compatibility mode.`; if (warning.details) message += ` ${warning.details}`; return message; } case "deprecated": return `${prefix} Deprecated: "${warning.setting}". ${warning.message}`; case "other": return `${prefix} ${warning.message}`; default: return `${prefix} ${JSON.stringify(warning, null, 2)}`; } } var FIRST_WARNING_INFO_MESSAGE = "AI SDK Warning System: To turn off warning logging, set the AI_SDK_LOG_WARNINGS global to false."; var hasLoggedBefore = false; var logWarnings = (options) => { if (options.warnings.length === 0) return; const logger = globalThis.AI_SDK_LOG_WARNINGS; if (logger === false) return; if (typeof logger === "function") { logger(options); return; } if (!hasLoggedBefore) { hasLoggedBefore = true; console.info(FIRST_WARNING_INFO_MESSAGE); } for (const warning of options.warnings) { const message = formatWarning({ warning, provider: options.provider, model: options.model }); if (typeof process !== "undefined" && typeof process.emitWarning === "function") process.emitWarning(message, { type: warning.type === "deprecated" ? "DeprecationWarning" : "Warning" }); else console.warn(message); } }; function logV2CompatibilityWarning({ provider, modelId }) { logWarnings({ warnings: [{ type: "compatibility", feature: "specificationVersion", details: `Using v2 specification compatibility mode. Some features may not be available.` }], provider, model: modelId }); } function asEmbeddingModelV3(model) { if (model.specificationVersion === "v3") return model; logV2CompatibilityWarning({ provider: model.provider, modelId: model.modelId }); return new Proxy(model, { get(target, prop) { if (prop === "specificationVersion") return "v3"; return target[prop]; } }); } function asEmbeddingModelV4(model) { if (model.specificationVersion === "v4") return model; const v3Model = model.specificationVersion === "v2" ? asEmbeddingModelV3(model) : model; return new Proxy(v3Model, { get(target, prop) { if (prop === "specificationVersion") return "v4"; return target[prop]; } }); } function asImageModelV3(model) { if (model.specificationVersion === "v3") return model; logV2CompatibilityWarning({ provider: model.provider, modelId: model.modelId }); return new Proxy(model, { get(target, prop) { if (prop === "specificationVersion") return "v3"; return target[prop]; } }); } function asImageModelV4(model) { if (model.specificationVersion === "v4") return model; const v3Model = model.specificationVersion === "v2" ? asImageModelV3(model) : model; return new Proxy(v3Model, { get(target, prop) { if (prop === "specificationVersion") return "v4"; return target[prop]; } }); } function asLanguageModelV3(model) { if (model.specificationVersion === "v3") return model; logV2CompatibilityWarning({ provider: model.provider, modelId: model.modelId }); return new Proxy(model, { get(target, prop) { switch (prop) { case "specificationVersion": return "v3"; case "doGenerate": return async (...args) => { const result = await target.doGenerate(...args); return { ...result, finishReason: convertV2FinishReasonToV3(result.finishReason), usage: convertV2UsageToV3(result.usage) }; }; case "doStream": return async (...args) => { const result = await target.doStream(...args); return { ...result, stream: convertV2StreamToV3(result.stream) }; }; default: return target[prop]; } } }); } function convertV2StreamToV3(stream) { return stream.pipeThrough(new TransformStream({ transform(chunk, controller) { switch (chunk.type) { case "finish": controller.enqueue({ ...chunk, finishReason: convertV2FinishReasonToV3(chunk.finishReason), usage: convertV2UsageToV3(chunk.usage) }); break; default: controller.enqueue(chunk); break; } } })); } function convertV2FinishReasonToV3(finishReason) { return { unified: finishReason === "unknown" ? "other" : finishReason, raw: void 0 }; } function convertV2UsageToV3(usage) { return { inputTokens: { total: usage.inputTokens, noCache: void 0, cacheRead: usage.cachedInputTokens, cacheWrite: void 0 }, outputTokens: { total: usage.outputTokens, text: void 0, reasoning: usage.reasoningTokens } }; } function asLanguageModelV4(model) { if (model.specificationVersion === "v4") return model; const v3Model = model.specificationVersion === "v2" ? asLanguageModelV3(model) : model; return new Proxy(v3Model, { get(target, prop) { if (prop === "specificationVersion") return "v4"; return target[prop]; } }); } function asRerankingModelV4(model) { if (model.specificationVersion === "v4") return model; return new Proxy(model, { get(target, prop) { if (prop === "specificationVersion") return "v4"; return target[prop]; } }); } function asSpeechModelV3(model) { if (model.specificationVersion === "v3") return model; logV2CompatibilityWarning({ provider: model.provider, modelId: model.modelId }); return new Proxy(model, { get(target, prop) { if (prop === "specificationVersion") return "v3"; return target[prop]; } }); } function asSpeechModelV4(model) { if (model.specificationVersion === "v4") return model; const v3Model = model.specificationVersion === "v2" ? asSpeechModelV3(model) : model; return new Proxy(v3Model, { get(target, prop) { if (prop === "specificationVersion") return "v4"; return target[prop]; } }); } function asTranscriptionModelV3(model) { if (model.specificationVersion === "v3") return model; logV2CompatibilityWarning({ provider: model.provider, modelId: model.modelId }); return new Proxy(model, { get(target, prop) { if (prop === "specificationVersion") return "v3"; return target[prop]; } }); } function asTranscriptionModelV4(model) { if (model.specificationVersion === "v4") return model; const v3Model = model.specificationVersion === "v2" ? asTranscriptionModelV3(model) : model; return new Proxy(v3Model, { get(target, prop) { if (prop === "specificationVersion") return "v4"; return target[prop]; } }); } function asProviderV3(provider) { if ("specificationVersion" in provider && provider.specificationVersion === "v3") return provider; const v2Provider = provider; return { specificationVersion: "v3", languageModel: (modelId) => asLanguageModelV3(v2Provider.languageModel(modelId)), embeddingModel: (modelId) => asEmbeddingModelV3(v2Provider.textEmbeddingModel(modelId)), imageModel: (modelId) => asImageModelV3(v2Provider.imageModel(modelId)), transcriptionModel: v2Provider.transcriptionModel ? (modelId) => asTranscriptionModelV3(v2Provider.transcriptionModel(modelId)) : void 0, speechModel: v2Provider.speechModel ? (modelId) => asSpeechModelV3(v2Provider.speechModel(modelId)) : void 0, rerankingModel: void 0 }; } function asProviderV4(provider) { if ("specificationVersion" in provider && provider.specificationVersion === "v4") return provider; const v3Provider = !("specificationVersion" in provider) || provider.specificationVersion !== "v3" ? asProviderV3(provider) : provider; return { specificationVersion: "v4", languageModel: (modelId) => asLanguageModelV4(v3Provider.languageModel(modelId)), embeddingModel: (modelId) => asEmbeddingModelV4(v3Provider.embeddingModel(modelId)), imageModel: (modelId) => asImageModelV4(v3Provider.imageModel(modelId)), transcriptionModel: v3Provider.transcriptionModel ? (modelId) => asTranscriptionModelV4(v3Provider.transcriptionModel(modelId)) : void 0, speechModel: v3Provider.speechModel ? (modelId) => asSpeechModelV4(v3Provider.speechModel(modelId)) : void 0, rerankingModel: v3Provider.rerankingModel ? (modelId) => asRerankingModelV4(v3Provider.rerankingModel(modelId)) : void 0 }; } function resolveLanguageModel(model) { if (typeof model === "string") return getGlobalProvider().languageModel(model); if (![ "v4", "v3", "v2" ].includes(model.specificationVersion)) { const unsupportedModel = model; throw new UnsupportedModelVersionError({ version: unsupportedModel.specificationVersion, provider: unsupportedModel.provider, modelId: unsupportedModel.modelId }); } return asLanguageModelV4(model); } function getGlobalProvider() { var _a22; return asProviderV4((_a22 = globalThis.AI_SDK_DEFAULT_PROVIDER) != null ? _a22 : gateway); } function cloneModelMessages(messages) { return messages.map((message) => cloneValue(message)); } function cloneValue(value) { if (value instanceof URL) return new URL(value.href); if (Array.isArray(value)) return value.map((item) => cloneValue(item)); if (value instanceof Uint8Array) return new Uint8Array(value); if (value instanceof ArrayBuffer) return value.slice(0); if (value instanceof Date) return new Date(value); if (value != null && typeof value === "object") return Object.fromEntries(Object.entries(value).map(([key, value2]) => [key, cloneValue(value2)])); return value; } var VERSION = "7.0.28"; var download = async ({ url, maxBytes, abortSignal }) => { var _a22; const urlText = url.toString(); try { const response = await fetchWithValidatedRedirects({ url: urlText, headers: withUserAgentSuffix({}, `ai-sdk/${VERSION}`, getRuntimeEnvironmentUserAgent()), abortSignal }); if (!response.ok) { await cancelResponseBody(response); throw new DownloadError({ url: urlText, statusCode: response.status, statusText: response.statusText }); } return { data: await readResponseWithSizeLimit({ response, url: urlText, maxBytes: maxBytes != null ? maxBytes : 2147483648 }), mediaType: (_a22 = response.headers.get("content-type")) != null ? _a22 : void 0 }; } catch (error) { if (DownloadError.isInstance(error)) throw error; throw new DownloadError({ url: urlText, cause: error }); } }; var createDefaultDownloadFunction = (download2 = download) => (requestedDownloads) => Promise.all(requestedDownloads.map(async (requestedDownload) => requestedDownload.isUrlSupportedByModel ? null : await download2(requestedDownload))); function splitDataUrl(dataUrl) { try { const [header, base64Content] = dataUrl.split(","); return { mediaType: header.split(";")[0].split(":")[1], base64Content }; } catch (e) { return { mediaType: void 0, base64Content: void 0 }; } } function isTaggedFileData(value) { if (typeof value !== "object" || value === null) return false; const type = value.type; return type === "data" || type === "url" || type === "reference" || type === "text"; } function convertUrlToFilePartData(url) { if (url.protocol === "data:") { const { mediaType, base64Content } = splitDataUrl(url.toString()); if (mediaType == null || base64Content == null) throw new InvalidDataContentError({ content: url, message: `Invalid data URL format in content ${url.toString()}` }); return { data: { type: "data", data: base64Content }, mediaType }; } return { data: { type: "url", url }, mediaType: void 0 }; } function convertInlineDataToFilePartData(content) { if (content instanceof Uint8Array) return { data: { type: "data", data: content }, mediaType: void 0 }; if (content instanceof ArrayBuffer) return { data: { type: "data", data: new Uint8Array(content) }, mediaType: void 0 }; if (isBuffer(content)) return { data: { type: "data", data: new Uint8Array(content) }, mediaType: void 0 }; return { data: { type: "data", data: content }, mediaType: void 0 }; } function convertToLanguageModelV4FilePart(content) { if (isTaggedFileData(content)) switch (content.type) { case "data": if (typeof content.data === "string" && content.data.startsWith("data:")) throw new InvalidDataContentError({ content: content.data, message: "Data URLs are not valid inline data. Pass them as { type: \"url\", url } instead." }); return convertInlineDataToFilePartData(content.data); case "url": return convertUrlToFilePartData(content.url); case "reference": return { data: { type: "reference", reference: content.reference }, mediaType: void 0 }; case "text": return { data: { type: "text", text: content.text }, mediaType: void 0 }; } if (content instanceof URL) return convertUrlToFilePartData(content); if (typeof content === "string") try { return convertUrlToFilePartData(new URL(content)); } catch (e) { return convertInlineDataToFilePartData(content); } if (isProviderReference(content)) return { data: { type: "reference", reference: content }, mediaType: void 0 }; return convertInlineDataToFilePartData(content); } async function convertToLanguageModelPrompt({ prompt, supportedUrls, download: download2 = createDefaultDownloadFunction(), provider }) { const downloadedAssets = await downloadAssets(prompt.messages, download2, supportedUrls); const approvalIdToToolCallId = /* @__PURE__ */ new Map(); for (const message of prompt.messages) if (message.role === "assistant" && Array.isArray(message.content)) { for (const part of message.content) if (part.type === "tool-approval-request" && "approvalId" in part && "toolCallId" in part) approvalIdToToolCallId.set(part.approvalId, part.toolCallId); } const approvedToolCallIds = /* @__PURE__ */ new Set(); for (const message of prompt.messages) if (message.role === "tool") { for (const part of message.content) if (part.type === "tool-approval-response") { const toolCallId = approvalIdToToolCallId.get(part.approvalId); if (toolCallId) approvedToolCallIds.add(toolCallId); } } const messages = [...prompt.instructions != null ? typeof prompt.instructions === "string" ? [{ role: "system", content: prompt.instructions }] : asArray(prompt.instructions).map((message) => ({ role: "system", content: message.content, providerOptions: message.providerOptions })) : [], ...prompt.messages.map((message) => convertToLanguageModelMessage({ message, downloadedAssets, provider }))]; const combinedMessages = []; for (const message of messages) { if (message.role !== "tool") { combinedMessages.push(message); continue; } const lastCombinedMessage = combinedMessages.at(-1); if ((lastCombinedMessage == null ? void 0 : lastCombinedMessage.role) === "tool") lastCombinedMessage.content.push(...message.content); else combinedMessages.push(message); } const toolCallIds = /* @__PURE__ */ new Set(); for (const message of combinedMessages) switch (message.role) { case "assistant": for (const content of message.content) if (content.type === "tool-call" && !content.providerExecuted) toolCallIds.add(content.toolCallId); break; case "tool": for (const content of message.content) if (content.type === "tool-result") toolCallIds.delete(content.toolCallId); break; case "user": case "system": for (const id of approvedToolCallIds) toolCallIds.delete(id); if (toolCallIds.size > 0) throw new MissingToolResultsError({ toolCallIds: Array.from(toolCallIds) }); break; } for (const id of approvedToolCallIds) toolCallIds.delete(id); if (toolCallIds.size > 0) throw new MissingToolResultsError({ toolCallIds: Array.from(toolCallIds) }); return combinedMessages.filter((message) => message.role !== "tool" || message.content.length > 0); } function convertToLanguageModelMessage({ message, downloadedAssets, provider }) { const warnings = []; const role = message.role; switch (role) { case "system": return { role: "system", content: message.content, providerOptions: message.providerOptions }; case "user": { if (typeof message.content === "string") return { role: "user", content: [{ type: "text", text: message.content }], providerOptions: message.providerOptions }; const converted = { role: "user", content: message.content.map((part) => { if (part.type === "image") warnings.push({ type: "deprecated", setting: "\"image\" content part", message: `The "image" content part type is deprecated. Use a "file" part with mediaType: 'image' (or a more specific image/* subtype) instead.` }); return convertImagePartToFilePart(part); }).map((part) => convertPartToLanguageModelPart(part, downloadedAssets)).filter((part) => part.type !== "text" || part.text !== ""), providerOptions: message.providerOptions }; if (warnings.length > 0) logWarnings({ warnings }); return converted; } case "assistant": { if (typeof message.content === "string") return { role: "assistant", content: [{ type: "text", text: message.content }], providerOptions: message.providerOptions }; const converted = { role: "assistant", content: message.content.filter((part) => part.type !== "text" || part.text !== "" || part.providerOptions != null).filter((part) => part.type !== "tool-approval-request").map((part) => { const providerOptions = part.providerOptions; switch (part.type) { case "custom": return { type: "custom", kind: part.kind, providerOptions }; case "file": { const { data, mediaType } = convertToLanguageModelV4FilePart(part.data); return { type: "file", data, filename: part.filename, mediaType: mediaType != null ? mediaType : part.mediaType, providerOptions }; } case "reasoning": return { type: "reasoning", text: part.text, providerOptions }; case "reasoning-file": { const { data, mediaType } = convertToLanguageModelV4FilePart(part.data); if (data.type !== "data" && data.type !== "url") throw new Error(`Unsupported reasoning-file data type: ${data.type}`); return { type: "reasoning-file", data, mediaType: mediaType != null ? mediaType : part.mediaType, providerOptions }; } case "text": return { type: "text", text: part.text, providerOptions }; case "tool-call": return { type: "tool-call", toolCallId: part.toolCallId, toolName: part.toolName, input: part.input, providerExecuted: part.providerExecuted, providerOptions }; case "tool-result": return { type: "tool-result", toolCallId: part.toolCallId, toolName: part.toolName, output: mapToolResultOutput({ output: part.output, provider, warnings, downloadedAssets }), providerOptions }; } }), providerOptions: message.providerOptions }; if (warnings.length > 0) logWarnings({ warnings }); return converted; } case "tool": { const converted = { role: "tool", content: message.content.filter((part) => part.type !== "tool-approval-response" || part.providerExecuted).map((part) => { switch (part.type) { case "tool-result": return { type: "tool-result", toolCallId: part.toolCallId, toolName: part.toolName, output: mapToolResultOutput({ output: part.output, provider, warnings, downloadedAssets }), providerOptions: part.providerOptions }; case "tool-approval-response": return { type: "tool-approval-response", approvalId: part.approvalId, approved: part.approved, reason: part.reason }; } }), providerOptions: message.providerOptions }; if (warnings.length > 0) logWarnings({ warnings }); return converted; } default: throw new InvalidMessageRoleError({ role }); } } function convertImagePartToFilePart(part) { var _a22; if (part.type !== "image") return part; return { type: "file", data: part.image, mediaType: (_a22 = part.mediaType) != null ? _a22 : "image", providerOptions: part.providerOptions }; } async function downloadAssets(messages, download2, supportedUrls) { const downloadableFiles = []; for (const message of messages) { if (message.role === "user" && Array.isArray(message.content)) for (const part of message.content) { const filePart = convertImagePartToFilePart(part); if (filePart.type === "file") downloadableFiles.push(filePart); } if (message.role === "tool") for (const part of message.content) { if (part.type !== "tool-result") continue; if (part.output.type !== "content") continue; for (const contentPart of part.output.value) if (contentPart.type === "file") downloadableFiles.push(contentPart); } if (message.role === "assistant" && Array.isArray(message.content)) for (const part of message.content) { if (part.type !== "tool-result") continue; if (part.output.type !== "content") continue; for (const contentPart of part.output.value) if (contentPart.type === "file") downloadableFiles.push(contentPart); } } const plannedDownloads = downloadableFiles.map((part) => { const mediaType = part.mediaType; const { data } = convertToLanguageModelV4FilePart(part.data); return { mediaType, data }; }).filter((part) => part.data.type === "url").map((part) => ({ url: part.data.url, isUrlSupportedByModel: part.mediaType != null && isUrlSupported({ url: part.data.url.toString(), mediaType: part.mediaType, supportedUrls }) })); const downloadedFiles = await download2(plannedDownloads); return Object.fromEntries(downloadedFiles.map((file, index) => file == null ? null : [plannedDownloads[index].url.toString(), { data: file.data, mediaType: file.mediaType }]).filter((file) => file != null)); } function convertPartToLanguageModelPart(part, downloadedAssets) { if (part.type === "text") return { type: "text", text: part.text, providerOptions: part.providerOptions }; const { data: normalizedData, mediaType: dataUrlMediaType } = convertToLanguageModelV4FilePart(part.data); let mediaType = dataUrlMediaType != null ? dataUrlMediaType : part.mediaType; let data = normalizedData; if (data.type === "url") { const downloadedFile = downloadedAssets[data.url.toString()]; if (downloadedFile) { data = { type: "data", data: downloadedFile.data }; if (downloadedFile.mediaType != null && (mediaType == null || !isFullMediaType(mediaType))) mediaType = downloadedFile.mediaType; } } if (data.type === "data" && (data.data instanceof Uint8Array || typeof data.data === "string")) { const imageMediaType = detectMediaType({ data: data.data, topLevelType: "image" }); if (imageMediaType != null) mediaType = imageMediaType; } if (mediaType == null) throw new Error(`Media type is missing for file part`); return { type: "file", mediaType, filename: part.filename, data, providerOptions: part.providerOptions }; } function mapToolResultOutput({ output, provider, warnings = [], downloadedAssets }) { if (output.type !== "content") return output; return { type: "content", value: output.value.map((item) => { var _a22; switch (item.type) { case "file": { const convertedPart = convertPartToLanguageModelPart(item, downloadedAssets); if (convertedPart.type !== "file") throw new Error("Expected tool result file content to convert to file."); return convertedPart; } case "file-data": warnings.push({ type: "deprecated", setting: "\"tool-result\" content of type \"file-data\"", message: `The "file-data" type for tool result content is deprecated. Use the "file" type with mediaType and { type: 'data', data } instead.` }); return { type: "file", data: { type: "data", data: item.data }, filename: item.filename, mediaType: item.mediaType, providerOptions: item.providerOptions }; case "file-url": { const mediaType = (_a22 = item.mediaType) != null ? _a22 : getMediaTypeFromUrl(item.url); let message = `The "file-url" type for tool result content is deprecated. Use the "file" type with mediaType and { type: 'url', url } instead.`; if (!item.mediaType) { const inferenceSuffix = mediaType === "application/octet-stream" ? `Unable to infer media type from URL. Defaulting to 'application/octet-stream'.` : `Inferred media type '${mediaType}' from URL.`; message = `The "file-url" tool result content part with URL "${item.url}" is missing a "mediaType". ${inferenceSuffix} ${message}`; } warnings.push({ type: "deprecated", setting: "\"tool-result\" content of type \"file-url\"", message }); return { type: "file", data: { type: "url", url: new URL(item.url) }, mediaType, providerOptions: item.providerOptions }; } case "file-id": warnings.push({ type: "deprecated", setting: "\"tool-result\" content of type \"file-id\"", message: `The "file-id" type for tool result content is deprecated. Use the "file" type with mediaType and { type: 'reference', reference } instead.` }); return { type: "file", data: { type: "reference", reference: convertFileIdToProviderReference({ fileId: item.fileId, provider }) }, mediaType: "application", providerOptions: item.providerOptions }; case "file-reference": warnings.push({ type: "deprecated", setting: "\"tool-result\" content of type \"file-reference\"", message: `The "file-reference" type for tool result content is deprecated. Use the "file" type with mediaType and { type: 'reference', reference } instead.` }); return { type: "file", data: { type: "reference", reference: item.providerReference }, mediaType: "application", providerOptions: item.providerOptions }; case "image-data": warnings.push({ type: "deprecated", setting: "\"tool-result\" content of type \"image-data\"", message: `The "image-data" type for tool result content is deprecated. Use the "file" type with mediaType and { type: 'data', data } instead.` }); return { type: "file", data: { type: "data", data: item.data }, mediaType: item.mediaType, providerOptions: item.providerOptions }; case "image-url": warnings.push({ type: "deprecated", setting: "\"tool-result\" content of type \"image-url\"", message: `The "image-url" type for tool result content is deprecated. Use the "file" type with mediaType 'image' (or a specific image/* subtype) and { type: 'url', url } instead.` }); return { type: "file", data: { type: "url", url: new URL(item.url) }, mediaType: "image", providerOptions: item.providerOptions }; case "image-file-id": warnings.push({ type: "deprecated", setting: "\"tool-result\" content of type \"image-file-id\"", message: `The "image-file-id" type for tool result content is deprecated. Use the "file" type with mediaType and { type: 'reference', reference } instead.` }); return { type: "file", data: { type: "reference", reference: convertFileIdToProviderReference({ fileId: item.fileId, provider }) }, mediaType: "image", providerOptions: item.providerOptions }; case "image-file-reference": warnings.push({ type: "deprecated", setting: "\"tool-result\" content of type \"image-file-reference\"", message: `The "image-file-reference" type for tool result content is deprecated. Use the "file" type with mediaType and { type: 'reference', reference } instead.` }); return { type: "file", data: { type: "reference", reference: item.providerReference }, mediaType: "image", providerOptions: item.providerOptions }; default: return item; } }) }; } function convertFileIdToProviderReference({ fileId, provider }) { if (typeof fileId === "object") return fileId; if (provider == null) throw new Error("Cannot convert string fileId to provider reference without a provider ID. Use a Record fileId or switch to the file-reference type."); return { [provider]: fileId }; } var URL_EXTENSION_TO_MEDIA_TYPE = { jpg: "image/jpeg", jpeg: "image/jpeg", png: "image/png", gif: "image/gif", webp: "image/webp", svg: "image/svg+xml", avif: "image/avif", heic: "image/heic", bmp: "image/bmp", tiff: "image/tiff", tif: "image/tiff", pdf: "application/pdf", mp4: "video/mp4", webm: "video/webm", mp3: "audio/mpeg", wav: "audio/wav", ogg: "audio/ogg" }; function getMediaTypeFromUrl(url, fallbackMediaType = "application/octet-stream") { var _a22; try { const fileExtension = (_a22 = new URL(url).pathname.split(".").pop()) == null ? void 0 : _a22.toLowerCase(); if (fileExtension && Object.hasOwn(URL_EXTENSION_TO_MEDIA_TYPE, fileExtension)) return URL_EXTENSION_TO_MEDIA_TYPE[fileExtension]; } catch (e) {} return fallbackMediaType; } async function createToolModelOutput({ toolCallId, input, output, tool: tool2, errorMode }) { if (errorMode === "text") return { type: "error-text", value: getErrorMessage(output) }; else if (errorMode === "json") return { type: "error-json", value: toJSONValue(output) }; if (tool2 == null ? void 0 : tool2.toModelOutput) return await tool2.toModelOutput({ toolCallId, input, output }); return typeof output === "string" ? { type: "text", value: output } : { type: "json", value: toJSONValue(output) }; } function toJSONValue(value) { return value === void 0 ? null : value; } function prepareLanguageModelCallOptions({ maxOutputTokens, temperature, topP, topK, presencePenalty, frequencyPenalty, seed, stopSequences, reasoning }) { if (maxOutputTokens != null) { if (!Number.isInteger(maxOutputTokens)) throw new InvalidArgumentError({ parameter: "maxOutputTokens", value: maxOutputTokens, message: "maxOutputTokens must be an integer" }); if (maxOutputTokens < 1) throw new InvalidArgumentError({ parameter: "maxOutputTokens", value: maxOutputTokens, message: "maxOutputTokens 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 { maxOutputTokens, temperature, topP, topK, presencePenalty, frequencyPenalty, stopSequences, seed, reasoning }; } function prepareToolChoice({ toolChoice }) { return toolChoice == null ? { type: "auto" } : typeof toolChoice === "string" ? { type: toolChoice } : { type: "tool", toolName: toolChoice.toolName }; } function isNonEmptyObject(object2) { return object2 != null && Object.keys(object2).length > 0; } async function prepareTools({ tools, toolOrder, toolsContext = {}, experimental_sandbox: sandbox }) { if (!isNonEmptyObject(tools)) return; const languageModelTools = []; for (const [name22, tool2] of orderToolEntries({ tools, toolOrder })) { const toolType = tool2.type; switch (toolType) { case void 0: case "dynamic": case "function": { const description = resolveToolDescription({ tool: tool2, toolName: name22, toolsContext, experimental_sandbox: sandbox }); const providerOptions = tool2.providerOptions; const inputExamples = tool2.inputExamples; const strict = tool2.strict; languageModelTools.push({ type: "function", name: name22, inputSchema: await asSchema(tool2.inputSchema).jsonSchema, ...description != null ? { description } : {}, ...inputExamples != null ? { inputExamples } : {}, ...providerOptions != null ? { providerOptions } : {}, ...strict != null ? { strict } : {} }); break; } case "provider": languageModelTools.push({ type: "provider", name: name22, id: tool2.id, args: tool2.args }); break; default: throw new Error(`Unsupported tool type: ${toolType}`); } } return languageModelTools; } function orderToolEntries({ tools, toolOrder }) { if (toolOrder == null) return Object.entries(tools); const toolEntries = Object.entries(tools); const orderedTools = toolEntries.filter(([name22]) => toolOrder.includes(name22)).sort(([nameA], [nameB]) => toolOrder.indexOf(nameA) - toolOrder.indexOf(nameB)); const unorderedTools = toolEntries.filter(([name22]) => !toolOrder.includes(name22)).sort(([nameA], [nameB]) => nameA < nameB ? -1 : nameA > nameB ? 1 : 0); return [...orderedTools, ...unorderedTools]; } function resolveToolDescription({ tool: tool2, toolName, toolsContext, experimental_sandbox: sandbox }) { return tool2.description === void 0 ? void 0 : typeof tool2.description === "string" ? tool2.description : tool2.description({ context: toolsContext[toolName], experimental_sandbox: sandbox }); } function getTotalTimeoutMs(timeout) { if (timeout == null) return; if (typeof timeout === "number") return timeout; return timeout.totalMs; } function getStepTimeoutMs(timeout) { if (timeout == null || typeof timeout === "number") return; return timeout.stepMs; } function getChunkTimeoutMs(timeout) { if (timeout == null || typeof timeout === "number") return; return timeout.chunkMs; } function getToolTimeoutMs(timeout, toolName) { var _a22, _b; if (timeout == null || typeof timeout === "number") return; return (_b = (_a22 = timeout.tools) == null ? void 0 : _a22[`${toolName}Ms`]) != null ? _b : timeout.toolMs; } var jsonValueSchema = lazy(() => union([ _null(), string(), number(), boolean(), record(string(), jsonValueSchema.optional()), array$1(jsonValueSchema) ])); var providerMetadataSchema = record(string(), record(string(), jsonValueSchema.optional())); var fileInlineDataSchema = union([ string(), _instanceof(Uint8Array), _instanceof(ArrayBuffer), custom(isBuffer, { message: "Must be a Buffer" }) ]); var providerReferenceSchema = record(string(), string()); var textPartSchema = object$1({ type: literal("text"), text: string(), providerOptions: providerMetadataSchema.optional() }); var imagePartSchema = object$1({ type: literal("image"), image: union([ fileInlineDataSchema, _instanceof(URL), providerReferenceSchema ]), mediaType: string().optional(), providerOptions: providerMetadataSchema.optional() }); var taggedFileDataSchema = discriminatedUnion("type", [ object$1({ type: literal("data"), data: fileInlineDataSchema }), object$1({ type: literal("url"), url: _instanceof(URL) }), object$1({ type: literal("reference"), reference: providerReferenceSchema }), object$1({ type: literal("text"), text: string() }) ]); var taggedReasoningFileDataSchema = discriminatedUnion("type", [object$1({ type: literal("data"), data: fileInlineDataSchema }), object$1({ type: literal("url"), url: _instanceof(URL) })]); var filePartSchema = object$1({ type: literal("file"), data: union([ taggedFileDataSchema, fileInlineDataSchema, _instanceof(URL), providerReferenceSchema ]), filename: string().optional(), mediaType: string(), providerOptions: providerMetadataSchema.optional() }); var reasoningPartSchema = object$1({ type: literal("reasoning"), text: string(), providerOptions: providerMetadataSchema.optional() }); var customPartSchema = object$1({ type: literal("custom"), kind: string().transform((value) => value), providerOptions: providerMetadataSchema.optional() }); var reasoningFilePartSchema = object$1({ type: literal("reasoning-file"), data: union([ taggedReasoningFileDataSchema, fileInlineDataSchema, _instanceof(URL) ]), mediaType: string(), providerOptions: providerMetadataSchema.optional() }); var toolCallPartSchema = object$1({ type: literal("tool-call"), toolCallId: string(), toolName: string(), input: unknown(), providerOptions: providerMetadataSchema.optional(), providerExecuted: boolean().optional() }); var outputSchema = discriminatedUnion("type", [ object$1({ type: literal("text"), value: string(), providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("json"), value: jsonValueSchema, providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("execution-denied"), reason: string().optional(), providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("error-text"), value: string(), providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("error-json"), value: jsonValueSchema, providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("content"), value: array$1(union([ object$1({ type: literal("text"), text: string(), providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("file"), data: taggedFileDataSchema, mediaType: string(), filename: string().optional(), providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("file-data"), data: string(), mediaType: string(), filename: string().optional(), providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("file-url"), url: string(), mediaType: string().optional(), providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("file-id"), fileId: union([string(), record(string(), string())]), providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("file-reference"), providerReference: record(string(), string()), providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("image-data"), data: string(), mediaType: string(), providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("image-url"), url: string(), providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("image-file-id"), fileId: union([string(), record(string(), string())]), providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("image-file-reference"), providerReference: record(string(), string()), providerOptions: providerMetadataSchema.optional() }), object$1({ type: literal("custom"), providerOptions: providerMetadataSchema.optional() }) ])) }) ]); var toolResultPartSchema = object$1({ type: literal("tool-result"), toolCallId: string(), toolName: string(), output: outputSchema, providerOptions: providerMetadataSchema.optional() }); var toolApprovalRequestSchema = object$1({ type: literal("tool-approval-request"), approvalId: string(), toolCallId: string() }); var toolApprovalResponseSchema = object$1({ type: literal("tool-approval-response"), approvalId: string(), approved: boolean(), reason: string().optional() }); var systemModelMessageSchema = object$1({ role: literal("system"), content: string(), providerOptions: providerMetadataSchema.optional() }); var userModelMessageSchema = object$1({ role: literal("user"), content: union([string(), array$1(union([ textPartSchema, imagePartSchema, filePartSchema ]))]), providerOptions: providerMetadataSchema.optional() }); var assistantModelMessageSchema = object$1({ role: literal("assistant"), content: union([string(), array$1(union([ textPartSchema, customPartSchema, filePartSchema, reasoningPartSchema, reasoningFilePartSchema, toolCallPartSchema, toolResultPartSchema, toolApprovalRequestSchema ]))]), providerOptions: providerMetadataSchema.optional() }); var toolModelMessageSchema = object$1({ role: literal("tool"), content: array$1(union([toolResultPartSchema, toolApprovalResponseSchema])), providerOptions: providerMetadataSchema.optional() }); var modelMessageSchema = union([ systemModelMessageSchema, userModelMessageSchema, assistantModelMessageSchema, toolModelMessageSchema ]); async function standardizePrompt({ allowSystemInMessages = false, system, instructions = system, prompt, messages }) { if (prompt == null && messages == null) throw new InvalidPromptError({ prompt, message: "prompt or messages must be defined" }); if (prompt != null && messages != null) throw new InvalidPromptError({ prompt, message: "prompt and messages cannot be defined at the same time" }); if (typeof instructions !== "string" && !asArray(instructions).every((message) => message.role === "system")) throw new InvalidPromptError({ prompt, message: "instructions must be a string, SystemModelMessage, or array of SystemModelMessage" }); if (prompt != null && typeof prompt === "string") messages = [{ role: "user", content: prompt }]; else if (prompt != null && Array.isArray(prompt)) messages = prompt; else if (messages == null) throw new InvalidPromptError({ prompt, message: "prompt or messages must be defined" }); if (messages.length === 0) throw new InvalidPromptError({ prompt, message: "messages must not be empty" }); if (!allowSystemInMessages && messages.some((message) => message.role === "system")) throw new InvalidPromptError({ prompt, message: "System messages are not allowed in the prompt or messages fields. Use the instructions option instead." }); const validationResult = await safeValidateTypes({ value: messages, schema: array$1(modelMessageSchema) }); if (!validationResult.success) throw new InvalidPromptError({ prompt, message: "The messages do not match the ModelMessage[] schema.", cause: validationResult.error }); return { messages, instructions }; } function wrapGatewayError(error) { if (!GatewayAuthenticationError.isInstance(error)) return error; const isProductionEnv = (process == null ? void 0 : process.env.NODE_ENV) === "production"; const moreInfoURL = "https://ai-sdk.dev/unauthenticated-ai-gateway"; if (isProductionEnv) return new AISDKError({ name: "GatewayError", message: `Unauthenticated. Configure AI_GATEWAY_API_KEY or use a provider module. Learn more: ${moreInfoURL}` }); return Object.assign(/* @__PURE__ */ new Error(`\x1B[1m\x1B[31mUnauthenticated request to AI Gateway.\x1B[0m To authenticate, set the \x1B[33mAI_GATEWAY_API_KEY\x1B[0m environment variable with your API key. Alternatively, you can use a provider module instead of the AI Gateway. Learn more: \x1B[34m${moreInfoURL}\x1B[0m `), { name: "GatewayAuthenticationError" }); } function asLanguageModelUsage(usage) { return { inputTokens: usage.inputTokens.total, inputTokenDetails: { noCacheTokens: usage.inputTokens.noCache, cacheReadTokens: usage.inputTokens.cacheRead, cacheWriteTokens: usage.inputTokens.cacheWrite }, outputTokens: usage.outputTokens.total, outputTokenDetails: { textTokens: usage.outputTokens.text, reasoningTokens: usage.outputTokens.reasoning }, totalTokens: addTokenCounts(usage.inputTokens.total, usage.outputTokens.total), raw: usage.raw }; } function createNullLanguageModelUsage() { return { inputTokens: void 0, inputTokenDetails: { noCacheTokens: void 0, cacheReadTokens: void 0, cacheWriteTokens: void 0 }, outputTokens: void 0, outputTokenDetails: { textTokens: void 0, reasoningTokens: void 0 }, totalTokens: void 0, raw: void 0 }; } function addLanguageModelUsage(usage1, usage2) { var _a22, _b, _c, _d, _e, _f, _g, _h, _i, _j; return { inputTokens: addTokenCounts(usage1.inputTokens, usage2.inputTokens), inputTokenDetails: { noCacheTokens: addTokenCounts((_a22 = usage1.inputTokenDetails) == null ? void 0 : _a22.noCacheTokens, (_b = usage2.inputTokenDetails) == null ? void 0 : _b.noCacheTokens), cacheReadTokens: addTokenCounts((_c = usage1.inputTokenDetails) == null ? void 0 : _c.cacheReadTokens, (_d = usage2.inputTokenDetails) == null ? void 0 : _d.cacheReadTokens), cacheWriteTokens: addTokenCounts((_e = usage1.inputTokenDetails) == null ? void 0 : _e.cacheWriteTokens, (_f = usage2.inputTokenDetails) == null ? void 0 : _f.cacheWriteTokens) }, outputTokens: addTokenCounts(usage1.outputTokens, usage2.outputTokens), outputTokenDetails: { textTokens: addTokenCounts((_g = usage1.outputTokenDetails) == null ? void 0 : _g.textTokens, (_h = usage2.outputTokenDetails) == null ? void 0 : _h.textTokens), reasoningTokens: addTokenCounts((_i = usage1.outputTokenDetails) == null ? void 0 : _i.reasoningTokens, (_j = usage2.outputTokenDetails) == null ? void 0 : _j.reasoningTokens) }, totalTokens: addTokenCounts(usage1.totalTokens, usage2.totalTokens) }; } function addTokenCounts(tokenCount1, tokenCount2) { return tokenCount1 == null && tokenCount2 == null ? void 0 : (tokenCount1 != null ? tokenCount1 : 0) + (tokenCount2 != null ? tokenCount2 : 0); } function getOwn(obj, key) { return obj != null && Object.hasOwn(obj, key) ? obj[key] : void 0; } function mergeAbortSignals(...signals) { const validSignals = filterNullable(...signals).map((signal) => signal instanceof AbortSignal ? signal : AbortSignal.timeout(signal)); return validSignals.length === 0 ? void 0 : validSignals.length === 1 ? validSignals[0] : AbortSignal.any(validSignals); } function mergeObjects(base, overrides) { if (base === void 0 && overrides === void 0) return; if (base === void 0) return overrides; if (overrides === void 0) return base; const result = { ...base }; for (const key in overrides) { if (key === "__proto__" || key === "constructor" || key === "prototype") continue; if (Object.prototype.hasOwnProperty.call(overrides, key)) { const overridesValue = overrides[key]; if (overridesValue === void 0) continue; const baseValue = key in base ? base[key] : void 0; const isSourceObject = overridesValue !== null && typeof overridesValue === "object" && !Array.isArray(overridesValue) && !(overridesValue instanceof Date) && !(overridesValue instanceof RegExp); const isTargetObject = baseValue !== null && baseValue !== void 0 && typeof baseValue === "object" && !Array.isArray(baseValue) && !(baseValue instanceof Date) && !(baseValue instanceof RegExp); if (isSourceObject && isTargetObject) result[key] = mergeObjects(baseValue, overridesValue); else result[key] = overridesValue; } } return result; } function now() { var _a22, _b; return (_b = (_a22 = globalThis == null ? void 0 : globalThis.performance) == null ? void 0 : _a22.now()) != null ? _b : Date.now(); } async function notify(options) { await Promise.all(asArray(options.callbacks).map(async (callback) => { try { await (callback == null ? void 0 : callback(options.event)); } catch (e) {} })); } function getRetryDelayInMs({ error, exponentialBackoffDelay }) { const headers = APICallError.isInstance(error) ? error.responseHeaders : APICallError.isInstance(error.cause) ? error.cause.responseHeaders : void 0; if (!headers) return exponentialBackoffDelay; let ms; const retryAfterMs = headers["retry-after-ms"]; if (retryAfterMs) { const timeoutMs = parseFloat(retryAfterMs); if (!Number.isNaN(timeoutMs)) ms = timeoutMs; } const retryAfter = headers["retry-after"]; if (retryAfter && ms === void 0) { const timeoutSeconds = parseFloat(retryAfter); if (!Number.isNaN(timeoutSeconds)) ms = timeoutSeconds * 1e3; else ms = Date.parse(retryAfter) - Date.now(); } if (ms != null && !Number.isNaN(ms) && 0 <= ms && (ms < 60 * 1e3 || ms < exponentialBackoffDelay)) return ms; return exponentialBackoffDelay; } var retryWithExponentialBackoffRespectingRetryHeaders = ({ maxRetries = 2, initialDelayInMs = 2e3, backoffFactor = 2, abortSignal } = {}) => retryWithExponentialBackoff({ maxRetries, initialDelayInMs, backoffFactor, abortSignal, shouldRetry: (error) => error instanceof Error && (APICallError.isInstance(error) && error.isRetryable === true || GatewayError.isInstance(error) && error.isRetryable === true), getDelayInMs: ({ error, exponentialBackoffDelay }) => getRetryDelayInMs({ error, exponentialBackoffDelay }), createRetryError: ({ message, reason, errors }) => new RetryError({ message, reason, errors }) }); function prepareRetries({ maxRetries, abortSignal }) { 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: retryWithExponentialBackoffRespectingRetryHeaders({ maxRetries: maxRetriesResult, abortSignal }) }; } function setAbortTimeout({ abortController, label, timeoutMs }) { if (abortController == null || timeoutMs == null) return; return setTimeout(() => abortController.abort(new DOMException(`${label} timeout of ${timeoutMs}ms exceeded`, "TimeoutError")), timeoutMs); } function calculateTokensPerSecond({ tokens, durationMs }) { const tokenRate = 1e3 * (tokens != null ? tokens : 0) / (durationMs != null ? durationMs : 0); return Number.isFinite(tokenRate) ? tokenRate : 0; } function collectToolApprovals({ messages }) { const lastMessage = messages.at(-1); if ((lastMessage == null ? void 0 : lastMessage.role) != "tool") return { approvedToolApprovals: [], deniedToolApprovals: [] }; const toolCallsByToolCallId = /* @__PURE__ */ Object.create(null); for (const message of messages) if (message.role === "assistant" && typeof message.content !== "string") { const content = message.content; for (const part of content) if (part.type === "tool-call") toolCallsByToolCallId[part.toolCallId] = part; } const toolApprovalRequestsByApprovalId = /* @__PURE__ */ Object.create(null); for (const message of messages) if (message.role === "assistant" && typeof message.content !== "string") { const content = message.content; for (const part of content) if (part.type === "tool-approval-request") toolApprovalRequestsByApprovalId[part.approvalId] = part; } const toolResults = /* @__PURE__ */ Object.create(null); for (const part of lastMessage.content) if (part.type === "tool-result") toolResults[part.toolCallId] = part; const approvedToolApprovals = []; const deniedToolApprovals = []; const approvalResponses = lastMessage.content.filter((part) => part.type === "tool-approval-response"); for (const approvalResponse of approvalResponses) { const approvalRequest = toolApprovalRequestsByApprovalId[approvalResponse.approvalId]; if (approvalRequest == null) throw new InvalidToolApprovalError({ approvalId: approvalResponse.approvalId }); if (toolResults[approvalRequest.toolCallId] != null) continue; const toolCall = toolCallsByToolCallId[approvalRequest.toolCallId]; if (toolCall == null) throw new ToolCallNotFoundForApprovalError({ toolCallId: approvalRequest.toolCallId, approvalId: approvalRequest.approvalId }); const approval = { approvalRequest, approvalResponse, toolCall }; if (approvalResponse.approved) approvedToolApprovals.push(approval); else deniedToolApprovals.push(approval); } return { approvedToolApprovals, deniedToolApprovals }; } async function validateToolContext({ toolName, context, contextSchema }) { if (contextSchema == null) return context; return await validateTypes({ value: context, schema: contextSchema, context: { field: "tool context", entityName: toolName } }); } async function executeToolCall({ toolCall, tools, toolsContext, callId, messages, abortSignal, timeout, experimental_sandbox: sandbox, onPreliminaryToolResult, onToolExecutionStart, onToolExecutionEnd, executeToolInTelemetryContext = async ({ execute }) => await execute(), runInTracingChannelSpan = async ({ execute }) => await execute() }) { const { toolName, toolCallId, input } = toolCall; const tool2 = getOwn(tools, toolName); if (!isExecutableTool(tool2)) return; const context = await validateToolContext({ toolName, context: getOwn(toolsContext, toolName), contextSchema: tool2.contextSchema }); const toolExecutionContext = { toolCall, messages, toolContext: context }; const baseCallbackEvent = { callId, ...toolExecutionContext }; return await runInTracingChannelSpan({ type: "executeTool", event: baseCallbackEvent, execute: async () => { let output; await notify({ event: baseCallbackEvent, callbacks: onToolExecutionStart }); const toolAbortSignal = mergeAbortSignals(abortSignal, getToolTimeoutMs(timeout, toolName)); let toolExecutionMs = 0; try { await executeToolInTelemetryContext({ callId, toolCallId, ...toolExecutionContext, execute: async () => { const startTime = now(); try { const stream = executeTool({ tool: tool2, input, options: { toolCallId, messages, abortSignal: toolAbortSignal, context, experimental_sandbox: sandbox } }); for await (const part of stream) if (part.type === "preliminary") onPreliminaryToolResult?.({ ...toolCall, type: "tool-result", output: part.output, preliminary: true }); else output = part.output; } finally { toolExecutionMs = now() - startTime; } } }); } catch (error) { const toolError = { type: "tool-error", toolCallId, toolName, input, error, dynamic: tool2.type === "dynamic", ...toolCall.providerMetadata != null ? { providerMetadata: toolCall.providerMetadata } : {}, ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {} }; await notify({ event: { ...baseCallbackEvent, toolOutput: toolError, toolExecutionMs }, callbacks: onToolExecutionEnd }); return { output: toolError, toolExecutionMs }; } const toolResult = { type: "tool-result", toolCallId, toolName, input, output, dynamic: tool2.type === "dynamic", ...toolCall.providerMetadata != null ? { providerMetadata: toolCall.providerMetadata } : {}, ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {} }; await notify({ event: { ...baseCallbackEvent, toolOutput: toolResult, toolExecutionMs }, callbacks: onToolExecutionEnd }); return { output: toolResult, toolExecutionMs }; } }); } function filterActiveTools({ tools, activeTools }) { if (tools == null || activeTools == null) return tools; return Object.fromEntries(Object.entries(tools).filter(([name22]) => activeTools.includes(name22))); } var DefaultGeneratedFile = class { constructor({ data, mediaType }) { const isUint8Array = data instanceof Uint8Array; this.base64Data = isUint8Array ? void 0 : data; this.uint8ArrayData = isUint8Array ? data : void 0; this.mediaType = mediaType; } get base64() { if (this.base64Data == null) this.base64Data = convertUint8ArrayToBase64(this.uint8ArrayData); return this.base64Data; } get uint8Array() { if (this.uint8ArrayData == null) this.uint8ArrayData = convertBase64ToUint8Array(this.base64Data); return this.uint8ArrayData; } }; var DefaultGeneratedFileWithType = class extends DefaultGeneratedFile { constructor(options) { super(options); this.type = "file"; } }; var output_exports = {}; __export(output_exports, { array: () => array, choice: () => choice, json: () => json, object: () => object, text: () => text }); function fixJson(input) { const stack = ["ROOT"]; let lastValidIndex = -1; let literalStart = null; let unicodeEscapeDigits = 0; function isHexDigit(char) { return char >= "0" && char <= "9" || char >= "A" && char <= "F" || char >= "a" && char <= "f"; } function processValueStart(char, i, swapState) { switch (char) { case "\"": lastValidIndex = i; stack.pop(); stack.push(swapState); stack.push("INSIDE_STRING"); break; case "f": case "t": case "n": lastValidIndex = i; literalStart = i; stack.pop(); stack.push(swapState); stack.push("INSIDE_LITERAL"); break; case "-": stack.pop(); stack.push(swapState); stack.push("INSIDE_NUMBER"); break; case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": lastValidIndex = i; stack.pop(); stack.push(swapState); stack.push("INSIDE_NUMBER"); break; case "{": lastValidIndex = i; stack.pop(); stack.push(swapState); stack.push("INSIDE_OBJECT_START"); break; case "[": lastValidIndex = i; stack.pop(); stack.push(swapState); stack.push("INSIDE_ARRAY_START"); break; } } function processAfterObjectValue(char, i) { switch (char) { case ",": stack.pop(); stack.push("INSIDE_OBJECT_AFTER_COMMA"); break; case "}": lastValidIndex = i; stack.pop(); break; } } function processAfterArrayValue(char, i) { switch (char) { case ",": stack.pop(); stack.push("INSIDE_ARRAY_AFTER_COMMA"); break; case "]": lastValidIndex = i; stack.pop(); break; } } for (let i = 0; i < input.length; i++) { const char = input[i]; switch (stack[stack.length - 1]) { case "ROOT": processValueStart(char, i, "FINISH"); break; case "INSIDE_OBJECT_START": switch (char) { case "\"": stack.pop(); stack.push("INSIDE_OBJECT_KEY"); break; case "}": lastValidIndex = i; stack.pop(); break; } break; case "INSIDE_OBJECT_AFTER_COMMA": switch (char) { case "\"": stack.pop(); stack.push("INSIDE_OBJECT_KEY"); break; } break; case "INSIDE_OBJECT_KEY": switch (char) { case "\"": stack.pop(); stack.push("INSIDE_OBJECT_AFTER_KEY"); break; } break; case "INSIDE_OBJECT_AFTER_KEY": switch (char) { case ":": stack.pop(); stack.push("INSIDE_OBJECT_BEFORE_VALUE"); break; } break; case "INSIDE_OBJECT_BEFORE_VALUE": processValueStart(char, i, "INSIDE_OBJECT_AFTER_VALUE"); break; case "INSIDE_OBJECT_AFTER_VALUE": processAfterObjectValue(char, i); break; case "INSIDE_STRING": switch (char) { case "\"": stack.pop(); lastValidIndex = i; break; case "\\": stack.push("INSIDE_STRING_ESCAPE"); break; default: lastValidIndex = i; } break; case "INSIDE_ARRAY_START": switch (char) { case "]": lastValidIndex = i; stack.pop(); break; default: lastValidIndex = i; processValueStart(char, i, "INSIDE_ARRAY_AFTER_VALUE"); break; } break; case "INSIDE_ARRAY_AFTER_VALUE": switch (char) { case ",": stack.pop(); stack.push("INSIDE_ARRAY_AFTER_COMMA"); break; case "]": lastValidIndex = i; stack.pop(); break; default: lastValidIndex = i; break; } break; case "INSIDE_ARRAY_AFTER_COMMA": processValueStart(char, i, "INSIDE_ARRAY_AFTER_VALUE"); break; case "INSIDE_STRING_ESCAPE": stack.pop(); if (char === "u") { unicodeEscapeDigits = 0; stack.push("INSIDE_STRING_UNICODE_ESCAPE"); } else lastValidIndex = i; break; case "INSIDE_STRING_UNICODE_ESCAPE": if (isHexDigit(char)) { unicodeEscapeDigits++; if (unicodeEscapeDigits === 4) { stack.pop(); lastValidIndex = i; } } break; case "INSIDE_NUMBER": switch (char) { case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": lastValidIndex = i; break; case "e": case "E": case "-": case ".": break; case ",": stack.pop(); if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") processAfterArrayValue(char, i); if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") processAfterObjectValue(char, i); break; case "}": stack.pop(); if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") processAfterObjectValue(char, i); break; case "]": stack.pop(); if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") processAfterArrayValue(char, i); break; default: stack.pop(); break; } break; case "INSIDE_LITERAL": { const partialLiteral = input.substring(literalStart, i + 1); if (!"false".startsWith(partialLiteral) && !"true".startsWith(partialLiteral) && !"null".startsWith(partialLiteral)) { stack.pop(); if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") processAfterObjectValue(char, i); else if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") processAfterArrayValue(char, i); } else lastValidIndex = i; break; } } } let result = input.slice(0, lastValidIndex + 1); for (let i = stack.length - 1; i >= 0; i--) switch (stack[i]) { case "INSIDE_STRING": result += "\""; break; case "INSIDE_OBJECT_KEY": case "INSIDE_OBJECT_AFTER_KEY": case "INSIDE_OBJECT_AFTER_COMMA": case "INSIDE_OBJECT_START": case "INSIDE_OBJECT_BEFORE_VALUE": case "INSIDE_OBJECT_AFTER_VALUE": result += "}"; break; case "INSIDE_ARRAY_START": case "INSIDE_ARRAY_AFTER_COMMA": case "INSIDE_ARRAY_AFTER_VALUE": result += "]"; break; case "INSIDE_LITERAL": { const partialLiteral = input.substring(literalStart, input.length); if ("true".startsWith(partialLiteral)) result += "true".slice(partialLiteral.length); else if ("false".startsWith(partialLiteral)) result += "false".slice(partialLiteral.length); else if ("null".startsWith(partialLiteral)) result += "null".slice(partialLiteral.length); } } return result; } async function parsePartialJson(jsonText) { if (jsonText === void 0) return { value: void 0, state: "undefined-input" }; let result = await safeParseJSON({ text: jsonText }); if (result.success) return { value: result.value, state: "successful-parse" }; result = await safeParseJSON({ text: fixJson(jsonText) }); if (result.success) return { value: result.value, state: "repaired-parse" }; return { value: void 0, state: "failed-parse" }; } var text = () => ({ name: "text", responseFormat: Promise.resolve({ type: "text" }), async parseCompleteOutput({ text: text2 }) { return text2; }, async parsePartialOutput({ text: text2 }) { return { partial: text2 }; }, createElementStreamTransform() {} }); var object = ({ schema: inputSchema, name: name22, description }) => { const schema = asSchema(inputSchema); return { name: "object", responseFormat: resolve(schema.jsonSchema).then((jsonSchema2) => ({ type: "json", schema: jsonSchema2, ...name22 != null && { name: name22 }, ...description != null && { description } })), async parseCompleteOutput({ text: text2 }, context) { const parseResult = await 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, finishReason: context.finishReason }); const validationResult = await 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, finishReason: context.finishReason }); return validationResult.value; }, async parsePartialOutput({ text: text2 }) { const result = await parsePartialJson(text2); switch (result.state) { case "failed-parse": case "undefined-input": return; case "repaired-parse": case "successful-parse": return { partial: result.value }; } }, createElementStreamTransform() {} }; }; var array = ({ element: inputElementSchema, name: name22, description }) => { const elementSchema = asSchema(inputElementSchema); return { name: "array", responseFormat: resolve(elementSchema.jsonSchema).then((jsonSchema2) => { const { $schema: _$schema, ...itemSchema } = jsonSchema2; return { type: "json", schema: { $schema: "http://json-schema.org/draft-07/schema#", type: "object", properties: { elements: { type: "array", items: itemSchema } }, required: ["elements"], additionalProperties: false }, ...name22 != null && { name: name22 }, ...description != null && { description } }; }), async parseCompleteOutput({ text: text2 }, context) { const parseResult = await 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, finishReason: context.finishReason }); const outerValue = parseResult.value; if (outerValue == null || typeof outerValue !== "object" || !("elements" in outerValue) || !Array.isArray(outerValue.elements)) throw new NoObjectGeneratedError({ message: "No object generated: response did not match schema.", cause: new TypeValidationError({ value: outerValue, cause: "response must be an object with an elements array" }), text: text2, response: context.response, usage: context.usage, finishReason: context.finishReason }); const validatedElements = []; for (const element of outerValue.elements) { const validationResult = await safeValidateTypes({ value: element, schema: elementSchema }); 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, finishReason: context.finishReason }); validatedElements.push(validationResult.value); } return validatedElements; }, async parsePartialOutput({ text: text2 }) { const result = await parsePartialJson(text2); switch (result.state) { case "failed-parse": case "undefined-input": return; case "repaired-parse": case "successful-parse": { const outerValue = result.value; if (outerValue == null || typeof outerValue !== "object" || !("elements" in outerValue) || !Array.isArray(outerValue.elements)) return; const rawElements = result.state === "repaired-parse" && outerValue.elements.length > 0 ? outerValue.elements.slice(0, -1) : outerValue.elements; const parsedElements = []; for (const rawElement of rawElements) { const validationResult = await safeValidateTypes({ value: rawElement, schema: elementSchema }); if (validationResult.success) parsedElements.push(validationResult.value); } return { partial: parsedElements }; } } }, createElementStreamTransform() { let publishedElements = 0; return new TransformStream({ transform({ partialOutput }, controller) { if (partialOutput != null) for (; publishedElements < partialOutput.length; publishedElements++) controller.enqueue(partialOutput[publishedElements]); } }); } }; }; var choice = ({ options: choiceOptions, name: name22, description }) => { return { name: "choice", responseFormat: Promise.resolve({ type: "json", schema: { $schema: "http://json-schema.org/draft-07/schema#", type: "object", properties: { result: { type: "string", enum: choiceOptions } }, required: ["result"], additionalProperties: false }, ...name22 != null && { name: name22 }, ...description != null && { description } }), async parseCompleteOutput({ text: text2 }, context) { const parseResult = await 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, finishReason: context.finishReason }); const outerValue = parseResult.value; if (outerValue == null || typeof outerValue !== "object" || !("result" in outerValue) || typeof outerValue.result !== "string" || !choiceOptions.includes(outerValue.result)) throw new NoObjectGeneratedError({ message: "No object generated: response did not match schema.", cause: new TypeValidationError({ value: outerValue, cause: "response must be an object that contains a choice value." }), text: text2, response: context.response, usage: context.usage, finishReason: context.finishReason }); return outerValue.result; }, async parsePartialOutput({ text: text2 }) { const result = await parsePartialJson(text2); switch (result.state) { case "failed-parse": case "undefined-input": return; case "repaired-parse": case "successful-parse": { const outerValue = result.value; if (outerValue == null || typeof outerValue !== "object" || !("result" in outerValue) || typeof outerValue.result !== "string") return; const potentialMatches = choiceOptions.filter((choiceOption) => choiceOption.startsWith(outerValue.result)); if (result.state === "successful-parse") return potentialMatches.includes(outerValue.result) ? { partial: outerValue.result } : void 0; else return potentialMatches.length === 1 ? { partial: potentialMatches[0] } : void 0; } } }, createElementStreamTransform() {} }; }; var json = ({ name: name22, description } = {}) => { return { name: "json", responseFormat: Promise.resolve({ type: "json", ...name22 != null && { name: name22 }, ...description != null && { description } }), async parseCompleteOutput({ text: text2 }, context) { const parseResult = await 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, finishReason: context.finishReason }); return parseResult.value; }, async parsePartialOutput({ text: text2 }) { const result = await parsePartialJson(text2); switch (result.state) { case "failed-parse": case "undefined-input": return; case "repaired-parse": case "successful-parse": return result.value === void 0 ? void 0 : { partial: result.value }; } }, createElementStreamTransform() {} }; }; async function parseToolCall({ toolCall, tools, repairToolCall, refineToolInput, messages, instructions }) { try { if (tools == null) { if (toolCall.providerExecuted && toolCall.dynamic) return await refineParsedToolCallInput({ toolCall: await parseProviderExecutedDynamicToolCall(toolCall), refineToolInput }); throw new NoSuchToolError({ toolName: toolCall.toolName }); } try { return await refineParsedToolCallInput({ toolCall: await doParseToolCall({ toolCall, tools }), refineToolInput }); } catch (error) { if (repairToolCall == null || !(NoSuchToolError.isInstance(error) || InvalidToolInputError.isInstance(error))) throw error; let repairedToolCall = null; try { repairedToolCall = await repairToolCall({ toolCall, tools, inputSchema: async ({ toolName }) => { var _a22; return await asSchema((_a22 = getOwn(tools, toolName)) == null ? void 0 : _a22.inputSchema).jsonSchema; }, instructions, system: instructions, messages, error }); } catch (repairError) { throw new ToolCallRepairError({ cause: repairError, originalError: error }); } if (repairedToolCall == null) throw error; return await refineParsedToolCallInput({ toolCall: await doParseToolCall({ toolCall: repairedToolCall, tools }), refineToolInput }); } } catch (error) { const parsedInput = await safeParseJSON({ text: toolCall.input }); const input = parsedInput.success ? parsedInput.value : toolCall.input; const tool2 = getOwn(tools, toolCall.toolName); return { type: "tool-call", toolCallId: toolCall.toolCallId, toolName: toolCall.toolName, input, dynamic: true, invalid: true, error, title: tool2 == null ? void 0 : tool2.title, providerExecuted: toolCall.providerExecuted, providerMetadata: toolCall.providerMetadata, ...(tool2 == null ? void 0 : tool2.metadata) != null ? { toolMetadata: tool2.metadata } : {} }; } } async function refineParsedToolCallInput({ toolCall, refineToolInput }) { const refine = getOwn(refineToolInput, toolCall.toolName); if (refine == null) return toolCall; return { ...toolCall, input: await refine(toolCall.input) }; } async function parseProviderExecutedDynamicToolCall(toolCall) { const parseResult = toolCall.input.trim() === "" ? { success: true, value: {} } : await safeParseJSON({ text: toolCall.input }); if (parseResult.success === false) throw new InvalidToolInputError({ toolName: toolCall.toolName, toolInput: toolCall.input, cause: parseResult.error }); return { type: "tool-call", toolCallId: toolCall.toolCallId, toolName: toolCall.toolName, input: parseResult.value, providerExecuted: true, dynamic: true, providerMetadata: toolCall.providerMetadata }; } async function doParseToolCall({ toolCall, tools }) { const toolName = toolCall.toolName; const tool2 = getOwn(tools, toolName); if (tool2 == null) { if (toolCall.providerExecuted && toolCall.dynamic) return await parseProviderExecutedDynamicToolCall(toolCall); throw new NoSuchToolError({ toolName: toolCall.toolName, availableTools: Object.keys(tools) }); } const schema = asSchema(tool2.inputSchema); const parseResult = toolCall.input.trim() === "" ? await safeValidateTypes({ value: {}, schema }) : await safeParseJSON({ text: toolCall.input, schema }); if (parseResult.success === false) throw new InvalidToolInputError({ toolName, toolInput: toolCall.input, cause: parseResult.error }); return tool2.type === "dynamic" ? { type: "tool-call", toolCallId: toolCall.toolCallId, toolName: toolCall.toolName, input: parseResult.value, providerExecuted: toolCall.providerExecuted, providerMetadata: toolCall.providerMetadata, ...tool2.metadata != null ? { toolMetadata: tool2.metadata } : {}, dynamic: true, title: tool2.title } : { type: "tool-call", toolCallId: toolCall.toolCallId, toolName, input: parseResult.value, providerExecuted: toolCall.providerExecuted, providerMetadata: toolCall.providerMetadata, ...tool2.metadata != null ? { toolMetadata: tool2.metadata } : {}, title: tool2.title }; } function unwrapReasoningFileData(data) { if (typeof data === "object" && data !== null && "type" in data) return data.type === "data" ? data.data : data.url; return data; } function convertFromReasoningOutputs(parts) { return parts.map((part) => { if (part.type === "reasoning") return { type: "reasoning", text: part.text, ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {} }; return { type: "reasoning-file", data: part.file.base64, mediaType: part.file.mediaType, ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {} }; }); } function convertToReasoningOutputs(parts) { return parts.map((part) => { if (part.type === "reasoning") return { type: "reasoning", text: part.text, ...part.providerOptions != null ? { providerMetadata: part.providerOptions } : {} }; const rawData = unwrapReasoningFileData(part.data); return { type: "reasoning-file", file: new DefaultGeneratedFile({ data: rawData instanceof ArrayBuffer ? new Uint8Array(rawData) : rawData instanceof URL ? rawData.toString() : rawData, mediaType: part.mediaType }), ...part.providerOptions != null ? { providerMetadata: part.providerOptions } : {} }; }); } async function resolveToolApproval({ tools, toolCall, toolApproval, messages, toolsContext, runtimeContext }) { if (toolApproval != null && typeof toolApproval === "function") return normalizeToolApprovalStatus(await toolApproval({ toolCall, tools, toolsContext, messages, runtimeContext })); const toolName = toolCall.toolName; const tool2 = getOwn(tools, toolName); const input = toolCall.input; const userDefinedToolApprovalStatus = getOwn(toolApproval, toolName); if (userDefinedToolApprovalStatus != null) return normalizeToolApprovalStatus(typeof userDefinedToolApprovalStatus === "function" ? await userDefinedToolApprovalStatus(input, { toolCallId: toolCall.toolCallId, messages, toolContext: await validateToolContext({ toolName, context: getOwn(toolsContext, toolName), contextSchema: tool2 == null ? void 0 : tool2.contextSchema }), runtimeContext }) : userDefinedToolApprovalStatus); if ((tool2 == null ? void 0 : tool2.needsApproval) == null) return { type: "not-applicable" }; return (typeof tool2.needsApproval === "function" ? await tool2.needsApproval(input, { toolCallId: toolCall.toolCallId, messages, context: await validateToolContext({ toolName, context: getOwn(toolsContext, toolName), contextSchema: tool2 == null ? void 0 : tool2.contextSchema }) }) : tool2.needsApproval) ? { type: "user-approval" } : { type: "not-applicable" }; } function normalizeToolApprovalStatus(status) { return status === void 0 ? { type: "not-applicable" } : typeof status === "string" ? { type: status } : status; } function mergeCallbacks(...callbacks) { return async (event) => { await Promise.allSettled(callbacks.map(async (callback) => { await (callback == null ? void 0 : callback(event)); })); }; } function isNodeRuntime() { var _a22; return typeof process !== "undefined" && ((_a22 = process.release) == null ? void 0 : _a22.name) === "node"; } var diagnosticsChannelPromise; async function loadDiagnosticsChannel() { if (!isNodeRuntime()) return; if (diagnosticsChannelPromise == null) diagnosticsChannelPromise = Promise.resolve(loadBuiltinModule("node:diagnostics_channel")); return diagnosticsChannelPromise; } function loadBuiltinModule(id) { var _a22; const processWithBuiltins = globalThis.process; try { return (_a22 = processWithBuiltins == null ? void 0 : processWithBuiltins.getBuiltinModule) == null ? void 0 : _a22.call(processWithBuiltins, id); } catch (e) { return; } } async function runWithTracingChannelSpan(message, execute) { var _a22; const diagnosticsChannel = await loadDiagnosticsChannel(); const tracingChannel = (_a22 = diagnosticsChannel == null ? void 0 : diagnosticsChannel.tracingChannel) == null ? void 0 : _a22.call(diagnosticsChannel, "ai:telemetry"); if (tracingChannel == null || tracingChannel.hasSubscribers === false) return await execute(); let executePromise; let executionResult; let executionError; let hasExecutionResult = false; let hasExecutionError = false; const tracedExecute = () => { try { executePromise = Promise.resolve(execute()); } catch (error) { executePromise = Promise.reject(error); } executePromise = executePromise.then((result) => { executionResult = result; hasExecutionResult = true; return result; }, (error) => { executionError = error; hasExecutionError = true; throw error; }); return executePromise; }; try { return await tracingChannel.tracePromise(tracedExecute, message); } catch (e) { if (hasExecutionError) throw executionError; if (hasExecutionResult) return executionResult; if (executePromise != null) return await executePromise; return await execute(); } } function openTelemetryChannelSpanContext({ message, completion }) { var _a22; if (!isNodeRuntime()) return; const diagnosticsChannel = loadBuiltinModule("node:diagnostics_channel"); const asyncHooks = loadBuiltinModule("node:async_hooks"); const tracingChannel = (_a22 = diagnosticsChannel == null ? void 0 : diagnosticsChannel.tracingChannel) == null ? void 0 : _a22.call(diagnosticsChannel, "ai:telemetry"); if (tracingChannel == null || tracingChannel.hasSubscribers === false || asyncHooks == null) { Promise.resolve(completion).catch(() => {}); return; } const context = message; let asyncResource; let asyncEndPublished = false; const safePublish = (publish) => { try { publish(); } catch (e) {} }; const publishAsyncEnd = ({ result, error }) => { if (asyncEndPublished) return; asyncEndPublished = true; if (error !== void 0) { context.error = error; safePublish(() => tracingChannel.error.publish(context)); } if (result !== void 0) context.result = result; safePublish(() => tracingChannel.asyncEnd.publish(context)); }; safePublish(() => { tracingChannel.start.runStores(context, () => { asyncResource = new asyncHooks.AsyncResource("ai.telemetry"); }); }); safePublish(() => tracingChannel.end.publish(context)); Promise.resolve(completion).then((result) => publishAsyncEnd({ result }), (error) => publishAsyncEnd({ error })); return { run: (execute) => asyncResource == null ? execute() : asyncResource.runInAsyncScope(execute) }; } function registerTelemetry(...integrations) { if (!globalThis.AI_SDK_TELEMETRY_INTEGRATIONS) globalThis.AI_SDK_TELEMETRY_INTEGRATIONS = []; globalThis.AI_SDK_TELEMETRY_INTEGRATIONS.push(...integrations); } function getGlobalTelemetryIntegrations() { var _a22; return (_a22 = globalThis.AI_SDK_TELEMETRY_INTEGRATIONS) != null ? _a22 : []; } function augmentEvent(event, telemetry) { return Object.assign(Object.create(Object.getPrototypeOf(event)), event, telemetry); } function createTelemetryDispatcher({ telemetry }) { if ((telemetry == null ? void 0 : telemetry.isEnabled) === false) return {}; const localIntegrations = telemetry == null ? void 0 : telemetry.integrations; const integrations = localIntegrations != null ? asArray(localIntegrations) : getGlobalTelemetryIntegrations(); const telemetryMetadata = { recordInputs: telemetry == null ? void 0 : telemetry.recordInputs, recordOutputs: telemetry == null ? void 0 : telemetry.recordOutputs, functionId: telemetry == null ? void 0 : telemetry.functionId }; const mergeTelemetryCallback = (key) => { const mergedIntegrationCallback = mergeCallbacks(...integrations.map((integration) => { var _a22; return (_a22 = integration[key]) == null ? void 0 : _a22.bind(integration); }).filter(Boolean).map((callback) => (event) => callback(augmentEvent(event, telemetryMetadata)))); return async (event) => { await mergedIntegrationCallback(event); }; }; const executeLanguageModelCallWrappers = integrations.map((integration) => { var _a22; return (_a22 = integration.executeLanguageModelCall) == null ? void 0 : _a22.bind(integration); }).filter(Boolean); const executeToolWrappers = integrations.map((integration) => { var _a22; return (_a22 = integration.executeTool) == null ? void 0 : _a22.bind(integration); }).filter(Boolean); return { runInTracingChannelSpan: async ({ type, event, execute }) => await runWithTracingChannelSpan({ type, event: augmentEvent(event, telemetryMetadata) }, execute), startTracingChannelContext: ({ type, event, completion }) => openTelemetryChannelSpanContext({ message: { type, event: augmentEvent(event, telemetryMetadata) }, completion }), onStart: mergeTelemetryCallback("onStart"), onStepStart: mergeTelemetryCallback("onStepStart"), onLanguageModelCallStart: mergeTelemetryCallback("onLanguageModelCallStart"), onLanguageModelCallEnd: mergeTelemetryCallback("onLanguageModelCallEnd"), onToolExecutionStart: mergeTelemetryCallback("onToolExecutionStart"), onToolExecutionEnd: mergeTelemetryCallback("onToolExecutionEnd"), onStepEnd: mergeCallbacks(mergeTelemetryCallback("onStepEnd"), mergeTelemetryCallback("onStepFinish")), onObjectStepStart: mergeTelemetryCallback("onObjectStepStart"), onObjectStepEnd: mergeTelemetryCallback("onObjectStepEnd"), onEmbedStart: mergeTelemetryCallback("onEmbedStart"), onEmbedEnd: mergeTelemetryCallback("onEmbedEnd"), onRerankStart: mergeTelemetryCallback("onRerankStart"), onRerankEnd: mergeTelemetryCallback("onRerankEnd"), onEnd: mergeTelemetryCallback("onEnd"), onAbort: mergeTelemetryCallback("onAbort"), onError: mergeTelemetryCallback("onError"), /** * Runs provider calls inside integration-specific context so * auto-instrumented provider requests can be associated with model work. */ executeLanguageModelCall: async ({ execute, ...event }) => { const augmentedEvent = augmentEvent(event, telemetryMetadata); let wrappedExecute = execute; for (const executeWrapper of executeLanguageModelCallWrappers) { const innerExecute = wrappedExecute; wrappedExecute = () => executeWrapper({ ...augmentedEvent, execute: innerExecute }); } return await runWithTracingChannelSpan({ type: "languageModelCall", event: augmentedEvent }, wrappedExecute); }, /** * Composes all `executeTool` wrappers around the original tool execution. * Each wrapper receives an `execute` function that calls the next wrapper in * the chain, so integrations can establish nested telemetry context before * delegating to the underlying tool. */ executeTool: async ({ execute, ...event }) => { const augmentedEvent = augmentEvent(event, telemetryMetadata); let wrappedExecute = execute; for (const executeWrapper of executeToolWrappers) { const innerExecute = wrappedExecute; wrappedExecute = () => executeWrapper({ ...augmentedEvent, execute: innerExecute }); } return await wrappedExecute(); } }; } function asReasoningText(reasoningParts) { const reasoningText = reasoningParts.map((part) => "text" in part ? part.text : "").join(""); return reasoningText.length > 0 ? reasoningText : void 0; } var DefaultStepResult = class { constructor({ callId, stepNumber, provider, modelId, runtimeContext, toolsContext, content, finishReason, rawFinishReason, usage, performance, warnings, request, response, providerMetadata }) { this.callId = callId; this.stepNumber = stepNumber; this.model = { provider, modelId }; this.runtimeContext = runtimeContext; this.toolsContext = toolsContext; this.content = content; this.finishReason = finishReason; this.rawFinishReason = rawFinishReason; this.usage = usage; this.performance = performance; this.warnings = warnings; this.request = request; this.response = response; this.providerMetadata = providerMetadata; } get text() { return this.content.filter((part) => part.type === "text").map((part) => part.text).join(""); } get reasoning() { return convertFromReasoningOutputs(this.content.filter((part) => part.type === "reasoning" || part.type === "reasoning-file")); } get reasoningText() { return asReasoningText(this.reasoning); } get files() { return this.content.filter((part) => part.type === "file").map((part) => part.file); } get sources() { return this.content.filter((part) => part.type === "source"); } get toolCalls() { return this.content.filter((part) => part.type === "tool-call"); } get staticToolCalls() { return this.toolCalls.filter((toolCall) => toolCall.dynamic !== true); } get dynamicToolCalls() { return this.toolCalls.filter((toolCall) => toolCall.dynamic === true); } get toolResults() { return this.content.filter((part) => part.type === "tool-result"); } get staticToolResults() { return this.toolResults.filter((toolResult) => toolResult.dynamic !== true); } get dynamicToolResults() { return this.toolResults.filter((toolResult) => toolResult.dynamic === true); } }; function filterIncludedContext({ context, includeContext }) { if (context == null) return {}; return Object.fromEntries(Object.entries(context).filter(([key]) => (includeContext == null ? void 0 : includeContext[key]) === true)); } function restrictStepResult({ step, includeRuntimeContext, includeToolsContext }) { return new DefaultStepResult({ callId: step.callId, stepNumber: step.stepNumber, provider: step.model.provider, modelId: step.model.modelId, runtimeContext: filterIncludedContext({ context: step.runtimeContext, includeContext: includeRuntimeContext }), toolsContext: filterToolsContext({ toolsContext: step.toolsContext, includeToolsContext }), content: step.content, finishReason: step.finishReason, rawFinishReason: step.rawFinishReason, usage: step.usage, performance: step.performance, warnings: step.warnings, request: step.request, response: step.response, providerMetadata: step.providerMetadata }); } function filterToolsContext({ toolsContext, includeToolsContext }) { if (includeToolsContext == null) return {}; return Object.fromEntries(Object.entries(toolsContext).map(([toolName, toolContext]) => [toolName, filterToolContext({ toolName, toolContext, includeToolsContext })])); } function filterToolContext({ toolName, toolContext, includeToolsContext }) { return filterIncludedContext({ context: toolContext, includeContext: includeToolsContext == null ? void 0 : includeToolsContext[toolName] }); } function createRestrictedTelemetryDispatcher({ telemetry, includeRuntimeContext, includeToolsContext }) { const telemetryDispatcher = createTelemetryDispatcher({ telemetry }); return { ...telemetryDispatcher, onStart: (event) => { var _a22; return (_a22 = telemetryDispatcher.onStart) == null ? void 0 : _a22.call(telemetryDispatcher, { ...event, runtimeContext: filterIncludedContext({ context: event.runtimeContext, includeContext: includeRuntimeContext }), toolsContext: filterToolsContext({ toolsContext: event.toolsContext, includeToolsContext }) }); }, onStepStart: (event) => { var _a22; return (_a22 = telemetryDispatcher.onStepStart) == null ? void 0 : _a22.call(telemetryDispatcher, { ...event, runtimeContext: filterIncludedContext({ context: event.runtimeContext, includeContext: includeRuntimeContext }), steps: event.steps.map((step) => restrictStepResult({ step, includeRuntimeContext, includeToolsContext })), toolsContext: filterToolsContext({ toolsContext: event.toolsContext, includeToolsContext }) }); }, onStepEnd: (event) => { var _a22; return (_a22 = telemetryDispatcher.onStepEnd) == null ? void 0 : _a22.call(telemetryDispatcher, restrictStepResult({ step: event, includeRuntimeContext, includeToolsContext })); }, onStepFinish: (event) => { var _a22; return (_a22 = telemetryDispatcher.onStepEnd) == null ? void 0 : _a22.call(telemetryDispatcher, restrictStepResult({ step: event, includeRuntimeContext, includeToolsContext })); }, onEnd: (event) => { var _a22; return (_a22 = telemetryDispatcher.onEnd) == null ? void 0 : _a22.call(telemetryDispatcher, ((restrictedSteps) => { return { ...event, runtimeContext: filterIncludedContext({ context: event.runtimeContext, includeContext: includeRuntimeContext }), steps: restrictedSteps, finalStep: restrictedSteps.at(-1), toolsContext: filterToolsContext({ toolsContext: event.toolsContext, includeToolsContext }) }; })(event.steps.map((step) => restrictStepResult({ step, includeRuntimeContext, includeToolsContext })))); }, onAbort: (event) => { var _a22; return (_a22 = telemetryDispatcher.onAbort) == null ? void 0 : _a22.call(telemetryDispatcher, { ...event, steps: event.steps.map((step) => restrictStepResult({ step, includeRuntimeContext, includeToolsContext })) }); }, onToolExecutionStart: (event) => { var _a22; return (_a22 = telemetryDispatcher.onToolExecutionStart) == null ? void 0 : _a22.call(telemetryDispatcher, { ...event, toolContext: filterToolContext({ toolName: event.toolCall.toolName, toolContext: event.toolContext, includeToolsContext }) }); }, onToolExecutionEnd: (event) => { var _a22; return (_a22 = telemetryDispatcher.onToolExecutionEnd) == null ? void 0 : _a22.call(telemetryDispatcher, { ...event, toolContext: filterToolContext({ toolName: event.toolCall.toolName, toolContext: event.toolContext, includeToolsContext }) }); } }; } function isStepCount(stepCount) { return ({ steps }) => steps.length === stepCount; } async function isStopConditionMet({ stopConditions, steps }) { return (await Promise.all(stopConditions.map((condition) => condition({ steps })))).some((result) => result); } function sumTokenCounts(tokenCount1, tokenCount2) { return tokenCount1 == null && tokenCount2 == null ? void 0 : (tokenCount1 != null ? tokenCount1 : 0) + (tokenCount2 != null ? tokenCount2 : 0); } async function toResponseMessages({ content: inputContent, tools }) { const responseMessages = []; const toolCallOrder = /* @__PURE__ */ new Map(); const content = []; for (const part of inputContent) { if (part.type === "source") continue; if ((part.type === "tool-result" || part.type === "tool-error") && !part.providerExecuted) continue; if (part.type === "text" && part.text.length === 0) continue; switch (part.type) { case "text": content.push({ type: "text", text: part.text, providerOptions: part.providerMetadata }); break; case "custom": content.push({ type: "custom", kind: part.kind, providerOptions: part.providerMetadata }); break; case "reasoning": content.push({ type: "reasoning", text: part.text, providerOptions: part.providerMetadata }); break; case "file": content.push({ type: "file", data: part.file.base64, mediaType: part.file.mediaType, providerOptions: part.providerMetadata }); break; case "reasoning-file": content.push({ type: "reasoning-file", data: part.file.base64, mediaType: part.file.mediaType, providerOptions: part.providerMetadata }); break; case "tool-call": if (!toolCallOrder.has(part.toolCallId)) toolCallOrder.set(part.toolCallId, toolCallOrder.size); content.push({ type: "tool-call", toolCallId: part.toolCallId, toolName: part.toolName, input: part.invalid && typeof part.input !== "object" ? {} : part.input, providerExecuted: part.providerExecuted, providerOptions: part.providerMetadata }); break; case "tool-result": { const output = await createToolModelOutput({ toolCallId: part.toolCallId, input: part.input, tool: getOwn(tools, part.toolName), output: part.output, errorMode: "none" }); content.push({ type: "tool-result", toolCallId: part.toolCallId, toolName: part.toolName, output, providerOptions: part.providerMetadata }); break; } case "tool-error": { const output = await createToolModelOutput({ toolCallId: part.toolCallId, input: part.input, tool: getOwn(tools, part.toolName), output: part.error, errorMode: "json" }); content.push({ type: "tool-result", toolCallId: part.toolCallId, toolName: part.toolName, output, providerOptions: part.providerMetadata }); break; } case "tool-approval-request": content.push({ type: "tool-approval-request", approvalId: part.approvalId, toolCallId: part.toolCall.toolCallId, isAutomatic: part.isAutomatic, ...part.signature != null ? { signature: part.signature } : {} }); break; } } if (content.length > 0) responseMessages.push({ role: "assistant", content }); const toolResultContent = []; for (const part of inputContent) { if (part.type !== "tool-approval-response" && part.type !== "tool-result" && part.type !== "tool-error") continue; if (part.type === "tool-approval-response") { toolResultContent.push({ type: "tool-approval-response", approvalId: part.approvalId, approved: part.approved, reason: part.reason, providerExecuted: part.providerExecuted }); if (part.approved === false) toolResultContent.push({ type: "tool-result", toolCallId: part.toolCall.toolCallId, toolName: part.toolCall.toolName, output: { type: "execution-denied", reason: part.reason } }); continue; } if (part.providerExecuted) continue; const output = await createToolModelOutput({ toolCallId: part.toolCallId, input: part.input, tool: getOwn(tools, part.toolName), output: part.type === "tool-result" ? part.output : part.error, errorMode: part.type === "tool-error" ? "text" : "none" }); toolResultContent.push({ type: "tool-result", toolCallId: part.toolCallId, toolName: part.toolName, output, ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {} }); } if (toolResultContent.length > 0) responseMessages.push({ role: "tool", content: sortToolResultContentByToolCallOrder({ toolResultContent, toolCallOrder }) }); return responseMessages; } function sortToolResultContentByToolCallOrder({ toolResultContent, toolCallOrder }) { const sortedToolResults = toolResultContent.filter((part) => part.type === "tool-result").map((part, index) => ({ part, index })).sort((a, b) => { const aOrder = toolCallOrder.get(a.part.toolCallId); const bOrder = toolCallOrder.get(b.part.toolCallId); if (aOrder == null && bOrder == null) return a.index - b.index; if (aOrder == null) return 1; if (bOrder == null) return -1; return aOrder - bOrder || a.index - b.index; }).map(({ part }) => part); let toolResultIndex = 0; return toolResultContent.map((part) => part.type === "tool-result" ? sortedToolResults[toolResultIndex++] : part); } var encoder = new TextEncoder(); function canonicalJSON(value) { if (value === null || value === void 0) return JSON.stringify(value); if (typeof value !== "object") return JSON.stringify(value); if (Array.isArray(value)) return `[${value.map(canonicalJSON).join(",")}]`; return `{${Object.keys(value).sort().map((k) => `${JSON.stringify(k)}:${canonicalJSON(value[k])}`).join(",")}}`; } function toBase64url(bytes) { return convertUint8ArrayToBase64(bytes).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, ""); } async function hashCanonical(value) { const digest = await crypto.subtle.digest("SHA-256", encoder.encode(canonicalJSON(value))); return toBase64url(new Uint8Array(digest)); } var encoder2 = new TextEncoder(); function fromBase64url(str) { return convertBase64ToUint8Array(str); } async function importKey(secret) { const keyData = typeof secret === "string" ? encoder2.encode(secret) : secret; return crypto.subtle.importKey("raw", keyData, { name: "HMAC", hash: "SHA-256" }, false, ["sign", "verify"]); } function buildPayload(approvalId, toolCallId, toolName, inputDigest) { return encoder2.encode(`${approvalId} ${toolCallId} ${toolName} ${inputDigest}`); } async function signToolApproval({ secret, approvalId, toolCallId, toolName, input }) { const key = await importKey(secret); const payload = buildPayload(approvalId, toolCallId, toolName, await hashCanonical(input)); const sig = await crypto.subtle.sign("HMAC", key, payload); return toBase64url(new Uint8Array(sig)); } async function verifyToolApprovalSignature({ secret, signature, approvalId, toolCallId, toolName, input }) { const key = await importKey(secret); const payload = buildPayload(approvalId, toolCallId, toolName, await hashCanonical(input)); const sigBytes = fromBase64url(signature); return crypto.subtle.verify("HMAC", key, sigBytes, payload); } async function maybeSignApproval({ secret, approvalId, toolCallId, toolName, input }) { if (secret == null) return void 0; return signToolApproval({ secret, approvalId, toolCallId, toolName, input }); } async function validateApprovedToolApprovals({ approvedToolApprovals, tools, toolApproval, messages, toolsContext, runtimeContext, toolApprovalSecret }) { var _a22; const approved = []; const denied = []; for (const approval of approvedToolApprovals) { const { toolCall, approvalRequest } = approval; const tool2 = getOwn(tools, toolCall.toolName); if (toolApprovalSecret != null) { if (approvalRequest.signature == null) throw new InvalidToolApprovalSignatureError({ approvalId: approvalRequest.approvalId, toolCallId: toolCall.toolCallId, reason: "missing signature" }); if (!await verifyToolApprovalSignature({ secret: toolApprovalSecret, signature: approvalRequest.signature, approvalId: approvalRequest.approvalId, toolCallId: toolCall.toolCallId, toolName: toolCall.toolName, input: toolCall.input })) throw new InvalidToolApprovalSignatureError({ approvalId: approvalRequest.approvalId, toolCallId: toolCall.toolCallId, reason: "invalid signature" }); } if (isExecutableTool(tool2) && tool2.inputSchema != null) { const validation = await safeValidateTypes({ value: toolCall.input, schema: asSchema(tool2.inputSchema) }); if (!validation.success) throw new InvalidToolInputError({ toolName: toolCall.toolName, toolInput: JSON.stringify(toolCall.input), cause: validation.error }); } const approvalStatus = await resolveToolApproval({ tools, toolApproval, toolCall, messages, toolsContext, runtimeContext }); if (approvalStatus.type === "denied") denied.push({ ...approval, approvalResponse: { ...approval.approvalResponse, approved: false, reason: (_a22 = approvalStatus.reason) != null ? _a22 : approval.approvalResponse.reason } }); else approved.push(approval); } return { approvedToolApprovals: approved, deniedToolApprovals: denied }; } var originalGenerateId = createIdGenerator({ prefix: "aitxt", size: 24 }); var originalGenerateCallId = createIdGenerator({ prefix: "call", size: 24 }); async function generateText({ model: modelArg, tools, toolChoice, instructions, system, prompt, messages, allowSystemInMessages, maxRetries: maxRetriesArg, abortSignal, timeout, headers, stopWhen = isStepCount(1), experimental_sandbox: sandbox, output, toolApproval, experimental_toolApprovalSecret, experimental_telemetry, telemetry = experimental_telemetry, providerOptions, activeTools, toolOrder, prepareStep, experimental_repairToolCall, repairToolCall = experimental_repairToolCall, experimental_refineToolInput: refineToolInput, experimental_download: download2, runtimeContext = {}, toolsContext = {}, experimental_include, include = experimental_include, _internal: { generateId: generateId2 = originalGenerateId, generateCallId = originalGenerateCallId, now: now2 = now } = {}, onStart, experimental_onStart, onStepStart, experimental_onStepStart, onLanguageModelCallStart, experimental_onLanguageModelCallStart, onLanguageModelCallEnd, experimental_onLanguageModelCallEnd, onToolExecutionStart, onToolExecutionEnd, experimental_onToolCallStart, experimental_onToolCallFinish, onStepEnd, onStepFinish, onFinish, onEnd = onFinish, ...settings }) { var _a22, _b, _c, _d; include = { requestBody: (_a22 = include == null ? void 0 : include.requestBody) != null ? _a22 : false, requestMessages: (_b = include == null ? void 0 : include.requestMessages) != null ? _b : false, responseBody: (_c = include == null ? void 0 : include.responseBody) != null ? _c : false }; const model = resolveLanguageModel(modelArg); const stopConditions = asArray(stopWhen); const resolvedOnStart = onStart != null ? onStart : experimental_onStart; const resolvedOnStepStart = onStepStart != null ? onStepStart : experimental_onStepStart; const resolvedOnLanguageModelCallStart = onLanguageModelCallStart != null ? onLanguageModelCallStart : experimental_onLanguageModelCallStart; const resolvedOnLanguageModelCallEnd = onLanguageModelCallEnd != null ? onLanguageModelCallEnd : experimental_onLanguageModelCallEnd; const resolvedOnToolExecutionStart = onToolExecutionStart != null ? onToolExecutionStart : experimental_onToolCallStart; const resolvedOnToolExecutionEnd = onToolExecutionEnd != null ? onToolExecutionEnd : experimental_onToolCallFinish; const resolvedOnStepEnd = onStepEnd != null ? onStepEnd : onStepFinish; const totalTimeoutMs = getTotalTimeoutMs(timeout); const stepTimeoutMs = getStepTimeoutMs(timeout); const stepAbortController = stepTimeoutMs != null ? new AbortController() : void 0; const mergedAbortSignal = mergeAbortSignals(abortSignal, totalTimeoutMs, stepAbortController == null ? void 0 : stepAbortController.signal); const { maxRetries, retry } = prepareRetries({ maxRetries: maxRetriesArg, abortSignal: mergedAbortSignal }); const callSettings = prepareLanguageModelCallOptions(settings); const headersWithUserAgent = withUserAgentSuffix(headers != null ? headers : {}, `ai/${VERSION}`); const initialPrompt = await standardizePrompt({ instructions, system, prompt, messages, allowSystemInMessages }); const callId = generateCallId(); const telemetryDispatcher = createRestrictedTelemetryDispatcher({ telemetry, includeRuntimeContext: telemetry == null ? void 0 : telemetry.includeRuntimeContext, includeToolsContext: telemetry == null ? void 0 : telemetry.includeToolsContext }); const runInTracingChannelSpan = (_d = telemetryDispatcher.runInTracingChannelSpan) != null ? _d : async ({ execute }) => await execute(); const generateTextStartEvent = { callId, operationId: "ai.generateText", provider: model.provider, modelId: model.modelId, instructions: initialPrompt.instructions, messages: initialPrompt.messages, tools, toolChoice, activeTools, toolOrder, maxOutputTokens: callSettings.maxOutputTokens, temperature: callSettings.temperature, topP: callSettings.topP, topK: callSettings.topK, presencePenalty: callSettings.presencePenalty, frequencyPenalty: callSettings.frequencyPenalty, stopSequences: callSettings.stopSequences, seed: callSettings.seed, reasoning: callSettings.reasoning, maxRetries, timeout, headers: headersWithUserAgent, providerOptions, output, runtimeContext, toolsContext }; const executeGenerateText = async () => { var _a23; await notify({ event: generateTextStartEvent, callbacks: [resolvedOnStart, telemetryDispatcher.onStart] }); try { const initialMessages = initialPrompt.messages; const initialResponseMessages = []; const { approvedToolApprovals, deniedToolApprovals: collectedDeniedToolApprovals } = collectToolApprovals({ messages: initialMessages }); const { approvedToolApprovals: localApprovedToolApprovals, deniedToolApprovals: revalidationDeniedToolApprovals } = await validateApprovedToolApprovals({ approvedToolApprovals: approvedToolApprovals.filter((toolApproval2) => !toolApproval2.toolCall.providerExecuted), tools, toolApproval, messages: initialMessages, toolsContext, runtimeContext, toolApprovalSecret: experimental_toolApprovalSecret }); const deniedToolApprovals = [...collectedDeniedToolApprovals, ...revalidationDeniedToolApprovals]; if (deniedToolApprovals.length > 0 || localApprovedToolApprovals.length > 0) { const toolResults2 = await executeTools({ toolCalls: localApprovedToolApprovals.map((toolApproval2) => toolApproval2.toolCall), tools, callId, messages: initialMessages, abortSignal: mergedAbortSignal, timeout, experimental_sandbox: sandbox, toolsContext, onToolExecutionStart: (event) => notify({ event, callbacks: [resolvedOnToolExecutionStart, telemetryDispatcher.onToolExecutionStart] }), onToolExecutionEnd: (event) => notify({ event, callbacks: [resolvedOnToolExecutionEnd, telemetryDispatcher.onToolExecutionEnd] }), executeToolInTelemetryContext: telemetryDispatcher.executeTool, runInTracingChannelSpan }); const toolContent = []; for (const result of toolResults2) { const output2 = result.output; const modelOutput = await createToolModelOutput({ toolCallId: output2.toolCallId, input: output2.input, tool: getOwn(tools, output2.toolName), output: output2.type === "tool-result" ? output2.output : output2.error, errorMode: output2.type === "tool-error" ? "text" : "none" }); toolContent.push({ type: "tool-result", toolCallId: output2.toolCallId, toolName: output2.toolName, output: modelOutput }); } for (const toolApproval2 of deniedToolApprovals) toolContent.push({ type: "tool-result", toolCallId: toolApproval2.toolCall.toolCallId, toolName: toolApproval2.toolCall.toolName, output: { type: "execution-denied", reason: toolApproval2.approvalResponse.reason, ...toolApproval2.toolCall.providerExecuted && { providerOptions: { openai: { approvalId: toolApproval2.approvalResponse.approvalId } } } } }); initialResponseMessages.push({ role: "tool", content: toolContent }); } const callSettings2 = prepareLanguageModelCallOptions(settings); let currentModelResponse; let clientToolCalls = []; let clientToolOutputs = []; let toolApprovalResponses = []; let deniedToolApprovalResponses = []; const steps = []; let instructionsForNextStep = initialPrompt.instructions; let messagesForNextStep = [...initialMessages, ...initialResponseMessages]; const pendingDeferredToolCalls = /* @__PURE__ */ new Map(); do { const stepTimeoutId = setAbortTimeout({ abortController: stepAbortController, label: "Step", timeoutMs: stepTimeoutMs }); const stepNumber = steps.length; try { await runInTracingChannelSpan({ type: "step", event: { callId, stepNumber }, execute: async () => { var _a24, _b2, _c2, _d2, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q; const accumulatedResponseMessages = [...initialResponseMessages, ...steps.flatMap((step) => step.response.messages)]; const stepInputMessages = messagesForNextStep; const prepareStepResult = await (prepareStep == null ? void 0 : prepareStep({ model, steps, stepNumber: steps.length, instructions: instructionsForNextStep, initialInstructions: initialPrompt.instructions, messages: stepInputMessages, initialMessages, responseMessages: accumulatedResponseMessages, runtimeContext, toolsContext, experimental_sandbox: sandbox })); const stepSandbox = (_a24 = prepareStepResult == null ? void 0 : prepareStepResult.experimental_sandbox) != null ? _a24 : sandbox; const stepModel = resolveLanguageModel((_b2 = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _b2 : model); const stepInstructions = (_d2 = (_c2 = prepareStepResult == null ? void 0 : prepareStepResult.instructions) != null ? _c2 : prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _d2 : instructionsForNextStep; const promptMessages = await convertToLanguageModelPrompt({ prompt: { instructions: stepInstructions, messages: (_e = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _e : stepInputMessages }, supportedUrls: await stepModel.supportedUrls, download: download2, provider: stepModel.provider.split(".")[0] }); runtimeContext = (_f = prepareStepResult == null ? void 0 : prepareStepResult.runtimeContext) != null ? _f : runtimeContext; toolsContext = (_g = prepareStepResult == null ? void 0 : prepareStepResult.toolsContext) != null ? _g : toolsContext; const stepActiveTools = filterActiveTools({ tools, activeTools: (_h = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _h : activeTools }); const stepToolOrder = (_i = prepareStepResult == null ? void 0 : prepareStepResult.toolOrder) != null ? _i : toolOrder; const stepTools = await prepareTools({ tools: stepActiveTools, toolOrder: stepToolOrder, toolsContext, experimental_sandbox: stepSandbox }); const stepToolChoice = prepareToolChoice({ toolChoice: (_j = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _j : toolChoice }); const stepMessages = (_k = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _k : stepInputMessages; const stepProviderOptions = mergeObjects(providerOptions, prepareStepResult == null ? void 0 : prepareStepResult.providerOptions); await notify({ event: { callId, provider: stepModel.provider, modelId: stepModel.modelId, stepNumber, instructions: stepInstructions, messages: stepMessages, tools, toolChoice: (_l = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _l : toolChoice, activeTools: (_m = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _m : activeTools, toolOrder: stepToolOrder, steps: [...steps], providerOptions: stepProviderOptions, output, runtimeContext, promptMessages, stepTools, stepToolChoice, toolsContext }, callbacks: [resolvedOnStepStart, telemetryDispatcher.onStepStart] }); const languageModelCallContext = { provider: stepModel.provider, modelId: stepModel.modelId, instructions: stepInstructions, messages: stepMessages, tools: stepTools, ...callSettings2 }; const languageModelCallStartEvent = { callId, ...languageModelCallContext }; const stepStartTimestampMs = now2(); await notify({ event: languageModelCallStartEvent, callbacks: [resolvedOnLanguageModelCallStart, telemetryDispatcher.onLanguageModelCallStart] }); const executeLanguageModelCallInTelemetryContext = (_n = telemetryDispatcher.executeLanguageModelCall) != null ? _n : async ({ execute }) => await execute(); currentModelResponse = await retry(async () => { var _a25, _b3, _c3, _d3, _e2, _f2, _g2, _h2; const result = await executeLanguageModelCallInTelemetryContext({ ...languageModelCallStartEvent, execute: async () => await stepModel.doGenerate({ ...callSettings2, tools: stepTools, toolChoice: stepToolChoice, responseFormat: await (output == null ? void 0 : output.responseFormat), prompt: promptMessages, providerOptions: stepProviderOptions, abortSignal: mergedAbortSignal, headers: headersWithUserAgent }) }); const responseData = { id: (_b3 = (_a25 = result.response) == null ? void 0 : _a25.id) != null ? _b3 : generateId2(), timestamp: (_d3 = (_c3 = result.response) == null ? void 0 : _c3.timestamp) != null ? _d3 : /* @__PURE__ */ new Date(), modelId: (_f2 = (_e2 = result.response) == null ? void 0 : _e2.modelId) != null ? _f2 : stepModel.modelId, headers: (_g2 = result.response) == null ? void 0 : _g2.headers, body: (_h2 = result.response) == null ? void 0 : _h2.body }; return { ...result, response: responseData }; }); const responseTimeMs = now2() - stepStartTimestampMs; const stepUsage = asLanguageModelUsage(currentModelResponse.usage); const stepToolCalls = await Promise.all(currentModelResponse.content.filter((part) => part.type === "tool-call").map((toolCall) => parseToolCall({ toolCall, tools, repairToolCall, refineToolInput, instructions: stepInstructions, messages: stepMessages }))); const toolApprovalRequests = {}; const stepToolApprovalResponses = {}; const blockedToolCallIds = /* @__PURE__ */ new Set(); const modelCallContent = asContent({ content: currentModelResponse.content, toolCalls: stepToolCalls, toolOutputs: [], toolApprovalRequests: [], toolApprovalResponses: [], tools }); await notify({ event: { callId, provider: stepModel.provider, modelId: stepModel.modelId, finishReason: currentModelResponse.finishReason.unified, usage: stepUsage, content: modelCallContent, responseId: currentModelResponse.response.id, performance: { responseTimeMs, effectiveOutputTokensPerSecond: calculateTokensPerSecond({ tokens: stepUsage.outputTokens, durationMs: responseTimeMs }), outputTokensPerSecond: void 0, inputTokensPerSecond: void 0, effectiveTotalTokensPerSecond: calculateTokensPerSecond({ tokens: sumTokenCounts(stepUsage.inputTokens, stepUsage.outputTokens), durationMs: responseTimeMs }), timeToFirstOutputMs: void 0 } }, callbacks: [resolvedOnLanguageModelCallEnd, telemetryDispatcher.onLanguageModelCallEnd] }); for (const toolCall of stepToolCalls) { if (toolCall.invalid) continue; const tool2 = getOwn(tools, toolCall.toolName); if (tool2 == null) continue; if ((tool2 == null ? void 0 : tool2.onInputAvailable) != null) await tool2.onInputAvailable({ input: toolCall.input, toolCallId: toolCall.toolCallId, messages: stepMessages, abortSignal: mergedAbortSignal, context: runtimeContext }); const toolApprovalStatus = await resolveToolApproval({ tools, toolApproval, toolCall, messages: stepMessages, toolsContext, runtimeContext }); if (toolApprovalStatus.type === "not-applicable") continue; const approvalId = generateId2(); const signature = await maybeSignApproval({ secret: experimental_toolApprovalSecret, approvalId, toolCallId: toolCall.toolCallId, toolName: toolCall.toolName, input: toolCall.input }); switch (toolApprovalStatus.type) { case "user-approval": toolApprovalRequests[toolCall.toolCallId] = { type: "tool-approval-request", approvalId, toolCall, ...signature != null ? { signature } : {} }; blockedToolCallIds.add(toolCall.toolCallId); break; case "approved": toolApprovalRequests[toolCall.toolCallId] = { type: "tool-approval-request", approvalId, toolCall, isAutomatic: true, ...signature != null ? { signature } : {} }; stepToolApprovalResponses[toolCall.toolCallId] = { type: "tool-approval-response", approvalId, toolCall, approved: true, reason: toolApprovalStatus.reason, providerExecuted: toolCall.providerExecuted }; break; case "denied": toolApprovalRequests[toolCall.toolCallId] = { type: "tool-approval-request", approvalId, toolCall, isAutomatic: true, ...signature != null ? { signature } : {} }; stepToolApprovalResponses[toolCall.toolCallId] = { type: "tool-approval-response", approvalId, toolCall, approved: false, reason: toolApprovalStatus.reason, providerExecuted: toolCall.providerExecuted }; blockedToolCallIds.add(toolCall.toolCallId); break; } } const invalidToolCalls = stepToolCalls.filter((toolCall) => toolCall.invalid && toolCall.dynamic); clientToolOutputs = []; for (const toolCall of invalidToolCalls) clientToolOutputs.push({ type: "tool-error", toolCallId: toolCall.toolCallId, toolName: toolCall.toolName, input: toolCall.input, error: getErrorMessage(toolCall.error), dynamic: true }); clientToolCalls = stepToolCalls.filter((toolCall) => !toolCall.providerExecuted); toolApprovalResponses = Object.values(stepToolApprovalResponses); deniedToolApprovalResponses = toolApprovalResponses.filter((toolApprovalResponse) => toolApprovalResponse.approved === false); const toolExecutionMs = {}; if (tools != null) { const toolExecutionResults = await executeTools({ toolCalls: clientToolCalls.filter((toolCall) => !toolCall.invalid && !blockedToolCallIds.has(toolCall.toolCallId)), tools, callId, messages: stepMessages, abortSignal: mergedAbortSignal, timeout, experimental_sandbox: stepSandbox, toolsContext, onToolExecutionStart: (event) => notify({ event, callbacks: [resolvedOnToolExecutionStart, telemetryDispatcher.onToolExecutionStart] }), onToolExecutionEnd: (event) => notify({ event, callbacks: [resolvedOnToolExecutionEnd, telemetryDispatcher.onToolExecutionEnd] }), executeToolInTelemetryContext: telemetryDispatcher.executeTool, runInTracingChannelSpan }); for (const result of toolExecutionResults) { toolExecutionMs[result.output.toolCallId] = result.toolExecutionMs; clientToolOutputs.push(result.output); } } const stepTimeMs = now2() - stepStartTimestampMs; const stepPerformance = { effectiveOutputTokensPerSecond: calculateTokensPerSecond({ tokens: stepUsage.outputTokens, durationMs: responseTimeMs }), outputTokensPerSecond: void 0, inputTokensPerSecond: void 0, effectiveTotalTokensPerSecond: calculateTokensPerSecond({ tokens: sumTokenCounts(stepUsage.inputTokens, stepUsage.outputTokens), durationMs: responseTimeMs }), stepTimeMs, responseTimeMs, toolExecutionMs, timeToFirstOutputMs: void 0 }; for (const toolCall of stepToolCalls) { if (!toolCall.providerExecuted) continue; const tool2 = getOwn(tools, toolCall.toolName); if ((tool2 == null ? void 0 : tool2.type) === "provider" && tool2.supportsDeferredResults) { if (!currentModelResponse.content.some((part) => part.type === "tool-result" && part.toolCallId === toolCall.toolCallId)) pendingDeferredToolCalls.set(toolCall.toolCallId, { toolName: toolCall.toolName }); } } for (const part of currentModelResponse.content) if (part.type === "tool-result") pendingDeferredToolCalls.delete(part.toolCallId); const stepContent = asContent({ content: currentModelResponse.content, toolCalls: stepToolCalls, toolOutputs: clientToolOutputs, toolApprovalRequests: Object.values(toolApprovalRequests), toolApprovalResponses, tools }); const stepResponseMessages = await toResponseMessages({ content: stepContent, tools }); const stepRequest = { ...currentModelResponse.request, body: include.requestBody ? (_o = currentModelResponse.request) == null ? void 0 : _o.body : void 0, messages: include.requestMessages ? cloneModelMessages(stepMessages) : void 0 }; const stepResponse = { ...currentModelResponse.response, messages: cloneModelMessages(stepResponseMessages), body: include.responseBody ? (_p = currentModelResponse.response) == null ? void 0 : _p.body : void 0 }; const currentStepResult = new DefaultStepResult({ callId, stepNumber, provider: stepModel.provider, modelId: stepModel.modelId, runtimeContext, content: stepContent, finishReason: currentModelResponse.finishReason.unified, rawFinishReason: currentModelResponse.finishReason.raw, usage: stepUsage, performance: stepPerformance, warnings: currentModelResponse.warnings, providerMetadata: currentModelResponse.providerMetadata, request: stepRequest, response: stepResponse, toolsContext }); logWarnings({ warnings: (_q = currentModelResponse.warnings) != null ? _q : [], provider: stepModel.provider, model: stepModel.modelId }); steps.push(currentStepResult); instructionsForNextStep = stepInstructions; messagesForNextStep = [...stepMessages, ...stepResponseMessages]; await notify({ event: currentStepResult, callbacks: [resolvedOnStepEnd, telemetryDispatcher.onStepEnd] }); return currentStepResult; } }); } finally { if (stepTimeoutId != null) clearTimeout(stepTimeoutId); } } while ((clientToolCalls.length > 0 && clientToolOutputs.length + deniedToolApprovalResponses.length === clientToolCalls.length || pendingDeferredToolCalls.size > 0) && !await isStopConditionMet({ stopConditions, steps })); const lastStep = steps[steps.length - 1]; const totalUsage = steps.reduce((totalUsage2, step) => { return addLanguageModelUsage(totalUsage2, step.usage); }, { inputTokens: void 0, inputTokenDetails: { noCacheTokens: void 0, cacheReadTokens: void 0, cacheWriteTokens: void 0 }, outputTokens: void 0, outputTokenDetails: { textTokens: void 0, reasoningTokens: void 0 }, totalTokens: void 0 }); const files = steps.flatMap((step) => step.files); const sources = steps.flatMap((step) => step.sources); const toolCalls = steps.flatMap((step) => step.toolCalls); const staticToolCalls = steps.flatMap((step) => step.staticToolCalls); const dynamicToolCalls = steps.flatMap((step) => step.dynamicToolCalls); const toolResults = steps.flatMap((step) => step.toolResults); const staticToolResults = steps.flatMap((step) => step.staticToolResults); const dynamicToolResults = steps.flatMap((step) => step.dynamicToolResults); const warnings = steps.flatMap((step) => { var _a24; return (_a24 = step.warnings) != null ? _a24 : []; }); await notify({ event: { callId, stepNumber: lastStep.stepNumber, model: lastStep.model, runtimeContext: lastStep.runtimeContext, finishReason: lastStep.finishReason, rawFinishReason: lastStep.rawFinishReason, usage: totalUsage, totalUsage, content: steps.flatMap((step) => step.content), text: lastStep.text, reasoning: lastStep.reasoning, reasoningText: lastStep.reasoningText, files, sources, toolCalls, staticToolCalls, dynamicToolCalls, toolResults, staticToolResults, dynamicToolResults, responseMessages: [...initialResponseMessages, ...steps.flatMap((step) => step.response.messages)], warnings, request: lastStep.request, response: lastStep.response, providerMetadata: lastStep.providerMetadata, steps, finalStep: lastStep, toolsContext }, callbacks: [onEnd, telemetryDispatcher.onEnd] }); let resolvedOutput; if (lastStep.finishReason === "stop") resolvedOutput = await (output != null ? output : text()).parseCompleteOutput({ text: lastStep.text }, { response: lastStep.response, usage: lastStep.usage, finishReason: lastStep.finishReason }); return new DefaultGenerateTextResult({ initialResponseMessages, steps, totalUsage, output: resolvedOutput }); } catch (error) { await ((_a23 = telemetryDispatcher.onError) == null ? void 0 : _a23.call(telemetryDispatcher, { callId, error })); throw wrapGatewayError(error); } }; return await runInTracingChannelSpan({ type: "generateText", event: generateTextStartEvent, execute: executeGenerateText }); } async function executeTools({ toolCalls, tools, callId, messages, abortSignal, timeout, experimental_sandbox: sandbox, toolsContext, onToolExecutionStart, onToolExecutionEnd, executeToolInTelemetryContext, runInTracingChannelSpan }) { return (await Promise.all(toolCalls.map(async (toolCall) => await executeToolCall({ toolCall, tools, callId, messages, abortSignal, timeout, experimental_sandbox: sandbox, toolsContext, onToolExecutionStart, onToolExecutionEnd, executeToolInTelemetryContext, runInTracingChannelSpan })))).filter((result) => result != null); } var DefaultGenerateTextResult = class { constructor(options) { this.initialResponseMessages = options.initialResponseMessages; this.steps = options.steps; this._output = options.output; this.totalUsage = options.totalUsage; } get finalStep() { return this.steps.at(-1); } get content() { return this.steps.flatMap((step) => step.content); } get text() { return this.finalStep.text; } get files() { return this.steps.flatMap((step) => step.files); } get reasoningText() { return this.finalStep.reasoningText; } get reasoning() { return convertToReasoningOutputs(this.finalStep.reasoning); } get toolCalls() { return this.steps.flatMap((step) => step.toolCalls); } get staticToolCalls() { return this.steps.flatMap((step) => step.staticToolCalls); } get dynamicToolCalls() { return this.steps.flatMap((step) => step.dynamicToolCalls); } get toolResults() { return this.steps.flatMap((step) => step.toolResults); } get staticToolResults() { return this.steps.flatMap((step) => step.staticToolResults); } get dynamicToolResults() { return this.steps.flatMap((step) => step.dynamicToolResults); } get sources() { return this.steps.flatMap((step) => step.sources); } get finishReason() { return this.finalStep.finishReason; } get rawFinishReason() { return this.finalStep.rawFinishReason; } get warnings() { return this.steps.flatMap((step) => { var _a22; return (_a22 = step.warnings) != null ? _a22 : []; }); } get providerMetadata() { return this.finalStep.providerMetadata; } get response() { return this.finalStep.response; } get responseMessages() { return [...this.initialResponseMessages, ...this.steps.flatMap((step) => step.response.messages)]; } get request() { return this.finalStep.request; } get usage() { return this.totalUsage; } get output() { if (this._output == null) throw new NoOutputGeneratedError(); return this._output; } }; function asContent({ content, toolCalls, toolOutputs, toolApprovalRequests, toolApprovalResponses, tools }) { const contentParts = []; const toolOutputsWithApprovalResponses = []; const toolOutputsWithoutApprovalResponses = []; const toolCallIdsWithApprovalResponses = new Set(toolApprovalResponses.map((toolApprovalResponse) => toolApprovalResponse.toolCall.toolCallId)); for (const part of content) switch (part.type) { case "text": case "reasoning": case "custom": case "source": contentParts.push(part); break; case "file": case "reasoning-file": contentParts.push({ type: part.type, file: new DefaultGeneratedFile({ data: part.data.type === "data" ? part.data.data : part.data.url.toString(), mediaType: part.mediaType }), ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {} }); break; case "tool-call": contentParts.push(toolCalls.find((toolCall) => toolCall.toolCallId === part.toolCallId)); break; case "tool-result": { const toolCall = toolCalls.find((toolCall2) => toolCall2.toolCallId === part.toolCallId); if (toolCall == null) { const tool2 = getOwn(tools, part.toolName); if (!((tool2 == null ? void 0 : tool2.type) === "provider" && tool2.supportsDeferredResults)) throw new Error(`Tool call ${part.toolCallId} not found.`); if (part.isError) contentParts.push({ type: "tool-error", toolCallId: part.toolCallId, toolName: part.toolName, input: void 0, error: part.result, providerExecuted: true, dynamic: part.dynamic, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}, ...(tool2 == null ? void 0 : tool2.metadata) != null ? { toolMetadata: tool2.metadata } : {} }); else contentParts.push({ type: "tool-result", toolCallId: part.toolCallId, toolName: part.toolName, input: void 0, output: part.result, providerExecuted: true, dynamic: part.dynamic, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}, ...(tool2 == null ? void 0 : tool2.metadata) != null ? { toolMetadata: tool2.metadata } : {} }); break; } if (part.isError) contentParts.push({ type: "tool-error", toolCallId: part.toolCallId, toolName: part.toolName, input: toolCall.input, error: part.result, providerExecuted: true, dynamic: toolCall.dynamic, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}, ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {} }); else contentParts.push({ type: "tool-result", toolCallId: part.toolCallId, toolName: part.toolName, input: toolCall.input, output: part.result, providerExecuted: true, dynamic: toolCall.dynamic, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}, ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {} }); break; } case "tool-approval-request": { const toolCall = toolCalls.find((toolCall2) => toolCall2.toolCallId === part.toolCallId); if (toolCall == null) throw new ToolCallNotFoundForApprovalError({ toolCallId: part.toolCallId, approvalId: part.approvalId }); contentParts.push({ type: "tool-approval-request", approvalId: part.approvalId, toolCall }); break; } } for (const toolOutput of toolOutputs) if (toolCallIdsWithApprovalResponses.has(toolOutput.toolCallId)) toolOutputsWithApprovalResponses.push(toolOutput); else toolOutputsWithoutApprovalResponses.push(toolOutput); return [ ...contentParts, ...toolOutputsWithoutApprovalResponses, ...toolApprovalRequests, ...toolApprovalResponses, ...toolOutputsWithApprovalResponses ]; } function prepareHeaders(headers, defaultHeaders) { const responseHeaders = new Headers(headers != null ? headers : {}); for (const [key, value] of Object.entries(defaultHeaders)) if (!responseHeaders.has(key)) responseHeaders.set(key, value); return responseHeaders; } function createTextStreamResponse({ status, statusText, headers, stream }) { return new Response(stream.pipeThrough(new TextEncoderStream()), { status: status != null ? status : 200, statusText, headers: prepareHeaders(headers, { "content-type": "text/plain; charset=utf-8" }) }); } function writeToServerResponse({ response, status, statusText, headers, stream }) { const statusCode = status != null ? status : 200; if (statusText !== void 0) response.writeHead(statusCode, statusText, headers); else response.writeHead(statusCode, headers); const reader = stream.getReader(); const read = async () => { try { while (true) { const { done, value } = await reader.read(); if (done) break; const canContinue = response.write(value); const flush = response.flush; if (typeof flush === "function") flush.call(response); if (!canContinue) await new Promise((resolve3) => { response.once("drain", resolve3); }); } } catch (error) { throw error; } finally { response.end(); } }; read(); } function pipeTextStreamToResponse({ response, status, statusText, headers, stream }) { writeToServerResponse({ response, status, statusText, headers: Object.fromEntries(prepareHeaders(headers, { "content-type": "text/plain; charset=utf-8" }).entries()), stream: stream.pipeThrough(new TextEncoderStream()) }); } function toTextStream({ stream }) { return stream.pipeThrough(new TransformStream({ transform(part, controller) { if (part.type === "text-delta") controller.enqueue(part.text); } })); } var JsonToSseTransformStream = class extends TransformStream { constructor() { super({ transform(part, controller) { controller.enqueue(`data: ${JSON.stringify(part)} `); }, flush(controller) { controller.enqueue("data: [DONE]\n\n"); } }); } }; var UI_MESSAGE_STREAM_HEADERS = { "content-type": "text/event-stream", "cache-control": "no-cache", connection: "keep-alive", "x-vercel-ai-ui-message-stream": "v1", "x-accel-buffering": "no" }; function createUIMessageStreamResponse({ status, statusText, headers, stream, consumeSseStream }) { let sseStream = stream.pipeThrough(new JsonToSseTransformStream()); if (consumeSseStream) { const [stream1, stream2] = sseStream.tee(); sseStream = stream1; consumeSseStream({ stream: stream2 }); } return new Response(sseStream.pipeThrough(new TextEncoderStream()), { status, statusText, headers: prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS) }); } function pipeUIMessageStreamToResponse({ response, status, statusText, headers, stream, consumeSseStream }) { let sseStream = stream.pipeThrough(new JsonToSseTransformStream()); if (consumeSseStream) { const [stream1, stream2] = sseStream.tee(); sseStream = stream1; consumeSseStream({ stream: stream2 }); } writeToServerResponse({ response, status, statusText, headers: Object.fromEntries(prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS).entries()), stream: sseStream.pipeThrough(new TextEncoderStream()) }); } function getResponseUIMessageId({ originalMessages, responseMessageId }) { if (originalMessages == null) return; const lastMessage = originalMessages[originalMessages.length - 1]; return (lastMessage == null ? void 0 : lastMessage.role) === "assistant" ? lastMessage.id : typeof responseMessageId === "function" ? responseMessageId() : responseMessageId; } var toolMetadataSchema = record(string(), jsonValueSchema.optional()); lazySchema(() => zodSchema(union([ strictObject({ type: literal("text-start"), id: string(), providerMetadata: providerMetadataSchema.optional() }), strictObject({ type: literal("text-delta"), id: string(), delta: string(), providerMetadata: providerMetadataSchema.optional() }), strictObject({ type: literal("text-end"), id: string(), providerMetadata: providerMetadataSchema.optional() }), strictObject({ type: literal("error"), errorText: string() }), strictObject({ type: literal("tool-input-start"), toolCallId: string(), toolName: string(), providerExecuted: boolean().optional(), providerMetadata: providerMetadataSchema.optional(), toolMetadata: toolMetadataSchema.optional(), dynamic: boolean().optional(), title: string().optional() }), strictObject({ type: literal("tool-input-delta"), toolCallId: string(), inputTextDelta: string() }), strictObject({ type: literal("tool-input-available"), toolCallId: string(), toolName: string(), input: unknown(), providerExecuted: boolean().optional(), providerMetadata: providerMetadataSchema.optional(), toolMetadata: toolMetadataSchema.optional(), dynamic: boolean().optional(), title: string().optional() }), strictObject({ type: literal("tool-input-error"), toolCallId: string(), toolName: string(), input: unknown(), providerExecuted: boolean().optional(), providerMetadata: providerMetadataSchema.optional(), toolMetadata: toolMetadataSchema.optional(), dynamic: boolean().optional(), errorText: string(), title: string().optional() }), strictObject({ type: literal("tool-approval-request"), approvalId: string(), toolCallId: string(), isAutomatic: boolean().optional(), signature: string().optional() }), strictObject({ type: literal("tool-approval-response"), approvalId: string(), approved: boolean(), reason: string().optional(), providerExecuted: boolean().optional(), providerMetadata: providerMetadataSchema.optional() }), strictObject({ type: literal("tool-output-available"), toolCallId: string(), output: unknown(), providerExecuted: boolean().optional(), providerMetadata: providerMetadataSchema.optional(), toolMetadata: toolMetadataSchema.optional(), dynamic: boolean().optional(), preliminary: boolean().optional() }), strictObject({ type: literal("tool-output-error"), toolCallId: string(), errorText: string(), providerExecuted: boolean().optional(), providerMetadata: providerMetadataSchema.optional(), toolMetadata: toolMetadataSchema.optional(), dynamic: boolean().optional() }), strictObject({ type: literal("tool-output-denied"), toolCallId: string() }), strictObject({ type: literal("reasoning-start"), id: string(), providerMetadata: providerMetadataSchema.optional() }), strictObject({ type: literal("reasoning-delta"), id: string(), delta: string(), providerMetadata: providerMetadataSchema.optional() }), strictObject({ type: literal("reasoning-end"), id: string(), providerMetadata: providerMetadataSchema.optional() }), strictObject({ type: literal("custom"), kind: string().transform((value) => value), providerMetadata: providerMetadataSchema.optional() }), strictObject({ type: literal("source-url"), sourceId: string(), url: string(), title: string().optional(), providerMetadata: providerMetadataSchema.optional() }), strictObject({ type: literal("source-document"), sourceId: string(), mediaType: string(), title: string(), filename: string().optional(), providerMetadata: providerMetadataSchema.optional() }), strictObject({ type: literal("file"), url: string(), mediaType: string(), providerMetadata: providerMetadataSchema.optional() }), strictObject({ type: literal("reasoning-file"), url: string(), mediaType: string(), providerMetadata: providerMetadataSchema.optional() }), strictObject({ type: custom((value) => typeof value === "string" && value.startsWith("data-"), { message: "Type must start with \"data-\"" }), id: string().optional(), data: unknown(), transient: boolean().optional() }), strictObject({ type: literal("start-step") }), strictObject({ type: literal("finish-step") }), strictObject({ type: literal("start"), messageId: string().optional(), messageMetadata: unknown().optional() }), strictObject({ type: literal("finish"), finishReason: _enum([ "stop", "length", "content-filter", "tool-calls", "error", "other" ]).optional(), messageMetadata: unknown().optional() }), strictObject({ type: literal("abort"), reason: string().optional() }), strictObject({ type: literal("message-metadata"), messageMetadata: unknown() }) ]))); function isDataUIMessageChunk(chunk) { return chunk.type.startsWith("data-"); } function createIdMap() { return /* @__PURE__ */ Object.create(null); } function isStaticToolUIPart(part) { return part.type.startsWith("tool-"); } function isDynamicToolUIPart(part) { return part.type === "dynamic-tool"; } function isToolUIPart(part) { return isStaticToolUIPart(part) || isDynamicToolUIPart(part); } function getStaticToolName(part) { return part.type.split("-").slice(1).join("-"); } function createStreamingUIMessageState({ lastMessage, messageId }) { return { message: (lastMessage == null ? void 0 : lastMessage.role) === "assistant" ? lastMessage : { id: messageId, metadata: void 0, role: "assistant", parts: [] }, activeTextParts: createIdMap(), activeReasoningParts: createIdMap(), partialToolCalls: createIdMap() }; } function processUIMessageStream({ stream, messageMetadataSchema, dataPartSchemas, runUpdateMessageJob, onError, onToolCall, onData }) { return stream.pipeThrough(new TransformStream({ async transform(chunk, controller) { await runUpdateMessageJob(async ({ state, write }) => { var _a22, _b, _c, _d; function getToolInvocation(toolCallId) { const toolInvocation = state.message.parts.filter(isToolUIPart).find((invocation) => invocation.toolCallId === toolCallId); if (toolInvocation == null) throw new UIMessageStreamError({ chunkType: "tool-invocation", chunkId: toolCallId, message: `No tool invocation found for tool call ID "${toolCallId}".` }); return toolInvocation; } function getToolInvocationByApprovalId(approvalId) { const toolInvocation = state.message.parts.filter(isToolUIPart).find((invocation) => { var _a23; return ((_a23 = invocation.approval) == null ? void 0 : _a23.id) === approvalId; }); if (toolInvocation == null) throw new UIMessageStreamError({ chunkType: "tool-approval-response", chunkId: approvalId, message: `No tool invocation found for approval ID "${approvalId}".` }); return toolInvocation; } function updateToolPart(options) { var _a23; const part = state.message.parts.find((part2) => isStaticToolUIPart(part2) && part2.toolCallId === options.toolCallId); const anyOptions = options; const anyPart = part; if (part != null) { part.state = options.state; anyPart.input = anyOptions.input; anyPart.output = anyOptions.output; anyPart.errorText = anyOptions.errorText; anyPart.rawInput = anyOptions.rawInput; anyPart.preliminary = anyOptions.preliminary; if (options.title !== void 0) anyPart.title = options.title; if (options.toolMetadata !== void 0) anyPart.toolMetadata = options.toolMetadata; anyPart.providerExecuted = (_a23 = anyOptions.providerExecuted) != null ? _a23 : part.providerExecuted; const providerMetadata = anyOptions.providerMetadata; if (providerMetadata != null) if (options.state === "output-available" || options.state === "output-error") { const resultPart = part; resultPart.resultProviderMetadata = providerMetadata; } else part.callProviderMetadata = providerMetadata; } else state.message.parts.push({ type: `tool-${options.toolName}`, toolCallId: options.toolCallId, state: options.state, title: options.title, ...options.toolMetadata !== void 0 ? { toolMetadata: options.toolMetadata } : {}, input: anyOptions.input, output: anyOptions.output, rawInput: anyOptions.rawInput, errorText: anyOptions.errorText, providerExecuted: anyOptions.providerExecuted, preliminary: anyOptions.preliminary, ...anyOptions.providerMetadata != null && (options.state === "output-available" || options.state === "output-error") ? { resultProviderMetadata: anyOptions.providerMetadata } : {}, ...anyOptions.providerMetadata != null && !(options.state === "output-available" || options.state === "output-error") ? { callProviderMetadata: anyOptions.providerMetadata } : {} }); } function updateDynamicToolPart(options) { var _a23, _b2; const part = state.message.parts.find((part2) => part2.type === "dynamic-tool" && part2.toolCallId === options.toolCallId); const anyOptions = options; const anyPart = part; if (part != null) { part.state = options.state; anyPart.toolName = options.toolName; anyPart.input = anyOptions.input; anyPart.output = anyOptions.output; anyPart.errorText = anyOptions.errorText; anyPart.rawInput = (_a23 = anyOptions.rawInput) != null ? _a23 : anyPart.rawInput; anyPart.preliminary = anyOptions.preliminary; if (options.title !== void 0) anyPart.title = options.title; if (options.toolMetadata !== void 0) anyPart.toolMetadata = options.toolMetadata; anyPart.providerExecuted = (_b2 = anyOptions.providerExecuted) != null ? _b2 : part.providerExecuted; const providerMetadata = anyOptions.providerMetadata; if (providerMetadata != null) if (options.state === "output-available" || options.state === "output-error") { const resultPart = part; resultPart.resultProviderMetadata = providerMetadata; } else part.callProviderMetadata = providerMetadata; } else state.message.parts.push({ type: "dynamic-tool", toolName: options.toolName, toolCallId: options.toolCallId, state: options.state, input: anyOptions.input, output: anyOptions.output, errorText: anyOptions.errorText, preliminary: anyOptions.preliminary, providerExecuted: anyOptions.providerExecuted, title: options.title, ...options.toolMetadata !== void 0 ? { toolMetadata: options.toolMetadata } : {}, ...anyOptions.providerMetadata != null && (options.state === "output-available" || options.state === "output-error") ? { resultProviderMetadata: anyOptions.providerMetadata } : {}, ...anyOptions.providerMetadata != null && !(options.state === "output-available" || options.state === "output-error") ? { callProviderMetadata: anyOptions.providerMetadata } : {} }); } async function updateMessageMetadata(metadata) { if (metadata != null) { const mergedMetadata = state.message.metadata != null ? mergeObjects(state.message.metadata, metadata) : metadata; if (messageMetadataSchema != null) await validateTypes({ value: mergedMetadata, schema: messageMetadataSchema, context: { field: "message.metadata", entityId: state.message.id } }); state.message.metadata = mergedMetadata; } } switch (chunk.type) { case "text-start": { const textPart = { type: "text", text: "", providerMetadata: chunk.providerMetadata, state: "streaming" }; state.activeTextParts[chunk.id] = textPart; state.message.parts.push(textPart); write(); break; } case "text-delta": { const textPart = state.activeTextParts[chunk.id]; if (textPart == null) throw new UIMessageStreamError({ chunkType: "text-delta", chunkId: chunk.id, message: `Received text-delta for missing text part with ID "${chunk.id}". Ensure a "text-start" chunk is sent before any "text-delta" chunks.` }); textPart.text += chunk.delta; textPart.providerMetadata = (_a22 = chunk.providerMetadata) != null ? _a22 : textPart.providerMetadata; write(); break; } case "text-end": { const textPart = state.activeTextParts[chunk.id]; if (textPart == null) throw new UIMessageStreamError({ chunkType: "text-end", chunkId: chunk.id, message: `Received text-end for missing text part with ID "${chunk.id}". Ensure a "text-start" chunk is sent before any "text-end" chunks.` }); textPart.state = "done"; textPart.providerMetadata = (_b = chunk.providerMetadata) != null ? _b : textPart.providerMetadata; delete state.activeTextParts[chunk.id]; write(); break; } case "custom": { const customPart = { type: "custom", kind: chunk.kind, providerMetadata: chunk.providerMetadata }; state.message.parts.push(customPart); write(); break; } case "reasoning-start": { const reasoningPart = { type: "reasoning", text: "", providerMetadata: chunk.providerMetadata, state: "streaming" }; state.activeReasoningParts[chunk.id] = reasoningPart; state.message.parts.push(reasoningPart); write(); break; } case "reasoning-delta": { const reasoningPart = state.activeReasoningParts[chunk.id]; if (reasoningPart == null) throw new UIMessageStreamError({ chunkType: "reasoning-delta", chunkId: chunk.id, message: `Received reasoning-delta for missing reasoning part with ID "${chunk.id}". Ensure a "reasoning-start" chunk is sent before any "reasoning-delta" chunks.` }); reasoningPart.text += chunk.delta; reasoningPart.providerMetadata = (_c = chunk.providerMetadata) != null ? _c : reasoningPart.providerMetadata; write(); break; } case "reasoning-end": { const reasoningPart = state.activeReasoningParts[chunk.id]; if (reasoningPart == null) throw new UIMessageStreamError({ chunkType: "reasoning-end", chunkId: chunk.id, message: `Received reasoning-end for missing reasoning part with ID "${chunk.id}". Ensure a "reasoning-start" chunk is sent before any "reasoning-end" chunks.` }); reasoningPart.providerMetadata = (_d = chunk.providerMetadata) != null ? _d : reasoningPart.providerMetadata; reasoningPart.state = "done"; delete state.activeReasoningParts[chunk.id]; write(); break; } case "file": case "reasoning-file": state.message.parts.push({ type: chunk.type, mediaType: chunk.mediaType, url: chunk.url, ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {} }); write(); break; case "source-url": state.message.parts.push({ type: "source-url", sourceId: chunk.sourceId, url: chunk.url, title: chunk.title, providerMetadata: chunk.providerMetadata }); write(); break; case "source-document": state.message.parts.push({ type: "source-document", sourceId: chunk.sourceId, mediaType: chunk.mediaType, title: chunk.title, filename: chunk.filename, providerMetadata: chunk.providerMetadata }); write(); break; case "tool-input-start": { const toolInvocations = state.message.parts.filter(isStaticToolUIPart); state.partialToolCalls[chunk.toolCallId] = { text: "", toolName: chunk.toolName, index: toolInvocations.length, dynamic: chunk.dynamic, title: chunk.title, toolMetadata: chunk.toolMetadata }; if (chunk.dynamic) updateDynamicToolPart({ toolCallId: chunk.toolCallId, toolName: chunk.toolName, state: "input-streaming", input: void 0, providerExecuted: chunk.providerExecuted, title: chunk.title, toolMetadata: chunk.toolMetadata, providerMetadata: chunk.providerMetadata }); else updateToolPart({ toolCallId: chunk.toolCallId, toolName: chunk.toolName, state: "input-streaming", input: void 0, providerExecuted: chunk.providerExecuted, title: chunk.title, toolMetadata: chunk.toolMetadata, providerMetadata: chunk.providerMetadata }); write(); break; } case "tool-input-delta": { const partialToolCall = state.partialToolCalls[chunk.toolCallId]; if (partialToolCall == null) throw new UIMessageStreamError({ chunkType: "tool-input-delta", chunkId: chunk.toolCallId, message: `Received tool-input-delta for missing tool call with ID "${chunk.toolCallId}". Ensure a "tool-input-start" chunk is sent before any "tool-input-delta" chunks.` }); partialToolCall.text += chunk.inputTextDelta; const { value: partialArgs } = await parsePartialJson(partialToolCall.text); if (partialToolCall.dynamic) updateDynamicToolPart({ toolCallId: chunk.toolCallId, toolName: partialToolCall.toolName, state: "input-streaming", input: partialArgs, title: partialToolCall.title, toolMetadata: partialToolCall.toolMetadata }); else updateToolPart({ toolCallId: chunk.toolCallId, toolName: partialToolCall.toolName, state: "input-streaming", input: partialArgs, title: partialToolCall.title, toolMetadata: partialToolCall.toolMetadata }); write(); break; } case "tool-input-available": if (chunk.dynamic) updateDynamicToolPart({ toolCallId: chunk.toolCallId, toolName: chunk.toolName, state: "input-available", input: chunk.input, providerExecuted: chunk.providerExecuted, providerMetadata: chunk.providerMetadata, title: chunk.title, toolMetadata: chunk.toolMetadata }); else updateToolPart({ toolCallId: chunk.toolCallId, toolName: chunk.toolName, state: "input-available", input: chunk.input, providerExecuted: chunk.providerExecuted, providerMetadata: chunk.providerMetadata, title: chunk.title, toolMetadata: chunk.toolMetadata }); write(); if (onToolCall && !chunk.providerExecuted) await onToolCall({ toolCall: chunk }); break; case "tool-input-error": { const existingPart = state.message.parts.filter(isToolUIPart).find((p) => p.toolCallId === chunk.toolCallId); if (existingPart != null ? existingPart.type === "dynamic-tool" : !!chunk.dynamic) updateDynamicToolPart({ toolCallId: chunk.toolCallId, toolName: chunk.toolName, state: "output-error", input: chunk.input, errorText: chunk.errorText, providerExecuted: chunk.providerExecuted, providerMetadata: chunk.providerMetadata, toolMetadata: chunk.toolMetadata }); else updateToolPart({ toolCallId: chunk.toolCallId, toolName: chunk.toolName, state: "output-error", input: void 0, rawInput: chunk.input, errorText: chunk.errorText, providerExecuted: chunk.providerExecuted, providerMetadata: chunk.providerMetadata, toolMetadata: chunk.toolMetadata }); write(); break; } case "tool-approval-request": { const toolInvocation = getToolInvocation(chunk.toolCallId); toolInvocation.state = "approval-requested"; toolInvocation.approval = { id: chunk.approvalId, ...chunk.isAutomatic === true ? { isAutomatic: true } : {}, ...chunk.signature != null ? { signature: chunk.signature } : {} }; write(); break; } case "tool-approval-response": { const toolInvocation = getToolInvocationByApprovalId(chunk.approvalId); const approval = toolInvocation.approval == null ? { id: chunk.approvalId } : toolInvocation.approval; toolInvocation.state = "approval-responded"; toolInvocation.approval = { id: chunk.approvalId, approved: chunk.approved, ...chunk.reason != null ? { reason: chunk.reason } : {}, ...approval.isAutomatic === true ? { isAutomatic: true } : {}, ...approval.signature != null ? { signature: approval.signature } : {} }; if (chunk.providerExecuted != null) toolInvocation.providerExecuted = chunk.providerExecuted; if (chunk.providerMetadata != null) toolInvocation.callProviderMetadata = chunk.providerMetadata; write(); break; } case "tool-output-denied": { const toolInvocation = getToolInvocation(chunk.toolCallId); toolInvocation.state = "output-denied"; write(); break; } case "tool-output-available": { const toolInvocation = getToolInvocation(chunk.toolCallId); if (toolInvocation.type === "dynamic-tool") updateDynamicToolPart({ toolCallId: chunk.toolCallId, toolName: toolInvocation.toolName, state: "output-available", input: toolInvocation.input, output: chunk.output, preliminary: chunk.preliminary, providerExecuted: chunk.providerExecuted, providerMetadata: chunk.providerMetadata, title: toolInvocation.title, toolMetadata: toolInvocation.toolMetadata }); else updateToolPart({ toolCallId: chunk.toolCallId, toolName: getStaticToolName(toolInvocation), state: "output-available", input: toolInvocation.input, output: chunk.output, providerExecuted: chunk.providerExecuted, preliminary: chunk.preliminary, providerMetadata: chunk.providerMetadata, title: toolInvocation.title, toolMetadata: toolInvocation.toolMetadata }); write(); break; } case "tool-output-error": { const toolInvocation = getToolInvocation(chunk.toolCallId); if (toolInvocation.type === "dynamic-tool") updateDynamicToolPart({ toolCallId: chunk.toolCallId, toolName: toolInvocation.toolName, state: "output-error", input: toolInvocation.input, errorText: chunk.errorText, providerExecuted: chunk.providerExecuted, providerMetadata: chunk.providerMetadata, title: toolInvocation.title, toolMetadata: toolInvocation.toolMetadata }); else updateToolPart({ toolCallId: chunk.toolCallId, toolName: getStaticToolName(toolInvocation), state: "output-error", input: toolInvocation.input, rawInput: toolInvocation.rawInput, errorText: chunk.errorText, providerExecuted: chunk.providerExecuted, providerMetadata: chunk.providerMetadata, title: toolInvocation.title, toolMetadata: toolInvocation.toolMetadata }); write(); break; } case "start-step": state.message.parts.push({ type: "step-start" }); break; case "finish-step": state.activeTextParts = createIdMap(); state.activeReasoningParts = createIdMap(); break; case "start": if (chunk.messageId != null) state.message.id = chunk.messageId; await updateMessageMetadata(chunk.messageMetadata); if (chunk.messageId != null || chunk.messageMetadata != null) write(); break; case "finish": if (chunk.finishReason != null) state.finishReason = chunk.finishReason; await updateMessageMetadata(chunk.messageMetadata); if (chunk.messageMetadata != null) write(); break; case "message-metadata": await updateMessageMetadata(chunk.messageMetadata); if (chunk.messageMetadata != null) write(); break; case "error": onError?.(new Error(chunk.errorText)); break; default: if (isDataUIMessageChunk(chunk)) { if ((dataPartSchemas == null ? void 0 : dataPartSchemas[chunk.type]) != null) { const partIdx = state.message.parts.findIndex((p) => "id" in p && "data" in p && p.id === chunk.id && p.type === chunk.type); const actualPartIdx = partIdx >= 0 ? partIdx : state.message.parts.length; await validateTypes({ value: chunk.data, schema: dataPartSchemas[chunk.type], context: { field: `message.parts[${actualPartIdx}].data`, entityName: chunk.type, entityId: chunk.id } }); } const dataChunk = chunk; if (dataChunk.transient) { onData?.(dataChunk); break; } const existingUIPart = dataChunk.id != null ? state.message.parts.find((chunkArg) => dataChunk.type === chunkArg.type && dataChunk.id === chunkArg.id) : void 0; if (existingUIPart != null) existingUIPart.data = dataChunk.data; else state.message.parts.push(dataChunk); onData?.(dataChunk); write(); } } controller.enqueue(chunk); }); } })); } function handleUIMessageStreamFinish({ messageId, originalMessages = [], onStepEnd, onStepFinish, onEnd, onFinish, onError, stream }) { let lastMessage = originalMessages == null ? void 0 : originalMessages[originalMessages.length - 1]; if ((lastMessage == null ? void 0 : lastMessage.role) !== "assistant") lastMessage = void 0; else messageId = lastMessage.id; let isAborted = false; const idInjectedStream = stream.pipeThrough(new TransformStream({ transform(chunk, controller) { if (chunk.type === "start") { const startChunk = chunk; if (startChunk.messageId == null && messageId != null) startChunk.messageId = messageId; } if (chunk.type === "abort") isAborted = true; controller.enqueue(chunk); } })); const resolvedOnStepEnd = onStepEnd != null ? onStepEnd : onStepFinish; const resolvedOnEnd = onEnd != null ? onEnd : onFinish; if (resolvedOnEnd == null && resolvedOnStepEnd == null) return idInjectedStream; const state = createStreamingUIMessageState({ lastMessage: lastMessage ? structuredClone(lastMessage) : void 0, messageId: messageId != null ? messageId : "" }); const runUpdateMessageJob = async (job) => { await job({ state, write: () => {} }); }; let finishCalled = false; const callOnEnd = async () => { if (finishCalled || !resolvedOnEnd) return; finishCalled = true; const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id); await resolvedOnEnd({ isAborted, isContinuation, responseMessage: state.message, messages: [...isContinuation ? originalMessages.slice(0, -1) : originalMessages, state.message], finishReason: state.finishReason }); }; const callOnStepFinish = async () => { if (!resolvedOnStepEnd) return; const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id); try { await resolvedOnStepEnd({ isContinuation, responseMessage: structuredClone(state.message), messages: [...isContinuation ? originalMessages.slice(0, -1) : originalMessages, structuredClone(state.message)] }); } catch (error) { onError(error); } }; return processUIMessageStream({ stream: idInjectedStream, runUpdateMessageJob, onError }).pipeThrough(new TransformStream({ async transform(chunk, controller) { if (chunk.type === "finish-step") await callOnStepFinish(); controller.enqueue(chunk); }, async cancel() { await callOnEnd(); }, async flush() { await callOnEnd(); } })); } function toUIMessageChunk(part, { tools, sendReasoning = true, sendSources = false, sendStart = true, sendFinish = true, onError = () => "An error occurred.", messageMetadata, responseMessageId } = {}) { const isDynamic = (toolPart) => { const tool2 = tools == null ? void 0 : tools[toolPart.toolName]; if (tool2 == null) return toolPart.dynamic; return (tool2 == null ? void 0 : tool2.type) === "dynamic" ? true : void 0; }; const partType = part.type; switch (partType) { case "text-start": return { type: "text-start", id: part.id, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {} }; case "text-delta": return { type: "text-delta", id: part.id, delta: part.text, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {} }; case "text-end": return { type: "text-end", id: part.id, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {} }; case "reasoning-start": case "reasoning-end": if (!sendReasoning) return; return { type: partType, id: part.id, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {} }; case "reasoning-delta": if (!sendReasoning) return; return { type: "reasoning-delta", id: part.id, delta: part.text, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {} }; case "file": case "reasoning-file": if (partType === "reasoning-file" && !sendReasoning) return; return { type: part.type, mediaType: part.file.mediaType, url: `data:${part.file.mediaType};base64,${part.file.base64}`, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {} }; case "source": if (!sendSources) return; if (part.sourceType === "url") return { type: "source-url", sourceId: part.id, url: part.url, title: part.title, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {} }; if (part.sourceType === "document") return { type: "source-document", sourceId: part.id, mediaType: part.mediaType, title: part.title, filename: part.filename, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {} }; return; case "custom": return { type: "custom", kind: part.kind, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {} }; case "tool-input-start": { const dynamic = isDynamic(part); return { type: "tool-input-start", toolCallId: part.id, toolName: part.toolName, ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {}, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}, ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {}, ...dynamic != null ? { dynamic } : {}, ...part.title != null ? { title: part.title } : {} }; } case "tool-input-delta": return { type: "tool-input-delta", toolCallId: part.id, inputTextDelta: part.delta }; case "tool-call": { const dynamic = isDynamic(part); if (part.invalid) return { type: "tool-input-error", toolCallId: part.toolCallId, toolName: part.toolName, input: part.input, ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {}, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}, ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {}, ...dynamic != null ? { dynamic } : {}, errorText: onError(part.error), ...part.title != null ? { title: part.title } : {} }; return { type: "tool-input-available", toolCallId: part.toolCallId, toolName: part.toolName, input: part.input, ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {}, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}, ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {}, ...dynamic != null ? { dynamic } : {}, ...part.title != null ? { title: part.title } : {} }; } case "tool-approval-request": return { type: "tool-approval-request", approvalId: part.approvalId, toolCallId: part.toolCall.toolCallId, ...part.isAutomatic != null ? { isAutomatic: part.isAutomatic } : {}, ...part.signature != null ? { signature: part.signature } : {} }; case "tool-approval-response": return { type: "tool-approval-response", approvalId: part.approvalId, approved: part.approved, ...part.reason != null ? { reason: part.reason } : {}, ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {} }; case "tool-result": { const dynamic = isDynamic(part); return { type: "tool-output-available", toolCallId: part.toolCallId, output: part.output === void 0 ? null : part.output, ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {}, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}, ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {}, ...part.preliminary != null ? { preliminary: part.preliminary } : {}, ...dynamic != null ? { dynamic } : {} }; } case "tool-error": { const dynamic = isDynamic(part); return { type: "tool-output-error", toolCallId: part.toolCallId, errorText: part.providerExecuted ? typeof part.error === "string" ? part.error : JSON.stringify(part.error) : onError(part.error), ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {}, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}, ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {}, ...dynamic != null ? { dynamic } : {} }; } case "tool-output-denied": return { type: "tool-output-denied", toolCallId: part.toolCallId }; case "error": return { type: "error", errorText: onError(part.error) }; case "start-step": return { type: "start-step" }; case "finish-step": return { type: "finish-step" }; case "start": if (!sendStart) return; return { type: "start", ...messageMetadata != null ? { messageMetadata } : {}, ...responseMessageId != null ? { messageId: responseMessageId } : {} }; case "finish": if (!sendFinish) return; return { type: "finish", finishReason: part.finishReason, ...messageMetadata != null ? { messageMetadata } : {} }; case "abort": return part; case "tool-input-end": case "raw": return; default: throw new Error(`Unknown chunk type: ${partType}`); } } function toUIMessageStream({ stream, tools, sendReasoning = true, sendSources = false, sendStart = true, sendFinish = true, onError = () => "An error occurred.", messageMetadata, originalMessages, generateMessageId, onEnd, onFinish }) { const responseMessageId = generateMessageId != null ? getResponseUIMessageId({ originalMessages, responseMessageId: generateMessageId }) : void 0; return handleUIMessageStreamFinish({ stream: stream.pipeThrough(new TransformStream({ transform: async (part, controller) => { const messageMetadataValue = messageMetadata == null ? void 0 : messageMetadata({ part }); const uiMessageChunk = toUIMessageChunk(part, { tools, sendReasoning, sendSources, sendStart, sendFinish, onError, messageMetadata: messageMetadataValue, responseMessageId }); if (uiMessageChunk != null) controller.enqueue(uiMessageChunk); if (messageMetadataValue != null && part.type !== "start" && part.type !== "finish") controller.enqueue({ type: "message-metadata", messageMetadata: messageMetadataValue }); } })), messageId: responseMessageId != null ? responseMessageId : generateMessageId == null ? void 0 : generateMessageId(), originalMessages, onEnd: onEnd != null ? onEnd : onFinish, onError }); } function createAsyncIterableStream(source) { return asAsyncIterableStream(source.pipeThrough(new TransformStream())); } function asAsyncIterableStream(stream) { stream[Symbol.asyncIterator] = function() { const reader = this.getReader(); let finished = false; async function cleanup(cancelStream) { var _a22; if (finished) return; finished = true; try { if (cancelStream) await ((_a22 = reader.cancel) == null ? void 0 : _a22.call(reader)); } finally { try { reader.releaseLock(); } catch (e) {} } } return { /** * Reads the next chunk from the stream. * @returns A promise resolving to the next IteratorResult. */ async next() { if (finished) return { done: true, value: void 0 }; const { done, value } = await reader.read(); if (done) { await cleanup(true); return { done: true, value: void 0 }; } return { done: false, value }; }, /** * May be called on early exit (e.g., break from for-await) or after completion. * Ensures the stream is cancelled and resources are released. * @returns A promise resolving to a completed IteratorResult. */ async return() { await cleanup(true); return { done: true, value: void 0 }; }, /** * Called on early exit with error. * Ensures the stream is cancelled and resources are released, then rethrows the error. * @param err The error to throw. * @returns A promise that rejects with the provided error. */ async throw(err) { await cleanup(true); throw err; } }; }; return stream; } async function consumeStream({ stream, onError }) { const reader = stream.getReader(); try { while (true) { const { done } = await reader.read(); if (done) break; } } catch (error) { onError?.(error); } finally { reader.releaseLock(); } } function createResolvablePromise() { let resolve3; let reject; return { promise: new Promise((res, rej) => { resolve3 = res; reject = rej; }), resolve: resolve3, reject }; } function createStitchableStream() { let innerStreamReaders = []; let controller = null; let isClosed = false; let waitForNewStream = createResolvablePromise(); const terminate = () => { isClosed = true; waitForNewStream.resolve(); innerStreamReaders.forEach((reader) => reader.cancel()); innerStreamReaders = []; controller?.close(); }; const processPull = async () => { if (isClosed && innerStreamReaders.length === 0) { controller?.close(); return; } if (innerStreamReaders.length === 0) { waitForNewStream = createResolvablePromise(); await waitForNewStream.promise; return await processPull(); } try { const { value, done } = await innerStreamReaders[0].read(); if (done) { innerStreamReaders.shift(); if (innerStreamReaders.length === 0 && isClosed) controller?.close(); else await processPull(); } else controller?.enqueue(value); } catch (error) { controller?.error(error); innerStreamReaders.shift(); terminate(); } }; 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?.close(); }, /** * Immediately close the outer stream. This will cancel all inner streams * and close the outer stream. */ terminate }; } function executeToolsFromStream({ stream, tools, callId, messages, abortSignal, timeout, experimental_sandbox: sandbox, toolsContext, toolApproval, runtimeContext, toolApprovalSecret, generateId: generateId2, onToolExecutionStart, onToolExecutionEnd, executeToolInTelemetryContext, runInTracingChannelSpan }) { const toolCallsToExecute = []; return stream.pipeThrough(new TransformStream({ async transform(chunk, controller) { controller.enqueue(chunk); switch (chunk.type) { case "tool-call": { if (chunk.invalid) return; const tool2 = getOwn(tools, chunk.toolName); if (tool2 == null) return; const toolApprovalStatus = await resolveToolApproval({ tools, toolCall: chunk, toolApproval, messages, toolsContext, runtimeContext }); if (toolApprovalStatus.type === "not-applicable") { if (tool2.execute != null && chunk.providerExecuted !== true) toolCallsToExecute.push(chunk); return; } const approvalId = generateId2(); const signature = await maybeSignApproval({ secret: toolApprovalSecret, approvalId, toolCallId: chunk.toolCallId, toolName: chunk.toolName, input: chunk.input }); switch (toolApprovalStatus.type) { case "user-approval": controller.enqueue({ type: "tool-approval-request", approvalId, toolCall: chunk, ...signature != null ? { signature } : {} }); return; case "denied": controller.enqueue({ type: "tool-approval-request", approvalId, toolCall: chunk, isAutomatic: true, ...signature != null ? { signature } : {} }); controller.enqueue({ type: "tool-approval-response", approvalId, approved: false, toolCall: chunk, reason: toolApprovalStatus.reason, providerExecuted: chunk.providerExecuted }); return; case "approved": controller.enqueue({ type: "tool-approval-request", approvalId, toolCall: chunk, isAutomatic: true, ...signature != null ? { signature } : {} }); controller.enqueue({ type: "tool-approval-response", approvalId, approved: true, toolCall: chunk, reason: toolApprovalStatus.reason, providerExecuted: chunk.providerExecuted }); break; } if (tool2.execute != null && chunk.providerExecuted !== true) toolCallsToExecute.push(chunk); return; } case "model-call-end": await Promise.all(toolCallsToExecute.map(async (toolCall) => { try { const result = await executeToolCall({ toolCall, tools, callId, messages, abortSignal, timeout, experimental_sandbox: sandbox, toolsContext, onToolExecutionStart, onToolExecutionEnd, executeToolInTelemetryContext, runInTracingChannelSpan, onPreliminaryToolResult: (result2) => { controller.enqueue(result2); } }); if (result != null) { controller.enqueue({ type: "tool-execution-end", toolCallId: result.output.toolCallId, toolExecutionMs: result.toolExecutionMs }); controller.enqueue(result.output); } } catch (error) { controller.enqueue({ type: "error", error }); } })); return; } } })); } function invokeToolCallbacksFromStream({ stream, tools, stepInputMessages, abortSignal, runtimeContext }) { if (tools == null) return stream; const ongoingToolCallToolNames = createIdMap(); return stream.pipeThrough(new TransformStream({ async transform(chunk, controller) { controller.enqueue(chunk); switch (chunk.type) { case "tool-input-start": { ongoingToolCallToolNames[chunk.id] = chunk.toolName; const tool2 = getOwn(tools, chunk.toolName); if ((tool2 == null ? void 0 : tool2.onInputStart) != null) await tool2.onInputStart({ toolCallId: chunk.id, messages: stepInputMessages, abortSignal, context: runtimeContext }); break; } case "tool-input-delta": { const toolName = ongoingToolCallToolNames[chunk.id]; const tool2 = getOwn(tools, toolName); if ((tool2 == null ? void 0 : tool2.onInputDelta) != null) await tool2.onInputDelta({ inputTextDelta: chunk.delta, toolCallId: chunk.id, messages: stepInputMessages, abortSignal, context: runtimeContext }); break; } case "tool-call": { const toolName = ongoingToolCallToolNames[chunk.toolCallId]; const tool2 = getOwn(tools, toolName); delete ongoingToolCallToolNames[chunk.toolCallId]; if ((tool2 == null ? void 0 : tool2.onInputAvailable) != null) await tool2.onInputAvailable({ input: chunk.input, toolCallId: chunk.toolCallId, messages: stepInputMessages, abortSignal, context: runtimeContext }); } } } })); } var originalGenerateId2 = createIdGenerator({ prefix: "aitxt", size: 24 }); var originalGenerateCallId2 = createIdGenerator({ prefix: "call", size: 24 }); async function streamLanguageModelCall({ model, tools, toolOrder, output, toolChoice, prompt, system, instructions, messages, allowSystemInMessages, download: download2, abortSignal, headers, includeRawChunks, providerOptions, repairToolCall, refineToolInput, executeLanguageModelCallInTelemetryContext = async ({ execute }) => await execute(), callId, toolsContext, experimental_sandbox: sandbox, _internal: { generateId: generateId2 = originalGenerateId2, generateCallId = originalGenerateCallId2, now: now2 = now } = {}, onStart, onLanguageModelCallStart, onLanguageModelCallEnd, ...callSettings }) { const resolvedModel = resolveLanguageModel(model); const effectiveCallId = callId != null ? callId : generateCallId(); const standardizedPrompt = await standardizePrompt({ instructions, system, prompt, messages, allowSystemInMessages }); const promptMessages = await convertToLanguageModelPrompt({ prompt: { instructions: standardizedPrompt.instructions, messages: standardizedPrompt.messages }, supportedUrls: await resolvedModel.supportedUrls, download: download2, provider: resolvedModel.provider.split(".")[0] }); const stepTools = await prepareTools({ tools, toolOrder, toolsContext, experimental_sandbox: sandbox }); const stepToolChoice = prepareToolChoice({ toolChoice }); await notify({ event: { promptMessages }, callbacks: onStart }); const languageModelCallStartEvent = { callId: effectiveCallId, provider: resolvedModel.provider, modelId: resolvedModel.modelId, instructions: standardizedPrompt.instructions, messages: standardizedPrompt.messages, tools: stepTools, ...callSettings }; await notify({ event: languageModelCallStartEvent, callbacks: onLanguageModelCallStart }); const callStartTimestampMs = now2(); const { stream: languageModelStream, response, request } = await executeLanguageModelCallInTelemetryContext({ ...languageModelCallStartEvent, execute: async () => await resolvedModel.doStream({ ...callSettings, tools: stepTools, toolChoice: stepToolChoice, responseFormat: await (output == null ? void 0 : output.responseFormat), prompt: promptMessages, providerOptions, abortSignal, headers, includeRawChunks }) }); return { stream: createAsyncIterableStream(languageModelStream.pipeThrough(createLanguageModelV4StreamPartToLanguageModelStreamPartTransform({ tools, instructions: standardizedPrompt.instructions, messages: standardizedPrompt.messages, repairToolCall, refineToolInput, callId: effectiveCallId, provider: resolvedModel.provider, modelId: resolvedModel.modelId, generateId: generateId2, now: now2, callStartTimestampMs, onLanguageModelCallEnd }))), response, request }; } function createLanguageModelV4StreamPartToLanguageModelStreamPartTransform({ tools, instructions, messages, repairToolCall, refineToolInput, callId, provider, modelId, generateId: generateId2, now: now2, callStartTimestampMs, onLanguageModelCallEnd }) { const toolCallsByToolCallId = /* @__PURE__ */ new Map(); const modelCallContent = []; const textPartIndexes = /* @__PURE__ */ new Map(); const reasoningPartIndexes = /* @__PURE__ */ new Map(); let responseId = generateId2(); let timeToFirstOutputMs; let previousOutputChunkTimestampMs; const timeBetweenOutputChunksMs = []; return new TransformStream({ async transform(chunk, controller) { var _a22, _b; if (isOutputChunk(chunk)) { const outputChunkTimestampMs = now2(); if (timeToFirstOutputMs == null) timeToFirstOutputMs = outputChunkTimestampMs - callStartTimestampMs; else if (previousOutputChunkTimestampMs != null) timeBetweenOutputChunksMs.push(outputChunkTimestampMs - previousOutputChunkTimestampMs); previousOutputChunkTimestampMs = outputChunkTimestampMs; } switch (chunk.type) { case "text-start": upsertTextContentPart({ content: modelCallContent, partIndexes: textPartIndexes, id: chunk.id, type: "text", providerMetadata: chunk.providerMetadata }); controller.enqueue(chunk); break; case "text-delta": upsertTextContentPart({ content: modelCallContent, partIndexes: textPartIndexes, id: chunk.id, type: "text", textDelta: chunk.delta, providerMetadata: chunk.providerMetadata }); controller.enqueue({ type: "text-delta", id: chunk.id, text: chunk.delta, providerMetadata: chunk.providerMetadata }); break; case "text-end": upsertTextContentPart({ content: modelCallContent, partIndexes: textPartIndexes, id: chunk.id, type: "text", providerMetadata: chunk.providerMetadata }); textPartIndexes.delete(chunk.id); controller.enqueue(chunk); break; case "reasoning-start": upsertTextContentPart({ content: modelCallContent, partIndexes: reasoningPartIndexes, id: chunk.id, type: "reasoning", providerMetadata: chunk.providerMetadata }); controller.enqueue(chunk); break; case "reasoning-delta": upsertTextContentPart({ content: modelCallContent, partIndexes: reasoningPartIndexes, id: chunk.id, type: "reasoning", textDelta: chunk.delta, providerMetadata: chunk.providerMetadata }); controller.enqueue({ type: "reasoning-delta", id: chunk.id, text: chunk.delta, providerMetadata: chunk.providerMetadata }); break; case "reasoning-end": upsertTextContentPart({ content: modelCallContent, partIndexes: reasoningPartIndexes, id: chunk.id, type: "reasoning", providerMetadata: chunk.providerMetadata }); reasoningPartIndexes.delete(chunk.id); controller.enqueue(chunk); break; case "file": case "reasoning-file": { const file = new DefaultGeneratedFileWithType({ data: chunk.data.type === "data" ? chunk.data.data : chunk.data.url.toString(), mediaType: chunk.mediaType }); modelCallContent.push({ type: chunk.type, file, ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {} }); controller.enqueue({ type: chunk.type, file, providerMetadata: chunk.providerMetadata }); break; } case "finish": { const usage = asLanguageModelUsage(chunk.usage); const responseTimeMs = now2() - callStartTimestampMs; const performance = { responseTimeMs, effectiveOutputTokensPerSecond: calculateTokensPerSecond({ tokens: usage.outputTokens, durationMs: responseTimeMs }), outputTokensPerSecond: timeToFirstOutputMs == null ? void 0 : calculateTokensPerSecond({ tokens: usage.outputTokens, durationMs: responseTimeMs - timeToFirstOutputMs }), inputTokensPerSecond: timeToFirstOutputMs == null ? void 0 : calculateTokensPerSecond({ tokens: usage.inputTokens, durationMs: timeToFirstOutputMs }), effectiveTotalTokensPerSecond: calculateTokensPerSecond({ tokens: sumTokenCounts(usage.inputTokens, usage.outputTokens), durationMs: responseTimeMs }), timeToFirstOutputMs, timeBetweenOutputChunksMs: timeBetweenOutputChunksMs.length > 0 ? calculateOutputChunkTimingStats(timeBetweenOutputChunksMs) : void 0 }; await notify({ event: { callId, provider, modelId, finishReason: chunk.finishReason.unified, usage, content: modelCallContent, responseId, performance }, callbacks: onLanguageModelCallEnd }); controller.enqueue({ type: "model-call-end", finishReason: chunk.finishReason.unified, rawFinishReason: chunk.finishReason.raw, usage, providerMetadata: chunk.providerMetadata, performance }); break; } case "tool-call": try { const toolCall = await parseToolCall({ toolCall: chunk, tools, repairToolCall, refineToolInput, instructions, messages }); toolCallsByToolCallId.set(toolCall.toolCallId, toolCall); controller.enqueue(toolCall); modelCallContent.push(toolCall); if (toolCall.invalid) { controller.enqueue({ type: "tool-error", toolCallId: toolCall.toolCallId, toolName: toolCall.toolName, input: toolCall.input, error: getErrorMessage(toolCall.error), dynamic: true, title: toolCall.title, ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {} }); break; } } catch (error) { controller.enqueue({ type: "error", error }); } break; case "tool-approval-request": { const toolCall = toolCallsByToolCallId.get(chunk.toolCallId); if (toolCall == null) { controller.enqueue({ type: "error", error: new ToolCallNotFoundForApprovalError({ toolCallId: chunk.toolCallId, approvalId: chunk.approvalId }) }); break; } const toolApprovalRequest = { type: "tool-approval-request", approvalId: chunk.approvalId, toolCall }; controller.enqueue(toolApprovalRequest); modelCallContent.push(toolApprovalRequest); break; } case "tool-result": { const toolName = chunk.toolName; const toolCall = toolCallsByToolCallId.get(chunk.toolCallId); const toolResultPart = chunk.isError ? { type: "tool-error", toolCallId: chunk.toolCallId, toolName, input: toolCall == null ? void 0 : toolCall.input, providerExecuted: true, error: chunk.result, dynamic: chunk.dynamic, ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}, ...(toolCall == null ? void 0 : toolCall.toolMetadata) != null ? { toolMetadata: toolCall.toolMetadata } : {} } : { type: "tool-result", toolCallId: chunk.toolCallId, toolName, input: toolCall == null ? void 0 : toolCall.input, output: chunk.result, providerExecuted: true, dynamic: chunk.dynamic, ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}, ...(toolCall == null ? void 0 : toolCall.toolMetadata) != null ? { toolMetadata: toolCall.toolMetadata } : {} }; controller.enqueue(toolResultPart); modelCallContent.push(toolResultPart); break; } case "tool-input-start": { const tool2 = getOwn(tools, chunk.toolName); controller.enqueue({ ...chunk, dynamic: (_a22 = chunk.dynamic) != null ? _a22 : (tool2 == null ? void 0 : tool2.type) === "dynamic", title: tool2 == null ? void 0 : tool2.title, ...(tool2 == null ? void 0 : tool2.metadata) != null ? { toolMetadata: tool2.metadata } : {} }); break; } case "stream-start": controller.enqueue({ type: "model-call-start", warnings: chunk.warnings }); break; case "response-metadata": responseId = (_b = chunk.id) != null ? _b : responseId; controller.enqueue({ type: "model-call-response-metadata", id: chunk.id, timestamp: chunk.timestamp, modelId: chunk.modelId }); break; default: if (chunk.type === "custom" || chunk.type === "source") modelCallContent.push(chunk); controller.enqueue(chunk); break; } } }); } function isOutputChunk(chunk) { return chunk.type === "text-delta" && chunk.delta.length > 0 || chunk.type === "reasoning-delta" && chunk.delta.length > 0 || chunk.type === "tool-input-delta" && chunk.delta.length > 0 || chunk.type === "file" || chunk.type === "reasoning-file" || chunk.type === "tool-call"; } function calculateOutputChunkTimingStats(timingsMs) { const sortedTimingsMs = [...timingsMs].sort((a, b) => a - b); const sum = timingsMs.reduce((sum2, timingMs) => sum2 + timingMs, 0); return { min: sortedTimingsMs[0], p10: calculateNearestRankPercentile(sortedTimingsMs, .1), median: calculateNearestRankPercentile(sortedTimingsMs, .5), avg: sum / timingsMs.length, p90: calculateNearestRankPercentile(sortedTimingsMs, .9), max: sortedTimingsMs[sortedTimingsMs.length - 1] }; } function calculateNearestRankPercentile(sortedValues, percentile) { return sortedValues[Math.ceil(percentile * sortedValues.length) - 1]; } function upsertTextContentPart({ content, partIndexes, id, type, textDelta, providerMetadata }) { let partIndex = partIndexes.get(id); if (partIndex == null) { partIndex = content.push({ type, text: "", ...providerMetadata != null ? { providerMetadata } : {} }) - 1; partIndexes.set(id, partIndex); } const part = content[partIndex]; if (textDelta != null) part.text += textDelta; if (providerMetadata != null) part.providerMetadata = providerMetadata; } var originalGenerateId3 = createIdGenerator({ prefix: "aitxt", size: 24 }); var originalGenerateCallId3 = createIdGenerator({ prefix: "call", size: 24 }); var isOutputChunkType = { file: true, custom: true, source: true, "text-start": true, "text-end": true, "text-delta": true, "reasoning-start": true, "reasoning-end": true, "reasoning-delta": true, "reasoning-file": true, "tool-input-start": true, "tool-input-end": true, "tool-input-delta": true, "tool-approval-request": true, "tool-approval-response": true, "tool-call": true, "tool-result": true, "tool-error": true, "tool-execution-end": false, "model-call-start": false, "model-call-response-metadata": false, "model-call-end": false, error: false, raw: false }; function streamText({ model, tools, toolChoice, instructions, system, prompt, messages, allowSystemInMessages, maxRetries, abortSignal, timeout, headers, stopWhen = isStepCount(1), experimental_sandbox: sandbox, output, toolApproval, experimental_toolApprovalSecret, experimental_telemetry, telemetry = experimental_telemetry, prepareStep, providerOptions, activeTools, toolOrder, experimental_repairToolCall, repairToolCall = experimental_repairToolCall, experimental_refineToolInput: refineToolInput, experimental_transform: transform, experimental_download: download2, includeRawChunks, onChunk, onError = ({ error }) => { console.error(error); }, onFinish, onEnd = onFinish, onAbort, onStepEnd, onStepFinish, onStart, experimental_onStart, onStepStart, experimental_onStepStart, onLanguageModelCallStart, experimental_onLanguageModelCallStart, onLanguageModelCallEnd, experimental_onLanguageModelCallEnd, onToolExecutionStart, onToolExecutionEnd, experimental_onToolCallStart, experimental_onToolCallFinish, runtimeContext = {}, toolsContext = {}, experimental_include, include = experimental_include, _internal: { now: now2 = now, generateId: generateId2 = originalGenerateId3, generateCallId = originalGenerateCallId3 } = {}, ...settings }) { var _a22, _b, _c, _d; const totalTimeoutMs = getTotalTimeoutMs(timeout); const stepTimeoutMs = getStepTimeoutMs(timeout); const chunkTimeoutMs = getChunkTimeoutMs(timeout); const stepAbortController = stepTimeoutMs != null ? new AbortController() : void 0; const chunkAbortController = chunkTimeoutMs != null ? new AbortController() : void 0; const resolvedOnStart = onStart != null ? onStart : experimental_onStart; const resolvedOnStepStart = onStepStart != null ? onStepStart : experimental_onStepStart; const resolvedOnLanguageModelCallStart = onLanguageModelCallStart != null ? onLanguageModelCallStart : experimental_onLanguageModelCallStart; const resolvedOnLanguageModelCallEnd = onLanguageModelCallEnd != null ? onLanguageModelCallEnd : experimental_onLanguageModelCallEnd; const resolvedOnToolExecutionStart = onToolExecutionStart != null ? onToolExecutionStart : experimental_onToolCallStart; const resolvedOnToolExecutionEnd = onToolExecutionEnd != null ? onToolExecutionEnd : experimental_onToolCallFinish; const resolvedOnStepEnd = onStepEnd != null ? onStepEnd : onStepFinish; return new DefaultStreamTextResult({ model: resolveLanguageModel(model), telemetry, headers, settings, maxRetries, abortSignal: mergeAbortSignals(abortSignal, totalTimeoutMs, stepAbortController == null ? void 0 : stepAbortController.signal, chunkAbortController == null ? void 0 : chunkAbortController.signal), stepTimeoutMs, stepAbortController, chunkTimeoutMs, chunkAbortController, instructions, system, prompt, messages, allowSystemInMessages, experimental_sandbox: sandbox, tools, toolsContext, runtimeContext, toolChoice, transforms: asArray(transform), activeTools, toolOrder, repairToolCall, refineToolInput, stopConditions: asArray(stopWhen), output, toolApproval, experimental_toolApprovalSecret, providerOptions, prepareStep, timeout, onChunk, onError, onEnd, onAbort, onStepFinish: resolvedOnStepEnd, onStart: resolvedOnStart, onStepStart: resolvedOnStepStart, onLanguageModelCallStart: resolvedOnLanguageModelCallStart, onLanguageModelCallEnd: resolvedOnLanguageModelCallEnd, onToolExecutionStart: resolvedOnToolExecutionStart, onToolExecutionEnd: resolvedOnToolExecutionEnd, now: now2, generateId: generateId2, generateCallId, download: download2, include: { requestBody: (_a22 = include == null ? void 0 : include.requestBody) != null ? _a22 : false, requestMessages: (_b = include == null ? void 0 : include.requestMessages) != null ? _b : false, rawChunks: (_d = (_c = include == null ? void 0 : include.rawChunks) != null ? _c : includeRawChunks) != null ? _d : false } }); } async function markPromiseAsHandled(promise) { try { await promise; } catch (e) {} } function createOutputTransformStream(output) { let firstTextChunkId = void 0; let text2 = ""; let textChunk = ""; let textProviderMetadata = void 0; let lastPublishedValue = ""; function publishTextChunk({ controller, partialOutput = void 0 }) { controller.enqueue({ part: { type: "text-delta", id: firstTextChunkId, text: textChunk, providerMetadata: textProviderMetadata }, partialOutput }); textChunk = ""; } return new TransformStream({ async transform(chunk, controller) { var _a22; if (chunk.type === "finish-step" && textChunk.length > 0) publishTextChunk({ controller }); if (chunk.type !== "text-delta" && chunk.type !== "text-start" && chunk.type !== "text-end") { controller.enqueue({ part: chunk, partialOutput: void 0 }); return; } if (firstTextChunkId == null) firstTextChunkId = chunk.id; else if (chunk.id !== firstTextChunkId) { controller.enqueue({ part: chunk, partialOutput: void 0 }); return; } if (chunk.type === "text-start") { controller.enqueue({ part: chunk, partialOutput: void 0 }); return; } if (chunk.type === "text-end") { if (textChunk.length > 0) publishTextChunk({ controller }); controller.enqueue({ part: chunk, partialOutput: void 0 }); return; } text2 += chunk.text; textChunk += chunk.text; textProviderMetadata = (_a22 = chunk.providerMetadata) != null ? _a22 : textProviderMetadata; const result = await output.parsePartialOutput({ text: text2 }); if (result !== void 0) { const currentValue = typeof result.partial === "string" ? result.partial : JSON.stringify(result.partial); if (currentValue !== lastPublishedValue) { publishTextChunk({ controller, partialOutput: result.partial }); lastPublishedValue = currentValue; } } } }); } var DefaultStreamTextResult = class { constructor({ model, telemetry, headers, settings, maxRetries: maxRetriesArg, abortSignal, stepTimeoutMs, stepAbortController, chunkTimeoutMs, chunkAbortController, instructions, system, prompt, messages, allowSystemInMessages, experimental_sandbox: sandbox, tools, toolChoice, transforms, activeTools, toolOrder, repairToolCall, refineToolInput, stopConditions, output, toolApproval, experimental_toolApprovalSecret, providerOptions, prepareStep, now: now2, generateId: generateId2, generateCallId, timeout, onChunk, onError, onEnd, onAbort, onStepFinish, onStart, onStepStart, onLanguageModelCallStart, onLanguageModelCallEnd, onToolExecutionStart, onToolExecutionEnd, runtimeContext, toolsContext, download: download2, include }) { this._totalUsage = new DelayedPromise(); this._finishReason = new DelayedPromise(); this._rawFinishReason = new DelayedPromise(); this._steps = new DelayedPromise(); this._initialResponseMessages = new DelayedPromise(); this.outputSpecification = output; this.tools = tools; const telemetryDispatcher = createRestrictedTelemetryDispatcher({ telemetry, includeRuntimeContext: telemetry == null ? void 0 : telemetry.includeRuntimeContext, includeToolsContext: telemetry == null ? void 0 : telemetry.includeToolsContext }); let stepFinish; let recordedContent = []; let recordedFinishReason = void 0; let recordedRawFinishReason = void 0; let recordedTotalUsage = void 0; let recordedRequest = {}; let recordedRequestMessages = []; let recordedWarnings = []; const recordedSteps = []; const initialResponseMessages = []; let stepMessagesForNextStep; let currentStepMessages = []; const pendingDeferredToolCalls = /* @__PURE__ */ new Map(); let activeTextContent = createIdMap(); let activeReasoningContent = createIdMap(); let recordedNoOutputError; const eventProcessor = new TransformStream({ async transform(chunk, controller) { var _a22, _b, _c, _d; controller.enqueue(chunk); const { part } = chunk; await (onChunk == null ? void 0 : onChunk({ chunk: part })); if (part.type === "error") { const error = wrapGatewayError(part.error); if (NoOutputGeneratedError.isInstance(error)) recordedNoOutputError = error; await onError({ error }); } if (part.type === "custom" || part.type === "source" || part.type === "tool-call" || part.type === "tool-approval-request" || part.type === "tool-approval-response" || part.type === "tool-error") recordedContent.push(part); if (part.type === "text-start") { activeTextContent[part.id] = { type: "text", text: "", providerMetadata: part.providerMetadata }; recordedContent.push(activeTextContent[part.id]); } if (part.type === "text-delta") { const activeText = activeTextContent[part.id]; if (activeText == null) { controller.enqueue({ part: { type: "error", error: `text part ${part.id} not found` }, partialOutput: void 0 }); return; } activeText.text += part.text; activeText.providerMetadata = (_a22 = part.providerMetadata) != null ? _a22 : activeText.providerMetadata; } if (part.type === "text-end") { const activeText = activeTextContent[part.id]; if (activeText == null) { controller.enqueue({ part: { type: "error", error: `text part ${part.id} not found` }, partialOutput: void 0 }); return; } activeText.providerMetadata = (_b = part.providerMetadata) != null ? _b : activeText.providerMetadata; delete activeTextContent[part.id]; } if (part.type === "reasoning-start") { activeReasoningContent[part.id] = { type: "reasoning", text: "", providerMetadata: part.providerMetadata }; recordedContent.push(activeReasoningContent[part.id]); } if (part.type === "reasoning-delta") { const activeReasoning = activeReasoningContent[part.id]; if (activeReasoning == null) { controller.enqueue({ part: { type: "error", error: `reasoning part ${part.id} not found` }, partialOutput: void 0 }); return; } activeReasoning.text += part.text; activeReasoning.providerMetadata = (_c = part.providerMetadata) != null ? _c : activeReasoning.providerMetadata; } if (part.type === "reasoning-end") { const activeReasoning = activeReasoningContent[part.id]; if (activeReasoning == null) { controller.enqueue({ part: { type: "error", error: `reasoning part ${part.id} not found` }, partialOutput: void 0 }); return; } activeReasoning.providerMetadata = (_d = part.providerMetadata) != null ? _d : activeReasoning.providerMetadata; delete activeReasoningContent[part.id]; } if (part.type === "file" || part.type === "reasoning-file") recordedContent.push({ type: part.type, file: part.file, ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {} }); if (part.type === "tool-result" && !part.preliminary) recordedContent.push(part); if (part.type === "start-step") { recordedContent = []; activeReasoningContent = createIdMap(); activeTextContent = createIdMap(); recordedRequest = part.request; recordedWarnings = part.warnings; } if (part.type === "finish-step") { const stepResponseMessages = await toResponseMessages({ content: recordedContent, tools }); const currentStepResult = new DefaultStepResult({ callId, stepNumber: recordedSteps.length, provider: model.provider, modelId: model.modelId, runtimeContext, toolsContext, content: recordedContent, finishReason: part.finishReason, rawFinishReason: part.rawFinishReason, usage: part.usage, performance: part.performance, warnings: recordedWarnings, request: { ...recordedRequest, messages: include.requestMessages ? cloneModelMessages(recordedRequestMessages) : void 0 }, response: { ...part.response, messages: cloneModelMessages(stepResponseMessages) }, providerMetadata: part.providerMetadata }); await notify({ event: currentStepResult, callbacks: [onStepFinish, telemetryDispatcher.onStepEnd] }); logWarnings({ warnings: recordedWarnings, provider: model.provider, model: model.modelId }); recordedSteps.push(currentStepResult); stepMessagesForNextStep = [...currentStepMessages, ...stepResponseMessages]; stepFinish.resolve(); } if (part.type === "finish") { recordedTotalUsage = part.totalUsage; recordedFinishReason = part.finishReason; recordedRawFinishReason = part.rawFinishReason; } }, async flush(controller) { try { if (recordedSteps.length === 0 || recordedNoOutputError != null) { const error = (abortSignal == null ? void 0 : abortSignal.aborted) ? abortSignal.reason : recordedNoOutputError != null ? recordedNoOutputError : new NoOutputGeneratedError({ message: "No output generated. Check the stream for errors." }); self.rejectResultPromises(error); return; } const finishReason = recordedFinishReason != null ? recordedFinishReason : "other"; const totalUsage = recordedTotalUsage != null ? recordedTotalUsage : createNullLanguageModelUsage(); self._finishReason.resolve(finishReason); self._rawFinishReason.resolve(recordedRawFinishReason); self._totalUsage.resolve(totalUsage); self._steps.resolve(recordedSteps); const finalStep = recordedSteps[recordedSteps.length - 1]; const content = recordedSteps.flatMap((step) => step.content); const files = recordedSteps.flatMap((step) => step.files); const sources = recordedSteps.flatMap((step) => step.sources); const toolCalls = recordedSteps.flatMap((step) => step.toolCalls); const staticToolCalls = recordedSteps.flatMap((step) => step.staticToolCalls); const dynamicToolCalls = recordedSteps.flatMap((step) => step.dynamicToolCalls); const toolResults = recordedSteps.flatMap((step) => step.toolResults); const staticToolResults = recordedSteps.flatMap((step) => step.staticToolResults); const dynamicToolResults = recordedSteps.flatMap((step) => step.dynamicToolResults); const warnings = recordedSteps.flatMap((step) => { var _a22; return (_a22 = step.warnings) != null ? _a22 : []; }); await notify({ event: { callId, toolsContext: finalStep.toolsContext, stepNumber: finalStep.stepNumber, model: finalStep.model, runtimeContext: finalStep.runtimeContext, finishReason: finalStep.finishReason, rawFinishReason: finalStep.rawFinishReason, usage: totalUsage, totalUsage, content, text: finalStep.text, reasoning: finalStep.reasoning, reasoningText: finalStep.reasoningText, files, sources, toolCalls, staticToolCalls, dynamicToolCalls, toolResults, staticToolResults, dynamicToolResults, responseMessages: [...initialResponseMessages, ...recordedSteps.flatMap((step) => step.response.messages)], warnings, request: finalStep.request, response: finalStep.response, providerMetadata: finalStep.providerMetadata, steps: recordedSteps, finalStep }, callbacks: [onEnd, telemetryDispatcher.onEnd] }); } catch (error) { controller.error(error); } } }); const stitchableStream = createStitchableStream(); this.addStream = stitchableStream.addStream; this.closeStream = stitchableStream.close; const reader = stitchableStream.stream.getReader(); let stream = new ReadableStream({ async start(controller) { controller.enqueue({ type: "start" }); }, async pull(controller) { async function abort() { await notify({ event: { callId, steps: recordedSteps, ...(abortSignal == null ? void 0 : abortSignal.reason) !== void 0 ? { reason: abortSignal.reason } : {} }, callbacks: [onAbort, telemetryDispatcher.onAbort] }); controller.enqueue({ type: "abort", ...(abortSignal == null ? void 0 : abortSignal.reason) !== void 0 ? { reason: getErrorMessage(abortSignal.reason) } : {} }); controller.close(); } try { const { done, value } = await reader.read(); if (done) { controller.close(); return; } if (abortSignal == null ? void 0 : abortSignal.aborted) { await abort(); return; } controller.enqueue(value); } catch (error) { if (isAbortError(error) && (abortSignal == null ? void 0 : abortSignal.aborted)) await abort(); else controller.error(error); } }, cancel(reason) { return stitchableStream.stream.cancel(reason); } }); let isRunning = true; stream = stream.pipeThrough(new TransformStream({ async transform(chunk, controller) { if (isRunning) controller.enqueue(chunk); } })); for (const transform of transforms) stream = stream.pipeThrough(transform({ tools, stopStream() { stitchableStream.terminate(); isRunning = false; } })); this.baseStream = stream.pipeThrough(createOutputTransformStream(output != null ? output : text())).pipeThrough(eventProcessor); const { maxRetries } = prepareRetries({ maxRetries: maxRetriesArg, abortSignal }); const callSettings = prepareLanguageModelCallOptions(settings); const self = this; const callId = generateCallId(); (async () => { var _a22; const initialPrompt = await standardizePrompt({ instructions, system, prompt, messages, allowSystemInMessages }); const startEvent = { callId, operationId: "ai.streamText", provider: model.provider, modelId: model.modelId, instructions: initialPrompt.instructions, messages: initialPrompt.messages, tools, toolChoice, activeTools, toolOrder, maxOutputTokens: callSettings.maxOutputTokens, temperature: callSettings.temperature, topP: callSettings.topP, topK: callSettings.topK, presencePenalty: callSettings.presencePenalty, frequencyPenalty: callSettings.frequencyPenalty, stopSequences: callSettings.stopSequences, seed: callSettings.seed, reasoning: callSettings.reasoning, maxRetries, timeout, headers, providerOptions, output, runtimeContext, toolsContext }; const streamTextTracingChannelContext = (_a22 = telemetryDispatcher.startTracingChannelContext) == null ? void 0 : _a22.call(telemetryDispatcher, { type: "streamText", event: startEvent, completion: self._totalUsage.promise.then(() => void 0) }); const runInStreamTextTracingChannelContext = (execute) => { var _a23; return (_a23 = streamTextTracingChannelContext == null ? void 0 : streamTextTracingChannelContext.run(execute)) != null ? _a23 : execute(); }; const runInTracingChannelSpanInStreamText = telemetryDispatcher.runInTracingChannelSpan == null ? void 0 : (options) => runInStreamTextTracingChannelContext(() => telemetryDispatcher.runInTracingChannelSpan(options)); await notify({ event: startEvent, callbacks: [onStart, telemetryDispatcher.onStart] }); const initialMessages = initialPrompt.messages; let instructionsForNextStep = initialPrompt.instructions; const { approvedToolApprovals, deniedToolApprovals } = collectToolApprovals({ messages: initialMessages }); if (deniedToolApprovals.length > 0 || approvedToolApprovals.length > 0) { const { approvedToolApprovals: localApprovedToolApprovals, deniedToolApprovals: revalidationDeniedToolApprovals } = await validateApprovedToolApprovals({ approvedToolApprovals: approvedToolApprovals.filter((toolApproval2) => !toolApproval2.toolCall.providerExecuted), tools, toolApproval, messages: initialMessages, toolsContext, runtimeContext, toolApprovalSecret: experimental_toolApprovalSecret }); const localDeniedToolApprovals = [...deniedToolApprovals.filter((toolApproval2) => !toolApproval2.toolCall.providerExecuted), ...revalidationDeniedToolApprovals]; const deniedProviderExecutedToolApprovals = deniedToolApprovals.filter((toolApproval2) => toolApproval2.toolCall.providerExecuted); let toolExecutionStepStreamController; const toolExecutionStepStream = new ReadableStream({ start(controller) { toolExecutionStepStreamController = controller; } }); self.addStream(toolExecutionStepStream); try { for (const toolApproval2 of [...localDeniedToolApprovals, ...deniedProviderExecutedToolApprovals]) toolExecutionStepStreamController?.enqueue({ type: "tool-output-denied", toolCallId: toolApproval2.toolCall.toolCallId, toolName: toolApproval2.toolCall.toolName }); const toolOutputs = []; await Promise.all(localApprovedToolApprovals.map(async (toolApproval2) => { const result = await executeToolCall({ toolCall: toolApproval2.toolCall, tools, callId, messages: initialMessages, abortSignal, timeout, experimental_sandbox: sandbox, toolsContext, onToolExecutionStart: filterNullable(onToolExecutionStart, telemetryDispatcher.onToolExecutionStart), onToolExecutionEnd: filterNullable(onToolExecutionEnd, telemetryDispatcher.onToolExecutionEnd), executeToolInTelemetryContext: telemetryDispatcher.executeTool, runInTracingChannelSpan: runInTracingChannelSpanInStreamText, onPreliminaryToolResult: (result2) => { toolExecutionStepStreamController?.enqueue(result2); } }); if (result != null) { toolExecutionStepStreamController?.enqueue(result.output); toolOutputs.push(result.output); } })); if (toolOutputs.length > 0 || localDeniedToolApprovals.length > 0) { const localToolContent = []; for (const output2 of toolOutputs) localToolContent.push({ type: "tool-result", toolCallId: output2.toolCallId, toolName: output2.toolName, output: await createToolModelOutput({ toolCallId: output2.toolCallId, input: output2.input, tool: getOwn(tools, output2.toolName), output: output2.type === "tool-result" ? output2.output : output2.error, errorMode: output2.type === "tool-error" ? "text" : "none" }) }); for (const toolApproval2 of localDeniedToolApprovals) localToolContent.push({ type: "tool-result", toolCallId: toolApproval2.toolCall.toolCallId, toolName: toolApproval2.toolCall.toolName, output: { type: "execution-denied", reason: toolApproval2.approvalResponse.reason } }); initialResponseMessages.push({ role: "tool", content: localToolContent }); } } finally { toolExecutionStepStreamController?.close(); } } self._initialResponseMessages.resolve(initialResponseMessages); async function streamStep({ currentStep, usage }) { var _a23, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l; const stepTimeoutId = setAbortTimeout({ abortController: stepAbortController, label: "Step", timeoutMs: stepTimeoutMs }); let chunkTimeoutId = void 0; function resetChunkTimeout() { if (chunkTimeoutId != null) clearTimeout(chunkTimeoutId); chunkTimeoutId = setAbortTimeout({ abortController: chunkAbortController, label: "Chunk", timeoutMs: chunkTimeoutMs }); } function clearChunkTimeout() { if (chunkTimeoutId != null) { clearTimeout(chunkTimeoutId); chunkTimeoutId = void 0; } } function clearStepTimeout() { if (stepTimeoutId != null) clearTimeout(stepTimeoutId); } abortSignal?.addEventListener("abort", clearStepTimeout); abortSignal?.addEventListener("abort", clearChunkTimeout); try { stepFinish = new DelayedPromise(); const stepTracingChannelContext = (_a23 = telemetryDispatcher.startTracingChannelContext) == null ? void 0 : _a23.call(telemetryDispatcher, { type: "step", event: { callId, stepNumber: currentStep }, completion: stepFinish.promise }); const runInStepTracingChannelContext = (execute) => { var _a24; return (_a24 = stepTracingChannelContext == null ? void 0 : stepTracingChannelContext.run(execute)) != null ? _a24 : execute(); }; const responseMessagesFromPreviousSteps = recordedSteps.flatMap((step) => step.response.messages); const accumulatedResponseMessages = [...initialResponseMessages, ...responseMessagesFromPreviousSteps]; const stepInputMessages = stepMessagesForNextStep != null ? stepMessagesForNextStep : [...initialMessages, ...initialResponseMessages]; const prepareStepResult = await (prepareStep == null ? void 0 : prepareStep({ model, steps: recordedSteps, stepNumber: recordedSteps.length, instructions: instructionsForNextStep, initialInstructions: initialPrompt.instructions, messages: stepInputMessages, initialMessages, responseMessages: accumulatedResponseMessages, toolsContext, runtimeContext, experimental_sandbox: sandbox })); const stepSandbox = (_b = prepareStepResult == null ? void 0 : prepareStepResult.experimental_sandbox) != null ? _b : sandbox; runtimeContext = (_c = prepareStepResult == null ? void 0 : prepareStepResult.runtimeContext) != null ? _c : runtimeContext; toolsContext = (_d = prepareStepResult == null ? void 0 : prepareStepResult.toolsContext) != null ? _d : toolsContext; const stepModel = resolveLanguageModel((_e = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _e : model); const stepActiveTools = filterActiveTools({ tools, activeTools: (_f = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _f : activeTools }); const stepToolOrder = (_g = prepareStepResult == null ? void 0 : prepareStepResult.toolOrder) != null ? _g : toolOrder; const stepTools = await prepareTools({ tools: stepActiveTools, toolOrder: stepToolOrder, toolsContext, experimental_sandbox: stepSandbox }); const stepToolChoice = prepareToolChoice({ toolChoice: (_h = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _h : toolChoice }); const stepMessages = (_i = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _i : stepInputMessages; currentStepMessages = stepMessages; const stepInstructions = (_k = (_j = prepareStepResult == null ? void 0 : prepareStepResult.instructions) != null ? _j : prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _k : instructionsForNextStep; instructionsForNextStep = stepInstructions; const stepProviderOptions = mergeObjects(providerOptions, prepareStepResult == null ? void 0 : prepareStepResult.providerOptions); const stepStartTimestampMs = now2(); const { retry } = prepareRetries({ maxRetries, abortSignal }); const { stream: languageModelStream, request, response } = await runInStepTracingChannelContext(() => retry(async () => { var _a24, _b2; return streamLanguageModelCall({ model: (_a24 = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _a24 : model, tools: stepActiveTools, toolOrder: stepToolOrder, toolChoice: (_b2 = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _b2 : toolChoice, instructions: stepInstructions, messages: stepMessages, allowSystemInMessages, repairToolCall, refineToolInput, abortSignal, headers, includeRawChunks: include.rawChunks, providerOptions: stepProviderOptions, download: download2, output, callId, executeLanguageModelCallInTelemetryContext: telemetryDispatcher.executeLanguageModelCall, toolsContext, experimental_sandbox: stepSandbox, onLanguageModelCallStart: filterNullable(onLanguageModelCallStart, telemetryDispatcher.onLanguageModelCallStart), onLanguageModelCallEnd: filterNullable(onLanguageModelCallEnd, telemetryDispatcher.onLanguageModelCallEnd), onStart: async ({ promptMessages }) => { var _a25, _b3; await notify({ event: { callId, provider: stepModel.provider, modelId: stepModel.modelId, stepNumber: recordedSteps.length, instructions: stepInstructions, messages: stepMessages, tools, toolChoice: (_a25 = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _a25 : toolChoice, activeTools: (_b3 = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _b3 : activeTools, toolOrder: stepToolOrder, steps: [...recordedSteps], providerOptions: stepProviderOptions, runtimeContext, toolsContext, output, promptMessages, stepTools, stepToolChoice }, callbacks: [onStepStart, telemetryDispatcher.onStepStart] }); }, _internal: { now: now2 }, ...callSettings }); })); const streamAfterToolCallbackInvocation = invokeToolCallbacksFromStream({ stream: languageModelStream, tools, stepInputMessages: stepMessages, abortSignal, runtimeContext }); const runInTracingChannelSpanInStep = telemetryDispatcher.runInTracingChannelSpan == null ? void 0 : (options) => runInStepTracingChannelContext(() => telemetryDispatcher.runInTracingChannelSpan(options)); const streamWithToolResults = executeToolsFromStream({ stream: streamAfterToolCallbackInvocation, tools, callId, messages: stepMessages, abortSignal, timeout, experimental_sandbox: stepSandbox, toolsContext, toolApproval, runtimeContext, toolApprovalSecret: experimental_toolApprovalSecret, generateId: generateId2, onToolExecutionStart: filterNullable(onToolExecutionStart, telemetryDispatcher.onToolExecutionStart), onToolExecutionEnd: filterNullable(onToolExecutionEnd, telemetryDispatcher.onToolExecutionEnd), executeToolInTelemetryContext: telemetryDispatcher.executeTool, runInTracingChannelSpan: runInTracingChannelSpanInStep }); const stepRequest = { ...request, body: include.requestBody ? request == null ? void 0 : request.body : void 0, messages: include.requestMessages ? cloneModelMessages(stepMessages) : void 0 }; recordedRequestMessages = (_l = stepRequest.messages) != null ? _l : []; const stepToolCalls = []; const stepToolOutputs = []; const stepToolApprovalResponses = []; let warnings; let stepFinishReason = "other"; let stepRawFinishReason = void 0; let hasReceivedTerminalChunk = false; let hasReceivedOutputChunk = false; let stepUsage = createNullLanguageModelUsage(); let stepProviderMetadata; let stepFirstChunk = true; let modelCallPerformance = { responseTimeMs: 0, effectiveOutputTokensPerSecond: 0, outputTokensPerSecond: void 0, inputTokensPerSecond: void 0, effectiveTotalTokensPerSecond: 0, timeToFirstOutputMs: void 0, timeBetweenOutputChunksMs: void 0 }; const toolExecutionMs = {}; let stepResponse = { id: generateId2(), timestamp: /* @__PURE__ */ new Date(), modelId: model.modelId }; self.addStream(streamWithToolResults.pipeThrough(new TransformStream({ async transform(chunk, controller) { var _a24, _b2, _c2; resetChunkTimeout(); if (chunk.type === "model-call-start") { warnings = chunk.warnings; return; } if (stepFirstChunk) { stepFirstChunk = false; controller.enqueue({ type: "start-step", request: stepRequest, warnings: warnings != null ? warnings : [] }); } const chunkType = chunk.type; if (isOutputChunkType[chunkType]) hasReceivedOutputChunk = true; switch (chunkType) { case "file": case "custom": case "source": case "text-start": case "text-end": case "reasoning-start": case "reasoning-end": case "reasoning-delta": case "reasoning-file": case "tool-input-start": case "tool-input-end": case "tool-input-delta": case "tool-approval-request": controller.enqueue(chunk); break; case "text-delta": if (chunk.text.length > 0) controller.enqueue(chunk); break; case "tool-call": controller.enqueue(chunk); stepToolCalls.push(chunk); break; case "tool-approval-response": controller.enqueue(chunk); stepToolApprovalResponses.push(chunk); break; case "tool-result": controller.enqueue(chunk); if (!chunk.preliminary) stepToolOutputs.push(chunk); break; case "tool-error": controller.enqueue(chunk); stepToolOutputs.push(chunk); break; case "tool-execution-end": toolExecutionMs[chunk.toolCallId] = chunk.toolExecutionMs; break; case "model-call-response-metadata": stepResponse = { id: (_a24 = chunk.id) != null ? _a24 : stepResponse.id, timestamp: (_b2 = chunk.timestamp) != null ? _b2 : stepResponse.timestamp, modelId: (_c2 = chunk.modelId) != null ? _c2 : stepResponse.modelId }; break; case "model-call-end": hasReceivedTerminalChunk = true; stepUsage = chunk.usage; stepFinishReason = chunk.finishReason; stepRawFinishReason = chunk.rawFinishReason; stepProviderMetadata = chunk.providerMetadata; modelCallPerformance = chunk.performance; break; case "error": hasReceivedTerminalChunk = true; controller.enqueue(chunk); stepFinishReason = "error"; break; case "raw": if (include.rawChunks) controller.enqueue(chunk); break; default: throw new Error(`Unknown chunk type: ${chunkType}`); } }, async flush(controller) { if (!hasReceivedTerminalChunk && !hasReceivedOutputChunk) { controller.enqueue({ type: "error", error: new NoOutputGeneratedError({ message: "No output generated. The model stream ended without a finish chunk." }) }); clearStepTimeout(); clearChunkTimeout(); self.closeStream(); return; } const stepTimeMs = now2() - stepStartTimestampMs; const finishStepPart = { type: "finish-step", finishReason: stepFinishReason, rawFinishReason: stepRawFinishReason, usage: stepUsage, performance: { stepTimeMs, toolExecutionMs, ...modelCallPerformance }, providerMetadata: stepProviderMetadata, response: { ...stepResponse, headers: response == null ? void 0 : response.headers } }; controller.enqueue(finishStepPart); const combinedUsage = addLanguageModelUsage(usage, stepUsage); await stepFinish.promise; const clientToolCalls = stepToolCalls.filter((toolCall) => toolCall.providerExecuted !== true); const clientToolOutputs = stepToolOutputs.filter((toolOutput) => toolOutput.providerExecuted !== true); const deniedToolApprovalResponses = stepToolApprovalResponses.filter((toolApprovalResponse) => toolApprovalResponse.approved === false); for (const toolCall of stepToolCalls) { if (toolCall.providerExecuted !== true) continue; const tool2 = getOwn(tools, toolCall.toolName); if ((tool2 == null ? void 0 : tool2.type) === "provider" && tool2.supportsDeferredResults) { if (!stepToolOutputs.some((output2) => (output2.type === "tool-result" || output2.type === "tool-error") && output2.toolCallId === toolCall.toolCallId)) pendingDeferredToolCalls.set(toolCall.toolCallId, { toolName: toolCall.toolName }); } } for (const output2 of stepToolOutputs) if (output2.type === "tool-result" || output2.type === "tool-error") pendingDeferredToolCalls.delete(output2.toolCallId); clearStepTimeout(); clearChunkTimeout(); if ((clientToolCalls.length > 0 && clientToolCalls.length === clientToolOutputs.length + deniedToolApprovalResponses.length || pendingDeferredToolCalls.size > 0) && !await isStopConditionMet({ stopConditions, steps: recordedSteps })) try { await runInStreamTextTracingChannelContext(() => streamStep({ currentStep: currentStep + 1, usage: combinedUsage })); } catch (error) { controller.enqueue({ type: "error", error }); self.closeStream(); } else { controller.enqueue({ type: "finish", finishReason: stepFinishReason, rawFinishReason: stepRawFinishReason, totalUsage: combinedUsage }); self.closeStream(); } } }))); } catch (error) { clearStepTimeout(); clearChunkTimeout(); throw error; } } await runInStreamTextTracingChannelContext(() => streamStep({ currentStep: 0, usage: createNullLanguageModelUsage() })); })().catch(async (error) => { var _a22; await ((_a22 = telemetryDispatcher.onError) == null ? void 0 : _a22.call(telemetryDispatcher, { callId, error })); self._initialResponseMessages.reject(error); markPromiseAsHandled(self._initialResponseMessages.promise); self.addStream(new ReadableStream({ start(controller) { controller.enqueue({ type: "error", error }); controller.close(); } })); self.closeStream(); }); } get steps() { this.consumeStream(); return this._steps.promise; } get finalStep() { return this.steps.then((steps) => steps.at(-1)); } get content() { return this.steps.then((steps) => steps.flatMap((step) => step.content)); } get warnings() { return this.steps.then((steps) => steps.flatMap((step) => { var _a22; return (_a22 = step.warnings) != null ? _a22 : []; })); } get providerMetadata() { return this.finalStep.then((step) => step.providerMetadata); } get text() { return this.finalStep.then((step) => step.text); } get reasoningText() { return this.finalStep.then((step) => step.reasoningText); } get reasoning() { return this.finalStep.then((step) => convertToReasoningOutputs(step.reasoning)); } get sources() { return this.steps.then((steps) => steps.flatMap((step) => step.sources)); } get files() { return this.steps.then((steps) => steps.flatMap((step) => step.files)); } get toolCalls() { return this.steps.then((steps) => steps.flatMap((step) => step.toolCalls)); } get staticToolCalls() { return this.steps.then((steps) => steps.flatMap((step) => step.staticToolCalls)); } get dynamicToolCalls() { return this.steps.then((steps) => steps.flatMap((step) => step.dynamicToolCalls)); } get toolResults() { return this.steps.then((steps) => steps.flatMap((step) => step.toolResults)); } get staticToolResults() { return this.steps.then((steps) => steps.flatMap((step) => step.staticToolResults)); } get dynamicToolResults() { return this.steps.then((steps) => steps.flatMap((step) => step.dynamicToolResults)); } get usage() { return this.totalUsage; } get request() { return this.finalStep.then((step) => step.request); } get response() { return this.finalStep.then((step) => step.response); } get responseMessages() { return Promise.all([this._initialResponseMessages.promise, this.steps]).then(([initialResponseMessages, steps]) => [...initialResponseMessages, ...steps.flatMap((step) => step.response.messages)]); } get totalUsage() { this.consumeStream(); return this._totalUsage.promise; } get finishReason() { this.consumeStream(); return this._finishReason.promise; } get rawFinishReason() { this.consumeStream(); return this._rawFinishReason.promise; } /** * 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(toTextStream({ stream: this.stream })); } get stream() { return createAsyncIterableStream(this.teeStream().pipeThrough(new TransformStream({ transform({ part }, controller) { controller.enqueue(part); } }))); } get fullStream() { return this.stream; } rejectResultPromises(error) { this.rejectResultPromise({ delayedPromise: this._finishReason, error }); this.rejectResultPromise({ delayedPromise: this._rawFinishReason, error }); this.rejectResultPromise({ delayedPromise: this._totalUsage, error }); this.rejectResultPromise({ delayedPromise: this._steps, error }); this.rejectResultPromise({ delayedPromise: this._initialResponseMessages, error }); } rejectResultPromise({ delayedPromise, error }) { if (delayedPromise.isPending()) { delayedPromise.reject(error); markPromiseAsHandled(delayedPromise.promise); } } async consumeStream(options) { var _a22; try { await consumeStream({ stream: this.stream, onError: (error) => { var _a23; this.rejectResultPromises(error); (_a23 = options == null ? void 0 : options.onError) == null || _a23.call(options, error); } }); } catch (error) { this.rejectResultPromises(error); (_a22 = options == null ? void 0 : options.onError) == null || _a22.call(options, error); } } get experimental_partialOutputStream() { return this.partialOutputStream; } get partialOutputStream() { return createAsyncIterableStream(this.teeStream().pipeThrough(new TransformStream({ transform({ partialOutput }, controller) { if (partialOutput != null) controller.enqueue(partialOutput); } }))); } get elementStream() { var _a22, _b, _c; const transform = (_a22 = this.outputSpecification) == null ? void 0 : _a22.createElementStreamTransform(); if (transform == null) throw new UnsupportedFunctionalityError({ functionality: `element streams in ${(_c = (_b = this.outputSpecification) == null ? void 0 : _b.name) != null ? _c : "text"} mode` }); return createAsyncIterableStream(this.teeStream().pipeThrough(transform)); } get output() { return this.finalStep.then((step) => { var _a22; return ((_a22 = this.outputSpecification) != null ? _a22 : text()).parseCompleteOutput({ text: step.text }, { response: step.response, usage: step.usage, finishReason: step.finishReason }); }); } toUIMessageStream({ originalMessages, generateMessageId, onEnd, onFinish, messageMetadata, sendReasoning, sendSources, sendStart, sendFinish, onError } = {}) { return createAsyncIterableStream(toUIMessageStream({ stream: this.stream, tools: this.tools, originalMessages, generateMessageId, onEnd: onEnd != null ? onEnd : onFinish, messageMetadata, sendReasoning, sendSources, sendStart, sendFinish, onError })); } pipeUIMessageStreamToResponse(response, { originalMessages, generateMessageId, onEnd, onFinish, messageMetadata, sendReasoning, sendSources, sendFinish, sendStart, onError, ...init } = {}) { pipeUIMessageStreamToResponse({ response, stream: this.toUIMessageStream({ originalMessages, generateMessageId, onEnd: onEnd != null ? onEnd : onFinish, messageMetadata, sendReasoning, sendSources, sendFinish, sendStart, onError }), ...init }); } pipeTextStreamToResponse(response, init) { pipeTextStreamToResponse({ response, stream: this.textStream, ...init }); } toUIMessageStreamResponse({ originalMessages, generateMessageId, onEnd, onFinish, messageMetadata, sendReasoning, sendSources, sendFinish, sendStart, onError, ...init } = {}) { return createUIMessageStreamResponse({ stream: this.toUIMessageStream({ originalMessages, generateMessageId, onEnd: onEnd != null ? onEnd : onFinish, messageMetadata, sendReasoning, sendSources, sendFinish, sendStart, onError }), ...init }); } toTextStreamResponse(init) { return createTextStreamResponse({ stream: this.textStream, ...init }); } }; var ToolLoopAgent = class { constructor(settings) { this.version = "agent-v1"; const { onFinish, onEnd = onFinish } = settings; this.settings = { ...settings, onEnd }; } /** * The id of the agent. */ get id() { return this.settings.id; } /** * The tools that the agent can use. */ get tools() { return this.settings.tools; } async prepareCall(options) { var _a22, _b, _c, _d; if (this.settings.callOptionsSchema != null && options.options !== void 0) { const validatedOptions = await validateTypes({ value: options.options, schema: this.settings.callOptionsSchema, context: { field: "options" } }); options = { ...options, options: validatedOptions }; } const { onStart: _settingsStableOnStart, experimental_onStart: _settingsExperimentalOnStart, onStepStart: _settingsStableOnStepStart, experimental_onStepStart: _settingsExperimentalOnStepStart, onToolExecutionStart: _settingsOnToolExecutionStart, onToolExecutionEnd: _settingsOnToolExecutionEnd, onStepEnd: _settingsOnStepEnd, onStepFinish: _settingsOnStepFinish, onFinish: _settingsOnFinish, onEnd: _settingsOnEnd, ...settingsWithoutCallbacks } = this.settings; const baseCallArgs = { ...settingsWithoutCallbacks, stopWhen: (_a22 = this.settings.stopWhen) != null ? _a22 : isStepCount(20), ...options }; const { instructions, allowSystemInMessages, messages, prompt, runtimeContext, ...callArgs } = (_d = await ((_c = (_b = this.settings).prepareCall) == null ? void 0 : _c.call(_b, baseCallArgs))) != null ? _d : baseCallArgs; const promptArgs = { instructions, allowSystemInMessages, messages, prompt }; if (runtimeContext === void 0) return { ...callArgs, ...promptArgs }; return { ...callArgs, runtimeContext, ...promptArgs }; } /** * Tags outgoing requests so usage can be attributed to ToolLoopAgent. Chains * with the `ai/` and `ai-sdk//` suffixes added * downstream by generateText/streamText and the provider. */ agentHeaders(preparedCall) { var _a22; return withUserAgentSuffix((_a22 = preparedCall.headers) != null ? _a22 : {}, "ai-sdk-agent/tool-loop"); } /** * Generates an output from the agent (non-streaming). */ async generate({ abortSignal, timeout, experimental_sandbox: sandbox, onStart, experimental_onStart, onStepStart, experimental_onStepStart, onToolExecutionStart, onToolExecutionEnd, onStepEnd, onStepFinish, onFinish, onEnd = onFinish, ...options }) { var _a22, _b, _c; const generate = generateText; const preparedCall = await this.prepareCall({ ...options, experimental_sandbox: sandbox }); const callbackArgs = { abortSignal, timeout, experimental_sandbox: sandbox, onStart: mergeCallbacks((_a22 = this.settings.onStart) != null ? _a22 : this.settings.experimental_onStart, onStart != null ? onStart : experimental_onStart), onStepStart: mergeCallbacks((_b = this.settings.onStepStart) != null ? _b : this.settings.experimental_onStepStart, onStepStart != null ? onStepStart : experimental_onStepStart), onToolExecutionStart: mergeCallbacks(this.settings.onToolExecutionStart, onToolExecutionStart), onToolExecutionEnd: mergeCallbacks(this.settings.onToolExecutionEnd, onToolExecutionEnd), onStepEnd: mergeCallbacks((_c = this.settings.onStepEnd) != null ? _c : this.settings.onStepFinish, onStepEnd != null ? onStepEnd : onStepFinish), onEnd: mergeCallbacks(this.settings.onEnd, onEnd) }; return await generate({ ...preparedCall, ...callbackArgs, headers: this.agentHeaders(preparedCall) }); } /** * Streams an output from the agent (streaming). */ async stream({ abortSignal, timeout, experimental_sandbox: sandbox, experimental_transform, onStart, experimental_onStart, onStepStart, experimental_onStepStart, onToolExecutionStart, onToolExecutionEnd, onStepEnd, onStepFinish, onFinish, onEnd = onFinish, ...options }) { var _a22, _b, _c; const stream = streamText; const preparedCall = await this.prepareCall({ ...options, experimental_sandbox: sandbox }); const callbackArgs = { abortSignal, timeout, experimental_sandbox: sandbox, experimental_transform, onStart: mergeCallbacks((_a22 = this.settings.onStart) != null ? _a22 : this.settings.experimental_onStart, onStart != null ? onStart : experimental_onStart), onStepStart: mergeCallbacks((_b = this.settings.onStepStart) != null ? _b : this.settings.experimental_onStepStart, onStepStart != null ? onStepStart : experimental_onStepStart), onToolExecutionStart: mergeCallbacks(this.settings.onToolExecutionStart, onToolExecutionStart), onToolExecutionEnd: mergeCallbacks(this.settings.onToolExecutionEnd, onToolExecutionEnd), onStepEnd: mergeCallbacks((_c = this.settings.onStepEnd) != null ? _c : this.settings.onStepFinish, onStepEnd != null ? onStepEnd : onStepFinish), onEnd: mergeCallbacks(this.settings.onEnd, onEnd) }; return await stream({ ...preparedCall, ...callbackArgs, headers: this.agentHeaders(preparedCall) }); } }; var toolMetadataSchema2 = record(string(), jsonValueSchema.optional()); var providerReferenceSchema2 = record(string(), string()); lazySchema(() => zodSchema(array$1(object$1({ id: string(), role: _enum([ "system", "user", "assistant" ]), metadata: unknown().optional(), parts: array$1(union([ object$1({ type: literal("text"), text: string(), state: _enum(["streaming", "done"]).optional(), providerMetadata: providerMetadataSchema.optional() }), object$1({ type: literal("reasoning"), text: string(), state: _enum(["streaming", "done"]).optional(), providerMetadata: providerMetadataSchema.optional() }), object$1({ type: literal("custom"), kind: string(), providerMetadata: providerMetadataSchema.optional() }), object$1({ type: literal("source-url"), sourceId: string(), url: string(), title: string().optional(), providerMetadata: providerMetadataSchema.optional() }), object$1({ type: literal("source-document"), sourceId: string(), mediaType: string(), title: string(), filename: string().optional(), providerMetadata: providerMetadataSchema.optional() }), object$1({ type: literal("file"), mediaType: string(), filename: string().optional(), url: string(), providerReference: providerReferenceSchema2.optional(), providerMetadata: providerMetadataSchema.optional() }), object$1({ type: literal("reasoning-file"), mediaType: string(), url: string(), providerMetadata: providerMetadataSchema.optional() }), object$1({ type: literal("step-start") }), object$1({ type: string().startsWith("data-"), id: string().optional(), data: unknown() }), object$1({ type: literal("dynamic-tool"), toolName: string(), toolCallId: string(), toolMetadata: toolMetadataSchema2.optional(), state: literal("input-streaming"), input: unknown().optional(), providerExecuted: boolean().optional(), callProviderMetadata: providerMetadataSchema.optional(), output: never().optional(), errorText: never().optional(), approval: never().optional() }), object$1({ type: literal("dynamic-tool"), toolName: string(), toolCallId: string(), toolMetadata: toolMetadataSchema2.optional(), state: literal("input-available"), input: unknown(), providerExecuted: boolean().optional(), output: never().optional(), errorText: never().optional(), callProviderMetadata: providerMetadataSchema.optional(), approval: never().optional() }), object$1({ type: literal("dynamic-tool"), toolName: string(), toolCallId: string(), toolMetadata: toolMetadataSchema2.optional(), state: literal("approval-requested"), input: unknown(), providerExecuted: boolean().optional(), output: never().optional(), errorText: never().optional(), callProviderMetadata: providerMetadataSchema.optional(), approval: object$1({ id: string(), approved: never().optional(), reason: never().optional(), isAutomatic: boolean().optional(), signature: string().optional() }) }), object$1({ type: literal("dynamic-tool"), toolName: string(), toolCallId: string(), toolMetadata: toolMetadataSchema2.optional(), state: literal("approval-responded"), input: unknown(), providerExecuted: boolean().optional(), output: never().optional(), errorText: never().optional(), callProviderMetadata: providerMetadataSchema.optional(), approval: object$1({ id: string(), approved: boolean(), reason: string().optional(), isAutomatic: boolean().optional(), signature: string().optional() }) }), object$1({ type: literal("dynamic-tool"), toolName: string(), toolCallId: string(), toolMetadata: toolMetadataSchema2.optional(), state: literal("output-available"), input: unknown(), providerExecuted: boolean().optional(), output: unknown(), errorText: never().optional(), callProviderMetadata: providerMetadataSchema.optional(), resultProviderMetadata: providerMetadataSchema.optional(), preliminary: boolean().optional(), approval: object$1({ id: string(), approved: literal(true), reason: string().optional(), isAutomatic: boolean().optional(), signature: string().optional() }).optional() }), object$1({ type: literal("dynamic-tool"), toolName: string(), toolCallId: string(), toolMetadata: toolMetadataSchema2.optional(), state: literal("output-error"), input: unknown().optional(), rawInput: unknown().optional(), providerExecuted: boolean().optional(), output: never().optional(), errorText: string(), callProviderMetadata: providerMetadataSchema.optional(), resultProviderMetadata: providerMetadataSchema.optional(), approval: object$1({ id: string(), approved: literal(true), reason: string().optional(), isAutomatic: boolean().optional(), signature: string().optional() }).optional() }), object$1({ type: literal("dynamic-tool"), toolName: string(), toolCallId: string(), toolMetadata: toolMetadataSchema2.optional(), state: literal("output-denied"), input: unknown(), providerExecuted: boolean().optional(), output: never().optional(), errorText: never().optional(), callProviderMetadata: providerMetadataSchema.optional(), approval: object$1({ id: string(), approved: literal(false), reason: string().optional(), isAutomatic: boolean().optional(), signature: string().optional() }) }), object$1({ type: string().startsWith("tool-"), toolCallId: string(), toolMetadata: toolMetadataSchema2.optional(), state: literal("input-streaming"), providerExecuted: boolean().optional(), callProviderMetadata: providerMetadataSchema.optional(), input: unknown().optional(), output: never().optional(), errorText: never().optional(), approval: never().optional() }), object$1({ type: string().startsWith("tool-"), toolCallId: string(), toolMetadata: toolMetadataSchema2.optional(), state: literal("input-available"), providerExecuted: boolean().optional(), input: unknown(), output: never().optional(), errorText: never().optional(), callProviderMetadata: providerMetadataSchema.optional(), approval: never().optional() }), object$1({ type: string().startsWith("tool-"), toolCallId: string(), toolMetadata: toolMetadataSchema2.optional(), state: literal("approval-requested"), input: unknown(), providerExecuted: boolean().optional(), output: never().optional(), errorText: never().optional(), callProviderMetadata: providerMetadataSchema.optional(), approval: object$1({ id: string(), approved: never().optional(), reason: never().optional(), isAutomatic: boolean().optional(), signature: string().optional() }) }), object$1({ type: string().startsWith("tool-"), toolCallId: string(), toolMetadata: toolMetadataSchema2.optional(), state: literal("approval-responded"), input: unknown(), providerExecuted: boolean().optional(), output: never().optional(), errorText: never().optional(), callProviderMetadata: providerMetadataSchema.optional(), approval: object$1({ id: string(), approved: boolean(), reason: string().optional(), isAutomatic: boolean().optional(), signature: string().optional() }) }), object$1({ type: string().startsWith("tool-"), toolCallId: string(), toolMetadata: toolMetadataSchema2.optional(), state: literal("output-available"), providerExecuted: boolean().optional(), input: unknown(), output: unknown(), errorText: never().optional(), callProviderMetadata: providerMetadataSchema.optional(), resultProviderMetadata: providerMetadataSchema.optional(), preliminary: boolean().optional(), approval: object$1({ id: string(), approved: literal(true), reason: string().optional(), isAutomatic: boolean().optional(), signature: string().optional() }).optional() }), object$1({ type: string().startsWith("tool-"), toolCallId: string(), toolMetadata: toolMetadataSchema2.optional(), state: literal("output-error"), providerExecuted: boolean().optional(), input: unknown().optional(), rawInput: unknown().optional(), output: never().optional(), errorText: string(), callProviderMetadata: providerMetadataSchema.optional(), resultProviderMetadata: providerMetadataSchema.optional(), approval: object$1({ id: string(), approved: literal(true), reason: string().optional(), isAutomatic: boolean().optional(), signature: string().optional() }).optional() }), object$1({ type: string().startsWith("tool-"), toolCallId: string(), toolMetadata: toolMetadataSchema2.optional(), state: literal("output-denied"), providerExecuted: boolean().optional(), input: unknown(), output: never().optional(), errorText: never().optional(), callProviderMetadata: providerMetadataSchema.optional(), approval: object$1({ id: string(), approved: literal(false), reason: string().optional(), isAutomatic: boolean().optional(), signature: string().optional() }) }) ])) }).superRefine((message, context) => { if (message.role !== "assistant" && message.parts.length === 0) context.addIssue({ origin: "array", code: "too_small", minimum: 1, inclusive: true, input: message.parts, path: ["parts"], message: "Message must contain at least one part" }); })).nonempty("Messages array must not be empty"))); createIdGenerator({ prefix: "call", size: 24 }); createIdGenerator({ prefix: "call", size: 24 }); function convertDataContentToBase64String(content) { if (typeof content === "string") return content; if (content instanceof ArrayBuffer) return convertUint8ArrayToBase64(new Uint8Array(content)); return convertUint8ArrayToBase64(content); } createIdGenerator({ prefix: "aiobj", size: 24 }); function createDownload(options) { return ({ url, abortSignal }) => download({ url, maxBytes: options == null ? void 0 : options.maxBytes, abortSignal }); } createIdGenerator({ prefix: "aiobj", size: 24 }); createIdGenerator({ prefix: "call", size: 24 }); //#endregion //#region node_modules/ai/dist/test/index.js function notImplemented() { throw new Error("Not implemented"); } var MockLanguageModelV3 = class { constructor({ provider = "mock-provider", modelId = "mock-model-id", supportedUrls = {}, doGenerate = notImplemented, doStream = notImplemented } = {}) { this.specificationVersion = "v3"; this.doGenerateCalls = []; this.doStreamCalls = []; this.provider = provider; this.modelId = modelId; this.doGenerate = async (options) => { this.doGenerateCalls.push(options); if (typeof doGenerate === "function") return await doGenerate(options); else if (Array.isArray(doGenerate)) return doGenerate[this.doGenerateCalls.length - 1]; else return doGenerate; }; this.doStream = async (options) => { this.doStreamCalls.push(options); if (typeof doStream === "function") return await doStream(options); else if (Array.isArray(doStream)) return doStream[this.doStreamCalls.length - 1]; else return doStream; }; this._supportedUrls = typeof supportedUrls === "function" ? supportedUrls : async () => await supportedUrls; } get supportedUrls() { return this._supportedUrls(); } }; //#endregion export { generateText as a, dist_exports as i, ToolLoopAgent as n, isStepCount as o, convertDataContentToBase64String as r, registerTelemetry as s, MockLanguageModelV3 as t };