@databricks/ai-sdk-provider 0.1.0 → 0.2.0

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.d.cts CHANGED
@@ -14,9 +14,9 @@ type DatabricksLanguageModelConfig = {
14
14
  interface DatabricksProvider extends ProviderV2 {
15
15
  /** Agents */
16
16
  chatAgent(modelId: string): LanguageModelV2;
17
- responsesAgent(modelId: string): LanguageModelV2;
18
- /** FMAPI */
19
- fmapi(modelId: string): LanguageModelV2;
17
+ responses(modelId: string): LanguageModelV2;
18
+ /** Foundation Models */
19
+ chatCompletions(modelId: string): LanguageModelV2;
20
20
  }
21
21
  interface DatabricksProviderSettings {
22
22
  /** Base URL for the Databricks API calls. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/databricks-provider.ts","../src/tools.ts","../src/mcp.ts"],"sourcesContent":null,"mappings":";;;;;KAMY,6BAAA;;iBAEK;EAFL,GAAA,EAAA,CAAA,OAAA,EAAA;IAA6B,IAAA,EAAA,MAAA;EAAA,CAAA,EAExB,GAAA,MAAA;EAAM,KAEb,CAAA,EAAA,aAAA;AAAa,CAAA;AAGN,UAAA,kBAAA,SAA2B,UAAR,CAAA;EAAA;EAAA,SAEN,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,eAAA;EAAe,cACV,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,eAAA;EAAe;EAGT,KANG,CAAA,OAAA,EAAA,MAAA,CAAA,EAMlB,eANkB;AAAU;AASrC,UAAA,0BAAA,CAA0B;EAAA;EAAA,OAI/B,EAAA,MAAA;EAAM;EAQK,OAAA,CAAA,EARX,MAQW,CAAA,MAAA,EAAA,MAAA,CAAA;EAQV;EAiDZ,QAAA,CAAA,EAAA,MAAA;EAAA;;AAAA;;UAzDS;;AC/BV;;;;;;;cDuCa,qCACD,+BACT;;;;cCzCU,uBAAA;;;;ADGb;;;;AAIuB;AAGvB;;AAE8B,cCAjB,0BDAiB,EAAA;EAAe,IACV,EAAA,MAAA;EAAe,WAGxB,EAAA,MAAA;EAAe,WANG,ECQ5B,CAAA,CAAA,MDR4B;EAAU,YAAA,UAAA;AAStD,CAAA;;;;;;;;;;AAhBA;;AAEiB,cEIJ,uBAAA,GFJI,oBAAA;;AAEM,cEKV,yBAAA,GFLU,sBAAA;AAGvB;AAAoC,cEKvB,0BAAA,GFLuB,uBAAA;;AAGD,KESvB,oBAAA,GFTuB;EAAe,CEU/C,uBAAuB,CFPA,EAAA,OAAA;CAAe;AANa;AASrC,KEQL,gBAAA,GFRK,mBAA0B,GAAA,UAAA,GAAA,QAAA;;AAI/B,UEOK,sBAAA,CFPL;EAAM,IAQR,CAAA,EAAA,MAAA;EAAa,QAAA,CAAA,EAAA,MAAA;EAQV,MAAA,CAAA,EAAA,MAAA;EAiDZ,WAAA,CAAA,EAAA,MAAA;EAAA,aAhDW,CAAA,EAAA,MAAA;EAA0B,iBACnC,CAAA,EAAA,MAAA;EA+CF,OAAA,CAAA,EAAA,OAAA;;;;ACxFD;;;;;;;iBCqDgB,sBAAA,6BAAmD;;;;ADzCnE;;;;;;iBC2DgB,oBAAA,WACJ,yBAAyB;;;;iBAQrB,qBAAA,WACJ,yBAAyB;;;;;AAxErC;;AAGA;;AAGa,iBAmFG,yBAAA,CAnFuB,IAAA,EAAA;yBAoFd;AA7EzB,CAAA,CAAA,EA8EI,sBA9EQ,GAAoB,SAC7B;;AAIH;;AAGA;;;;;;;;iBAwFgB,qBAAA;AAjEhB;;;;;;;iBA+EgB,mCAAA;;;AA7DhB,CAAA,CAAA,EAAgB,OAAA,GAAA,SAAA;;;;AAC2B;;;;AAQ3C;;AACY,iBAkFI,0BAAA,CAlFJ,OAAA,EAAA,OAAA,CAAA,EAkFkD,oBAlFlD;;AAA+B;;;;;;;;;AAiB3C;;;AAEI,iBAoFY,mBAAA,CApFZ,MAAA,EAAA,OAAA,CAAA,EAoFkD,gBApFlD;;;AAAsB"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/databricks-provider.ts","../src/tools.ts","../src/mcp.ts"],"sourcesContent":null,"mappings":";;;;;KAMY,6BAAA;;iBAEK;EAFL,GAAA,EAAA,CAAA,OAAA,EAAA;IAA6B,IAAA,EAAA,MAAA;EAAA,CAAA,EAExB,GAAA,MAAA;EAAM,KAEb,CAAA,EAAA,aAAA;AAAa,CAAA;AAGN,UAAA,kBAAA,SAA2B,UAAR,CAAA;EAAA;EAAA,SAEN,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,eAAA;EAAe,SACf,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,eAAA;EAAe;EAGM,eANP,CAAA,OAAA,EAAA,MAAA,CAAA,EAMR,eANQ;AAAU;AASrC,UAAA,0BAAA,CAA0B;EAAA;EAAA,OAI/B,EAAA,MAAA;EAAM;EAQK,OAAA,CAAA,EARX,MAQW,CAAA,MAAA,EAAA,MAAA,CAAA;EAQV;EAiDZ,QAAA,CAAA,EAAA,MAAA;EAAA;;AAAA;;UAzDS;;AC/BV;;;;;;;cDuCa,qCACD,+BACT;;;;cCzCU,uBAAA;;;;ADGb;;;;AAIuB;AAGvB;;AAE8B,cCAjB,0BDAiB,EAAA;EAAe,IACf,EAAA,MAAA;EAAe,WAGT,EAAA,MAAA;EAAe,WANP,ECQ5B,CAAA,CAAA,MDR4B;EAAU,YAAA,UAAA;AAStD,CAAA;;;;;;;;;;AAhBA;;AAEiB,cEIJ,uBAAA,GFJI,oBAAA;;AAEM,cEKV,yBAAA,GFLU,sBAAA;AAGvB;AAAoC,cEKvB,0BAAA,GFLuB,uBAAA;;AAGN,KESlB,oBAAA,GFTkB;EAAe,CEU1C,uBAAuB,CFPU,EAAA,OAAA;CAAe;AANG;AASrC,KEQL,gBAAA,GFRK,mBAA0B,GAAA,UAAA,GAAA,QAAA;;AAI/B,UEOK,sBAAA,CFPL;EAAM,IAQR,CAAA,EAAA,MAAA;EAAa,QAAA,CAAA,EAAA,MAAA;EAQV,MAAA,CAAA,EAAA,MAAA;EAiDZ,WAAA,CAAA,EAAA,MAAA;EAAA,aAhDW,CAAA,EAAA,MAAA;EAA0B,iBACnC,CAAA,EAAA,MAAA;EA+CF,OAAA,CAAA,EAAA,OAAA;;;;ACxFD;;;;;;;iBCqDgB,sBAAA,6BAAmD;;;;ADzCnE;;;;;;iBC2DgB,oBAAA,WACJ,yBAAyB;;;;iBAQrB,qBAAA,WACJ,yBAAyB;;;;;AAxErC;;AAGA;;AAGa,iBAmFG,yBAAA,CAnFuB,IAAA,EAAA;yBAoFd;AA7EzB,CAAA,CAAA,EA8EI,sBA9EQ,GAAoB,SAC7B;;AAIH;;AAGA;;;;;;;;iBAwFgB,qBAAA;AAjEhB;;;;;;;iBA+EgB,mCAAA;;;AA7DhB,CAAA,CAAA,EAAgB,OAAA,GAAA,SAAA;;;;AAC2B;;;;AAQ3C;;AACY,iBAkFI,0BAAA,CAlFJ,OAAA,EAAA,OAAA,CAAA,EAkFkD,oBAlFlD;;AAA+B;;;;;;;;;AAiB3C;;;AAEI,iBAoFY,mBAAA,CApFZ,MAAA,EAAA,OAAA,CAAA,EAoFkD,gBApFlD;;;AAAsB"}
package/dist/index.d.ts CHANGED
@@ -14,9 +14,9 @@ type DatabricksLanguageModelConfig = {
14
14
  interface DatabricksProvider extends ProviderV2 {
15
15
  /** Agents */
16
16
  chatAgent(modelId: string): LanguageModelV2;
17
- responsesAgent(modelId: string): LanguageModelV2;
18
- /** FMAPI */
19
- fmapi(modelId: string): LanguageModelV2;
17
+ responses(modelId: string): LanguageModelV2;
18
+ /** Foundation Models */
19
+ chatCompletions(modelId: string): LanguageModelV2;
20
20
  }
21
21
  interface DatabricksProviderSettings {
22
22
  /** Base URL for the Databricks API calls. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/databricks-provider.ts","../src/tools.ts","../src/mcp.ts"],"sourcesContent":null,"mappings":";;;;;KAMY,6BAAA;;iBAEK;EAFL,GAAA,EAAA,CAAA,OAAA,EAAA;IAA6B,IAAA,EAAA,MAAA;EAAA,CAAA,EAExB,GAAA,MAAA;EAAM,KAEb,CAAA,EAAA,aAAA;AAAa,CAAA;AAGN,UAAA,kBAAA,SAA2B,UAAR,CAAA;EAAA;EAAA,SAEN,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,eAAA;EAAe,cACV,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,eAAA;EAAe;EAGT,KANG,CAAA,OAAA,EAAA,MAAA,CAAA,EAMlB,eANkB;AAAU;AASrC,UAAA,0BAAA,CAA0B;EAAA;EAAA,OAI/B,EAAA,MAAA;EAAM;EAQK,OAAA,CAAA,EARX,MAQW,CAAA,MAAA,EAAA,MAAA,CAAA;EAQV;EAiDZ,QAAA,CAAA,EAAA,MAAA;EAAA;;AAAA;;UAzDS;;AC/BV;;;;;;;cDuCa,qCACD,+BACT;;;;cCzCU,uBAAA;;;;ADGb;;;;AAIuB;AAGvB;;AAE8B,cCAjB,0BDAiB,EAAA;EAAe,IACV,EAAA,MAAA;EAAe,WAGxB,EAAA,MAAA;EAAe,WANG,ECQ5B,CAAA,CAAA,MDR4B;EAAU,YAAA,UAAA;AAStD,CAAA;;;;;;;;;;AAhBA;;AAEiB,cEIJ,uBAAA,GFJI,oBAAA;;AAEM,cEKV,yBAAA,GFLU,sBAAA;AAGvB;AAAoC,cEKvB,0BAAA,GFLuB,uBAAA;;AAGD,KESvB,oBAAA,GFTuB;EAAe,CEU/C,uBAAuB,CFPA,EAAA,OAAA;CAAe;AANa;AASrC,KEQL,gBAAA,GFRK,mBAA0B,GAAA,UAAA,GAAA,QAAA;;AAI/B,UEOK,sBAAA,CFPL;EAAM,IAQR,CAAA,EAAA,MAAA;EAAa,QAAA,CAAA,EAAA,MAAA;EAQV,MAAA,CAAA,EAAA,MAAA;EAiDZ,WAAA,CAAA,EAAA,MAAA;EAAA,aAhDW,CAAA,EAAA,MAAA;EAA0B,iBACnC,CAAA,EAAA,MAAA;EA+CF,OAAA,CAAA,EAAA,OAAA;;;;ACxFD;;;;;;;iBCqDgB,sBAAA,6BAAmD;;;;ADzCnE;;;;;;iBC2DgB,oBAAA,WACJ,yBAAyB;;;;iBAQrB,qBAAA,WACJ,yBAAyB;;;;;AAxErC;;AAGA;;AAGa,iBAmFG,yBAAA,CAnFuB,IAAA,EAAA;yBAoFd;AA7EzB,CAAA,CAAA,EA8EI,sBA9EQ,GAAoB,SAC7B;;AAIH;;AAGA;;;;;;;;iBAwFgB,qBAAA;AAjEhB;;;;;;;iBA+EgB,mCAAA;;;AA7DhB,CAAA,CAAA,EAAgB,OAAA,GAAA,SAAA;;;;AAC2B;;;;AAQ3C;;AACY,iBAkFI,0BAAA,CAlFJ,OAAA,EAAA,OAAA,CAAA,EAkFkD,oBAlFlD;;AAA+B;;;;;;;;;AAiB3C;;;AAEI,iBAoFY,mBAAA,CApFZ,MAAA,EAAA,OAAA,CAAA,EAoFkD,gBApFlD;;;AAAsB"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/databricks-provider.ts","../src/tools.ts","../src/mcp.ts"],"sourcesContent":null,"mappings":";;;;;KAMY,6BAAA;;iBAEK;EAFL,GAAA,EAAA,CAAA,OAAA,EAAA;IAA6B,IAAA,EAAA,MAAA;EAAA,CAAA,EAExB,GAAA,MAAA;EAAM,KAEb,CAAA,EAAA,aAAA;AAAa,CAAA;AAGN,UAAA,kBAAA,SAA2B,UAAR,CAAA;EAAA;EAAA,SAEN,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,eAAA;EAAe,SACf,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,eAAA;EAAe;EAGM,eANP,CAAA,OAAA,EAAA,MAAA,CAAA,EAMR,eANQ;AAAU;AASrC,UAAA,0BAAA,CAA0B;EAAA;EAAA,OAI/B,EAAA,MAAA;EAAM;EAQK,OAAA,CAAA,EARX,MAQW,CAAA,MAAA,EAAA,MAAA,CAAA;EAQV;EAiDZ,QAAA,CAAA,EAAA,MAAA;EAAA;;AAAA;;UAzDS;;AC/BV;;;;;;;cDuCa,qCACD,+BACT;;;;cCzCU,uBAAA;;;;ADGb;;;;AAIuB;AAGvB;;AAE8B,cCAjB,0BDAiB,EAAA;EAAe,IACf,EAAA,MAAA;EAAe,WAGT,EAAA,MAAA;EAAe,WANP,ECQ5B,CAAA,CAAA,MDR4B;EAAU,YAAA,UAAA;AAStD,CAAA;;;;;;;;;;AAhBA;;AAEiB,cEIJ,uBAAA,GFJI,oBAAA;;AAEM,cEKV,yBAAA,GFLU,sBAAA;AAGvB;AAAoC,cEKvB,0BAAA,GFLuB,uBAAA;;AAGN,KESlB,oBAAA,GFTkB;EAAe,CEU1C,uBAAuB,CFPU,EAAA,OAAA;CAAe;AANG;AASrC,KEQL,gBAAA,GFRK,mBAA0B,GAAA,UAAA,GAAA,QAAA;;AAI/B,UEOK,sBAAA,CFPL;EAAM,IAQR,CAAA,EAAA,MAAA;EAAa,QAAA,CAAA,EAAA,MAAA;EAQV,MAAA,CAAA,EAAA,MAAA;EAiDZ,WAAA,CAAA,EAAA,MAAA;EAAA,aAhDW,CAAA,EAAA,MAAA;EAA0B,iBACnC,CAAA,EAAA,MAAA;EA+CF,OAAA,CAAA,EAAA,OAAA;;;;ACxFD;;;;;;;iBCqDgB,sBAAA,6BAAmD;;;;ADzCnE;;;;;;iBC2DgB,oBAAA,WACJ,yBAAyB;;;;iBAQrB,qBAAA,WACJ,yBAAyB;;;;;AAxErC;;AAGA;;AAGa,iBAmFG,yBAAA,CAnFuB,IAAA,EAAA;yBAoFd;AA7EzB,CAAA,CAAA,EA8EI,sBA9EQ,GAAoB,SAC7B;;AAIH;;AAGA;;;;;;;;iBAwFgB,qBAAA;AAjEhB;;;;;;;iBA+EgB,mCAAA;;;AA7DhB,CAAA,CAAA,EAAgB,OAAA,GAAA,SAAA;;;;AAC2B;;;;AAQ3C;;AACY,iBAkFI,0BAAA,CAlFJ,OAAA,EAAA,OAAA,CAAA,EAkFkD,oBAlFlD;;AAA+B;;;;;;;;;AAiB3C;;;AAEI,iBAoFY,mBAAA,CApFZ,MAAA,EAAA,OAAA,CAAA,EAoFkD,gBApFlD;;;AAAsB"}
package/dist/index.js CHANGED
@@ -122,13 +122,13 @@ const convertLanguageModelV2PromptToChatAgentResponse = (prompt) => {
122
122
  for (const msg of prompt) switch (msg.role) {
123
123
  case "system": break;
124
124
  case "user": {
125
- const converted = convertUserMessage(msg, messageIndex);
125
+ const converted = convertUserMessage$1(msg, messageIndex);
126
126
  messages.push(converted);
127
127
  messageIndex++;
128
128
  break;
129
129
  }
130
130
  case "assistant": {
131
- const converted = convertAssistantMessage(msg, messageIndex);
131
+ const converted = convertAssistantMessage$1(msg, messageIndex);
132
132
  messages.push(...converted);
133
133
  messageIndex += converted.length;
134
134
  break;
@@ -142,7 +142,7 @@ const convertLanguageModelV2PromptToChatAgentResponse = (prompt) => {
142
142
  }
143
143
  return messages;
144
144
  };
145
- const convertUserMessage = (msg, messageIndex) => {
145
+ const convertUserMessage$1 = (msg, messageIndex) => {
146
146
  const text = (msg.content ?? []).filter((part) => part.type === "text").map((part) => part.text).join("\n");
147
147
  return {
148
148
  role: "user",
@@ -150,7 +150,7 @@ const convertUserMessage = (msg, messageIndex) => {
150
150
  id: `user-${messageIndex}`
151
151
  };
152
152
  };
153
- const convertAssistantMessage = (msg, startIndex) => {
153
+ const convertAssistantMessage$1 = (msg, startIndex) => {
154
154
  const messages = [];
155
155
  let messageIndex = startIndex;
156
156
  const textContent = (msg.content ?? []).filter((part) => part.type === "text" || part.type === "reasoning").map((part) => part.type === "text" ? part.text : part.text).join("\n");
@@ -880,9 +880,12 @@ const convertResponsesAgentResponseToMessagePart = (response) => {
880
880
  parts.push({
881
881
  type: "tool-call",
882
882
  toolCallId: output.call_id,
883
- toolName: output.name,
883
+ toolName: DATABRICKS_TOOL_CALL_ID,
884
884
  input: output.arguments,
885
- providerMetadata: { databricks: { itemId: output.id } }
885
+ providerMetadata: { databricks: {
886
+ toolName: output.name,
887
+ itemId: output.id
888
+ } }
886
889
  });
887
890
  break;
888
891
  case "reasoning":
@@ -987,7 +990,7 @@ async function convertToResponsesInput({ prompt, systemMessageMode }) {
987
990
  const providerOptions = await parseProviderOptions({
988
991
  provider: "databricks",
989
992
  providerOptions: part.providerOptions,
990
- schema: ProviderOptionsSchema
993
+ schema: ProviderOptionsSchema$1
991
994
  });
992
995
  const itemId = providerOptions?.itemId ?? void 0;
993
996
  switch (part.type) {
@@ -1099,7 +1102,7 @@ async function convertToResponsesInput({ prompt, systemMessageMode }) {
1099
1102
  warnings
1100
1103
  };
1101
1104
  }
1102
- const ProviderOptionsSchema = z.object({
1105
+ const ProviderOptionsSchema$1 = z.object({
1103
1106
  itemId: z.string().nullish(),
1104
1107
  toolName: z.string().nullish(),
1105
1108
  type: z.enum(["mcp_approval_request", "mcp_approval_response"]).nullish(),
@@ -1116,6 +1119,52 @@ const convertToolResultOutputToString = (output) => {
1116
1119
  }
1117
1120
  };
1118
1121
 
1122
+ //#endregion
1123
+ //#region src/responses-agent-language-model/responses-prepare-tools.ts
1124
+ /**
1125
+ * Prepare tools for the Responses API format.
1126
+ * Unlike the chat completions API, the responses API expects function tools
1127
+ * with name, description, and parameters at the top level (not nested under 'function').
1128
+ */
1129
+ function prepareResponsesTools({ tools, toolChoice }) {
1130
+ if (!tools || tools.length === 0) return {
1131
+ tools: void 0,
1132
+ toolChoice: void 0
1133
+ };
1134
+ const responsesTools = [];
1135
+ for (const tool of tools) {
1136
+ if (tool.type === "provider-defined" || tool.name === DATABRICKS_TOOL_CALL_ID) continue;
1137
+ responsesTools.push({
1138
+ type: "function",
1139
+ name: tool.name,
1140
+ description: tool.description,
1141
+ parameters: tool.inputSchema
1142
+ });
1143
+ }
1144
+ if (responsesTools.length === 0) return {
1145
+ tools: void 0,
1146
+ toolChoice: void 0
1147
+ };
1148
+ const convertedToolChoice = convertResponsesToolChoice(toolChoice);
1149
+ return {
1150
+ tools: responsesTools,
1151
+ toolChoice: convertedToolChoice
1152
+ };
1153
+ }
1154
+ function convertResponsesToolChoice(toolChoice) {
1155
+ if (!toolChoice) return void 0;
1156
+ switch (toolChoice.type) {
1157
+ case "auto": return "auto";
1158
+ case "none": return "none";
1159
+ case "required": return "required";
1160
+ case "tool": return {
1161
+ type: "function",
1162
+ name: toolChoice.toolName
1163
+ };
1164
+ default: return void 0;
1165
+ }
1166
+ }
1167
+
1119
1168
  //#endregion
1120
1169
  //#region src/responses-agent-language-model/responses-agent-language-model.ts
1121
1170
  function mapResponsesFinishReason({ finishReason, hasToolCalls }) {
@@ -1271,13 +1320,19 @@ var DatabricksResponsesAgentLanguageModel = class {
1271
1320
  prompt: options.prompt,
1272
1321
  systemMessageMode: "system"
1273
1322
  });
1323
+ const { tools, toolChoice } = prepareResponsesTools({
1324
+ tools: options.tools,
1325
+ toolChoice: options.toolChoice
1326
+ });
1274
1327
  return {
1275
1328
  url: config.url({ path: "/responses" }),
1276
1329
  headers: combineHeaders(config.headers(), options.headers),
1277
1330
  body: {
1278
1331
  model: modelId,
1279
1332
  input,
1280
- stream
1333
+ stream,
1334
+ ...tools ? { tools } : {},
1335
+ ...toolChoice && tools ? { tool_choice: toolChoice } : {}
1281
1336
  },
1282
1337
  fetch: config.fetch
1283
1338
  };
@@ -1380,9 +1435,9 @@ const fmapiChunkSchema = z.object({
1380
1435
  created: z.number(),
1381
1436
  model: z.string(),
1382
1437
  usage: z.object({
1383
- prompt_tokens: z.number(),
1384
- completion_tokens: z.number(),
1385
- total_tokens: z.number()
1438
+ prompt_tokens: z.number().nullable().optional(),
1439
+ completion_tokens: z.number().nullable().optional(),
1440
+ total_tokens: z.number().nullable().optional()
1386
1441
  }).nullable().optional(),
1387
1442
  object: z.literal("chat.completion.chunk"),
1388
1443
  choices: z.array(z.object({
@@ -1438,68 +1493,6 @@ const fmapiResponseSchema = z.object({
1438
1493
  }))
1439
1494
  });
1440
1495
 
1441
- //#endregion
1442
- //#region src/fmapi-language-model/fmapi-tags.ts
1443
- const TAGS = {
1444
- LEGACY_CALL_OPEN: "<uc_function_call>",
1445
- LEGACY_CALL_CLOSE: "</uc_function_call>",
1446
- LEGACY_RESULT_OPEN: "<uc_function_result>",
1447
- LEGACY_RESULT_CLOSE: "</uc_function_result>",
1448
- CALL_OPEN: "<tool_call>",
1449
- CALL_CLOSE: "</tool_call>",
1450
- RESULT_OPEN: "<tool_call_result>",
1451
- RESULT_CLOSE: "</tool_call_result>"
1452
- };
1453
- const tagSplitRegex = new RegExp(`(${escapeRegex(TAGS.LEGACY_CALL_OPEN)}.*?${escapeRegex(TAGS.LEGACY_CALL_CLOSE)}|${escapeRegex(TAGS.LEGACY_RESULT_OPEN)}.*?${escapeRegex(TAGS.LEGACY_RESULT_CLOSE)}|${escapeRegex(TAGS.CALL_OPEN)}.*?${escapeRegex(TAGS.CALL_CLOSE)}|${escapeRegex(TAGS.RESULT_OPEN)}.*?${escapeRegex(TAGS.RESULT_CLOSE)})`, "g");
1454
- function parseTaggedToolCall(text) {
1455
- const inner = stripEnclosingTag(text, TAGS.LEGACY_CALL_OPEN, TAGS.LEGACY_CALL_CLOSE) ?? stripEnclosingTag(text, TAGS.CALL_OPEN, TAGS.CALL_CLOSE);
1456
- if (inner == null) return null;
1457
- try {
1458
- const parsed = JSON.parse(inner);
1459
- if (parsed && typeof parsed === "object" && "id" in parsed && "name" in parsed) return {
1460
- id: String(parsed.id),
1461
- name: String(parsed.name),
1462
- arguments: parsed.arguments
1463
- };
1464
- } catch {}
1465
- return null;
1466
- }
1467
- function parseTaggedToolResult(text) {
1468
- const inner = stripEnclosingTag(text, TAGS.LEGACY_RESULT_OPEN, TAGS.LEGACY_RESULT_CLOSE) ?? stripEnclosingTag(text, TAGS.RESULT_OPEN, TAGS.RESULT_CLOSE);
1469
- if (inner == null) return null;
1470
- try {
1471
- const parsed = JSON.parse(inner);
1472
- if (parsed && typeof parsed === "object" && "id" in parsed) return {
1473
- id: String(parsed.id),
1474
- content: parsed.content
1475
- };
1476
- } catch {}
1477
- return null;
1478
- }
1479
- function serializeToolCall(value) {
1480
- const payload = JSON.stringify({
1481
- id: value.id,
1482
- name: value.name,
1483
- arguments: value.arguments
1484
- });
1485
- return `${TAGS.CALL_OPEN}${payload}${TAGS.CALL_CLOSE}`;
1486
- }
1487
- function serializeToolResult(value) {
1488
- const payload = JSON.stringify({
1489
- id: value.id,
1490
- content: value.content
1491
- });
1492
- return `${TAGS.RESULT_OPEN}${payload}${TAGS.RESULT_CLOSE}`;
1493
- }
1494
- function stripEnclosingTag(text, open, close) {
1495
- const trimmed = text.trim();
1496
- if (trimmed.startsWith(open) && trimmed.endsWith(close)) return trimmed.slice(open.length, trimmed.length - close.length);
1497
- return null;
1498
- }
1499
- function escapeRegex(str) {
1500
- return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1501
- }
1502
-
1503
1496
  //#endregion
1504
1497
  //#region src/fmapi-language-model/fmapi-convert-to-message-parts.ts
1505
1498
  const convertFmapiChunkToMessagePart = (chunk, toolCallIdsByIndex) => {
@@ -1526,13 +1519,11 @@ const convertFmapiChunkToMessagePart = (chunk, toolCallIdsByIndex) => {
1526
1519
  }
1527
1520
  }
1528
1521
  if (typeof choice.delta.content === "string") {
1529
- const extracted = extractPartsFromTextCompletion(choice.delta.content);
1530
- for (const part of extracted) if (part.type === "text") parts.push({
1522
+ if (choice.delta.content) parts.push({
1531
1523
  type: "text-delta",
1532
1524
  id: chunk.id,
1533
- delta: part.text
1525
+ delta: choice.delta.content
1534
1526
  });
1535
- else parts.push(part);
1536
1527
  } else if (Array.isArray(choice.delta.content)) parts.push(...mapContentItemsToStreamParts(choice.delta.content, chunk.id));
1537
1528
  return parts;
1538
1529
  };
@@ -1548,56 +1539,22 @@ const convertFmapiResponseToMessagePart = (response) => {
1548
1539
  });
1549
1540
  return parts;
1550
1541
  }
1551
- if (typeof choice.message.content === "string") {
1552
- const extracted = extractToolPartsFromText(choice.message.content);
1553
- if (extracted) for (const part of extracted) parts.push(part);
1554
- else parts.push({
1555
- type: "text",
1556
- text: choice.message.content
1557
- });
1558
- } else parts.push(...mapContentItemsToProviderContent(choice.message.content ?? []));
1542
+ if (typeof choice.message.content === "string") parts.push({
1543
+ type: "text",
1544
+ text: choice.message.content
1545
+ });
1546
+ else parts.push(...mapContentItemsToProviderContent(choice.message.content ?? []));
1559
1547
  return parts;
1560
1548
  };
1561
1549
  const convertToolCallToContent = (toolCall) => {
1562
1550
  return {
1563
1551
  type: "tool-call",
1564
1552
  toolCallId: toolCall.id,
1565
- toolName: toolCall.function.name,
1566
- input: toolCall.function.arguments
1553
+ toolName: DATABRICKS_TOOL_CALL_ID,
1554
+ input: toolCall.function.arguments,
1555
+ providerMetadata: { databricks: { toolName: toolCall.function.name } }
1567
1556
  };
1568
1557
  };
1569
- const extractPartsFromTextCompletion = (text) => {
1570
- const parts = text.split(tagSplitRegex);
1571
- const accumulated = [];
1572
- for (const segment of parts.filter((p) => p !== "")) {
1573
- const toolParts = extractToolPartsFromText(segment);
1574
- if (toolParts) accumulated.push(...toolParts);
1575
- else accumulated.push({
1576
- type: "text",
1577
- text: segment
1578
- });
1579
- }
1580
- return accumulated;
1581
- };
1582
- const extractToolPartsFromText = (text) => {
1583
- const trimmed = text.trim();
1584
- const call = parseTaggedToolCall(trimmed);
1585
- if (call) return [{
1586
- type: "tool-call",
1587
- input: typeof call.arguments === "string" ? call.arguments : JSON.stringify(call.arguments),
1588
- toolName: call.name,
1589
- toolCallId: call.id,
1590
- providerExecuted: true
1591
- }];
1592
- const result = parseTaggedToolResult(trimmed);
1593
- if (result) return [{
1594
- type: "tool-result",
1595
- result: result.content,
1596
- toolCallId: result.id,
1597
- toolName: DATABRICKS_TOOL_CALL_ID
1598
- }];
1599
- return null;
1600
- };
1601
1558
  const mapContentItemsToStreamParts = (items, id) => {
1602
1559
  const parts = [];
1603
1560
  for (const item of items) switch (item.type) {
@@ -1643,43 +1600,38 @@ const mapContentItemsToProviderContent = (items) => {
1643
1600
 
1644
1601
  //#endregion
1645
1602
  //#region src/fmapi-language-model/fmapi-convert-to-input.ts
1646
- const convertPromptToFmapiMessages = (prompt) => {
1647
- const messages = prompt.map((message) => {
1648
- const role = message.role === "system" ? "user" : message.role;
1649
- let contentItems = [];
1650
- switch (message.role) {
1651
- case "system":
1652
- contentItems = convertSystemContent(message);
1653
- break;
1654
- case "user":
1655
- contentItems = convertUserContent(message);
1656
- break;
1657
- case "assistant":
1658
- contentItems = convertAssistantContent(message);
1659
- break;
1660
- case "tool":
1661
- contentItems = convertToolContent(message);
1662
- break;
1663
- }
1664
- const content = contentItems.length === 0 ? "" : contentItems;
1665
- return {
1666
- role,
1667
- content
1668
- };
1669
- });
1603
+ const convertPromptToFmapiMessages = async (prompt) => {
1604
+ const messages = [];
1605
+ for (const message of prompt) switch (message.role) {
1606
+ case "system":
1607
+ messages.push(convertSystemMessage(message));
1608
+ break;
1609
+ case "user":
1610
+ messages.push(convertUserMessage(message));
1611
+ break;
1612
+ case "assistant":
1613
+ messages.push(await convertAssistantMessage(message));
1614
+ break;
1615
+ case "tool":
1616
+ messages.push(...convertToolMessages(message));
1617
+ break;
1618
+ }
1670
1619
  return { messages };
1671
1620
  };
1672
- const convertSystemContent = (message) => {
1673
- return [{
1674
- type: "text",
1675
- text: message.content
1676
- }];
1621
+ const convertSystemMessage = (message) => {
1622
+ return {
1623
+ role: "system",
1624
+ content: [{
1625
+ type: "text",
1626
+ text: message.content
1627
+ }]
1628
+ };
1677
1629
  };
1678
- const convertUserContent = (message) => {
1679
- const items = [];
1630
+ const convertUserMessage = (message) => {
1631
+ const content = [];
1680
1632
  for (const part of message.content) switch (part.type) {
1681
1633
  case "text":
1682
- items.push({
1634
+ content.push({
1683
1635
  type: "text",
1684
1636
  text: part.text
1685
1637
  });
@@ -1687,20 +1639,24 @@ const convertUserContent = (message) => {
1687
1639
  case "file":
1688
1640
  if (part.mediaType.startsWith("image/")) {
1689
1641
  const url = toHttpUrlString(part.data);
1690
- if (url) items.push({
1642
+ if (url) content.push({
1691
1643
  type: "image",
1692
1644
  image_url: url
1693
1645
  });
1694
1646
  }
1695
1647
  break;
1696
1648
  }
1697
- return items;
1649
+ return {
1650
+ role: "user",
1651
+ content
1652
+ };
1698
1653
  };
1699
- const convertAssistantContent = (message) => {
1700
- const items = [];
1654
+ const convertAssistantMessage = async (message) => {
1655
+ const contentItems = [];
1656
+ const toolCalls = [];
1701
1657
  for (const part of message.content) switch (part.type) {
1702
1658
  case "text":
1703
- items.push({
1659
+ contentItems.push({
1704
1660
  type: "text",
1705
1661
  text: part.text
1706
1662
  });
@@ -1708,14 +1664,14 @@ const convertAssistantContent = (message) => {
1708
1664
  case "file":
1709
1665
  if (part.mediaType.startsWith("image/")) {
1710
1666
  const url = toHttpUrlString(part.data);
1711
- if (url) items.push({
1667
+ if (url) contentItems.push({
1712
1668
  type: "image",
1713
1669
  image_url: url
1714
1670
  });
1715
1671
  }
1716
1672
  break;
1717
1673
  case "reasoning":
1718
- items.push({
1674
+ contentItems.push({
1719
1675
  type: "reasoning",
1720
1676
  summary: [{
1721
1677
  type: "summary_text",
@@ -1723,38 +1679,36 @@ const convertAssistantContent = (message) => {
1723
1679
  }]
1724
1680
  });
1725
1681
  break;
1726
- case "tool-call":
1727
- items.push({
1728
- type: "text",
1729
- text: serializeToolCall({
1730
- id: part.toolCallId,
1731
- name: part.toolName,
1732
- arguments: part.input
1733
- })
1734
- });
1735
- break;
1736
- case "tool-result":
1737
- items.push({
1738
- type: "text",
1739
- text: serializeToolResult({
1740
- id: part.toolCallId,
1741
- content: convertToolResultOutputToContentValue(part.output)
1742
- })
1682
+ case "tool-call": {
1683
+ const toolName = await getToolNameFromPart(part);
1684
+ toolCalls.push({
1685
+ id: part.toolCallId,
1686
+ type: "function",
1687
+ function: {
1688
+ name: toolName,
1689
+ arguments: typeof part.input === "string" ? part.input : JSON.stringify(part.input)
1690
+ }
1743
1691
  });
1744
1692
  break;
1693
+ }
1745
1694
  }
1746
- return items;
1695
+ return {
1696
+ role: "assistant",
1697
+ content: contentItems.length === 0 ? null : contentItems,
1698
+ ...toolCalls.length > 0 ? { tool_calls: toolCalls } : {}
1699
+ };
1747
1700
  };
1748
- const convertToolContent = (message) => {
1749
- const items = [];
1750
- for (const part of message.content) if (part.type === "tool-result") items.push({
1751
- type: "text",
1752
- text: serializeToolResult({
1753
- id: part.toolCallId,
1754
- content: convertToolResultOutputToContentValue(part.output)
1755
- })
1756
- });
1757
- return items;
1701
+ const convertToolMessages = (message) => {
1702
+ const messages = [];
1703
+ for (const part of message.content) if (part.type === "tool-result") {
1704
+ const content = convertToolResultOutputToContentValue(part.output);
1705
+ messages.push({
1706
+ role: "tool",
1707
+ tool_call_id: part.toolCallId,
1708
+ content: typeof content === "string" ? content : JSON.stringify(content)
1709
+ });
1710
+ }
1711
+ return messages;
1758
1712
  };
1759
1713
  const toHttpUrlString = (data) => {
1760
1714
  if (data instanceof URL) return data.toString();
@@ -1773,6 +1727,15 @@ const convertToolResultOutputToContentValue = (output) => {
1773
1727
  default: return null;
1774
1728
  }
1775
1729
  };
1730
+ const ProviderOptionsSchema = z.object({ toolName: z.string().nullish() });
1731
+ const getToolNameFromPart = async (part) => {
1732
+ const providerOptions = await parseProviderOptions({
1733
+ provider: "databricks",
1734
+ providerOptions: part.providerOptions,
1735
+ schema: ProviderOptionsSchema
1736
+ });
1737
+ return providerOptions?.toolName ?? part.toolName;
1738
+ };
1776
1739
 
1777
1740
  //#endregion
1778
1741
  //#region src/fmapi-language-model/fmapi-language-model.ts
@@ -1789,7 +1752,7 @@ var DatabricksFmapiLanguageModel = class {
1789
1752
  }
1790
1753
  supportedUrls = {};
1791
1754
  async doGenerate(options) {
1792
- const networkArgs = this.getArgs({
1755
+ const networkArgs = await this.getArgs({
1793
1756
  config: this.config,
1794
1757
  options,
1795
1758
  stream: false,
@@ -1819,7 +1782,7 @@ var DatabricksFmapiLanguageModel = class {
1819
1782
  };
1820
1783
  }
1821
1784
  async doStream(options) {
1822
- const networkArgs = this.getArgs({
1785
+ const networkArgs = await this.getArgs({
1823
1786
  config: this.config,
1824
1787
  options,
1825
1788
  stream: true,
@@ -1869,9 +1832,9 @@ var DatabricksFmapiLanguageModel = class {
1869
1832
  if (choice?.finish_reason === "stop") finishReason = "stop";
1870
1833
  else if (choice?.finish_reason === "tool_calls") finishReason = "tool-calls";
1871
1834
  if (chunk.value.usage) usage = {
1872
- inputTokens: chunk.value.usage.prompt_tokens,
1873
- outputTokens: chunk.value.usage.completion_tokens,
1874
- totalTokens: chunk.value.usage.total_tokens
1835
+ inputTokens: chunk.value.usage.prompt_tokens ?? 0,
1836
+ outputTokens: chunk.value.usage.completion_tokens ?? 0,
1837
+ totalTokens: chunk.value.usage.total_tokens ?? 0
1875
1838
  };
1876
1839
  const parts = convertFmapiChunkToMessagePart(chunk.value, toolCallIdsByIndex);
1877
1840
  for (const part of parts) {
@@ -1896,8 +1859,9 @@ var DatabricksFmapiLanguageModel = class {
1896
1859
  controller.enqueue({
1897
1860
  type: "tool-call",
1898
1861
  toolCallId,
1899
- toolName,
1900
- input: inputText
1862
+ toolName: DATABRICKS_TOOL_CALL_ID,
1863
+ input: inputText,
1864
+ providerMetadata: { databricks: { toolName } }
1901
1865
  });
1902
1866
  }
1903
1867
  }
@@ -1912,14 +1876,15 @@ var DatabricksFmapiLanguageModel = class {
1912
1876
  response: { headers: responseHeaders }
1913
1877
  };
1914
1878
  }
1915
- getArgs({ config, options, stream, modelId }) {
1879
+ async getArgs({ config, options, stream, modelId }) {
1916
1880
  const tools = options.tools?.map((tool) => convertToolToOpenAIFormat(tool)).filter((tool) => tool !== void 0);
1917
1881
  const toolChoice = options.toolChoice ? convertToolChoiceToOpenAIFormat(options.toolChoice) : void 0;
1882
+ const { messages } = await convertPromptToFmapiMessages(options.prompt);
1918
1883
  return {
1919
1884
  url: config.url({ path: "/chat/completions" }),
1920
1885
  headers: combineHeaders(config.headers(), options.headers),
1921
1886
  body: {
1922
- messages: convertPromptToFmapiMessages(options.prompt).messages,
1887
+ messages,
1923
1888
  stream,
1924
1889
  model: modelId,
1925
1890
  ...tools && tools.length > 0 ? { tools } : {},
@@ -1995,9 +1960,9 @@ const createDatabricksProvider = (settings) => {
1995
1960
  };
1996
1961
  };
1997
1962
  return {
1963
+ responses: createResponsesAgent,
1964
+ chatCompletions: createFmapi,
1998
1965
  chatAgent: createChatAgent,
1999
- responsesAgent: createResponsesAgent,
2000
- fmapi: createFmapi,
2001
1966
  imageModel: notImplemented("ImageModel"),
2002
1967
  textEmbeddingModel: notImplemented("TextEmbeddingModel"),
2003
1968
  languageModel: notImplemented("LanguageModel")