UNPKG

@mastra/core

Version:
1 lines 629 kB
{"version":3,"file":"llm-CmflaXHA.cjs","names":["#model","createStreamFromGenerateResult","convertToDataContent","#model","createStreamFromGenerateResult","PROVIDER_REGISTRY","NetlifyGateway","MastraGateway","ModelsDevGateway","marker","symbol","_a","_b","name","normalizeHeaders","VERSION","TypeValidationError2","TypeValidationError3","EventSourceParserStream","InvalidArgumentError2","APICallError3","APICallError4","ZodFirstPartyTypeKind","ZodFirstPartyTypeKind2","ZodFirstPartyTypeKind3","z4","z","_exhaustiveCheck","getResponseMetadata","z2","lazyValidator2","zodSchema2","z3","UnsupportedFunctionalityError2","UnsupportedFunctionalityError3","lazyValidator3","zodSchema3","z4","lazyValidator4","zodSchema4","z5","parseProviderOptions2","postJsonToApi2","combineHeaders2","createJsonResponseHandler2","createEventSourceResponseHandler2","lazyValidator5","zodSchema5","z6","lazyValidator6","zodSchema6","z7","parseProviderOptions3","postJsonToApi3","combineHeaders3","createJsonResponseHandler3","lazyValidator7","zodSchema7","z8","z9","lazyValidator8","zodSchema8","parseProviderOptions4","postJsonToApi4","combineHeaders4","createJsonResponseHandler4","lazyValidator9","zodSchema9","z10","lazyValidator10","zodSchema10","z11","parseProviderOptions5","combineHeaders5","createJsonResponseHandler5","lazyValidator11","zodSchema11","z12","parseProviderOptions6","postJsonToApi5","combineHeaders6","zodSchema12","z13","convertToBase642","UnsupportedFunctionalityError4","parseProviderOptions7","z14","lazyValidator12","zodSchema13","z15","lazyValidator13","zodSchema14","z16","lazySchema2","zodSchema15","z17","createProviderDefinedToolFactoryWithOutputSchema2","z18","lazySchema3","zodSchema16","createProviderDefinedToolFactoryWithOutputSchema3","lazySchema4","zodSchema17","z19","createProviderDefinedToolFactoryWithOutputSchema4","lazySchema5","zodSchema18","z20","createProviderDefinedToolFactoryWithOutputSchema5","lazySchema6","zodSchema19","z21","createProviderDefinedToolFactoryWithOutputSchema6","validateTypes2","UnsupportedFunctionalityError5","parseProviderOptions8","postJsonToApi6","combineHeaders7","createJsonResponseHandler6","generateId2","createEventSourceResponseHandler3","z","z2","_exhaustiveCheck","normalizeHeaders","ws","WebSocket","MastraModelGateway","InMemoryServerCache","MastraError","MASTRA_USER_AGENT","MASTRA_GATEWAY_STREAM_TRANSPORT","MastraError","shouldEnableGateway","getGatewayId","findGatewayForModel","parseModelRouterId","#manager","#lastStreamTransport","modelSupportsTemperature","AISDKV5LanguageModel","createOpenAICompatible","createOpenAI","MASTRA_GATEWAY_STREAM_TRANSPORT","#model","RequestContext","AISDKV5LanguageModel","createOpenAICompatible","MASTRA_USER_AGENT","GatewayRegistry","createOpenAI","createGoogleGenerativeAI"],"sources":["../src/stream/types.ts","../src/llm/model/aisdk/v6/model.ts","../src/llm/model/aisdk/v7/model.ts","../src/llm/model/gateways/defaults.ts","../../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@ai-sdk/provider/2.0.3/baf9ca0bc6c1e850f5a9c142d47d3731e6921106a5f2b12483df7e7922a48657/node_modules/@ai-sdk/provider/dist/index.mjs","../../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@ai-sdk/provider-utils/3.0.31/ec2b02e652373362f632ec2c411694343ca859aa4cde84046d95e39a09d5a1ac/node_modules/@ai-sdk/provider-utils/dist/index.mjs","../../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@ai-sdk/openai/2.0.117/3f5324097e37b29f8c67f9444d2fb0bff4a23e20e79688f7662e681ef31a4ccc/node_modules/@ai-sdk/openai/dist/internal/index.mjs","../../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@ai-sdk/deepseek/1.0.49/9c43d393d233734df35193f751634bb00a7dc30acb14e2c61f11e7c064abe41a/node_modules/@ai-sdk/deepseek/dist/internal/index.mjs","../../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@ai-sdk/azure/2.0.122/ab5d76f0d96c410cb157802a7d4c7d65790bf49e76b7f40883d75c8d80ef310b/node_modules/@ai-sdk/azure/dist/index.mjs","../src/llm/model/openai-websocket-fetch.ts","../src/llm/model/gateways/azure.ts","../src/llm/model/gateways/gateway-manager.ts","../src/llm/model/router.ts","../src/llm/model/aisdk/v4/model.ts","../src/llm/model/resolve-model.ts","../src/llm/model/model-auth-resolver.ts","../src/llm/model/embedding-router.ts"],"sourcesContent":["import type { TransformStream } from 'node:stream/web';\nimport type {\n LanguageModelV2FinishReason,\n LanguageModelV2Usage,\n LanguageModelV2CallWarning,\n LanguageModelV2Prompt,\n LanguageModelV2ResponseMetadata,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider-v5';\n\nimport type {\n FinishReason,\n LanguageModelRequestMetadata,\n LogProbs as LanguageModelV1LogProbs,\n} from '@internal/ai-sdk-v4';\nimport type { CallSettings, ModelMessage, StepResult, ToolSet, TypedToolCall, UIMessage } from '@internal/ai-sdk-v5';\nimport type { AIV5ResponseMessage } from '../agent/message-list';\nimport type { AIV5Type, MastraDBMessage } from '../agent/message-list/types';\nimport type { StructuredOutputOptions } from '../agent/types';\nimport type { MastraLanguageModel, SharedProviderOptions } from '../llm/model/shared.types';\nimport type { ScorerResult } from '../loop';\nimport type { ClientObservabilityCarrier, ObservabilityContext } from '../observability';\nimport type { OutputProcessorOrWorkflow } from '../processors';\nimport type { RequestContext } from '../request-context';\nimport type { WorkflowRunStatus, WorkflowStepStatus } from '../workflows/types';\nimport type { OutputSchema } from './base/schema';\n\nexport enum ChunkFrom {\n AGENT = 'AGENT',\n USER = 'USER',\n SYSTEM = 'SYSTEM',\n WORKFLOW = 'WORKFLOW',\n NETWORK = 'NETWORK',\n}\n\n/**\n * Extended finish reason that includes Mastra-specific values.\n * 'tripwire' and 'retry' are used for processor scenarios.\n */\nexport type MastraFinishReason = LanguageModelV2FinishReason | 'tripwire' | 'retry';\n\n/**\nA JSON value can be a string, number, boolean, object, array, or null.\nJSON values can be serialized and deserialized by the JSON.stringify and JSON.parse methods.\n */\nexport type JSONValue = null | string | number | boolean | JSONObject | JSONArray;\nexport type JSONObject = {\n [key: string]: JSONValue;\n};\nexport type JSONArray = JSONValue[];\n\n/**\n * Additional provider-specific metadata.\n * The outer record is keyed by the provider name, and the inner\n * record is keyed by the provider-specific metadata key.\n */\nexport type ProviderMetadata = Record<string, Record<string, JSONValue>>;\n\nexport type StreamTransport = {\n type: 'openai-websocket';\n close: () => void;\n closeOnFinish: boolean;\n};\n\nexport const MASTRA_MODEL_STREAM_TRANSPORT = Symbol.for('@mastra/core.modelStreamTransport');\n\nexport type StreamTransportCarrier = {\n [key: symbol]: StreamTransport | undefined;\n};\n\nexport function attachModelStreamTransport(target: object, transport?: StreamTransport): void {\n if (!transport) return;\n Object.defineProperty(target, MASTRA_MODEL_STREAM_TRANSPORT, {\n configurable: true,\n value: transport,\n });\n}\n\nexport function readModelStreamTransport(target: unknown): StreamTransport | undefined {\n return (target as StreamTransportCarrier | undefined)?.[MASTRA_MODEL_STREAM_TRANSPORT];\n}\n\nexport type StreamTransportRef = {\n current?: StreamTransport;\n};\n\ninterface BaseChunkType {\n runId: string;\n from: ChunkFrom;\n metadata?: Record<string, any>;\n}\n\ninterface ResponseMetadataPayload {\n signature?: string;\n [key: string]: unknown;\n}\n\nexport interface TextStartPayload {\n id: string;\n providerMetadata?: ProviderMetadata;\n}\n\nexport interface TextDeltaPayload {\n id: string;\n providerMetadata?: ProviderMetadata;\n text: string;\n}\n\ninterface TextEndPayload {\n id: string;\n providerMetadata?: ProviderMetadata;\n [key: string]: unknown;\n}\n\nexport interface ReasoningStartPayload {\n id: string;\n providerMetadata?: ProviderMetadata;\n signature?: string;\n}\n\nexport interface ReasoningDeltaPayload {\n id: string;\n providerMetadata?: ProviderMetadata;\n text: string;\n}\n\ninterface ReasoningEndPayload {\n id: string;\n providerMetadata?: ProviderMetadata;\n signature?: string;\n}\n\nexport interface SourcePayload {\n id: string;\n sourceType: 'url' | 'document';\n title: string;\n mimeType?: string;\n filename?: string;\n url?: string;\n providerMetadata?: ProviderMetadata;\n}\n\nexport interface FilePayload {\n data: string | Uint8Array;\n base64?: string;\n mimeType: string;\n providerMetadata?: ProviderMetadata;\n}\n\nexport type ReadonlyJSONValue = null | string | number | boolean | ReadonlyJSONObject | ReadonlyJSONArray;\n\nexport type ReadonlyJSONObject = {\n readonly [key: string]: ReadonlyJSONValue;\n};\n\nexport type ReadonlyJSONArray = readonly ReadonlyJSONValue[];\n\nexport interface MastraMetadataMessage {\n type: 'text' | 'tool';\n content?: string;\n toolName?: string;\n toolInput?: ReadonlyJSONValue;\n toolOutput?: ReadonlyJSONValue;\n args?: ReadonlyJSONValue;\n toolCallId?: string;\n result?: ReadonlyJSONValue;\n}\n\nexport interface MastraMetadata {\n isStreaming?: boolean;\n from?: 'AGENT' | 'WORKFLOW' | 'USER' | 'SYSTEM';\n networkMetadata?: ReadonlyJSONObject;\n toolOutput?: ReadonlyJSONValue | ReadonlyJSONValue[];\n messages?: MastraMetadataMessage[];\n workflowFullState?: ReadonlyJSONObject;\n selectionReason?: string;\n}\n\nexport interface ToolCallPayload<TArgs = unknown, TOutput = unknown> {\n toolCallId: string;\n toolName: string;\n args?: TArgs & {\n __mastraMetadata?: MastraMetadata;\n };\n providerExecuted?: boolean;\n providerMetadata?: ProviderMetadata;\n output?: TOutput;\n dynamic?: boolean;\n /**\n * W3C trace context carrier for client-side tool execution.\n *\n * Populated by the server when emitting a tool call that will be\n * executed in the client (`providerExecuted: false` and the tool has\n * no server-side execute function). The client SDK extracts the\n * carrier, parents any child spans/logs underneath it, and echoes it\n * back in the next request body for cross-request trace correlation.\n */\n observability?: ClientObservabilityCarrier;\n}\n\nexport interface ToolResultPayload<TResult = unknown, TArgs = unknown> {\n toolCallId: string;\n toolName: string;\n result: TResult;\n isError?: boolean;\n providerExecuted?: boolean;\n providerMetadata?: ProviderMetadata;\n args?: TArgs;\n dynamic?: boolean;\n}\n\nexport type DynamicToolCallPayload = ToolCallPayload<any, any>;\nexport type DynamicToolResultPayload = ToolResultPayload<any, any>;\n\ninterface ToolCallInputStreamingStartPayload {\n toolCallId: string;\n toolName: string;\n providerExecuted?: boolean;\n providerMetadata?: ProviderMetadata;\n dynamic?: boolean;\n observability?: ClientObservabilityCarrier;\n}\n\ninterface ToolCallDeltaPayload {\n argsTextDelta: string;\n toolCallId: string;\n providerMetadata?: ProviderMetadata;\n toolName?: string;\n}\n\ninterface ToolCallInputStreamingEndPayload {\n toolCallId: string;\n providerMetadata?: ProviderMetadata;\n}\n\ninterface FinishPayload<Tools extends ToolSet = ToolSet, OUTPUT extends OutputSchema = undefined> {\n stepResult: {\n /** Includes 'tripwire' and 'retry' for processor scenarios */\n reason: LanguageModelV2FinishReason | 'tripwire' | 'retry';\n warnings?: LanguageModelV2CallWarning[];\n isContinued?: boolean;\n logprobs?: LanguageModelV1LogProbs;\n };\n output: {\n usage: LanguageModelUsage;\n /** Steps array - uses MastraStepResult which extends AI SDK StepResult with tripwire data */\n steps?: MastraStepResult<Tools>[];\n };\n metadata: {\n providerMetadata?: ProviderMetadata;\n request?: LanguageModelRequestMetadata;\n [key: string]: unknown;\n };\n providerMetadata?: ProviderMetadata;\n messages: {\n all: ModelMessage[];\n user: ModelMessage[];\n nonUser: AIV5ResponseMessage[];\n };\n response?: LLMStepResult<OUTPUT>['response'];\n [key: string]: unknown;\n}\n\ninterface ErrorPayload {\n error: unknown;\n [key: string]: unknown;\n}\n\ninterface RawPayload {\n [key: string]: unknown;\n}\n\ninterface StartPayload {\n [key: string]: unknown;\n}\n\nexport interface StepStartPayload {\n messageId?: string;\n request: {\n body?: string;\n [key: string]: unknown;\n };\n inputMessages?: LanguageModelV2Prompt;\n warnings?: LanguageModelV2CallWarning[];\n [key: string]: unknown;\n}\n\nexport interface StepFinishPayload<Tools extends ToolSet = ToolSet, OUTPUT = undefined> {\n id?: string;\n providerMetadata?: ProviderMetadata;\n totalUsage?: LanguageModelUsage;\n response?: LanguageModelV2ResponseMetadata;\n messageId?: string;\n stepResult: {\n logprobs?: LanguageModelV1LogProbs;\n isContinued?: boolean;\n warnings?: LanguageModelV2CallWarning[];\n reason: LanguageModelV2FinishReason;\n };\n output: {\n text?: string;\n toolCalls?: TypedToolCall<Tools>[];\n usage: LanguageModelUsage;\n /** Steps array - uses MastraStepResult which extends AI SDK StepResult with tripwire data */\n steps?: MastraStepResult<Tools>[];\n object?: OUTPUT;\n };\n metadata: {\n request?: LanguageModelRequestMetadata;\n providerMetadata?: ProviderMetadata;\n [key: string]: unknown;\n };\n messages?: {\n all: ModelMessage[];\n user: ModelMessage[];\n nonUser: AIV5ResponseMessage[];\n };\n [key: string]: unknown;\n}\n\ninterface ToolErrorPayload {\n id?: string;\n providerMetadata?: ProviderMetadata;\n toolCallId: string;\n toolName: string;\n args?: Record<string, unknown>;\n error: unknown;\n providerExecuted?: boolean;\n}\n\ninterface AbortPayload {\n [key: string]: unknown;\n}\n\ninterface ReasoningSignaturePayload {\n id: string;\n signature: string;\n providerMetadata?: ProviderMetadata;\n}\n\ninterface RedactedReasoningPayload {\n id: string;\n data: unknown;\n providerMetadata?: ProviderMetadata;\n}\n\ninterface ToolOutputPayload<TOutput = unknown> {\n output: TOutput; // Tool outputs can be any shape, including nested workflow chunks\n toolCallId: string;\n toolName?: string;\n [key: string]: unknown;\n}\n\ntype DynamicToolOutputPayload = ToolOutputPayload<any>;\n\n// Define a specific type for nested workflow outputs\ntype NestedWorkflowOutput = {\n from: ChunkFrom;\n type: string;\n payload?: {\n output?: ChunkType | NestedWorkflowOutput; // Allow one level of nesting\n usage?: unknown;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n};\n\ninterface StepOutputPayload {\n output: ChunkType | NestedWorkflowOutput;\n [key: string]: unknown;\n}\n\ninterface WatchPayload {\n [key: string]: unknown;\n}\n\nexport interface TripwirePayload<TMetadata = unknown> {\n /** The reason for the tripwire */\n reason: string;\n /** If true, the agent should retry with the tripwire reason as feedback */\n retry?: boolean;\n /** Strongly typed metadata from the processor */\n metadata?: TMetadata;\n /** The ID of the processor that triggered the tripwire */\n processorId?: string;\n}\n\n/**\n * Payload for is-task-complete events emitted during stream/generate scoring.\n */\nexport interface IsTaskCompletePayload {\n /** Current iteration number */\n iteration: number;\n /** Whether all/any scorers passed based on strategy */\n passed: boolean;\n /** Individual scorer results */\n results: ScorerResult[];\n /** Total duration of all scoring checks */\n duration: number;\n /** Whether scoring timed out */\n timedOut: boolean;\n /** Reason from the relevant scorer */\n reason?: string;\n /** Whether the maximum iteration was reached */\n maxIterationReached: boolean;\n /** Whether to suppress the completion feedback message */\n suppressFeedback: boolean;\n}\n\n/**\n * Payload for `goal` events emitted by the in-loop goal scorer. Consumers (TUIs,\n * `@mastra/client-js`) use this to render judge progress and the result.\n */\nexport interface GoalEvaluationActivity {\n type: 'tool-call' | 'tool-result' | 'reason';\n name?: string;\n message: string;\n}\n\nexport interface GoalEvaluationPayload {\n /** The objective being judged. */\n objective: string;\n /** Goal evaluations consumed so far (runsUsed after this evaluation). */\n iteration: number;\n /** Max evaluations before the goal stops. */\n maxRuns: number;\n /** Whether the goal is judged complete. */\n passed: boolean;\n /** The objective status after this evaluation. */\n status: 'active' | 'paused' | 'done';\n /** Individual scorer results. */\n results: ScorerResult[];\n /** Judge feedback / stop reason. Falls back to the pause reason when parked. */\n reason?: string;\n /**\n * Why the objective is parked (`status === 'paused'`). Set for judge failure\n * or budget exhaustion. Cleared when `status` is `'active'` or `'done'`.\n */\n pausedReason?: string;\n /**\n * True when the judge decided the goal is not finished but explicitly wants\n * the user to provide input before continuing. The record stays `active` (so\n * the next agent turn is still judged), but `isContinued` is `false` (the\n * auto-loop stops). Display layers use this to show a \"waiting\" indicator.\n */\n waitingForUser?: boolean;\n /** True when the scorer/judge itself errored (as opposed to scoring 0). */\n judgeFailed?: boolean;\n /** Total duration of the goal scoring check. */\n duration: number;\n /** Whether scoring timed out. */\n timedOut: boolean;\n /** Whether the run budget (`maxRuns`) was reached. */\n maxRunsReached: boolean;\n /** Whether the goal feedback message is suppressed from memory. */\n suppressFeedback: boolean;\n /**\n * The goal gate's continuation decision: `true` when the run loops into\n * another judged iteration, `false` on a terminal evaluation (completion,\n * waiting for user, judge failure, or budget exhaustion). Only set on final\n * (non-pending) evaluation chunks. A `true` value marks an iteration\n * boundary — the turn's messages are persisted and the stream may safely\n * truncate its run-lifetime buffers.\n */\n shouldContinue?: boolean;\n /**\n * True on the \"pre-evaluation\" chunk emitted before scoring starts. Display\n * layers use this to show a loading/evaluating indicator while the scorer\n * runs. A second chunk with `pending: false` (or absent) follows once the\n * evaluation is complete.\n */\n pending?: boolean;\n /** Judge activity emitted while the evaluation is still running. */\n activity?: GoalEvaluationActivity[];\n}\n\nexport interface BackgroundTaskStartedPayload {\n taskId: string;\n toolName: string;\n toolCallId: string;\n}\n\nexport interface BackgroundTaskResultPayload {\n taskId: string;\n toolName: string;\n toolCallId: string;\n agentId: string;\n result: unknown;\n runId: string;\n completedAt: Date;\n isError?: boolean;\n}\n\nexport interface BackgroundTaskFailedPayload {\n taskId: string;\n toolName: string;\n toolCallId: string;\n runId: string;\n agentId: string;\n error: { message: string };\n completedAt: Date;\n}\n\nexport interface BackgroundTaskProgressPayload {\n taskIds: string[];\n runningCount: number;\n elapsedMs: number;\n}\n\nexport interface BackgroundTaskRunningPayload {\n taskId: string;\n toolName: string;\n toolCallId: string;\n runId: string;\n agentId: string;\n startedAt: Date;\n args: Record<string, unknown>;\n}\n\nexport interface BackgroundTaskCancelledPayload {\n taskId: string;\n toolName: string;\n toolCallId: string;\n runId: string;\n agentId: string;\n completedAt: Date;\n}\n\nexport interface BackgroundTaskOutputPayload {\n taskId: string;\n toolName: string;\n toolCallId: string;\n runId: string;\n agentId: string;\n payload: Extract<AgentChunkType, { type: 'tool-output' }>;\n}\n\nexport interface BackgroundTaskSuspendedPayload {\n taskId: string;\n toolName: string;\n toolCallId: string;\n runId: string;\n agentId: string;\n args: Record<string, unknown>;\n /** Whatever the tool passed to `suspend(data)`. */\n suspendPayload?: unknown;\n /** When the task suspended. */\n suspendedAt?: Date;\n}\n\nexport interface BackgroundTaskResumedPayload {\n taskId: string;\n toolName: string;\n toolCallId: string;\n runId: string;\n agentId: string;\n startedAt: Date;\n args: Record<string, unknown>;\n}\n\n// Network-specific payload interfaces\ninterface RoutingAgentStartPayload {\n agentId: string;\n networkId: string;\n runId: string;\n inputData: {\n task: string;\n primitiveId: string;\n primitiveType: string;\n result?: string;\n iteration: number;\n threadId?: string;\n threadResourceId?: string;\n isOneOff: boolean;\n verboseIntrospection: boolean;\n };\n}\n\ninterface RoutingAgentEndPayload {\n task: string;\n primitiveId: string;\n primitiveType: string;\n prompt: string;\n result: string;\n isComplete?: boolean;\n selectionReason: string;\n iteration: number;\n runId: string;\n usage: LanguageModelUsage;\n}\n\ninterface RoutingAgentTextDeltaPayload {\n text: string;\n}\n\ninterface RoutingAgentTextStartPayload {\n runId: string;\n}\n\ninterface AgentExecutionStartPayload {\n agentId: string;\n args: {\n task: string;\n primitiveId: string;\n primitiveType: string;\n prompt: string;\n result: string;\n isComplete?: boolean;\n selectionReason: string;\n iteration: number;\n };\n runId: string;\n}\n\ninterface AgentExecutionApprovalPayload extends ToolCallApprovalPayload {\n agentId: string;\n usage: LanguageModelUsage;\n runId: string;\n selectionReason: string;\n}\n\ninterface AgentExecutionSuspendedPayload extends ToolCallSuspendedPayload {\n agentId: string;\n suspendPayload: any;\n usage: LanguageModelUsage;\n runId: string;\n selectionReason: string;\n}\n\ninterface AgentExecutionEndPayload {\n task: string;\n agentId: string;\n result: string;\n isComplete: boolean;\n iteration: number;\n usage: LanguageModelUsage;\n runId: string;\n}\n\ninterface WorkflowExecutionStartPayload {\n name: string;\n workflowId: string;\n args: {\n task: string;\n primitiveId: string;\n primitiveType: string;\n prompt: string;\n result: string;\n isComplete?: boolean;\n selectionReason: string;\n iteration: number;\n };\n runId: string;\n}\n\ninterface WorkflowExecutionEndPayload {\n name: string;\n workflowId: string;\n task: string;\n primitiveId: string;\n primitiveType: string;\n result: string;\n isComplete: boolean;\n iteration: number;\n usage: LanguageModelUsage;\n runId: string;\n}\n\ninterface WorkflowExecutionSuspendPayload extends ToolCallSuspendedPayload {\n name: string;\n workflowId: string;\n suspendPayload: any;\n usage: LanguageModelUsage;\n runId: string;\n selectionReason: string;\n}\n\ninterface ToolExecutionStartPayload {\n args: Record<string, unknown> & {\n toolName?: string;\n toolCallId?: string;\n args?: Record<string, unknown>; // The actual tool arguments are nested here\n selectionReason?: string;\n __mastraMetadata?: MastraMetadata;\n // Other inputData fields spread here\n [key: string]: unknown;\n };\n runId: string;\n}\n\ninterface ToolExecutionApprovalPayload extends ToolCallApprovalPayload {\n selectionReason: string;\n runId: string;\n}\n\ninterface ToolExecutionSuspendedPayload extends ToolCallSuspendedPayload {\n selectionReason: string;\n runId: string;\n}\n\ninterface ToolExecutionEndPayload {\n task: string;\n primitiveId: string;\n primitiveType: string;\n result: unknown;\n isComplete: boolean;\n iteration: number;\n toolCallId: string;\n toolName: string;\n}\n\ninterface NetworkStepFinishPayload {\n task: string;\n result: string;\n isComplete: boolean;\n iteration: number;\n runId: string;\n}\n\ninterface NetworkFinishPayload<OUTPUT = undefined> {\n task: string;\n primitiveId: string;\n primitiveType: string;\n prompt: string;\n result: string;\n /** Structured output object when structuredOutput option is provided */\n object?: OUTPUT;\n isComplete?: boolean;\n completionReason: string;\n iteration: number;\n threadId?: string;\n threadResourceId?: string;\n isOneOff: boolean;\n usage: LanguageModelUsage;\n}\n\ninterface NetworkValidationStartPayload {\n runId: string;\n iteration: number;\n checksCount: number;\n}\n\ninterface NetworkValidationEndPayload {\n runId: string;\n iteration: number;\n passed: boolean;\n results: ScorerResult[];\n duration: number;\n timedOut: boolean;\n reason?: string;\n maxIterationReached: boolean;\n suppressFeedback: boolean;\n}\n\ninterface RoutingAgentAbortPayload {\n primitiveType: 'routing';\n primitiveId: string;\n}\n\ninterface AgentExecutionAbortPayload {\n primitiveType: 'agent';\n primitiveId: string;\n}\n\ninterface WorkflowExecutionAbortPayload {\n primitiveType: 'workflow';\n primitiveId: string;\n}\n\ninterface ToolExecutionAbortPayload {\n primitiveType: 'tool';\n primitiveId: string;\n}\n\ninterface ToolCallApprovalPayload {\n toolCallId: string;\n toolName: string;\n args: Record<string, any>;\n resumeSchema: string;\n}\n\ninterface ToolCallSuspendedPayload {\n toolCallId: string;\n toolName: string;\n suspendPayload: any;\n args: Record<string, any>;\n resumeSchema: string;\n}\n\nexport type DataChunkType = {\n type: `data-${string}`;\n data: any;\n id?: string;\n /** When true, the chunk is streamed to the client but not persisted to storage. */\n transient?: boolean;\n};\n\nexport type NetworkChunkType<OUTPUT = undefined> =\n | (BaseChunkType & { type: 'routing-agent-start'; payload: RoutingAgentStartPayload })\n | (BaseChunkType & { type: 'routing-agent-text-delta'; payload: RoutingAgentTextDeltaPayload })\n | (BaseChunkType & { type: 'routing-agent-text-start'; payload: RoutingAgentTextStartPayload })\n | (BaseChunkType & { type: 'routing-agent-end'; payload: RoutingAgentEndPayload })\n | (BaseChunkType & { type: 'routing-agent-abort'; payload: RoutingAgentAbortPayload })\n | (BaseChunkType & { type: 'agent-execution-start'; payload: AgentExecutionStartPayload })\n | (BaseChunkType & { type: 'agent-execution-approval'; payload: AgentExecutionApprovalPayload })\n | (BaseChunkType & { type: 'agent-execution-suspended'; payload: AgentExecutionSuspendedPayload })\n | (BaseChunkType & { type: 'agent-execution-end'; payload: AgentExecutionEndPayload })\n | (BaseChunkType & { type: 'agent-execution-abort'; payload: AgentExecutionAbortPayload })\n | (BaseChunkType & { type: 'workflow-execution-start'; payload: WorkflowExecutionStartPayload })\n | (BaseChunkType & { type: 'workflow-execution-end'; payload: WorkflowExecutionEndPayload })\n | (BaseChunkType & { type: 'workflow-execution-suspended'; payload: WorkflowExecutionSuspendPayload })\n | (BaseChunkType & { type: 'workflow-execution-abort'; payload: WorkflowExecutionAbortPayload })\n | (BaseChunkType & { type: 'tool-execution-start'; payload: ToolExecutionStartPayload })\n | (BaseChunkType & { type: 'tool-execution-end'; payload: ToolExecutionEndPayload })\n | (BaseChunkType & { type: 'tool-execution-approval'; payload: ToolExecutionApprovalPayload })\n | (BaseChunkType & { type: 'tool-execution-suspended'; payload: ToolExecutionSuspendedPayload })\n | (BaseChunkType & { type: 'tool-execution-abort'; payload: ToolExecutionAbortPayload })\n | (BaseChunkType & { type: 'network-execution-event-step-finish'; payload: NetworkStepFinishPayload })\n | (BaseChunkType & { type: 'network-execution-event-finish'; payload: NetworkFinishPayload<OUTPUT> })\n | (BaseChunkType & { type: 'network-validation-start'; payload: NetworkValidationStartPayload })\n | (BaseChunkType & { type: 'network-validation-end'; payload: NetworkValidationEndPayload })\n | (BaseChunkType & { type: `agent-execution-event-${string}`; payload: AgentChunkType })\n | (BaseChunkType & { type: `workflow-execution-event-${string}`; payload: WorkflowStreamEvent })\n | (BaseChunkType & { type: 'network-object'; payload: { object: Partial<OUTPUT> } })\n | (BaseChunkType & { type: 'network-object-result'; payload: { object: OUTPUT } });\n\n// Strongly typed chunk type (currently only OUTPUT is strongly typed, tools use dynamic types)\nexport type AgentChunkType<OUTPUT = undefined> =\n | (BaseChunkType & { type: 'response-metadata'; payload: ResponseMetadataPayload })\n | (BaseChunkType & { type: 'text-start'; payload: TextStartPayload })\n | (BaseChunkType & { type: 'text-delta'; payload: TextDeltaPayload })\n | (BaseChunkType & { type: 'text-end'; payload: TextEndPayload })\n | (BaseChunkType & { type: 'reasoning-start'; payload: ReasoningStartPayload })\n | (BaseChunkType & { type: 'reasoning-delta'; payload: ReasoningDeltaPayload })\n | (BaseChunkType & { type: 'reasoning-end'; payload: ReasoningEndPayload })\n | (BaseChunkType & { type: 'reasoning-signature'; payload: ReasoningSignaturePayload })\n | (BaseChunkType & { type: 'redacted-reasoning'; payload: RedactedReasoningPayload })\n | (BaseChunkType & { type: 'source'; payload: SourcePayload })\n | (BaseChunkType & { type: 'file'; payload: FilePayload })\n | (BaseChunkType & { type: 'tool-call'; payload: ToolCallPayload })\n | (BaseChunkType & { type: 'tool-call-approval'; payload: ToolCallApprovalPayload })\n | (BaseChunkType & { type: 'tool-call-suspended'; payload: ToolCallSuspendedPayload })\n | (BaseChunkType & { type: 'tool-result'; payload: ToolResultPayload })\n | (BaseChunkType & { type: 'tool-call-input-streaming-start'; payload: ToolCallInputStreamingStartPayload })\n | (BaseChunkType & { type: 'tool-call-delta'; payload: ToolCallDeltaPayload })\n | (BaseChunkType & { type: 'tool-call-input-streaming-end'; payload: ToolCallInputStreamingEndPayload })\n | (BaseChunkType & { type: 'finish'; payload: FinishPayload })\n | (BaseChunkType & { type: 'error'; payload: ErrorPayload })\n | (BaseChunkType & { type: 'raw'; payload: RawPayload })\n | (BaseChunkType & { type: 'start'; payload: StartPayload })\n | (BaseChunkType & { type: 'step-start'; payload: StepStartPayload })\n | (BaseChunkType & { type: 'step-finish'; payload: StepFinishPayload<ToolSet, OUTPUT> })\n | (BaseChunkType & { type: 'tool-error'; payload: ToolErrorPayload })\n | (BaseChunkType & { type: 'abort'; payload: AbortPayload })\n | (BaseChunkType & {\n type: 'object';\n object: Partial<OUTPUT>;\n })\n | (BaseChunkType & {\n /**\n * The object promise is resolved with the object from the object-result chunk\n */\n type: 'object-result';\n object: OUTPUT;\n })\n | (BaseChunkType & { type: 'tool-output'; payload: DynamicToolOutputPayload })\n | (BaseChunkType & { type: 'step-output'; payload: StepOutputPayload })\n | (BaseChunkType & { type: 'watch'; payload: WatchPayload })\n | (BaseChunkType & { type: 'tripwire'; payload: TripwirePayload })\n | (BaseChunkType & { type: 'is-task-complete'; payload: IsTaskCompletePayload })\n | (BaseChunkType & { type: 'goal'; payload: GoalEvaluationPayload })\n | (BaseChunkType & {\n type: 'background-task-started';\n payload: BackgroundTaskStartedPayload;\n })\n | (BaseChunkType & {\n type: 'background-task-completed';\n payload: BackgroundTaskResultPayload;\n })\n | (BaseChunkType & {\n type: 'background-task-failed';\n payload: BackgroundTaskFailedPayload;\n })\n | (BaseChunkType & {\n type: 'background-task-progress';\n payload: BackgroundTaskProgressPayload;\n })\n | (BaseChunkType & {\n type: 'background-task-running';\n payload: BackgroundTaskRunningPayload;\n })\n | (BaseChunkType & {\n type: 'background-task-cancelled';\n payload: BackgroundTaskCancelledPayload;\n })\n | (BaseChunkType & {\n type: 'background-task-output';\n payload: BackgroundTaskOutputPayload;\n })\n | (BaseChunkType & {\n type: 'background-task-suspended';\n payload: BackgroundTaskSuspendedPayload;\n })\n | (BaseChunkType & {\n type: 'background-task-resumed';\n payload: BackgroundTaskResumedPayload;\n });\n\nexport type WorkflowStreamEvent =\n | (BaseChunkType & {\n type: 'workflow-start';\n payload: {\n workflowId: string;\n };\n })\n | (BaseChunkType & {\n type: 'workflow-finish';\n payload: {\n workflowStatus: WorkflowRunStatus;\n finalWorkflowResult?: unknown;\n output: {\n usage: {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n };\n };\n metadata: Record<string, any>;\n };\n })\n | (BaseChunkType & {\n type: 'workflow-canceled';\n payload: {};\n })\n | (BaseChunkType & {\n type: 'workflow-paused';\n payload: {};\n })\n | (BaseChunkType & {\n type: 'workflow-step-start';\n id: string;\n payload: {\n id: string;\n stepCallId: string;\n status: WorkflowStepStatus;\n output?: Record<string, any>;\n payload?: Record<string, any>;\n resumePayload?: Record<string, any>;\n suspendPayload?: Record<string, any>;\n };\n })\n | (BaseChunkType & {\n type: 'workflow-step-finish';\n payload: {\n id: string;\n metadata: Record<string, any>;\n };\n })\n | (BaseChunkType & {\n type: 'workflow-step-suspended';\n payload: {\n id: string;\n status: WorkflowStepStatus;\n output?: Record<string, any>;\n payload?: Record<string, any>;\n resumePayload?: Record<string, any>;\n suspendPayload?: Record<string, any>;\n };\n })\n | (BaseChunkType & {\n type: 'workflow-step-waiting';\n payload: {\n id: string;\n payload: Record<string, any>;\n startedAt: number;\n status: WorkflowStepStatus;\n };\n })\n | (BaseChunkType & { type: 'workflow-step-output'; payload: StepOutputPayload })\n | (BaseChunkType & {\n type: 'workflow-step-progress';\n payload: {\n id: string;\n /** Number of iterations completed so far */\n completedCount: number;\n /** Total number of iterations */\n totalCount: number;\n /** Index of the iteration that just completed */\n currentIndex: number;\n /** Status of the iteration that just completed */\n iterationStatus: 'success' | 'failed' | 'suspended';\n /** Output of the iteration that just completed (if successful) */\n iterationOutput?: Record<string, any>;\n };\n })\n | (BaseChunkType & {\n type: 'workflow-step-result';\n payload: {\n id: string;\n stepCallId: string;\n status: WorkflowStepStatus;\n output?: Record<string, any>;\n payload?: Record<string, any>;\n resumePayload?: Record<string, any>;\n suspendPayload?: Record<string, any>;\n /** Tripwire data when step failed due to processor rejection */\n tripwire?: StepTripwireData;\n };\n });\n\n// Strongly typed chunk type (currently only OUTPUT is strongly typed, tools use dynamic types)\nexport type TypedChunkType<OUTPUT = undefined> =\n | AgentChunkType<OUTPUT>\n | WorkflowStreamEvent\n | NetworkChunkType<OUTPUT>\n | (DataChunkType & { from: never; runId: never; metadata?: BaseChunkType['metadata']; payload: never });\n\n// Default ChunkType for backward compatibility using dynamic (any) tool types\nexport type ChunkType<OUTPUT = undefined> = TypedChunkType<OUTPUT>;\nexport type StreamChunkType<OUTPUT = undefined> = ChunkType<OUTPUT> | DataChunkType;\n\nexport interface LanguageModelV2StreamResult {\n stream: ReadableStream<LanguageModelV2StreamPart>;\n request: LLMStepResult['request'];\n response?: LLMStepResult['response'];\n rawResponse: LLMStepResult['response'] | Record<string, never>;\n warnings?: LLMStepResult['warnings'];\n}\n\nexport type OnResult = (result: Omit<LanguageModelV2StreamResult, 'stream'>) => void | ChunkType | ChunkType[];\nexport type CreateStream = () => Promise<LanguageModelV2StreamResult>;\n\nexport type SourceChunk = BaseChunkType & { type: 'source'; payload: SourcePayload };\nexport type FileChunk = BaseChunkType & { type: 'file'; payload: FilePayload };\nexport type ToolCallChunk = BaseChunkType & { type: 'tool-call'; payload: ToolCallPayload };\nexport type ToolResultChunk = BaseChunkType & { type: 'tool-result'; payload: ToolResultPayload };\nexport type ReasoningChunk = BaseChunkType & { type: 'reasoning'; payload: ReasoningDeltaPayload };\n\nexport type PendingToolCall = {\n toolCallId: string;\n toolName: string;\n argsText: string;\n state: 'input-streaming' | 'input-available';\n providerExecuted?: boolean;\n providerMetadata?: ProviderMetadata;\n dynamic?: boolean;\n};\n\nexport type ExecuteStreamModelManager<T> = (\n callback: (modelConfig: ModelManagerModelConfig, isLastModel: boolean) => Promise<T>,\n) => Promise<T>;\n\nexport type ModelManagerModelConfig = {\n model: MastraLanguageModel;\n maxRetries: number;\n id: string;\n headers?: Record<string, string>;\n modelSettings?: Omit<CallSettings, 'abortSignal' | 'maxRetries' | 'headers'>;\n providerOptions?: SharedProviderOptions;\n};\n\n/**\n * Extended usage type that includes raw provider data.\n * Extends LanguageModelV2Usage with additional fields for V3 compatibility.\n */\nexport type LanguageModelUsage = LanguageModelV2Usage & {\n reasoningTokens?: number;\n cachedInputTokens?: number;\n cacheCreationInputTokens?: number;\n /**\n * Raw usage data from the provider, preserved for advanced use cases.\n * For V3 models, contains the full nested structure:\n * { inputTokens: { total, noCache, cacheRead, cacheWrite }, outputTokens: { total, text, reasoning } }\n */\n raw?: unknown;\n};\n\nexport type partialModel = {\n modelId?: string;\n provider?: string;\n version?: string;\n};\n\nexport type MastraOnStepFinishCallback<OUTPUT = undefined> = (\n event: LLMStepResult<OUTPUT> & { model?: partialModel; runId?: string },\n) => Promise<void> | void;\n\nexport type MastraOnFinishCallbackArgs<OUTPUT = undefined> = LLMStepResult<OUTPUT> & {\n error?: Error | string | { message: string; stack: string };\n object?: OUTPUT;\n steps: LLMStepResult<OUTPUT>[];\n totalUsage: LanguageModelUsage;\n model?: partialModel;\n runId?: string;\n};\n\nexport type MastraOnFinishCallback<OUTPUT = undefined> = (\n event: MastraOnFinishCallbackArgs<OUTPUT>,\n) => Promise<void> | void;\n\n/**\n * Creates a fresh transform for a Mastra model output stream.\n *\n * @experimental This API may change in a future release.\n */\nexport type MastraStreamTransform<OUTPUT = undefined> = () => TransformStream<ChunkType<OUTPUT>, ChunkType<OUTPUT>>;\n\n/** @experimental This API may change in a future release. */\nexport type MastraStreamTransformOptions<OUTPUT = undefined> =\n | MastraStreamTransform<OUTPUT>\n | readonly MastraStreamTransform<OUTPUT>[];\n\nexport type MastraModelOutputOptions<OUTPUT = undefined> = {\n runId: string;\n toolCallStreaming?: boolean;\n onFinish?: MastraOnFinishCallback<OUTPUT>;\n onStepFinish?: MastraOnStepFinishCallback<OUTPUT>;\n includeRawChunks?: boolean;\n structuredOutput?: StructuredOutputOptions<OUTPUT>;\n outputProcessors?: OutputProcessorOrWorkflow[];\n isLLMExecutionStep?: boolean;\n /**\n * When true, force text/finishReason promise resolution at step-finish even\n * when `isLLMExecutionStep` is set. Durable agents have a single\n * MastraModelOutput for the entire run that needs both per-chunk output\n * processor processing (isLLMExecutionStep) AND final promise resolution.\n */\n resolveFinalPromises?: boolean;\n returnScorerData?: boolean;\n processorStates?: Map<string, any>;\n requestContext?: RequestContext;\n transportRef?: StreamTransportRef;\n /** Experimental transforms applied whenever `fullStream` is consumed. */\n experimentalTransform?: MastraStreamTransformOptions<OUTPUT>;\n} & Partial<ObservabilityContext>;\n\n/**\n * Tripwire data attached to a step when a processor triggers a tripwire.\n * When a step has tripwire data, its text is excluded from the final output.\n */\nexport interface StepTripwireData {\n /** The tripwire reason */\n reason: string;\n /** Whether retry was requested */\n retry?: boolean;\n /** Additional metadata from the tripwire */\n metadata?: unknown;\n /** ID of the processor that triggered the tripwire */\n processorId?: string;\n}\n\n/**\n * Extended StepResult that includes tripwire data.\n * This extends the AI SDK's StepResult with our custom tripwire field.\n */\nexport type MastraStepResult<Tools extends ToolSet = ToolSet> = StepResult<Tools> & {\n /** Tripwire data if this step was rejected by a processor */\n tripwire?: StepTripwireData;\n};\n\nexport type LLMStepResult<OUTPUT = undefined> = {\n stepType?: 'initial' | 'tool-result';\n toolCalls: ToolCallChunk[];\n pendingToolCalls?: PendingToolCall[];\n toolResults: ToolResultChunk[];\n dynamicToolCalls: ToolCallChunk[];\n dynamicToolResults: ToolResultChunk[];\n staticToolCalls: ToolCallChunk[];\n staticToolResults: ToolResultChunk[];\n files: FileChunk[];\n sources: SourceChunk[];\n text: string;\n reasoning: ReasoningChunk[];\n content: AIV5Type.StepResult<ToolSet>['content'];\n finishReason?: FinishReason | string;\n usage: LanguageModelUsage;\n warnings: LanguageModelV2CallWarning[];\n request: { body?: unknown };\n response: {\n headers?: Record<string, string>;\n messages?: StepResult<ToolSet>['response']['messages'];\n dbMessages?: MastraDBMessage[];\n uiMessages?: UIMessage<\n [OUTPUT] extends [undefined]\n ? undefined\n : {\n structuredOutput?: OUTPUT;\n } & Record<string, unknown>\n >[];\n id?: string;\n timestamp?: Date;\n modelId?: string;\n [key: string]: unknown;\n };\n reasoningText: string | undefined;\n providerMetadata: ProviderMetadata | undefined;\n /** Tripwire data if this step was rejected by a processor */\n tripwire?: StepTripwireData;\n};\n","import type { LanguageModelV3, LanguageModelV3CallOptions } from '@ai-sdk/provider-v6';\nimport type { MastraLanguageModelV3 } from '../../shared.types';\nimport { createStreamFromGenerateResult } from '../generate-to-stream';\n\ntype StreamResult = Awaited<ReturnType<LanguageModelV3['doStream']>>;\n\n/**\n * Remaps tool types from V2 format ('provider-defined') to V3 format ('provider').\n * Tools may arrive in V2 format when prepared upstream (e.g., by ToolBuilder or\n * prepareToolsAndToolChoice) without knowing the final model version. This ensures\n * provider tools (like openai.tools.webSearch()) work correctly with V3 models.\n */\nfunction remapToolsToV3(options: LanguageModelV3CallOptions): LanguageModelV3CallOptions {\n if (!options.tools?.length) {\n return options;\n }\n\n const remappedTools = options.tools.map((tool: Record<string, unknown>) => {\n if (tool.type === 'provider-defined') {\n return { ...tool, type: 'provider' as const };\n }\n return tool;\n });\n\n return {\n ...options,\n tools: remappedTools as typeof options.tools,\n };\n}\n\n/**\n * Wrapper class for AI SDK V6 (LanguageModelV3) that converts doGenerate to return\n * a stream format for consistency with Mastra's streaming architecture.\n */\nexport class AISDKV6LanguageModel implements MastraLanguageModelV3 {\n /**\n * The language model must specify which language model interface version it implements.\n */\n readonly specificationVersion: 'v3' = 'v3';\n /**\n * Name of the provider for logging purposes.\n */\n readonly provider: string;\n /**\n * Provider-specific model ID for logging purposes.\n */\n readonly modelId: string;\n /**\n * Supported URL patterns by media type for the provider.\n *\n * The keys are media type patterns or full media types (e.g. `*\\/*` for everything, `audio/*`, `video/*`, or `application/pdf`).\n * and the values are arrays of regular expressions that match the URL paths.\n * The matching should be against lower-case URLs.\n * Matched URLs are supported natively by the model and are not downloaded.\n * @returns A map of supported URL patterns by media type (as a promise or a plain object).\n */\n supportedUrls: PromiseLike<Record<string, RegExp[]>> | Record<string, RegExp[]>;\n\n #model: LanguageModelV3;\n\n constructor(config: LanguageModelV3) {\n this.#model = config;\n this.provider = this.#model.provider;\n this.modelId = this.#model.modelId;\n this.supportedUrls = this.#model.supportedUrls;\n }\n\n async doGenerate(options: LanguageModelV3CallOptions) {\n const result = await this.#model.doGenerate(remapToolsToV3(options));\n\n return {\n ...result,\n request: result.request!,\n response: result.response as unknown as StreamResult['response'],\n stream: createStreamFromGenerateResult(result),\n };\n }\n\n async doStream(options: LanguageModelV3CallOptions) {\n return await this.#model.doStream(remapToolsToV3(options));\n }\n\n /**\n * Custom serialization for tracing/observability spans.\n * `#model` is already a true JS private field and not enumerable, so\n * the wrapped provider SDK client can't leak. This method makes the\n * safe shape explicit and avoids walking `supportedUrls` (a\n * PromiseLike / regex map that isn't useful in spans).\n */\n serializeForSpan(): { specificationVersion: 'v3'; modelId: string; provider: string } {\n return {\n specificationVersion: this.specificationVersion,\n modelId: this.modelId,\n provider: this.provider,\n };\n }\n}\n","import type {\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4File,\n LanguageModelV4FilePart,\n LanguageModelV4StreamPart,\n} from '@ai-sdk/provider-v7';\nimport { convertToDataContent } from '../../../../stream/aisdk/v5/compat/content';\nimport type { MastraLanguageModelV4 } from '../../shared.types';\nimport { createStreamFromGenerateResult } from '../generate-to-stream';\n\ntype StreamResult = Awaited<ReturnType<LanguageModelV4['doStream']>>;\ntype GenerateResult = Awaited<ReturnType<LanguageModelV4['doGenerate']>>;\ntype LegacyFileData = string | URL | Uint8Array | ArrayBuffer;\ntype FileData = LegacyFileData | LanguageModelV4FilePart['data'];\n\n/**\n * Remaps tool types from V2 format ('provider-defined') to V4 format ('provider').\n * Tools may arrive in V2 format when prepared upstream (e.g., by ToolBuilder or\n * prepareToolsAndToolChoice) without knowing the final model version. This ensures\n * provider tools (like openai.tools.webSearch()) work correctly with V4 models.\n *\n * V4 shares the V3 convention ('provider'), so the same remap applies.\n */\nfunction remapToolsToV4(options: LanguageModelV4CallOptions): LanguageModelV4CallOptions {\n if (!options.tools?.length) {\n return options;\n }\n\n const remappedTools = options.tools.map((tool: Record<string, unknown>) => {\n if (tool.type === 'provider-defined') {\n return { ...tool, type: 'provider' as const };\n }\n return tool;\n });\n\n return {\n ...options,\n tools: remappedTools as typeof options.tools,\n };\n}\n\nfunction isTaggedV4FileData(data: unknown): data is LanguageModelV4FilePart['data'] {\n if (typeof data !== 'object' || data === null || !('type' in data)) {\n return false;\n }\n\n const type = data.type;\n return type === 'data' || type === 'url' || type === 'reference' || type === 'text';\n}\n\n/**\n * The Agent loop calls V4 providers directly, bypassing AI SDK v7's prompt\n * conversion. Agent prompts may therefore still contain V2/V3 flat file data.\n * Convert that legacy shape while preserving already-normalized V4 data.\n */\nfunction normalizeFileDataForV4(data: FileData): {\n data: LanguageModelV4FilePart['data'];\n mediaType?: string;\n} {\n if (isTaggedV4FileData(data)) {\n return { data };\n }\n\n const { data: convertedData, mediaType } = convertToDataContent(data);\n\n return {\n data: convertedData instanceof URL ? { type: 'url', url: convertedData } : { type: 'data', data: convertedData },\n mediaType,\n };\n}\n\nfunction remapFilePartsToV4(options: LanguageModelV4CallOptions): LanguageModelV4CallOptions {\n let promptModified = false;\n const prompt = options.prompt.map(message => {\n if (message.role !== 'user' && message.role !== 'assistant') {\n return message;\n }\n\n let contentModified = false;\n const content = message.content.map(part => {\n if (part.type !== 'file') {\n return part;\n }\n\n const { data, mediaType } = normalizeFileDataForV4(part.data);\n if (data === part.data && mediaType == null) {\n return part;\n }\n\n contentModified = true;\n return {\n ...part,\n data,\n mediaType: mediaType ?? part.mediaType,\n };\n });\n\n if (!contentModified) {\n return message;\n }\n\n promptModified = true;\n return { ...message, content };\n });\n\n // The map only replaces file parts with file parts, but TS widens the\n // mapped message union across roles, so restore the prompt type.\n return promptModified ? { ...options, prompt: prompt as typeof options.prompt } : options;\n}\n\nfunction remapCallOptionsToV4(options: LanguageModelV4CallOptions): LanguageModelV4CallOptions {\n return remapToolsToV4(remapFilePartsToV4(options));\n}\n\n/**\n * V4 responses tag generated file data ({type: 'data' | 'url'}), but Mastra's\n * shared response pipeline (chunk transforms, file buffering, message\n * persistence) expects the flat V2/V3 shape (base64 string | Uint8Array).\n * Untag before handing results to the shared pipeline so file chunks and\n * persisted message history keep the