@jerome-benoit/sap-ai-provider-v2 5.0.3 → 5.1.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 +44 -24
- package/dist/chunk-4ILJD6PI.js +333 -0
- package/dist/chunk-4ILJD6PI.js.map +1 -0
- package/dist/chunk-BHA5MIN6.js +224 -0
- package/dist/chunk-BHA5MIN6.js.map +1 -0
- package/dist/{chunk-4JLNWASF.js → chunk-DLGBK3C3.js} +91 -7
- package/dist/chunk-DLGBK3C3.js.map +1 -0
- package/dist/{chunk-E76ZDPIW.js → chunk-EUBI5ENK.js} +54 -27
- package/dist/chunk-EUBI5ENK.js.map +1 -0
- package/dist/{chunk-YP3AADWD.js → chunk-FKHOJ3ZC.js} +24 -3
- package/dist/chunk-FKHOJ3ZC.js.map +1 -0
- package/dist/{chunk-UIBQ5AFS.js → chunk-QFMHNGLB.js} +56 -218
- package/dist/chunk-QFMHNGLB.js.map +1 -0
- package/dist/{chunk-3H5C5U22.js → chunk-QQQYMQPU.js} +19 -10
- package/dist/chunk-QQQYMQPU.js.map +1 -0
- package/dist/{chunk-NF355OFT.js → chunk-ZOBD7PXJ.js} +116 -21
- package/dist/chunk-ZOBD7PXJ.js.map +1 -0
- package/dist/{foundation-models-embedding-model-strategy-SAVQFBF4.js → foundation-models-embedding-model-strategy-3WAKJXBY.js} +5 -4
- package/dist/{foundation-models-embedding-model-strategy-SAVQFBF4.js.map → foundation-models-embedding-model-strategy-3WAKJXBY.js.map} +1 -1
- package/dist/{foundation-models-language-model-strategy-ZDOWVYTA.js → foundation-models-language-model-strategy-PJ26VXEA.js} +21 -8
- package/dist/foundation-models-language-model-strategy-PJ26VXEA.js.map +1 -0
- package/dist/index.cjs +2008 -497
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +798 -185
- package/dist/index.d.ts +798 -185
- package/dist/index.js +148 -24
- package/dist/index.js.map +1 -1
- package/dist/{orchestration-embedding-model-strategy-GT27AFII.js → orchestration-embedding-model-strategy-AZ76XLMD.js} +6 -5
- package/dist/{orchestration-embedding-model-strategy-GT27AFII.js.map → orchestration-embedding-model-strategy-AZ76XLMD.js.map} +1 -1
- package/dist/{orchestration-language-model-strategy-7QTPQHCC.js → orchestration-language-model-strategy-CT6RHCYO.js} +48 -17
- package/dist/orchestration-language-model-strategy-CT6RHCYO.js.map +1 -0
- package/dist/responses-language-model-strategy-UYTV6TPM.js +738 -0
- package/dist/responses-language-model-strategy-UYTV6TPM.js.map +1 -0
- package/dist/sap-ai-error-UPKYWPSS.js +16 -0
- package/dist/sap-ai-error-UPKYWPSS.js.map +1 -0
- package/package.json +79 -39
- package/dist/chunk-3H5C5U22.js.map +0 -1
- package/dist/chunk-4JLNWASF.js.map +0 -1
- package/dist/chunk-E76ZDPIW.js.map +0 -1
- package/dist/chunk-NF355OFT.js.map +0 -1
- package/dist/chunk-UIBQ5AFS.js.map +0 -1
- package/dist/chunk-YP3AADWD.js.map +0 -1
- package/dist/foundation-models-language-model-strategy-ZDOWVYTA.js.map +0 -1
- package/dist/orchestration-language-model-strategy-7QTPQHCC.js.map +0 -1
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
|
|
2
|
+
|
|
3
|
+
// src/sap-ai-provider-options.ts
|
|
4
|
+
import { lazySchema, zodSchema } from "@ai-sdk/provider-utils";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
var SAP_AI_PROVIDER_NAME = "sap-ai";
|
|
7
|
+
function getProviderName(providerIdentifier) {
|
|
8
|
+
const dotIndex = providerIdentifier.indexOf(".");
|
|
9
|
+
return dotIndex === -1 ? providerIdentifier : providerIdentifier.slice(0, dotIndex);
|
|
10
|
+
}
|
|
11
|
+
var modelParamsSchema = z.object({
|
|
12
|
+
frequencyPenalty: z.number().min(-2).max(2).optional(),
|
|
13
|
+
maxTokens: z.number().int().positive().optional(),
|
|
14
|
+
n: z.number().int().positive().optional(),
|
|
15
|
+
parallel_tool_calls: z.boolean().optional(),
|
|
16
|
+
presencePenalty: z.number().min(-2).max(2).optional(),
|
|
17
|
+
temperature: z.number().min(0).max(2).optional(),
|
|
18
|
+
topP: z.number().min(0).max(1).optional()
|
|
19
|
+
}).catchall(z.unknown());
|
|
20
|
+
var embeddingModelParamsSchema = z.object({
|
|
21
|
+
dimensions: z.number().int().positive().optional(),
|
|
22
|
+
encoding_format: z.enum(["base64", "binary", "float"]).optional(),
|
|
23
|
+
normalize: z.boolean().optional()
|
|
24
|
+
}).catchall(z.unknown());
|
|
25
|
+
function validateEmbeddingModelParamsSettings(modelParams) {
|
|
26
|
+
return embeddingModelParamsSchema.parse(modelParams);
|
|
27
|
+
}
|
|
28
|
+
function validateModelParamsSettings(modelParams) {
|
|
29
|
+
return modelParamsSchema.parse(modelParams);
|
|
30
|
+
}
|
|
31
|
+
function validateModelParamsWithWarnings(params, warnings) {
|
|
32
|
+
const result = modelParamsSchema.safeParse(params);
|
|
33
|
+
if (!result.success) {
|
|
34
|
+
for (const issue of result.error.issues) {
|
|
35
|
+
const path = issue.path.join(".");
|
|
36
|
+
const value = path ? params[path] : void 0;
|
|
37
|
+
warnings.push({
|
|
38
|
+
message: `${path}=${String(value)} is invalid: ${issue.message}. The API may reject this value.`,
|
|
39
|
+
type: "other"
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
var sapAIApiTypeSchema = z.enum(["orchestration", "foundation-models", "responses"]);
|
|
45
|
+
var cacheControlSchema = z.object({
|
|
46
|
+
ttl: z.enum(["5m", "1h"]).optional(),
|
|
47
|
+
type: z.literal("ephemeral")
|
|
48
|
+
});
|
|
49
|
+
var sapAIPartProviderOptionsSchema = z.object({
|
|
50
|
+
cacheControl: cacheControlSchema.optional()
|
|
51
|
+
});
|
|
52
|
+
function parseSAPPartProviderOptions(providerOptions, warnings) {
|
|
53
|
+
if (!providerOptions || typeof providerOptions !== "object") {
|
|
54
|
+
return void 0;
|
|
55
|
+
}
|
|
56
|
+
const block = providerOptions[SAP_AI_PROVIDER_NAME];
|
|
57
|
+
if (block === void 0) {
|
|
58
|
+
return void 0;
|
|
59
|
+
}
|
|
60
|
+
const parsed = sapAIPartProviderOptionsSchema.safeParse(block);
|
|
61
|
+
if (parsed.success) {
|
|
62
|
+
return parsed.data;
|
|
63
|
+
}
|
|
64
|
+
if (warnings) {
|
|
65
|
+
for (const issue of parsed.error.issues) {
|
|
66
|
+
const path = issue.path.join(".");
|
|
67
|
+
const message = `providerOptions['sap-ai']${path ? `.${path}` : ""} is invalid: ${issue.message}. The directive was dropped.`;
|
|
68
|
+
if (!warnings.some((w) => w.message === message)) {
|
|
69
|
+
warnings.push({ message, type: "other" });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return void 0;
|
|
74
|
+
}
|
|
75
|
+
var orchestrationReasoningBlockSchema = z.object({
|
|
76
|
+
content: z.string().optional(),
|
|
77
|
+
signature: z.string().optional()
|
|
78
|
+
}).strict();
|
|
79
|
+
var promptTemplateScopeSchema = z.enum(["tenant", "resource_group"]);
|
|
80
|
+
var promptTemplateRefByIdSchema = z.object({
|
|
81
|
+
id: z.string().min(1, "Template ID cannot be empty"),
|
|
82
|
+
scope: promptTemplateScopeSchema.optional()
|
|
83
|
+
});
|
|
84
|
+
var promptTemplateRefByScenarioNameVersionSchema = z.object({
|
|
85
|
+
name: z.string().min(1, "Template name cannot be empty"),
|
|
86
|
+
scenario: z.string().min(1, "Scenario cannot be empty"),
|
|
87
|
+
scope: promptTemplateScopeSchema.optional(),
|
|
88
|
+
version: z.string().min(1, "Version cannot be empty")
|
|
89
|
+
});
|
|
90
|
+
var promptTemplateRefSchema = z.union([
|
|
91
|
+
promptTemplateRefByIdSchema,
|
|
92
|
+
promptTemplateRefByScenarioNameVersionSchema
|
|
93
|
+
]);
|
|
94
|
+
var orchestrationConfigRefOverrideSchema = z.custom(
|
|
95
|
+
(value) => typeof value === "object" && value !== null && !Array.isArray(value),
|
|
96
|
+
{ message: "overrideConfig must be an object" }
|
|
97
|
+
).refine(
|
|
98
|
+
(value) => {
|
|
99
|
+
let stream;
|
|
100
|
+
try {
|
|
101
|
+
stream = value.stream;
|
|
102
|
+
} catch {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
return stream === void 0 || Boolean(stream) && typeof stream === "object" && !Array.isArray(stream);
|
|
106
|
+
},
|
|
107
|
+
{ message: "overrideConfig.stream must be an object" }
|
|
108
|
+
).refine(
|
|
109
|
+
(value) => {
|
|
110
|
+
let stream;
|
|
111
|
+
try {
|
|
112
|
+
stream = value.stream;
|
|
113
|
+
} catch {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
if (stream === void 0 || stream === null || typeof stream !== "object") {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
return !("enabled" in stream);
|
|
121
|
+
} catch {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
message: "stream.enabled is not allowed in overrideConfig: it is controlled by the call site (stream() or chatCompletion())"
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
var orchestrationConfigRefByIdSchema = z.object({
|
|
130
|
+
id: z.string().min(1, "Config ID cannot be empty"),
|
|
131
|
+
overrideConfig: orchestrationConfigRefOverrideSchema.optional()
|
|
132
|
+
});
|
|
133
|
+
var orchestrationConfigRefByScenarioNameVersionSchema = z.object({
|
|
134
|
+
name: z.string().min(1, "Config name cannot be empty"),
|
|
135
|
+
overrideConfig: orchestrationConfigRefOverrideSchema.optional(),
|
|
136
|
+
scenario: z.string().min(1, "Scenario cannot be empty"),
|
|
137
|
+
version: z.string().min(1, "Version cannot be empty")
|
|
138
|
+
});
|
|
139
|
+
var orchestrationConfigRefSchema = z.union([
|
|
140
|
+
orchestrationConfigRefByIdSchema,
|
|
141
|
+
orchestrationConfigRefByScenarioNameVersionSchema
|
|
142
|
+
]);
|
|
143
|
+
var responsesModelOptionsSchema = z.object({
|
|
144
|
+
metadata: z.record(z.string(), z.string()).nullable().optional()
|
|
145
|
+
}).catchall(z.json());
|
|
146
|
+
var dropUnsupportedParamsSchema = z.boolean();
|
|
147
|
+
var sapAILanguageModelProviderOptions = lazySchema(
|
|
148
|
+
() => zodSchema(
|
|
149
|
+
z.object({
|
|
150
|
+
api: sapAIApiTypeSchema.optional(),
|
|
151
|
+
dropUnsupportedParams: dropUnsupportedParamsSchema.optional(),
|
|
152
|
+
escapeTemplatePlaceholders: z.boolean().optional(),
|
|
153
|
+
includeReasoning: z.boolean().optional(),
|
|
154
|
+
modelParams: modelParamsSchema.optional(),
|
|
155
|
+
orchestrationConfigRef: orchestrationConfigRefSchema.optional(),
|
|
156
|
+
placeholderValues: z.record(z.string(), z.string()).optional(),
|
|
157
|
+
promptTemplateRef: promptTemplateRefSchema.optional(),
|
|
158
|
+
responses: responsesModelOptionsSchema.optional()
|
|
159
|
+
})
|
|
160
|
+
)
|
|
161
|
+
);
|
|
162
|
+
var sapAIEmbeddingProviderOptions = lazySchema(
|
|
163
|
+
() => zodSchema(
|
|
164
|
+
z.object({
|
|
165
|
+
api: sapAIApiTypeSchema.optional(),
|
|
166
|
+
modelParams: embeddingModelParamsSchema.optional(),
|
|
167
|
+
type: z.enum(["document", "query", "text"]).optional()
|
|
168
|
+
})
|
|
169
|
+
)
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
// src/deep-merge.ts
|
|
173
|
+
var MAX_DEPTH = 100;
|
|
174
|
+
function deepMerge(...sources) {
|
|
175
|
+
const result = {};
|
|
176
|
+
for (const source of sources) {
|
|
177
|
+
if (source != null) mergeInto(result, source, /* @__PURE__ */ new Set(), 0);
|
|
178
|
+
}
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
function isPlainObject(value) {
|
|
182
|
+
if (value === null || typeof value !== "object") return false;
|
|
183
|
+
const proto = Object.getPrototypeOf(value);
|
|
184
|
+
return proto === Object.prototype || proto === null;
|
|
185
|
+
}
|
|
186
|
+
function mergeInto(target, source, ancestors, depth) {
|
|
187
|
+
if (depth > MAX_DEPTH) throw new Error("Maximum merge depth exceeded");
|
|
188
|
+
if (ancestors.has(source)) throw new Error("Circular reference detected during deep merge");
|
|
189
|
+
ancestors.add(source);
|
|
190
|
+
for (const key of Object.keys(source)) {
|
|
191
|
+
const sourceValue = source[key];
|
|
192
|
+
const targetValue = Object.hasOwn(target, key) ? target[key] : void 0;
|
|
193
|
+
const value = isPlainObject(sourceValue) ? mergeInto(isPlainObject(targetValue) ? targetValue : {}, sourceValue, ancestors, depth + 1) : sourceValue;
|
|
194
|
+
Object.defineProperty(target, key, {
|
|
195
|
+
configurable: true,
|
|
196
|
+
enumerable: true,
|
|
197
|
+
value,
|
|
198
|
+
writable: true
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
ancestors.delete(source);
|
|
202
|
+
return target;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// src/version.ts
|
|
206
|
+
var VERSION = true ? "5.1.0" : "0.0.0-test";
|
|
207
|
+
|
|
208
|
+
export {
|
|
209
|
+
SAP_AI_PROVIDER_NAME,
|
|
210
|
+
getProviderName,
|
|
211
|
+
validateEmbeddingModelParamsSettings,
|
|
212
|
+
validateModelParamsSettings,
|
|
213
|
+
validateModelParamsWithWarnings,
|
|
214
|
+
parseSAPPartProviderOptions,
|
|
215
|
+
orchestrationReasoningBlockSchema,
|
|
216
|
+
orchestrationConfigRefSchema,
|
|
217
|
+
responsesModelOptionsSchema,
|
|
218
|
+
dropUnsupportedParamsSchema,
|
|
219
|
+
sapAILanguageModelProviderOptions,
|
|
220
|
+
sapAIEmbeddingProviderOptions,
|
|
221
|
+
deepMerge,
|
|
222
|
+
VERSION
|
|
223
|
+
};
|
|
224
|
+
//# sourceMappingURL=chunk-BHA5MIN6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sap-ai-provider-options.ts","../src/deep-merge.ts","../src/version.ts"],"sourcesContent":["/**\n * Zod schemas for runtime validation of per-call options via `providerOptions['sap-ai']`.\n */\n\nimport type { SharedV3Warning } from \"@ai-sdk/provider\";\nimport type { InferSchema } from \"@ai-sdk/provider-utils\";\nimport type { JSONObject } from \"@ai-sdk/provider-v3\";\nimport type { OrchestrationConfigRefOverride } from \"@sap-ai-sdk/orchestration\";\n\nimport { lazySchema, zodSchema } from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\n\n/** Default provider name used as key in `providerOptions` and `providerMetadata` objects. */\nexport const SAP_AI_PROVIDER_NAME = \"sap-ai\" as const;\n\n/**\n * Extracts the provider name from a provider identifier (e.g., \"sap-ai.chat\" → \"sap-ai\").\n * @param providerIdentifier - The full provider identifier string.\n * @returns The prefix before the first dot, or the unchanged identifier when no dot exists.\n */\nexport function getProviderName(providerIdentifier: string): string {\n const dotIndex = providerIdentifier.indexOf(\".\");\n return dotIndex === -1 ? providerIdentifier : providerIdentifier.slice(0, dotIndex);\n}\n\n/**\n * @internal\n */\nexport const modelParamsSchema = z\n .object({\n frequencyPenalty: z.number().min(-2).max(2).optional(),\n maxTokens: z.number().int().positive().optional(),\n n: z.number().int().positive().optional(),\n parallel_tool_calls: z.boolean().optional(),\n presencePenalty: z.number().min(-2).max(2).optional(),\n temperature: z.number().min(0).max(2).optional(),\n topP: z.number().min(0).max(1).optional(),\n })\n .catchall(z.unknown());\n\n/** @internal */\nexport type ModelParams = z.infer<typeof modelParamsSchema>;\n\n/**\n * @internal\n */\nexport const embeddingModelParamsSchema = z\n .object({\n dimensions: z.number().int().positive().optional(),\n encoding_format: z.enum([\"base64\", \"binary\", \"float\"]).optional(),\n normalize: z.boolean().optional(),\n })\n .catchall(z.unknown());\n\n/** @internal */\nexport type EmbeddingModelParams = z.infer<typeof embeddingModelParamsSchema>;\n\n/**\n * Validates embedding model parameters from constructor settings.\n * @param modelParams - The model parameters to validate.\n * @returns The validated embedding model parameters.\n * @throws {z.ZodError} If validation fails.\n */\nexport function validateEmbeddingModelParamsSettings(modelParams: unknown): EmbeddingModelParams {\n return embeddingModelParamsSchema.parse(modelParams);\n}\n\n/**\n * Validates model parameters from constructor settings.\n * @param modelParams - The model parameters to validate.\n * @returns The validated model parameters.\n * @throws {z.ZodError} If validation fails.\n */\nexport function validateModelParamsSettings(modelParams: unknown): ModelParams {\n return modelParamsSchema.parse(modelParams);\n}\n\n/**\n * Validates Vercel AI SDK standard parameters and adds warnings for out-of-range values.\n * @param params - The parameters to validate.\n * @param params.frequencyPenalty - Frequency penalty value (-2.0 to 2.0).\n * @param params.maxTokens - Maximum tokens value (positive integer).\n * @param params.presencePenalty - Presence penalty value (-2.0 to 2.0).\n * @param params.temperature - Temperature value (0 to 2).\n * @param params.topP - Top-p value (0 to 1).\n * @param warnings - Array to collect validation warnings.\n */\nexport function validateModelParamsWithWarnings(\n params: {\n frequencyPenalty?: number;\n maxTokens?: number;\n presencePenalty?: number;\n temperature?: number;\n topP?: number;\n },\n warnings: SharedV3Warning[],\n): void {\n const result = modelParamsSchema.safeParse(params);\n\n if (!result.success) {\n for (const issue of result.error.issues) {\n const path = issue.path.join(\".\");\n const value = path ? (params as Record<string, unknown>)[path] : undefined;\n warnings.push({\n message: `${path}=${String(value)} is invalid: ${issue.message}. The API may reject this value.`,\n type: \"other\",\n });\n }\n }\n}\n\n/** @internal */\nexport const sapAIApiTypeSchema = z.enum([\"orchestration\", \"foundation-models\", \"responses\"]);\n\n/**\n * Anthropic prompt-caching directive accepted on V3 message-parts via\n * `providerOptions['sap-ai'].cacheControl`.\n * @internal\n */\nexport const cacheControlSchema = z.object({\n ttl: z.enum([\"5m\", \"1h\"]).optional(),\n type: z.literal(\"ephemeral\"),\n});\n\n/** @internal */\nexport type CacheControl = z.infer<typeof cacheControlSchema>;\n\n/**\n * Per-message-part SAP AI provider options read from\n * `LanguageModelV3*Part.providerOptions['sap-ai']`.\n * @internal\n */\nexport const sapAIPartProviderOptionsSchema = z.object({\n cacheControl: cacheControlSchema.optional(),\n});\n\n/**\n * Callback that reads per-message-part `providerOptions` and returns the validated\n * `sap-ai` slice (e.g. `cacheControl`), or `undefined` when absent or invalid.\n * Optional `warnings` sink collects validation issues; the SAP parser deduplicates identical messages.\n * @internal\n */\nexport type ParsePartProviderOptions = (\n providerOptions: unknown,\n warnings?: SharedV3Warning[],\n) => SAPAIPartProviderOptions | undefined;\n\n/** @internal */\nexport type SAPAIPartProviderOptions = z.infer<typeof sapAIPartProviderOptionsSchema>;\n\n/**\n * Parses per-part `providerOptions['sap-ai']`.\n *\n * Returns `undefined` when the block is absent or invalid. When `warnings` is\n * provided, Zod validation issues are surfaced as `SharedV3Warning` entries so\n * the strategy layer can forward them to the AI SDK call result. Identical messages\n * already present in the sink are not added again.\n * @param providerOptions - Part-level providerOptions bag.\n * @param warnings - Optional sink for Zod validation issues.\n * @returns Validated per-part options, or undefined.\n * @internal\n */\nexport function parseSAPPartProviderOptions(\n providerOptions: unknown,\n warnings?: SharedV3Warning[],\n): SAPAIPartProviderOptions | undefined {\n if (!providerOptions || typeof providerOptions !== \"object\") {\n return undefined;\n }\n const block = (providerOptions as Record<string, unknown>)[SAP_AI_PROVIDER_NAME];\n if (block === undefined) {\n return undefined;\n }\n const parsed = sapAIPartProviderOptionsSchema.safeParse(block);\n if (parsed.success) {\n return parsed.data;\n }\n if (warnings) {\n for (const issue of parsed.error.issues) {\n const path = issue.path.join(\".\");\n const message = `providerOptions['sap-ai']${path ? `.${path}` : \"\"} is invalid: ${issue.message}. The directive was dropped.`;\n if (!warnings.some((w) => (w as { message?: string }).message === message)) {\n warnings.push({ message, type: \"other\" });\n }\n }\n }\n return undefined;\n}\n\n/**\n * Native Orchestration history must preserve signed blocks without dropping unknown fields.\n * @internal\n */\nexport const orchestrationReasoningBlockSchema = z\n .object({\n content: z.string().optional(),\n signature: z.string().optional(),\n })\n .strict();\n\n/** @internal */\nexport const promptTemplateScopeSchema = z.enum([\"tenant\", \"resource_group\"]);\n\n/** @internal */\nexport const promptTemplateRefByIdSchema = z.object({\n id: z.string().min(1, \"Template ID cannot be empty\"),\n scope: promptTemplateScopeSchema.optional(),\n});\n\n/** @internal */\nexport const promptTemplateRefByScenarioNameVersionSchema = z.object({\n name: z.string().min(1, \"Template name cannot be empty\"),\n scenario: z.string().min(1, \"Scenario cannot be empty\"),\n scope: promptTemplateScopeSchema.optional(),\n version: z.string().min(1, \"Version cannot be empty\"),\n});\n\n/** @internal */\nexport const promptTemplateRefSchema = z.union([\n promptTemplateRefByIdSchema,\n promptTemplateRefByScenarioNameVersionSchema,\n]);\n\n/**\n * Partial override of a stored orchestration configuration, forwarded verbatim to the\n * `OrchestrationClient` constructor. Shape is owned by the SAP AI SDK\n * (`OrchestrationConfigRefOverride`); only the transport-level contract is validated here.\n * @internal\n */\nexport const orchestrationConfigRefOverrideSchema = z\n .custom<OrchestrationConfigRefOverride>(\n (value) => typeof value === \"object\" && value !== null && !Array.isArray(value),\n { message: \"overrideConfig must be an object\" },\n )\n .refine(\n (value) => {\n let stream: unknown;\n try {\n stream = value.stream;\n } catch {\n // Hostile input (throwing getter or Proxy trap): treat as invalid shape.\n return false;\n }\n return (\n stream === undefined ||\n (Boolean(stream) && typeof stream === \"object\" && !Array.isArray(stream))\n );\n },\n { message: \"overrideConfig.stream must be an object\" },\n )\n .refine(\n (value) => {\n let stream: unknown;\n try {\n stream = value.stream;\n } catch {\n // Already rejected by the previous refine.\n return true;\n }\n if (stream === undefined || stream === null || typeof stream !== \"object\") {\n return true;\n }\n try {\n return !(\"enabled\" in stream);\n } catch {\n // Hostile Proxy has-trap: treat as invalid shape.\n return false;\n }\n },\n {\n message:\n \"stream.enabled is not allowed in overrideConfig: it is controlled by the call site (stream() or chatCompletion())\",\n },\n );\n\n/** @internal */\nexport const orchestrationConfigRefByIdSchema = z.object({\n id: z.string().min(1, \"Config ID cannot be empty\"),\n overrideConfig: orchestrationConfigRefOverrideSchema.optional(),\n});\n\n/** @internal */\nexport const orchestrationConfigRefByScenarioNameVersionSchema = z.object({\n name: z.string().min(1, \"Config name cannot be empty\"),\n overrideConfig: orchestrationConfigRefOverrideSchema.optional(),\n scenario: z.string().min(1, \"Scenario cannot be empty\"),\n version: z.string().min(1, \"Version cannot be empty\"),\n});\n\n/** @internal */\nexport const orchestrationConfigRefSchema = z.union([\n orchestrationConfigRefByIdSchema,\n orchestrationConfigRefByScenarioNameVersionSchema,\n]);\n\n/**\n * Responses options must be JSON with string metadata values; the delegate validates other fields.\n * @internal\n */\nexport const responsesModelOptionsSchema: z.ZodType<\n JSONObject & { readonly metadata?: null | Record<string, string> }\n> = z\n .object({\n metadata: z.record(z.string(), z.string()).nullable().optional(),\n })\n .catchall(z.json());\n\n/**\n * Orchestration model-level control, distinct from parameters sent to the underlying model.\n * @internal\n */\nexport const dropUnsupportedParamsSchema = z.boolean();\n\n/** @internal */\nexport const sapAILanguageModelProviderOptions = lazySchema(() =>\n zodSchema(\n z.object({\n api: sapAIApiTypeSchema.optional(),\n dropUnsupportedParams: dropUnsupportedParamsSchema.optional(),\n escapeTemplatePlaceholders: z.boolean().optional(),\n includeReasoning: z.boolean().optional(),\n modelParams: modelParamsSchema.optional(),\n orchestrationConfigRef: orchestrationConfigRefSchema.optional(),\n placeholderValues: z.record(z.string(), z.string()).optional(),\n promptTemplateRef: promptTemplateRefSchema.optional(),\n responses: responsesModelOptionsSchema.optional(),\n }),\n ),\n);\n\n/** @internal */\nexport type SAPAILanguageModelProviderOptions = InferSchema<\n typeof sapAILanguageModelProviderOptions\n>;\n\n/** @internal */\nexport const sapAIEmbeddingProviderOptions = lazySchema(() =>\n zodSchema(\n z.object({\n api: sapAIApiTypeSchema.optional(),\n modelParams: embeddingModelParamsSchema.optional(),\n type: z.enum([\"document\", \"query\", \"text\"]).optional(),\n }),\n ),\n);\n\n/** @internal */\nexport type SAPAIEmbeddingProviderOptions = InferSchema<typeof sapAIEmbeddingProviderOptions>;\n","/** Plain-object merge utility with own-property copying. */\n\n/** @internal */\nconst MAX_DEPTH = 100;\n\n/**\n * Recursively merges and copies plain objects without traversing inherited properties.\n * All string keys are preserved as own data properties, including JSON Schema names\n * such as `constructor` and `__proto__`, without changing object prototypes.\n * Arrays and other non-plain values replace earlier values by reference; their\n * contents are not traversed. Undefined sources are skipped, but an explicit\n * undefined property value replaces the earlier property value.\n * @param sources - Objects to merge.\n * @returns Merged object.\n * @throws {Error} When traversed plain objects contain a cycle or exceed the depth limit.\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n ...sources: (Partial<T> | undefined)[]\n): T {\n const result: Record<string, unknown> = {};\n for (const source of sources) {\n if (source != null) mergeInto(result, source, new Set(), 0);\n }\n return result as T;\n}\n\n/**\n * @param value - Value to check.\n * @returns True if value is a plain object.\n * @internal\n */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value) as unknown;\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Merges a source into an owned accumulator with ancestor-based cycle detection.\n * @param target - Private accumulator, never a caller-owned object.\n * @param source - Source object.\n * @param ancestors - Objects in the current recursion path.\n * @param depth - Current recursion depth.\n * @returns The accumulator.\n * @internal\n */\nfunction mergeInto(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n ancestors: Set<object>,\n depth: number,\n): Record<string, unknown> {\n if (depth > MAX_DEPTH) throw new Error(\"Maximum merge depth exceeded\");\n if (ancestors.has(source)) throw new Error(\"Circular reference detected during deep merge\");\n ancestors.add(source);\n\n for (const key of Object.keys(source)) {\n const sourceValue = source[key];\n const targetValue = Object.hasOwn(target, key) ? target[key] : undefined;\n const value = isPlainObject(sourceValue)\n ? mergeInto(isPlainObject(targetValue) ? targetValue : {}, sourceValue, ancestors, depth + 1)\n : sourceValue;\n\n // Define data properties instead of invoking inherited setters such as __proto__.\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true,\n });\n }\n\n ancestors.delete(source);\n return target;\n}\n","/**\n * Package version injected at build time via tsup define.\n * @module\n */\n\ndeclare const __PACKAGE_VERSION__: string | undefined;\n\n/** Current package version from package.json, injected at build time. */\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== \"undefined\" ? __PACKAGE_VERSION__ : \"0.0.0-test\";\n"],"mappings":"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","names":[]}
|
|
@@ -1,9 +1,60 @@
|
|
|
1
1
|
import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
deepMerge,
|
|
4
|
-
|
|
4
|
+
orchestrationReasoningBlockSchema,
|
|
5
5
|
validateModelParamsWithWarnings
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BHA5MIN6.js";
|
|
7
|
+
import {
|
|
8
|
+
normalizeHeaders
|
|
9
|
+
} from "./chunk-QFMHNGLB.js";
|
|
10
|
+
|
|
11
|
+
// src/abort-utils.ts
|
|
12
|
+
function createAbortError(reason) {
|
|
13
|
+
const error = new Error("The operation was aborted.", { cause: reason });
|
|
14
|
+
error.name = "AbortError";
|
|
15
|
+
return error;
|
|
16
|
+
}
|
|
17
|
+
function throwIfAborted(signal) {
|
|
18
|
+
if (signal?.aborted) throw createAbortError(signal.reason);
|
|
19
|
+
}
|
|
20
|
+
function waitWithAbort(pending, signal, onAbortedValue) {
|
|
21
|
+
if (!signal) return pending;
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
let listening = true;
|
|
24
|
+
const cleanup = () => {
|
|
25
|
+
if (!listening) return;
|
|
26
|
+
listening = false;
|
|
27
|
+
signal.removeEventListener("abort", onAbort);
|
|
28
|
+
};
|
|
29
|
+
const onAbort = () => {
|
|
30
|
+
cleanup();
|
|
31
|
+
reject(createAbortError(signal.reason));
|
|
32
|
+
};
|
|
33
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
34
|
+
void pending.then(
|
|
35
|
+
(value) => {
|
|
36
|
+
cleanup();
|
|
37
|
+
if (signal.aborted) {
|
|
38
|
+
try {
|
|
39
|
+
onAbortedValue?.(value);
|
|
40
|
+
} finally {
|
|
41
|
+
reject(createAbortError(signal.reason));
|
|
42
|
+
}
|
|
43
|
+
} else {
|
|
44
|
+
resolve(value);
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
(error) => {
|
|
48
|
+
cleanup();
|
|
49
|
+
reject(error);
|
|
50
|
+
}
|
|
51
|
+
).catch((error) => {
|
|
52
|
+
cleanup();
|
|
53
|
+
reject(error);
|
|
54
|
+
});
|
|
55
|
+
if (signal.aborted) onAbort();
|
|
56
|
+
});
|
|
57
|
+
}
|
|
7
58
|
|
|
8
59
|
// src/strategy-utils.ts
|
|
9
60
|
import { z } from "zod";
|
|
@@ -56,9 +107,23 @@ function buildGenerateResult(config) {
|
|
|
56
107
|
const content = [];
|
|
57
108
|
const tokenUsage = response.getTokenUsage();
|
|
58
109
|
const finishReasonRaw = response.getFinishReason();
|
|
59
|
-
const
|
|
110
|
+
const providerSpecificFields = parseProviderSpecificFields(
|
|
111
|
+
response.getProviderSpecificFields?.()
|
|
112
|
+
);
|
|
113
|
+
const finishReason = mapFinishReason(
|
|
114
|
+
finishReasonRaw,
|
|
115
|
+
getProviderFinishReason(providerSpecificFields)
|
|
116
|
+
);
|
|
60
117
|
const textContent = response.getContent();
|
|
61
118
|
const toolCalls = response.getToolCalls();
|
|
119
|
+
for (const block of response.getReasoningBlocks?.() ?? []) {
|
|
120
|
+
const validatedBlock = orchestrationReasoningBlockSchema.parse(block);
|
|
121
|
+
content.push({
|
|
122
|
+
providerMetadata: buildOrchestrationReasoningMetadata(validatedBlock, providerName),
|
|
123
|
+
text: validatedBlock.content ?? "",
|
|
124
|
+
type: "reasoning"
|
|
125
|
+
});
|
|
126
|
+
}
|
|
62
127
|
if (textContent) content.push({ text: textContent, type: "text" });
|
|
63
128
|
for (const toolCall of toolCalls ?? []) {
|
|
64
129
|
content.push({
|
|
@@ -93,9 +158,10 @@ function buildGenerateResult(config) {
|
|
|
93
158
|
providerMetadata: {
|
|
94
159
|
[providerName]: {
|
|
95
160
|
...buildAnthropicCacheMetadata(tokenUsage),
|
|
96
|
-
finishReason:
|
|
161
|
+
finishReason: finishReason.raw ?? "unknown",
|
|
97
162
|
finishReasonMapped: finishReason,
|
|
98
163
|
...intermediateFailures?.length ? { intermediateFailures: sanitizeAsJSONArray(intermediateFailures) } : {},
|
|
164
|
+
...providerSpecificFields && { providerSpecificFields },
|
|
99
165
|
...requestId ? { requestId } : {},
|
|
100
166
|
version
|
|
101
167
|
}
|
|
@@ -366,8 +432,8 @@ function isZodSchema(obj) {
|
|
|
366
432
|
const record = obj;
|
|
367
433
|
return "_def" in record && "parse" in record && hasCallableParse(record);
|
|
368
434
|
}
|
|
369
|
-
function mapFinishReason(reason) {
|
|
370
|
-
const raw = reason ?? void 0;
|
|
435
|
+
function mapFinishReason(reason, originalReason) {
|
|
436
|
+
const raw = originalReason ?? reason ?? void 0;
|
|
371
437
|
if (!reason) {
|
|
372
438
|
return { raw, unified: "other" };
|
|
373
439
|
}
|
|
@@ -463,6 +529,18 @@ function normalizeEmbedding(embedding) {
|
|
|
463
529
|
return Array.from(float32Array);
|
|
464
530
|
}
|
|
465
531
|
var jsonReplacer = (_key, value) => typeof value === "bigint" ? value.toString() : value;
|
|
532
|
+
function buildOrchestrationReasoningMetadata(block, providerName) {
|
|
533
|
+
return { [providerName]: { reasoningContent: block } };
|
|
534
|
+
}
|
|
535
|
+
function getProviderFinishReason(fields) {
|
|
536
|
+
const reason = fields?.finish_reason;
|
|
537
|
+
return typeof reason === "string" && reason.length > 0 ? reason : void 0;
|
|
538
|
+
}
|
|
539
|
+
function parseProviderSpecificFields(value) {
|
|
540
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) return void 0;
|
|
541
|
+
const fields = sanitizeAsJSONObject(value);
|
|
542
|
+
return fields !== null && typeof fields === "object" && !Array.isArray(fields) ? fields : void 0;
|
|
543
|
+
}
|
|
466
544
|
function sanitizeAsJSONArray(value) {
|
|
467
545
|
try {
|
|
468
546
|
return JSON.parse(JSON.stringify(value, jsonReplacer));
|
|
@@ -479,6 +557,9 @@ function sanitizeAsJSONObject(value) {
|
|
|
479
557
|
}
|
|
480
558
|
|
|
481
559
|
export {
|
|
560
|
+
createAbortError,
|
|
561
|
+
throwIfAborted,
|
|
562
|
+
waitWithAbort,
|
|
482
563
|
buildAnthropicCacheMetadata,
|
|
483
564
|
buildEmbeddingResult,
|
|
484
565
|
buildGenerateResult,
|
|
@@ -495,6 +576,9 @@ export {
|
|
|
495
576
|
mapToolChoice,
|
|
496
577
|
mergeRequestConfig,
|
|
497
578
|
normalizeEmbedding,
|
|
579
|
+
buildOrchestrationReasoningMetadata,
|
|
580
|
+
getProviderFinishReason,
|
|
581
|
+
parseProviderSpecificFields,
|
|
498
582
|
sanitizeAsJSONArray
|
|
499
583
|
};
|
|
500
|
-
//# sourceMappingURL=chunk-
|
|
584
|
+
//# sourceMappingURL=chunk-DLGBK3C3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/abort-utils.ts","../src/strategy-utils.ts"],"sourcesContent":["/** Cancellation helpers shared by SDK calls and stream transports. */\n/**\n * Preserves a caller-provided reason while retaining standard abort classification.\n * @param reason - The original cancellation reason.\n * @returns An AbortError carrying the reason as its cause.\n * @internal\n */\nexport function createAbortError(reason: unknown): Error {\n const error = new Error(\"The operation was aborted.\", { cause: reason });\n error.name = \"AbortError\";\n return error;\n}\n/**\n * Preserves cancellation classification for arbitrary caller-provided reasons.\n * @param signal - The caller's abort signal.\n */\nexport function throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) throw createAbortError(signal.reason);\n}\n\n/**\n * Cancels a caller's wait even when a SAP preparation step cannot accept a signal.\n * @param pending - SDK work whose late rejection must remain observed.\n * @param signal - Cancellation for the caller's wait.\n * @param onAbortedValue - Releases a result delivered after cancellation.\n * @returns The result or a classified abort error.\n */\nexport function waitWithAbort<T>(\n pending: Promise<T>,\n signal: AbortSignal | undefined,\n onAbortedValue?: (value: T) => void,\n): Promise<T> {\n if (!signal) return pending;\n return new Promise<T>((resolve, reject) => {\n let listening = true;\n const cleanup = () => {\n if (!listening) return;\n listening = false;\n signal.removeEventListener(\"abort\", onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(createAbortError(signal.reason));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n void pending\n .then(\n (value) => {\n cleanup();\n if (signal.aborted) {\n try {\n onAbortedValue?.(value);\n } finally {\n reject(createAbortError(signal.reason));\n }\n } else {\n resolve(value);\n }\n },\n (error: unknown) => {\n cleanup();\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- Preserve SDK rejection values for the shared error converter.\n reject(error);\n },\n )\n .catch((error: unknown) => {\n cleanup();\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- Preserve synchronous disposal failures without unhandled rejections.\n reject(error);\n });\n if (signal.aborted) onAbort();\n });\n}\n","/**\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 { ReasoningBlock } from \"@sap-ai-sdk/orchestration\";\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 {\n orchestrationReasoningBlockSchema,\n validateModelParamsWithWarnings,\n} 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 getProviderSpecificFields?(): unknown;\n getReasoningBlocks?(): ReasoningBlock[] | undefined;\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 providerSpecificFields = parseProviderSpecificFields(\n response.getProviderSpecificFields?.(),\n );\n const finishReason = mapFinishReason(\n finishReasonRaw,\n getProviderFinishReason(providerSpecificFields),\n );\n\n const textContent = response.getContent();\n const toolCalls = response.getToolCalls();\n for (const block of response.getReasoningBlocks?.() ?? []) {\n const validatedBlock = orchestrationReasoningBlockSchema.parse(block);\n content.push({\n providerMetadata: buildOrchestrationReasoningMetadata(validatedBlock, providerName),\n text: validatedBlock.content ?? \"\",\n type: \"reasoning\",\n });\n }\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: finishReason.raw ?? \"unknown\",\n finishReasonMapped: finishReason,\n ...(intermediateFailures?.length\n ? { intermediateFailures: sanitizeAsJSONArray(intermediateFailures) }\n : {}),\n ...(providerSpecificFields && { providerSpecificFields }),\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 SAP-harmonized finish reason used for unified classification.\n * @param originalReason - An optional original provider reason, retained without remapping.\n * @returns The unified finish reason with both raw and unified representations.\n * @internal\n */\nexport function mapFinishReason(\n reason: null | string | undefined,\n originalReason?: string,\n): LanguageModelV3FinishReason {\n const raw = originalReason ?? 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 * Creates replayable native Orchestration metadata for a single reasoning block.\n * @param block - Complete native block, including an optional opaque signature.\n * @param providerName - Configured provider namespace.\n * @returns Metadata retained by AI SDK reasoning history.\n * @internal\n */\nexport function buildOrchestrationReasoningMetadata(\n block: ReasoningBlock,\n providerName: string,\n): SharedV3ProviderMetadata {\n return { [providerName]: { reasoningContent: block } };\n}\n\n/**\n * Reads an original provider finish reason without replacing it with malformed diagnostics.\n * @param fields - Provider-specific diagnostics.\n * @returns A non-empty original reason when available.\n * @internal\n */\nexport function getProviderFinishReason(fields: JSONObject | undefined): string | undefined {\n const reason = fields?.finish_reason;\n return typeof reason === \"string\" && reason.length > 0 ? reason : undefined;\n}\n\n/**\n * Retains JSON-safe provider-specific diagnostics without accepting non-record containers.\n * @param value - Optional fields from a native SAP choice.\n * @returns A JSON-safe record, or undefined for an invalid container.\n * @internal\n */\nexport function parseProviderSpecificFields(value: unknown): JSONObject | undefined {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n const fields: unknown = sanitizeAsJSONObject(value);\n return fields !== null && typeof fields === \"object\" && !Array.isArray(fields)\n ? (fields as JSONObject)\n : undefined;\n}\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":[]}
|