@databricks/ai-sdk-provider 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["chunk: ChatAgentChunk","response: ChatAgentResponse","parts: LanguageModelV2Content[]","prompt: LanguageModelV2Prompt","messages: ChatAgentResponse['messages']","msg: LanguageModelV2UserMessage","messageIndex: number","msg: LanguageModelV2AssistantMessage","startIndex: number","messages: ChatAgentMessage[]","msg: LanguageModelV2ToolMessage","output: LanguageModelV2ToolResultPart['output']","initialParts: LanguageModelV2StreamPart[]","last: LanguageModelV2StreamPart | null","applyDeltaBoundaryTransform: DatabricksStreamPartTransformer<\n LanguageModelV2StreamPart\n>","out: LanguageModelV2StreamPart[]","part?: LanguageModelV2StreamPart | null","part: LanguageModelV2StreamPart | null","part: DeltaPart","type: LanguageModelV2StreamPart['type']","part: LanguageModelV2StreamPart","id: string | undefined","group: ReturnType<typeof getDeltaGroup>","modelId: string","config: DatabricksLanguageModelConfig","options: Parameters<LanguageModelV2['doGenerate']>[0]","options: Parameters<LanguageModelV2['doStream']>[0]","finishReason: LanguageModelV2FinishReason","output: unknown","metadata: DatabricksToolMetadata | Record<string, unknown> | undefined","part: {\n callProviderMetadata?: Record<string, unknown>\n}","output: {\n type: string\n value?: unknown\n}","approve: boolean","chunk: ResponsesAgentChunk","parts: LanguageModelV2StreamPart[]","item: OutputItemDoneItem","response: ResponsesAgentResponse","parts: LanguageModelV2Content[]","input: ResponsesInput","warnings: Array<LanguageModelV2CallWarning>","_exhaustiveCheck: never","output: LanguageModelV2ToolResultPart['output']","responsesTools: Array<ResponsesTool>","toolChoice: LanguageModelV2ToolChoice | undefined","modelId: string","config: DatabricksLanguageModelConfig","options: Parameters<LanguageModelV2['doGenerate']>[0]","options: Parameters<LanguageModelV2['doStream']>[0]","finishReason: LanguageModelV2FinishReason","usage: LanguageModelV2Usage","allParts: LanguageModelV2StreamPart[]","incomingParts: LanguageModelV2StreamPart[]","previousParts: LanguageModelV2StreamPart[]","chunk: FmapiChunk","toolCallIdsByIndex?: Map<number, string>","parts: LanguageModelV2StreamPart[]","response: FmapiResponse","parts: LanguageModelV2Content[]","toolCall: FmapiToolCall","items: FmapiContentItem[]","id: string","prompt: LanguageModelV2Message[]","messages: Array<FmapiInputMessage>","message: LanguageModelV2SystemMessage","message: LanguageModelV2UserMessage","content: FmapiContentItem[]","message: LanguageModelV2AssistantMessage","contentItems: FmapiContentItem[]","toolCalls: Array<{\n id: string\n type: 'function'\n function: { name: string; arguments: string }\n }>","message: LanguageModelV2ToolMessage","messages: FmapiInputMessage[]","data: URL | string | Uint8Array","output: LanguageModelV2ToolResultPart['output']","part: LanguageModelV2ToolCallPart","modelId: string","config: DatabricksLanguageModelConfig","options: Parameters<LanguageModelV2['doGenerate']>[0]","finishReason: LanguageModelV2FinishReason","options: Parameters<LanguageModelV2['doStream']>[0]","tool: LanguageModelV2FunctionTool | { type: 'provider-defined'; id: string }","toolChoice: LanguageModelV2ToolChoice","settings: DatabricksProviderSettings","modelId: string","name: string"],"sources":["../src/chat-agent-language-model/chat-agent-schema.ts","../src/tools.ts","../src/chat-agent-language-model/chat-agent-convert-to-message-parts.ts","../src/chat-agent-language-model/chat-agent-convert-to-input.ts","../src/stream-transformers/compose-stream-part-transformers.ts","../src/stream-transformers/databricks-delta-boundary.ts","../src/stream-transformers/databricks-stream-transformer.ts","../src/chat-agent-language-model/chat-agent-language-model.ts","../src/responses-agent-language-model/responses-agent-schema.ts","../src/mcp.ts","../src/responses-agent-language-model/responses-convert-to-message-parts.ts","../src/responses-agent-language-model/responses-convert-to-input.ts","../src/responses-agent-language-model/responses-prepare-tools.ts","../src/responses-agent-language-model/responses-agent-language-model.ts","../src/fmapi-language-model/fmapi-schema.ts","../src/fmapi-language-model/fmapi-convert-to-message-parts.ts","../src/fmapi-language-model/fmapi-convert-to-input.ts","../src/fmapi-language-model/fmapi-language-model.ts","../src/databricks-provider.ts"],"sourcesContent":["import { z } from 'zod/v4'\n\n// Tool call schema\nconst chatAgentToolCallSchema = z.object({\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n id: z.string(),\n})\n\n// Message schemas (discriminated by role)\nconst chatAgentAssistantMessageSchema = z.object({\n role: z.literal('assistant'),\n content: z.string(), // required, empty string allowed\n id: z.string(),\n name: z.string().optional(),\n tool_calls: z.array(chatAgentToolCallSchema).optional(),\n})\n\nconst chatAgentToolMessageSchema = z.object({\n role: z.literal('tool'),\n name: z.string(),\n content: z.string(),\n tool_call_id: z.string(),\n id: z.string(),\n attachments: z.record(z.string(), z.unknown()).optional(),\n})\n\nconst chatAgentUserMessageSchema = z.object({\n role: z.literal('user'),\n content: z.string(),\n id: z.string(),\n})\n\nexport const chatAgentMessageSchema = z.discriminatedUnion('role', [\n chatAgentAssistantMessageSchema,\n chatAgentToolMessageSchema,\n chatAgentUserMessageSchema,\n])\n\n// Stream chunk schema (used for SSE parsing)\nexport const chatAgentChunkSchema = z.object({\n id: z.string(),\n delta: chatAgentMessageSchema,\n})\n\n// Full response schema (not used in streaming handler, but kept for completeness)\nexport const chatAgentResponseSchema = z.object({\n id: z.string(),\n messages: z.array(chatAgentMessageSchema),\n})\n\n// Exported types for type-only imports in other modules\nexport type ChatAgentChunk = z.infer<typeof chatAgentChunkSchema>\nexport type ChatAgentResponse = z.infer<typeof chatAgentResponseSchema>\nexport type ChatAgentMessage = z.infer<typeof chatAgentMessageSchema>\n","import type { Tool } from '@ai-sdk/provider-utils'\nimport { z } from 'zod/v4'\n\nexport const DATABRICKS_TOOL_CALL_ID = 'databricks-tool-call'\n\n/**\n * The AI-SDK requires that tools used by the model are defined ahead of time.\n *\n * Since tool calls can be orchestrated by Databricks' agents we don't know the name, input, or output schemas\n * of the tools until the model is called.\n *\n * In the DatabricksProvider we transform all tool calls to fit this definition, and keep the\n * original name as part of the metadata. This allows us to parse any tool orchestrated by Databricks' agents,\n * while still being able to render the tool call and result in the UI, and pass it back to the model with the correct name.\n */\nexport const DATABRICKS_TOOL_DEFINITION = {\n name: DATABRICKS_TOOL_CALL_ID,\n description: 'Databricks tool call',\n // The input and output schemas are dynamic since its generated by the model\n inputSchema: z.any(),\n outputSchema: z.any(),\n} satisfies Tool\n","import type { LanguageModelV2Content, LanguageModelV2StreamPart } from '@ai-sdk/provider'\nimport { DATABRICKS_TOOL_CALL_ID } from '../tools'\nimport type { ChatAgentChunk, ChatAgentResponse } from './chat-agent-schema'\n\nexport const convertChatAgentChunkToMessagePart = (\n chunk: ChatAgentChunk\n): LanguageModelV2StreamPart[] => {\n const parts = [] as LanguageModelV2StreamPart[]\n if (chunk.delta.role === 'assistant') {\n if (chunk.delta.content) {\n parts.push({\n type: 'text-delta',\n id: chunk.delta.id,\n delta: chunk.delta.content,\n })\n }\n chunk.delta.tool_calls?.forEach((toolCall) => {\n parts.push({\n type: 'tool-call',\n toolCallId: toolCall.id,\n input: toolCall.function.arguments,\n toolName: toolCall.function.name,\n })\n })\n } else if (chunk.delta.role === 'tool') {\n parts.push({\n type: 'tool-result',\n toolCallId: chunk.delta.tool_call_id,\n result: chunk.delta.content,\n toolName: DATABRICKS_TOOL_CALL_ID,\n })\n }\n return parts\n}\n\nexport const convertChatAgentResponseToMessagePart = (\n response: ChatAgentResponse\n): LanguageModelV2Content[] => {\n const parts: LanguageModelV2Content[] = []\n for (const message of response.messages) {\n if (message.role === 'assistant') {\n parts.push({\n type: 'text',\n text: message.content,\n })\n for (const part of message.tool_calls ?? []) {\n parts.push({\n type: 'tool-call',\n toolCallId: part.id,\n input: part.function.arguments,\n toolName: part.function.name,\n })\n }\n } else if (message.role === 'tool') {\n parts.push({\n type: 'tool-result',\n toolCallId: message.tool_call_id,\n result: message.content,\n toolName: DATABRICKS_TOOL_CALL_ID,\n })\n }\n }\n return parts\n}\n","import type { LanguageModelV2Prompt, LanguageModelV2ToolResultPart } from '@ai-sdk/provider'\nimport type { ChatAgentResponse } from './chat-agent-schema'\n\ntype ChatAgentMessage = ChatAgentResponse['messages'][number]\ntype LanguageModelV2UserMessage = Extract<LanguageModelV2Prompt[number], { role: 'user' }>\ntype LanguageModelV2AssistantMessage = Extract<LanguageModelV2Prompt[number], { role: 'assistant' }>\ntype LanguageModelV2ToolMessage = Extract<LanguageModelV2Prompt[number], { role: 'tool' }>\n\nexport const convertLanguageModelV2PromptToChatAgentResponse = (\n prompt: LanguageModelV2Prompt\n): ChatAgentResponse['messages'] => {\n const messages: ChatAgentResponse['messages'] = []\n let messageIndex = 0\n\n for (const msg of prompt) {\n switch (msg.role) {\n case 'system':\n // System messages are prompt-only; they don't exist in ChatAgent responses.\n break\n\n case 'user': {\n const converted = convertUserMessage(msg, messageIndex)\n messages.push(converted)\n messageIndex++\n break\n }\n\n case 'assistant': {\n const converted = convertAssistantMessage(msg, messageIndex)\n messages.push(...converted)\n messageIndex += converted.length\n break\n }\n\n case 'tool': {\n const converted = convertToolMessage(msg, messageIndex)\n messages.push(...converted)\n messageIndex += converted.length\n break\n }\n }\n }\n\n return messages\n}\n\nconst convertUserMessage = (\n msg: LanguageModelV2UserMessage,\n messageIndex: number\n): ChatAgentMessage => {\n const text = (msg.content ?? [])\n .filter((part): part is Extract<typeof part, { type: 'text' }> => part.type === 'text')\n .map((part) => part.text)\n .join('\\n')\n\n return {\n role: 'user',\n content: text,\n id: `user-${messageIndex}`,\n }\n}\n\nconst convertAssistantMessage = (\n msg: LanguageModelV2AssistantMessage,\n startIndex: number\n): ChatAgentMessage[] => {\n const messages: ChatAgentMessage[] = []\n let messageIndex = startIndex\n\n const textContent = (msg.content ?? [])\n .filter((part) => part.type === 'text' || part.type === 'reasoning')\n .map((part) => (part.type === 'text' ? part.text : part.text))\n .join('\\n')\n\n const toolCalls = (msg.content ?? [])\n .filter(\n (part): part is Extract<typeof part, { type: 'tool-call' }> => part.type === 'tool-call'\n )\n .map((call) => ({\n type: 'function' as const,\n id: call.toolCallId,\n function: {\n name: call.toolName,\n arguments: typeof call.input === 'string' ? call.input : JSON.stringify(call.input ?? {}),\n },\n }))\n\n messages.push({\n role: 'assistant',\n content: textContent,\n id: `assistant-${messageIndex++}`,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n })\n\n // Convert any tool results embedded in the assistant message into separate tool messages.\n for (const part of msg.content ?? []) {\n if (part.type === 'tool-result') {\n messages.push({\n role: 'tool',\n name: part.toolName,\n content: convertToolResultOutput(part.output),\n tool_call_id: part.toolCallId,\n id: `tool-${messageIndex++}`,\n })\n }\n }\n\n return messages\n}\n\nconst convertToolMessage = (\n msg: LanguageModelV2ToolMessage,\n startIndex: number\n): ChatAgentMessage[] => {\n const messages: ChatAgentMessage[] = []\n let messageIndex = startIndex\n\n for (const part of msg.content ?? []) {\n if (part.type === 'tool-result') {\n messages.push({\n role: 'tool',\n name: part.toolName,\n content: convertToolResultOutput(part.output),\n tool_call_id: part.toolCallId,\n id: `tool-${messageIndex++}`,\n })\n }\n }\n\n return messages\n}\n\nconst convertToolResultOutput = (output: LanguageModelV2ToolResultPart['output']): string => {\n switch (output.type) {\n case 'text':\n case 'error-text':\n return output.value\n case 'json':\n case 'error-json':\n return JSON.stringify(output.value)\n case 'content':\n return output.value\n .map((p) => (p.type === 'text' ? p.text : ''))\n .filter(Boolean)\n .join('\\n')\n default:\n return ''\n }\n}\n","import type { LanguageModelV2StreamPart } from '@ai-sdk/provider'\n\nexport type DatabricksStreamPartTransformer<Out extends LanguageModelV2StreamPart> = (\n parts: LanguageModelV2StreamPart[],\n last: LanguageModelV2StreamPart | null\n) => {\n out: Out[]\n}\n\n/* -----------------------------------------------------------------\n Tiny helpers for the type‑level plumbing\n ----------------------------------------------------------------- */\n\n/** Extract the element type (`Out`) from a concrete transformer. */\ntype OutElement<TFn> = TFn extends (parts: any, last: any) => { out: (infer O)[] } ? O : never\n\n/** Return the last element of a tuple type. */\ntype Last<T extends any[]> = T extends [...any[], infer L] ? L : never\n\n/**\n * Compose an arbitrary number of `DatabricksStreamPartTransformer`s.\n *\n * The returned function has the exact same signature as a normal transformer,\n * but its `out`‑element type is inferred from the **last** transformer you pass\n * in.\n *\n * Runtime behaviour:\n * 1️⃣ Call the first transformer with the supplied `parts` and the\n * caller‑provided `last` (usually `null`).\n * 2️⃣ Take its `out` and `last` and feed them to the next transformer.\n * 3️⃣ …repeat until the last transformer runs.\n * 4️⃣ Return the `out`/`last` of that final transformer.\n */\nexport function composeDatabricksStreamPartTransformers<\n T extends DatabricksStreamPartTransformer<any>[],\n>(...transformers: T): DatabricksStreamPartTransformer<OutElement<Last<T>>> {\n // The generic `OutElement<Last<T>>` is the element type of the **last**\n // transformer, so the returned function has the correct inferred type.\n return (\n initialParts: LanguageModelV2StreamPart[],\n last: LanguageModelV2StreamPart | null = null\n ) => {\n // ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑-\n // Runtime state that moves through the pipeline\n // ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑-\n let currentParts = initialParts\n\n // Execute each transformer in order, threading the two values.\n for (const fn of transformers) {\n const result = fn(currentParts, last)\n currentParts = result.out as LanguageModelV2StreamPart[]\n }\n\n // `OutElement<Last<T>>` is exactly the element type that the *last*\n // transformer emitted, so the cast is safe.\n return {\n out: currentParts as OutElement<Last<T>>[],\n }\n }\n}\n","import type { LanguageModelV2StreamPart } from '@ai-sdk/provider'\nimport type { DatabricksStreamPartTransformer } from './compose-stream-part-transformers'\n\ntype DeltaType = 'text' | 'reasoning'\n\n/**\n * Injects start/end deltas for sequential streams.\n */\nexport const applyDeltaBoundaryTransform: DatabricksStreamPartTransformer<\n LanguageModelV2StreamPart\n> = (parts, last) => {\n const out: LanguageModelV2StreamPart[] = []\n\n const lastDeltaType = maybeGetDeltaType(last)\n for (const incoming of parts) {\n const incomingDeltaType = maybeGetDeltaType(incoming)\n const incomingId = getPartId(incoming)\n const lastId = getPartId(last)\n\n // When continuous deltas are detected, we don't need to inject start/end deltas\n const incomingMatchesLast =\n // Only treat as a continuation when both are actual *-delta parts\n Boolean(isDeltaPart(last) && isDeltaPart(incoming)) &&\n Boolean(lastDeltaType && incomingDeltaType) &&\n Boolean(lastDeltaType === incomingDeltaType) && // Same delta group (text/reasoning)\n Boolean(incomingId && lastId && incomingId === lastId) // Same id\n\n if (incomingMatchesLast) {\n out.push(incoming)\n continue\n }\n\n // If there's no delta continuation, and the last part is a delta, we need to end it\n if (isDeltaPart(last)) {\n out.push({ type: `${getDeltaType(last)}-end`, id: last.id })\n }\n\n // If there's a new delta, we need to start it\n if (isDeltaPart(incoming)) {\n out.push({ type: `${getDeltaType(incoming)}-start`, id: incoming.id }, incoming)\n continue\n }\n\n // Otherwise, just push the incoming part\n out.push(incoming)\n continue\n }\n\n return { out }\n}\n\ntype DeltaPart = Extract<LanguageModelV2StreamPart, { type: `${DeltaType}-${string}` }>\nconst isDeltaIsh = (part?: LanguageModelV2StreamPart | null): part is DeltaPart =>\n part?.type.startsWith('text-') || part?.type.startsWith('reasoning-') || false\n\nconst maybeGetDeltaType = (part: LanguageModelV2StreamPart | null) => {\n if (!isDeltaIsh(part)) return null\n if (part.type.startsWith('text-')) return 'text'\n if (part.type.startsWith('reasoning-')) return 'reasoning'\n return null\n}\n\nconst getDeltaType = (part: DeltaPart) => {\n if (part.type.startsWith('text-')) return 'text'\n if (part.type.startsWith('reasoning-')) return 'reasoning'\n throw new Error(`Unknown delta type: ${part.type}`)\n}\n\nconst isDeltaPart = (\n part: LanguageModelV2StreamPart | null\n): part is Extract<LanguageModelV2StreamPart, { type: `${DeltaType}-delta` }> =>\n part?.type === 'text-delta' || part?.type === 'reasoning-delta'\n\nconst getPartId = (part: LanguageModelV2StreamPart | null): string | undefined => {\n if (part && 'id' in part) return part.id\n return undefined\n}\n","import type { LanguageModelV2StreamPart } from '@ai-sdk/provider'\n\nimport { composeDatabricksStreamPartTransformers } from './compose-stream-part-transformers'\nimport { applyDeltaBoundaryTransform } from './databricks-delta-boundary'\n\n/**\n * Allows stream transformations to be composed together.\n *\n * Currently only used to automatically inject start/end\n * deltas since the APIs does not supply the necessary events.\n */\nexport const getDatabricksLanguageModelTransformStream = () => {\n let lastChunk = null as LanguageModelV2StreamPart | null\n const deltaEndByTypeAndId = new Set<string>()\n const transformerStreamParts = composeDatabricksStreamPartTransformers(\n applyDeltaBoundaryTransform\n )\n return new TransformStream<LanguageModelV2StreamPart, LanguageModelV2StreamPart>({\n transform(chunk, controller) {\n // Apply transformation functions to the incoming chunks\n const { out } = transformerStreamParts([chunk], lastChunk)\n\n // Enqueue the transformed chunks with deduplication\n out.forEach((transformedChunk) => {\n const group = getDeltaGroup(transformedChunk.type)\n const endKey = makeEndKey(getPartId(transformedChunk), group)\n if (endKey && deltaEndByTypeAndId.has(endKey)) {\n // If we already ended this specific group (text/reasoning) for this id, skip further parts of the same group\n return\n }\n if (transformedChunk.type === 'text-end' || transformedChunk.type === 'reasoning-end') {\n /**\n * We register when a delta ends.\n * We rely on response.output_item.done chunks to display non streamed data\n * so we need to deduplicate them with their corresponding delta chunks.\n */\n const endGroup = getDeltaGroup(transformedChunk.type)\n const key = makeEndKey(getPartId(transformedChunk), endGroup)\n if (key) deltaEndByTypeAndId.add(key)\n }\n controller.enqueue(transformedChunk)\n })\n\n // Update the last chunk\n lastChunk = out[out.length - 1] ?? lastChunk\n },\n flush(controller) {\n // Finally, if there's a dangling text-delta, close it\n if (lastChunk?.type === 'text-delta') {\n controller.enqueue({ type: 'text-end', id: lastChunk.id })\n }\n if (lastChunk?.type === 'reasoning-delta') {\n controller.enqueue({ type: 'reasoning-end', id: lastChunk.id })\n }\n },\n })\n}\n\n// Utility functions\nconst getDeltaGroup = (type: LanguageModelV2StreamPart['type']): 'text' | 'reasoning' | null => {\n if (type.startsWith('text-')) return 'text'\n if (type.startsWith('reasoning-')) return 'reasoning'\n return null\n}\nconst getPartId = (part: LanguageModelV2StreamPart): string | undefined => {\n if ('id' in part) return part.id\n return undefined\n}\nconst makeEndKey = (id: string | undefined, group: ReturnType<typeof getDeltaGroup>) =>\n id && group ? `${group}:${id}` : null\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider'\nimport {\n type ParseResult,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n createJsonErrorResponseHandler,\n postJsonToApi,\n} from '@ai-sdk/provider-utils'\nimport { z } from 'zod/v4'\nimport type { DatabricksLanguageModelConfig } from '../databricks-provider'\nimport { chatAgentResponseSchema, chatAgentChunkSchema } from './chat-agent-schema'\nimport {\n convertChatAgentChunkToMessagePart,\n convertChatAgentResponseToMessagePart,\n} from './chat-agent-convert-to-message-parts'\nimport { convertLanguageModelV2PromptToChatAgentResponse } from './chat-agent-convert-to-input'\nimport { getDatabricksLanguageModelTransformStream } from '../stream-transformers/databricks-stream-transformer'\n\nexport class DatabricksChatAgentLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2'\n\n readonly modelId: string\n\n private readonly config: DatabricksLanguageModelConfig\n\n constructor(modelId: string, config: DatabricksLanguageModelConfig) {\n this.modelId = modelId\n this.config = config\n }\n\n get provider(): string {\n return this.config.provider\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {}\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const networkArgs = this.getArgs({\n config: this.config,\n options,\n stream: false,\n modelId: this.modelId,\n })\n\n const { value: response } = await postJsonToApi({\n ...networkArgs,\n successfulResponseHandler: createJsonResponseHandler(chatAgentResponseSchema),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: (error) => JSON.stringify(error),\n isRetryable: () => false,\n }),\n })\n\n return {\n content: convertChatAgentResponseToMessagePart(response),\n finishReason: 'stop',\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n warnings: [],\n }\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const networkArgs = this.getArgs({\n config: this.config,\n options,\n stream: true,\n modelId: this.modelId,\n })\n\n const { responseHeaders, value: response } = await postJsonToApi({\n ...networkArgs,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: (error) => JSON.stringify(error),\n isRetryable: () => false,\n }),\n successfulResponseHandler: createEventSourceResponseHandler(chatAgentChunkSchema),\n })\n\n let finishReason: LanguageModelV2FinishReason = 'unknown'\n\n return {\n stream: response\n .pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof chatAgentChunkSchema>>,\n LanguageModelV2StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings: [] })\n },\n\n transform(chunk, controller) {\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue })\n }\n\n // // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = 'error'\n controller.enqueue({ type: 'error', error: chunk.error })\n return\n }\n\n const parts = convertChatAgentChunkToMessagePart(chunk.value)\n for (const part of parts) {\n controller.enqueue(part)\n }\n },\n\n flush(controller) {\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n })\n },\n })\n )\n .pipeThrough(getDatabricksLanguageModelTransformStream()),\n request: { body: networkArgs.body },\n response: { headers: responseHeaders },\n }\n }\n\n private getArgs({\n config,\n options,\n stream,\n modelId,\n }: {\n options: LanguageModelV2CallOptions\n config: DatabricksLanguageModelConfig\n stream: boolean\n modelId: string\n }) {\n return {\n body: {\n model: modelId,\n stream,\n messages: convertLanguageModelV2PromptToChatAgentResponse(options.prompt),\n },\n url: config.url({\n path: '/completions',\n }),\n headers: combineHeaders(config.headers(), options.headers),\n fetch: config.fetch,\n abortSignal: options.abortSignal,\n }\n }\n}\n","import { z } from 'zod/v4'\n\n/**\n * Response schema\n */\nconst responsesAgentMessageSchema = z.object({\n type: z.literal('message'),\n role: z.literal('assistant'),\n id: z.string(),\n content: z.array(\n z.object({\n type: z.literal('output_text'),\n text: z.string(),\n logprobs: z.unknown().nullish(),\n annotations: z.array(\n z.discriminatedUnion('type', [\n z.object({\n type: z.literal('url_citation'),\n start_index: z.number(),\n end_index: z.number(),\n url: z.string(),\n title: z.string(),\n }),\n ])\n ),\n })\n ),\n})\n\nconst responsesAgentFunctionCallSchema = z.object({\n type: z.literal('function_call'),\n call_id: z.string(),\n name: z.string(),\n arguments: z.string(),\n id: z.string(),\n})\n\nconst responsesAgentReasoningSchema = z.object({\n type: z.literal('reasoning'),\n id: z.string(),\n encrypted_content: z.string().nullish(),\n summary: z.array(\n z.object({\n type: z.literal('summary_text'),\n text: z.string(),\n })\n ),\n})\n\nconst responsesAgentFunctionCallOutputSchema = z.object({\n type: z.literal('function_call_output'),\n call_id: z.string(),\n output: z.any(),\n})\n\nconst responsesAgentMcpApprovalRequestSchema = z.object({\n type: z.literal('mcp_approval_request'),\n id: z.string(),\n name: z.string(),\n arguments: z.string(),\n server_label: z.string(),\n})\n\nconst responsesAgentMcpApprovalResponseSchema = z.object({\n type: z.literal('mcp_approval_response'),\n id: z.string().optional(),\n approval_request_id: z.string(),\n approve: z.boolean(),\n reason: z.string().nullish(),\n})\n\nconst responsesAgentOutputItem = z.discriminatedUnion('type', [\n responsesAgentMessageSchema,\n responsesAgentFunctionCallSchema,\n responsesAgentReasoningSchema,\n responsesAgentFunctionCallOutputSchema,\n responsesAgentMcpApprovalRequestSchema,\n responsesAgentMcpApprovalResponseSchema,\n])\n\nexport const responsesAgentResponseSchema = z.object({\n id: z.string().optional(),\n created_at: z.number().optional(),\n error: z\n .object({\n code: z.string(),\n message: z.string(),\n })\n .nullish(),\n model: z.string().optional(),\n output: z.array(responsesAgentOutputItem),\n incomplete_details: z\n .object({\n reason: z.enum(['max_output_tokens', 'content_filter']).optional(),\n })\n .nullish(),\n usage: z\n .object({\n input_tokens: z.number(),\n output_tokens: z.number(),\n total_tokens: z.number(),\n })\n .optional(),\n})\n\n/**\n * Chunk schema\n */\n\nconst textDeltaChunkSchema = z.object({\n type: z.literal('response.output_text.delta'),\n item_id: z.string(),\n delta: z.string(),\n logprobs: z.unknown().nullish(),\n})\n\nconst errorChunkSchema = z.object({\n type: z.literal('error'),\n code: z.string(),\n message: z.string(),\n param: z.string().nullish(),\n sequence_number: z.number(),\n})\n\nexport const simpleErrorChunkSchema = z.object({\n type: z.undefined().optional(),\n error: z.string(),\n})\n\nconst responseOutputItemDoneSchema = z.object({\n type: z.literal('response.output_item.done'),\n output_index: z.number(),\n item: responsesAgentOutputItem,\n})\n\nconst responseAnnotationAddedSchema = z.object({\n type: z.literal('response.output_text.annotation.added'),\n annotation: z.discriminatedUnion('type', [\n z.object({\n type: z.literal('url_citation'),\n url: z.string(),\n title: z.string(),\n }),\n ]),\n})\n\nconst responseReasoningSummaryTextDeltaSchema = z.object({\n type: z.literal('response.reasoning_summary_text.delta'),\n item_id: z.string(),\n summary_index: z.number(),\n delta: z.string(),\n})\n\nconst responseFunctionCallArgumentsDeltaSchema = z.object({\n type: z.literal('response.function_call_arguments.delta'),\n item_id: z.string(),\n delta: z.string(),\n output_index: z.number(),\n sequence_number: z.number(),\n})\n\nconst functionCallOutputChunkSchema = z.object({\n type: z.literal('function_call_output'),\n call_id: z.string(),\n output: z.any(),\n})\n\nconst responsesCompletedSchema = z.object({\n type: z.literal('responses.completed'),\n response: z.object({\n id: z.string(),\n status: z\n .enum(['completed', 'failed', 'in_progress', 'cancelled', 'queued', 'incomplete'])\n .optional(),\n incomplete_details: z\n .object({\n reason: z.enum(['max_output_tokens', 'content_filter']).optional(),\n })\n .nullish(),\n usage: z.object({\n input_tokens: z.number(),\n output_tokens: z.number(),\n total_tokens: z.number(),\n }),\n }),\n})\n\nexport const responsesAgentChunkSchema = z.union([\n textDeltaChunkSchema,\n responseOutputItemDoneSchema,\n responseAnnotationAddedSchema,\n responseReasoningSummaryTextDeltaSchema,\n responseFunctionCallArgumentsDeltaSchema,\n functionCallOutputChunkSchema,\n errorChunkSchema,\n responsesCompletedSchema,\n simpleErrorChunkSchema,\n])\n\n/**\n * We use a loose schema for response validation to handle unknown chunks.\n */\nexport const looseResponseAgentChunkSchema = z.union([\n responsesAgentChunkSchema,\n z.object({ type: z.string() }).loose(), // fallback for unknown chunks\n])\n\n// Exported types for type-only imports in other modules\nexport type ResponsesAgentChunk = z.infer<typeof responsesAgentChunkSchema>\nexport type ResponsesAgentResponse = z.infer<typeof responsesAgentResponseSchema>\n","/**\n * MCP Approval Utility Functions\n *\n * Shared utilities for handling MCP (Model Context Protocol) approval requests\n * and responses across client and server code.\n */\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Key used in tool output to indicate approval status */\nexport const MCP_APPROVAL_STATUS_KEY = '__approvalStatus__'\n\n/** Type string for MCP approval requests in provider metadata */\nexport const MCP_APPROVAL_REQUEST_TYPE = 'mcp_approval_request'\n\n/** Type string for MCP approval responses in provider metadata */\nexport const MCP_APPROVAL_RESPONSE_TYPE = 'mcp_approval_response'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Approval status output object shape */\nexport type ApprovalStatusOutput = {\n [MCP_APPROVAL_STATUS_KEY]: boolean\n}\n\n/** State of an MCP approval request */\nexport type McpApprovalState = 'awaiting-approval' | 'approved' | 'denied'\n\n/** Databricks-specific metadata attached to tool calls */\nexport interface DatabricksToolMetadata {\n type?: string\n toolName?: string\n itemId?: string\n serverLabel?: string\n mcpServerName?: string\n approvalRequestId?: string\n approve?: boolean\n reason?: string\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if output contains an approval status marker.\n *\n * @example\n * if (isApprovalStatusOutput(output)) {\n * console.log(output.__approvalStatus__); // TypeScript knows this is boolean\n * }\n */\nexport function isApprovalStatusOutput(output: unknown): output is ApprovalStatusOutput {\n return (\n typeof output === 'object' &&\n output !== null &&\n MCP_APPROVAL_STATUS_KEY in output &&\n typeof (output as Record<string, unknown>)[MCP_APPROVAL_STATUS_KEY] === 'boolean'\n )\n}\n\n/**\n * Check if provider metadata indicates an MCP approval request.\n *\n * @example\n * const metadata = extractDatabricksMetadata(part);\n * if (isMcpApprovalRequest(metadata)) {\n * // Handle MCP approval request\n * }\n */\nexport function isMcpApprovalRequest(\n metadata: DatabricksToolMetadata | Record<string, unknown> | undefined\n): boolean {\n return metadata?.type?.toString() === MCP_APPROVAL_REQUEST_TYPE\n}\n\n/**\n * Check if provider metadata indicates an MCP approval response.\n */\nexport function isMcpApprovalResponse(\n metadata: DatabricksToolMetadata | Record<string, unknown> | undefined\n): boolean {\n return metadata?.type?.toString() === MCP_APPROVAL_RESPONSE_TYPE\n}\n\n// ============================================================================\n// Extractors\n// ============================================================================\n\n/**\n * Extract Databricks metadata from a tool call part's callProviderMetadata.\n *\n * @example\n * const metadata = extractDatabricksMetadata(part);\n * const toolName = metadata?.toolName;\n * const isMcp = isMcpApprovalRequest(metadata);\n */\nexport function extractDatabricksMetadata(part: {\n callProviderMetadata?: Record<string, unknown>\n}): DatabricksToolMetadata | undefined {\n if ('callProviderMetadata' in part && part.callProviderMetadata?.databricks) {\n return part.callProviderMetadata.databricks as DatabricksToolMetadata\n }\n return undefined\n}\n\n/**\n * Extract the approval status boolean from an output object.\n *\n * @returns `true` if approved, `false` if denied, `undefined` if not an approval output\n *\n * @example\n * const status = extractApprovalStatus(output);\n * if (status !== undefined) {\n * console.log(status ? 'Approved' : 'Denied');\n * }\n */\nexport function extractApprovalStatus(output: unknown): boolean | undefined {\n if (isApprovalStatusOutput(output)) {\n return output[MCP_APPROVAL_STATUS_KEY]\n }\n return undefined\n}\n\n/**\n * Extract approval status from a tool result's output value.\n * Handles the nested structure where output.type === 'json' and value contains the status.\n *\n * @example\n * const status = extractApprovalStatusFromToolResult(toolResult.output);\n */\nexport function extractApprovalStatusFromToolResult(output: {\n type: string\n value?: unknown\n}): boolean | undefined {\n if (\n output.type === 'json' &&\n output.value &&\n typeof output.value === 'object' &&\n MCP_APPROVAL_STATUS_KEY in output.value\n ) {\n const value = (output.value as Record<string, unknown>)[MCP_APPROVAL_STATUS_KEY]\n if (typeof value === 'boolean') {\n return value\n }\n }\n return undefined\n}\n\n// ============================================================================\n// Factories\n// ============================================================================\n\n/**\n * Create an approval status output object.\n *\n * @example\n * await addToolResult({\n * toolCallId,\n * output: createApprovalStatusOutput(true), // Approve\n * });\n */\nexport function createApprovalStatusOutput(approve: boolean): ApprovalStatusOutput {\n return { [MCP_APPROVAL_STATUS_KEY]: approve }\n}\n\n// ============================================================================\n// State Helpers\n// ============================================================================\n\n/**\n * Determine the MCP approval state from a tool output.\n *\n * Logic:\n * - No output → 'awaiting-approval' (user hasn't responded yet)\n * - Output with __approvalStatus__: true → 'approved'\n * - Output with __approvalStatus__: false → 'denied'\n * - Output without __approvalStatus__ → 'approved' (tool executed, so it was approved)\n *\n * @example\n * const approvalState = getMcpApprovalState(part.output);\n * // 'awaiting-approval' | 'approved' | 'denied'\n */\nexport function getMcpApprovalState(output: unknown): McpApprovalState {\n if (!output) {\n return 'awaiting-approval'\n }\n\n const status = extractApprovalStatus(output)\n if (status === undefined) {\n // Has output but no approval marker means tool executed (was approved)\n return 'approved'\n }\n\n return status ? 'approved' : 'denied'\n}\n","import type { LanguageModelV2Content, LanguageModelV2StreamPart } from '@ai-sdk/provider'\nimport { randomUUID } from 'node:crypto'\nimport { type ResponsesAgentChunk, type ResponsesAgentResponse } from './responses-agent-schema'\nimport { DATABRICKS_TOOL_CALL_ID } from '../tools'\nimport {\n MCP_APPROVAL_REQUEST_TYPE,\n MCP_APPROVAL_RESPONSE_TYPE,\n createApprovalStatusOutput,\n} from '../mcp'\n\nexport const convertResponsesAgentChunkToMessagePart = (\n chunk: ResponsesAgentChunk\n): LanguageModelV2StreamPart[] => {\n const parts: LanguageModelV2StreamPart[] = []\n\n if ('error' in chunk) {\n parts.push({\n type: 'error',\n error: chunk.error,\n })\n return parts\n }\n\n switch (chunk.type) {\n case 'response.output_text.delta':\n parts.push({\n type: 'text-delta',\n id: chunk.item_id,\n delta: chunk.delta,\n providerMetadata: {\n databricks: {\n itemId: chunk.item_id,\n },\n },\n })\n break\n\n case 'response.reasoning_summary_text.delta':\n parts.push({\n type: 'reasoning-delta',\n id: chunk.item_id,\n delta: chunk.delta,\n providerMetadata: {\n databricks: {\n itemId: chunk.item_id,\n },\n },\n })\n break\n\n case 'function_call_output':\n parts.push({\n type: 'tool-result',\n toolCallId: chunk.call_id,\n result: chunk.output,\n toolName: DATABRICKS_TOOL_CALL_ID,\n })\n break\n\n case 'response.output_item.done':\n parts.push(...convertOutputItemDone(chunk.item))\n break\n\n case 'response.output_text.annotation.added':\n parts.push({\n type: 'source',\n url: chunk.annotation.url,\n title: chunk.annotation.title,\n id: randomUUID(),\n sourceType: 'url',\n })\n break\n\n case 'error':\n parts.push({\n type: 'error',\n error: chunk,\n })\n break\n\n default: {\n void (chunk as never)\n break\n }\n }\n\n return parts\n}\n\ntype OutputItemDoneItem = Extract<\n ResponsesAgentChunk,\n { type: 'response.output_item.done' }\n>['item']\n\nconst convertOutputItemDone = (item: OutputItemDoneItem): LanguageModelV2StreamPart[] => {\n switch (item.type) {\n case 'message': {\n const firstContent = item.content[0]\n if (!firstContent) return []\n return [\n {\n type: 'text-delta',\n id: item.id,\n delta: firstContent.text,\n providerMetadata: {\n databricks: {\n itemId: item.id,\n itemType: 'response.output_item.done',\n },\n },\n },\n ]\n }\n\n case 'function_call':\n return [\n {\n type: 'tool-call',\n toolCallId: item.call_id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n input: item.arguments,\n providerMetadata: {\n databricks: {\n toolName: item.name,\n itemId: item.id,\n },\n },\n },\n ]\n\n case 'function_call_output':\n return [\n {\n type: 'tool-result',\n toolCallId: item.call_id,\n result: item.output,\n toolName: DATABRICKS_TOOL_CALL_ID,\n },\n ]\n\n case 'reasoning': {\n const firstSummary = item.summary[0]\n if (!firstSummary) return []\n return [\n {\n type: 'reasoning-start',\n id: item.id,\n },\n {\n type: 'reasoning-delta',\n id: item.id,\n delta: firstSummary.text,\n providerMetadata: {\n databricks: {\n itemId: item.id,\n },\n },\n },\n {\n type: 'reasoning-end',\n id: item.id,\n },\n ]\n }\n\n case 'mcp_approval_request':\n return [\n {\n type: 'tool-call',\n toolCallId: item.id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n input: item.arguments,\n providerMetadata: {\n databricks: {\n type: MCP_APPROVAL_REQUEST_TYPE,\n toolName: item.name,\n itemId: item.id,\n serverLabel: item.server_label,\n },\n },\n },\n ]\n\n case 'mcp_approval_response':\n return [\n {\n type: 'tool-result',\n toolCallId: item.approval_request_id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n result: createApprovalStatusOutput(item.approve),\n providerMetadata: {\n databricks: {\n type: MCP_APPROVAL_RESPONSE_TYPE,\n ...(item.id != null && { itemId: item.id }),\n },\n },\n },\n ]\n\n default:\n void (item satisfies never)\n return []\n }\n}\n\nexport const convertResponsesAgentResponseToMessagePart = (\n response: ResponsesAgentResponse\n): LanguageModelV2Content[] => {\n const parts: LanguageModelV2Content[] = []\n\n for (const output of response.output) {\n switch (output.type) {\n case 'message': {\n for (const content of output.content) {\n if (content.type === 'output_text') {\n parts.push({\n type: 'text',\n text: content.text,\n providerMetadata: {\n databricks: {\n itemId: output.id,\n },\n },\n })\n }\n }\n break\n }\n\n case 'function_call':\n parts.push({\n type: 'tool-call',\n toolCallId: output.call_id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n input: output.arguments,\n providerMetadata: {\n databricks: {\n toolName: output.name,\n itemId: output.id,\n },\n },\n })\n break\n\n case 'reasoning':\n for (const summary of output.summary) {\n if (summary.type === 'summary_text') {\n parts.push({\n type: 'reasoning',\n text: summary.text,\n providerMetadata: {\n databricks: {\n itemId: output.id,\n },\n },\n })\n }\n }\n break\n\n case 'function_call_output':\n parts.push({\n type: 'tool-result',\n result: output.output,\n toolCallId: output.call_id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n })\n break\n\n case 'mcp_approval_request':\n parts.push({\n type: 'tool-call',\n toolCallId: output.id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n input: output.arguments,\n providerMetadata: {\n databricks: {\n type: MCP_APPROVAL_REQUEST_TYPE,\n toolName: output.name,\n itemId: output.id,\n serverLabel: output.server_label,\n },\n },\n })\n break\n\n case 'mcp_approval_response':\n parts.push({\n type: 'tool-result',\n toolCallId: output.approval_request_id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n result: createApprovalStatusOutput(output.approve),\n providerMetadata: {\n databricks: {\n type: MCP_APPROVAL_RESPONSE_TYPE,\n ...(output.id != null && { itemId: output.id }),\n },\n },\n })\n break\n default: {\n void (output satisfies never)\n break\n }\n }\n }\n\n return parts\n}\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV2CallWarning,\n type LanguageModelV2Prompt,\n type LanguageModelV2ToolResultPart,\n} from '@ai-sdk/provider'\nimport { parseProviderOptions } from '@ai-sdk/provider-utils'\nimport { z } from 'zod/v4'\nimport type { ResponsesInput } from './responses-api-types'\nimport {\n MCP_APPROVAL_REQUEST_TYPE,\n MCP_APPROVAL_RESPONSE_TYPE,\n extractApprovalStatusFromToolResult,\n} from '../mcp'\n\nexport async function convertToResponsesInput({\n prompt,\n systemMessageMode,\n}: {\n prompt: LanguageModelV2Prompt\n systemMessageMode: 'system' | 'developer' | 'remove'\n}): Promise<{\n input: ResponsesInput\n warnings: Array<LanguageModelV2CallWarning>\n}> {\n const input: ResponsesInput = []\n const warnings: Array<LanguageModelV2CallWarning> = []\n\n // Map tool call results to a map by tool call id so we can insert them into the input in the correct order,\n // right after the tool call that produced them.\n const toolCallResultsByToolCallId = prompt\n .filter((p) => p.role === 'tool')\n .flatMap((p) => p.content)\n .reduce(\n (reduction, toolCallResult) => {\n if (toolCallResult.type === 'tool-result') {\n reduction[toolCallResult.toolCallId] = toolCallResult\n }\n return reduction\n },\n {} as Record<string, LanguageModelV2ToolResultPart>\n )\n\n for (const { role, content } of prompt) {\n switch (role) {\n case 'system': {\n switch (systemMessageMode) {\n case 'system':\n input.push({ role: 'system', content })\n break\n\n case 'developer':\n input.push({ role: 'developer', content })\n break\n\n case 'remove':\n warnings.push({\n type: 'other',\n message: 'system messages are removed for this model',\n })\n break\n\n default: {\n const _exhaustiveCheck: never = systemMessageMode\n throw new Error(`Unsupported system message mode: ${String(_exhaustiveCheck)}`)\n }\n }\n break\n }\n\n case 'user':\n input.push({\n role: 'user',\n content: content.map((part) => {\n switch (part.type) {\n case 'text':\n return { type: 'input_text', text: part.text }\n default:\n throw new UnsupportedFunctionalityError({\n functionality: `part ${JSON.stringify(part)}`,\n })\n }\n }),\n })\n break\n\n case 'assistant':\n for (const part of content) {\n const providerOptions = await parseProviderOptions({\n provider: 'databricks',\n providerOptions: part.providerOptions,\n schema: ProviderOptionsSchema,\n })\n const itemId = providerOptions?.itemId ?? undefined\n switch (part.type) {\n case 'text': {\n input.push({\n role: 'assistant',\n content: [{ type: 'output_text', text: part.text }],\n id: itemId,\n })\n break\n }\n case 'tool-call': {\n const toolName = providerOptions?.toolName ?? part.toolName\n if (providerOptions?.type === MCP_APPROVAL_REQUEST_TYPE) {\n // Special case for MCP approval request\n const serverLabel = providerOptions?.serverLabel ?? ''\n const argumentsString = JSON.stringify(part.input)\n const id = part.toolCallId\n input.push({\n type: MCP_APPROVAL_REQUEST_TYPE,\n id: id,\n name: toolName,\n arguments: argumentsString,\n server_label: serverLabel,\n })\n const toolResult = toolCallResultsByToolCallId[part.toolCallId]\n if (toolResult) {\n /**\n * The tool call result is either the approval status or the actual output from the tool call.\n * If it's the approval status, we need to add an approval response part.\n * If it's the tool call output, we don't include the approval response part but we do include the tool call output part.\n */\n const approvalStatus = extractApprovalStatusFromToolResult(toolResult.output)\n if (approvalStatus !== undefined) {\n // Tool call result is just the approval status (approve or deny)\n input.push({\n type: MCP_APPROVAL_RESPONSE_TYPE,\n id: toolResult.toolCallId,\n approval_request_id: toolResult.toolCallId,\n approve: approvalStatus,\n })\n } else {\n // Tool call result is the actual tool result (tool was approved and executed)\n input.push({\n type: 'function_call_output',\n call_id: toolResult.toolCallId,\n output: convertToolResultOutputToString(toolResult.output),\n })\n }\n }\n break\n }\n input.push({\n type: 'function_call',\n call_id: part.toolCallId,\n name: toolName,\n arguments: JSON.stringify(part.input),\n id: itemId,\n })\n const toolCallResult = toolCallResultsByToolCallId[part.toolCallId]\n if (toolCallResult) {\n input.push({\n type: 'function_call_output',\n call_id: part.toolCallId,\n output: convertToolResultOutputToString(toolCallResult.output),\n })\n }\n break\n }\n\n case 'tool-result': {\n if (providerOptions?.type === MCP_APPROVAL_RESPONSE_TYPE) {\n // Special case for MCP approval response\n const approvalRequestId = providerOptions?.approvalRequestId ?? part.toolCallId\n const approve = providerOptions?.approve ?? false\n const reason = providerOptions?.reason ?? ''\n input.push({\n type: MCP_APPROVAL_RESPONSE_TYPE,\n id: approvalRequestId,\n approval_request_id: approvalRequestId,\n approve: approve,\n reason: reason,\n })\n break\n }\n input.push({\n type: 'function_call_output',\n call_id: part.toolCallId,\n output: convertToolResultOutputToString(part.output),\n })\n break\n }\n\n case 'reasoning': {\n if (!itemId) break\n input.push({\n type: 'reasoning',\n summary: [{ type: 'summary_text', text: part.text }],\n id: itemId,\n })\n break\n }\n }\n }\n break\n\n case 'tool':\n // Tool call results are already inserted into the input in the correct order,\n // right after the tool call that produced them.\n break\n\n default: {\n const _exhaustiveCheck: never = role\n throw new Error(`Unsupported role: ${String(_exhaustiveCheck)}`)\n }\n }\n }\n\n return { input, warnings }\n}\n\nconst ProviderOptionsSchema = z.object({\n itemId: z.string().nullish(),\n toolName: z.string().nullish(), // for tool-call\n type: z.enum(['mcp_approval_request', 'mcp_approval_response']).nullish(), // for mcp approval request and response\n serverLabel: z.string().nullish(), // for mcp approval request\n approvalRequestId: z.string().nullish(), // for mcp approval response\n approve: z.boolean().nullish(), // for mcp approval response\n reason: z.string().nullish(), // for mcp approval response\n})\n\nexport type ProviderOptions = z.infer<typeof ProviderOptionsSchema>\n\nconst convertToolResultOutputToString = (\n output: LanguageModelV2ToolResultPart['output']\n): string => {\n switch (output.type) {\n case 'text':\n case 'error-text':\n return output.value\n default:\n return JSON.stringify(output.value)\n }\n}\n","import type { LanguageModelV2FunctionTool, LanguageModelV2ToolChoice } from '@ai-sdk/provider'\nimport { DATABRICKS_TOOL_CALL_ID } from '../tools'\n\nexport type ResponsesTool = {\n type: 'function'\n name: string\n description?: string\n parameters?: unknown\n strict?: boolean\n}\n\nexport type ResponsesToolChoice = 'auto' | 'none' | 'required' | { type: 'function'; name: string }\n\n/**\n * Prepare tools for the Responses API format.\n * Unlike the chat completions API, the responses API expects function tools\n * with name, description, and parameters at the top level (not nested under 'function').\n */\nexport function prepareResponsesTools({\n tools,\n toolChoice,\n}: {\n tools?: Array<LanguageModelV2FunctionTool | { type: 'provider-defined'; id: string }>\n toolChoice?: LanguageModelV2ToolChoice\n}): {\n tools?: Array<ResponsesTool>\n toolChoice?: ResponsesToolChoice\n} {\n // When the tools array is empty, change it to undefined to prevent errors\n if (!tools || tools.length === 0) {\n return { tools: undefined, toolChoice: undefined }\n }\n\n const responsesTools: Array<ResponsesTool> = []\n\n for (const tool of tools) {\n if (tool.type === 'provider-defined' || tool.name === DATABRICKS_TOOL_CALL_ID) {\n // Skip provider-defined tools and Databricks-orchestrated tools\n continue\n }\n\n // Function tools - responses API format has properties at top level\n responsesTools.push({\n type: 'function',\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n })\n }\n\n if (responsesTools.length === 0) {\n return { tools: undefined, toolChoice: undefined }\n }\n\n // Convert tool choice\n const convertedToolChoice = convertResponsesToolChoice(toolChoice)\n\n return {\n tools: responsesTools,\n toolChoice: convertedToolChoice,\n }\n}\n\nfunction convertResponsesToolChoice(\n toolChoice: LanguageModelV2ToolChoice | undefined\n): ResponsesToolChoice | undefined {\n if (!toolChoice) {\n return undefined\n }\n\n switch (toolChoice.type) {\n case 'auto':\n return 'auto'\n case 'none':\n return 'none'\n case 'required':\n return 'required'\n case 'tool':\n return { type: 'function', name: toolChoice.toolName }\n default:\n return undefined\n }\n}\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n} from '@ai-sdk/provider'\nimport {\n type ParseResult,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n postJsonToApi,\n} from '@ai-sdk/provider-utils'\nimport { z } from 'zod/v4'\nimport type { DatabricksLanguageModelConfig } from '../databricks-provider'\nimport {\n responsesAgentResponseSchema,\n looseResponseAgentChunkSchema,\n type responsesAgentChunkSchema,\n} from './responses-agent-schema'\nimport {\n convertResponsesAgentChunkToMessagePart,\n convertResponsesAgentResponseToMessagePart,\n} from './responses-convert-to-message-parts'\nimport { convertToResponsesInput } from './responses-convert-to-input'\nimport { getDatabricksLanguageModelTransformStream } from '../stream-transformers/databricks-stream-transformer'\nimport { prepareResponsesTools } from './responses-prepare-tools'\n\nfunction mapResponsesFinishReason({\n finishReason,\n hasToolCalls,\n}: {\n finishReason: string | null | undefined\n hasToolCalls: boolean\n}): LanguageModelV2FinishReason {\n switch (finishReason) {\n case undefined:\n case null:\n return hasToolCalls ? 'tool-calls' : 'stop'\n case 'max_output_tokens':\n return 'length'\n case 'content_filter':\n return 'content-filter'\n default:\n return hasToolCalls ? 'tool-calls' : 'other'\n }\n}\n\nexport class DatabricksResponsesAgentLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2'\n\n readonly modelId: string\n\n private readonly config: DatabricksLanguageModelConfig\n\n constructor(modelId: string, config: DatabricksLanguageModelConfig) {\n this.modelId = modelId\n this.config = config\n }\n\n get provider(): string {\n return this.config.provider\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {}\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const networkArgs = await this.getArgs({\n config: this.config,\n options,\n stream: false,\n modelId: this.modelId,\n })\n\n const { value: response } = await postJsonToApi({\n ...networkArgs,\n successfulResponseHandler: createJsonResponseHandler(responsesAgentResponseSchema),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: (error) => JSON.stringify(error),\n isRetryable: () => false,\n }),\n })\n\n const content = convertResponsesAgentResponseToMessagePart(response)\n const hasToolCalls = content.some((p) => p.type === 'tool-call')\n\n return {\n content,\n finishReason: mapResponsesFinishReason({\n finishReason: response.incomplete_details?.reason,\n hasToolCalls,\n }),\n usage: {\n inputTokens: response.usage?.input_tokens ?? 0,\n outputTokens: response.usage?.output_tokens ?? 0,\n totalTokens: response.usage?.total_tokens ?? 0,\n },\n warnings: [],\n }\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const networkArgs = await this.getArgs({\n config: this.config,\n options,\n stream: true,\n modelId: this.modelId,\n })\n\n const { responseHeaders, value: response } = await postJsonToApi({\n ...networkArgs,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: (error) => JSON.stringify(error),\n isRetryable: () => false,\n }),\n successfulResponseHandler: createEventSourceResponseHandler(looseResponseAgentChunkSchema),\n abortSignal: options.abortSignal,\n })\n\n let finishReason: LanguageModelV2FinishReason = 'unknown'\n const usage: LanguageModelV2Usage = {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n }\n\n const allParts: LanguageModelV2StreamPart[] = []\n\n return {\n stream: response\n .pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof responsesAgentChunkSchema>>,\n LanguageModelV2StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings: [] })\n },\n\n transform(chunk, controller) {\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue })\n }\n\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = 'error'\n controller.enqueue({ type: 'error', error: chunk.error })\n return\n }\n\n if (chunk.value.type === 'responses.completed') {\n const hasToolCalls = allParts.some((p) => p.type === 'tool-call')\n finishReason = mapResponsesFinishReason({\n finishReason: chunk.value.response.incomplete_details?.reason,\n hasToolCalls,\n })\n usage.inputTokens = chunk.value.response.usage.input_tokens\n usage.outputTokens = chunk.value.response.usage.output_tokens\n usage.totalTokens = chunk.value.response.usage.total_tokens\n return\n }\n\n const parts = convertResponsesAgentChunkToMessagePart(chunk.value)\n\n allParts.push(...parts)\n /**\n * Check if the last chunk was a tool result without a tool call\n * This is a special case for MCP approval requests where the tool result\n * is sent in a separate call after the tool call was approved/denied.\n */\n if (parts.length === 0) {\n return\n }\n const part = parts[0]\n if (part.type === 'tool-result') {\n // First check if the tool call is in the current stream parts\n const matchingToolCallInParts = parts.find(\n (c) => c.type === 'tool-call' && c.toolCallId === part.toolCallId\n )\n // Also check if the tool call was emitted earlier in this stream\n const matchingToolCallInStream = allParts.find(\n (c) => c.type === 'tool-call' && c.toolCallId === part.toolCallId\n )\n if (!matchingToolCallInParts && !matchingToolCallInStream) {\n // Find the tool call in the prompt (previous messages)\n const toolCallFromPreviousMessages = options.prompt\n .flatMap((message) => {\n if (typeof message.content === 'string') return []\n return message.content\n })\n .find((p) => p.type === 'tool-call' && p.toolCallId === part.toolCallId)\n if (!toolCallFromPreviousMessages) {\n throw new Error('No matching tool call found in previous message')\n }\n if (toolCallFromPreviousMessages.type === 'tool-call') {\n controller.enqueue({\n ...toolCallFromPreviousMessages,\n input: JSON.stringify(toolCallFromPreviousMessages.input),\n })\n }\n }\n }\n // Dedupe logic for messages sent via response.output_item.done\n // MAS relies on sending text via response.output_item.done ONLY without any delta chunks\n // We have to decide when to display these messages in the UI\n if (shouldDedupeOutputItemDone(parts, allParts.slice(0, -parts.length))) {\n return\n }\n for (const part of parts) {\n controller.enqueue(part)\n }\n },\n\n flush(controller) {\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage,\n })\n },\n })\n )\n .pipeThrough(getDatabricksLanguageModelTransformStream()),\n request: { body: networkArgs.body },\n response: { headers: responseHeaders },\n }\n }\n\n private async getArgs({\n config,\n options,\n stream,\n modelId,\n }: {\n options: LanguageModelV2CallOptions\n config: DatabricksLanguageModelConfig\n stream: boolean\n modelId: string\n }) {\n const { input } = await convertToResponsesInput({\n prompt: options.prompt,\n systemMessageMode: 'system',\n })\n\n // Prepare tools for the Responses API format\n const { tools, toolChoice } = prepareResponsesTools({\n tools: options.tools,\n toolChoice: options.toolChoice,\n })\n\n return {\n url: config.url({\n path: '/responses',\n }),\n headers: combineHeaders(config.headers(), options.headers),\n body: {\n model: modelId,\n input,\n stream,\n ...(tools ? { tools } : {}),\n ...(toolChoice && tools ? { tool_choice: toolChoice } : {}),\n },\n fetch: config.fetch,\n }\n }\n}\n\nexport function shouldDedupeOutputItemDone(\n incomingParts: LanguageModelV2StreamPart[],\n previousParts: LanguageModelV2StreamPart[]\n): boolean {\n // Determine if the incoming parts contain a text-delta that is a response.output_item.done\n const doneTextDelta = incomingParts.find(\n (p) =>\n p.type === 'text-delta' &&\n p.providerMetadata?.databricks?.itemType === 'response.output_item.done'\n )\n\n // If the incoming parts do not contain a text-delta that is a response.output_item.done, return false\n if (!doneTextDelta || doneTextDelta.type !== 'text-delta' || !doneTextDelta.id) {\n return false\n }\n\n /**\n * To determine if the text in response.output_item.done is a duplicate, we need to reconstruct the text from the\n * previous consecutive text-deltas and check if the .done text is already present in what we've streamed.\n *\n * The caveat is that the response.output_item.done text uses GFM footnote syntax, where as the streamed content\n * uses response.output_text.delta and response.output_text.annotation.added events. So we reconstruct all the\n * delta text and check if the .done text is contained in it (meaning we've already streamed it).\n *\n * We only consider text-deltas that came AFTER the last response.output_item.done event, since each .done\n * corresponds to a specific message and we should only compare against text streamed for that message.\n */\n // 1. Find the index after the last response.output_item.done event using findLastIndex\n const lastDoneIndex = previousParts.findLastIndex(\n (part) =>\n part.type === 'text-delta' &&\n part.providerMetadata?.databricks?.itemType === 'response.output_item.done'\n )\n const partsAfterLastDone = previousParts.slice(lastDoneIndex + 1)\n\n // 2. Reconstruct text blocks from parts after the last .done event, separated by non-text-delta parts\n const { texts: reconstructuredTexts, current } = partsAfterLastDone.reduce<{\n texts: string[]\n current: string\n }>(\n (acc, part) => {\n if (part.type === 'text-delta') {\n return { ...acc, current: acc.current + part.delta }\n } else if (acc.current.trim().length > 0) {\n return { texts: [...acc.texts, acc.current.trim()], current: '' }\n }\n return acc\n },\n { texts: [], current: '' }\n )\n reconstructuredTexts.push(current)\n\n // 3. Check if the .done text contains all reconstructed text blocks in order\n if (reconstructuredTexts.length === 0) {\n return false\n }\n\n const allTextsFoundInOrder = reconstructuredTexts.reduce<{ found: boolean; lastIndex: number }>(\n (acc, text) => {\n if (!acc.found) return acc\n const index = doneTextDelta.delta.indexOf(text, acc.lastIndex)\n if (index === -1) return { found: false, lastIndex: acc.lastIndex }\n return { found: true, lastIndex: index + text.length }\n },\n { found: true, lastIndex: 0 }\n )\n\n return allTextsFoundInOrder.found\n}\n","import { z } from 'zod/v4'\n\n// Tool call schema for OpenAI-compatible format\nexport const toolCallSchema = z.object({\n id: z.string(),\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n arguments: z.string(), // JSON string of arguments\n }),\n})\n\n// Zod schemas mirroring FMAPI chat chunk types\nexport const reasoningSummarySchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('summary_text'),\n text: z.string(),\n signature: z.string().optional(),\n }),\n z.object({\n type: z.literal('summary_encrypted_text'),\n data: z.string(),\n }),\n])\n\nexport const contentItemSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('text'),\n text: z.string(),\n citation: z.unknown().optional(),\n }),\n z.object({\n type: z.literal('image'),\n image_url: z.string(),\n }),\n z.object({\n type: z.literal('reasoning'),\n summary: z.array(reasoningSummarySchema),\n }),\n])\n\n// Tool call delta for streaming\nexport const toolCallDeltaSchema = z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal('function').optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n})\n\nexport const fmapiChunkSchema = z.object({\n id: z.string(),\n created: z.number(),\n model: z.string(),\n usage: z\n .object({\n prompt_tokens: z.number().nullable().optional(),\n completion_tokens: z.number().nullable().optional(),\n total_tokens: z.number().nullable().optional(),\n })\n .nullable()\n .optional(),\n object: z.literal('chat.completion.chunk'),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.union([z.literal('assistant'), z.null(), z.undefined()]).optional(),\n // content can be string, array of content items, null (when tool_calls present), or omitted\n content: z.union([z.string(), z.array(contentItemSchema), z.null()]).optional(),\n tool_calls: z.array(toolCallDeltaSchema).optional(),\n }),\n finish_reason: z.union([z.literal('stop'), z.literal('tool_calls'), z.null()]).optional(),\n })\n ),\n})\n\nexport const fmapiResponseSchema = z.object({\n id: z.string(),\n created: z.number(),\n model: z.string(),\n usage: z\n .object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n })\n .nullable()\n .optional(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.union([z.literal('assistant'), z.literal('user'), z.literal('tool')]),\n content: z.union([z.string(), z.array(contentItemSchema), z.null()]).optional(),\n tool_calls: z.array(toolCallSchema).optional(),\n }),\n finish_reason: z.union([z.literal('stop'), z.literal('tool_calls'), z.null()]).optional(),\n })\n ),\n})\n\n// Input message schema for requests (different from response format)\n// Tool messages in requests need tool_call_id at the message level\nexport type FmapiInputMessage =\n | {\n role: 'system' | 'user' | 'assistant'\n content: string | z.infer<typeof contentItemSchema>[] | null\n tool_calls?: z.infer<typeof toolCallSchema>[]\n }\n | {\n role: 'tool'\n tool_call_id: string\n content: string\n }\n\n// Exported types for type-only imports in other modules\nexport type FmapiChunk = z.infer<typeof fmapiChunkSchema>\nexport type FmapiResponse = z.infer<typeof fmapiResponseSchema>\nexport type FmapiMessage = FmapiResponse['choices'][number]['message']\nexport type FmapiContentItem = z.infer<typeof contentItemSchema>\nexport type FmapiToolCall = z.infer<typeof toolCallSchema>\n","import type { LanguageModelV2Content, LanguageModelV2StreamPart } from '@ai-sdk/provider'\nimport type { FmapiChunk, FmapiContentItem, FmapiResponse, FmapiToolCall } from './fmapi-schema'\nimport { DATABRICKS_TOOL_CALL_ID } from '../tools'\n\nexport const convertFmapiChunkToMessagePart = (\n chunk: FmapiChunk,\n toolCallIdsByIndex?: Map<number, string>\n): LanguageModelV2StreamPart[] => {\n const parts: LanguageModelV2StreamPart[] = []\n if (chunk.choices.length === 0) return parts\n const choice = chunk.choices[0]\n\n // Handle streaming tool calls\n if (choice.delta.tool_calls && choice.delta.tool_calls.length > 0) {\n for (const toolCallDelta of choice.delta.tool_calls) {\n const index = toolCallDelta.index\n\n // If this is the start of a tool call (has id and name), track the ID\n if (toolCallDelta.id && toolCallDelta.function?.name) {\n toolCallIdsByIndex?.set(index, toolCallDelta.id)\n parts.push({\n type: 'tool-input-start',\n id: toolCallDelta.id,\n toolName: toolCallDelta.function.name,\n })\n }\n\n // If this has argument delta, use tracked ID or fallback\n if (toolCallDelta.function?.arguments) {\n const id = toolCallDelta.id ?? toolCallIdsByIndex?.get(index) ?? `tool-call-${index}`\n parts.push({\n type: 'tool-input-delta',\n id,\n delta: toolCallDelta.function.arguments,\n })\n }\n }\n }\n\n if (typeof choice.delta.content === 'string') {\n // Skip empty string content to avoid spurious text-start/text-end cycles\n if (choice.delta.content) {\n parts.push({ type: 'text-delta', id: chunk.id, delta: choice.delta.content })\n }\n } else if (Array.isArray(choice.delta.content)) {\n parts.push(...mapContentItemsToStreamParts(choice.delta.content, chunk.id))\n }\n\n return parts\n}\n\nexport const convertFmapiResponseToMessagePart = (\n response: FmapiResponse\n): LanguageModelV2Content[] => {\n const parts: LanguageModelV2Content[] = []\n if (response.choices.length === 0) return parts\n const choice = response.choices[0]\n\n // Handle OpenAI-format tool_calls first\n if (choice.message.tool_calls && choice.message.tool_calls.length > 0) {\n for (const toolCall of choice.message.tool_calls) {\n parts.push(convertToolCallToContent(toolCall))\n }\n // If there's also text content, include it\n if (typeof choice.message.content === 'string' && choice.message.content) {\n parts.push({ type: 'text', text: choice.message.content })\n }\n return parts\n }\n\n if (typeof choice.message.content === 'string') {\n parts.push({ type: 'text', text: choice.message.content })\n } else {\n parts.push(...mapContentItemsToProviderContent(choice.message.content ?? []))\n }\n\n return parts\n}\n\nconst convertToolCallToContent = (toolCall: FmapiToolCall): LanguageModelV2Content => {\n return {\n type: 'tool-call',\n toolCallId: toolCall.id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n input: toolCall.function.arguments,\n providerMetadata: {\n databricks: {\n toolName: toolCall.function.name,\n },\n },\n }\n}\n\nconst mapContentItemsToStreamParts = (\n items: FmapiContentItem[],\n id: string\n): LanguageModelV2StreamPart[] => {\n const parts: LanguageModelV2StreamPart[] = []\n for (const item of items) {\n switch (item.type) {\n case 'text':\n parts.push({ type: 'text-delta', id, delta: item.text })\n break\n case 'image':\n // Images are currently not supported in stream parts\n break\n case 'reasoning': {\n for (const summary of item.summary.filter((s) => s.type === 'summary_text')) {\n parts.push({ type: 'reasoning-delta', id, delta: summary.text })\n }\n break\n }\n }\n }\n return parts\n}\n\nconst mapContentItemsToProviderContent = (items: FmapiContentItem[]): LanguageModelV2Content[] => {\n const parts: LanguageModelV2Content[] = []\n for (const item of items) {\n switch (item.type) {\n case 'text':\n parts.push({ type: 'text', text: item.text })\n break\n case 'image':\n // Images are currently not supported in content parts\n break\n case 'reasoning': {\n for (const summary of item.summary.filter((s) => s.type === 'summary_text')) {\n parts.push({ type: 'reasoning', text: summary.text })\n }\n break\n }\n }\n }\n return parts\n}\n","import type {\n LanguageModelV2Message,\n LanguageModelV2ToolResultPart,\n LanguageModelV2ToolCallPart,\n} from '@ai-sdk/provider'\nimport { parseProviderOptions } from '@ai-sdk/provider-utils'\nimport { z } from 'zod/v4'\nimport type { FmapiInputMessage, FmapiContentItem } from './fmapi-schema'\n\ntype LanguageModelV2SystemMessage = Extract<LanguageModelV2Message, { role: 'system' }>\ntype LanguageModelV2UserMessage = Extract<LanguageModelV2Message, { role: 'user' }>\ntype LanguageModelV2AssistantMessage = Extract<LanguageModelV2Message, { role: 'assistant' }>\ntype LanguageModelV2ToolMessage = Extract<LanguageModelV2Message, { role: 'tool' }>\n\nexport const convertPromptToFmapiMessages = async (\n prompt: LanguageModelV2Message[]\n): Promise<{ messages: Array<FmapiInputMessage> }> => {\n const messages: Array<FmapiInputMessage> = []\n\n for (const message of prompt) {\n switch (message.role) {\n case 'system':\n messages.push(convertSystemMessage(message))\n break\n case 'user':\n messages.push(convertUserMessage(message))\n break\n case 'assistant':\n messages.push(await convertAssistantMessage(message))\n break\n case 'tool':\n // Tool messages need special handling - one message per tool result\n messages.push(...convertToolMessages(message))\n break\n }\n }\n\n return { messages }\n}\n\nconst convertSystemMessage = (message: LanguageModelV2SystemMessage): FmapiInputMessage => {\n return {\n role: 'system',\n content: [{ type: 'text', text: message.content }],\n }\n}\n\nconst convertUserMessage = (message: LanguageModelV2UserMessage): FmapiInputMessage => {\n const content: FmapiContentItem[] = []\n\n for (const part of message.content) {\n switch (part.type) {\n case 'text':\n content.push({ type: 'text', text: part.text })\n break\n case 'file':\n if (part.mediaType.startsWith('image/')) {\n const url = toHttpUrlString(part.data)\n if (url) content.push({ type: 'image', image_url: url })\n }\n break\n }\n }\n\n return { role: 'user', content }\n}\n\nconst convertAssistantMessage = async (\n message: LanguageModelV2AssistantMessage\n): Promise<FmapiInputMessage> => {\n const contentItems: FmapiContentItem[] = []\n const toolCalls: Array<{\n id: string\n type: 'function'\n function: { name: string; arguments: string }\n }> = []\n\n for (const part of message.content) {\n switch (part.type) {\n case 'text':\n contentItems.push({ type: 'text', text: part.text })\n break\n case 'file':\n if (part.mediaType.startsWith('image/')) {\n const url = toHttpUrlString(part.data)\n if (url) contentItems.push({ type: 'image', image_url: url })\n }\n break\n case 'reasoning':\n contentItems.push({\n type: 'reasoning',\n summary: [{ type: 'summary_text', text: part.text }],\n })\n break\n case 'tool-call': {\n // Parse provider options to get the actual tool name\n const toolName = await getToolNameFromPart(part)\n // Convert to OpenAI tool_calls format\n toolCalls.push({\n id: part.toolCallId,\n type: 'function',\n function: {\n name: toolName,\n arguments: typeof part.input === 'string' ? part.input : JSON.stringify(part.input),\n },\n })\n break\n }\n }\n }\n\n return {\n role: 'assistant',\n // Use null instead of empty string when there's no text content\n content: contentItems.length === 0 ? null : contentItems,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n }\n}\n\nconst convertToolMessages = (message: LanguageModelV2ToolMessage): FmapiInputMessage[] => {\n const messages: FmapiInputMessage[] = []\n\n for (const part of message.content) {\n if (part.type === 'tool-result') {\n // Each tool result becomes a separate tool message with tool_call_id\n const content = convertToolResultOutputToContentValue(part.output)\n messages.push({\n role: 'tool',\n tool_call_id: part.toolCallId,\n content: typeof content === 'string' ? content : JSON.stringify(content),\n })\n }\n }\n\n return messages\n}\n\nconst toHttpUrlString = (data: URL | string | Uint8Array): string | null => {\n if (data instanceof URL) return data.toString()\n if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) return data\n }\n return null\n}\n\nconst convertToolResultOutputToContentValue = (\n output: LanguageModelV2ToolResultPart['output']\n): unknown => {\n switch (output.type) {\n case 'text':\n case 'error-text':\n return output.value\n case 'json':\n case 'error-json':\n return output.value\n case 'content':\n return output.value\n default:\n return null\n }\n}\n\nconst ProviderOptionsSchema = z.object({\n toolName: z.string().nullish(),\n})\n\nconst getToolNameFromPart = async (part: LanguageModelV2ToolCallPart): Promise<string> => {\n const providerOptions = await parseProviderOptions({\n provider: 'databricks',\n providerOptions: part.providerOptions,\n schema: ProviderOptionsSchema,\n })\n // Use the actual tool name from provider metadata if available,\n // otherwise fall back to part.toolName (which may be DATABRICKS_TOOL_CALL_ID)\n return providerOptions?.toolName ?? part.toolName\n}\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2FinishReason,\n LanguageModelV2FunctionTool,\n LanguageModelV2StreamPart,\n LanguageModelV2ToolChoice,\n} from '@ai-sdk/provider'\nimport {\n type ParseResult,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n postJsonToApi,\n} from '@ai-sdk/provider-utils'\nimport { z } from 'zod/v4'\nimport type { DatabricksLanguageModelConfig } from '../databricks-provider'\nimport { fmapiChunkSchema, fmapiResponseSchema } from './fmapi-schema'\nimport {\n convertFmapiChunkToMessagePart,\n convertFmapiResponseToMessagePart,\n} from './fmapi-convert-to-message-parts'\nimport { convertPromptToFmapiMessages } from './fmapi-convert-to-input'\nimport { getDatabricksLanguageModelTransformStream } from '../stream-transformers/databricks-stream-transformer'\nimport { DATABRICKS_TOOL_CALL_ID } from '../tools'\n\nexport class DatabricksFmapiLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2'\n\n readonly modelId: string\n\n private readonly config: DatabricksLanguageModelConfig\n\n constructor(modelId: string, config: DatabricksLanguageModelConfig) {\n this.modelId = modelId\n this.config = config\n }\n\n get provider(): string {\n return this.config.provider\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {}\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const networkArgs = await this.getArgs({\n config: this.config,\n options,\n stream: false,\n modelId: this.modelId,\n })\n\n const { value: response } = await postJsonToApi({\n ...networkArgs,\n successfulResponseHandler: createJsonResponseHandler(fmapiResponseSchema),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: (error) => JSON.stringify(error),\n isRetryable: () => false,\n }),\n })\n\n // Determine finish reason from response\n const choice = response.choices[0]\n let finishReason: LanguageModelV2FinishReason = 'stop'\n if (choice?.finish_reason === 'tool_calls') {\n finishReason = 'tool-calls'\n }\n\n return {\n content: convertFmapiResponseToMessagePart(response),\n finishReason,\n usage: {\n inputTokens: response.usage?.prompt_tokens ?? 0,\n outputTokens: response.usage?.completion_tokens ?? 0,\n totalTokens: response.usage?.total_tokens ?? 0,\n },\n warnings: [],\n }\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const networkArgs = await this.getArgs({\n config: this.config,\n options,\n stream: true,\n modelId: this.modelId,\n })\n\n const { responseHeaders, value: response } = await postJsonToApi({\n ...networkArgs,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: (error) => JSON.stringify(error),\n isRetryable: () => false,\n }),\n successfulResponseHandler: createEventSourceResponseHandler(fmapiChunkSchema),\n abortSignal: options.abortSignal,\n })\n\n let finishReason: LanguageModelV2FinishReason = 'unknown'\n let usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 }\n\n // Track tool call IDs by index for streaming (OpenAI only sends ID in first chunk)\n const toolCallIdsByIndex = new Map<number, string>()\n // Track tool call names by ID\n const toolCallNamesById = new Map<string, string>()\n // Track accumulated tool call inputs by ID\n const toolCallInputsById = new Map<string, string>()\n\n return {\n stream: response\n .pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof fmapiChunkSchema>>,\n LanguageModelV2StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings: [] })\n },\n\n transform(chunk, controller) {\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue })\n }\n\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = 'error'\n controller.enqueue({ type: 'error', error: chunk.error })\n return\n }\n\n // Track finish reason from chunk\n const choice = chunk.value.choices[0]\n if (choice?.finish_reason === 'stop') {\n finishReason = 'stop'\n } else if (choice?.finish_reason === 'tool_calls') {\n finishReason = 'tool-calls'\n }\n\n // Track usage from chunk\n if (chunk.value.usage) {\n usage = {\n inputTokens: chunk.value.usage.prompt_tokens ?? 0,\n outputTokens: chunk.value.usage.completion_tokens ?? 0,\n totalTokens: chunk.value.usage.total_tokens ?? 0,\n }\n }\n\n const parts = convertFmapiChunkToMessagePart(chunk.value, toolCallIdsByIndex)\n for (const part of parts) {\n // Track tool call info for later emission\n if (part.type === 'tool-input-start') {\n toolCallNamesById.set(part.id, part.toolName)\n toolCallInputsById.set(part.id, '')\n } else if (part.type === 'tool-input-delta') {\n const current = toolCallInputsById.get(part.id) ?? ''\n toolCallInputsById.set(part.id, current + part.delta)\n }\n controller.enqueue(part)\n }\n },\n\n flush(controller) {\n // Emit complete tool-call events for all accumulated tool calls\n for (const [toolCallId, inputText] of toolCallInputsById) {\n const toolName = toolCallNamesById.get(toolCallId)\n if (toolName) {\n // Emit tool-input-end to signal streaming is complete\n controller.enqueue({ type: 'tool-input-end', id: toolCallId })\n\n // Emit a complete tool-call with DATABRICKS_TOOL_CALL_ID\n // and actual tool name in provider metadata\n controller.enqueue({\n type: 'tool-call',\n toolCallId,\n toolName: DATABRICKS_TOOL_CALL_ID,\n input: inputText,\n providerMetadata: {\n databricks: {\n toolName,\n },\n },\n })\n }\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage,\n })\n },\n })\n )\n .pipeThrough(getDatabricksLanguageModelTransformStream()),\n request: { body: networkArgs.body },\n response: { headers: responseHeaders },\n }\n }\n\n private async getArgs({\n config,\n options,\n stream,\n modelId,\n }: {\n options: LanguageModelV2CallOptions\n config: DatabricksLanguageModelConfig\n stream: boolean\n modelId: string\n }) {\n // Convert tools to OpenAI format (filter out provider-defined tools)\n const tools = options.tools\n ?.map((tool) => convertToolToOpenAIFormat(tool))\n .filter((tool): tool is NonNullable<typeof tool> => tool !== undefined)\n\n // Convert tool choice to OpenAI format\n const toolChoice = options.toolChoice\n ? convertToolChoiceToOpenAIFormat(options.toolChoice)\n : undefined\n\n const { messages } = await convertPromptToFmapiMessages(options.prompt)\n\n return {\n url: config.url({\n path: '/chat/completions',\n }),\n headers: combineHeaders(config.headers(), options.headers),\n body: {\n messages,\n stream,\n model: modelId,\n ...(tools && tools.length > 0 ? { tools } : {}),\n ...(toolChoice && tools && tools.length > 0 ? { tool_choice: toolChoice } : {}),\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(options.maxOutputTokens !== undefined ? { max_tokens: options.maxOutputTokens } : {}),\n ...(options.stopSequences && options.stopSequences.length > 0\n ? { stop: options.stopSequences }\n : {}),\n },\n fetch: config.fetch,\n }\n }\n}\n\n/**\n * Convert AI SDK tool to OpenAI format\n */\nfunction convertToolToOpenAIFormat(\n tool: LanguageModelV2FunctionTool | { type: 'provider-defined'; id: string }\n):\n | { type: 'function'; function: { name: string; description?: string; parameters?: unknown } }\n | undefined {\n if (tool.type === 'provider-defined' || tool.name === DATABRICKS_TOOL_CALL_ID) {\n // Skip provider-defined tools as they're not supported in OpenAI format\n // or tools that are orchestrated by Databricks' agents\n return undefined\n }\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }\n}\n\n/**\n * Convert AI SDK tool choice to OpenAI format\n */\nfunction convertToolChoiceToOpenAIFormat(\n toolChoice: LanguageModelV2ToolChoice\n): 'auto' | 'none' | 'required' | { type: 'function'; function: { name: string } } {\n if (toolChoice.type === 'auto') {\n return 'auto'\n }\n if (toolChoice.type === 'none') {\n return 'none'\n }\n if (toolChoice.type === 'required') {\n return 'required'\n }\n if (toolChoice.type === 'tool') {\n return {\n type: 'function',\n function: { name: toolChoice.toolName },\n }\n }\n return 'auto'\n}\n","import type { LanguageModelV2, ProviderV2 } from '@ai-sdk/provider'\nimport { combineHeaders, type FetchFunction, withoutTrailingSlash } from '@ai-sdk/provider-utils'\nimport { DatabricksChatAgentLanguageModel } from './chat-agent-language-model/chat-agent-language-model'\nimport { DatabricksResponsesAgentLanguageModel } from './responses-agent-language-model/responses-agent-language-model'\nimport { DatabricksFmapiLanguageModel } from './fmapi-language-model/fmapi-language-model'\n\nexport type DatabricksLanguageModelConfig = {\n provider: string\n headers: () => Record<string, string | undefined>\n url: (options: { path: string }) => string\n fetch?: FetchFunction\n}\n\nexport interface DatabricksProvider extends ProviderV2 {\n /** Agents */\n chatAgent(modelId: string): LanguageModelV2 // agent/v2/chat\n responses(modelId: string): LanguageModelV2 // agent/v1/responses\n\n /** Foundation Models */\n chatCompletions(modelId: string): LanguageModelV2 // llm/v1/chat\n}\n\nexport interface DatabricksProviderSettings {\n /** Base URL for the Databricks API calls. */\n baseURL: string\n /** Custom headers to include in the requests. */\n headers?: Record<string, string>\n /** Provider name. Overrides the `databricks` default name for 3rd party providers. */\n provider?: string\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n * */\n fetch?: FetchFunction\n\n /**\n * Optional function to format the URL\n */\n formatUrl?: (options: { baseUrl?: string; path: string }) => string\n}\n\nexport const createDatabricksProvider = (\n settings: DatabricksProviderSettings\n): DatabricksProvider => {\n const baseUrl = withoutTrailingSlash(settings.baseURL)\n const getHeaders = () => combineHeaders(settings.headers)\n const fetch = settings.fetch\n const provider = settings.provider ?? 'databricks'\n\n const formatUrl = ({ path }: { path: string }) =>\n settings.formatUrl?.({ baseUrl, path }) ?? `${baseUrl}${path}`\n\n const createChatAgent = (modelId: string): LanguageModelV2 =>\n new DatabricksChatAgentLanguageModel(modelId, {\n url: formatUrl,\n headers: getHeaders,\n fetch,\n provider,\n })\n\n const createResponsesAgent = (modelId: string): LanguageModelV2 =>\n new DatabricksResponsesAgentLanguageModel(modelId, {\n url: formatUrl,\n headers: getHeaders,\n fetch,\n provider,\n })\n\n const createFmapi = (modelId: string): LanguageModelV2 =>\n new DatabricksFmapiLanguageModel(modelId, {\n url: formatUrl,\n headers: getHeaders,\n fetch,\n provider,\n })\n\n const notImplemented = (name: string) => {\n return () => {\n throw new Error(`${name} is not supported yet`)\n }\n }\n\n return {\n responses: createResponsesAgent,\n chatCompletions: createFmapi,\n chatAgent: createChatAgent,\n imageModel: notImplemented('ImageModel'),\n textEmbeddingModel: notImplemented('TextEmbeddingModel'),\n languageModel: notImplemented('LanguageModel'),\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["chunk: ChatAgentChunk","response: ChatAgentResponse","parts: LanguageModelV2Content[]","prompt: LanguageModelV2Prompt","messages: ChatAgentResponse['messages']","msg: LanguageModelV2UserMessage","messageIndex: number","msg: LanguageModelV2AssistantMessage","startIndex: number","messages: ChatAgentMessage[]","msg: LanguageModelV2ToolMessage","output: LanguageModelV2ToolResultPart['output']","initialParts: LanguageModelV2StreamPart[]","last: LanguageModelV2StreamPart | null","applyDeltaBoundaryTransform: DatabricksStreamPartTransformer<\n LanguageModelV2StreamPart\n>","out: LanguageModelV2StreamPart[]","part?: LanguageModelV2StreamPart | null","part: LanguageModelV2StreamPart | null","part: DeltaPart","type: LanguageModelV2StreamPart['type']","part: LanguageModelV2StreamPart","id: string | undefined","group: ReturnType<typeof getDeltaGroup>","modelId: string","config: DatabricksLanguageModelConfig","options: Parameters<LanguageModelV2['doGenerate']>[0]","options: Parameters<LanguageModelV2['doStream']>[0]","finishReason: LanguageModelV2FinishReason","output: unknown","metadata: DatabricksToolMetadata | Record<string, unknown> | undefined","part: {\n callProviderMetadata?: Record<string, unknown>\n}","output: {\n type: string\n value?: unknown\n}","approve: boolean","chunk: ResponsesAgentChunk","parts: LanguageModelV2StreamPart[]","item: OutputItemDoneItem","response: ResponsesAgentResponse","parts: LanguageModelV2Content[]","input: ResponsesInput","warnings: Array<LanguageModelV2CallWarning>","_exhaustiveCheck: never","output: LanguageModelV2ToolResultPart['output']","responsesTools: Array<ResponsesTool>","toolChoice: LanguageModelV2ToolChoice | undefined","modelId: string","config: DatabricksLanguageModelConfig","options: Parameters<LanguageModelV2['doGenerate']>[0]","options: Parameters<LanguageModelV2['doStream']>[0]","finishReason: LanguageModelV2FinishReason","usage: LanguageModelV2Usage","allParts: LanguageModelV2StreamPart[]","incomingParts: LanguageModelV2StreamPart[]","previousParts: LanguageModelV2StreamPart[]","chunk: FmapiChunk","toolCallIdsByIndex?: Map<number, string>","parts: LanguageModelV2StreamPart[]","response: FmapiResponse","parts: LanguageModelV2Content[]","toolCall: FmapiToolCall","items: FmapiContentItem[]","id: string","prompt: LanguageModelV2Message[]","messages: Array<FmapiInputMessage>","message: LanguageModelV2SystemMessage","message: LanguageModelV2UserMessage","content: FmapiContentItem[]","message: LanguageModelV2AssistantMessage","contentItems: FmapiContentItem[]","toolCalls: Array<{\n id: string\n type: 'function'\n function: { name: string; arguments: string }\n }>","message: LanguageModelV2ToolMessage","messages: FmapiInputMessage[]","data: URL | string | Uint8Array","output: LanguageModelV2ToolResultPart['output']","part: LanguageModelV2ToolCallPart","finishReason: string | null | undefined","modelId: string","config: DatabricksLanguageModelConfig","options: Parameters<LanguageModelV2['doGenerate']>[0]","options: Parameters<LanguageModelV2['doStream']>[0]","finishReason: LanguageModelV2FinishReason","tool: LanguageModelV2FunctionTool | { type: 'provider-defined'; id: string }","toolChoice: LanguageModelV2ToolChoice","settings: DatabricksProviderSettings","modelId: string","name: string"],"sources":["../src/chat-agent-language-model/chat-agent-schema.ts","../src/tools.ts","../src/chat-agent-language-model/chat-agent-convert-to-message-parts.ts","../src/chat-agent-language-model/chat-agent-convert-to-input.ts","../src/stream-transformers/compose-stream-part-transformers.ts","../src/stream-transformers/databricks-delta-boundary.ts","../src/stream-transformers/databricks-stream-transformer.ts","../src/chat-agent-language-model/chat-agent-language-model.ts","../src/responses-agent-language-model/responses-agent-schema.ts","../src/mcp.ts","../src/responses-agent-language-model/responses-convert-to-message-parts.ts","../src/responses-agent-language-model/responses-convert-to-input.ts","../src/responses-agent-language-model/responses-prepare-tools.ts","../src/responses-agent-language-model/responses-agent-language-model.ts","../src/fmapi-language-model/fmapi-schema.ts","../src/fmapi-language-model/fmapi-convert-to-message-parts.ts","../src/fmapi-language-model/fmapi-convert-to-input.ts","../src/fmapi-language-model/fmapi-finish-reason.ts","../src/fmapi-language-model/fmapi-language-model.ts","../src/databricks-provider.ts"],"sourcesContent":["import { z } from 'zod/v4'\n\n// Tool call schema\nconst chatAgentToolCallSchema = z.object({\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n id: z.string(),\n})\n\n// Message schemas (discriminated by role)\nconst chatAgentAssistantMessageSchema = z.object({\n role: z.literal('assistant'),\n content: z.string(), // required, empty string allowed\n id: z.string(),\n name: z.string().optional(),\n tool_calls: z.array(chatAgentToolCallSchema).optional(),\n})\n\nconst chatAgentToolMessageSchema = z.object({\n role: z.literal('tool'),\n name: z.string(),\n content: z.string(),\n tool_call_id: z.string(),\n id: z.string(),\n attachments: z.record(z.string(), z.unknown()).optional(),\n})\n\nconst chatAgentUserMessageSchema = z.object({\n role: z.literal('user'),\n content: z.string(),\n id: z.string(),\n})\n\nexport const chatAgentMessageSchema = z.discriminatedUnion('role', [\n chatAgentAssistantMessageSchema,\n chatAgentToolMessageSchema,\n chatAgentUserMessageSchema,\n])\n\n// Stream chunk schema (used for SSE parsing)\nexport const chatAgentChunkSchema = z.object({\n id: z.string(),\n delta: chatAgentMessageSchema,\n})\n\n// Full response schema (not used in streaming handler, but kept for completeness)\nexport const chatAgentResponseSchema = z.object({\n id: z.string(),\n messages: z.array(chatAgentMessageSchema),\n})\n\n// Exported types for type-only imports in other modules\nexport type ChatAgentChunk = z.infer<typeof chatAgentChunkSchema>\nexport type ChatAgentResponse = z.infer<typeof chatAgentResponseSchema>\nexport type ChatAgentMessage = z.infer<typeof chatAgentMessageSchema>\n","import type { Tool } from '@ai-sdk/provider-utils'\nimport { z } from 'zod/v4'\n\nexport const DATABRICKS_TOOL_CALL_ID = 'databricks-tool-call'\n\n/**\n * The AI-SDK requires that tools used by the model are defined ahead of time.\n *\n * Since tool calls can be orchestrated by Databricks' agents we don't know the name, input, or output schemas\n * of the tools until the model is called.\n *\n * In the DatabricksProvider we transform all tool calls to fit this definition, and keep the\n * original name as part of the metadata. This allows us to parse any tool orchestrated by Databricks' agents,\n * while still being able to render the tool call and result in the UI, and pass it back to the model with the correct name.\n */\nexport const DATABRICKS_TOOL_DEFINITION = {\n name: DATABRICKS_TOOL_CALL_ID,\n description: 'Databricks tool call',\n // The input and output schemas are dynamic since its generated by the model\n inputSchema: z.any(),\n outputSchema: z.any(),\n} satisfies Tool\n","import type { LanguageModelV2Content, LanguageModelV2StreamPart } from '@ai-sdk/provider'\nimport { DATABRICKS_TOOL_CALL_ID } from '../tools'\nimport type { ChatAgentChunk, ChatAgentResponse } from './chat-agent-schema'\n\nexport const convertChatAgentChunkToMessagePart = (\n chunk: ChatAgentChunk\n): LanguageModelV2StreamPart[] => {\n const parts = [] as LanguageModelV2StreamPart[]\n if (chunk.delta.role === 'assistant') {\n if (chunk.delta.content) {\n parts.push({\n type: 'text-delta',\n id: chunk.delta.id,\n delta: chunk.delta.content,\n })\n }\n chunk.delta.tool_calls?.forEach((toolCall) => {\n parts.push({\n type: 'tool-call',\n toolCallId: toolCall.id,\n input: toolCall.function.arguments,\n toolName: toolCall.function.name,\n })\n })\n } else if (chunk.delta.role === 'tool') {\n parts.push({\n type: 'tool-result',\n toolCallId: chunk.delta.tool_call_id,\n result: chunk.delta.content,\n toolName: DATABRICKS_TOOL_CALL_ID,\n })\n }\n return parts\n}\n\nexport const convertChatAgentResponseToMessagePart = (\n response: ChatAgentResponse\n): LanguageModelV2Content[] => {\n const parts: LanguageModelV2Content[] = []\n for (const message of response.messages) {\n if (message.role === 'assistant') {\n parts.push({\n type: 'text',\n text: message.content,\n })\n for (const part of message.tool_calls ?? []) {\n parts.push({\n type: 'tool-call',\n toolCallId: part.id,\n input: part.function.arguments,\n toolName: part.function.name,\n })\n }\n } else if (message.role === 'tool') {\n parts.push({\n type: 'tool-result',\n toolCallId: message.tool_call_id,\n result: message.content,\n toolName: DATABRICKS_TOOL_CALL_ID,\n })\n }\n }\n return parts\n}\n","import type { LanguageModelV2Prompt, LanguageModelV2ToolResultPart } from '@ai-sdk/provider'\nimport type { ChatAgentResponse } from './chat-agent-schema'\n\ntype ChatAgentMessage = ChatAgentResponse['messages'][number]\ntype LanguageModelV2UserMessage = Extract<LanguageModelV2Prompt[number], { role: 'user' }>\ntype LanguageModelV2AssistantMessage = Extract<LanguageModelV2Prompt[number], { role: 'assistant' }>\ntype LanguageModelV2ToolMessage = Extract<LanguageModelV2Prompt[number], { role: 'tool' }>\n\nexport const convertLanguageModelV2PromptToChatAgentResponse = (\n prompt: LanguageModelV2Prompt\n): ChatAgentResponse['messages'] => {\n const messages: ChatAgentResponse['messages'] = []\n let messageIndex = 0\n\n for (const msg of prompt) {\n switch (msg.role) {\n case 'system':\n // System messages are prompt-only; they don't exist in ChatAgent responses.\n break\n\n case 'user': {\n const converted = convertUserMessage(msg, messageIndex)\n messages.push(converted)\n messageIndex++\n break\n }\n\n case 'assistant': {\n const converted = convertAssistantMessage(msg, messageIndex)\n messages.push(...converted)\n messageIndex += converted.length\n break\n }\n\n case 'tool': {\n const converted = convertToolMessage(msg, messageIndex)\n messages.push(...converted)\n messageIndex += converted.length\n break\n }\n }\n }\n\n return messages\n}\n\nconst convertUserMessage = (\n msg: LanguageModelV2UserMessage,\n messageIndex: number\n): ChatAgentMessage => {\n const text = (msg.content ?? [])\n .filter((part): part is Extract<typeof part, { type: 'text' }> => part.type === 'text')\n .map((part) => part.text)\n .join('\\n')\n\n return {\n role: 'user',\n content: text,\n id: `user-${messageIndex}`,\n }\n}\n\nconst convertAssistantMessage = (\n msg: LanguageModelV2AssistantMessage,\n startIndex: number\n): ChatAgentMessage[] => {\n const messages: ChatAgentMessage[] = []\n let messageIndex = startIndex\n\n const textContent = (msg.content ?? [])\n .filter((part) => part.type === 'text' || part.type === 'reasoning')\n .map((part) => (part.type === 'text' ? part.text : part.text))\n .join('\\n')\n\n const toolCalls = (msg.content ?? [])\n .filter(\n (part): part is Extract<typeof part, { type: 'tool-call' }> => part.type === 'tool-call'\n )\n .map((call) => ({\n type: 'function' as const,\n id: call.toolCallId,\n function: {\n name: call.toolName,\n arguments: typeof call.input === 'string' ? call.input : JSON.stringify(call.input ?? {}),\n },\n }))\n\n messages.push({\n role: 'assistant',\n content: textContent,\n id: `assistant-${messageIndex++}`,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n })\n\n // Convert any tool results embedded in the assistant message into separate tool messages.\n for (const part of msg.content ?? []) {\n if (part.type === 'tool-result') {\n messages.push({\n role: 'tool',\n name: part.toolName,\n content: convertToolResultOutput(part.output),\n tool_call_id: part.toolCallId,\n id: `tool-${messageIndex++}`,\n })\n }\n }\n\n return messages\n}\n\nconst convertToolMessage = (\n msg: LanguageModelV2ToolMessage,\n startIndex: number\n): ChatAgentMessage[] => {\n const messages: ChatAgentMessage[] = []\n let messageIndex = startIndex\n\n for (const part of msg.content ?? []) {\n if (part.type === 'tool-result') {\n messages.push({\n role: 'tool',\n name: part.toolName,\n content: convertToolResultOutput(part.output),\n tool_call_id: part.toolCallId,\n id: `tool-${messageIndex++}`,\n })\n }\n }\n\n return messages\n}\n\nconst convertToolResultOutput = (output: LanguageModelV2ToolResultPart['output']): string => {\n switch (output.type) {\n case 'text':\n case 'error-text':\n return output.value\n case 'json':\n case 'error-json':\n return JSON.stringify(output.value)\n case 'content':\n return output.value\n .map((p) => (p.type === 'text' ? p.text : ''))\n .filter(Boolean)\n .join('\\n')\n default:\n return ''\n }\n}\n","import type { LanguageModelV2StreamPart } from '@ai-sdk/provider'\n\nexport type DatabricksStreamPartTransformer<Out extends LanguageModelV2StreamPart> = (\n parts: LanguageModelV2StreamPart[],\n last: LanguageModelV2StreamPart | null\n) => {\n out: Out[]\n}\n\n/* -----------------------------------------------------------------\n Tiny helpers for the type‑level plumbing\n ----------------------------------------------------------------- */\n\n/** Extract the element type (`Out`) from a concrete transformer. */\ntype OutElement<TFn> = TFn extends (parts: any, last: any) => { out: (infer O)[] } ? O : never\n\n/** Return the last element of a tuple type. */\ntype Last<T extends any[]> = T extends [...any[], infer L] ? L : never\n\n/**\n * Compose an arbitrary number of `DatabricksStreamPartTransformer`s.\n *\n * The returned function has the exact same signature as a normal transformer,\n * but its `out`‑element type is inferred from the **last** transformer you pass\n * in.\n *\n * Runtime behaviour:\n * 1️⃣ Call the first transformer with the supplied `parts` and the\n * caller‑provided `last` (usually `null`).\n * 2️⃣ Take its `out` and `last` and feed them to the next transformer.\n * 3️⃣ …repeat until the last transformer runs.\n * 4️⃣ Return the `out`/`last` of that final transformer.\n */\nexport function composeDatabricksStreamPartTransformers<\n T extends DatabricksStreamPartTransformer<any>[],\n>(...transformers: T): DatabricksStreamPartTransformer<OutElement<Last<T>>> {\n // The generic `OutElement<Last<T>>` is the element type of the **last**\n // transformer, so the returned function has the correct inferred type.\n return (\n initialParts: LanguageModelV2StreamPart[],\n last: LanguageModelV2StreamPart | null = null\n ) => {\n // ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑-\n // Runtime state that moves through the pipeline\n // ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑-\n let currentParts = initialParts\n\n // Execute each transformer in order, threading the two values.\n for (const fn of transformers) {\n const result = fn(currentParts, last)\n currentParts = result.out as LanguageModelV2StreamPart[]\n }\n\n // `OutElement<Last<T>>` is exactly the element type that the *last*\n // transformer emitted, so the cast is safe.\n return {\n out: currentParts as OutElement<Last<T>>[],\n }\n }\n}\n","import type { LanguageModelV2StreamPart } from '@ai-sdk/provider'\nimport type { DatabricksStreamPartTransformer } from './compose-stream-part-transformers'\n\ntype DeltaType = 'text' | 'reasoning'\n\n/**\n * Injects start/end deltas for sequential streams.\n */\nexport const applyDeltaBoundaryTransform: DatabricksStreamPartTransformer<\n LanguageModelV2StreamPart\n> = (parts, last) => {\n const out: LanguageModelV2StreamPart[] = []\n\n const lastDeltaType = maybeGetDeltaType(last)\n for (const incoming of parts) {\n const incomingDeltaType = maybeGetDeltaType(incoming)\n const incomingId = getPartId(incoming)\n const lastId = getPartId(last)\n\n // When continuous deltas are detected, we don't need to inject start/end deltas\n const incomingMatchesLast =\n // Only treat as a continuation when both are actual *-delta parts\n Boolean(isDeltaPart(last) && isDeltaPart(incoming)) &&\n Boolean(lastDeltaType && incomingDeltaType) &&\n Boolean(lastDeltaType === incomingDeltaType) && // Same delta group (text/reasoning)\n Boolean(incomingId && lastId && incomingId === lastId) // Same id\n\n if (incomingMatchesLast) {\n out.push(incoming)\n continue\n }\n\n // If there's no delta continuation, and the last part is a delta, we need to end it\n if (isDeltaPart(last)) {\n out.push({ type: `${getDeltaType(last)}-end`, id: last.id })\n }\n\n // If there's a new delta, we need to start it\n if (isDeltaPart(incoming)) {\n out.push({ type: `${getDeltaType(incoming)}-start`, id: incoming.id }, incoming)\n continue\n }\n\n // Otherwise, just push the incoming part\n out.push(incoming)\n continue\n }\n\n return { out }\n}\n\ntype DeltaPart = Extract<LanguageModelV2StreamPart, { type: `${DeltaType}-${string}` }>\nconst isDeltaIsh = (part?: LanguageModelV2StreamPart | null): part is DeltaPart =>\n part?.type.startsWith('text-') || part?.type.startsWith('reasoning-') || false\n\nconst maybeGetDeltaType = (part: LanguageModelV2StreamPart | null) => {\n if (!isDeltaIsh(part)) return null\n if (part.type.startsWith('text-')) return 'text'\n if (part.type.startsWith('reasoning-')) return 'reasoning'\n return null\n}\n\nconst getDeltaType = (part: DeltaPart) => {\n if (part.type.startsWith('text-')) return 'text'\n if (part.type.startsWith('reasoning-')) return 'reasoning'\n throw new Error(`Unknown delta type: ${part.type}`)\n}\n\nconst isDeltaPart = (\n part: LanguageModelV2StreamPart | null\n): part is Extract<LanguageModelV2StreamPart, { type: `${DeltaType}-delta` }> =>\n part?.type === 'text-delta' || part?.type === 'reasoning-delta'\n\nconst getPartId = (part: LanguageModelV2StreamPart | null): string | undefined => {\n if (part && 'id' in part) return part.id\n return undefined\n}\n","import type { LanguageModelV2StreamPart } from '@ai-sdk/provider'\n\nimport { composeDatabricksStreamPartTransformers } from './compose-stream-part-transformers'\nimport { applyDeltaBoundaryTransform } from './databricks-delta-boundary'\n\n/**\n * Allows stream transformations to be composed together.\n *\n * Currently only used to automatically inject start/end\n * deltas since the APIs does not supply the necessary events.\n */\nexport const getDatabricksLanguageModelTransformStream = () => {\n let lastChunk = null as LanguageModelV2StreamPart | null\n const deltaEndByTypeAndId = new Set<string>()\n const transformerStreamParts = composeDatabricksStreamPartTransformers(\n applyDeltaBoundaryTransform\n )\n return new TransformStream<LanguageModelV2StreamPart, LanguageModelV2StreamPart>({\n transform(chunk, controller) {\n // Apply transformation functions to the incoming chunks\n const { out } = transformerStreamParts([chunk], lastChunk)\n\n // Enqueue the transformed chunks with deduplication\n out.forEach((transformedChunk) => {\n const group = getDeltaGroup(transformedChunk.type)\n const endKey = makeEndKey(getPartId(transformedChunk), group)\n if (endKey && deltaEndByTypeAndId.has(endKey)) {\n // If we already ended this specific group (text/reasoning) for this id, skip further parts of the same group\n return\n }\n if (transformedChunk.type === 'text-end' || transformedChunk.type === 'reasoning-end') {\n /**\n * We register when a delta ends.\n * We rely on response.output_item.done chunks to display non streamed data\n * so we need to deduplicate them with their corresponding delta chunks.\n */\n const endGroup = getDeltaGroup(transformedChunk.type)\n const key = makeEndKey(getPartId(transformedChunk), endGroup)\n if (key) deltaEndByTypeAndId.add(key)\n }\n controller.enqueue(transformedChunk)\n })\n\n // Update the last chunk\n lastChunk = out[out.length - 1] ?? lastChunk\n },\n flush(controller) {\n // Finally, if there's a dangling text-delta, close it\n if (lastChunk?.type === 'text-delta') {\n controller.enqueue({ type: 'text-end', id: lastChunk.id })\n }\n if (lastChunk?.type === 'reasoning-delta') {\n controller.enqueue({ type: 'reasoning-end', id: lastChunk.id })\n }\n },\n })\n}\n\n// Utility functions\nconst getDeltaGroup = (type: LanguageModelV2StreamPart['type']): 'text' | 'reasoning' | null => {\n if (type.startsWith('text-')) return 'text'\n if (type.startsWith('reasoning-')) return 'reasoning'\n return null\n}\nconst getPartId = (part: LanguageModelV2StreamPart): string | undefined => {\n if ('id' in part) return part.id\n return undefined\n}\nconst makeEndKey = (id: string | undefined, group: ReturnType<typeof getDeltaGroup>) =>\n id && group ? `${group}:${id}` : null\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider'\nimport {\n type ParseResult,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n createJsonErrorResponseHandler,\n postJsonToApi,\n} from '@ai-sdk/provider-utils'\nimport { z } from 'zod/v4'\nimport type { DatabricksLanguageModelConfig } from '../databricks-provider'\nimport { chatAgentResponseSchema, chatAgentChunkSchema } from './chat-agent-schema'\nimport {\n convertChatAgentChunkToMessagePart,\n convertChatAgentResponseToMessagePart,\n} from './chat-agent-convert-to-message-parts'\nimport { convertLanguageModelV2PromptToChatAgentResponse } from './chat-agent-convert-to-input'\nimport { getDatabricksLanguageModelTransformStream } from '../stream-transformers/databricks-stream-transformer'\n\nexport class DatabricksChatAgentLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2'\n\n readonly modelId: string\n\n private readonly config: DatabricksLanguageModelConfig\n\n constructor(modelId: string, config: DatabricksLanguageModelConfig) {\n this.modelId = modelId\n this.config = config\n }\n\n get provider(): string {\n return this.config.provider\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {}\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const networkArgs = this.getArgs({\n config: this.config,\n options,\n stream: false,\n modelId: this.modelId,\n })\n\n const { value: response } = await postJsonToApi({\n ...networkArgs,\n successfulResponseHandler: createJsonResponseHandler(chatAgentResponseSchema),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: (error) => JSON.stringify(error),\n isRetryable: () => false,\n }),\n })\n\n return {\n content: convertChatAgentResponseToMessagePart(response),\n finishReason: 'stop',\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n warnings: [],\n }\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const networkArgs = this.getArgs({\n config: this.config,\n options,\n stream: true,\n modelId: this.modelId,\n })\n\n const { responseHeaders, value: response } = await postJsonToApi({\n ...networkArgs,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: (error) => JSON.stringify(error),\n isRetryable: () => false,\n }),\n successfulResponseHandler: createEventSourceResponseHandler(chatAgentChunkSchema),\n })\n\n let finishReason: LanguageModelV2FinishReason = 'unknown'\n\n return {\n stream: response\n .pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof chatAgentChunkSchema>>,\n LanguageModelV2StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings: [] })\n },\n\n transform(chunk, controller) {\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue })\n }\n\n // // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = 'error'\n controller.enqueue({ type: 'error', error: chunk.error })\n return\n }\n\n const parts = convertChatAgentChunkToMessagePart(chunk.value)\n for (const part of parts) {\n controller.enqueue(part)\n }\n },\n\n flush(controller) {\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n })\n },\n })\n )\n .pipeThrough(getDatabricksLanguageModelTransformStream()),\n request: { body: networkArgs.body },\n response: { headers: responseHeaders },\n }\n }\n\n private getArgs({\n config,\n options,\n stream,\n modelId,\n }: {\n options: LanguageModelV2CallOptions\n config: DatabricksLanguageModelConfig\n stream: boolean\n modelId: string\n }) {\n return {\n body: {\n model: modelId,\n stream,\n messages: convertLanguageModelV2PromptToChatAgentResponse(options.prompt),\n },\n url: config.url({\n path: '/completions',\n }),\n headers: combineHeaders(config.headers(), options.headers),\n fetch: config.fetch,\n abortSignal: options.abortSignal,\n }\n }\n}\n","import { z } from 'zod/v4'\n\n/**\n * Response schema\n */\nconst responsesAgentMessageSchema = z.object({\n type: z.literal('message'),\n role: z.literal('assistant'),\n id: z.string(),\n content: z.array(\n z.object({\n type: z.literal('output_text'),\n text: z.string(),\n logprobs: z.unknown().nullish(),\n annotations: z.array(\n z.discriminatedUnion('type', [\n z.object({\n type: z.literal('url_citation'),\n start_index: z.number(),\n end_index: z.number(),\n url: z.string(),\n title: z.string(),\n }),\n ])\n ),\n })\n ),\n})\n\nconst responsesAgentFunctionCallSchema = z.object({\n type: z.literal('function_call'),\n call_id: z.string(),\n name: z.string(),\n arguments: z.string(),\n id: z.string(),\n})\n\nconst responsesAgentReasoningSchema = z.object({\n type: z.literal('reasoning'),\n id: z.string(),\n encrypted_content: z.string().nullish(),\n summary: z.array(\n z.object({\n type: z.literal('summary_text'),\n text: z.string(),\n })\n ),\n})\n\nconst responsesAgentFunctionCallOutputSchema = z.object({\n type: z.literal('function_call_output'),\n call_id: z.string(),\n output: z.any(),\n})\n\nconst responsesAgentMcpApprovalRequestSchema = z.object({\n type: z.literal('mcp_approval_request'),\n id: z.string(),\n name: z.string(),\n arguments: z.string(),\n server_label: z.string(),\n})\n\nconst responsesAgentMcpApprovalResponseSchema = z.object({\n type: z.literal('mcp_approval_response'),\n id: z.string().optional(),\n approval_request_id: z.string(),\n approve: z.boolean(),\n reason: z.string().nullish(),\n})\n\nconst responsesAgentOutputItem = z.discriminatedUnion('type', [\n responsesAgentMessageSchema,\n responsesAgentFunctionCallSchema,\n responsesAgentReasoningSchema,\n responsesAgentFunctionCallOutputSchema,\n responsesAgentMcpApprovalRequestSchema,\n responsesAgentMcpApprovalResponseSchema,\n])\n\nexport const responsesAgentResponseSchema = z.object({\n id: z.string().optional(),\n created_at: z.number().optional(),\n error: z\n .object({\n code: z.string(),\n message: z.string(),\n })\n .nullish(),\n model: z.string().optional(),\n output: z.array(responsesAgentOutputItem),\n incomplete_details: z\n .object({\n reason: z.string().nullish().optional(),\n })\n .nullish(),\n usage: z\n .object({\n input_tokens: z.number(),\n output_tokens: z.number(),\n total_tokens: z.number(),\n })\n .optional(),\n})\n\n/**\n * Chunk schema\n */\n\nconst textDeltaChunkSchema = z.object({\n type: z.literal('response.output_text.delta'),\n item_id: z.string(),\n delta: z.string(),\n logprobs: z.unknown().nullish(),\n})\n\nconst errorChunkSchema = z.object({\n type: z.literal('error'),\n code: z.string(),\n message: z.string(),\n param: z.string().nullish(),\n sequence_number: z.number(),\n})\n\nexport const simpleErrorChunkSchema = z.object({\n type: z.undefined().optional(),\n error: z.string(),\n})\n\nconst responseOutputItemDoneSchema = z.object({\n type: z.literal('response.output_item.done'),\n output_index: z.number(),\n item: responsesAgentOutputItem,\n})\n\nconst responseAnnotationAddedSchema = z.object({\n type: z.literal('response.output_text.annotation.added'),\n annotation: z.discriminatedUnion('type', [\n z.object({\n type: z.literal('url_citation'),\n url: z.string(),\n title: z.string(),\n }),\n ]),\n})\n\nconst responseReasoningSummaryTextDeltaSchema = z.object({\n type: z.literal('response.reasoning_summary_text.delta'),\n item_id: z.string(),\n summary_index: z.number(),\n delta: z.string(),\n})\n\nconst responseFunctionCallArgumentsDeltaSchema = z.object({\n type: z.literal('response.function_call_arguments.delta'),\n item_id: z.string(),\n delta: z.string(),\n output_index: z.number(),\n sequence_number: z.number(),\n})\n\nconst functionCallOutputChunkSchema = z.object({\n type: z.literal('function_call_output'),\n call_id: z.string(),\n output: z.any(),\n})\n\nconst responsesCompletedSchema = z.object({\n type: z.literal('responses.completed'),\n response: z.object({\n id: z.string(),\n status: z\n .enum(['completed', 'failed', 'in_progress', 'cancelled', 'queued', 'incomplete'])\n .optional(),\n incomplete_details: z\n .object({\n reason: z.string().nullish().optional(),\n })\n .nullish(),\n usage: z.object({\n input_tokens: z.number(),\n output_tokens: z.number(),\n total_tokens: z.number(),\n }),\n }),\n})\n\nexport const responsesAgentChunkSchema = z.union([\n textDeltaChunkSchema,\n responseOutputItemDoneSchema,\n responseAnnotationAddedSchema,\n responseReasoningSummaryTextDeltaSchema,\n responseFunctionCallArgumentsDeltaSchema,\n functionCallOutputChunkSchema,\n errorChunkSchema,\n responsesCompletedSchema,\n simpleErrorChunkSchema,\n])\n\n/**\n * We use a loose schema for response validation to handle unknown chunks.\n */\nexport const looseResponseAgentChunkSchema = z.union([\n responsesAgentChunkSchema,\n z.object({ type: z.string() }).loose(), // fallback for unknown chunks\n])\n\n// Exported types for type-only imports in other modules\nexport type ResponsesAgentChunk = z.infer<typeof responsesAgentChunkSchema>\nexport type ResponsesAgentResponse = z.infer<typeof responsesAgentResponseSchema>\n","/**\n * MCP Approval Utility Functions\n *\n * Shared utilities for handling MCP (Model Context Protocol) approval requests\n * and responses across client and server code.\n */\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Key used in tool output to indicate approval status */\nexport const MCP_APPROVAL_STATUS_KEY = '__approvalStatus__'\n\n/** Type string for MCP approval requests in provider metadata */\nexport const MCP_APPROVAL_REQUEST_TYPE = 'mcp_approval_request'\n\n/** Type string for MCP approval responses in provider metadata */\nexport const MCP_APPROVAL_RESPONSE_TYPE = 'mcp_approval_response'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Approval status output object shape */\nexport type ApprovalStatusOutput = {\n [MCP_APPROVAL_STATUS_KEY]: boolean\n}\n\n/** State of an MCP approval request */\nexport type McpApprovalState = 'awaiting-approval' | 'approved' | 'denied'\n\n/** Databricks-specific metadata attached to tool calls */\nexport interface DatabricksToolMetadata {\n type?: string\n toolName?: string\n itemId?: string\n serverLabel?: string\n mcpServerName?: string\n approvalRequestId?: string\n approve?: boolean\n reason?: string\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if output contains an approval status marker.\n *\n * @example\n * if (isApprovalStatusOutput(output)) {\n * console.log(output.__approvalStatus__); // TypeScript knows this is boolean\n * }\n */\nexport function isApprovalStatusOutput(output: unknown): output is ApprovalStatusOutput {\n return (\n typeof output === 'object' &&\n output !== null &&\n MCP_APPROVAL_STATUS_KEY in output &&\n typeof (output as Record<string, unknown>)[MCP_APPROVAL_STATUS_KEY] === 'boolean'\n )\n}\n\n/**\n * Check if provider metadata indicates an MCP approval request.\n *\n * @example\n * const metadata = extractDatabricksMetadata(part);\n * if (isMcpApprovalRequest(metadata)) {\n * // Handle MCP approval request\n * }\n */\nexport function isMcpApprovalRequest(\n metadata: DatabricksToolMetadata | Record<string, unknown> | undefined\n): boolean {\n return metadata?.type?.toString() === MCP_APPROVAL_REQUEST_TYPE\n}\n\n/**\n * Check if provider metadata indicates an MCP approval response.\n */\nexport function isMcpApprovalResponse(\n metadata: DatabricksToolMetadata | Record<string, unknown> | undefined\n): boolean {\n return metadata?.type?.toString() === MCP_APPROVAL_RESPONSE_TYPE\n}\n\n// ============================================================================\n// Extractors\n// ============================================================================\n\n/**\n * Extract Databricks metadata from a tool call part's callProviderMetadata.\n *\n * @example\n * const metadata = extractDatabricksMetadata(part);\n * const toolName = metadata?.toolName;\n * const isMcp = isMcpApprovalRequest(metadata);\n */\nexport function extractDatabricksMetadata(part: {\n callProviderMetadata?: Record<string, unknown>\n}): DatabricksToolMetadata | undefined {\n if ('callProviderMetadata' in part && part.callProviderMetadata?.databricks) {\n return part.callProviderMetadata.databricks as DatabricksToolMetadata\n }\n return undefined\n}\n\n/**\n * Extract the approval status boolean from an output object.\n *\n * @returns `true` if approved, `false` if denied, `undefined` if not an approval output\n *\n * @example\n * const status = extractApprovalStatus(output);\n * if (status !== undefined) {\n * console.log(status ? 'Approved' : 'Denied');\n * }\n */\nexport function extractApprovalStatus(output: unknown): boolean | undefined {\n if (isApprovalStatusOutput(output)) {\n return output[MCP_APPROVAL_STATUS_KEY]\n }\n return undefined\n}\n\n/**\n * Extract approval status from a tool result's output value.\n * Handles the nested structure where output.type === 'json' and value contains the status.\n *\n * @example\n * const status = extractApprovalStatusFromToolResult(toolResult.output);\n */\nexport function extractApprovalStatusFromToolResult(output: {\n type: string\n value?: unknown\n}): boolean | undefined {\n if (\n output.type === 'json' &&\n output.value &&\n typeof output.value === 'object' &&\n MCP_APPROVAL_STATUS_KEY in output.value\n ) {\n const value = (output.value as Record<string, unknown>)[MCP_APPROVAL_STATUS_KEY]\n if (typeof value === 'boolean') {\n return value\n }\n }\n return undefined\n}\n\n// ============================================================================\n// Factories\n// ============================================================================\n\n/**\n * Create an approval status output object.\n *\n * @example\n * await addToolResult({\n * toolCallId,\n * output: createApprovalStatusOutput(true), // Approve\n * });\n */\nexport function createApprovalStatusOutput(approve: boolean): ApprovalStatusOutput {\n return { [MCP_APPROVAL_STATUS_KEY]: approve }\n}\n\n// ============================================================================\n// State Helpers\n// ============================================================================\n\n/**\n * Determine the MCP approval state from a tool output.\n *\n * Logic:\n * - No output → 'awaiting-approval' (user hasn't responded yet)\n * - Output with __approvalStatus__: true → 'approved'\n * - Output with __approvalStatus__: false → 'denied'\n * - Output without __approvalStatus__ → 'approved' (tool executed, so it was approved)\n *\n * @example\n * const approvalState = getMcpApprovalState(part.output);\n * // 'awaiting-approval' | 'approved' | 'denied'\n */\nexport function getMcpApprovalState(output: unknown): McpApprovalState {\n if (!output) {\n return 'awaiting-approval'\n }\n\n const status = extractApprovalStatus(output)\n if (status === undefined) {\n // Has output but no approval marker means tool executed (was approved)\n return 'approved'\n }\n\n return status ? 'approved' : 'denied'\n}\n","import type { LanguageModelV2Content, LanguageModelV2StreamPart } from '@ai-sdk/provider'\nimport { randomUUID } from 'node:crypto'\nimport { type ResponsesAgentChunk, type ResponsesAgentResponse } from './responses-agent-schema'\nimport { DATABRICKS_TOOL_CALL_ID } from '../tools'\nimport {\n MCP_APPROVAL_REQUEST_TYPE,\n MCP_APPROVAL_RESPONSE_TYPE,\n createApprovalStatusOutput,\n} from '../mcp'\n\nexport const convertResponsesAgentChunkToMessagePart = (\n chunk: ResponsesAgentChunk\n): LanguageModelV2StreamPart[] => {\n const parts: LanguageModelV2StreamPart[] = []\n\n if ('error' in chunk) {\n parts.push({\n type: 'error',\n error: chunk.error,\n })\n return parts\n }\n\n switch (chunk.type) {\n case 'response.output_text.delta':\n parts.push({\n type: 'text-delta',\n id: chunk.item_id,\n delta: chunk.delta,\n providerMetadata: {\n databricks: {\n itemId: chunk.item_id,\n },\n },\n })\n break\n\n case 'response.reasoning_summary_text.delta':\n parts.push({\n type: 'reasoning-delta',\n id: chunk.item_id,\n delta: chunk.delta,\n providerMetadata: {\n databricks: {\n itemId: chunk.item_id,\n },\n },\n })\n break\n\n case 'function_call_output':\n parts.push({\n type: 'tool-result',\n toolCallId: chunk.call_id,\n result: chunk.output,\n toolName: DATABRICKS_TOOL_CALL_ID,\n })\n break\n\n case 'response.output_item.done':\n parts.push(...convertOutputItemDone(chunk.item))\n break\n\n case 'response.output_text.annotation.added':\n parts.push({\n type: 'source',\n url: chunk.annotation.url,\n title: chunk.annotation.title,\n id: randomUUID(),\n sourceType: 'url',\n })\n break\n\n case 'error':\n parts.push({\n type: 'error',\n error: chunk,\n })\n break\n\n default: {\n void (chunk as never)\n break\n }\n }\n\n return parts\n}\n\ntype OutputItemDoneItem = Extract<\n ResponsesAgentChunk,\n { type: 'response.output_item.done' }\n>['item']\n\nconst convertOutputItemDone = (item: OutputItemDoneItem): LanguageModelV2StreamPart[] => {\n switch (item.type) {\n case 'message': {\n const firstContent = item.content[0]\n if (!firstContent) return []\n return [\n {\n type: 'text-delta',\n id: item.id,\n delta: firstContent.text,\n providerMetadata: {\n databricks: {\n itemId: item.id,\n itemType: 'response.output_item.done',\n },\n },\n },\n ]\n }\n\n case 'function_call':\n return [\n {\n type: 'tool-call',\n toolCallId: item.call_id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n input: item.arguments,\n providerMetadata: {\n databricks: {\n toolName: item.name,\n itemId: item.id,\n },\n },\n },\n ]\n\n case 'function_call_output':\n return [\n {\n type: 'tool-result',\n toolCallId: item.call_id,\n result: item.output,\n toolName: DATABRICKS_TOOL_CALL_ID,\n },\n ]\n\n case 'reasoning': {\n const firstSummary = item.summary[0]\n if (!firstSummary) return []\n return [\n {\n type: 'reasoning-start',\n id: item.id,\n },\n {\n type: 'reasoning-delta',\n id: item.id,\n delta: firstSummary.text,\n providerMetadata: {\n databricks: {\n itemId: item.id,\n },\n },\n },\n {\n type: 'reasoning-end',\n id: item.id,\n },\n ]\n }\n\n case 'mcp_approval_request':\n return [\n {\n type: 'tool-call',\n toolCallId: item.id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n input: item.arguments,\n providerMetadata: {\n databricks: {\n type: MCP_APPROVAL_REQUEST_TYPE,\n toolName: item.name,\n itemId: item.id,\n serverLabel: item.server_label,\n },\n },\n },\n ]\n\n case 'mcp_approval_response':\n return [\n {\n type: 'tool-result',\n toolCallId: item.approval_request_id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n result: createApprovalStatusOutput(item.approve),\n providerMetadata: {\n databricks: {\n type: MCP_APPROVAL_RESPONSE_TYPE,\n ...(item.id != null && { itemId: item.id }),\n },\n },\n },\n ]\n\n default:\n void (item satisfies never)\n return []\n }\n}\n\nexport const convertResponsesAgentResponseToMessagePart = (\n response: ResponsesAgentResponse\n): LanguageModelV2Content[] => {\n const parts: LanguageModelV2Content[] = []\n\n for (const output of response.output) {\n switch (output.type) {\n case 'message': {\n for (const content of output.content) {\n if (content.type === 'output_text') {\n parts.push({\n type: 'text',\n text: content.text,\n providerMetadata: {\n databricks: {\n itemId: output.id,\n },\n },\n })\n }\n }\n break\n }\n\n case 'function_call':\n parts.push({\n type: 'tool-call',\n toolCallId: output.call_id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n input: output.arguments,\n providerMetadata: {\n databricks: {\n toolName: output.name,\n itemId: output.id,\n },\n },\n })\n break\n\n case 'reasoning':\n for (const summary of output.summary) {\n if (summary.type === 'summary_text') {\n parts.push({\n type: 'reasoning',\n text: summary.text,\n providerMetadata: {\n databricks: {\n itemId: output.id,\n },\n },\n })\n }\n }\n break\n\n case 'function_call_output':\n parts.push({\n type: 'tool-result',\n result: output.output,\n toolCallId: output.call_id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n })\n break\n\n case 'mcp_approval_request':\n parts.push({\n type: 'tool-call',\n toolCallId: output.id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n input: output.arguments,\n providerMetadata: {\n databricks: {\n type: MCP_APPROVAL_REQUEST_TYPE,\n toolName: output.name,\n itemId: output.id,\n serverLabel: output.server_label,\n },\n },\n })\n break\n\n case 'mcp_approval_response':\n parts.push({\n type: 'tool-result',\n toolCallId: output.approval_request_id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n result: createApprovalStatusOutput(output.approve),\n providerMetadata: {\n databricks: {\n type: MCP_APPROVAL_RESPONSE_TYPE,\n ...(output.id != null && { itemId: output.id }),\n },\n },\n })\n break\n default: {\n void (output satisfies never)\n break\n }\n }\n }\n\n return parts\n}\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV2CallWarning,\n type LanguageModelV2Prompt,\n type LanguageModelV2ToolResultPart,\n} from '@ai-sdk/provider'\nimport { parseProviderOptions } from '@ai-sdk/provider-utils'\nimport { z } from 'zod/v4'\nimport type { ResponsesInput } from './responses-api-types'\nimport {\n MCP_APPROVAL_REQUEST_TYPE,\n MCP_APPROVAL_RESPONSE_TYPE,\n extractApprovalStatusFromToolResult,\n} from '../mcp'\n\nexport async function convertToResponsesInput({\n prompt,\n systemMessageMode,\n}: {\n prompt: LanguageModelV2Prompt\n systemMessageMode: 'system' | 'developer' | 'remove'\n}): Promise<{\n input: ResponsesInput\n warnings: Array<LanguageModelV2CallWarning>\n}> {\n const input: ResponsesInput = []\n const warnings: Array<LanguageModelV2CallWarning> = []\n\n // Map tool call results to a map by tool call id so we can insert them into the input in the correct order,\n // right after the tool call that produced them.\n const toolCallResultsByToolCallId = prompt\n .filter((p) => p.role === 'tool')\n .flatMap((p) => p.content)\n .reduce(\n (reduction, toolCallResult) => {\n if (toolCallResult.type === 'tool-result') {\n reduction[toolCallResult.toolCallId] = toolCallResult\n }\n return reduction\n },\n {} as Record<string, LanguageModelV2ToolResultPart>\n )\n\n for (const { role, content } of prompt) {\n switch (role) {\n case 'system': {\n switch (systemMessageMode) {\n case 'system':\n input.push({ role: 'system', content })\n break\n\n case 'developer':\n input.push({ role: 'developer', content })\n break\n\n case 'remove':\n warnings.push({\n type: 'other',\n message: 'system messages are removed for this model',\n })\n break\n\n default: {\n const _exhaustiveCheck: never = systemMessageMode\n throw new Error(`Unsupported system message mode: ${String(_exhaustiveCheck)}`)\n }\n }\n break\n }\n\n case 'user':\n input.push({\n role: 'user',\n content: content.map((part) => {\n switch (part.type) {\n case 'text':\n return { type: 'input_text', text: part.text }\n default:\n throw new UnsupportedFunctionalityError({\n functionality: `part ${JSON.stringify(part)}`,\n })\n }\n }),\n })\n break\n\n case 'assistant':\n for (const part of content) {\n const providerOptions = await parseProviderOptions({\n provider: 'databricks',\n providerOptions: part.providerOptions,\n schema: ProviderOptionsSchema,\n })\n const itemId = providerOptions?.itemId ?? undefined\n switch (part.type) {\n case 'text': {\n input.push({\n role: 'assistant',\n content: [{ type: 'output_text', text: part.text }],\n id: itemId,\n })\n break\n }\n case 'tool-call': {\n const toolName = providerOptions?.toolName ?? part.toolName\n if (providerOptions?.type === MCP_APPROVAL_REQUEST_TYPE) {\n // Special case for MCP approval request\n const serverLabel = providerOptions?.serverLabel ?? ''\n const argumentsString = JSON.stringify(part.input)\n const id = part.toolCallId\n input.push({\n type: MCP_APPROVAL_REQUEST_TYPE,\n id: id,\n name: toolName,\n arguments: argumentsString,\n server_label: serverLabel,\n })\n const toolResult = toolCallResultsByToolCallId[part.toolCallId]\n if (toolResult) {\n /**\n * The tool call result is either the approval status or the actual output from the tool call.\n * If it's the approval status, we need to add an approval response part.\n * If it's the tool call output, we don't include the approval response part but we do include the tool call output part.\n */\n const approvalStatus = extractApprovalStatusFromToolResult(toolResult.output)\n if (approvalStatus !== undefined) {\n // Tool call result is just the approval status (approve or deny)\n input.push({\n type: MCP_APPROVAL_RESPONSE_TYPE,\n id: toolResult.toolCallId,\n approval_request_id: toolResult.toolCallId,\n approve: approvalStatus,\n })\n } else {\n // Tool call result is the actual tool result (tool was approved and executed)\n input.push({\n type: 'function_call_output',\n call_id: toolResult.toolCallId,\n output: convertToolResultOutputToString(toolResult.output),\n })\n }\n }\n break\n }\n input.push({\n type: 'function_call',\n call_id: part.toolCallId,\n name: toolName,\n arguments: JSON.stringify(part.input),\n id: itemId,\n })\n const toolCallResult = toolCallResultsByToolCallId[part.toolCallId]\n if (toolCallResult) {\n input.push({\n type: 'function_call_output',\n call_id: part.toolCallId,\n output: convertToolResultOutputToString(toolCallResult.output),\n })\n }\n break\n }\n\n case 'tool-result': {\n if (providerOptions?.type === MCP_APPROVAL_RESPONSE_TYPE) {\n // Special case for MCP approval response\n const approvalRequestId = providerOptions?.approvalRequestId ?? part.toolCallId\n const approve = providerOptions?.approve ?? false\n const reason = providerOptions?.reason ?? ''\n input.push({\n type: MCP_APPROVAL_RESPONSE_TYPE,\n id: approvalRequestId,\n approval_request_id: approvalRequestId,\n approve: approve,\n reason: reason,\n })\n break\n }\n input.push({\n type: 'function_call_output',\n call_id: part.toolCallId,\n output: convertToolResultOutputToString(part.output),\n })\n break\n }\n\n case 'reasoning': {\n if (!itemId) break\n input.push({\n type: 'reasoning',\n summary: [{ type: 'summary_text', text: part.text }],\n id: itemId,\n })\n break\n }\n }\n }\n break\n\n case 'tool':\n // Tool call results are already inserted into the input in the correct order,\n // right after the tool call that produced them.\n break\n\n default: {\n const _exhaustiveCheck: never = role\n throw new Error(`Unsupported role: ${String(_exhaustiveCheck)}`)\n }\n }\n }\n\n return { input, warnings }\n}\n\nconst ProviderOptionsSchema = z.object({\n itemId: z.string().nullish(),\n toolName: z.string().nullish(), // for tool-call\n type: z.enum(['mcp_approval_request', 'mcp_approval_response']).nullish(), // for mcp approval request and response\n serverLabel: z.string().nullish(), // for mcp approval request\n approvalRequestId: z.string().nullish(), // for mcp approval response\n approve: z.boolean().nullish(), // for mcp approval response\n reason: z.string().nullish(), // for mcp approval response\n})\n\nexport type ProviderOptions = z.infer<typeof ProviderOptionsSchema>\n\nconst convertToolResultOutputToString = (\n output: LanguageModelV2ToolResultPart['output']\n): string => {\n switch (output.type) {\n case 'text':\n case 'error-text':\n return output.value\n default:\n return JSON.stringify(output.value)\n }\n}\n","import type { LanguageModelV2FunctionTool, LanguageModelV2ToolChoice } from '@ai-sdk/provider'\nimport { DATABRICKS_TOOL_CALL_ID } from '../tools'\n\nexport type ResponsesTool = {\n type: 'function'\n name: string\n description?: string\n parameters?: unknown\n strict?: boolean\n}\n\nexport type ResponsesToolChoice = 'auto' | 'none' | 'required' | { type: 'function'; name: string }\n\n/**\n * Prepare tools for the Responses API format.\n * Unlike the chat completions API, the responses API expects function tools\n * with name, description, and parameters at the top level (not nested under 'function').\n */\nexport function prepareResponsesTools({\n tools,\n toolChoice,\n}: {\n tools?: Array<LanguageModelV2FunctionTool | { type: 'provider-defined'; id: string }>\n toolChoice?: LanguageModelV2ToolChoice\n}): {\n tools?: Array<ResponsesTool>\n toolChoice?: ResponsesToolChoice\n} {\n // When the tools array is empty, change it to undefined to prevent errors\n if (!tools || tools.length === 0) {\n return { tools: undefined, toolChoice: undefined }\n }\n\n const responsesTools: Array<ResponsesTool> = []\n\n for (const tool of tools) {\n if (tool.type === 'provider-defined' || tool.name === DATABRICKS_TOOL_CALL_ID) {\n // Skip provider-defined tools and Databricks-orchestrated tools\n continue\n }\n\n // Function tools - responses API format has properties at top level\n responsesTools.push({\n type: 'function',\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n })\n }\n\n if (responsesTools.length === 0) {\n return { tools: undefined, toolChoice: undefined }\n }\n\n // Convert tool choice\n const convertedToolChoice = convertResponsesToolChoice(toolChoice)\n\n return {\n tools: responsesTools,\n toolChoice: convertedToolChoice,\n }\n}\n\nfunction convertResponsesToolChoice(\n toolChoice: LanguageModelV2ToolChoice | undefined\n): ResponsesToolChoice | undefined {\n if (!toolChoice) {\n return undefined\n }\n\n switch (toolChoice.type) {\n case 'auto':\n return 'auto'\n case 'none':\n return 'none'\n case 'required':\n return 'required'\n case 'tool':\n return { type: 'function', name: toolChoice.toolName }\n default:\n return undefined\n }\n}\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n} from '@ai-sdk/provider'\nimport {\n type ParseResult,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n postJsonToApi,\n} from '@ai-sdk/provider-utils'\nimport { z } from 'zod/v4'\nimport type { DatabricksLanguageModelConfig } from '../databricks-provider'\nimport {\n responsesAgentResponseSchema,\n looseResponseAgentChunkSchema,\n type responsesAgentChunkSchema,\n} from './responses-agent-schema'\nimport {\n convertResponsesAgentChunkToMessagePart,\n convertResponsesAgentResponseToMessagePart,\n} from './responses-convert-to-message-parts'\nimport { convertToResponsesInput } from './responses-convert-to-input'\nimport { getDatabricksLanguageModelTransformStream } from '../stream-transformers/databricks-stream-transformer'\nimport { prepareResponsesTools } from './responses-prepare-tools'\n\nfunction mapResponsesFinishReason({\n finishReason,\n hasToolCalls,\n}: {\n finishReason: string | null | undefined\n hasToolCalls: boolean\n}): LanguageModelV2FinishReason {\n switch (finishReason) {\n case undefined:\n case null:\n return hasToolCalls ? 'tool-calls' : 'stop'\n case 'max_output_tokens':\n return 'length'\n case 'content_filter':\n return 'content-filter'\n default:\n return hasToolCalls ? 'tool-calls' : 'other'\n }\n}\n\nexport class DatabricksResponsesAgentLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2'\n\n readonly modelId: string\n\n private readonly config: DatabricksLanguageModelConfig\n\n constructor(modelId: string, config: DatabricksLanguageModelConfig) {\n this.modelId = modelId\n this.config = config\n }\n\n get provider(): string {\n return this.config.provider\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {}\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const networkArgs = await this.getArgs({\n config: this.config,\n options,\n stream: false,\n modelId: this.modelId,\n })\n\n const { value: response } = await postJsonToApi({\n ...networkArgs,\n successfulResponseHandler: createJsonResponseHandler(responsesAgentResponseSchema),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: (error) => JSON.stringify(error),\n isRetryable: () => false,\n }),\n })\n\n const content = convertResponsesAgentResponseToMessagePart(response)\n const hasToolCalls = content.some((p) => p.type === 'tool-call')\n\n return {\n content,\n finishReason: mapResponsesFinishReason({\n finishReason: response.incomplete_details?.reason,\n hasToolCalls,\n }),\n usage: {\n inputTokens: response.usage?.input_tokens ?? 0,\n outputTokens: response.usage?.output_tokens ?? 0,\n totalTokens: response.usage?.total_tokens ?? 0,\n },\n warnings: [],\n }\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const networkArgs = await this.getArgs({\n config: this.config,\n options,\n stream: true,\n modelId: this.modelId,\n })\n\n const { responseHeaders, value: response } = await postJsonToApi({\n ...networkArgs,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: (error) => JSON.stringify(error),\n isRetryable: () => false,\n }),\n successfulResponseHandler: createEventSourceResponseHandler(looseResponseAgentChunkSchema),\n abortSignal: options.abortSignal,\n })\n\n let finishReason: LanguageModelV2FinishReason = 'unknown'\n const usage: LanguageModelV2Usage = {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n }\n\n const allParts: LanguageModelV2StreamPart[] = []\n\n return {\n stream: response\n .pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof responsesAgentChunkSchema>>,\n LanguageModelV2StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings: [] })\n },\n\n transform(chunk, controller) {\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue })\n }\n\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = 'error'\n controller.enqueue({ type: 'error', error: chunk.error })\n return\n }\n\n if (chunk.value.type === 'responses.completed') {\n const hasToolCalls = allParts.some((p) => p.type === 'tool-call')\n finishReason = mapResponsesFinishReason({\n finishReason: chunk.value.response.incomplete_details?.reason,\n hasToolCalls,\n })\n usage.inputTokens = chunk.value.response.usage.input_tokens\n usage.outputTokens = chunk.value.response.usage.output_tokens\n usage.totalTokens = chunk.value.response.usage.total_tokens\n return\n }\n\n const parts = convertResponsesAgentChunkToMessagePart(chunk.value)\n\n allParts.push(...parts)\n /**\n * Check if the last chunk was a tool result without a tool call\n * This is a special case for MCP approval requests where the tool result\n * is sent in a separate call after the tool call was approved/denied.\n */\n if (parts.length === 0) {\n return\n }\n const part = parts[0]\n if (part.type === 'tool-result') {\n // First check if the tool call is in the current stream parts\n const matchingToolCallInParts = parts.find(\n (c) => c.type === 'tool-call' && c.toolCallId === part.toolCallId\n )\n // Also check if the tool call was emitted earlier in this stream\n const matchingToolCallInStream = allParts.find(\n (c) => c.type === 'tool-call' && c.toolCallId === part.toolCallId\n )\n if (!matchingToolCallInParts && !matchingToolCallInStream) {\n // Find the tool call in the prompt (previous messages)\n const toolCallFromPreviousMessages = options.prompt\n .flatMap((message) => {\n if (typeof message.content === 'string') return []\n return message.content\n })\n .find((p) => p.type === 'tool-call' && p.toolCallId === part.toolCallId)\n if (!toolCallFromPreviousMessages) {\n throw new Error('No matching tool call found in previous message')\n }\n if (toolCallFromPreviousMessages.type === 'tool-call') {\n controller.enqueue({\n ...toolCallFromPreviousMessages,\n input: JSON.stringify(toolCallFromPreviousMessages.input),\n })\n }\n }\n }\n // Dedupe logic for messages sent via response.output_item.done\n // MAS relies on sending text via response.output_item.done ONLY without any delta chunks\n // We have to decide when to display these messages in the UI\n if (shouldDedupeOutputItemDone(parts, allParts.slice(0, -parts.length))) {\n return\n }\n for (const part of parts) {\n controller.enqueue(part)\n }\n },\n\n flush(controller) {\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage,\n })\n },\n })\n )\n .pipeThrough(getDatabricksLanguageModelTransformStream()),\n request: { body: networkArgs.body },\n response: { headers: responseHeaders },\n }\n }\n\n private async getArgs({\n config,\n options,\n stream,\n modelId,\n }: {\n options: LanguageModelV2CallOptions\n config: DatabricksLanguageModelConfig\n stream: boolean\n modelId: string\n }) {\n const { input } = await convertToResponsesInput({\n prompt: options.prompt,\n systemMessageMode: 'system',\n })\n\n // Prepare tools for the Responses API format\n const { tools, toolChoice } = prepareResponsesTools({\n tools: options.tools,\n toolChoice: options.toolChoice,\n })\n\n return {\n url: config.url({\n path: '/responses',\n }),\n headers: combineHeaders(config.headers(), options.headers),\n body: {\n model: modelId,\n input,\n stream,\n ...(tools ? { tools } : {}),\n ...(toolChoice && tools ? { tool_choice: toolChoice } : {}),\n },\n fetch: config.fetch,\n }\n }\n}\n\nexport function shouldDedupeOutputItemDone(\n incomingParts: LanguageModelV2StreamPart[],\n previousParts: LanguageModelV2StreamPart[]\n): boolean {\n // Determine if the incoming parts contain a text-delta that is a response.output_item.done\n const doneTextDelta = incomingParts.find(\n (p) =>\n p.type === 'text-delta' &&\n p.providerMetadata?.databricks?.itemType === 'response.output_item.done'\n )\n\n // If the incoming parts do not contain a text-delta that is a response.output_item.done, return false\n if (!doneTextDelta || doneTextDelta.type !== 'text-delta' || !doneTextDelta.id) {\n return false\n }\n\n /**\n * To determine if the text in response.output_item.done is a duplicate, we need to reconstruct the text from the\n * previous consecutive text-deltas and check if the .done text is already present in what we've streamed.\n *\n * The caveat is that the response.output_item.done text uses GFM footnote syntax, where as the streamed content\n * uses response.output_text.delta and response.output_text.annotation.added events. So we reconstruct all the\n * delta text and check if the .done text is contained in it (meaning we've already streamed it).\n *\n * We only consider text-deltas that came AFTER the last response.output_item.done event, since each .done\n * corresponds to a specific message and we should only compare against text streamed for that message.\n */\n // 1. Find the index after the last response.output_item.done event using findLastIndex\n const lastDoneIndex = previousParts.findLastIndex(\n (part) =>\n part.type === 'text-delta' &&\n part.providerMetadata?.databricks?.itemType === 'response.output_item.done'\n )\n const partsAfterLastDone = previousParts.slice(lastDoneIndex + 1)\n\n // 2. Reconstruct text blocks from parts after the last .done event, separated by non-text-delta parts\n const { texts: reconstructuredTexts, current } = partsAfterLastDone.reduce<{\n texts: string[]\n current: string\n }>(\n (acc, part) => {\n if (part.type === 'text-delta') {\n return { ...acc, current: acc.current + part.delta }\n } else if (acc.current.trim().length > 0) {\n return { texts: [...acc.texts, acc.current.trim()], current: '' }\n }\n return acc\n },\n { texts: [], current: '' }\n )\n reconstructuredTexts.push(current)\n\n // 3. Check if the .done text contains all reconstructed text blocks in order\n if (reconstructuredTexts.length === 0) {\n return false\n }\n\n const allTextsFoundInOrder = reconstructuredTexts.reduce<{ found: boolean; lastIndex: number }>(\n (acc, text) => {\n if (!acc.found) return acc\n const index = doneTextDelta.delta.indexOf(text, acc.lastIndex)\n if (index === -1) return { found: false, lastIndex: acc.lastIndex }\n return { found: true, lastIndex: index + text.length }\n },\n { found: true, lastIndex: 0 }\n )\n\n return allTextsFoundInOrder.found\n}\n","import { z } from 'zod/v4'\n\n// Tool call schema for OpenAI-compatible format\nexport const toolCallSchema = z.object({\n id: z.string(),\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n arguments: z.string(), // JSON string of arguments\n }),\n})\n\n// Zod schemas mirroring FMAPI chat chunk types\nexport const reasoningSummarySchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('summary_text'),\n text: z.string(),\n signature: z.string().optional(),\n }),\n z.object({\n type: z.literal('summary_encrypted_text'),\n data: z.string(),\n }),\n])\n\nexport const contentItemSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('text'),\n text: z.string(),\n citation: z.unknown().optional(),\n }),\n z.object({\n type: z.literal('image'),\n image_url: z.string(),\n }),\n z.object({\n type: z.literal('reasoning'),\n summary: z.array(reasoningSummarySchema),\n }),\n])\n\n// Tool call delta for streaming\nexport const toolCallDeltaSchema = z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal('function').optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n})\n\nexport const fmapiChunkSchema = z.object({\n id: z.string(),\n created: z.number(),\n model: z.string(),\n usage: z\n .object({\n prompt_tokens: z.number().nullable().optional(),\n completion_tokens: z.number().nullable().optional(),\n total_tokens: z.number().nullable().optional(),\n })\n .nullable()\n .optional(),\n object: z.literal('chat.completion.chunk'),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.union([z.literal('assistant'), z.null(), z.undefined()]).optional(),\n // content can be string, array of content items, null (when tool_calls present), or omitted\n content: z.union([z.string(), z.array(contentItemSchema), z.null()]).optional(),\n tool_calls: z.array(toolCallDeltaSchema).optional(),\n }),\n finish_reason: z.union([z.string(), z.null()]).optional(),\n })\n ),\n})\n\nexport const fmapiResponseSchema = z.object({\n id: z.string(),\n created: z.number(),\n model: z.string(),\n usage: z\n .object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n })\n .nullable()\n .optional(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.union([z.literal('assistant'), z.literal('user'), z.literal('tool')]),\n content: z.union([z.string(), z.array(contentItemSchema), z.null()]).optional(),\n tool_calls: z.array(toolCallSchema).optional(),\n }),\n finish_reason: z.union([z.string(), z.null()]).optional(),\n })\n ),\n})\n\n// Input message schema for requests (different from response format)\n// Tool messages in requests need tool_call_id at the message level\nexport type FmapiInputMessage =\n | {\n role: 'system' | 'user' | 'assistant'\n content: string | z.infer<typeof contentItemSchema>[] | null\n tool_calls?: z.infer<typeof toolCallSchema>[]\n }\n | {\n role: 'tool'\n tool_call_id: string\n content: string\n }\n\n// Exported types for type-only imports in other modules\nexport type FmapiChunk = z.infer<typeof fmapiChunkSchema>\nexport type FmapiResponse = z.infer<typeof fmapiResponseSchema>\nexport type FmapiMessage = FmapiResponse['choices'][number]['message']\nexport type FmapiContentItem = z.infer<typeof contentItemSchema>\nexport type FmapiToolCall = z.infer<typeof toolCallSchema>\n","import type { LanguageModelV2Content, LanguageModelV2StreamPart } from '@ai-sdk/provider'\nimport type { FmapiChunk, FmapiContentItem, FmapiResponse, FmapiToolCall } from './fmapi-schema'\nimport { DATABRICKS_TOOL_CALL_ID } from '../tools'\n\nexport const convertFmapiChunkToMessagePart = (\n chunk: FmapiChunk,\n toolCallIdsByIndex?: Map<number, string>\n): LanguageModelV2StreamPart[] => {\n const parts: LanguageModelV2StreamPart[] = []\n if (chunk.choices.length === 0) return parts\n const choice = chunk.choices[0]\n\n // Handle streaming tool calls\n if (choice.delta.tool_calls && choice.delta.tool_calls.length > 0) {\n for (const toolCallDelta of choice.delta.tool_calls) {\n const index = toolCallDelta.index\n\n // If this is the start of a tool call (has id and name), track the ID\n if (toolCallDelta.id && toolCallDelta.function?.name) {\n toolCallIdsByIndex?.set(index, toolCallDelta.id)\n parts.push({\n type: 'tool-input-start',\n id: toolCallDelta.id,\n toolName: toolCallDelta.function.name,\n })\n }\n\n // If this has argument delta, use tracked ID or fallback\n if (toolCallDelta.function?.arguments) {\n const id = toolCallDelta.id ?? toolCallIdsByIndex?.get(index) ?? `tool-call-${index}`\n parts.push({\n type: 'tool-input-delta',\n id,\n delta: toolCallDelta.function.arguments,\n })\n }\n }\n }\n\n if (typeof choice.delta.content === 'string') {\n // Skip empty string content to avoid spurious text-start/text-end cycles\n if (choice.delta.content) {\n parts.push({ type: 'text-delta', id: chunk.id, delta: choice.delta.content })\n }\n } else if (Array.isArray(choice.delta.content)) {\n parts.push(...mapContentItemsToStreamParts(choice.delta.content, chunk.id))\n }\n\n return parts\n}\n\nexport const convertFmapiResponseToMessagePart = (\n response: FmapiResponse\n): LanguageModelV2Content[] => {\n const parts: LanguageModelV2Content[] = []\n if (response.choices.length === 0) return parts\n const choice = response.choices[0]\n\n // Handle OpenAI-format tool_calls first\n if (choice.message.tool_calls && choice.message.tool_calls.length > 0) {\n for (const toolCall of choice.message.tool_calls) {\n parts.push(convertToolCallToContent(toolCall))\n }\n // If there's also text content, include it\n if (typeof choice.message.content === 'string' && choice.message.content) {\n parts.push({ type: 'text', text: choice.message.content })\n }\n return parts\n }\n\n if (typeof choice.message.content === 'string') {\n parts.push({ type: 'text', text: choice.message.content })\n } else {\n parts.push(...mapContentItemsToProviderContent(choice.message.content ?? []))\n }\n\n return parts\n}\n\nconst convertToolCallToContent = (toolCall: FmapiToolCall): LanguageModelV2Content => {\n return {\n type: 'tool-call',\n toolCallId: toolCall.id,\n toolName: DATABRICKS_TOOL_CALL_ID,\n input: toolCall.function.arguments,\n providerMetadata: {\n databricks: {\n toolName: toolCall.function.name,\n },\n },\n }\n}\n\nconst mapContentItemsToStreamParts = (\n items: FmapiContentItem[],\n id: string\n): LanguageModelV2StreamPart[] => {\n const parts: LanguageModelV2StreamPart[] = []\n for (const item of items) {\n switch (item.type) {\n case 'text':\n parts.push({ type: 'text-delta', id, delta: item.text })\n break\n case 'image':\n // Images are currently not supported in stream parts\n break\n case 'reasoning': {\n for (const summary of item.summary.filter((s) => s.type === 'summary_text')) {\n parts.push({ type: 'reasoning-delta', id, delta: summary.text })\n }\n break\n }\n }\n }\n return parts\n}\n\nconst mapContentItemsToProviderContent = (items: FmapiContentItem[]): LanguageModelV2Content[] => {\n const parts: LanguageModelV2Content[] = []\n for (const item of items) {\n switch (item.type) {\n case 'text':\n parts.push({ type: 'text', text: item.text })\n break\n case 'image':\n // Images are currently not supported in content parts\n break\n case 'reasoning': {\n for (const summary of item.summary.filter((s) => s.type === 'summary_text')) {\n parts.push({ type: 'reasoning', text: summary.text })\n }\n break\n }\n }\n }\n return parts\n}\n","import type {\n LanguageModelV2Message,\n LanguageModelV2ToolResultPart,\n LanguageModelV2ToolCallPart,\n} from '@ai-sdk/provider'\nimport { parseProviderOptions } from '@ai-sdk/provider-utils'\nimport { z } from 'zod/v4'\nimport type { FmapiInputMessage, FmapiContentItem } from './fmapi-schema'\n\ntype LanguageModelV2SystemMessage = Extract<LanguageModelV2Message, { role: 'system' }>\ntype LanguageModelV2UserMessage = Extract<LanguageModelV2Message, { role: 'user' }>\ntype LanguageModelV2AssistantMessage = Extract<LanguageModelV2Message, { role: 'assistant' }>\ntype LanguageModelV2ToolMessage = Extract<LanguageModelV2Message, { role: 'tool' }>\n\nexport const convertPromptToFmapiMessages = async (\n prompt: LanguageModelV2Message[]\n): Promise<{ messages: Array<FmapiInputMessage> }> => {\n const messages: Array<FmapiInputMessage> = []\n\n for (const message of prompt) {\n switch (message.role) {\n case 'system':\n messages.push(convertSystemMessage(message))\n break\n case 'user':\n messages.push(convertUserMessage(message))\n break\n case 'assistant':\n messages.push(await convertAssistantMessage(message))\n break\n case 'tool':\n // Tool messages need special handling - one message per tool result\n messages.push(...convertToolMessages(message))\n break\n }\n }\n\n return { messages }\n}\n\nconst convertSystemMessage = (message: LanguageModelV2SystemMessage): FmapiInputMessage => {\n return {\n role: 'system',\n content: [{ type: 'text', text: message.content }],\n }\n}\n\nconst convertUserMessage = (message: LanguageModelV2UserMessage): FmapiInputMessage => {\n const content: FmapiContentItem[] = []\n\n for (const part of message.content) {\n switch (part.type) {\n case 'text':\n content.push({ type: 'text', text: part.text })\n break\n case 'file':\n if (part.mediaType.startsWith('image/')) {\n const url = toHttpUrlString(part.data)\n if (url) content.push({ type: 'image', image_url: url })\n }\n break\n }\n }\n\n return { role: 'user', content }\n}\n\nconst convertAssistantMessage = async (\n message: LanguageModelV2AssistantMessage\n): Promise<FmapiInputMessage> => {\n const contentItems: FmapiContentItem[] = []\n const toolCalls: Array<{\n id: string\n type: 'function'\n function: { name: string; arguments: string }\n }> = []\n\n for (const part of message.content) {\n switch (part.type) {\n case 'text':\n contentItems.push({ type: 'text', text: part.text })\n break\n case 'file':\n if (part.mediaType.startsWith('image/')) {\n const url = toHttpUrlString(part.data)\n if (url) contentItems.push({ type: 'image', image_url: url })\n }\n break\n case 'reasoning':\n contentItems.push({\n type: 'reasoning',\n summary: [{ type: 'summary_text', text: part.text }],\n })\n break\n case 'tool-call': {\n // Parse provider options to get the actual tool name\n const toolName = await getToolNameFromPart(part)\n // Convert to OpenAI tool_calls format\n toolCalls.push({\n id: part.toolCallId,\n type: 'function',\n function: {\n name: toolName,\n arguments: typeof part.input === 'string' ? part.input : JSON.stringify(part.input),\n },\n })\n break\n }\n }\n }\n\n return {\n role: 'assistant',\n // Use null instead of empty string when there's no text content\n content: contentItems.length === 0 ? null : contentItems,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n }\n}\n\nconst convertToolMessages = (message: LanguageModelV2ToolMessage): FmapiInputMessage[] => {\n const messages: FmapiInputMessage[] = []\n\n for (const part of message.content) {\n if (part.type === 'tool-result') {\n // Each tool result becomes a separate tool message with tool_call_id\n const content = convertToolResultOutputToContentValue(part.output)\n messages.push({\n role: 'tool',\n tool_call_id: part.toolCallId,\n content: typeof content === 'string' ? content : JSON.stringify(content),\n })\n }\n }\n\n return messages\n}\n\nconst toHttpUrlString = (data: URL | string | Uint8Array): string | null => {\n if (data instanceof URL) return data.toString()\n if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) return data\n }\n return null\n}\n\nconst convertToolResultOutputToContentValue = (\n output: LanguageModelV2ToolResultPart['output']\n): unknown => {\n switch (output.type) {\n case 'text':\n case 'error-text':\n return output.value\n case 'json':\n case 'error-json':\n return output.value\n case 'content':\n return output.value\n default:\n return null\n }\n}\n\nconst ProviderOptionsSchema = z.object({\n toolName: z.string().nullish(),\n})\n\nconst getToolNameFromPart = async (part: LanguageModelV2ToolCallPart): Promise<string> => {\n const providerOptions = await parseProviderOptions({\n provider: 'databricks',\n providerOptions: part.providerOptions,\n schema: ProviderOptionsSchema,\n })\n // Use the actual tool name from provider metadata if available,\n // otherwise fall back to part.toolName (which may be DATABRICKS_TOOL_CALL_ID)\n return providerOptions?.toolName ?? part.toolName\n}\n","import { LanguageModelV2FinishReason } from '@ai-sdk/provider'\n\nexport function mapFmapiFinishReason(\n finishReason: string | null | undefined\n): LanguageModelV2FinishReason {\n switch (finishReason) {\n case 'stop':\n return 'stop'\n case 'length':\n return 'length'\n case 'content_filter':\n return 'content-filter'\n case 'function_call':\n case 'tool_calls':\n return 'tool-calls'\n default:\n return 'other'\n }\n}\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2FinishReason,\n LanguageModelV2FunctionTool,\n LanguageModelV2StreamPart,\n LanguageModelV2ToolChoice,\n} from '@ai-sdk/provider'\nimport {\n type ParseResult,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n postJsonToApi,\n} from '@ai-sdk/provider-utils'\nimport { z } from 'zod/v4'\nimport type { DatabricksLanguageModelConfig } from '../databricks-provider'\nimport { fmapiChunkSchema, fmapiResponseSchema } from './fmapi-schema'\nimport {\n convertFmapiChunkToMessagePart,\n convertFmapiResponseToMessagePart,\n} from './fmapi-convert-to-message-parts'\nimport { convertPromptToFmapiMessages } from './fmapi-convert-to-input'\nimport { getDatabricksLanguageModelTransformStream } from '../stream-transformers/databricks-stream-transformer'\nimport { DATABRICKS_TOOL_CALL_ID } from '../tools'\nimport { mapFmapiFinishReason } from './fmapi-finish-reason'\n\nexport class DatabricksFmapiLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2'\n\n readonly modelId: string\n\n private readonly config: DatabricksLanguageModelConfig\n\n constructor(modelId: string, config: DatabricksLanguageModelConfig) {\n this.modelId = modelId\n this.config = config\n }\n\n get provider(): string {\n return this.config.provider\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {}\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const networkArgs = await this.getArgs({\n config: this.config,\n options,\n stream: false,\n modelId: this.modelId,\n })\n\n const { value: response } = await postJsonToApi({\n ...networkArgs,\n successfulResponseHandler: createJsonResponseHandler(fmapiResponseSchema),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: (error) => JSON.stringify(error),\n isRetryable: () => false,\n }),\n })\n\n // Determine finish reason from response\n const choice = response.choices[0]\n const finishReason = mapFmapiFinishReason(choice?.finish_reason)\n\n return {\n content: convertFmapiResponseToMessagePart(response),\n finishReason,\n usage: {\n inputTokens: response.usage?.prompt_tokens ?? 0,\n outputTokens: response.usage?.completion_tokens ?? 0,\n totalTokens: response.usage?.total_tokens ?? 0,\n },\n warnings: [],\n }\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const networkArgs = await this.getArgs({\n config: this.config,\n options,\n stream: true,\n modelId: this.modelId,\n })\n\n const { responseHeaders, value: response } = await postJsonToApi({\n ...networkArgs,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: (error) => JSON.stringify(error),\n isRetryable: () => false,\n }),\n successfulResponseHandler: createEventSourceResponseHandler(fmapiChunkSchema),\n abortSignal: options.abortSignal,\n })\n\n let finishReason: LanguageModelV2FinishReason = 'unknown'\n let usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 }\n\n // Track tool call IDs by index for streaming (OpenAI only sends ID in first chunk)\n const toolCallIdsByIndex = new Map<number, string>()\n // Track tool call names by ID\n const toolCallNamesById = new Map<string, string>()\n // Track accumulated tool call inputs by ID\n const toolCallInputsById = new Map<string, string>()\n\n return {\n stream: response\n .pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof fmapiChunkSchema>>,\n LanguageModelV2StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings: [] })\n },\n\n transform(chunk, controller) {\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue })\n }\n\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = 'error'\n controller.enqueue({ type: 'error', error: chunk.error })\n return\n }\n\n // Track finish reason from chunk\n const choice = chunk.value.choices[0]\n finishReason = mapFmapiFinishReason(choice?.finish_reason)\n\n // Track usage from chunk\n if (chunk.value.usage) {\n usage = {\n inputTokens: chunk.value.usage.prompt_tokens ?? 0,\n outputTokens: chunk.value.usage.completion_tokens ?? 0,\n totalTokens: chunk.value.usage.total_tokens ?? 0,\n }\n }\n\n const parts = convertFmapiChunkToMessagePart(chunk.value, toolCallIdsByIndex)\n for (const part of parts) {\n // Track tool call info for later emission\n if (part.type === 'tool-input-start') {\n toolCallNamesById.set(part.id, part.toolName)\n toolCallInputsById.set(part.id, '')\n } else if (part.type === 'tool-input-delta') {\n const current = toolCallInputsById.get(part.id) ?? ''\n toolCallInputsById.set(part.id, current + part.delta)\n }\n controller.enqueue(part)\n }\n },\n\n flush(controller) {\n // Emit complete tool-call events for all accumulated tool calls\n for (const [toolCallId, inputText] of toolCallInputsById) {\n const toolName = toolCallNamesById.get(toolCallId)\n if (toolName) {\n // Emit tool-input-end to signal streaming is complete\n controller.enqueue({ type: 'tool-input-end', id: toolCallId })\n\n // Emit a complete tool-call with DATABRICKS_TOOL_CALL_ID\n // and actual tool name in provider metadata\n controller.enqueue({\n type: 'tool-call',\n toolCallId,\n toolName: DATABRICKS_TOOL_CALL_ID,\n input: inputText,\n providerMetadata: {\n databricks: {\n toolName,\n },\n },\n })\n }\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage,\n })\n },\n })\n )\n .pipeThrough(getDatabricksLanguageModelTransformStream()),\n request: { body: networkArgs.body },\n response: { headers: responseHeaders },\n }\n }\n\n private async getArgs({\n config,\n options,\n stream,\n modelId,\n }: {\n options: LanguageModelV2CallOptions\n config: DatabricksLanguageModelConfig\n stream: boolean\n modelId: string\n }) {\n // Convert tools to OpenAI format (filter out provider-defined tools)\n const tools = options.tools\n ?.map((tool) => convertToolToOpenAIFormat(tool))\n .filter((tool): tool is NonNullable<typeof tool> => tool !== undefined)\n\n // Convert tool choice to OpenAI format\n const toolChoice = options.toolChoice\n ? convertToolChoiceToOpenAIFormat(options.toolChoice)\n : undefined\n\n const { messages } = await convertPromptToFmapiMessages(options.prompt)\n\n return {\n url: config.url({\n path: '/chat/completions',\n }),\n headers: combineHeaders(config.headers(), options.headers),\n body: {\n messages,\n stream,\n model: modelId,\n ...(tools && tools.length > 0 ? { tools } : {}),\n ...(toolChoice && tools && tools.length > 0 ? { tool_choice: toolChoice } : {}),\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(options.maxOutputTokens !== undefined ? { max_tokens: options.maxOutputTokens } : {}),\n ...(options.stopSequences && options.stopSequences.length > 0\n ? { stop: options.stopSequences }\n : {}),\n },\n fetch: config.fetch,\n }\n }\n}\n\n/**\n * Convert AI SDK tool to OpenAI format\n */\nfunction convertToolToOpenAIFormat(\n tool: LanguageModelV2FunctionTool | { type: 'provider-defined'; id: string }\n):\n | { type: 'function'; function: { name: string; description?: string; parameters?: unknown } }\n | undefined {\n if (tool.type === 'provider-defined' || tool.name === DATABRICKS_TOOL_CALL_ID) {\n // Skip provider-defined tools as they're not supported in OpenAI format\n // or tools that are orchestrated by Databricks' agents\n return undefined\n }\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }\n}\n\n/**\n * Convert AI SDK tool choice to OpenAI format\n */\nfunction convertToolChoiceToOpenAIFormat(\n toolChoice: LanguageModelV2ToolChoice\n): 'auto' | 'none' | 'required' | { type: 'function'; function: { name: string } } {\n if (toolChoice.type === 'auto') {\n return 'auto'\n }\n if (toolChoice.type === 'none') {\n return 'none'\n }\n if (toolChoice.type === 'required') {\n return 'required'\n }\n if (toolChoice.type === 'tool') {\n return {\n type: 'function',\n function: { name: toolChoice.toolName },\n }\n }\n return 'auto'\n}\n","import type { LanguageModelV2, ProviderV2 } from '@ai-sdk/provider'\nimport { combineHeaders, type FetchFunction, withoutTrailingSlash } from '@ai-sdk/provider-utils'\nimport { DatabricksChatAgentLanguageModel } from './chat-agent-language-model/chat-agent-language-model'\nimport { DatabricksResponsesAgentLanguageModel } from './responses-agent-language-model/responses-agent-language-model'\nimport { DatabricksFmapiLanguageModel } from './fmapi-language-model/fmapi-language-model'\n\nexport type DatabricksLanguageModelConfig = {\n provider: string\n headers: () => Record<string, string | undefined>\n url: (options: { path: string }) => string\n fetch?: FetchFunction\n}\n\nexport interface DatabricksProvider extends ProviderV2 {\n /** Agents */\n chatAgent(modelId: string): LanguageModelV2 // agent/v2/chat\n responses(modelId: string): LanguageModelV2 // agent/v1/responses\n\n /** Foundation Models */\n chatCompletions(modelId: string): LanguageModelV2 // llm/v1/chat\n}\n\nexport interface DatabricksProviderSettings {\n /** Base URL for the Databricks API calls. */\n baseURL: string\n /** Custom headers to include in the requests. */\n headers?: Record<string, string>\n /** Provider name. Overrides the `databricks` default name for 3rd party providers. */\n provider?: string\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n * */\n fetch?: FetchFunction\n\n /**\n * Optional function to format the URL\n */\n formatUrl?: (options: { baseUrl?: string; path: string }) => string\n}\n\nexport const createDatabricksProvider = (\n settings: DatabricksProviderSettings\n): DatabricksProvider => {\n const baseUrl = withoutTrailingSlash(settings.baseURL)\n const getHeaders = () => combineHeaders(settings.headers)\n const fetch = settings.fetch\n const provider = settings.provider ?? 'databricks'\n\n const formatUrl = ({ path }: { path: string }) =>\n settings.formatUrl?.({ baseUrl, path }) ?? `${baseUrl}${path}`\n\n const createChatAgent = (modelId: string): LanguageModelV2 =>\n new DatabricksChatAgentLanguageModel(modelId, {\n url: formatUrl,\n headers: getHeaders,\n fetch,\n provider,\n })\n\n const createResponsesAgent = (modelId: string): LanguageModelV2 =>\n new DatabricksResponsesAgentLanguageModel(modelId, {\n url: formatUrl,\n headers: getHeaders,\n fetch,\n provider,\n })\n\n const createFmapi = (modelId: string): LanguageModelV2 =>\n new DatabricksFmapiLanguageModel(modelId, {\n url: formatUrl,\n headers: getHeaders,\n fetch,\n provider,\n })\n\n const notImplemented = (name: string) => {\n return () => {\n throw new Error(`${name} is not supported yet`)\n }\n }\n\n return {\n responses: createResponsesAgent,\n chatCompletions: createFmapi,\n chatAgent: createChatAgent,\n imageModel: notImplemented('ImageModel'),\n textEmbeddingModel: notImplemented('TextEmbeddingModel'),\n languageModel: notImplemented('LanguageModel'),\n }\n}\n"],"mappings":"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"}