@jerome-benoit/sap-ai-provider-v2 4.9.0 → 5.0.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 +64 -51
- package/dist/{chunk-4PLJVJX4.js → chunk-BIBSYTMU.js} +517 -216
- package/dist/chunk-BIBSYTMU.js.map +1 -0
- package/dist/{chunk-RW6WSPU2.js → chunk-FY2HO62O.js} +3 -3
- package/dist/{chunk-33WLQYKB.js → chunk-Q5JV4I6D.js} +2 -2
- package/dist/{chunk-4JIMBRMV.js → chunk-QDUZRLMI.js} +154 -20
- package/dist/chunk-QDUZRLMI.js.map +1 -0
- package/dist/{chunk-4SQ5HC6Y.js → chunk-TXZZURBA.js} +2 -2
- package/dist/{chunk-3KCERYUB.js → chunk-WNR7DC4V.js} +5 -4
- package/dist/chunk-WNR7DC4V.js.map +1 -0
- package/dist/{foundation-models-embedding-model-strategy-RVJQSJPU.js → foundation-models-embedding-model-strategy-JJBN3TQI.js} +4 -4
- package/dist/{foundation-models-language-model-strategy-UWJ6FHBI.js → foundation-models-language-model-strategy-6ELKE34K.js} +5 -5
- package/dist/index.cjs +754 -347
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1638 -10
- package/dist/index.d.ts +1638 -10
- package/dist/index.js +13 -14
- package/dist/index.js.map +1 -1
- package/dist/{orchestration-embedding-model-strategy-OMIXGLHJ.js → orchestration-embedding-model-strategy-QI72OB3E.js} +5 -5
- package/dist/{orchestration-language-model-strategy-UE7OQO5K.js → orchestration-language-model-strategy-X4FZNLSA.js} +51 -79
- package/dist/orchestration-language-model-strategy-X4FZNLSA.js.map +1 -0
- package/package.json +30 -24
- package/dist/chunk-3KCERYUB.js.map +0 -1
- package/dist/chunk-4JIMBRMV.js.map +0 -1
- package/dist/chunk-4PLJVJX4.js.map +0 -1
- package/dist/orchestration-language-model-strategy-UE7OQO5K.js.map +0 -1
- /package/dist/{chunk-RW6WSPU2.js.map → chunk-FY2HO62O.js.map} +0 -0
- /package/dist/{chunk-33WLQYKB.js.map → chunk-Q5JV4I6D.js.map} +0 -0
- /package/dist/{chunk-4SQ5HC6Y.js.map → chunk-TXZZURBA.js.map} +0 -0
- /package/dist/{foundation-models-embedding-model-strategy-RVJQSJPU.js.map → foundation-models-embedding-model-strategy-JJBN3TQI.js.map} +0 -0
- /package/dist/{foundation-models-language-model-strategy-UWJ6FHBI.js.map → foundation-models-language-model-strategy-6ELKE34K.js.map} +0 -0
- /package/dist/{orchestration-embedding-model-strategy-OMIXGLHJ.js.map → orchestration-embedding-model-strategy-QI72OB3E.js.map} +0 -0
|
@@ -2,12 +2,12 @@ import {createRequire as __createRequire} from 'module';var require=__createRequ
|
|
|
2
2
|
import {
|
|
3
3
|
buildEmbeddingResult,
|
|
4
4
|
prepareEmbeddingCall
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-Q5JV4I6D.js";
|
|
6
6
|
import {
|
|
7
7
|
VERSION,
|
|
8
8
|
convertToAISDKError,
|
|
9
9
|
deepMerge
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-BIBSYTMU.js";
|
|
11
11
|
|
|
12
12
|
// src/base-embedding-model-strategy.ts
|
|
13
13
|
import { TooManyEmbeddingValuesForCallError } from "@ai-sdk/provider";
|
|
@@ -96,4 +96,4 @@ var BaseEmbeddingModelStrategy = class {
|
|
|
96
96
|
export {
|
|
97
97
|
BaseEmbeddingModelStrategy
|
|
98
98
|
};
|
|
99
|
-
//# sourceMappingURL=chunk-
|
|
99
|
+
//# sourceMappingURL=chunk-FY2HO62O.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
normalizeHeaders,
|
|
6
6
|
sapAIEmbeddingProviderOptions,
|
|
7
7
|
validateModelParamsWithWarnings
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-BIBSYTMU.js";
|
|
9
9
|
|
|
10
10
|
// src/strategy-utils.ts
|
|
11
11
|
import { TooManyEmbeddingValuesForCallError } from "@ai-sdk/provider";
|
|
@@ -825,4 +825,4 @@ export {
|
|
|
825
825
|
normalizeEmbedding,
|
|
826
826
|
prepareEmbeddingCall
|
|
827
827
|
};
|
|
828
|
-
//# sourceMappingURL=chunk-
|
|
828
|
+
//# sourceMappingURL=chunk-Q5JV4I6D.js.map
|
|
@@ -5,8 +5,74 @@ import {
|
|
|
5
5
|
InvalidPromptError,
|
|
6
6
|
UnsupportedFunctionalityError
|
|
7
7
|
} from "@ai-sdk/provider";
|
|
8
|
-
import { Buffer } from "buffer";
|
|
9
8
|
var ZERO_WIDTH_SPACE = "\u200B";
|
|
9
|
+
var ARRAY_BUFFER_BYTE_LENGTH_DESCRIPTOR = Object.getOwnPropertyDescriptor(
|
|
10
|
+
ArrayBuffer.prototype,
|
|
11
|
+
"byteLength"
|
|
12
|
+
);
|
|
13
|
+
var TYPED_ARRAY_LENGTH_DESCRIPTOR = Object.getOwnPropertyDescriptor(
|
|
14
|
+
Object.getPrototypeOf(Uint8Array.prototype),
|
|
15
|
+
"length"
|
|
16
|
+
);
|
|
17
|
+
var TYPED_ARRAY_TAG_DESCRIPTOR = Object.getOwnPropertyDescriptor(
|
|
18
|
+
Object.getPrototypeOf(Uint8Array.prototype),
|
|
19
|
+
Symbol.toStringTag
|
|
20
|
+
);
|
|
21
|
+
var URL_HREF_DESCRIPTOR = Object.getOwnPropertyDescriptor(URL.prototype, "href");
|
|
22
|
+
function getURLHref(value) {
|
|
23
|
+
if (typeof value !== "object" || value === null || URL_HREF_DESCRIPTOR?.get === void 0) {
|
|
24
|
+
return void 0;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const href = URL_HREF_DESCRIPTOR.get.call(value);
|
|
28
|
+
return typeof href === "string" ? href : void 0;
|
|
29
|
+
} catch {
|
|
30
|
+
return void 0;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function base64SextetValue(charCode) {
|
|
34
|
+
if (charCode >= 65 && charCode <= 90) return charCode - 65;
|
|
35
|
+
if (charCode >= 97 && charCode <= 122) return charCode - 97 + 26;
|
|
36
|
+
if (charCode >= 48 && charCode <= 57) return charCode - 48 + 52;
|
|
37
|
+
if (charCode === 43) return 62;
|
|
38
|
+
if (charCode === 47) return 63;
|
|
39
|
+
return -1;
|
|
40
|
+
}
|
|
41
|
+
function isArrayBuffer(value) {
|
|
42
|
+
if (typeof value !== "object" || value === null || ARRAY_BUFFER_BYTE_LENGTH_DESCRIPTOR?.get === void 0) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
ARRAY_BUFFER_BYTE_LENGTH_DESCRIPTOR.get.call(value);
|
|
47
|
+
return true;
|
|
48
|
+
} catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function isCanonicalBase64(value) {
|
|
53
|
+
const length = value.length;
|
|
54
|
+
if (length % 4 !== 0) return false;
|
|
55
|
+
let padding = 0;
|
|
56
|
+
if (length > 0 && value.charCodeAt(length - 1) === 61) padding++;
|
|
57
|
+
if (length > 1 && value.charCodeAt(length - 2) === 61) padding++;
|
|
58
|
+
const payloadLength = length - padding;
|
|
59
|
+
for (let index = 0; index < payloadLength; index++) {
|
|
60
|
+
if (base64SextetValue(value.charCodeAt(index)) < 0) return false;
|
|
61
|
+
}
|
|
62
|
+
if (padding === 0) return true;
|
|
63
|
+
const lastValue = base64SextetValue(value.charCodeAt(payloadLength - 1));
|
|
64
|
+
return padding === 1 ? (lastValue & 3) === 0 : (lastValue & 15) === 0;
|
|
65
|
+
}
|
|
66
|
+
function isUint8Array(value) {
|
|
67
|
+
if (typeof value !== "object" || value === null || TYPED_ARRAY_TAG_DESCRIPTOR?.get === void 0) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
return TYPED_ARRAY_TAG_DESCRIPTOR.get.call(value) === "Uint8Array";
|
|
72
|
+
} catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
10
76
|
function safeJsonStringify(value) {
|
|
11
77
|
try {
|
|
12
78
|
return JSON.stringify(
|
|
@@ -22,6 +88,39 @@ function wrapAsTextContent(text, cacheControl) {
|
|
|
22
88
|
}
|
|
23
89
|
var JINJA2_DELIMITERS_PATTERN = /\{(?=[{%#])/g;
|
|
24
90
|
var JINJA2_DELIMITERS_ESCAPED_PATTERN = new RegExp(`\\{${ZERO_WIDTH_SPACE}([{%#])`, "g");
|
|
91
|
+
function base64FromBytes(bytes) {
|
|
92
|
+
const CHUNK_SIZE = 32768;
|
|
93
|
+
let byteLength;
|
|
94
|
+
try {
|
|
95
|
+
byteLength = TYPED_ARRAY_LENGTH_DESCRIPTOR?.get?.call(bytes);
|
|
96
|
+
} catch {
|
|
97
|
+
throw new UnsupportedFunctionalityError({
|
|
98
|
+
functionality: "Invalid Uint8Array file data."
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
if (typeof byteLength !== "number") {
|
|
102
|
+
throw new UnsupportedFunctionalityError({
|
|
103
|
+
functionality: "Invalid Uint8Array file data."
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
const codeUnits = new Array(Math.min(CHUNK_SIZE, byteLength));
|
|
107
|
+
let binary = "";
|
|
108
|
+
for (let offset = 0; offset < byteLength; offset += CHUNK_SIZE) {
|
|
109
|
+
const chunkLength = Math.min(CHUNK_SIZE, byteLength - offset);
|
|
110
|
+
codeUnits.length = chunkLength;
|
|
111
|
+
for (let index = 0; index < chunkLength; index++) {
|
|
112
|
+
const byte = bytes[offset + index];
|
|
113
|
+
if (byte === void 0) {
|
|
114
|
+
throw new UnsupportedFunctionalityError({
|
|
115
|
+
functionality: "Invalid Uint8Array file data."
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
codeUnits[index] = byte;
|
|
119
|
+
}
|
|
120
|
+
binary += String.fromCharCode(...codeUnits);
|
|
121
|
+
}
|
|
122
|
+
return btoa(binary);
|
|
123
|
+
}
|
|
25
124
|
function convertToSAPMessages(prompt, options = {}) {
|
|
26
125
|
const messages = [];
|
|
27
126
|
const includeReasoning = options.includeReasoning ?? false;
|
|
@@ -29,6 +128,12 @@ function convertToSAPMessages(prompt, options = {}) {
|
|
|
29
128
|
const maybeEscape = (text) => escapeTemplatePlaceholders ? escapeOrchestrationPlaceholders(text) : text;
|
|
30
129
|
const parser = options.parsePartProviderOptions;
|
|
31
130
|
const parsePart = parser ? (providerOptions) => parser(providerOptions, options.warnings) : () => void 0;
|
|
131
|
+
const pushWarningOnce = (feature, details) => {
|
|
132
|
+
if (!options.warnings) return;
|
|
133
|
+
if (!options.warnings.some((w) => w.feature === feature)) {
|
|
134
|
+
options.warnings.push({ details, feature, type: "unsupported" });
|
|
135
|
+
}
|
|
136
|
+
};
|
|
32
137
|
for (const message of prompt) {
|
|
33
138
|
switch (message.role) {
|
|
34
139
|
case "assistant": {
|
|
@@ -38,6 +143,13 @@ function convertToSAPMessages(prompt, options = {}) {
|
|
|
38
143
|
const toolCalls = [];
|
|
39
144
|
for (const part of message.content) {
|
|
40
145
|
switch (part.type) {
|
|
146
|
+
case "file": {
|
|
147
|
+
pushWarningOnce(
|
|
148
|
+
"file content in assistant message",
|
|
149
|
+
"SAP orchestration assistant messages carry text and tool calls only; file parts are ignored."
|
|
150
|
+
);
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
41
153
|
case "reasoning": {
|
|
42
154
|
if (includeReasoning && part.text) {
|
|
43
155
|
const escaped = `<think>${maybeEscape(part.text)}</think>`;
|
|
@@ -84,6 +196,13 @@ function convertToSAPMessages(prompt, options = {}) {
|
|
|
84
196
|
});
|
|
85
197
|
break;
|
|
86
198
|
}
|
|
199
|
+
default: {
|
|
200
|
+
pushWarningOnce(
|
|
201
|
+
"unsupported assistant content",
|
|
202
|
+
"Unsupported assistant content type; part ignored."
|
|
203
|
+
);
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
87
206
|
}
|
|
88
207
|
}
|
|
89
208
|
if (text || toolCalls.length > 0) {
|
|
@@ -120,6 +239,11 @@ function convertToSAPMessages(prompt, options = {}) {
|
|
|
120
239
|
tool_call_id: part.toolCallId
|
|
121
240
|
};
|
|
122
241
|
messages.push(toolMessage);
|
|
242
|
+
} else {
|
|
243
|
+
pushWarningOnce(
|
|
244
|
+
"non-tool-result content in tool message",
|
|
245
|
+
"Only tool-result parts are forwarded to SAP; other tool content is ignored."
|
|
246
|
+
);
|
|
123
247
|
}
|
|
124
248
|
}
|
|
125
249
|
break;
|
|
@@ -140,7 +264,9 @@ function convertToSAPMessages(prompt, options = {}) {
|
|
|
140
264
|
"image/gif",
|
|
141
265
|
"image/webp"
|
|
142
266
|
];
|
|
143
|
-
|
|
267
|
+
const normalizedMediaType = part.mediaType.toLowerCase();
|
|
268
|
+
const isWildcardImageUrl = getURLHref(part.data) !== void 0 && normalizedMediaType === "image/*";
|
|
269
|
+
if (!isWildcardImageUrl && !supportedFormats.includes(normalizedMediaType)) {
|
|
144
270
|
console.warn(
|
|
145
271
|
`Image format ${part.mediaType} may not be supported by all models. Recommended formats: PNG, JPEG, GIF, WebP`
|
|
146
272
|
);
|
|
@@ -210,27 +336,35 @@ function unescapeOrchestrationPlaceholders(text) {
|
|
|
210
336
|
return text.replaceAll(JINJA2_DELIMITERS_ESCAPED_PATTERN, "{$1");
|
|
211
337
|
}
|
|
212
338
|
function buildDataUrl(part) {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
if (typeof
|
|
217
|
-
|
|
339
|
+
const { data, mediaType } = part;
|
|
340
|
+
const href = getURLHref(data);
|
|
341
|
+
if (href !== void 0) return href;
|
|
342
|
+
if (typeof data === "string") return `data:${mediaType};base64,${data}`;
|
|
343
|
+
if (isUint8Array(data)) {
|
|
344
|
+
return `data:${mediaType};base64,${base64FromBytes(data)}`;
|
|
218
345
|
}
|
|
219
|
-
if (
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
346
|
+
if (isArrayBuffer(data)) {
|
|
347
|
+
let bytes;
|
|
348
|
+
try {
|
|
349
|
+
bytes = new Uint8Array(data);
|
|
350
|
+
} catch {
|
|
351
|
+
throw new UnsupportedFunctionalityError({
|
|
352
|
+
functionality: "Detached ArrayBuffer file data is unsupported."
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
return `data:${mediaType};base64,${base64FromBytes(bytes)}`;
|
|
226
356
|
}
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
357
|
+
if (typeof data === "object" && data !== null) {
|
|
358
|
+
const toString = data.toString;
|
|
359
|
+
if (typeof toString === "function" && toString !== Object.prototype.toString) {
|
|
360
|
+
const encoded = toString.call(data, "base64");
|
|
361
|
+
if (typeof encoded === "string" && isCanonicalBase64(encoded)) {
|
|
362
|
+
return `data:${mediaType};base64,${encoded}`;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
231
365
|
}
|
|
232
366
|
throw new UnsupportedFunctionalityError({
|
|
233
|
-
functionality: "Unsupported file data type. Expected
|
|
367
|
+
functionality: "Unsupported file data type. Expected base64 string, Uint8Array, ArrayBuffer, URL, or a buffer-like object returning canonical base64."
|
|
234
368
|
});
|
|
235
369
|
}
|
|
236
370
|
|
|
@@ -239,4 +373,4 @@ export {
|
|
|
239
373
|
escapeOrchestrationPlaceholders,
|
|
240
374
|
unescapeOrchestrationPlaceholders
|
|
241
375
|
};
|
|
242
|
-
//# sourceMappingURL=chunk-
|
|
376
|
+
//# sourceMappingURL=chunk-QDUZRLMI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/convert-to-sap-messages.ts"],"sourcesContent":["import type {\n AssistantChatMessage,\n ChatMessage,\n SystemChatMessage,\n ToolChatMessage,\n UserChatMessage,\n} from \"@sap-ai-sdk/orchestration\";\n\nimport {\n InvalidPromptError,\n LanguageModelV3Prompt,\n type SharedV3Warning,\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\";\n\nimport type { CacheControl, ParsePartProviderOptions } from \"./sap-ai-provider-options.js\";\n\n/**\n * Options for converting Vercel AI SDK prompts to SAP AI SDK messages.\n * @see {@link convertToSAPMessages}\n */\nexport interface ConvertToSAPMessagesOptions {\n /**\n * Whether to escape Jinja2 template delimiters (`{{`, `{%`, `{#`) in message content.\n * This prevents SAP orchestration from interpreting user content as template syntax.\n * @default true\n */\n readonly escapeTemplatePlaceholders?: boolean;\n /**\n * Whether to include assistant reasoning parts (wrapped in `<think>` tags).\n * @default false\n */\n readonly includeReasoning?: boolean;\n /**\n * Optional callback that reads per-part `providerOptions['sap-ai']` (e.g. Anthropic\n * `cacheControl`) and forwards the result onto the SAP message item. Strategies that\n * do not honour part-level directives (Foundation Models) leave this undefined.\n * @default undefined\n */\n readonly parsePartProviderOptions?: ParsePartProviderOptions;\n /**\n * Optional sink for validation warnings raised by `parsePartProviderOptions`.\n * Each invalid `cacheControl` directive (or other future per-part option)\n * surfaces here so the strategy layer can forward the warning to the AI SDK\n * call result rather than dropping it silently.\n */\n readonly warnings?: SharedV3Warning[];\n}\n\n/**\n * @internal\n */\nconst ZERO_WIDTH_SPACE = \"\\u200B\";\n\n/** Native cross-realm ArrayBuffer brand descriptor. */\nconst ARRAY_BUFFER_BYTE_LENGTH_DESCRIPTOR = Object.getOwnPropertyDescriptor(\n ArrayBuffer.prototype,\n \"byteLength\",\n);\n\n/** Native Uint8Array length descriptor, immune to subclass overrides. */\nconst TYPED_ARRAY_LENGTH_DESCRIPTOR = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(Uint8Array.prototype) as object,\n \"length\",\n);\n\n/** Native cross-realm typed array brand descriptor. */\nconst TYPED_ARRAY_TAG_DESCRIPTOR = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(Uint8Array.prototype) as object,\n Symbol.toStringTag,\n);\n\n/** Native cross-realm URL href descriptor. */\nconst URL_HREF_DESCRIPTOR = Object.getOwnPropertyDescriptor(URL.prototype, \"href\");\n\n/**\n * Returns the canonical href for genuine URL values across JavaScript realms.\n * @param value - The value to inspect.\n * @returns The URL href, or undefined when the value lacks URL internal slots.\n */\nexport function getURLHref(value: unknown): string | undefined {\n if (typeof value !== \"object\" || value === null || URL_HREF_DESCRIPTOR?.get === undefined) {\n return undefined;\n }\n try {\n const href: unknown = URL_HREF_DESCRIPTOR.get.call(value);\n return typeof href === \"string\" ? href : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Returns the RFC 4648 value of a base64 character.\n * @param charCode - The character's UTF-16 code unit.\n * @returns The base64 sextet value, or -1 when invalid.\n */\nfunction base64SextetValue(charCode: number): number {\n if (charCode >= 0x41 && charCode <= 0x5a) return charCode - 0x41;\n if (charCode >= 0x61 && charCode <= 0x7a) return charCode - 0x61 + 26;\n if (charCode >= 0x30 && charCode <= 0x39) return charCode - 0x30 + 52;\n if (charCode === 0x2b) return 62;\n if (charCode === 0x2f) return 63;\n return -1;\n}\n\n/**\n * Detects genuine ArrayBuffer values across JavaScript realms.\n * @param value - The value to inspect.\n * @returns Whether the value has ArrayBuffer internal slots.\n */\nfunction isArrayBuffer(value: unknown): value is ArrayBuffer {\n if (\n typeof value !== \"object\" ||\n value === null ||\n ARRAY_BUFFER_BYTE_LENGTH_DESCRIPTOR?.get === undefined\n ) {\n return false;\n }\n try {\n ARRAY_BUFFER_BYTE_LENGTH_DESCRIPTOR.get.call(value);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validates canonical RFC 4648 base64 in linear time and constant stack space.\n * @param value - The candidate base64 value.\n * @returns Whether the value is canonical RFC 4648 base64.\n */\nfunction isCanonicalBase64(value: string): boolean {\n const length = value.length;\n if (length % 4 !== 0) return false;\n\n let padding = 0;\n if (length > 0 && value.charCodeAt(length - 1) === 0x3d) padding++;\n if (length > 1 && value.charCodeAt(length - 2) === 0x3d) padding++;\n\n const payloadLength = length - padding;\n for (let index = 0; index < payloadLength; index++) {\n if (base64SextetValue(value.charCodeAt(index)) < 0) return false;\n }\n\n if (padding === 0) return true;\n const lastValue = base64SextetValue(value.charCodeAt(payloadLength - 1));\n return padding === 1 ? (lastValue & 0x03) === 0 : (lastValue & 0x0f) === 0;\n}\n\n/**\n * Detects genuine Uint8Array values across JavaScript realms.\n * @param value - The value to inspect.\n * @returns Whether the value has Uint8Array internal slots.\n */\nfunction isUint8Array(value: unknown): value is Uint8Array {\n if (\n typeof value !== \"object\" ||\n value === null ||\n TYPED_ARRAY_TAG_DESCRIPTOR?.get === undefined\n ) {\n return false;\n }\n try {\n return TYPED_ARRAY_TAG_DESCRIPTOR.get.call(value) === \"Uint8Array\";\n } catch {\n return false;\n }\n}\n\n/**\n * Safely serializes a value to JSON string, handling edge cases that would cause JSON.stringify to throw.\n *\n * Handles:\n * - Circular references (objects that reference themselves)\n * - BigInt values (converted to string representation)\n * - Undefined values and symbols (handled by JSON.stringify's default behavior)\n * @param value - The value to serialize.\n * @returns JSON string representation, or a fallback string representation if serialization fails.\n * @internal\n */\nfunction safeJsonStringify(value: unknown): string {\n try {\n return JSON.stringify(value, (_key, val) =>\n typeof val === \"bigint\" ? val.toString() : (val as unknown),\n );\n } catch {\n return String(value);\n }\n}\n\n/**\n * Wraps a text payload as a SAP `TextContent` block, attaching `cache_control` when set.\n * @param text - Pre-escaped text payload.\n * @param cacheControl - Optional Anthropic prompt-cache directive.\n * @returns SAP `TextContent` block.\n */\nfunction wrapAsTextContent(\n text: string,\n cacheControl: CacheControl | undefined,\n): { cache_control?: CacheControl; text: string; type: \"text\" } {\n return cacheControl\n ? { cache_control: cacheControl, text, type: \"text\" }\n : { text, type: \"text\" };\n}\n\n/**\n * @internal\n */\nconst JINJA2_DELIMITERS_PATTERN = /\\{(?=[{%#])/g;\n\n/**\n * @internal\n */\nconst JINJA2_DELIMITERS_ESCAPED_PATTERN = new RegExp(`\\\\{${ZERO_WIDTH_SPACE}([{%#])`, \"g\");\n\n/**\n * @internal\n */\ninterface UserContentItem {\n readonly cache_control?: { ttl?: \"1h\" | \"5m\"; type: \"ephemeral\" };\n readonly file?: {\n readonly file_data: string;\n readonly filename?: string;\n };\n readonly image_url?: {\n readonly url: string;\n };\n readonly text?: string;\n readonly type: \"file\" | \"image_url\" | \"text\";\n}\n\n/**\n * Encodes bytes as base64 without the Node.js `Buffer` global (Edge-safe).\n * @internal\n * @param bytes - The bytes to encode.\n * @returns The base64 string (empty string for empty input).\n */\nexport function base64FromBytes(bytes: Uint8Array): string {\n const CHUNK_SIZE = 0x8000;\n let byteLength: unknown;\n try {\n byteLength = TYPED_ARRAY_LENGTH_DESCRIPTOR?.get?.call(bytes);\n } catch {\n throw new UnsupportedFunctionalityError({\n functionality: \"Invalid Uint8Array file data.\",\n });\n }\n if (typeof byteLength !== \"number\") {\n throw new UnsupportedFunctionalityError({\n functionality: \"Invalid Uint8Array file data.\",\n });\n }\n\n const codeUnits = new Array<number>(Math.min(CHUNK_SIZE, byteLength));\n let binary = \"\";\n for (let offset = 0; offset < byteLength; offset += CHUNK_SIZE) {\n const chunkLength = Math.min(CHUNK_SIZE, byteLength - offset);\n codeUnits.length = chunkLength;\n for (let index = 0; index < chunkLength; index++) {\n const byte = bytes[offset + index];\n if (byte === undefined) {\n throw new UnsupportedFunctionalityError({\n functionality: \"Invalid Uint8Array file data.\",\n });\n }\n codeUnits[index] = byte;\n }\n binary += String.fromCharCode(...codeUnits);\n }\n return btoa(binary);\n}\n\n/**\n * Converts Vercel AI SDK prompt to SAP AI SDK ChatMessage array.\n *\n * Handles all Vercel AI SDK message types:\n * - `system` → `SystemChatMessage`\n * - `user` (text/images) → `UserChatMessage`\n * - `assistant` (text/tool-calls) → `AssistantChatMessage`\n * - `tool` (tool results) → `ToolChatMessage`\n * @param prompt - The Vercel AI SDK LanguageModelV3Prompt to convert.\n * @param options - Conversion options.\n * @param options.escapeTemplatePlaceholders - Whether to escape Jinja2 template delimiters (default: true).\n * @param options.includeReasoning - Whether to include assistant reasoning parts (default: false).\n * @param options.parsePartProviderOptions - Optional callback to read per-part `providerOptions['sap-ai']`. Strategies opt in to honour part-level directives such as Anthropic `cacheControl`.\n * @param options.warnings - Optional sink the parser pushes Zod validation issues into.\n * @returns SAP AI SDK ChatMessage array ready for orchestration requests.\n * @throws {UnsupportedFunctionalityError} When encountering unsupported content types or file formats.\n * @throws {InvalidPromptError} When encountering unsupported message roles.\n */\nexport function convertToSAPMessages(\n prompt: LanguageModelV3Prompt,\n options: ConvertToSAPMessagesOptions = {},\n): ChatMessage[] {\n const messages: ChatMessage[] = [];\n const includeReasoning = options.includeReasoning ?? false;\n const escapeTemplatePlaceholders = options.escapeTemplatePlaceholders ?? true;\n\n const maybeEscape = (text: string): string =>\n escapeTemplatePlaceholders ? escapeOrchestrationPlaceholders(text) : text;\n\n const parser = options.parsePartProviderOptions;\n const parsePart = parser\n ? (providerOptions: unknown) => parser(providerOptions, options.warnings)\n : () => undefined;\n\n const pushWarningOnce = (feature: string, details: string): void => {\n if (!options.warnings) return;\n if (!options.warnings.some((w) => (w as { feature?: string }).feature === feature)) {\n options.warnings.push({ details, feature, type: \"unsupported\" });\n }\n };\n\n for (const message of prompt) {\n switch (message.role) {\n case \"assistant\": {\n let text = \"\";\n const textParts: {\n cacheControl?: { ttl?: \"1h\" | \"5m\"; type: \"ephemeral\" };\n text: string;\n }[] = [];\n let anyCacheControl = false;\n const toolCalls: {\n function: { arguments: string; name: string };\n id: string;\n type: \"function\";\n }[] = [];\n\n for (const part of message.content) {\n switch (part.type) {\n case \"file\": {\n pushWarningOnce(\n \"file content in assistant message\",\n \"SAP orchestration assistant messages carry text and tool calls only; file parts are ignored.\",\n );\n break;\n }\n case \"reasoning\": {\n if (includeReasoning && part.text) {\n const escaped = `<think>${maybeEscape(part.text)}</think>`;\n text += escaped;\n textParts.push({ text: escaped });\n }\n break;\n }\n case \"text\": {\n const escaped = maybeEscape(part.text);\n if (!escaped) break;\n const partOpts = parsePart(part.providerOptions);\n const cacheControl = partOpts?.cacheControl;\n text += escaped;\n textParts.push(cacheControl ? { cacheControl, text: escaped } : { text: escaped });\n if (cacheControl) anyCacheControl = true;\n break;\n }\n case \"tool-call\": {\n const partOpts = parsePart(part.providerOptions);\n if (partOpts?.cacheControl && options.warnings) {\n const feature = \"cacheControl on assistant tool-call\";\n if (\n !options.warnings.some((w) => (w as { feature?: string }).feature === feature)\n ) {\n options.warnings.push({\n details:\n \"SAP orchestration does not expose cache_control on the assistant tool-call envelope.\",\n feature,\n type: \"unsupported\",\n });\n }\n }\n // Normalize tool call input to JSON string (Vercel AI SDK provides strings or objects)\n let argumentsJson: string;\n if (typeof part.input === \"string\") {\n argumentsJson = part.input;\n } else {\n argumentsJson = JSON.stringify(part.input);\n }\n\n // Escape tool call arguments if needed (they may contain placeholder syntax)\n toolCalls.push({\n function: {\n arguments: maybeEscape(argumentsJson),\n name: part.toolName,\n },\n id: part.toolCallId,\n type: \"function\",\n });\n break;\n }\n default: {\n pushWarningOnce(\n \"unsupported assistant content\",\n \"Unsupported assistant content type; part ignored.\",\n );\n break;\n }\n }\n }\n\n if (text || toolCalls.length > 0) {\n const assistantMessage: AssistantChatMessage = {\n content: anyCacheControl\n ? textParts.map((p) => wrapAsTextContent(p.text, p.cacheControl))\n : text,\n role: \"assistant\",\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n messages.push(assistantMessage);\n }\n break;\n }\n\n case \"system\": {\n const partOpts = parsePart(message.providerOptions);\n const cacheControl = partOpts?.cacheControl;\n const text = maybeEscape(message.content);\n const systemMessage: SystemChatMessage = {\n content: cacheControl ? [wrapAsTextContent(text, cacheControl)] : text,\n role: \"system\",\n };\n messages.push(systemMessage);\n break;\n }\n\n case \"tool\": {\n for (const part of message.content) {\n if (part.type === \"tool-result\") {\n const partOpts = parsePart(part.providerOptions);\n const cacheControl = partOpts?.cacheControl;\n const serializedOutput = safeJsonStringify(part.output);\n const escaped = maybeEscape(serializedOutput);\n const toolMessage: ToolChatMessage = {\n content: cacheControl ? [wrapAsTextContent(escaped, cacheControl)] : escaped,\n role: \"tool\",\n tool_call_id: part.toolCallId,\n };\n messages.push(toolMessage);\n } else {\n pushWarningOnce(\n \"non-tool-result content in tool message\",\n \"Only tool-result parts are forwarded to SAP; other tool content is ignored.\",\n );\n }\n }\n break;\n }\n\n case \"user\": {\n const contentParts: UserContentItem[] = [];\n\n for (const part of message.content) {\n const partOpts = parsePart(part.providerOptions);\n const cacheControl = partOpts?.cacheControl;\n switch (part.type) {\n case \"file\": {\n const fileDataUrl = buildDataUrl(part);\n\n if (part.mediaType.startsWith(\"image/\")) {\n const supportedFormats = [\n \"image/png\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/gif\",\n \"image/webp\",\n ];\n const normalizedMediaType = part.mediaType.toLowerCase();\n const isWildcardImageUrl =\n getURLHref(part.data) !== undefined && normalizedMediaType === \"image/*\";\n if (!isWildcardImageUrl && !supportedFormats.includes(normalizedMediaType)) {\n console.warn(\n `Image format ${part.mediaType} may not be supported by all models. ` +\n `Recommended formats: PNG, JPEG, GIF, WebP`,\n );\n }\n\n contentParts.push({\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n image_url: {\n url: fileDataUrl,\n },\n type: \"image_url\",\n });\n } else {\n contentParts.push({\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n file: {\n file_data: fileDataUrl,\n ...(part.filename ? { filename: part.filename } : {}),\n },\n type: \"file\",\n });\n }\n break;\n }\n case \"text\": {\n contentParts.push({\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n text: maybeEscape(part.text),\n type: \"text\",\n });\n break;\n }\n default: {\n throw new UnsupportedFunctionalityError({\n functionality: `Content type ${(part as { type: string }).type}`,\n });\n }\n }\n }\n\n const firstPart = contentParts[0];\n const userMessage: UserChatMessage =\n contentParts.length === 1 &&\n firstPart?.type === \"text\" &&\n firstPart.cache_control === undefined\n ? {\n content: firstPart.text ?? \"\",\n role: \"user\",\n }\n : {\n content: contentParts,\n role: \"user\",\n };\n\n messages.push(userMessage);\n break;\n }\n\n default: {\n const _exhaustiveCheck: never = message;\n throw new InvalidPromptError({\n message: `Unsupported role: ${(_exhaustiveCheck as { role: string }).role}`,\n prompt: JSON.stringify(message),\n });\n }\n }\n }\n\n return messages;\n}\n\n/**\n * Escapes Jinja2 template delimiters by inserting zero-width spaces.\n *\n * Converts `{{`, `{%`, `{#` to `{\\u200B{`, `{\\u200B%`, `{\\u200B#` respectively.\n * This prevents SAP orchestration from interpreting user content as template syntax.\n * @param text - The text to escape.\n * @returns The escaped text with zero-width spaces inserted.\n * @see {@link unescapeOrchestrationPlaceholders} for the reverse operation.\n */\nexport function escapeOrchestrationPlaceholders(text: string): string {\n if (!text) return text;\n return text.replaceAll(JINJA2_DELIMITERS_PATTERN, `{${ZERO_WIDTH_SPACE}`);\n}\n\n/**\n * Reverses escaping by removing zero-width spaces from template delimiters.\n * Useful for processing model responses that may contain escaped delimiters.\n * @param text - The text to unescape.\n * @returns The unescaped text with zero-width spaces removed.\n * @see {@link escapeOrchestrationPlaceholders} for the escaping operation.\n */\nexport function unescapeOrchestrationPlaceholders(text: string): string {\n if (!text) return text;\n return text.replaceAll(JINJA2_DELIMITERS_ESCAPED_PATTERN, \"{$1\");\n}\n\n/**\n * Builds a data URL from a file part's data and media type.\n *\n * Supports URL, base64 string, Uint8Array, ArrayBuffer, and buffer-like objects\n * whose custom `toString(\"base64\")` method returns canonical base64. Other\n * objects are rejected instead of being stringified into an invalid payload.\n * @internal\n * @param part - The file part containing data and mediaType.\n * @param part.data - The file data.\n * @param part.mediaType - The MIME type of the file.\n * @returns The data URL string.\n * @throws {UnsupportedFunctionalityError} If the data type is not supported.\n */\nfunction buildDataUrl(part: { data: unknown; mediaType: string }): string {\n const { data, mediaType } = part;\n const href = getURLHref(data);\n if (href !== undefined) return href;\n\n if (typeof data === \"string\") return `data:${mediaType};base64,${data}`;\n\n if (isUint8Array(data)) {\n return `data:${mediaType};base64,${base64FromBytes(data)}`;\n }\n\n if (isArrayBuffer(data)) {\n let bytes: Uint8Array;\n try {\n bytes = new Uint8Array(data);\n } catch {\n throw new UnsupportedFunctionalityError({\n functionality: \"Detached ArrayBuffer file data is unsupported.\",\n });\n }\n return `data:${mediaType};base64,${base64FromBytes(bytes)}`;\n }\n\n if (typeof data === \"object\" && data !== null) {\n const toString = (data as { toString?: unknown }).toString;\n if (typeof toString === \"function\" && toString !== Object.prototype.toString) {\n const encoded: unknown = toString.call(data, \"base64\");\n if (typeof encoded === \"string\" && isCanonicalBase64(encoded)) {\n return `data:${mediaType};base64,${encoded}`;\n }\n }\n }\n\n throw new UnsupportedFunctionalityError({\n functionality:\n \"Unsupported file data type. Expected base64 string, Uint8Array, ArrayBuffer, URL, or a buffer-like object returning canonical base64.\",\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
ApiSwitchError,
|
|
4
4
|
UnsupportedFeatureError,
|
|
5
5
|
deepMerge
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BIBSYTMU.js";
|
|
7
7
|
|
|
8
8
|
// src/sap-ai-validation.ts
|
|
9
9
|
function validateEscapeTemplatePlaceholders(api, escapeTemplatePlaceholders) {
|
|
@@ -187,4 +187,4 @@ export {
|
|
|
187
187
|
validateMaskingProvidersDeprecation,
|
|
188
188
|
validateSettings
|
|
189
189
|
};
|
|
190
|
-
//# sourceMappingURL=chunk-
|
|
190
|
+
//# sourceMappingURL=chunk-TXZZURBA.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
convertToSAPMessages
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-QDUZRLMI.js";
|
|
5
5
|
import {
|
|
6
6
|
StreamIdGenerator,
|
|
7
7
|
buildGenerateResult,
|
|
@@ -11,14 +11,14 @@ import {
|
|
|
11
11
|
extractCompletionId,
|
|
12
12
|
extractResponseMetadata,
|
|
13
13
|
mapToolChoice
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-Q5JV4I6D.js";
|
|
15
15
|
import {
|
|
16
16
|
VERSION,
|
|
17
17
|
convertToAISDKError,
|
|
18
18
|
getProviderName,
|
|
19
19
|
normalizeHeaders,
|
|
20
20
|
sapAILanguageModelProviderOptions
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-BIBSYTMU.js";
|
|
22
22
|
|
|
23
23
|
// src/base-language-model-strategy.ts
|
|
24
24
|
import { parseProviderOptions } from "@ai-sdk/provider-utils";
|
|
@@ -42,6 +42,7 @@ var BaseLanguageModelStrategy = class {
|
|
|
42
42
|
outputKey: "presence_penalty"
|
|
43
43
|
},
|
|
44
44
|
{ camelCaseKey: "seed", optionKey: "seed", outputKey: "seed" },
|
|
45
|
+
{ optionKey: "reasoning", outputKey: "reasoning_effort" },
|
|
45
46
|
{ camelCaseKey: "parallel_tool_calls", outputKey: "parallel_tool_calls" }
|
|
46
47
|
];
|
|
47
48
|
async doGenerate(config, settings, options) {
|
|
@@ -247,4 +248,4 @@ var BaseLanguageModelStrategy = class {
|
|
|
247
248
|
export {
|
|
248
249
|
BaseLanguageModelStrategy
|
|
249
250
|
};
|
|
250
|
-
//# sourceMappingURL=chunk-
|
|
251
|
+
//# sourceMappingURL=chunk-WNR7DC4V.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/base-language-model-strategy.ts"],"sourcesContent":["/** Base class for language model strategies using the Template Method pattern. */\nimport type {\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { ChatMessage } from \"@sap-ai-sdk/orchestration\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\n\nimport type { ParsePartProviderOptions } from \"./sap-ai-provider-options.js\";\nimport type { SAPAIModelSettings } from \"./sap-ai-settings.js\";\nimport type { LanguageModelAPIStrategy, LanguageModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport { convertToSAPMessages } from \"./convert-to-sap-messages.js\";\nimport { convertToAISDKError, normalizeHeaders } from \"./sap-ai-error.js\";\nimport { getProviderName, sapAILanguageModelProviderOptions } from \"./sap-ai-provider-options.js\";\nimport {\n buildGenerateResult,\n buildModelParams,\n createAISDKRequestBodySummary,\n createStreamTransformer,\n extractCompletionId,\n extractResponseMetadata,\n mapToolChoice,\n type ParamMapping,\n type SAPToolChoice,\n type SDKCitation,\n type SDKResponse,\n type SDKStreamChunk,\n type SDKTokenUsage,\n StreamIdGenerator,\n} from \"./strategy-utils.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * Result of building common parts for a language model request.\n * @template TMessages - The message array type (e.g., `ChatMessage[]`, `AzureOpenAiChatCompletionRequestMessage[]`)\n * @template TToolChoice - The tool choice type (e.g., `SAPToolChoice`)\n * @internal\n */\nexport interface CommonBuildResult<TMessages extends unknown[] = unknown[], TToolChoice = unknown> {\n readonly messages: TMessages;\n readonly modelParams: Record<string, unknown>;\n readonly providerName: string;\n readonly resolvedState?: unknown;\n readonly sapOptions: Record<string, unknown> | undefined;\n readonly toolChoice: TToolChoice;\n readonly warnings: SharedV3Warning[];\n}\n\n/**\n * Stream response shape returned by executeStreamCall.\n * @internal\n */\nexport interface StreamCallResponse {\n readonly getCitations?: () => SDKCitation[] | undefined;\n readonly getFinishReason: () => null | string | undefined;\n readonly getIntermediateFailures?: () => undefined | unknown[];\n readonly getTokenUsage: () => null | SDKTokenUsage | undefined;\n /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n readonly requestId?: string;\n readonly responseHeaders?: Record<string, string>;\n /** Server-provided completion ID extracted from _data, if available. */\n readonly responseId?: string;\n readonly stream: AsyncIterable<SDKStreamChunk>;\n}\n\n/**\n * Abstract base class for language model strategies using the Template Method pattern.\n * @template TClient - The SDK client type (e.g., AzureOpenAiChatClient, OrchestrationClient).\n * @template TRequest - The API request type (e.g., AzureOpenAiChatCompletionParameters).\n * @template TSettings - The model settings type extending SAPAIModelSettings.\n * @internal\n */\nexport abstract class BaseLanguageModelStrategy<\n TClient,\n TRequest,\n TSettings extends SAPAIModelSettings = SAPAIModelSettings,\n> implements LanguageModelAPIStrategy<TSettings> {\n /**\n * Common parameter mappings for language model APIs.\n * @internal\n */\n static readonly COMMON_PARAM_MAPPINGS: readonly ParamMapping[] = [\n { camelCaseKey: \"maxTokens\", optionKey: \"maxOutputTokens\", outputKey: \"max_completion_tokens\" },\n { camelCaseKey: \"temperature\", optionKey: \"temperature\", outputKey: \"temperature\" },\n { camelCaseKey: \"topP\", optionKey: \"topP\", outputKey: \"top_p\" },\n {\n camelCaseKey: \"frequencyPenalty\",\n optionKey: \"frequencyPenalty\",\n outputKey: \"frequency_penalty\",\n },\n {\n camelCaseKey: \"presencePenalty\",\n optionKey: \"presencePenalty\",\n outputKey: \"presence_penalty\",\n },\n { camelCaseKey: \"seed\", optionKey: \"seed\", outputKey: \"seed\" },\n { optionKey: \"reasoning\", outputKey: \"reasoning_effort\" },\n { camelCaseKey: \"parallel_tool_calls\", outputKey: \"parallel_tool_calls\" },\n ] as const;\n\n async doGenerate(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n try {\n const commonParts = await this.buildCommonParts(config, settings, options);\n const { request, warnings } = this.buildRequest(config, settings, options, commonParts);\n\n const client = this.createClient(config, settings, commonParts);\n\n const response = await this.executeApiCall(\n client,\n request,\n options.abortSignal ?? undefined,\n config.requestConfig,\n );\n\n return buildGenerateResult({\n modelId: config.modelId,\n providerName: commonParts.providerName,\n requestBody: request,\n requestId: response.requestId,\n response,\n responseHeaders: normalizeHeaders(response.rawResponse.headers),\n version: VERSION,\n warnings: [...commonParts.warnings, ...warnings],\n });\n } catch (error) {\n throw convertToAISDKError(error, {\n operation: \"doGenerate\",\n requestBody: createAISDKRequestBodySummary(options),\n url: this.getUrl(),\n });\n }\n }\n\n async doStream(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n try {\n const commonParts = await this.buildCommonParts(config, settings, options);\n const { request, warnings } = this.buildRequest(config, settings, options, commonParts);\n\n const client = this.createClient(config, settings, commonParts);\n\n const streamResponse = await this.executeStreamCall(\n client,\n request,\n options.abortSignal ?? undefined,\n settings,\n config.requestConfig,\n );\n\n const idGenerator = new StreamIdGenerator();\n const responseId = streamResponse.responseId ?? idGenerator.generateResponseId();\n\n const streamWarnings = this.collectStreamWarnings(settings, commonParts.sapOptions);\n\n const transformedStream = createStreamTransformer({\n convertToAISDKError,\n idGenerator,\n includeRawChunks: options.includeRawChunks ?? false,\n modelId: config.modelId,\n options,\n providerName: commonParts.providerName,\n requestId: streamResponse.requestId,\n responseId,\n sdkStream: streamResponse.stream,\n streamResponseGetCitations: streamResponse.getCitations,\n streamResponseGetFinishReason: streamResponse.getFinishReason,\n streamResponseGetIntermediateFailures: streamResponse.getIntermediateFailures,\n streamResponseGetTokenUsage: streamResponse.getTokenUsage,\n url: this.getUrl(),\n version: VERSION,\n warnings: [...commonParts.warnings, ...warnings, ...streamWarnings],\n });\n\n return {\n request: {\n body: request,\n },\n response: {\n headers: streamResponse.responseHeaders,\n },\n stream: transformedStream,\n };\n } catch (error) {\n throw convertToAISDKError(error, {\n operation: \"doStream\",\n requestBody: createAISDKRequestBodySummary(options),\n url: this.getUrl(),\n });\n }\n }\n\n /**\n * Builds common parts shared between doGenerate and doStream.\n * @param config - Strategy configuration.\n * @param settings - Model settings.\n * @param options - AI SDK call options.\n * @returns Common build result with typed messages and tool choice.\n * @internal\n */\n protected async buildCommonParts(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>> {\n const providerName = getProviderName(config.provider);\n\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAILanguageModelProviderOptions,\n });\n\n const warnings: SharedV3Warning[] = [];\n\n const resolvedState = this.resolveAdditionalState(\n config,\n settings,\n sapOptions,\n options,\n warnings,\n );\n\n const messages = convertToSAPMessages(options.prompt, {\n escapeTemplatePlaceholders: this.getEscapeTemplatePlaceholders(sapOptions, settings),\n includeReasoning: this.getIncludeReasoning(sapOptions, settings),\n parsePartProviderOptions: this.getPartProviderOptionsParser(),\n warnings,\n });\n\n const { modelParams, warnings: paramWarnings } = buildModelParams({\n options,\n paramMappings: this.getParamMappings(),\n providerModelParams: sapOptions?.modelParams,\n settingsModelParams: settings.modelParams,\n });\n warnings.push(...paramWarnings);\n\n const toolChoice = mapToolChoice(options.toolChoice);\n\n return {\n messages,\n modelParams,\n providerName,\n resolvedState,\n sapOptions,\n toolChoice,\n warnings,\n };\n }\n\n /**\n * Builds the API-specific request body.\n * @param config - Strategy configuration.\n * @param settings - Model settings.\n * @param options - AI SDK call options.\n * @param commonParts - Common build result from base class.\n * @returns Request body and accumulated warnings.\n * @internal\n */\n protected abstract buildRequest(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): { readonly request: TRequest; readonly warnings: SharedV3Warning[] };\n\n /**\n * Collects stream-specific warnings.\n * Override in subclasses to add API-specific streaming warnings.\n * @param _settings - Model settings (unused in base implementation).\n * @param _sapOptions - Provider options (unused in base implementation).\n * @returns Array of warnings for streaming operations.\n * @internal\n */\n protected collectStreamWarnings(\n _settings: TSettings,\n _sapOptions?: Record<string, unknown>,\n ): SharedV3Warning[] {\n return [];\n }\n\n /**\n * Creates the appropriate SDK client for this API.\n * @param config - Strategy configuration.\n * @param settings - Model settings.\n * @param commonParts - Common build result (messages, options, etc.).\n * @returns SDK client instance.\n * @internal\n */\n protected abstract createClient(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): TClient;\n\n /**\n * Executes the non-streaming API call.\n * @param client - SDK client instance.\n * @param request - Request body.\n * @param abortSignal - Optional abort signal.\n * @param requestConfig - Optional custom request configuration (e.g. custom headers).\n * @returns SDK response.\n * @internal\n */\n protected abstract executeApiCall(\n client: TClient,\n request: TRequest,\n abortSignal: AbortSignal | undefined,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<SDKResponse>;\n\n /**\n * Executes the streaming API call.\n * @param client - SDK client instance.\n * @param request - Request body.\n * @param abortSignal - Optional abort signal.\n * @param settings - Model settings for API-specific stream options.\n * @param requestConfig - Optional custom request configuration (e.g. custom headers).\n * @returns Stream response with accessors.\n * @internal\n */\n protected abstract executeStreamCall(\n client: TClient,\n request: TRequest,\n abortSignal: AbortSignal | undefined,\n settings: TSettings,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<StreamCallResponse>;\n\n /**\n * Resolves request id, completion id, and normalised headers from an SDK response.\n * @param response - Raw SDK response or stream response.\n * @returns Combined metadata fragment.\n * @internal\n */\n protected extractMetadata(response: unknown): {\n requestId?: string;\n responseHeaders?: Record<string, string>;\n responseId?: string;\n } {\n const responseId = extractCompletionId(\n response as { _data?: unknown; getRequestId?: () => string | undefined },\n this.getCompletionIdPath(),\n );\n const { headers, requestId } = extractResponseMetadata(response, \"rawResponse\");\n return { requestId, responseHeaders: headers, responseId };\n }\n\n /**\n * Returns the API-specific dotted path used to read the completion id off\n * the SDK response's internal `_data` payload.\n * @returns Path traversed under `_data` (e.g. `[\"final_result\",\"id\"]`, `[\"id\"]`).\n * @internal\n */\n protected abstract getCompletionIdPath(): readonly string[];\n\n /**\n * Returns whether to escape template placeholders for this API.\n * @param _sapOptions - Parsed provider options (unused in base implementation).\n * @param _settings - Model settings (unused in base implementation).\n * @returns false by default; Orchestration strategy overrides to return true.\n * @internal\n */\n protected getEscapeTemplatePlaceholders(\n _sapOptions: Record<string, unknown> | undefined,\n _settings: TSettings,\n ): boolean {\n return false;\n }\n\n /**\n * Returns whether to include reasoning in the response.\n * @param sapOptions - Parsed provider options.\n * @param settings - Model settings.\n * @returns Whether to include reasoning (checks sapOptions then settings, defaults to false).\n * @internal\n */\n protected getIncludeReasoning(\n sapOptions: Record<string, unknown> | undefined,\n settings: TSettings,\n ): boolean {\n return (\n (sapOptions?.includeReasoning as boolean | undefined) ?? settings.includeReasoning ?? false\n );\n }\n\n /**\n * Returns the parameter mappings specific to this API strategy.\n * @returns Array of parameter mappings.\n * @internal\n */\n protected abstract getParamMappings(): readonly ParamMapping[];\n\n /**\n * Returns a parser for per-message-part `providerOptions['sap-ai']`.\n *\n * Default returns `undefined`; strategies honouring part-level directives\n * (e.g. Anthropic `cacheControl` on orchestration) override to return a parser.\n * @returns Parser callback, or undefined to disable per-part plumbing.\n * @internal\n */\n protected getPartProviderOptionsParser(): ParsePartProviderOptions | undefined {\n return undefined;\n }\n\n /**\n * Returns the URL identifier for this API (used in error messages).\n * @returns URL string identifier.\n * @internal\n */\n protected abstract getUrl(): string;\n\n /**\n * Resolves API-specific extra state shared between doGenerate and doStream\n * (e.g. orchestration `configRef` / `promptTemplateRef` / `tools`). Override\n * to add API-specific deprecation checks or pre-resolve auxiliary inputs.\n * Pushed warnings flow into the shared sink.\n * @param _config - Strategy configuration.\n * @param _settings - Model settings.\n * @param _sapOptions - Parsed provider options, or `undefined`.\n * @param _options - AI SDK call options.\n * @param _warnings - Shared warnings sink for the current call.\n * @returns Strategy-specific resolved state, or `undefined` (default).\n * @internal\n */\n protected resolveAdditionalState(\n _config: LanguageModelStrategyConfig,\n _settings: TSettings,\n _sapOptions: Record<string, unknown> | undefined,\n _options: LanguageModelV3CallOptions,\n _warnings: SharedV3Warning[],\n ): unknown {\n return undefined;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
BaseEmbeddingModelStrategy
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-FY2HO62O.js";
|
|
5
5
|
import {
|
|
6
6
|
buildModelDeployment,
|
|
7
7
|
extractResponseMetadata,
|
|
8
8
|
hasKeys,
|
|
9
9
|
mergeRequestConfig,
|
|
10
10
|
normalizeEmbedding
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-Q5JV4I6D.js";
|
|
12
|
+
import "./chunk-BIBSYTMU.js";
|
|
13
13
|
|
|
14
14
|
// src/foundation-models-embedding-model-strategy.ts
|
|
15
15
|
var FoundationModelsEmbeddingModelStrategy = class extends BaseEmbeddingModelStrategy {
|
|
@@ -56,4 +56,4 @@ var FoundationModelsEmbeddingModelStrategy = class extends BaseEmbeddingModelStr
|
|
|
56
56
|
export {
|
|
57
57
|
FoundationModelsEmbeddingModelStrategy
|
|
58
58
|
};
|
|
59
|
-
//# sourceMappingURL=foundation-models-embedding-model-strategy-
|
|
59
|
+
//# sourceMappingURL=foundation-models-embedding-model-strategy-JJBN3TQI.js.map
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
BaseLanguageModelStrategy
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-WNR7DC4V.js";
|
|
5
|
+
import "./chunk-QDUZRLMI.js";
|
|
6
6
|
import {
|
|
7
7
|
buildModelDeployment,
|
|
8
8
|
convertResponseFormat,
|
|
9
9
|
convertToolsToSAPFormat,
|
|
10
10
|
mergeRequestConfig
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-Q5JV4I6D.js";
|
|
12
|
+
import "./chunk-BIBSYTMU.js";
|
|
13
13
|
|
|
14
14
|
// src/foundation-models-language-model-strategy.ts
|
|
15
15
|
var FOUNDATION_MODELS_PARAM_MAPPINGS = [
|
|
@@ -97,4 +97,4 @@ var FoundationModelsLanguageModelStrategy = class extends BaseLanguageModelStrat
|
|
|
97
97
|
export {
|
|
98
98
|
FoundationModelsLanguageModelStrategy
|
|
99
99
|
};
|
|
100
|
-
//# sourceMappingURL=foundation-models-language-model-strategy-
|
|
100
|
+
//# sourceMappingURL=foundation-models-language-model-strategy-6ELKE34K.js.map
|