@jerome-benoit/sap-ai-provider-v2 5.0.0 → 5.0.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/README.md +90 -48
- package/dist/chunk-77JSAAPE.js +778 -0
- package/dist/chunk-77JSAAPE.js.map +1 -0
- package/dist/{chunk-Q5JV4I6D.js → chunk-LEME2MFD.js} +59 -387
- package/dist/chunk-LEME2MFD.js.map +1 -0
- package/dist/{chunk-TXZZURBA.js → chunk-NLMWIVG7.js} +17 -7
- package/dist/chunk-NLMWIVG7.js.map +1 -0
- package/dist/chunk-QZOZ3PZT.js +634 -0
- package/dist/chunk-QZOZ3PZT.js.map +1 -0
- package/dist/{chunk-FY2HO62O.js → chunk-U6WJSLR7.js} +19 -11
- package/dist/chunk-U6WJSLR7.js.map +1 -0
- package/dist/{chunk-QDUZRLMI.js → chunk-YP3AADWD.js} +47 -40
- package/dist/chunk-YP3AADWD.js.map +1 -0
- package/dist/{foundation-models-embedding-model-strategy-JJBN3TQI.js → foundation-models-embedding-model-strategy-A3WDDAYK.js} +8 -9
- package/dist/foundation-models-embedding-model-strategy-A3WDDAYK.js.map +1 -0
- package/dist/{foundation-models-language-model-strategy-6ELKE34K.js → foundation-models-language-model-strategy-6U6KK6KH.js} +18 -21
- package/dist/foundation-models-language-model-strategy-6U6KK6KH.js.map +1 -0
- package/dist/index.cjs +1325 -31669
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +60 -55
- package/dist/index.d.ts +60 -55
- package/dist/index.js +48 -194
- package/dist/index.js.map +1 -1
- package/dist/{orchestration-embedding-model-strategy-QI72OB3E.js → orchestration-embedding-model-strategy-JO3QH5MR.js} +7 -11
- package/dist/orchestration-embedding-model-strategy-JO3QH5MR.js.map +1 -0
- package/dist/{orchestration-language-model-strategy-X4FZNLSA.js → orchestration-language-model-strategy-MBVA7BYX.js} +27 -28
- package/dist/orchestration-language-model-strategy-MBVA7BYX.js.map +1 -0
- package/package.json +15 -12
- package/dist/chunk-BIBSYTMU.js +0 -31085
- package/dist/chunk-BIBSYTMU.js.map +0 -1
- package/dist/chunk-FY2HO62O.js.map +0 -1
- package/dist/chunk-Q5JV4I6D.js.map +0 -1
- package/dist/chunk-QDUZRLMI.js.map +0 -1
- package/dist/chunk-TXZZURBA.js.map +0 -1
- package/dist/chunk-WNR7DC4V.js +0 -251
- package/dist/chunk-WNR7DC4V.js.map +0 -1
- package/dist/foundation-models-embedding-model-strategy-JJBN3TQI.js.map +0 -1
- package/dist/foundation-models-language-model-strategy-6ELKE34K.js.map +0 -1
- package/dist/orchestration-embedding-model-strategy-QI72OB3E.js.map +0 -1
- package/dist/orchestration-language-model-strategy-X4FZNLSA.js.map +0 -1
|
@@ -1,319 +1,12 @@
|
|
|
1
1
|
import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
deepMerge,
|
|
4
|
-
getProviderName,
|
|
5
4
|
normalizeHeaders,
|
|
6
|
-
sapAIEmbeddingProviderOptions,
|
|
7
5
|
validateModelParamsWithWarnings
|
|
8
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-77JSAAPE.js";
|
|
9
7
|
|
|
10
8
|
// src/strategy-utils.ts
|
|
11
|
-
import { TooManyEmbeddingValuesForCallError } from "@ai-sdk/provider";
|
|
12
|
-
import { parseProviderOptions } from "@ai-sdk/provider-utils";
|
|
13
9
|
import { z } from "zod";
|
|
14
|
-
|
|
15
|
-
// src/stream-transformer.ts
|
|
16
|
-
import { convertAsyncIteratorToReadableStream } from "@ai-sdk/provider-utils";
|
|
17
|
-
var StreamIdGenerator = class {
|
|
18
|
-
/**
|
|
19
|
-
* @returns A UUID string for identifying the response.
|
|
20
|
-
*/
|
|
21
|
-
generateResponseId() {
|
|
22
|
-
return crypto.randomUUID();
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* @returns A UUID string for identifying a text block.
|
|
26
|
-
*/
|
|
27
|
-
generateTextBlockId() {
|
|
28
|
-
return crypto.randomUUID();
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* @returns A UUID string for identifying a tool call when the API does not provide one.
|
|
32
|
-
*/
|
|
33
|
-
generateToolCallId() {
|
|
34
|
-
return crypto.randomUUID();
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
function createInitialStreamState() {
|
|
38
|
-
return {
|
|
39
|
-
activeText: false,
|
|
40
|
-
finishReason: {
|
|
41
|
-
raw: void 0,
|
|
42
|
-
unified: "other"
|
|
43
|
-
},
|
|
44
|
-
isFirstChunk: true,
|
|
45
|
-
usage: {
|
|
46
|
-
inputTokens: {
|
|
47
|
-
cacheRead: void 0,
|
|
48
|
-
cacheWrite: void 0,
|
|
49
|
-
noCache: void 0,
|
|
50
|
-
total: void 0
|
|
51
|
-
},
|
|
52
|
-
outputTokens: {
|
|
53
|
-
reasoning: void 0,
|
|
54
|
-
text: void 0,
|
|
55
|
-
total: void 0
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function createStreamTransformer(config) {
|
|
61
|
-
const {
|
|
62
|
-
convertToAISDKError,
|
|
63
|
-
idGenerator,
|
|
64
|
-
includeRawChunks,
|
|
65
|
-
modelId,
|
|
66
|
-
options,
|
|
67
|
-
providerName,
|
|
68
|
-
requestId,
|
|
69
|
-
responseId,
|
|
70
|
-
sdkStream,
|
|
71
|
-
streamResponseGetCitations,
|
|
72
|
-
streamResponseGetFinishReason,
|
|
73
|
-
streamResponseGetIntermediateFailures,
|
|
74
|
-
streamResponseGetTokenUsage,
|
|
75
|
-
url,
|
|
76
|
-
version,
|
|
77
|
-
warnings
|
|
78
|
-
} = config;
|
|
79
|
-
let textBlockId = null;
|
|
80
|
-
const streamState = createInitialStreamState();
|
|
81
|
-
const toolCallsInProgress = /* @__PURE__ */ new Map();
|
|
82
|
-
function emitToolInputStart(tc, controller) {
|
|
83
|
-
if (tc.didEmitInputStart || tc.id == null) return;
|
|
84
|
-
tc.didEmitInputStart = true;
|
|
85
|
-
controller.enqueue({
|
|
86
|
-
id: tc.id,
|
|
87
|
-
toolName: tc.toolName ?? "",
|
|
88
|
-
type: "tool-input-start"
|
|
89
|
-
});
|
|
90
|
-
if (tc.arguments.length > 0) {
|
|
91
|
-
controller.enqueue({
|
|
92
|
-
delta: tc.arguments,
|
|
93
|
-
id: tc.id,
|
|
94
|
-
type: "tool-input-delta"
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return convertAsyncIteratorToReadableStream(
|
|
99
|
-
safeIterate(sdkStream)[Symbol.asyncIterator]()
|
|
100
|
-
).pipeThrough(
|
|
101
|
-
new TransformStream({
|
|
102
|
-
flush(controller) {
|
|
103
|
-
const didEmitAnyToolCalls = finalizeToolCalls(
|
|
104
|
-
controller,
|
|
105
|
-
toolCallsInProgress,
|
|
106
|
-
idGenerator,
|
|
107
|
-
emitToolInputStart
|
|
108
|
-
);
|
|
109
|
-
if (streamState.activeText && textBlockId) {
|
|
110
|
-
controller.enqueue({ id: textBlockId, type: "text-end" });
|
|
111
|
-
}
|
|
112
|
-
const finalFinishReason = streamResponseGetFinishReason();
|
|
113
|
-
if (finalFinishReason) {
|
|
114
|
-
streamState.finishReason = mapFinishReason(finalFinishReason);
|
|
115
|
-
} else if (didEmitAnyToolCalls) {
|
|
116
|
-
streamState.finishReason = {
|
|
117
|
-
raw: void 0,
|
|
118
|
-
unified: "tool-calls"
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
const finalUsage = streamResponseGetTokenUsage();
|
|
122
|
-
if (finalUsage) {
|
|
123
|
-
streamState.usage = mapTokenUsage(finalUsage);
|
|
124
|
-
}
|
|
125
|
-
const streamCitations = streamResponseGetCitations?.();
|
|
126
|
-
if (streamCitations?.length) {
|
|
127
|
-
for (const citation of streamCitations) {
|
|
128
|
-
controller.enqueue({
|
|
129
|
-
id: String(citation.ref_id ?? citation.url),
|
|
130
|
-
sourceType: "url",
|
|
131
|
-
title: citation.title,
|
|
132
|
-
type: "source",
|
|
133
|
-
url: citation.url
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
const streamIntermediateFailures = streamResponseGetIntermediateFailures?.();
|
|
138
|
-
controller.enqueue({
|
|
139
|
-
finishReason: streamState.finishReason,
|
|
140
|
-
providerMetadata: {
|
|
141
|
-
[providerName]: {
|
|
142
|
-
...buildAnthropicCacheMetadata(finalUsage),
|
|
143
|
-
finishReason: streamState.finishReason.raw ?? "unknown",
|
|
144
|
-
finishReasonMapped: streamState.finishReason,
|
|
145
|
-
...streamIntermediateFailures?.length ? {
|
|
146
|
-
intermediateFailures: sanitizeAsJSONArray(streamIntermediateFailures)
|
|
147
|
-
} : {},
|
|
148
|
-
...requestId ? { requestId } : {},
|
|
149
|
-
responseId,
|
|
150
|
-
version
|
|
151
|
-
}
|
|
152
|
-
},
|
|
153
|
-
type: "finish",
|
|
154
|
-
usage: streamState.usage
|
|
155
|
-
});
|
|
156
|
-
},
|
|
157
|
-
start(controller) {
|
|
158
|
-
controller.enqueue({
|
|
159
|
-
type: "stream-start",
|
|
160
|
-
warnings: [...warnings]
|
|
161
|
-
});
|
|
162
|
-
},
|
|
163
|
-
transform(chunk, controller) {
|
|
164
|
-
if (chunk instanceof Error) {
|
|
165
|
-
handleStreamError(chunk, controller, convertToAISDKError, options, url);
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
if (includeRawChunks) {
|
|
169
|
-
controller.enqueue({
|
|
170
|
-
rawValue: chunk._data ?? chunk,
|
|
171
|
-
type: "raw"
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
if (streamState.isFirstChunk) {
|
|
175
|
-
streamState.isFirstChunk = false;
|
|
176
|
-
controller.enqueue({
|
|
177
|
-
id: responseId,
|
|
178
|
-
modelId,
|
|
179
|
-
timestamp: /* @__PURE__ */ new Date(),
|
|
180
|
-
type: "response-metadata"
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
const deltaToolCalls = chunk.getDeltaToolCalls();
|
|
184
|
-
if (Array.isArray(deltaToolCalls) && deltaToolCalls.length > 0) {
|
|
185
|
-
streamState.finishReason = {
|
|
186
|
-
raw: void 0,
|
|
187
|
-
unified: "tool-calls"
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
const deltaContent = chunk.getDeltaContent();
|
|
191
|
-
if (typeof deltaContent === "string" && deltaContent.length > 0 && streamState.finishReason.unified !== "tool-calls") {
|
|
192
|
-
textBlockId = handleTextDelta(
|
|
193
|
-
deltaContent,
|
|
194
|
-
controller,
|
|
195
|
-
streamState,
|
|
196
|
-
textBlockId,
|
|
197
|
-
idGenerator
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
if (Array.isArray(deltaToolCalls) && deltaToolCalls.length > 0) {
|
|
201
|
-
handleToolCallDeltas(deltaToolCalls, controller, toolCallsInProgress, emitToolInputStart);
|
|
202
|
-
}
|
|
203
|
-
const chunkFinishReason = chunk.getFinishReason();
|
|
204
|
-
if (chunkFinishReason) {
|
|
205
|
-
streamState.finishReason = mapFinishReason(chunkFinishReason);
|
|
206
|
-
if (streamState.finishReason.unified === "tool-calls") {
|
|
207
|
-
finalizeToolCalls(controller, toolCallsInProgress, idGenerator, emitToolInputStart);
|
|
208
|
-
if (streamState.activeText && textBlockId) {
|
|
209
|
-
controller.enqueue({ id: textBlockId, type: "text-end" });
|
|
210
|
-
streamState.activeText = false;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
})
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
function finalizeToolCalls(controller, toolCallsInProgress, idGenerator, emitToolInputStart) {
|
|
219
|
-
const toolCalls = Array.from(toolCallsInProgress.values());
|
|
220
|
-
let didEmitAnyToolCalls = false;
|
|
221
|
-
for (const tc of toolCalls) {
|
|
222
|
-
if (tc.didEmitCall) {
|
|
223
|
-
continue;
|
|
224
|
-
}
|
|
225
|
-
tc.id ??= idGenerator.generateToolCallId();
|
|
226
|
-
emitToolInputStart(tc, controller);
|
|
227
|
-
didEmitAnyToolCalls = true;
|
|
228
|
-
tc.didEmitCall = true;
|
|
229
|
-
controller.enqueue({ id: tc.id, type: "tool-input-end" });
|
|
230
|
-
controller.enqueue({
|
|
231
|
-
input: tc.arguments,
|
|
232
|
-
toolCallId: tc.id,
|
|
233
|
-
toolName: tc.toolName ?? "",
|
|
234
|
-
type: "tool-call"
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
return didEmitAnyToolCalls;
|
|
238
|
-
}
|
|
239
|
-
function handleStreamError(error, controller, convertToAISDKError, options, url) {
|
|
240
|
-
const aiError = convertToAISDKError(error, {
|
|
241
|
-
operation: "doStream",
|
|
242
|
-
requestBody: createAISDKRequestBodySummary(options),
|
|
243
|
-
url
|
|
244
|
-
});
|
|
245
|
-
controller.enqueue({
|
|
246
|
-
error: aiError instanceof Error ? aiError : new Error(String(aiError)),
|
|
247
|
-
type: "error"
|
|
248
|
-
});
|
|
249
|
-
controller.terminate();
|
|
250
|
-
}
|
|
251
|
-
function handleTextDelta(deltaContent, controller, streamState, currentTextBlockId, idGenerator) {
|
|
252
|
-
let textBlockId = currentTextBlockId;
|
|
253
|
-
if (!streamState.activeText) {
|
|
254
|
-
textBlockId = idGenerator.generateTextBlockId();
|
|
255
|
-
controller.enqueue({ id: textBlockId, type: "text-start" });
|
|
256
|
-
streamState.activeText = true;
|
|
257
|
-
}
|
|
258
|
-
if (textBlockId) {
|
|
259
|
-
controller.enqueue({
|
|
260
|
-
delta: deltaContent,
|
|
261
|
-
id: textBlockId,
|
|
262
|
-
type: "text-delta"
|
|
263
|
-
});
|
|
264
|
-
return textBlockId;
|
|
265
|
-
}
|
|
266
|
-
return currentTextBlockId ?? idGenerator.generateTextBlockId();
|
|
267
|
-
}
|
|
268
|
-
function handleToolCallDeltas(deltaToolCalls, controller, toolCallsInProgress, emitToolInputStart) {
|
|
269
|
-
for (const toolCallChunk of deltaToolCalls) {
|
|
270
|
-
const index = toolCallChunk.index;
|
|
271
|
-
if (typeof index !== "number" || !Number.isFinite(index)) {
|
|
272
|
-
continue;
|
|
273
|
-
}
|
|
274
|
-
if (!toolCallsInProgress.has(index)) {
|
|
275
|
-
toolCallsInProgress.set(index, {
|
|
276
|
-
arguments: "",
|
|
277
|
-
didEmitCall: false,
|
|
278
|
-
didEmitInputStart: false,
|
|
279
|
-
id: typeof toolCallChunk.id === "string" && toolCallChunk.id.length > 0 ? toolCallChunk.id : void 0,
|
|
280
|
-
toolName: toolCallChunk.function?.name
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
const tc = toolCallsInProgress.get(index);
|
|
284
|
-
if (!tc) continue;
|
|
285
|
-
if (typeof toolCallChunk.id === "string" && toolCallChunk.id.length > 0 && tc.id === void 0) {
|
|
286
|
-
tc.id = toolCallChunk.id;
|
|
287
|
-
}
|
|
288
|
-
const nextToolName = toolCallChunk.function?.name;
|
|
289
|
-
if (typeof nextToolName === "string" && nextToolName.length > 0) {
|
|
290
|
-
tc.toolName = nextToolName;
|
|
291
|
-
}
|
|
292
|
-
if (!tc.didEmitInputStart && tc.toolName != null && tc.id != null) {
|
|
293
|
-
emitToolInputStart(tc, controller);
|
|
294
|
-
}
|
|
295
|
-
const argumentsDelta = toolCallChunk.function?.arguments;
|
|
296
|
-
if (typeof argumentsDelta === "string" && argumentsDelta.length > 0) {
|
|
297
|
-
tc.arguments += argumentsDelta;
|
|
298
|
-
if (tc.didEmitInputStart && tc.id != null) {
|
|
299
|
-
controller.enqueue({
|
|
300
|
-
delta: argumentsDelta,
|
|
301
|
-
id: tc.id,
|
|
302
|
-
type: "tool-input-delta"
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
async function* safeIterate(iterable) {
|
|
309
|
-
try {
|
|
310
|
-
yield* iterable;
|
|
311
|
-
} catch (error) {
|
|
312
|
-
yield error instanceof Error ? error : new Error(String(error));
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
// src/strategy-utils.ts
|
|
317
10
|
function applyParameterOverrides(modelParams, options, sapModelParams, settingsModelParams, mappings) {
|
|
318
11
|
for (const mapping of mappings) {
|
|
319
12
|
const value = (mapping.optionKey ? options[mapping.optionKey] : void 0) ?? (mapping.camelCaseKey ? sapModelParams?.[mapping.camelCaseKey] : void 0) ?? (mapping.camelCaseKey ? settingsModelParams?.[mapping.camelCaseKey] : void 0);
|
|
@@ -359,22 +52,22 @@ function buildEmbeddingResult(config) {
|
|
|
359
52
|
};
|
|
360
53
|
}
|
|
361
54
|
function buildGenerateResult(config) {
|
|
362
|
-
const {
|
|
363
|
-
|
|
364
|
-
providerName,
|
|
365
|
-
requestBody,
|
|
366
|
-
requestId,
|
|
367
|
-
response,
|
|
368
|
-
responseHeaders,
|
|
369
|
-
version,
|
|
370
|
-
warnings
|
|
371
|
-
} = config;
|
|
372
|
-
const content = extractResponseContent(response);
|
|
55
|
+
const { providerName, requestBody, requestId, response, responseHeaders, version, warnings } = config;
|
|
56
|
+
const content = [];
|
|
373
57
|
const tokenUsage = response.getTokenUsage();
|
|
374
58
|
const finishReasonRaw = response.getFinishReason();
|
|
375
59
|
const finishReason = mapFinishReason(finishReasonRaw);
|
|
376
60
|
const textContent = response.getContent();
|
|
377
61
|
const toolCalls = response.getToolCalls();
|
|
62
|
+
if (textContent) content.push({ text: textContent, type: "text" });
|
|
63
|
+
for (const toolCall of toolCalls ?? []) {
|
|
64
|
+
content.push({
|
|
65
|
+
input: toolCall.function.arguments,
|
|
66
|
+
toolCallId: toolCall.id,
|
|
67
|
+
toolName: toolCall.function.name,
|
|
68
|
+
type: "tool-call"
|
|
69
|
+
});
|
|
70
|
+
}
|
|
378
71
|
const rawResponseBody = {
|
|
379
72
|
content: textContent,
|
|
380
73
|
finishReason: finishReasonRaw,
|
|
@@ -413,9 +106,7 @@ function buildGenerateResult(config) {
|
|
|
413
106
|
response: {
|
|
414
107
|
body: rawResponseBody,
|
|
415
108
|
headers: responseHeaders,
|
|
416
|
-
|
|
417
|
-
modelId,
|
|
418
|
-
timestamp: /* @__PURE__ */ new Date()
|
|
109
|
+
...response.responseMetadata
|
|
419
110
|
},
|
|
420
111
|
usage: mapTokenUsage(tokenUsage),
|
|
421
112
|
warnings
|
|
@@ -537,6 +228,7 @@ function convertToolsToSAPFormat(tools, options = {}) {
|
|
|
537
228
|
function: {
|
|
538
229
|
name: tool.name,
|
|
539
230
|
parameters,
|
|
231
|
+
...functionTool.strict !== void 0 ? { strict: functionTool.strict } : {},
|
|
540
232
|
...tool.description ? { description: tool.description } : {}
|
|
541
233
|
},
|
|
542
234
|
type: "function"
|
|
@@ -572,8 +264,13 @@ function createAISDKRequestBodySummary(options) {
|
|
|
572
264
|
topP: options.topP
|
|
573
265
|
};
|
|
574
266
|
}
|
|
575
|
-
function
|
|
576
|
-
let cursor
|
|
267
|
+
function extractCompletionMetadata(response, dataPath) {
|
|
268
|
+
let cursor;
|
|
269
|
+
try {
|
|
270
|
+
cursor = response.rawResponse?.data;
|
|
271
|
+
} catch {
|
|
272
|
+
}
|
|
273
|
+
cursor ??= response._data;
|
|
577
274
|
for (const key of dataPath) {
|
|
578
275
|
if (cursor !== null && typeof cursor === "object" && key in cursor) {
|
|
579
276
|
cursor = cursor[key];
|
|
@@ -582,41 +279,24 @@ function extractCompletionId(response, dataPath) {
|
|
|
582
279
|
break;
|
|
583
280
|
}
|
|
584
281
|
}
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
return typeof rid === "string" && rid.length > 0 ? rid : void 0;
|
|
595
|
-
} catch {
|
|
596
|
-
return void 0;
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
function extractResponseContent(response) {
|
|
600
|
-
const content = [];
|
|
601
|
-
const textContent = response.getContent();
|
|
602
|
-
if (textContent) {
|
|
603
|
-
content.push({
|
|
604
|
-
text: textContent,
|
|
605
|
-
type: "text"
|
|
606
|
-
});
|
|
282
|
+
const metadata = {};
|
|
283
|
+
if (cursor !== null && typeof cursor === "object") {
|
|
284
|
+
const data = cursor;
|
|
285
|
+
if (typeof data.id === "string" && data.id.length > 0) metadata.id = data.id;
|
|
286
|
+
if (typeof data.model === "string" && data.model.length > 0) metadata.modelId = data.model;
|
|
287
|
+
if (typeof data.created === "number" && Number.isFinite(data.created)) {
|
|
288
|
+
const timestamp = new Date(data.created * 1e3);
|
|
289
|
+
if (Number.isFinite(timestamp.getTime())) metadata.timestamp = timestamp;
|
|
290
|
+
}
|
|
607
291
|
}
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
toolCallId: toolCall.id,
|
|
614
|
-
toolName: toolCall.function.name,
|
|
615
|
-
type: "tool-call"
|
|
616
|
-
});
|
|
292
|
+
if (metadata.id === void 0 && typeof response.getRequestId === "function") {
|
|
293
|
+
try {
|
|
294
|
+
const id = response.getRequestId();
|
|
295
|
+
if (typeof id === "string" && id.length > 0) metadata.id = id;
|
|
296
|
+
} catch {
|
|
617
297
|
}
|
|
618
298
|
}
|
|
619
|
-
return
|
|
299
|
+
return metadata;
|
|
620
300
|
}
|
|
621
301
|
function extractResponseMetadata(response, field) {
|
|
622
302
|
let requestId;
|
|
@@ -629,6 +309,12 @@ function extractResponseMetadata(response, field) {
|
|
|
629
309
|
requestId = void 0;
|
|
630
310
|
}
|
|
631
311
|
}
|
|
312
|
+
if (requestId === void 0) {
|
|
313
|
+
const data = response?._data;
|
|
314
|
+
if (typeof data?.request_id === "string" && data.request_id.length > 0) {
|
|
315
|
+
requestId = data.request_id;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
632
318
|
let rawHeaders;
|
|
633
319
|
try {
|
|
634
320
|
const wrapper = response?.[field];
|
|
@@ -662,11 +348,8 @@ function extractToolParameters(tool) {
|
|
|
662
348
|
};
|
|
663
349
|
}
|
|
664
350
|
}
|
|
665
|
-
if (inputSchema
|
|
666
|
-
|
|
667
|
-
if (hasProperties) {
|
|
668
|
-
return { parameters: buildSAPToolParameters(inputSchema) };
|
|
669
|
-
}
|
|
351
|
+
if (inputSchema) {
|
|
352
|
+
return { parameters: buildSAPToolParameters(inputSchema) };
|
|
670
353
|
}
|
|
671
354
|
return { parameters: buildSAPToolParameters({}) };
|
|
672
355
|
}
|
|
@@ -729,7 +412,7 @@ function mapTokenUsage(tokenUsage) {
|
|
|
729
412
|
},
|
|
730
413
|
outputTokens: {
|
|
731
414
|
reasoning: reasoningTokens,
|
|
732
|
-
text:
|
|
415
|
+
text: tokenUsage?.completion_tokens == null ? void 0 : Math.max(0, tokenUsage.completion_tokens - (reasoningTokens ?? 0)),
|
|
733
416
|
total: tokenUsage?.completion_tokens
|
|
734
417
|
},
|
|
735
418
|
...hasUnmappedFields && tokenUsage ? { raw: sanitizeAsJSONObject(tokenUsage) } : {}
|
|
@@ -755,8 +438,15 @@ function mapToolChoice(toolChoice) {
|
|
|
755
438
|
return void 0;
|
|
756
439
|
}
|
|
757
440
|
}
|
|
758
|
-
function mergeRequestConfig(requestConfig, abortSignal) {
|
|
441
|
+
function mergeRequestConfig(requestConfig, abortSignal, headers) {
|
|
759
442
|
const { signal: _dropped, ...rest } = requestConfig ?? {};
|
|
443
|
+
const callHeaders = normalizeHeaders(headers);
|
|
444
|
+
if (callHeaders) {
|
|
445
|
+
const providerHeaders = Object.fromEntries(
|
|
446
|
+
Object.entries(rest.headers ?? {}).map(([key, value]) => [key.toLowerCase(), value])
|
|
447
|
+
);
|
|
448
|
+
rest.headers = { ...providerHeaders, ...callHeaders };
|
|
449
|
+
}
|
|
760
450
|
if (abortSignal) return { ...rest, signal: abortSignal };
|
|
761
451
|
return Object.keys(rest).length > 0 ? rest : void 0;
|
|
762
452
|
}
|
|
@@ -772,25 +462,6 @@ function normalizeEmbedding(embedding) {
|
|
|
772
462
|
);
|
|
773
463
|
return Array.from(float32Array);
|
|
774
464
|
}
|
|
775
|
-
async function prepareEmbeddingCall(config, options) {
|
|
776
|
-
const { maxEmbeddingsPerCall, modelId, provider } = config;
|
|
777
|
-
const { providerOptions, values } = options;
|
|
778
|
-
const providerName = getProviderName(provider);
|
|
779
|
-
const sapOptions = await parseProviderOptions({
|
|
780
|
-
provider: providerName,
|
|
781
|
-
providerOptions,
|
|
782
|
-
schema: sapAIEmbeddingProviderOptions
|
|
783
|
-
});
|
|
784
|
-
if (values.length > maxEmbeddingsPerCall) {
|
|
785
|
-
throw new TooManyEmbeddingValuesForCallError({
|
|
786
|
-
maxEmbeddingsPerCall,
|
|
787
|
-
modelId,
|
|
788
|
-
provider,
|
|
789
|
-
values
|
|
790
|
-
});
|
|
791
|
-
}
|
|
792
|
-
return { embeddingOptions: sapOptions, providerName };
|
|
793
|
-
}
|
|
794
465
|
var jsonReplacer = (_key, value) => typeof value === "bigint" ? value.toString() : value;
|
|
795
466
|
function sanitizeAsJSONArray(value) {
|
|
796
467
|
try {
|
|
@@ -808,8 +479,7 @@ function sanitizeAsJSONObject(value) {
|
|
|
808
479
|
}
|
|
809
480
|
|
|
810
481
|
export {
|
|
811
|
-
|
|
812
|
-
createStreamTransformer,
|
|
482
|
+
buildAnthropicCacheMetadata,
|
|
813
483
|
buildEmbeddingResult,
|
|
814
484
|
buildGenerateResult,
|
|
815
485
|
buildModelDeployment,
|
|
@@ -817,12 +487,14 @@ export {
|
|
|
817
487
|
convertResponseFormat,
|
|
818
488
|
convertToolsToSAPFormat,
|
|
819
489
|
createAISDKRequestBodySummary,
|
|
820
|
-
|
|
490
|
+
extractCompletionMetadata,
|
|
821
491
|
extractResponseMetadata,
|
|
822
492
|
hasKeys,
|
|
493
|
+
mapFinishReason,
|
|
494
|
+
mapTokenUsage,
|
|
823
495
|
mapToolChoice,
|
|
824
496
|
mergeRequestConfig,
|
|
825
497
|
normalizeEmbedding,
|
|
826
|
-
|
|
498
|
+
sanitizeAsJSONArray
|
|
827
499
|
};
|
|
828
|
-
//# sourceMappingURL=chunk-
|
|
500
|
+
//# sourceMappingURL=chunk-LEME2MFD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/strategy-utils.ts"],"sourcesContent":["/**\n * Shared utilities for SAP AI Core strategy implementations.\n */\nimport type {\n EmbeddingModelV3Embedding,\n EmbeddingModelV3Result,\n JSONArray,\n JSONObject,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3FunctionTool,\n LanguageModelV3GenerateResult,\n LanguageModelV3ResponseMetadata,\n LanguageModelV3Usage,\n SharedV3ProviderMetadata,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { ZodType } from \"zod\";\n\nimport { z } from \"zod\";\n\nimport type { ParsePartProviderOptions } from \"./sap-ai-provider-options.js\";\n\nimport { deepMerge } from \"./deep-merge.js\";\nimport { normalizeHeaders } from \"./sap-ai-error.js\";\nimport { validateModelParamsWithWarnings } from \"./sap-ai-provider-options.js\";\n\n/**\n * @internal\n */\nexport interface AISDKTool {\n description?: string;\n inputSchema?: unknown;\n name: string;\n type: string;\n}\n\n/**\n * @internal\n */\nexport type AISDKToolChoice =\n { toolName: string; type: \"tool\" } | { type: \"auto\" } | { type: \"none\" } | { type: \"required\" };\n\n/**\n * Anthropic prompt-cache breakdown surfaced via `providerMetadata[providerName].cacheUsage`.\n *\n * Mirrors the per-TTL ephemeral bucket shape returned by the SAP AI SDK token usage\n * payload (`prompt_tokens_details.cache_creation_token_details`).\n * @internal\n */\nexport type AnthropicCacheUsage = NonNullable<\n NonNullable<SDKTokenUsage[\"prompt_tokens_details\"]>[\"cache_creation_token_details\"]\n>;\n\n/**\n * @internal\n */\nexport interface BaseModelDeploymentConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly modelId: string;\n}\n\n/**\n * @internal\n */\nexport interface BuildModelParamsConfig {\n readonly options: LanguageModelV3CallOptions;\n readonly paramMappings: readonly ParamMapping[];\n readonly providerModelParams?: Record<string, unknown>;\n readonly settingsModelParams?: Record<string, unknown>;\n}\n\n/**\n * @internal\n */\nexport interface BuildModelParamsResult {\n readonly modelParams: Record<string, unknown>;\n readonly warnings: SharedV3Warning[];\n}\n\n/**\n * @internal\n */\nexport interface ConvertedResponseFormatResult {\n readonly responseFormat: SAPResponseFormat | undefined;\n readonly warning: SharedV3Warning | undefined;\n}\n\n/**\n * @internal\n */\nexport interface ConvertedToolsResult<T> {\n readonly tools: T[] | undefined;\n readonly warnings: SharedV3Warning[];\n}\n\n/**\n * Optional plumbing accepted by `convertToolsToSAPFormat`.\n *\n * Strategies that honour per-tool `providerOptions['sap-ai']` (e.g. orchestration\n * Anthropic `cacheControl`) supply a `parser`; Foundation Models omits it.\n * @internal\n */\nexport interface ConvertToolsOptions {\n readonly parser?: ParsePartProviderOptions;\n readonly warnings?: SharedV3Warning[];\n}\n\n/**\n * Parsed embedding provider options from AI SDK call.\n * @internal\n */\nexport interface EmbeddingProviderOptions {\n readonly modelParams?: Record<string, unknown>;\n readonly type?: EmbeddingType;\n}\n\n/**\n * @internal\n */\nexport interface EmbeddingResultConfig {\n readonly embeddings: EmbeddingModelV3Embedding[];\n readonly modelId: string;\n readonly providerName: string;\n readonly requestId?: string;\n readonly responseHeaders?: Record<string, string>;\n readonly totalTokens: number;\n readonly version: string;\n readonly warnings?: readonly SharedV3Warning[];\n}\n\n/**\n * Valid embedding types for orchestration API.\n * @internal\n */\nexport type EmbeddingType = \"document\" | \"query\" | \"text\";\n\n/**\n * @internal\n */\nexport interface ExtractedToolParameters {\n readonly parameters: SAPToolParameters;\n readonly warning?: SharedV3Warning;\n}\n\n/**\n * @internal\n */\nexport interface FunctionToolWithParameters extends LanguageModelV3FunctionTool {\n readonly parameters?: unknown;\n}\n\n/**\n * @internal\n */\nexport interface GenerateResultConfig {\n readonly providerName: string;\n readonly requestBody: unknown;\n /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n readonly requestId?: string;\n readonly response: SDKResponse;\n readonly responseHeaders: Record<string, string> | undefined;\n readonly version: string;\n readonly warnings: SharedV3Warning[];\n}\n\n/**\n * Parameter mapping for AI SDK options → SAP model params.\n * @internal\n */\nexport interface ParamMapping {\n readonly camelCaseKey?: string;\n readonly optionKey?: string;\n readonly outputKey: string;\n}\n\n/**\n * Response metadata extracted from an SDK response: server-provided request id\n * and normalised HTTP headers.\n * @internal\n */\nexport interface ResponseMetadata {\n readonly headers: Record<string, string> | undefined;\n readonly requestId: string | undefined;\n}\n\n/**\n * @internal\n */\nexport type SAPResponseFormat =\n | {\n json_schema: {\n description?: string;\n name: string;\n schema: Record<string, unknown>;\n strict: boolean | null;\n };\n type: \"json_schema\";\n }\n | { type: \"json_object\" }\n | { type: \"text\" };\n\n/**\n * @internal\n */\nexport interface SAPTool<P = SAPToolParameters> {\n cache_control?: { ttl?: \"1h\" | \"5m\"; type: \"ephemeral\" };\n function: {\n description?: string;\n name: string;\n parameters?: P;\n strict?: boolean | null;\n };\n type: \"function\";\n}\n\n/**\n * @internal\n */\nexport type SAPToolChoice =\n \"auto\" | \"none\" | \"required\" | { function: { name: string }; type: \"function\" };\n\n/**\n * @internal\n */\nexport type SAPToolParameters = Record<string, unknown> & {\n properties: Record<string, unknown>;\n required: string[];\n type: \"object\";\n};\n\n/**\n * @internal\n */\nexport interface SDKCitation {\n end_index?: number;\n ref_id?: number;\n start_index?: number;\n title: string;\n url: string;\n}\n\n/**\n * @internal\n */\nexport interface SDKDeltaToolCall {\n function?: { arguments?: string; name?: string };\n id?: string;\n index?: number;\n}\n\n/**\n * @internal\n */\nexport interface SDKResponse {\n getCitations?(): SDKCitation[] | undefined;\n getContent(): null | string | undefined;\n getFinishReason(): null | string | undefined;\n getIntermediateFailures?(): undefined | unknown[];\n getTokenUsage(): SDKTokenUsage | undefined;\n getToolCalls(): null | SDKToolCall[] | undefined;\n rawResponse: { headers: Headers | Record<string, string> };\n /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n requestId?: string;\n responseMetadata?: LanguageModelV3ResponseMetadata;\n}\n\n/**\n * @internal\n */\nexport interface SDKStreamChunk {\n _data?: unknown;\n getCitations?(): SDKCitation[] | undefined;\n getDeltaContent(): null | string | undefined;\n getDeltaToolCalls(): null | SDKDeltaToolCall[] | undefined;\n getFinishReason(): null | string | undefined;\n getTokenUsage?(): SDKTokenUsage | undefined;\n}\n\n/**\n * Token usage shape returned by SAP AI SDK responses.\n *\n * Shared by both doGenerate and doStream paths, this type captures the\n * superset of fields exposed by the Orchestration (`TokenUsage`) and\n * Foundation Models (`AzureOpenAiCompletionUsage`) SDKs.\n * @internal\n */\nexport interface SDKTokenUsage {\n completion_tokens?: number;\n completion_tokens_details?: {\n accepted_prediction_tokens?: number;\n audio_tokens?: number;\n reasoning_tokens?: number;\n rejected_prediction_tokens?: number;\n };\n prompt_tokens?: number;\n prompt_tokens_details?: {\n audio_tokens?: number;\n cache_creation_token_details?: {\n ephemeral_1h_input_tokens?: number;\n ephemeral_5m_input_tokens?: number;\n };\n cache_creation_tokens?: number;\n cached_tokens?: number;\n };\n}\n\n/**\n * @internal\n */\nexport interface SDKToolCall {\n function: { arguments: string; name: string };\n id: string;\n}\n\n/**\n * Applies parameter overrides from AI SDK options and modelParams.\n * @param modelParams - The model parameters object to modify.\n * @param options - AI SDK call options.\n * @param sapModelParams - Provider options model params.\n * @param settingsModelParams - Settings model params.\n * @param mappings - Parameter mappings for this strategy.\n * @internal\n */\nexport function applyParameterOverrides(\n modelParams: Record<string, unknown>,\n options: Record<string, unknown>,\n sapModelParams: Record<string, unknown> | undefined,\n settingsModelParams: Record<string, unknown> | undefined,\n mappings: readonly ParamMapping[],\n): void {\n for (const mapping of mappings) {\n const value =\n (mapping.optionKey ? options[mapping.optionKey] : undefined) ??\n (mapping.camelCaseKey ? sapModelParams?.[mapping.camelCaseKey] : undefined) ??\n (mapping.camelCaseKey ? settingsModelParams?.[mapping.camelCaseKey] : undefined);\n\n if (value !== undefined) {\n modelParams[mapping.outputKey] = value;\n }\n\n if (mapping.camelCaseKey && mapping.camelCaseKey !== mapping.outputKey) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete modelParams[mapping.camelCaseKey];\n }\n }\n}\n\n/**\n * Returns the Anthropic prompt-caching slice of `providerMetadata[provider]` as a\n * spread-ready fragment.\n *\n * Returns `{ cacheUsage }` when at least one ephemeral TTL bucket is populated;\n * otherwise `{}` so callers can `...` it unconditionally.\n * @param tokenUsage - Raw token usage from the SAP SDK response.\n * @returns Spread-ready provider-metadata fragment.\n * @internal\n */\nexport function buildAnthropicCacheMetadata(tokenUsage: null | SDKTokenUsage | undefined): {\n cacheUsage?: AnthropicCacheUsage;\n} {\n const details = tokenUsage?.prompt_tokens_details?.cache_creation_token_details;\n if (\n !details ||\n ((details.ephemeral_5m_input_tokens ?? 0) === 0 &&\n (details.ephemeral_1h_input_tokens ?? 0) === 0)\n ) {\n return {};\n }\n return { cacheUsage: details };\n}\n\n/**\n * Builds an EmbeddingModelV3Result from embedding data.\n * @param config - Configuration with embeddings and metadata.\n * @returns Complete embedding result for AI SDK.\n * @internal\n */\nexport function buildEmbeddingResult(config: EmbeddingResultConfig): EmbeddingModelV3Result {\n const {\n embeddings,\n modelId,\n providerName,\n requestId,\n responseHeaders,\n totalTokens,\n version,\n warnings,\n } = config;\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [providerName]: {\n model: modelId,\n ...(requestId ? { requestId } : {}),\n version,\n },\n };\n\n return {\n embeddings,\n providerMetadata,\n ...(responseHeaders ? { response: { headers: responseHeaders } } : {}),\n usage: { tokens: totalTokens },\n warnings: warnings ? [...warnings] : [],\n };\n}\n\n/**\n * Builds a LanguageModelV3GenerateResult from SDK response.\n * @param config - Configuration with response and metadata.\n * @returns Complete generate result for AI SDK.\n * @internal\n */\nexport function buildGenerateResult(config: GenerateResultConfig): LanguageModelV3GenerateResult {\n const { providerName, requestBody, requestId, response, responseHeaders, version, warnings } =\n config;\n\n const content: LanguageModelV3Content[] = [];\n\n const tokenUsage = response.getTokenUsage();\n const finishReasonRaw = response.getFinishReason();\n const finishReason = mapFinishReason(finishReasonRaw);\n\n const textContent = response.getContent();\n const toolCalls = response.getToolCalls();\n if (textContent) content.push({ text: textContent, type: \"text\" });\n for (const toolCall of toolCalls ?? []) {\n content.push({\n input: toolCall.function.arguments,\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n type: \"tool-call\",\n });\n }\n\n const rawResponseBody = {\n content: textContent,\n finishReason: finishReasonRaw,\n tokenUsage,\n toolCalls,\n };\n\n const citations = response.getCitations?.();\n if (citations?.length) {\n for (const citation of citations) {\n content.push({\n id: String(citation.ref_id ?? citation.url),\n sourceType: \"url\" as const,\n title: citation.title,\n type: \"source\" as const,\n url: citation.url,\n });\n }\n }\n\n const intermediateFailures = response.getIntermediateFailures?.();\n\n return {\n content,\n finishReason,\n providerMetadata: {\n [providerName]: {\n ...buildAnthropicCacheMetadata(tokenUsage),\n finishReason: finishReasonRaw ?? \"unknown\",\n finishReasonMapped: finishReason,\n ...(intermediateFailures?.length\n ? { intermediateFailures: sanitizeAsJSONArray(intermediateFailures) }\n : {}),\n ...(requestId ? { requestId } : {}),\n version,\n },\n },\n request: {\n body: requestBody,\n },\n response: {\n body: rawResponseBody,\n headers: responseHeaders,\n ...response.responseMetadata,\n },\n usage: mapTokenUsage(tokenUsage),\n warnings,\n };\n}\n\n/**\n * Builds a ModelDeployment object for the Foundation Models API SDK.\n * @param config - The strategy configuration containing deployment info and model ID.\n * @param modelVersion - Optional model version for model-based resolution.\n * @returns A ModelDeployment object for the Foundation Models API SDK.\n * @internal\n */\nexport function buildModelDeployment(\n config: BaseModelDeploymentConfig,\n modelVersion?: string,\n): { deploymentId: string } | { modelName: string; modelVersion?: string; resourceGroup?: string } {\n const deploymentConfig = config.deploymentConfig;\n\n if (\"deploymentId\" in deploymentConfig) {\n return { deploymentId: deploymentConfig.deploymentId };\n }\n\n const resourceGroup =\n \"resourceGroup\" in deploymentConfig ? deploymentConfig.resourceGroup : undefined;\n\n return {\n modelName: config.modelId,\n ...(modelVersion && { modelVersion }),\n ...(resourceGroup && { resourceGroup }),\n };\n}\n\n/**\n * Builds and validates model parameters from multiple sources.\n * @param config - Configuration with options, mappings, and source parameters.\n * @returns The merged model parameters and validation warnings.\n * @internal\n */\nexport function buildModelParams(config: BuildModelParamsConfig): BuildModelParamsResult {\n const { options, paramMappings, providerModelParams, settingsModelParams } = config;\n const warnings: SharedV3Warning[] = [];\n\n const modelParams: Record<string, unknown> = deepMerge(\n settingsModelParams ?? {},\n providerModelParams ?? {},\n );\n\n applyParameterOverrides(\n modelParams,\n options,\n providerModelParams,\n settingsModelParams,\n paramMappings,\n );\n\n if (options.stopSequences && options.stopSequences.length > 0) {\n modelParams.stop = options.stopSequences;\n }\n\n validateModelParamsWithWarnings(\n {\n frequencyPenalty: options.frequencyPenalty,\n maxTokens: options.maxOutputTokens,\n presencePenalty: options.presencePenalty,\n temperature: options.temperature,\n topP: options.topP,\n },\n warnings,\n );\n\n return { modelParams, warnings };\n}\n\n/**\n * Builds SAP AI SDK-compatible tool parameters from a JSON schema.\n * @param schema - The JSON schema to convert.\n * @returns The SAP-compatible tool parameters object.\n * @internal\n */\nexport function buildSAPToolParameters(schema: Record<string, unknown>): SAPToolParameters {\n const schemaType = schema.type;\n\n if (schemaType !== undefined && schemaType !== \"object\") {\n return {\n properties: {},\n required: [],\n type: \"object\",\n };\n }\n\n const properties =\n schema.properties && typeof schema.properties === \"object\"\n ? (schema.properties as Record<string, unknown>)\n : {};\n\n const required =\n Array.isArray(schema.required) && schema.required.every((item) => typeof item === \"string\")\n ? schema.required\n : [];\n\n const additionalFields = Object.fromEntries(\n Object.entries(schema).filter(\n ([key]) => key !== \"type\" && key !== \"properties\" && key !== \"required\",\n ),\n );\n\n return {\n properties,\n required,\n type: \"object\",\n ...additionalFields,\n };\n}\n\n/**\n * Computes the non-cached prompt tokens from a prompt-token total and its cache slices.\n *\n * Returns `undefined` when the total is unknown. Returns the total unchanged when no\n * cache breakdown is reported. Otherwise subtracts both cache buckets and clamps the\n * result at zero to defend against inconsistent SDK token counts where\n * `cached + cacheWrite > prompt`.\n * @param promptTokens - Total prompt tokens reported by the SDK.\n * @param cachedTokens - Tokens served from the prompt cache.\n * @param cacheWriteTokens - Tokens written to the prompt cache.\n * @returns The non-cached prompt token count, or `undefined` when unknown.\n * @internal\n */\nexport function computeNoCache(\n promptTokens: number | undefined,\n cachedTokens: number | undefined,\n cacheWriteTokens: number | undefined,\n): number | undefined {\n if (promptTokens == null) {\n return undefined;\n }\n if (cachedTokens == null && cacheWriteTokens == null) {\n return promptTokens;\n }\n return Math.max(0, promptTokens - (cachedTokens ?? 0) - (cacheWriteTokens ?? 0));\n}\n\n/**\n * Converts AI SDK response format to SAP-compatible format.\n * @param optionsResponseFormat - The AI SDK response format from call options.\n * @param settingsResponseFormat - The fallback response format from settings.\n * @returns The converted response format and any warning.\n * @internal\n */\nexport function convertResponseFormat(\n optionsResponseFormat: LanguageModelV3CallOptions[\"responseFormat\"],\n settingsResponseFormat?: unknown,\n): ConvertedResponseFormatResult {\n let responseFormat: SAPResponseFormat | undefined;\n let warning: SharedV3Warning | undefined;\n\n if (optionsResponseFormat?.type === \"json\") {\n responseFormat = optionsResponseFormat.schema\n ? {\n json_schema: {\n description: optionsResponseFormat.description,\n name: optionsResponseFormat.name ?? \"response\",\n schema: optionsResponseFormat.schema as Record<string, unknown>,\n strict: null,\n },\n type: \"json_schema\" as const,\n }\n : { type: \"json_object\" as const };\n } else if (settingsResponseFormat) {\n responseFormat = settingsResponseFormat as SAPResponseFormat;\n }\n\n if (responseFormat && responseFormat.type !== \"text\") {\n warning = {\n message:\n \"responseFormat JSON mode is forwarded to the underlying model; support and schema adherence depend on the model/deployment.\",\n type: \"other\",\n };\n }\n\n return { responseFormat, warning };\n}\n\n/**\n * Converts AI SDK tools to SAP-compatible tool format.\n * @param tools - The AI SDK tools to convert.\n * @param options - Optional per-tool parsing config.\n * @param options.parser - Reads per-tool `providerOptions['sap-ai']` and returns parsed directives, or `undefined` when none apply.\n * @param options.warnings - Sink for Zod validation issues raised while parsing.\n * @returns The converted tools and any warnings.\n * @internal\n */\nexport function convertToolsToSAPFormat<T extends SAPTool<unknown>>(\n tools: AISDKTool[] | undefined,\n options: ConvertToolsOptions = {},\n): ConvertedToolsResult<T> {\n const { parser, warnings: parserWarnings } = options;\n const warnings: SharedV3Warning[] = [];\n\n if (!tools || tools.length === 0) {\n return { tools: undefined, warnings };\n }\n\n const convertedTools = tools\n .map((tool): null | T => {\n if (tool.type === \"function\") {\n const functionTool = tool as LanguageModelV3FunctionTool;\n const { parameters, warning } = extractToolParameters(functionTool);\n if (warning) {\n warnings.push(warning);\n }\n\n const cacheControl = parser?.(functionTool.providerOptions, parserWarnings)?.cacheControl;\n\n return {\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n function: {\n name: tool.name,\n parameters,\n ...(functionTool.strict !== undefined ? { strict: functionTool.strict } : {}),\n ...(tool.description ? { description: tool.description } : {}),\n },\n type: \"function\",\n } as T;\n } else {\n warnings.push({\n details: \"Only 'function' tool type is supported.\",\n feature: `tool type for ${tool.name}`,\n type: \"unsupported\",\n });\n return null;\n }\n })\n .filter((t): t is T => t !== null);\n\n return {\n tools: convertedTools.length > 0 ? convertedTools : undefined,\n warnings,\n };\n}\n\n/**\n * Creates a summary of Vercel AI SDK request options for error context.\n * @param options - The language model call options to summarize.\n * @returns An object summarizing the request for debugging.\n * @internal\n */\nexport function createAISDKRequestBodySummary(options: LanguageModelV3CallOptions): {\n hasImageParts: boolean;\n maxOutputTokens?: number;\n promptMessages: number;\n responseFormatType?: string;\n seed?: number;\n stopSequences?: number;\n temperature?: number;\n toolChoiceType?: string;\n tools: number;\n topK?: number;\n topP?: number;\n} {\n return {\n hasImageParts: options.prompt.some(\n (message) =>\n message.role === \"user\" &&\n message.content.some((part) => part.type === \"file\" && part.mediaType.startsWith(\"image/\")),\n ),\n maxOutputTokens: options.maxOutputTokens,\n promptMessages: options.prompt.length,\n responseFormatType: options.responseFormat?.type,\n seed: options.seed,\n stopSequences: options.stopSequences?.length,\n temperature: options.temperature,\n toolChoiceType: options.toolChoice?.type,\n tools: options.tools?.length ?? 0,\n topK: options.topK,\n topP: options.topP,\n };\n}\n\n/**\n * Reads server completion metadata from the public HTTP payload or a stream chunk.\n * @param response - SAP SDK response or chunk.\n * @param response._data - Parsed payload exposed by stream chunks.\n * @param response.getRequestId - Optional SAP request-ID accessor.\n * @param response.rawResponse - Public HTTP response when available.\n * @param response.rawResponse.data - Parsed HTTP response payload.\n * @param dataPath - Path to the completion object within the payload.\n * @returns Server metadata, with the existing request-ID fallback when no completion ID is sent.\n * @internal\n */\nexport function extractCompletionMetadata(\n response: {\n _data?: unknown;\n getRequestId?: () => string | undefined;\n rawResponse?: { data?: unknown };\n },\n dataPath: readonly string[],\n): LanguageModelV3ResponseMetadata {\n let cursor: unknown;\n try {\n cursor = response.rawResponse?.data;\n } catch {\n // Chunk wrappers and older SDK stream constructors may not expose an HTTP response.\n }\n cursor ??= response._data;\n for (const key of dataPath) {\n if (cursor !== null && typeof cursor === \"object\" && key in cursor) {\n cursor = (cursor as Record<string, unknown>)[key];\n } else {\n cursor = undefined;\n break;\n }\n }\n const metadata: LanguageModelV3ResponseMetadata = {};\n if (cursor !== null && typeof cursor === \"object\") {\n const data = cursor as Record<string, unknown>;\n if (typeof data.id === \"string\" && data.id.length > 0) metadata.id = data.id;\n if (typeof data.model === \"string\" && data.model.length > 0) metadata.modelId = data.model;\n if (typeof data.created === \"number\" && Number.isFinite(data.created)) {\n const timestamp = new Date(data.created * 1000);\n if (Number.isFinite(timestamp.getTime())) metadata.timestamp = timestamp;\n }\n }\n if (metadata.id === undefined && typeof response.getRequestId === \"function\") {\n try {\n const id = response.getRequestId();\n if (typeof id === \"string\" && id.length > 0) metadata.id = id;\n } catch {\n // A request ID is optional and can be unavailable before stream consumption.\n }\n }\n return metadata;\n}\n\n/**\n * Extracts the request id and normalised headers from an SDK response.\n *\n * Resolves `requestId` from `getRequestId()`, then an orchestration chunk's\n * `_data.request_id`, then the `x-request-id` header. Tolerates absent/non-callable\n * accessors and throwing header accessors. `field` selects the underlying wrapper:\n * `response` for orchestration embeddings, `rawResponse` for other SDK responses.\n * @param response - SDK response object.\n * @param field - Property containing the underlying HttpResponse wrapper.\n * @returns Combined `{ requestId, headers }` with both fields defensively gathered.\n * @internal\n */\nexport function extractResponseMetadata(\n response: unknown,\n field: \"rawResponse\" | \"response\",\n): ResponseMetadata {\n let requestId: string | undefined;\n const fn = (response as null | { getRequestId?: unknown })?.getRequestId;\n if (typeof fn === \"function\") {\n try {\n const value = (fn as () => string | undefined).call(response);\n requestId = typeof value === \"string\" && value.length > 0 ? value : undefined;\n } catch {\n requestId = undefined;\n }\n }\n\n if (requestId === undefined) {\n const data = (response as null | { _data?: { request_id?: unknown } })?._data;\n if (typeof data?.request_id === \"string\" && data.request_id.length > 0) {\n requestId = data.request_id;\n }\n }\n\n let rawHeaders: unknown;\n try {\n const wrapper = (response as null | Record<string, unknown>)?.[field] as\n undefined | { headers?: unknown };\n rawHeaders = wrapper?.headers;\n } catch {\n rawHeaders = undefined;\n }\n const headers = rawHeaders === undefined ? undefined : normalizeHeaders(rawHeaders);\n\n if (requestId === undefined && typeof headers?.[\"x-request-id\"] === \"string\") {\n requestId = headers[\"x-request-id\"];\n }\n\n return { headers, requestId };\n}\n\n/**\n * Extracts SAP-compatible tool parameters from an AI SDK function tool.\n * @param tool - The AI SDK function tool to extract parameters from.\n * @returns The extracted parameters and optional warning.\n * @internal\n */\nexport function extractToolParameters(tool: LanguageModelV3FunctionTool): ExtractedToolParameters {\n const inputSchema = tool.inputSchema as Record<string, unknown> | undefined;\n const toolWithParams = tool as FunctionToolWithParameters;\n\n if (toolWithParams.parameters && isZodSchema(toolWithParams.parameters)) {\n try {\n const jsonSchema = z.toJSONSchema(toolWithParams.parameters);\n const schemaRecord = jsonSchema as Record<string, unknown>;\n delete schemaRecord.$schema;\n return { parameters: buildSAPToolParameters(schemaRecord) };\n } catch (error) {\n return {\n parameters: buildSAPToolParameters({}),\n warning: {\n details: `Failed to convert tool Zod schema: ${error instanceof Error ? error.message : String(error)}. Falling back to empty object schema.`,\n feature: `tool schema conversion for ${tool.name}`,\n type: \"unsupported\",\n },\n };\n }\n }\n\n if (inputSchema) {\n return { parameters: buildSAPToolParameters(inputSchema) };\n }\n\n return { parameters: buildSAPToolParameters({}) };\n}\n\n/**\n * Checks if an object has a callable parse method.\n * @param obj - The object to check for a parse method.\n * @returns True if the object has a callable parse method.\n * @internal\n */\nexport function hasCallableParse(\n obj: Record<string, unknown>,\n): obj is Record<string, unknown> & { parse: (...args: unknown[]) => unknown } {\n return typeof obj.parse === \"function\";\n}\n\n/**\n * Checks if an object has at least one own enumerable property.\n * @param obj - The object to check.\n * @returns True if the object has one or more keys.\n * @internal\n */\nexport function hasKeys(obj: object): boolean {\n return Object.keys(obj).length > 0;\n}\n\n/**\n * Type guard for Zod schema objects.\n * @param obj - The object to check.\n * @returns True if the object is a Zod schema.\n * @internal\n */\nexport function isZodSchema(obj: unknown): obj is ZodType {\n if (obj === null || typeof obj !== \"object\") {\n return false;\n }\n const record = obj as Record<string, unknown>;\n return \"_def\" in record && \"parse\" in record && hasCallableParse(record);\n}\n\n/**\n * Maps provider finish reasons to Vercel AI SDK LanguageModelV3FinishReason.\n * @param reason - The raw finish reason string from the provider.\n * @returns The unified finish reason with both raw and unified representations.\n * @internal\n */\nexport function mapFinishReason(reason: null | string | undefined): LanguageModelV3FinishReason {\n const raw = reason ?? undefined;\n\n if (!reason) {\n return { raw, unified: \"other\" };\n }\n\n switch (reason.toLowerCase()) {\n case \"content_filter\":\n case \"guardrail_intervened\":\n return { raw, unified: \"content-filter\" };\n case \"end_turn\":\n case \"eos\":\n case \"stop\":\n case \"stop_sequence\":\n return { raw, unified: \"stop\" };\n case \"error\":\n return { raw, unified: \"error\" };\n case \"function_call\":\n case \"tool_call\":\n case \"tool_calls\":\n case \"tool_use\":\n return { raw, unified: \"tool-calls\" };\n case \"length\":\n case \"max_tokens\":\n case \"max_tokens_reached\":\n return { raw, unified: \"length\" };\n default:\n return { raw, unified: \"other\" };\n }\n}\n\n/**\n * Maps SAP AI SDK token usage to Vercel AI SDK LanguageModelV3Usage.\n *\n * `usage.raw` is populated only when the SDK reports fields not represented in\n * `inputTokens` / `outputTokens` (audio or prediction-token buckets); otherwise omitted.\n * @param tokenUsage - Raw token usage from the SAP SDK response.\n * @returns Mapped usage with input/output token breakdowns.\n * @internal\n */\nexport function mapTokenUsage(tokenUsage: null | SDKTokenUsage | undefined): LanguageModelV3Usage {\n const cachedTokens = tokenUsage?.prompt_tokens_details?.cached_tokens;\n const cacheWriteTokens = tokenUsage?.prompt_tokens_details?.cache_creation_tokens;\n const reasoningTokens = tokenUsage?.completion_tokens_details?.reasoning_tokens;\n const promptTokens = tokenUsage?.prompt_tokens;\n\n const promptDetails = tokenUsage?.prompt_tokens_details;\n const completionDetails = tokenUsage?.completion_tokens_details;\n const hasUnmappedFields =\n promptDetails?.audio_tokens != null ||\n completionDetails?.audio_tokens != null ||\n completionDetails?.accepted_prediction_tokens != null ||\n completionDetails?.rejected_prediction_tokens != null;\n\n return {\n inputTokens: {\n cacheRead: cachedTokens,\n cacheWrite: cacheWriteTokens,\n noCache: computeNoCache(promptTokens, cachedTokens, cacheWriteTokens),\n total: promptTokens,\n },\n outputTokens: {\n reasoning: reasoningTokens,\n text:\n tokenUsage?.completion_tokens == null\n ? undefined\n : Math.max(0, tokenUsage.completion_tokens - (reasoningTokens ?? 0)),\n total: tokenUsage?.completion_tokens,\n },\n ...(hasUnmappedFields && tokenUsage ? { raw: sanitizeAsJSONObject(tokenUsage) } : {}),\n };\n}\n\n/**\n * Maps Vercel AI SDK toolChoice to SAP Foundation Models SDK tool_choice format.\n * @param toolChoice - The Vercel AI SDK tool choice.\n * @returns The SAP SDK tool_choice format, or undefined if no mapping needed.\n * @internal\n */\nexport function mapToolChoice(toolChoice: AISDKToolChoice | undefined): SAPToolChoice | 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 {\n function: { name: toolChoice.toolName },\n type: \"function\",\n };\n default:\n return undefined;\n }\n}\n\n/**\n * Merges provider-level `requestConfig` with per-call cancellation and HTTP headers.\n *\n * The AI SDK `abortSignal` always wins: any `signal` present on `requestConfig` is\n * dropped so callers cannot accidentally bypass the abort contract described in the\n * JSDoc of `SAPAIProviderSettings.requestConfig`. Defined per-call headers override\n * provider headers case-insensitively; undefined values leave defaults intact.\n * @param requestConfig - Provider-level custom request configuration.\n * @param abortSignal - Per-call abort signal from the AI SDK.\n * @param headers - Additional per-call HTTP headers.\n * @returns Merged configuration, or `undefined` when there is nothing to forward.\n * @internal\n */\nexport function mergeRequestConfig(\n requestConfig: CustomRequestConfig | undefined,\n abortSignal: AbortSignal | undefined,\n headers?: Record<string, string | undefined>,\n): CustomRequestConfig | undefined {\n const { signal: _dropped, ...rest } = requestConfig ?? {};\n const callHeaders = normalizeHeaders(headers);\n if (callHeaders) {\n const providerHeaders = Object.fromEntries(\n Object.entries(rest.headers ?? {}).map(([key, value]) => [key.toLowerCase(), value]),\n );\n rest.headers = { ...providerHeaders, ...callHeaders };\n }\n if (abortSignal) return { ...rest, signal: abortSignal };\n return Object.keys(rest).length > 0 ? rest : undefined;\n}\n\n/**\n * Converts SAP AI SDK embedding to Vercel AI SDK format.\n * @param embedding - The embedding as number array or base64 string.\n * @returns The normalized embedding as a number array.\n * @internal\n */\nexport function normalizeEmbedding(embedding: number[] | string): EmbeddingModelV3Embedding {\n if (Array.isArray(embedding)) {\n return embedding;\n }\n const buffer = Buffer.from(embedding, \"base64\");\n const float32Array = new Float32Array(\n buffer.buffer,\n buffer.byteOffset,\n buffer.length / Float32Array.BYTES_PER_ELEMENT,\n );\n return Array.from(float32Array);\n}\n\nconst jsonReplacer = (_key: string, value: unknown): unknown =>\n typeof value === \"bigint\" ? value.toString() : value;\n\n/**\n * Coerces an array into a JSON-conformant payload suitable for `providerMetadata` values.\n *\n * Non-serialisable entries (functions, symbols, `undefined`) are dropped or replaced\n * by `null` per `JSON.stringify` defaults. Bigint values become decimal strings.\n * Returns an empty array when the entire payload cannot be serialised (e.g. circular\n * references).\n * @param value - Candidate array.\n * @returns JSON-safe array.\n * @internal\n */\nexport function sanitizeAsJSONArray(value: readonly unknown[]): JSONArray {\n try {\n return JSON.parse(JSON.stringify(value, jsonReplacer)) as JSONArray;\n } catch {\n return [];\n }\n}\n\n/**\n * Coerces an object into a JSON-conformant payload suitable for `providerMetadata` or\n * `LanguageModelV3Usage.raw`.\n *\n * Non-serialisable values are dropped per `JSON.stringify` defaults. Bigint values\n * become decimal strings. Returns an empty object when the entire payload cannot be\n * serialised.\n * @param value - Candidate object.\n * @returns JSON-safe object.\n * @internal\n */\nexport function sanitizeAsJSONObject(value: object): JSONObject {\n try {\n return JSON.parse(JSON.stringify(value, jsonReplacer)) as JSONObject;\n } catch {\n return {};\n }\n}\n"],"mappings":"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","names":[]}
|