@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/README.md +56 -15
- package/dist/index.cjs +163 -198
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +163 -198
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
18
|
-
/**
|
|
19
|
-
|
|
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. */
|
package/dist/index.d.cts.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
18
|
-
/**
|
|
19
|
-
|
|
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. */
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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:
|
|
883
|
+
toolName: DATABRICKS_TOOL_CALL_ID,
|
|
884
884
|
input: output.arguments,
|
|
885
|
-
providerMetadata: { databricks: {
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
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:
|
|
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 =
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
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
|
|
1673
|
-
return
|
|
1674
|
-
|
|
1675
|
-
|
|
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
|
|
1679
|
-
const
|
|
1630
|
+
const convertUserMessage = (message) => {
|
|
1631
|
+
const content = [];
|
|
1680
1632
|
for (const part of message.content) switch (part.type) {
|
|
1681
1633
|
case "text":
|
|
1682
|
-
|
|
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)
|
|
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
|
|
1649
|
+
return {
|
|
1650
|
+
role: "user",
|
|
1651
|
+
content
|
|
1652
|
+
};
|
|
1698
1653
|
};
|
|
1699
|
-
const
|
|
1700
|
-
const
|
|
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
|
-
|
|
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)
|
|
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
|
-
|
|
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
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
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
|
|
1695
|
+
return {
|
|
1696
|
+
role: "assistant",
|
|
1697
|
+
content: contentItems.length === 0 ? null : contentItems,
|
|
1698
|
+
...toolCalls.length > 0 ? { tool_calls: toolCalls } : {}
|
|
1699
|
+
};
|
|
1747
1700
|
};
|
|
1748
|
-
const
|
|
1749
|
-
const
|
|
1750
|
-
for (const part of message.content) if (part.type === "tool-result")
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
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
|
|
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")
|