@jerome-benoit/sap-ai-provider-v2 5.0.2 → 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-LEME2MFD.js → chunk-DLGBK3C3.js} +91 -7
- package/dist/chunk-DLGBK3C3.js.map +1 -0
- package/dist/{chunk-NLMWIVG7.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-77JSAAPE.js → chunk-QFMHNGLB.js} +56 -218
- package/dist/chunk-QFMHNGLB.js.map +1 -0
- package/dist/{chunk-U6WJSLR7.js → chunk-QQQYMQPU.js} +19 -10
- package/dist/chunk-QQQYMQPU.js.map +1 -0
- package/dist/{chunk-QZOZ3PZT.js → chunk-ZOBD7PXJ.js} +118 -22
- package/dist/chunk-ZOBD7PXJ.js.map +1 -0
- package/dist/{foundation-models-embedding-model-strategy-A3WDDAYK.js → foundation-models-embedding-model-strategy-3WAKJXBY.js} +5 -4
- package/dist/{foundation-models-embedding-model-strategy-A3WDDAYK.js.map → foundation-models-embedding-model-strategy-3WAKJXBY.js.map} +1 -1
- package/dist/{foundation-models-language-model-strategy-6U6KK6KH.js → foundation-models-language-model-strategy-PJ26VXEA.js} +22 -9
- package/dist/foundation-models-language-model-strategy-PJ26VXEA.js.map +1 -0
- package/dist/index.cjs +1903 -384
- 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-JO3QH5MR.js → orchestration-embedding-model-strategy-AZ76XLMD.js} +6 -5
- package/dist/{orchestration-embedding-model-strategy-JO3QH5MR.js.map → orchestration-embedding-model-strategy-AZ76XLMD.js.map} +1 -1
- package/dist/{orchestration-language-model-strategy-MBVA7BYX.js → orchestration-language-model-strategy-CT6RHCYO.js} +57 -19
- 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-77JSAAPE.js.map +0 -1
- package/dist/chunk-LEME2MFD.js.map +0 -1
- package/dist/chunk-NLMWIVG7.js.map +0 -1
- package/dist/chunk-QZOZ3PZT.js.map +0 -1
- package/dist/chunk-U6WJSLR7.js.map +0 -1
- package/dist/chunk-YP3AADWD.js.map +0 -1
- package/dist/foundation-models-language-model-strategy-6U6KK6KH.js.map +0 -1
- package/dist/orchestration-language-model-strategy-MBVA7BYX.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/convert-to-sap-messages.ts","../src/sap-ai-provider-options.ts","../src/deep-merge.ts","../src/sap-ai-error.ts","../src/strategy-utils.ts","../src/version.ts","../src/base-embedding-model-strategy.ts","../src/foundation-models-embedding-model-strategy.ts","../src/sap-ai-validation.ts","../src/orchestration-embedding-model-strategy.ts","../src/stream-transformer.ts","../src/base-language-model-strategy.ts","../src/foundation-models-language-model-strategy.ts","../src/orchestration-language-model-strategy.ts","../src/index-v2.ts","../src/sap-ai-adapters-v3-to-v2.ts","../src/sap-ai-embedding-model.ts","../src/sap-ai-strategy.ts","../src/sap-ai-embedding-model-v2.ts","../src/sap-ai-language-model.ts","../src/sap-ai-language-model-v2.ts","../src/sap-ai-provider-v2.ts","../src/sap-ai-settings.ts"],"sourcesContent":["import type {\n AssistantChatMessage,\n ChatMessage,\n SystemChatMessage,\n ToolChatMessage,\n UserChatMessage,\n UserChatMessageContentItem,\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 * Issues reported by the parser are forwarded to the AI SDK call result.\n * The SAP parser deduplicates identical messages rather than warning per occurrence.\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\nconst SUPPORTED_IMAGE_FORMATS = [\"image/png\", \"image/jpeg\", \"image/jpg\", \"image/gif\", \"image/webp\"];\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 * Serializes tool output, preserving BigInt values as strings and using a text\n * representation when JSON serialization is unavailable (for example, cycles).\n * @param value - The tool output to serialize.\n * @returns JSON or fallback text.\n * @throws {InvalidPromptError} When neither JSON nor text serialization is possible.\n * @internal\n */\nfunction safeJsonStringify(value: unknown): string {\n try {\n const serialized: unknown = JSON.stringify(value, (_key, val) =>\n typeof val === \"bigint\" ? val.toString() : (val as unknown),\n );\n if (typeof serialized === \"string\") return serialized;\n } catch {\n // Fall back to the output's text representation.\n }\n try {\n return String(value);\n } catch {\n throw new InvalidPromptError({ message: \"Tool output cannot be serialized.\", prompt: value });\n }\n}\n\n/**\n * Serializes tool arguments, rejecting values that cannot be represented as JSON.\n * @param input - Tool arguments or an already serialized JSON string.\n * @returns Serialized arguments.\n */\nfunction serializeToolCallInput(input: unknown): string {\n try {\n if (typeof input === \"string\") {\n JSON.parse(input);\n return input;\n }\n const serialized: unknown = JSON.stringify(input);\n if (typeof serialized === \"string\") return serialized;\n } catch {\n // Report invalid arguments as a prompt error instead of emitting an invalid SAP request.\n }\n throw new InvalidPromptError({\n message: \"Tool call input must be JSON-serializable.\",\n prompt: input,\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 * Encodes bytes as base64 using `btoa`, without the Node.js `Buffer` global.\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 // Native validation rejects detached and out-of-bounds views, including empty ones.\n Uint8Array.prototype.at.call(bytes, 0);\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 * Maps V3 message roles to SAP messages:\n * - `system` → `SystemChatMessage`\n * - `user` (text/images/files) → `UserChatMessage`\n * - `assistant` (text/tool-calls, optionally reasoning) → `AssistantChatMessage`\n * - `tool` (direct text values; other output variants as JSON) → `ToolChatMessage`\n * Unsupported assistant parts and non-result tool parts are ignored, with\n * warnings when a warning sink is supplied.\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 user content or file data types.\n * @throws {InvalidPromptError} When message roles or tool arguments are invalid, or tool output cannot be serialized.\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: undefined | { cacheControl?: CacheControl; text: string }[] = parser\n ? []\n : undefined;\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 reasoning = `<think>${part.text}</think>`;\n text += reasoning;\n textParts?.push({ text: reasoning });\n }\n break;\n }\n case \"text\": {\n if (!part.text) break;\n const partOpts = parsePart(part.providerOptions);\n const cacheControl = partOpts?.cacheControl;\n text += part.text;\n textParts?.push(\n cacheControl ? { cacheControl, text: part.text } : { text: part.text },\n );\n if (cacheControl) anyCacheControl = true;\n break;\n }\n case \"tool-call\": {\n const partOpts = parsePart(part.providerOptions);\n if (partOpts?.cacheControl) {\n pushWarningOnce(\n \"cacheControl on assistant tool-call\",\n \"SAP orchestration does not expose cache_control on the assistant tool-call envelope.\",\n );\n }\n const argumentsJson = serializeToolCallInput(part.input);\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:\n anyCacheControl && textParts\n ? textParts.map((p) => wrapAsTextContent(maybeEscape(p.text), p.cacheControl))\n : maybeEscape(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 outputText =\n part.output.type === \"text\" ? part.output.value : safeJsonStringify(part.output);\n const escaped = maybeEscape(outputText);\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: UserChatMessageContentItem[] = [];\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 const normalizedMediaType = part.mediaType.toLowerCase();\n if (normalizedMediaType.startsWith(\"image/\")) {\n const isWildcardImageUrl =\n getURLHref(part.data) !== undefined && normalizedMediaType === \"image/*\";\n if (!isWildcardImageUrl && !SUPPORTED_IMAGE_FORMATS.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, \"{\");\n}\n\n/**\n * Returns a file URL or builds a base64 data URL from inline file data.\n *\n * Genuine URL objects pass through without being fetched. Base64 strings are\n * embedded verbatim without validation; Uint8Array and ArrayBuffer inputs are\n * encoded. Buffer-like objects must have a custom `toString(\"base64\")` method\n * returning canonical base64. Other objects are rejected.\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 original URL string or an inline data URL.\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","/**\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 { 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\"]);\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/** @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/** @internal */\nexport const sapAILanguageModelProviderOptions = lazySchema(() =>\n zodSchema(\n z.object({\n api: sapAIApiTypeSchema.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 }),\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","/** Error conversion utilities for SAP AI Core to Vercel AI SDK error types. */\nimport type { OrchestrationErrorResponse } from \"@sap-ai-sdk/orchestration\";\n\nimport {\n APICallError,\n InvalidPromptError,\n LoadAPIKeyError,\n NoSuchModelError,\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\";\nimport { isErrorWithCause } from \"@sap-cloud-sdk/util\";\n\nimport type { SAPAIApiType } from \"./sap-ai-settings.js\";\n\ninterface AxiosResponse {\n data?: unknown;\n headers?: unknown;\n status?: number;\n}\n\n/** Request metadata used when translating SAP failures. */\ninterface ErrorContext {\n httpStatusCode?: number;\n modelId?: string;\n modelType?: \"embeddingModel\" | \"languageModel\";\n operation?: string;\n requestBody?: unknown;\n responseHeaders?: Record<string, string>;\n url?: string;\n}\n\n/** Diagnostic response body is retained explicitly, never appended to the message. */\ninterface ResolvedErrorContext extends ErrorContext {\n responseBody?: string;\n}\n\n/**\n * @internal\n */\nconst HTTP_STATUS = {\n BAD_REQUEST: 400,\n CLIENT_CLOSED_REQUEST: 499,\n CONFLICT: 409,\n FORBIDDEN: 403,\n INTERNAL_ERROR: 500,\n NOT_FOUND: 404,\n RATE_LIMIT: 429,\n REQUEST_TIMEOUT: 408,\n SERVICE_UNAVAILABLE: 503,\n UNAUTHORIZED: 401,\n} as const;\n\n/**\n * Error message matchers for categorization and retryability.\n * @internal\n */\nconst ERROR_MATCHERS = [\n {\n category: \"network\",\n isRetryable: true,\n keywords: [\"econnrefused\", \"enotfound\", \"network\", \"timeout\"],\n statusCode: HTTP_STATUS.SERVICE_UNAVAILABLE,\n },\n {\n category: \"destination\",\n isRetryable: false,\n keywords: [\"could not resolve destination\"],\n message: (original: string) =>\n `SAP AI Core destination error: ${original}\\n\\n` +\n `Check your destination configuration or provide a valid destinationName.`,\n statusCode: HTTP_STATUS.BAD_REQUEST,\n },\n {\n category: \"content filtered\",\n isRetryable: false,\n keywords: [\"filtered by the output filter\"],\n message: (original: string) =>\n `Content was filtered: ${original}\\n\\n` +\n `The model's response was blocked by content safety filters. Try a different prompt.`,\n statusCode: HTTP_STATUS.BAD_REQUEST,\n },\n {\n category: \"stream consumption\",\n isRetryable: false,\n keywords: [\"consumed stream\"],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"streaming\",\n isRetryable: true,\n keywords: [\n \"iterating over\",\n \"parse message into json\",\n \"received from\",\n \"no body\",\n \"invalid sse payload\",\n ],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"configuration\",\n isRetryable: false,\n keywords: [\n \"prompt template or messages must be defined\",\n \"filtering parameters cannot be empty\",\n \"templating yaml string must be non-empty\",\n \"could not access response data\",\n \"could not parse json\",\n \"error parsing yaml\",\n \"yaml does not conform\",\n \"validation errors\",\n ],\n statusCode: HTTP_STATUS.BAD_REQUEST,\n },\n {\n category: \"environment\",\n isRetryable: false,\n keywords: [\"buffer is not available as globals\"],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"response stream\",\n isRetryable: false,\n keywords: [\"response stream is undefined\"],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"response processing\",\n isRetryable: true,\n keywords: [\n \"response is required to process\",\n \"stream is still open\",\n \"data is not available yet\",\n ],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"deployment retrieval\",\n isRetryable: true,\n keywords: [\"failed to fetch the list of deployments\"],\n statusCode: HTTP_STATUS.SERVICE_UNAVAILABLE,\n },\n {\n category: \"stream buffer\",\n isRetryable: false,\n keywords: [\"received non-uint8array\"],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n] as const;\n\n/**\n * Keywords that indicate an authentication error.\n * @internal\n */\nconst AUTHENTICATION_ERROR_KEYWORDS = [\n \"authentication\",\n \"unauthorized\",\n \"aicore_service_key\",\n \"invalid credentials\",\n \"service credentials\",\n \"service binding\",\n] as const;\n\n/**\n * Keywords that indicate a deployment/model resolution error.\n * @internal\n */\nconst DEPLOYMENT_ERROR_KEYWORDS = [\n \"failed to resolve deployment\",\n \"no deployment matched\",\n] as const;\n\n/**\n * Error thrown when attempting to switch APIs at invocation time with conflicting model settings.\n * @example\n * ```typescript\n * const model = provider(\"gpt-4.1\", { filtering: { ... } });\n *\n * await generateText({\n * model,\n * providerOptions: { [SAP_AI_PROVIDER_NAME]: { api: \"foundation-models\" } },\n * prompt: \"Hello\",\n * });\n * // Throws: ApiSwitchError(\"orchestration\", \"foundation-models\", \"filtering\")\n * ```\n * @see {@link validateSettings} - Main validation function that throws this error\n * @see {@link UnsupportedFeatureError} - Related error for features unsupported by an API\n */\nexport class ApiSwitchError extends Error {\n /**\n * Creates a new ApiSwitchError.\n * @param fromApi - The API the model was configured with.\n * @param toApi - The API being switched to at invocation time.\n * @param conflictingFeature - The feature that prevents the API switch.\n */\n constructor(\n public readonly fromApi: SAPAIApiType,\n public readonly toApi: SAPAIApiType,\n public readonly conflictingFeature: string,\n ) {\n super(\n `Cannot switch from ${fromApi} to ${toApi} API at invocation time because ` +\n `${conflictingFeature} would be ignored. Create a new model instance without ` +\n `${fromApi}-specific features, or keep using the ${fromApi} API.`,\n );\n this.name = \"ApiSwitchError\";\n }\n}\n\n/**\n * Error thrown when a feature is used with an incompatible API.\n * @example\n * ```typescript\n * throw new UnsupportedFeatureError(\"Content filtering\", \"foundation-models\", \"orchestration\");\n * // Rejects the request: content filtering requires the Orchestration API.\n * ```\n * @see {@link validateSettings} - Main validation function that throws this error\n * @see {@link ApiSwitchError} - Related error for API switching conflicts\n */\nexport class UnsupportedFeatureError extends Error {\n /**\n * Creates a new UnsupportedFeatureError.\n * @param feature - The name of the unsupported feature (e.g., \"Content filtering\").\n * @param api - The API being used that does not support the feature.\n * @param suggestedApi - The API that supports this feature.\n */\n constructor(\n public readonly feature: string,\n public readonly api: SAPAIApiType,\n public readonly suggestedApi: SAPAIApiType,\n ) {\n const apiName = api === \"foundation-models\" ? \"Foundation Models\" : \"Orchestration\";\n const suggestedApiName =\n suggestedApi === \"foundation-models\" ? \"Foundation Models\" : \"Orchestration\";\n super(`${feature} is not supported by ${apiName} API. Use ${suggestedApiName} API instead.`);\n this.name = \"UnsupportedFeatureError\";\n }\n}\n\n/**\n * Converts a structured SAP error response to the appropriate Vercel AI SDK error.\n * @param errorResponse - SAP orchestration error response.\n * @param context - Request context.\n * @param context.modelId - Known requested model ID, preferred over message-based extraction.\n * @param context.modelType - Requested model kind (defaults to languageModel).\n * @param context.httpStatusCode - Fallback HTTP status when the body code is missing or outside the HTTP status range.\n * @param context.requestBody - Original request body.\n * @param context.responseHeaders - Response headers.\n * @param context.url - Request URL.\n * @returns LoadAPIKeyError for 401/403, NoSuchModelError for 404, or APICallError otherwise.\n */\nexport function convertSAPErrorToAPICallError(\n errorResponse: OrchestrationErrorResponse,\n context?: ErrorContext,\n): APICallError | LoadAPIKeyError | NoSuchModelError {\n const { code, location, message, requestId } = extractErrorFields(errorResponse);\n\n const statusCode = getStatusCodeFromSAPError(code, context?.httpStatusCode);\n\n const responseBody = JSON.stringify({\n error: {\n code,\n location,\n message,\n request_id: requestId,\n },\n });\n\n let enhancedMessage = message;\n\n if (statusCode === HTTP_STATUS.UNAUTHORIZED || statusCode === HTTP_STATUS.FORBIDDEN) {\n enhancedMessage +=\n \"\\n\\nAuthentication failed. Verify your AICORE_SERVICE_KEY environment variable is set correctly.\" +\n \"\\nSee: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/create-service-key\";\n if (requestId) {\n enhancedMessage += `\\nRequest ID: ${requestId}`;\n }\n return new LoadAPIKeyError({\n message: enhancedMessage,\n });\n }\n\n if (statusCode === HTTP_STATUS.NOT_FOUND) {\n enhancedMessage +=\n \"\\n\\nResource not found. The model or deployment may not exist in your SAP AI Core instance.\" +\n \"\\nSee: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/create-deployment-for-orchestration\";\n if (requestId) {\n enhancedMessage += `\\nRequest ID: ${requestId}`;\n }\n const modelId = context?.modelId ?? extractModelIdentifier(message, location);\n return new NoSuchModelError({\n message: enhancedMessage,\n modelId: modelId ?? \"unknown\",\n modelType: context?.modelType ?? \"languageModel\",\n });\n }\n\n if (statusCode === HTTP_STATUS.RATE_LIMIT) {\n enhancedMessage +=\n \"\\n\\nRate limit exceeded. Please try again later or contact your SAP administrator.\" +\n \"\\nSee: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/rate-limits\";\n } else if (statusCode >= HTTP_STATUS.INTERNAL_ERROR) {\n enhancedMessage +=\n \"\\n\\nSAP AI Core service error. This is typically a temporary issue. Retries depend on the caller's retry configuration.\" +\n \"\\nSee: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/troubleshooting\";\n } else if (location) {\n enhancedMessage += `\\n\\nError location: ${location}`;\n }\n\n if (requestId) {\n enhancedMessage += `\\nRequest ID: ${requestId}`;\n }\n\n return new APICallError({\n isRetryable: isRetryable(statusCode),\n message: enhancedMessage,\n requestBodyValues: context?.requestBody,\n responseBody,\n responseHeaders: context?.responseHeaders,\n statusCode,\n url: context?.url ?? \"\",\n });\n}\n\n/**\n * Converts SAP failures while preserving standard request and API errors across SDK versions.\n * @param error - Error to convert.\n * @param context - Request context.\n * @param context.modelId - Known requested model ID, preferred over message-based extraction.\n * @param context.modelType - Requested model kind (defaults to languageModel).\n * @param context.operation - Operation name.\n * @param context.requestBody - Original request body.\n * @param context.responseHeaders - Response headers.\n * @param context.url - Request URL.\n * @returns Vercel AI SDK error.\n */\nexport function convertToAISDKError(\n error: unknown,\n context?: ErrorContext,\n):\n | APICallError\n | InvalidPromptError\n | LoadAPIKeyError\n | NoSuchModelError\n | UnsupportedFunctionalityError {\n if (\n APICallError.isInstance(error) ||\n LoadAPIKeyError.isInstance(error) ||\n NoSuchModelError.isInstance(error) ||\n InvalidPromptError.isInstance(error) ||\n UnsupportedFunctionalityError.isInstance(error)\n ) {\n return error;\n }\n\n const { aborted, response, rootError } = inspectError(error);\n const responseHeaders = context?.responseHeaders ?? normalizeHeaders(response?.headers);\n if (!aborted) {\n const errorResponse = findStructuredErrorResponse(\n rootError instanceof SyntaxError ? undefined : rootError,\n response?.data,\n );\n if (errorResponse) {\n return convertSAPErrorToAPICallError(errorResponse, {\n ...context,\n httpStatusCode: response?.status ?? context?.httpStatusCode,\n responseHeaders,\n });\n }\n }\n\n const resolvedContext: ResolvedErrorContext = {\n ...context,\n responseBody: serializeAxiosResponseData(response?.data),\n responseHeaders,\n };\n if (aborted) {\n return createAPICallError(\n error,\n {\n isRetryable: false,\n message: \"Request was aborted by the client\",\n statusCode: HTTP_STATUS.CLIENT_CLOSED_REQUEST,\n },\n resolvedContext,\n );\n }\n\n if (isHttpStatus(response?.status)) {\n return createAPICallError(\n error,\n {\n isRetryable: isRetryable(response.status),\n message:\n rootError instanceof SyntaxError && error instanceof Error\n ? error.message\n : rootError instanceof Error\n ? rootError.message\n : \"SAP AI Core request failed\",\n statusCode: response.status,\n },\n resolvedContext,\n );\n }\n\n // Native parser messages can contain credential or response fragments. Keep the\n // enclosing SDK message instead, with the original chain available only as cause.\n if (rootError instanceof SyntaxError) {\n return createAPICallError(\n error,\n {\n isRetryable: false,\n message:\n error instanceof Error && error !== rootError\n ? error.message\n : \"Failed to parse SAP AI Core data.\",\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n resolvedContext,\n );\n }\n\n if (rootError instanceof Error) {\n const errorMsg = rootError.message.toLowerCase();\n const originalErrorMsg = rootError.message;\n\n if (AUTHENTICATION_ERROR_KEYWORDS.some((keyword) => errorMsg.includes(keyword))) {\n return new LoadAPIKeyError({\n message:\n `SAP AI Core authentication failed: ${originalErrorMsg}\\n\\n` +\n `Make sure your AICORE_SERVICE_KEY environment variable is set correctly.\\n` +\n `See: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/create-service-key`,\n });\n }\n\n if (DEPLOYMENT_ERROR_KEYWORDS.some((keyword) => errorMsg.includes(keyword))) {\n const modelId = context?.modelId ?? extractModelIdentifier(originalErrorMsg);\n return new NoSuchModelError({\n message:\n `SAP AI Core deployment error: ${originalErrorMsg}\\n\\n` +\n `Make sure you have a running orchestration deployment in your SAP AI Core instance.\\n` +\n `See: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/create-deployment-for-orchestration`,\n modelId: modelId ?? \"unknown\",\n modelType: context?.modelType ?? \"languageModel\",\n });\n }\n\n const statusMatch = /status code (\\d+)/i.exec(originalErrorMsg);\n const extractedStatus = statusMatch?.[1] ? Number.parseInt(statusMatch[1], 10) : undefined;\n if (isHttpStatus(extractedStatus)) {\n return createAPICallError(\n error,\n {\n isRetryable: isRetryable(extractedStatus),\n message: `SAP AI Core request failed: ${originalErrorMsg}`,\n statusCode: extractedStatus,\n },\n resolvedContext,\n );\n }\n\n for (const matcher of ERROR_MATCHERS) {\n if (matcher.keywords.some((keyword) => errorMsg.includes(keyword))) {\n const message =\n \"message\" in matcher\n ? matcher.message(originalErrorMsg)\n : `SAP AI Core ${matcher.category} error: ${originalErrorMsg}`;\n return createAPICallError(\n error,\n {\n isRetryable: matcher.isRetryable,\n message,\n statusCode: matcher.statusCode,\n },\n resolvedContext,\n );\n }\n }\n }\n\n const message =\n rootError instanceof Error\n ? rootError.message\n : typeof rootError === \"string\"\n ? rootError\n : \"Unknown error occurred\";\n\n const fullMessage = context?.operation\n ? `SAP AI Core ${context.operation} failed: ${message}`\n : `SAP AI Core error: ${message}`;\n\n return createAPICallError(\n error,\n {\n isRetryable: false,\n message: fullMessage,\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n resolvedContext,\n );\n}\n\n/**\n * Normalizes various header formats to a string record.\n * @param headers - Headers to normalize.\n * @returns Normalized headers record.\n */\nexport function normalizeHeaders(headers: unknown): Record<string, string> | undefined {\n if (!headers || typeof headers !== \"object\") return undefined;\n\n if (typeof Headers !== \"undefined\" && headers instanceof Headers) {\n const out = Object.fromEntries(headers.entries());\n return Object.keys(out).length === 0 ? undefined : out;\n }\n\n const record = headers as Record<string, unknown>;\n const entries = Object.entries(record).flatMap(([key, value]) => {\n const k = key.toLowerCase();\n if (typeof value === \"string\") return [[k, value]];\n if (Array.isArray(value)) {\n const strings = value.filter((item): item is string => typeof item === \"string\").join(\"; \");\n return strings.length > 0 ? [[k, strings]] : [];\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return [[k, String(value)]];\n }\n return [];\n });\n\n if (entries.length === 0) return undefined;\n return Object.fromEntries(entries) as Record<string, string>;\n}\n\n/**\n * Builds an API error with diagnostics kept separate from the message.\n * @param error - Original error.\n * @param options - Error options.\n * @param options.isRetryable - Whether error is retryable.\n * @param options.message - Error message.\n * @param options.statusCode - HTTP status code.\n * @param context - Request context.\n * @param context.operation - Operation name.\n * @param context.requestBody - Original request body.\n * @param context.responseHeaders - Response headers.\n * @param context.url - Request URL.\n * @returns API call error.\n * @internal\n */\nfunction createAPICallError(\n error: unknown,\n options: {\n isRetryable: boolean;\n message: string;\n statusCode: number;\n },\n context?: ResolvedErrorContext,\n): APICallError {\n return new APICallError({\n cause: error,\n isRetryable: options.isRetryable,\n message: options.message,\n requestBodyValues: context?.requestBody,\n responseBody: context?.responseBody,\n responseHeaders: context?.responseHeaders,\n statusCode: options.statusCode,\n url: context?.url ?? \"\",\n });\n}\n\n/**\n * @param response - SAP orchestration error response.\n * @returns Destructured error fields (message, code, location, requestId).\n * @internal\n */\nfunction extractErrorFields(response: OrchestrationErrorResponse): {\n code?: number;\n location?: string;\n message: string;\n requestId?: string;\n} {\n const innerError = response.error;\n if (Array.isArray(innerError)) {\n const first = innerError[0] as\n undefined | { code?: number; location?: string; message: string; request_id?: string };\n return {\n code: first?.code,\n location: first?.location,\n message: first?.message ?? \"Unknown SAP AI error\",\n requestId: first?.request_id,\n };\n }\n const entry = innerError as {\n code?: number;\n location?: string;\n message: string;\n request_id?: string;\n };\n return {\n code: entry.code,\n location: entry.location,\n message: entry.message,\n requestId: entry.request_id,\n };\n}\n\n/**\n * @param message - Error message.\n * @param location - Error location.\n * @returns Extracted model identifier.\n * @internal\n */\nfunction extractModelIdentifier(message: string, location?: string): string | undefined {\n const patterns = [\n /deployment[:\\s]+([a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*)/i,\n /model[:\\s]+([a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*)/i,\n /resource[:\\s]+([a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*)/i,\n ];\n\n for (const pattern of patterns) {\n const match = pattern.exec(message);\n if (match?.[1]) {\n return match[1];\n }\n }\n\n if (location) {\n const locationMatch = /([a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*)/.exec(location);\n if (locationMatch?.[1]) {\n return locationMatch[1];\n }\n }\n\n return undefined;\n}\n\n/**\n * @param rootError - Root cause after inspecting the chain.\n * @param axiosData - Response data retained from an Axios wrapper.\n * @returns A structured SAP response when available.\n */\nfunction findStructuredErrorResponse(\n rootError: unknown,\n axiosData: unknown,\n): OrchestrationErrorResponse | undefined {\n if (isStructuredErrorResponse(rootError)) return rootError;\n if (isStructuredErrorResponse(axiosData)) return axiosData;\n if (rootError instanceof Error) {\n const parsed = tryExtractSAPErrorFromMessage(rootError.message);\n if (isStructuredErrorResponse(parsed)) return parsed;\n }\n return undefined;\n}\n\n/**\n * @param code - SAP error code.\n * @param httpStatusCode - HTTP status code from the response, used as fallback.\n * @returns HTTP status code.\n * @internal\n */\nfunction getStatusCodeFromSAPError(code?: number, httpStatusCode?: number): number {\n if (isHttpStatus(code)) {\n return code;\n }\n\n if (isHttpStatus(httpStatusCode)) {\n return httpStatusCode;\n }\n\n return HTTP_STATUS.INTERNAL_ERROR;\n}\n\n/**\n * Inspects native and SAP cause chains once, keeping transport metadata from wrappers.\n * @param error - Raw SDK error.\n * @returns The terminal cause, nearest Axios response, and cancellation state.\n */\nfunction inspectError(error: unknown): {\n aborted: boolean;\n response?: AxiosResponse;\n rootError: unknown;\n} {\n const seen = new Set<object>();\n let rootError = error;\n let current = error;\n let response: AxiosResponse | undefined;\n let aborted = false;\n while (typeof current === \"object\" && current !== null && !seen.has(current)) {\n seen.add(current);\n rootError = current;\n aborted ||= isAbortError(current);\n const entry = current as { cause?: unknown; isAxiosError?: boolean; response?: AxiosResponse };\n if (response === undefined && entry.isAxiosError === true) response = entry.response;\n // SAP ErrorWithCause exposes a native cause too. Avoid its recursive rootCause\n // getter when that cause is present so cyclic chains cannot overflow the stack.\n const cause =\n \"cause\" in entry\n ? entry.cause\n : current instanceof Error && isErrorWithCause(current)\n ? current.rootCause\n : undefined;\n if (cause === undefined || (typeof cause === \"object\" && cause !== null && seen.has(cause))) {\n break;\n }\n rootError = cause;\n current = cause;\n }\n return { aborted, response, rootError };\n}\n\n/**\n * Identifies native aborts and Axios cancellations retained in SAP error causes.\n * @param error - Error to check.\n * @returns Whether the error represents request cancellation.\n * @internal\n */\nfunction isAbortError(error: object): boolean {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n return true;\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n return true;\n }\n const transportError = error as { code?: unknown; isAxiosError?: unknown };\n return transportError.isAxiosError === true && transportError.code === \"ERR_CANCELED\";\n}\n\n/**\n * @param status - Candidate HTTP status.\n * @returns Whether the value is an integer HTTP status.\n */\nfunction isHttpStatus(status: unknown): status is number {\n return typeof status === \"number\" && Number.isInteger(status) && status >= 100 && status < 600;\n}\n\n/**\n * @param statusCode - HTTP status code.\n * @returns True if error is retryable.\n * @internal\n */\nfunction isRetryable(statusCode: number): boolean {\n return (\n statusCode === HTTP_STATUS.REQUEST_TIMEOUT ||\n statusCode === HTTP_STATUS.CONFLICT ||\n statusCode === HTTP_STATUS.RATE_LIMIT ||\n (statusCode >= HTTP_STATUS.INTERNAL_ERROR && statusCode < 600)\n );\n}\n\n/**\n * @param error - Error to check.\n * @returns True if error is an orchestration error response.\n * @internal\n */\nfunction isStructuredErrorResponse(error: unknown): error is OrchestrationErrorResponse {\n if (error === null || typeof error !== \"object\" || !(\"error\" in error)) {\n return false;\n }\n\n const errorEnvelope = error as { error?: unknown };\n const innerError = errorEnvelope.error;\n\n if (innerError === undefined) return false;\n\n if (Array.isArray(innerError)) {\n return innerError.every((entry) => {\n if (entry === null || typeof entry !== \"object\" || !(\"message\" in entry)) {\n return false;\n }\n const errorEntry = entry as { code?: unknown; message?: unknown };\n if (typeof errorEntry.message !== \"string\") {\n return false;\n }\n if (\"code\" in entry && errorEntry.code != null && typeof errorEntry.code !== \"number\") {\n return false;\n }\n return true;\n });\n }\n\n if (typeof innerError !== \"object\" || innerError === null || !(\"message\" in innerError)) {\n return false;\n }\n\n const errorObj = innerError as { code?: unknown; message?: unknown };\n if (typeof errorObj.message !== \"string\") {\n return false;\n }\n if (\"code\" in innerError && errorObj.code != null && typeof errorObj.code !== \"number\") {\n return false;\n }\n\n return true;\n}\n\n/**\n * @param data - Data to serialize.\n * @param maxLength - Maximum output length.\n * @returns Serialized data.\n * @internal\n */\nfunction serializeAxiosResponseData(data: unknown, maxLength = 2000): string | undefined {\n if (data === undefined) return undefined;\n\n let serialized: string;\n try {\n if (typeof data === \"string\") {\n serialized = data;\n } else {\n const json: unknown = JSON.stringify(data, null, 2);\n serialized = typeof json === \"string\" ? json : `[Unable to serialize: ${typeof data}]`;\n }\n } catch {\n serialized = `[Unable to serialize: ${typeof data}]`;\n }\n\n if (serialized.length > maxLength) {\n return serialized.slice(0, maxLength) + \"...[truncated]\";\n }\n return serialized;\n}\n\n/**\n * @param message - Error message to parse.\n * @returns Extracted SAP error or null.\n * @internal\n */\nfunction tryExtractSAPErrorFromMessage(message: string): unknown {\n const startIdx = message.indexOf(\"{\");\n if (startIdx === -1) return null;\n\n let depth = 0;\n let endIdx = -1;\n let inString = false;\n let escaped = false;\n for (let i = startIdx; i < message.length; i++) {\n const character = message.charCodeAt(i);\n if (inString) {\n if (escaped) escaped = false;\n else if (character === 0x5c) escaped = true;\n else if (character === 0x22) inString = false;\n continue;\n }\n if (character === 0x22) inString = true;\n else if (character === 0x7b) depth++;\n else if (character === 0x7d) {\n depth--;\n if (depth === 0) {\n endIdx = i;\n break;\n }\n }\n }\n if (endIdx === -1) return null;\n\n try {\n const parsed: unknown = JSON.parse(message.slice(startIdx, endIdx + 1));\n\n if (parsed && typeof parsed === \"object\" && \"error\" in parsed) {\n return parsed;\n }\n\n if (parsed && typeof parsed === \"object\" && \"message\" in parsed) {\n return { error: parsed as Record<string, unknown> };\n }\n\n return null;\n } catch {\n return null;\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 { ZodType } from \"zod\";\n\nimport { z } from \"zod\";\n\nimport type { ParsePartProviderOptions } from \"./sap-ai-provider-options.js\";\n\nimport { deepMerge } from \"./deep-merge.js\";\nimport { normalizeHeaders } from \"./sap-ai-error.js\";\nimport { validateModelParamsWithWarnings } from \"./sap-ai-provider-options.js\";\n\n/**\n * @internal\n */\nexport interface AISDKTool {\n description?: string;\n inputSchema?: unknown;\n name: string;\n type: string;\n}\n\n/**\n * @internal\n */\nexport type AISDKToolChoice =\n { toolName: string; type: \"tool\" } | { type: \"auto\" } | { type: \"none\" } | { type: \"required\" };\n\n/**\n * Anthropic prompt-cache breakdown surfaced via `providerMetadata[providerName].cacheUsage`.\n *\n * Mirrors the per-TTL ephemeral bucket shape returned by the SAP AI SDK token usage\n * payload (`prompt_tokens_details.cache_creation_token_details`).\n * @internal\n */\nexport type AnthropicCacheUsage = NonNullable<\n NonNullable<SDKTokenUsage[\"prompt_tokens_details\"]>[\"cache_creation_token_details\"]\n>;\n\n/**\n * @internal\n */\nexport interface BaseModelDeploymentConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly modelId: string;\n}\n\n/**\n * @internal\n */\nexport interface BuildModelParamsConfig {\n readonly options: LanguageModelV3CallOptions;\n readonly paramMappings: readonly ParamMapping[];\n readonly providerModelParams?: Record<string, unknown>;\n readonly settingsModelParams?: Record<string, unknown>;\n}\n\n/**\n * @internal\n */\nexport interface BuildModelParamsResult {\n readonly modelParams: Record<string, unknown>;\n readonly warnings: SharedV3Warning[];\n}\n\n/**\n * @internal\n */\nexport interface ConvertedResponseFormatResult {\n readonly responseFormat: SAPResponseFormat | undefined;\n readonly warning: SharedV3Warning | undefined;\n}\n\n/**\n * @internal\n */\nexport interface ConvertedToolsResult<T> {\n readonly tools: T[] | undefined;\n readonly warnings: SharedV3Warning[];\n}\n\n/**\n * Optional plumbing accepted by `convertToolsToSAPFormat`.\n *\n * Strategies that honour per-tool `providerOptions['sap-ai']` (e.g. orchestration\n * Anthropic `cacheControl`) supply a `parser`; Foundation Models omits it.\n * @internal\n */\nexport interface ConvertToolsOptions {\n readonly parser?: ParsePartProviderOptions;\n readonly warnings?: SharedV3Warning[];\n}\n\n/**\n * Parsed embedding provider options from AI SDK call.\n * @internal\n */\nexport interface EmbeddingProviderOptions {\n readonly modelParams?: Record<string, unknown>;\n readonly type?: EmbeddingType;\n}\n\n/**\n * @internal\n */\nexport interface EmbeddingResultConfig {\n readonly embeddings: EmbeddingModelV3Embedding[];\n readonly modelId: string;\n readonly providerName: string;\n readonly requestId?: string;\n readonly responseHeaders?: Record<string, string>;\n readonly totalTokens: number;\n readonly version: string;\n readonly warnings?: readonly SharedV3Warning[];\n}\n\n/**\n * Valid embedding types for orchestration API.\n * @internal\n */\nexport type EmbeddingType = \"document\" | \"query\" | \"text\";\n\n/**\n * @internal\n */\nexport interface ExtractedToolParameters {\n readonly parameters: SAPToolParameters;\n readonly warning?: SharedV3Warning;\n}\n\n/**\n * @internal\n */\nexport interface FunctionToolWithParameters extends LanguageModelV3FunctionTool {\n readonly parameters?: unknown;\n}\n\n/**\n * @internal\n */\nexport interface GenerateResultConfig {\n readonly providerName: string;\n readonly requestBody: unknown;\n /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n readonly requestId?: string;\n readonly response: SDKResponse;\n readonly responseHeaders: Record<string, string> | undefined;\n readonly version: string;\n readonly warnings: SharedV3Warning[];\n}\n\n/**\n * Parameter mapping for AI SDK options → SAP model params.\n * @internal\n */\nexport interface ParamMapping {\n readonly camelCaseKey?: string;\n readonly optionKey?: string;\n readonly outputKey: string;\n}\n\n/**\n * Response metadata extracted from an SDK response: server-provided request id\n * and normalised HTTP headers.\n * @internal\n */\nexport interface ResponseMetadata {\n readonly headers: Record<string, string> | undefined;\n readonly requestId: string | undefined;\n}\n\n/**\n * @internal\n */\nexport type SAPResponseFormat =\n | {\n json_schema: {\n description?: string;\n name: string;\n schema: Record<string, unknown>;\n strict: boolean | null;\n };\n type: \"json_schema\";\n }\n | { type: \"json_object\" }\n | { type: \"text\" };\n\n/**\n * @internal\n */\nexport interface SAPTool<P = SAPToolParameters> {\n cache_control?: { ttl?: \"1h\" | \"5m\"; type: \"ephemeral\" };\n function: {\n description?: string;\n name: string;\n parameters?: P;\n strict?: boolean | null;\n };\n type: \"function\";\n}\n\n/**\n * @internal\n */\nexport type SAPToolChoice =\n \"auto\" | \"none\" | \"required\" | { function: { name: string }; type: \"function\" };\n\n/**\n * @internal\n */\nexport type SAPToolParameters = Record<string, unknown> & {\n properties: Record<string, unknown>;\n required: string[];\n type: \"object\";\n};\n\n/**\n * @internal\n */\nexport interface SDKCitation {\n end_index?: number;\n ref_id?: number;\n start_index?: number;\n title: string;\n url: string;\n}\n\n/**\n * @internal\n */\nexport interface SDKDeltaToolCall {\n function?: { arguments?: string; name?: string };\n id?: string;\n index?: number;\n}\n\n/**\n * @internal\n */\nexport interface SDKResponse {\n getCitations?(): SDKCitation[] | undefined;\n getContent(): null | string | undefined;\n getFinishReason(): null | string | undefined;\n getIntermediateFailures?(): undefined | unknown[];\n getTokenUsage(): SDKTokenUsage | undefined;\n getToolCalls(): null | SDKToolCall[] | undefined;\n rawResponse: { headers: Headers | Record<string, string> };\n /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n requestId?: string;\n responseMetadata?: LanguageModelV3ResponseMetadata;\n}\n\n/**\n * @internal\n */\nexport interface SDKStreamChunk {\n _data?: unknown;\n getCitations?(): SDKCitation[] | undefined;\n getDeltaContent(): null | string | undefined;\n getDeltaToolCalls(): null | SDKDeltaToolCall[] | undefined;\n getFinishReason(): null | string | undefined;\n getTokenUsage?(): SDKTokenUsage | undefined;\n}\n\n/**\n * Token usage shape returned by SAP AI SDK responses.\n *\n * Shared by both doGenerate and doStream paths, this type captures the\n * superset of fields exposed by the Orchestration (`TokenUsage`) and\n * Foundation Models (`AzureOpenAiCompletionUsage`) SDKs.\n * @internal\n */\nexport interface SDKTokenUsage {\n completion_tokens?: number;\n completion_tokens_details?: {\n accepted_prediction_tokens?: number;\n audio_tokens?: number;\n reasoning_tokens?: number;\n rejected_prediction_tokens?: number;\n };\n prompt_tokens?: number;\n prompt_tokens_details?: {\n audio_tokens?: number;\n cache_creation_token_details?: {\n ephemeral_1h_input_tokens?: number;\n ephemeral_5m_input_tokens?: number;\n };\n cache_creation_tokens?: number;\n cached_tokens?: number;\n };\n}\n\n/**\n * @internal\n */\nexport interface SDKToolCall {\n function: { arguments: string; name: string };\n id: string;\n}\n\n/**\n * Applies parameter overrides from AI SDK options and modelParams.\n * @param modelParams - The model parameters object to modify.\n * @param options - AI SDK call options.\n * @param sapModelParams - Provider options model params.\n * @param settingsModelParams - Settings model params.\n * @param mappings - Parameter mappings for this strategy.\n * @internal\n */\nexport function applyParameterOverrides(\n modelParams: Record<string, unknown>,\n options: Record<string, unknown>,\n sapModelParams: Record<string, unknown> | undefined,\n settingsModelParams: Record<string, unknown> | undefined,\n mappings: readonly ParamMapping[],\n): void {\n for (const mapping of mappings) {\n const value =\n (mapping.optionKey ? options[mapping.optionKey] : undefined) ??\n (mapping.camelCaseKey ? sapModelParams?.[mapping.camelCaseKey] : undefined) ??\n (mapping.camelCaseKey ? settingsModelParams?.[mapping.camelCaseKey] : undefined);\n\n if (value !== undefined) {\n modelParams[mapping.outputKey] = value;\n }\n\n if (mapping.camelCaseKey && mapping.camelCaseKey !== mapping.outputKey) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete modelParams[mapping.camelCaseKey];\n }\n }\n}\n\n/**\n * Returns the Anthropic prompt-caching slice of `providerMetadata[provider]` as a\n * spread-ready fragment.\n *\n * Returns `{ cacheUsage }` when at least one ephemeral TTL bucket is populated;\n * otherwise `{}` so callers can `...` it unconditionally.\n * @param tokenUsage - Raw token usage from the SAP SDK response.\n * @returns Spread-ready provider-metadata fragment.\n * @internal\n */\nexport function buildAnthropicCacheMetadata(tokenUsage: null | SDKTokenUsage | undefined): {\n cacheUsage?: AnthropicCacheUsage;\n} {\n const details = tokenUsage?.prompt_tokens_details?.cache_creation_token_details;\n if (\n !details ||\n ((details.ephemeral_5m_input_tokens ?? 0) === 0 &&\n (details.ephemeral_1h_input_tokens ?? 0) === 0)\n ) {\n return {};\n }\n return { cacheUsage: details };\n}\n\n/**\n * Builds an EmbeddingModelV3Result from embedding data.\n * @param config - Configuration with embeddings and metadata.\n * @returns Complete embedding result for AI SDK.\n * @internal\n */\nexport function buildEmbeddingResult(config: EmbeddingResultConfig): EmbeddingModelV3Result {\n const {\n embeddings,\n modelId,\n providerName,\n requestId,\n responseHeaders,\n totalTokens,\n version,\n warnings,\n } = config;\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [providerName]: {\n model: modelId,\n ...(requestId ? { requestId } : {}),\n version,\n },\n };\n\n return {\n embeddings,\n providerMetadata,\n ...(responseHeaders ? { response: { headers: responseHeaders } } : {}),\n usage: { tokens: totalTokens },\n warnings: warnings ? [...warnings] : [],\n };\n}\n\n/**\n * Builds a LanguageModelV3GenerateResult from SDK response.\n * @param config - Configuration with response and metadata.\n * @returns Complete generate result for AI SDK.\n * @internal\n */\nexport function buildGenerateResult(config: GenerateResultConfig): LanguageModelV3GenerateResult {\n const { providerName, requestBody, requestId, response, responseHeaders, version, warnings } =\n config;\n\n const content: LanguageModelV3Content[] = [];\n\n const tokenUsage = response.getTokenUsage();\n const finishReasonRaw = response.getFinishReason();\n const finishReason = mapFinishReason(finishReasonRaw);\n\n const textContent = response.getContent();\n const toolCalls = response.getToolCalls();\n if (textContent) content.push({ text: textContent, type: \"text\" });\n for (const toolCall of toolCalls ?? []) {\n content.push({\n input: toolCall.function.arguments,\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n type: \"tool-call\",\n });\n }\n\n const rawResponseBody = {\n content: textContent,\n finishReason: finishReasonRaw,\n tokenUsage,\n toolCalls,\n };\n\n const citations = response.getCitations?.();\n if (citations?.length) {\n for (const citation of citations) {\n content.push({\n id: String(citation.ref_id ?? citation.url),\n sourceType: \"url\" as const,\n title: citation.title,\n type: \"source\" as const,\n url: citation.url,\n });\n }\n }\n\n const intermediateFailures = response.getIntermediateFailures?.();\n\n return {\n content,\n finishReason,\n providerMetadata: {\n [providerName]: {\n ...buildAnthropicCacheMetadata(tokenUsage),\n finishReason: finishReasonRaw ?? \"unknown\",\n finishReasonMapped: finishReason,\n ...(intermediateFailures?.length\n ? { intermediateFailures: sanitizeAsJSONArray(intermediateFailures) }\n : {}),\n ...(requestId ? { requestId } : {}),\n version,\n },\n },\n request: {\n body: requestBody,\n },\n response: {\n body: rawResponseBody,\n headers: responseHeaders,\n ...response.responseMetadata,\n },\n usage: mapTokenUsage(tokenUsage),\n warnings,\n };\n}\n\n/**\n * Builds a ModelDeployment object for the Foundation Models API SDK.\n * @param config - The strategy configuration containing deployment info and model ID.\n * @param modelVersion - Optional model version for model-based resolution.\n * @returns A ModelDeployment object for the Foundation Models API SDK.\n * @internal\n */\nexport function buildModelDeployment(\n config: BaseModelDeploymentConfig,\n modelVersion?: string,\n): { deploymentId: string } | { modelName: string; modelVersion?: string; resourceGroup?: string } {\n const deploymentConfig = config.deploymentConfig;\n\n if (\"deploymentId\" in deploymentConfig) {\n return { deploymentId: deploymentConfig.deploymentId };\n }\n\n const resourceGroup =\n \"resourceGroup\" in deploymentConfig ? deploymentConfig.resourceGroup : undefined;\n\n return {\n modelName: config.modelId,\n ...(modelVersion && { modelVersion }),\n ...(resourceGroup && { resourceGroup }),\n };\n}\n\n/**\n * Builds and validates model parameters from multiple sources.\n * @param config - Configuration with options, mappings, and source parameters.\n * @returns The merged model parameters and validation warnings.\n * @internal\n */\nexport function buildModelParams(config: BuildModelParamsConfig): BuildModelParamsResult {\n const { options, paramMappings, providerModelParams, settingsModelParams } = config;\n const warnings: SharedV3Warning[] = [];\n\n const modelParams: Record<string, unknown> = deepMerge(\n settingsModelParams ?? {},\n providerModelParams ?? {},\n );\n\n applyParameterOverrides(\n modelParams,\n options,\n providerModelParams,\n settingsModelParams,\n paramMappings,\n );\n\n if (options.stopSequences && options.stopSequences.length > 0) {\n modelParams.stop = options.stopSequences;\n }\n\n validateModelParamsWithWarnings(\n {\n frequencyPenalty: options.frequencyPenalty,\n maxTokens: options.maxOutputTokens,\n presencePenalty: options.presencePenalty,\n temperature: options.temperature,\n topP: options.topP,\n },\n warnings,\n );\n\n return { modelParams, warnings };\n}\n\n/**\n * Builds SAP AI SDK-compatible tool parameters from a JSON schema.\n * @param schema - The JSON schema to convert.\n * @returns The SAP-compatible tool parameters object.\n * @internal\n */\nexport function buildSAPToolParameters(schema: Record<string, unknown>): SAPToolParameters {\n const schemaType = schema.type;\n\n if (schemaType !== undefined && schemaType !== \"object\") {\n return {\n properties: {},\n required: [],\n type: \"object\",\n };\n }\n\n const properties =\n schema.properties && typeof schema.properties === \"object\"\n ? (schema.properties as Record<string, unknown>)\n : {};\n\n const required =\n Array.isArray(schema.required) && schema.required.every((item) => typeof item === \"string\")\n ? schema.required\n : [];\n\n const additionalFields = Object.fromEntries(\n Object.entries(schema).filter(\n ([key]) => key !== \"type\" && key !== \"properties\" && key !== \"required\",\n ),\n );\n\n return {\n properties,\n required,\n type: \"object\",\n ...additionalFields,\n };\n}\n\n/**\n * Computes the non-cached prompt tokens from a prompt-token total and its cache slices.\n *\n * Returns `undefined` when the total is unknown. Returns the total unchanged when no\n * cache breakdown is reported. Otherwise subtracts both cache buckets and clamps the\n * result at zero to defend against inconsistent SDK token counts where\n * `cached + cacheWrite > prompt`.\n * @param promptTokens - Total prompt tokens reported by the SDK.\n * @param cachedTokens - Tokens served from the prompt cache.\n * @param cacheWriteTokens - Tokens written to the prompt cache.\n * @returns The non-cached prompt token count, or `undefined` when unknown.\n * @internal\n */\nexport function computeNoCache(\n promptTokens: number | undefined,\n cachedTokens: number | undefined,\n cacheWriteTokens: number | undefined,\n): number | undefined {\n if (promptTokens == null) {\n return undefined;\n }\n if (cachedTokens == null && cacheWriteTokens == null) {\n return promptTokens;\n }\n return Math.max(0, promptTokens - (cachedTokens ?? 0) - (cacheWriteTokens ?? 0));\n}\n\n/**\n * Converts AI SDK response format to SAP-compatible format.\n * @param optionsResponseFormat - The AI SDK response format from call options.\n * @param settingsResponseFormat - The fallback response format from settings.\n * @returns The converted response format and any warning.\n * @internal\n */\nexport function convertResponseFormat(\n optionsResponseFormat: LanguageModelV3CallOptions[\"responseFormat\"],\n settingsResponseFormat?: unknown,\n): ConvertedResponseFormatResult {\n let responseFormat: SAPResponseFormat | undefined;\n let warning: SharedV3Warning | undefined;\n\n if (optionsResponseFormat?.type === \"json\") {\n responseFormat = optionsResponseFormat.schema\n ? {\n json_schema: {\n description: optionsResponseFormat.description,\n name: optionsResponseFormat.name ?? \"response\",\n schema: optionsResponseFormat.schema as Record<string, unknown>,\n strict: null,\n },\n type: \"json_schema\" as const,\n }\n : { type: \"json_object\" as const };\n } else if (settingsResponseFormat) {\n responseFormat = settingsResponseFormat as SAPResponseFormat;\n }\n\n if (responseFormat && responseFormat.type !== \"text\") {\n warning = {\n message:\n \"responseFormat JSON mode is forwarded to the underlying model; support and schema adherence depend on the model/deployment.\",\n type: \"other\",\n };\n }\n\n return { responseFormat, warning };\n}\n\n/**\n * Converts AI SDK tools to SAP-compatible tool format.\n * @param tools - The AI SDK tools to convert.\n * @param options - Optional per-tool parsing config.\n * @param options.parser - Reads per-tool `providerOptions['sap-ai']` and returns parsed directives, or `undefined` when none apply.\n * @param options.warnings - Sink for Zod validation issues raised while parsing.\n * @returns The converted tools and any warnings.\n * @internal\n */\nexport function convertToolsToSAPFormat<T extends SAPTool<unknown>>(\n tools: AISDKTool[] | undefined,\n options: ConvertToolsOptions = {},\n): ConvertedToolsResult<T> {\n const { parser, warnings: parserWarnings } = options;\n const warnings: SharedV3Warning[] = [];\n\n if (!tools || tools.length === 0) {\n return { tools: undefined, warnings };\n }\n\n const convertedTools = tools\n .map((tool): null | T => {\n if (tool.type === \"function\") {\n const functionTool = tool as LanguageModelV3FunctionTool;\n const { parameters, warning } = extractToolParameters(functionTool);\n if (warning) {\n warnings.push(warning);\n }\n\n const cacheControl = parser?.(functionTool.providerOptions, parserWarnings)?.cacheControl;\n\n return {\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n function: {\n name: tool.name,\n parameters,\n ...(functionTool.strict !== undefined ? { strict: functionTool.strict } : {}),\n ...(tool.description ? { description: tool.description } : {}),\n },\n type: \"function\",\n } as T;\n } else {\n warnings.push({\n details: \"Only 'function' tool type is supported.\",\n feature: `tool type for ${tool.name}`,\n type: \"unsupported\",\n });\n return null;\n }\n })\n .filter((t): t is T => t !== null);\n\n return {\n tools: convertedTools.length > 0 ? convertedTools : undefined,\n warnings,\n };\n}\n\n/**\n * Creates a summary of Vercel AI SDK request options for error context.\n * @param options - The language model call options to summarize.\n * @returns An object summarizing the request for debugging.\n * @internal\n */\nexport function createAISDKRequestBodySummary(options: LanguageModelV3CallOptions): {\n hasImageParts: boolean;\n maxOutputTokens?: number;\n promptMessages: number;\n responseFormatType?: string;\n seed?: number;\n stopSequences?: number;\n temperature?: number;\n toolChoiceType?: string;\n tools: number;\n topK?: number;\n topP?: number;\n} {\n return {\n hasImageParts: options.prompt.some(\n (message) =>\n message.role === \"user\" &&\n message.content.some((part) => part.type === \"file\" && part.mediaType.startsWith(\"image/\")),\n ),\n maxOutputTokens: options.maxOutputTokens,\n promptMessages: options.prompt.length,\n responseFormatType: options.responseFormat?.type,\n seed: options.seed,\n stopSequences: options.stopSequences?.length,\n temperature: options.temperature,\n toolChoiceType: options.toolChoice?.type,\n tools: options.tools?.length ?? 0,\n topK: options.topK,\n topP: options.topP,\n };\n}\n\n/**\n * Reads server completion metadata from the public HTTP payload or a stream chunk.\n * @param response - SAP SDK response or chunk.\n * @param response._data - Parsed payload exposed by stream chunks.\n * @param response.getRequestId - Optional SAP request-ID accessor.\n * @param response.rawResponse - Public HTTP response when available.\n * @param response.rawResponse.data - Parsed HTTP response payload.\n * @param dataPath - Path to the completion object within the payload.\n * @returns Server metadata, with the existing request-ID fallback when no completion ID is sent.\n * @internal\n */\nexport function extractCompletionMetadata(\n response: {\n _data?: unknown;\n getRequestId?: () => string | undefined;\n rawResponse?: { data?: unknown };\n },\n dataPath: readonly string[],\n): LanguageModelV3ResponseMetadata {\n let cursor: unknown;\n try {\n cursor = response.rawResponse?.data;\n } catch {\n // Chunk wrappers and older SDK stream constructors may not expose an HTTP response.\n }\n cursor ??= response._data;\n for (const key of dataPath) {\n if (cursor !== null && typeof cursor === \"object\" && key in cursor) {\n cursor = (cursor as Record<string, unknown>)[key];\n } else {\n cursor = undefined;\n break;\n }\n }\n const metadata: LanguageModelV3ResponseMetadata = {};\n if (cursor !== null && typeof cursor === \"object\") {\n const data = cursor as Record<string, unknown>;\n if (typeof data.id === \"string\" && data.id.length > 0) metadata.id = data.id;\n if (typeof data.model === \"string\" && data.model.length > 0) metadata.modelId = data.model;\n if (typeof data.created === \"number\" && Number.isFinite(data.created)) {\n const timestamp = new Date(data.created * 1000);\n if (Number.isFinite(timestamp.getTime())) metadata.timestamp = timestamp;\n }\n }\n if (metadata.id === undefined && typeof response.getRequestId === \"function\") {\n try {\n const id = response.getRequestId();\n if (typeof id === \"string\" && id.length > 0) metadata.id = id;\n } catch {\n // A request ID is optional and can be unavailable before stream consumption.\n }\n }\n return metadata;\n}\n\n/**\n * Extracts the request id and normalised headers from an SDK response.\n *\n * Resolves `requestId` from `getRequestId()`, then an orchestration chunk's\n * `_data.request_id`, then the `x-request-id` header. Tolerates absent/non-callable\n * accessors and throwing header accessors. `field` selects the underlying wrapper:\n * `response` for orchestration embeddings, `rawResponse` for other SDK responses.\n * @param response - SDK response object.\n * @param field - Property containing the underlying HttpResponse wrapper.\n * @returns Combined `{ requestId, headers }` with both fields defensively gathered.\n * @internal\n */\nexport function extractResponseMetadata(\n response: unknown,\n field: \"rawResponse\" | \"response\",\n): ResponseMetadata {\n let requestId: string | undefined;\n const fn = (response as null | { getRequestId?: unknown })?.getRequestId;\n if (typeof fn === \"function\") {\n try {\n const value = (fn as () => string | undefined).call(response);\n requestId = typeof value === \"string\" && value.length > 0 ? value : undefined;\n } catch {\n requestId = undefined;\n }\n }\n\n if (requestId === undefined) {\n const data = (response as null | { _data?: { request_id?: unknown } })?._data;\n if (typeof data?.request_id === \"string\" && data.request_id.length > 0) {\n requestId = data.request_id;\n }\n }\n\n let rawHeaders: unknown;\n try {\n const wrapper = (response as null | Record<string, unknown>)?.[field] as\n undefined | { headers?: unknown };\n rawHeaders = wrapper?.headers;\n } catch {\n rawHeaders = undefined;\n }\n const headers = rawHeaders === undefined ? undefined : normalizeHeaders(rawHeaders);\n\n if (requestId === undefined && typeof headers?.[\"x-request-id\"] === \"string\") {\n requestId = headers[\"x-request-id\"];\n }\n\n return { headers, requestId };\n}\n\n/**\n * Extracts SAP-compatible tool parameters from an AI SDK function tool.\n * @param tool - The AI SDK function tool to extract parameters from.\n * @returns The extracted parameters and optional warning.\n * @internal\n */\nexport function extractToolParameters(tool: LanguageModelV3FunctionTool): ExtractedToolParameters {\n const inputSchema = tool.inputSchema as Record<string, unknown> | undefined;\n const toolWithParams = tool as FunctionToolWithParameters;\n\n if (toolWithParams.parameters && isZodSchema(toolWithParams.parameters)) {\n try {\n const jsonSchema = z.toJSONSchema(toolWithParams.parameters);\n const schemaRecord = jsonSchema as Record<string, unknown>;\n delete schemaRecord.$schema;\n return { parameters: buildSAPToolParameters(schemaRecord) };\n } catch (error) {\n return {\n parameters: buildSAPToolParameters({}),\n warning: {\n details: `Failed to convert tool Zod schema: ${error instanceof Error ? error.message : String(error)}. Falling back to empty object schema.`,\n feature: `tool schema conversion for ${tool.name}`,\n type: \"unsupported\",\n },\n };\n }\n }\n\n if (inputSchema) {\n return { parameters: buildSAPToolParameters(inputSchema) };\n }\n\n return { parameters: buildSAPToolParameters({}) };\n}\n\n/**\n * Checks if an object has a callable parse method.\n * @param obj - The object to check for a parse method.\n * @returns True if the object has a callable parse method.\n * @internal\n */\nexport function hasCallableParse(\n obj: Record<string, unknown>,\n): obj is Record<string, unknown> & { parse: (...args: unknown[]) => unknown } {\n return typeof obj.parse === \"function\";\n}\n\n/**\n * Checks if an object has at least one own enumerable property.\n * @param obj - The object to check.\n * @returns True if the object has one or more keys.\n * @internal\n */\nexport function hasKeys(obj: object): boolean {\n return Object.keys(obj).length > 0;\n}\n\n/**\n * Type guard for Zod schema objects.\n * @param obj - The object to check.\n * @returns True if the object is a Zod schema.\n * @internal\n */\nexport function isZodSchema(obj: unknown): obj is ZodType {\n if (obj === null || typeof obj !== \"object\") {\n return false;\n }\n const record = obj as Record<string, unknown>;\n return \"_def\" in record && \"parse\" in record && hasCallableParse(record);\n}\n\n/**\n * Maps provider finish reasons to Vercel AI SDK LanguageModelV3FinishReason.\n * @param reason - The raw finish reason string from the provider.\n * @returns The unified finish reason with both raw and unified representations.\n * @internal\n */\nexport function mapFinishReason(reason: null | string | undefined): LanguageModelV3FinishReason {\n const raw = reason ?? undefined;\n\n if (!reason) {\n return { raw, unified: \"other\" };\n }\n\n switch (reason.toLowerCase()) {\n case \"content_filter\":\n case \"guardrail_intervened\":\n return { raw, unified: \"content-filter\" };\n case \"end_turn\":\n case \"eos\":\n case \"stop\":\n case \"stop_sequence\":\n return { raw, unified: \"stop\" };\n case \"error\":\n return { raw, unified: \"error\" };\n case \"function_call\":\n case \"tool_call\":\n case \"tool_calls\":\n case \"tool_use\":\n return { raw, unified: \"tool-calls\" };\n case \"length\":\n case \"max_tokens\":\n case \"max_tokens_reached\":\n return { raw, unified: \"length\" };\n default:\n return { raw, unified: \"other\" };\n }\n}\n\n/**\n * Maps SAP AI SDK token usage to Vercel AI SDK LanguageModelV3Usage.\n *\n * `usage.raw` is populated only when the SDK reports fields not represented in\n * `inputTokens` / `outputTokens` (audio or prediction-token buckets); otherwise omitted.\n * @param tokenUsage - Raw token usage from the SAP SDK response.\n * @returns Mapped usage with input/output token breakdowns.\n * @internal\n */\nexport function mapTokenUsage(tokenUsage: null | SDKTokenUsage | undefined): LanguageModelV3Usage {\n const cachedTokens = tokenUsage?.prompt_tokens_details?.cached_tokens;\n const cacheWriteTokens = tokenUsage?.prompt_tokens_details?.cache_creation_tokens;\n const reasoningTokens = tokenUsage?.completion_tokens_details?.reasoning_tokens;\n const promptTokens = tokenUsage?.prompt_tokens;\n\n const promptDetails = tokenUsage?.prompt_tokens_details;\n const completionDetails = tokenUsage?.completion_tokens_details;\n const hasUnmappedFields =\n promptDetails?.audio_tokens != null ||\n completionDetails?.audio_tokens != null ||\n completionDetails?.accepted_prediction_tokens != null ||\n completionDetails?.rejected_prediction_tokens != null;\n\n return {\n inputTokens: {\n cacheRead: cachedTokens,\n cacheWrite: cacheWriteTokens,\n noCache: computeNoCache(promptTokens, cachedTokens, cacheWriteTokens),\n total: promptTokens,\n },\n outputTokens: {\n reasoning: reasoningTokens,\n text:\n tokenUsage?.completion_tokens == null\n ? undefined\n : Math.max(0, tokenUsage.completion_tokens - (reasoningTokens ?? 0)),\n total: tokenUsage?.completion_tokens,\n },\n ...(hasUnmappedFields && tokenUsage ? { raw: sanitizeAsJSONObject(tokenUsage) } : {}),\n };\n}\n\n/**\n * Maps Vercel AI SDK toolChoice to SAP Foundation Models SDK tool_choice format.\n * @param toolChoice - The Vercel AI SDK tool choice.\n * @returns The SAP SDK tool_choice format, or undefined if no mapping needed.\n * @internal\n */\nexport function mapToolChoice(toolChoice: AISDKToolChoice | undefined): SAPToolChoice | undefined {\n if (!toolChoice) {\n return undefined;\n }\n\n switch (toolChoice.type) {\n case \"auto\":\n return \"auto\";\n case \"none\":\n return \"none\";\n case \"required\":\n return \"required\";\n case \"tool\":\n return {\n function: { name: toolChoice.toolName },\n type: \"function\",\n };\n default:\n return undefined;\n }\n}\n\n/**\n * Merges provider-level `requestConfig` with per-call cancellation and HTTP headers.\n *\n * The AI SDK `abortSignal` always wins: any `signal` present on `requestConfig` is\n * dropped so callers cannot accidentally bypass the abort contract described in the\n * JSDoc of `SAPAIProviderSettings.requestConfig`. Defined per-call headers override\n * provider headers case-insensitively; undefined values leave defaults intact.\n * @param requestConfig - Provider-level custom request configuration.\n * @param abortSignal - Per-call abort signal from the AI SDK.\n * @param headers - Additional per-call HTTP headers.\n * @returns Merged configuration, or `undefined` when there is nothing to forward.\n * @internal\n */\nexport function mergeRequestConfig(\n requestConfig: CustomRequestConfig | undefined,\n abortSignal: AbortSignal | undefined,\n headers?: Record<string, string | undefined>,\n): CustomRequestConfig | undefined {\n const { signal: _dropped, ...rest } = requestConfig ?? {};\n const callHeaders = normalizeHeaders(headers);\n if (callHeaders) {\n const providerHeaders = Object.fromEntries(\n Object.entries(rest.headers ?? {}).map(([key, value]) => [key.toLowerCase(), value]),\n );\n rest.headers = { ...providerHeaders, ...callHeaders };\n }\n if (abortSignal) return { ...rest, signal: abortSignal };\n return Object.keys(rest).length > 0 ? rest : undefined;\n}\n\n/**\n * Converts SAP AI SDK embedding to Vercel AI SDK format.\n * @param embedding - The embedding as number array or base64 string.\n * @returns The normalized embedding as a number array.\n * @internal\n */\nexport function normalizeEmbedding(embedding: number[] | string): EmbeddingModelV3Embedding {\n if (Array.isArray(embedding)) {\n return embedding;\n }\n const buffer = Buffer.from(embedding, \"base64\");\n const float32Array = new Float32Array(\n buffer.buffer,\n buffer.byteOffset,\n buffer.length / Float32Array.BYTES_PER_ELEMENT,\n );\n return Array.from(float32Array);\n}\n\nconst jsonReplacer = (_key: string, value: unknown): unknown =>\n typeof value === \"bigint\" ? value.toString() : value;\n\n/**\n * Coerces an array into a JSON-conformant payload suitable for `providerMetadata` values.\n *\n * Non-serialisable entries (functions, symbols, `undefined`) are dropped or replaced\n * by `null` per `JSON.stringify` defaults. Bigint values become decimal strings.\n * Returns an empty array when the entire payload cannot be serialised (e.g. circular\n * references).\n * @param value - Candidate array.\n * @returns JSON-safe array.\n * @internal\n */\nexport function sanitizeAsJSONArray(value: readonly unknown[]): JSONArray {\n try {\n return JSON.parse(JSON.stringify(value, jsonReplacer)) as JSONArray;\n } catch {\n return [];\n }\n}\n\n/**\n * Coerces an object into a JSON-conformant payload suitable for `providerMetadata` or\n * `LanguageModelV3Usage.raw`.\n *\n * Non-serialisable values are dropped per `JSON.stringify` defaults. Bigint values\n * become decimal strings. Returns an empty object when the entire payload cannot be\n * serialised.\n * @param value - Candidate object.\n * @returns JSON-safe object.\n * @internal\n */\nexport function sanitizeAsJSONObject(value: object): JSONObject {\n try {\n return JSON.parse(JSON.stringify(value, jsonReplacer)) as JSONObject;\n } catch {\n return {};\n }\n}\n","/**\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","/** Base class for embedding model strategies using the Template Method pattern. */\nimport type {\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Embedding,\n EmbeddingModelV3Result,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\n\nimport { TooManyEmbeddingValuesForCallError } from \"@ai-sdk/provider\";\n\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\nimport type { EmbeddingModelAPIStrategy, EmbeddingModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport { deepMerge } from \"./deep-merge.js\";\nimport { convertToAISDKError } from \"./sap-ai-error.js\";\nimport { getProviderName } from \"./sap-ai-provider-options.js\";\nimport {\n buildEmbeddingResult,\n type EmbeddingProviderOptions,\n type EmbeddingType,\n mergeRequestConfig,\n type ResponseMetadata,\n} from \"./strategy-utils.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * Abstract base class for embedding model strategies using the Template Method pattern.\n * @template TClient - The SDK client type (e.g., AzureOpenAiEmbeddingClient, OrchestrationEmbeddingClient).\n * @template TResponse - The API response type from the SDK client.\n * @internal\n */\nexport abstract class BaseEmbeddingModelStrategy<\n TClient,\n TResponse,\n> implements EmbeddingModelAPIStrategy {\n /**\n * Template method implementing the shared embedding algorithm.\n * @param config - Strategy configuration.\n * @param settings - Embedding model settings.\n * @param options - AI SDK call options.\n * @param maxEmbeddingsPerCall - Maximum embeddings per call.\n * @returns Complete embedding result for AI SDK.\n * @internal\n */\n async doEmbed(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n options: EmbeddingModelV3CallOptions,\n maxEmbeddingsPerCall: number,\n ): Promise<EmbeddingModelV3Result> {\n const { abortSignal, values } = options;\n\n try {\n if (values.length > maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n maxEmbeddingsPerCall,\n modelId: config.modelId,\n provider: config.provider,\n values,\n });\n }\n const embeddingOptions = config.parsedProviderOptions;\n const providerName = getProviderName(config.provider);\n\n const embeddingType = embeddingOptions?.type ?? settings.type ?? \"text\";\n\n const warnings: SharedV3Warning[] = [];\n this.resolveWarnings(settings, warnings);\n\n const client = this.createClient(config, settings, embeddingOptions);\n\n const response = await this.executeCall(\n client,\n values,\n embeddingType,\n mergeRequestConfig(config.requestConfig, abortSignal, options.headers),\n );\n\n const embeddings = this.extractEmbeddings(response);\n const totalTokens = this.extractTokenCount(response);\n const { headers: responseHeaders, requestId } = this.extractResponseMetadata(response);\n\n return buildEmbeddingResult({\n embeddings,\n modelId: config.modelId,\n providerName,\n requestId,\n responseHeaders,\n totalTokens,\n version: VERSION,\n warnings,\n });\n } catch (error) {\n if (error instanceof TooManyEmbeddingValuesForCallError) {\n throw error;\n }\n throw convertToAISDKError(error, {\n modelId: config.modelId,\n modelType: \"embeddingModel\",\n operation: \"doEmbed\",\n requestBody: { values: values.length },\n url: this.getUrl(),\n });\n }\n }\n\n /**\n * Creates the appropriate SDK client for this API.\n * @param config - Strategy configuration.\n * @param settings - Embedding model settings.\n * @param embeddingOptions - Parsed provider options from the call.\n * @returns SDK client instance.\n * @internal\n */\n protected abstract createClient(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n embeddingOptions: EmbeddingProviderOptions | undefined,\n ): TClient;\n\n /**\n * Executes the embedding API call.\n * @param client - SDK client instance.\n * @param values - Input strings to embed.\n * @param embeddingType - Type of embedding (text, query, document).\n * @param requestConfig - Request configuration with merged headers and abort signal.\n * @returns SDK response containing embeddings.\n * @internal\n */\n protected abstract executeCall(\n client: TClient,\n values: string[],\n embeddingType: EmbeddingType,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<TResponse>;\n\n /**\n * Extracts embeddings from the SDK response.\n * @param response - SDK response containing embedding data.\n * @returns Array of normalized embedding vectors.\n * @internal\n */\n protected abstract extractEmbeddings(response: TResponse): EmbeddingModelV3Embedding[];\n\n /**\n * Extracts response metadata (request id and HTTP headers) from the SDK response.\n *\n * Default returns both fields as `undefined`; subclasses override to extract from the SDK response.\n * @param _response - SDK response.\n * @returns Combined `{ headers, requestId }` metadata.\n * @internal\n */\n protected extractResponseMetadata(_response: TResponse): ResponseMetadata {\n return { headers: undefined, requestId: undefined };\n }\n\n /**\n * Extracts total token count from the SDK response.\n * @param response - SDK response containing usage data.\n * @returns Total token count used for the embedding request.\n * @internal\n */\n protected abstract extractTokenCount(response: TResponse): number;\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 protected mergeModelParams(\n settings: SAPAIEmbeddingSettings,\n embeddingOptions: EmbeddingProviderOptions | undefined,\n ): Record<string, unknown> {\n return deepMerge(\n (settings.modelParams as Record<string, unknown> | undefined) ?? {},\n embeddingOptions?.modelParams ?? {},\n );\n }\n\n /**\n * Pushes API-specific deprecation or migration warnings into the shared\n * sink. Default no-op; subclasses override to surface settings-level\n * warnings (e.g. orchestration's masking_providers deprecation).\n * @param _settings - Embedding model settings.\n * @param _warnings - Shared warnings sink for the current call.\n * @internal\n */\n protected resolveWarnings(_settings: SAPAIEmbeddingSettings, _warnings: SharedV3Warning[]): void {\n return;\n }\n}\n","/** Foundation Models embedding model strategy using `@sap-ai-sdk/foundation-models`. */\nimport type { EmbeddingModelV3Embedding } from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type {\n AzureOpenAiEmbeddingClient,\n AzureOpenAiEmbeddingParameters,\n AzureOpenAiEmbeddingResponse,\n} from \"@sap-ai-sdk/foundation-models\";\n\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\nimport type { EmbeddingModelStrategyConfig } from \"./sap-ai-strategy.js\";\nimport type { EmbeddingProviderOptions, ResponseMetadata } from \"./strategy-utils.js\";\n\nimport { BaseEmbeddingModelStrategy } from \"./base-embedding-model-strategy.js\";\nimport {\n buildModelDeployment,\n extractResponseMetadata,\n hasKeys,\n normalizeEmbedding,\n} from \"./strategy-utils.js\";\n\n/**\n * Client with pre-merged params for thread-safe concurrent requests.\n * @internal\n */\ninterface FMEmbeddingClientWithContext {\n client: AzureOpenAiEmbeddingClient;\n mergedParams: Record<string, unknown> | undefined;\n}\n\n/** @internal */\ntype FoundationModelsEmbeddingClientClass = typeof AzureOpenAiEmbeddingClient;\n\n/**\n * Embedding model strategy for the Foundation Models API.\n *\n * Provides direct access to Azure OpenAI embedding models.\n * @internal\n */\nexport class FoundationModelsEmbeddingModelStrategy extends BaseEmbeddingModelStrategy<\n FMEmbeddingClientWithContext,\n AzureOpenAiEmbeddingResponse\n> {\n private readonly ClientClass: FoundationModelsEmbeddingClientClass;\n\n constructor(ClientClass: FoundationModelsEmbeddingClientClass) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected createClient(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n embeddingOptions: EmbeddingProviderOptions | undefined,\n ): FMEmbeddingClientWithContext {\n const mergedParams = this.mergeModelParams(settings, embeddingOptions);\n\n return {\n client: new this.ClientClass(\n buildModelDeployment(config, settings.modelVersion),\n config.destination,\n ),\n mergedParams: hasKeys(mergedParams) ? mergedParams : undefined,\n };\n }\n\n protected async executeCall(\n clientWithContext: FMEmbeddingClientWithContext,\n values: string[],\n _embeddingType: unknown,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<AzureOpenAiEmbeddingResponse> {\n const request = this.buildRequest(values, clientWithContext.mergedParams);\n return clientWithContext.client.run(request, requestConfig);\n }\n\n protected extractEmbeddings(response: AzureOpenAiEmbeddingResponse): EmbeddingModelV3Embedding[] {\n // SDK types include `& Record<string, any>` which requires explicit extraction\n const embeddingData = response._data.data;\n const sortedEmbeddings = embeddingData.slice().sort((a, b) => a.index - b.index);\n return sortedEmbeddings.map((item) => normalizeEmbedding(item.embedding as number[]));\n }\n\n protected override extractResponseMetadata(\n response: AzureOpenAiEmbeddingResponse,\n ): ResponseMetadata {\n return extractResponseMetadata(response, \"rawResponse\");\n }\n\n protected extractTokenCount(response: AzureOpenAiEmbeddingResponse): number {\n return response._data.usage.total_tokens;\n }\n\n protected getUrl(): string {\n return \"sap-ai:foundation-models/embeddings\";\n }\n\n private buildRequest(\n values: string[],\n mergedParams: Record<string, unknown> | undefined,\n ): AzureOpenAiEmbeddingParameters {\n return {\n ...(mergedParams ?? {}),\n input: values,\n };\n }\n}\n","/** Validation and resolution functions for SAP AI API-specific features. */\nimport type { SharedV3Warning } from \"@ai-sdk/provider\";\n\nimport type {\n FoundationModelsModelSettings,\n OrchestrationModelSettings,\n SAPAIApiType,\n SAPAIEmbeddingSettings,\n SAPAIModelSettings,\n SAPAISettings,\n} from \"./sap-ai-settings.js\";\n\nimport { deepMerge } from \"./deep-merge.js\";\nimport { ApiSwitchError, UnsupportedFeatureError } from \"./sap-ai-error.js\";\n\n/**\n * Type guard for Foundation Models API settings.\n * @param settings - Settings to check.\n * @returns True if settings are for Foundation Models API.\n */\nexport function isFoundationModelsSettings(\n settings: SAPAIModelSettings | SAPAISettings,\n): settings is FoundationModelsModelSettings {\n return settings.api === \"foundation-models\";\n}\n\n/**\n * Type guard for Orchestration API settings.\n * @param settings - Settings to check.\n * @returns True if settings are for Orchestration API.\n */\nexport function isOrchestrationSettings(\n settings: SAPAIModelSettings | SAPAISettings,\n): settings is OrchestrationModelSettings {\n return settings.api === undefined || settings.api === \"orchestration\";\n}\n\n/**\n * Validates escapeTemplatePlaceholders option based on API type.\n *\n * Jinja2 template escaping is only supported by the Orchestration API.\n * @param api - SAP AI API type.\n * @param escapeTemplatePlaceholders - Whether to escape template placeholders.\n * @throws {UnsupportedFeatureError} When escapeTemplatePlaceholders is true with Foundation Models API.\n * @internal\n */\nfunction validateEscapeTemplatePlaceholders(\n api: SAPAIApiType,\n escapeTemplatePlaceholders: boolean | undefined,\n): void {\n if (api === \"foundation-models\" && escapeTemplatePlaceholders === true) {\n throw new UnsupportedFeatureError(\n ESCAPE_TEMPLATE_PLACEHOLDERS_DESCRIPTION,\n \"foundation-models\",\n \"orchestration\",\n );\n }\n}\n\n/**\n * Validates that Foundation Models-only options are not used with Orchestration API.\n *\n * Foundation Models-only features:\n * - `dataSources` - Azure On Your Data configuration\n * @param settings - Settings to validate.\n * @throws {UnsupportedFeatureError} When dataSources is set with Orchestration API.\n * @internal\n */\nfunction validateFoundationModelsOnlyOptions(\n settings: SAPAIModelSettings | SAPAISettings | undefined,\n): void {\n if (!settings) return;\n\n const fmSettings = settings as FoundationModelsModelSettings;\n\n for (const feature of FOUNDATION_MODELS_ONLY_FEATURE_KEYS) {\n if (fmSettings[feature] !== undefined) {\n throw new UnsupportedFeatureError(\n FOUNDATION_MODELS_ONLY_FEATURES[feature],\n \"orchestration\",\n \"foundation-models\",\n );\n }\n }\n}\n\n/**\n * Validates that Orchestration-only embedding options are not used with Foundation Models API.\n *\n * Orchestration-only embedding features:\n * - `masking` - Data masking module\n * @param settings - Embedding settings to validate.\n * @throws {UnsupportedFeatureError} When masking is set with Foundation Models API.\n * @internal\n */\nfunction validateOrchestrationOnlyEmbeddingOptions(\n settings: SAPAIEmbeddingSettings | undefined,\n): void {\n if (!settings) return;\n\n for (const feature of ORCHESTRATION_ONLY_EMBEDDING_FEATURE_KEYS) {\n if (settings[feature] !== undefined) {\n throw new UnsupportedFeatureError(\n ORCHESTRATION_ONLY_EMBEDDING_FEATURES[feature],\n \"foundation-models\",\n \"orchestration\",\n );\n }\n }\n}\n\n/**\n * Validates that Orchestration-only options are not used with Foundation Models API.\n *\n * Orchestration-only features:\n * - `fallbackModuleConfigs` - Prompt module fallback configuration list\n * - `filtering` - Content filtering module\n * - `grounding` - Document grounding module\n * - `masking` - Data masking module\n * - `orchestrationConfigRef` - Prompt Registry configuration reference\n * - `placeholderValues` - Jinja2 template placeholder values\n * - `promptTemplateRef` - Prompt Registry template reference\n * - `streamOptions` - Post-LLM module streaming configuration\n * - `tools` - SAP-format tool definitions (use AI SDK tools instead)\n * - `translation` - Translation module\n * @param settings - Settings to validate.\n * @throws {UnsupportedFeatureError} When any Orchestration-only feature is set with Foundation Models API.\n * @internal\n */\nfunction validateOrchestrationOnlyOptions(\n settings: SAPAIModelSettings | SAPAISettings | undefined,\n): void {\n if (!settings) return;\n\n const orchSettings = settings as OrchestrationModelSettings;\n\n for (const feature of ORCHESTRATION_ONLY_FEATURE_KEYS) {\n if (orchSettings[feature] !== undefined) {\n throw new UnsupportedFeatureError(\n ORCHESTRATION_ONLY_FEATURES[feature],\n \"foundation-models\",\n \"orchestration\",\n );\n }\n }\n}\n\n/**\n * Keys for Orchestration-only features.\n * @internal\n */\nconst ORCHESTRATION_ONLY_FEATURE_KEYS = [\n \"fallbackModuleConfigs\",\n \"filtering\",\n \"grounding\",\n \"masking\",\n \"orchestrationConfigRef\",\n \"placeholderValues\",\n \"promptTemplateRef\",\n \"streamOptions\",\n \"tools\",\n \"translation\",\n] as const;\n\n/**\n * Mapping of Orchestration-only feature keys to human-readable descriptions.\n * Used for generating consistent error messages.\n * @internal\n */\nconst ORCHESTRATION_ONLY_FEATURES: Readonly<\n Record<(typeof ORCHESTRATION_ONLY_FEATURE_KEYS)[number], string>\n> = {\n fallbackModuleConfigs: \"Fallback module configurations (fallbackModuleConfigs)\",\n filtering: \"Content filtering\",\n grounding: \"Document grounding\",\n masking: \"Data masking\",\n orchestrationConfigRef: \"Orchestration config reference (orchestrationConfigRef)\",\n placeholderValues: \"Placeholder values (placeholderValues)\",\n promptTemplateRef: \"Prompt template reference (promptTemplateRef)\",\n streamOptions: \"Stream options for post-LLM modules\",\n tools: \"SAP-format tool definitions (use AI SDK tools instead)\",\n translation: \"Translation\",\n} as const;\n\n/**\n * Keys for Foundation Models-only features.\n * @internal\n */\nconst FOUNDATION_MODELS_ONLY_FEATURE_KEYS = [\"dataSources\"] as const;\n\n/**\n * Mapping of Foundation Models-only feature keys to human-readable descriptions.\n * Used for generating consistent error messages.\n * @internal\n */\nconst FOUNDATION_MODELS_ONLY_FEATURES: Readonly<\n Record<(typeof FOUNDATION_MODELS_ONLY_FEATURE_KEYS)[number], string>\n> = {\n dataSources: \"Azure On Your Data (dataSources)\",\n} as const;\n\n/**\n * Subset of Orchestration-only features that can be set at invocation level.\n * @internal\n */\nconst ORCHESTRATION_ONLY_INVOCATION_FEATURE_KEYS = [\n \"orchestrationConfigRef\",\n \"placeholderValues\",\n \"promptTemplateRef\",\n] as const;\n\n/**\n * Keys for Orchestration-only embedding features.\n * @internal\n */\nconst ORCHESTRATION_ONLY_EMBEDDING_FEATURE_KEYS = [\"masking\"] as const;\n\n/**\n * Mapping of Orchestration-only embedding feature keys to human-readable descriptions.\n * Uses the same descriptions as the main ORCHESTRATION_ONLY_FEATURES for consistency.\n * @internal\n */\nconst ORCHESTRATION_ONLY_EMBEDDING_FEATURES: Readonly<\n Record<(typeof ORCHESTRATION_ONLY_EMBEDDING_FEATURE_KEYS)[number], string>\n> = {\n masking: ORCHESTRATION_ONLY_FEATURES.masking,\n} as const;\n\n/**\n * Human-readable description for escapeTemplatePlaceholders feature.\n * Used for generating consistent error messages.\n * @internal\n */\nconst ESCAPE_TEMPLATE_PLACEHOLDERS_DESCRIPTION =\n \"escapeTemplatePlaceholders (Jinja2 template escaping)\";\n\n/**\n * Validates that switching APIs at invocation time is allowed.\n *\n * API switching is blocked when the model was configured with features\n * that are specific to one API and incompatible with the target API.\n * @param fromApi - Source API type (configured at model creation).\n * @param toApi - Target API type (requested at invocation time).\n * @param modelSettings - Language model settings to validate for conflicts.\n * @param embeddingSettings - Embedding model settings to validate for conflicts.\n * @throws {ApiSwitchError} When the model has features incompatible with the target API.\n * @internal\n */\nfunction validateApiSwitch(\n fromApi: SAPAIApiType,\n toApi: SAPAIApiType,\n modelSettings: SAPAIModelSettings | SAPAISettings | undefined,\n embeddingSettings: SAPAIEmbeddingSettings | undefined,\n): void {\n if (fromApi === toApi) return;\n if (!modelSettings && !embeddingSettings) return;\n\n if (fromApi === \"orchestration\" && toApi === \"foundation-models\") {\n const orchSettings = modelSettings as OrchestrationModelSettings | undefined;\n\n for (const feature of ORCHESTRATION_ONLY_FEATURE_KEYS) {\n if (orchSettings?.[feature] !== undefined) {\n throw new ApiSwitchError(fromApi, toApi, feature);\n }\n }\n for (const feature of ORCHESTRATION_ONLY_EMBEDDING_FEATURE_KEYS) {\n if (embeddingSettings?.[feature] !== undefined) {\n throw new ApiSwitchError(fromApi, toApi, feature);\n }\n }\n }\n\n if (fromApi === \"foundation-models\" && toApi === \"orchestration\") {\n const fmSettings = modelSettings as FoundationModelsModelSettings | undefined;\n\n for (const feature of FOUNDATION_MODELS_ONLY_FEATURE_KEYS) {\n if (fmSettings?.[feature] !== undefined) {\n throw new ApiSwitchError(fromApi, toApi, feature);\n }\n }\n }\n}\n\n/**\n * @internal\n */\nconst VALID_API_TYPES: readonly SAPAIApiType[] = [\"orchestration\", \"foundation-models\"];\n\n/** Options for the main validation function. */\nexport interface ValidateSettingsOptions {\n readonly api: SAPAIApiType;\n readonly embeddingSettings?: SAPAIEmbeddingSettings;\n readonly invocationSettings?: {\n readonly api?: SAPAIApiType;\n readonly escapeTemplatePlaceholders?: boolean;\n readonly orchestrationConfigRef?: unknown;\n readonly placeholderValues?: unknown;\n readonly promptTemplateRef?: unknown;\n };\n readonly modelApi?: SAPAIApiType;\n readonly modelSettings?: SAPAIModelSettings | SAPAISettings;\n}\n\n/**\n * Gets the effective escapeTemplatePlaceholders value based on API and settings.\n * @param api - SAP AI API type.\n * @param modelSettings - Model settings.\n * @param invocationEscape - Invocation-level escape setting.\n * @returns Effective escapeTemplatePlaceholders value.\n */\nexport function getEffectiveEscapeTemplatePlaceholders(\n api: SAPAIApiType,\n modelSettings: SAPAIModelSettings | SAPAISettings | undefined,\n invocationEscape: boolean | undefined,\n): boolean {\n if (api === \"foundation-models\") {\n return false;\n }\n\n if (invocationEscape !== undefined) {\n return invocationEscape;\n }\n\n const modelValue = (modelSettings as OrchestrationModelSettings | undefined)\n ?.escapeTemplatePlaceholders;\n if (modelValue !== undefined) {\n return modelValue;\n }\n\n return true;\n}\n\n/**\n * Merges settings with proper API precedence (callSettings > defaultSettings > fallbackApi).\n * @param defaultSettings - Provider-level default settings.\n * @param callSettings - Per-call settings that override defaults.\n * @param fallbackApi - Fallback API type when neither settings specify one.\n * @returns Merged settings with correct API precedence.\n * @internal\n */\nexport function mergeSettingsWithApi<T extends { api?: string }>(\n defaultSettings: Record<string, unknown> | undefined,\n callSettings: Partial<T>,\n fallbackApi: string,\n): T {\n return {\n ...deepMerge(defaultSettings, callSettings as Record<string, unknown>),\n api: callSettings.api ?? (defaultSettings?.api as string | undefined) ?? fallbackApi,\n } as T;\n}\n\n/**\n * Resolves the effective API type using the full precedence chain.\n * @param providerApi - Provider-level API type.\n * @param modelApi - Model-level API type.\n * @param invocationApi - Invocation-level API type.\n * @returns Resolved API type.\n */\nexport function resolveApi(\n providerApi: SAPAIApiType | undefined,\n modelApi: SAPAIApiType | undefined,\n invocationApi: SAPAIApiType | undefined,\n): SAPAIApiType {\n return invocationApi ?? modelApi ?? providerApi ?? \"orchestration\";\n}\n\n/**\n * Validates that the API value is a valid SAPAIApiType.\n * @param api - API value to validate.\n */\nexport function validateApiInput(api: unknown): void {\n if (api === undefined) return;\n\n if (typeof api !== \"string\" || !VALID_API_TYPES.includes(api as SAPAIApiType)) {\n throw new Error(\n `Invalid API type: ${JSON.stringify(api)}. ` +\n `Valid values are: ${VALID_API_TYPES.map((t) => `\"${t}\"`).join(\", \")}`,\n );\n }\n}\n\n/**\n * Pushes a deprecation warning when `settings.masking` carries `masking_providers`\n * without a `providers` block.\n * @param modelSettings - Resolved model settings (LM or embedding) that may carry a `masking` module.\n * @param warnings - Sink that collects the deprecation warning when it applies.\n * @internal\n */\nexport function validateMaskingProvidersDeprecation(\n modelSettings: undefined | { masking?: unknown },\n warnings: SharedV3Warning[],\n): void {\n const masking = modelSettings?.masking;\n if (!masking || typeof masking !== \"object\") {\n return;\n }\n const maskingRecord = masking as Record<string, unknown>;\n const hasDeprecated = maskingRecord.masking_providers !== undefined;\n const hasPreferred = maskingRecord.providers !== undefined;\n if (hasDeprecated && !hasPreferred) {\n warnings.push({\n message:\n \"settings.masking.masking_providers is deprecated and will be removed by SAP on 2027-03-20. \" +\n \"Migrate to settings.masking.providers.\",\n type: \"other\",\n });\n }\n}\n\n/**\n * Main validation function that performs all API-specific validations.\n *\n * This function orchestrates all validation checks:\n * 1. Validates API type inputs\n * 2. Checks for API switching conflicts\n * 3. Validates API-specific feature usage\n * 4. Validates template placeholder escaping\n * @param options - Validation options.\n * @throws {Error} When an invalid API type is provided.\n * @throws {ApiSwitchError} When attempting to switch APIs with incompatible settings.\n * @throws {UnsupportedFeatureError} When using features not supported by the current API.\n * @see {@link ApiSwitchError}\n * @see {@link UnsupportedFeatureError}\n */\nexport function validateSettings(options: ValidateSettingsOptions): void {\n const { api, embeddingSettings, invocationSettings, modelApi, modelSettings } = options;\n\n validateApiInput(api);\n if (invocationSettings?.api !== undefined) {\n validateApiInput(invocationSettings.api);\n }\n\n if (invocationSettings?.api !== undefined) {\n const effectiveModelApi = modelApi ?? \"orchestration\";\n if (effectiveModelApi !== invocationSettings.api) {\n validateApiSwitch(\n effectiveModelApi,\n invocationSettings.api,\n modelSettings,\n embeddingSettings,\n );\n }\n }\n\n if (api === \"foundation-models\") {\n validateOrchestrationOnlyOptions(modelSettings);\n validateOrchestrationOnlyInvocationOptions(invocationSettings);\n validateOrchestrationOnlyEmbeddingOptions(embeddingSettings);\n } else {\n validateFoundationModelsOnlyOptions(modelSettings);\n }\n\n const modelEscape = (modelSettings as OrchestrationModelSettings | undefined)\n ?.escapeTemplatePlaceholders;\n const invocationEscape = invocationSettings?.escapeTemplatePlaceholders;\n const effectiveEscape = invocationEscape ?? modelEscape;\n validateEscapeTemplatePlaceholders(api, effectiveEscape);\n}\n\n/**\n * Validates that Orchestration-only options are not passed at invocation level with Foundation Models API.\n * @param invocationSettings - Invocation-level settings to validate.\n * @throws {UnsupportedFeatureError} When any Orchestration-only feature is set at invocation level.\n * @internal\n */\nfunction validateOrchestrationOnlyInvocationOptions(\n invocationSettings: ValidateSettingsOptions[\"invocationSettings\"],\n): void {\n if (!invocationSettings) return;\n\n for (const feature of ORCHESTRATION_ONLY_INVOCATION_FEATURE_KEYS) {\n if (invocationSettings[feature] !== undefined) {\n throw new UnsupportedFeatureError(\n ORCHESTRATION_ONLY_FEATURES[feature],\n \"foundation-models\",\n \"orchestration\",\n );\n }\n }\n}\n","/** Orchestration embedding model strategy using `@sap-ai-sdk/orchestration`. */\nimport type { EmbeddingModelV3Embedding, SharedV3Warning } from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type {\n EmbeddingModelConfig,\n EmbeddingModuleConfig,\n MaskingModule,\n OrchestrationEmbeddingClient,\n OrchestrationEmbeddingResponse,\n} from \"@sap-ai-sdk/orchestration\";\n\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\nimport type { EmbeddingModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport { BaseEmbeddingModelStrategy } from \"./base-embedding-model-strategy.js\";\nimport { validateMaskingProvidersDeprecation } from \"./sap-ai-validation.js\";\nimport {\n type EmbeddingProviderOptions,\n extractResponseMetadata,\n hasKeys,\n normalizeEmbedding,\n type ResponseMetadata,\n} from \"./strategy-utils.js\";\n\n/** @internal */\ntype OrchestrationEmbeddingClientClass = typeof OrchestrationEmbeddingClient;\n\n/**\n * Embedding model strategy for the Orchestration API.\n *\n * Provides support for:\n * - Data masking\n * - Model parameters configuration\n * @internal\n */\nexport class OrchestrationEmbeddingModelStrategy extends BaseEmbeddingModelStrategy<\n OrchestrationEmbeddingClient,\n OrchestrationEmbeddingResponse\n> {\n private readonly ClientClass: OrchestrationEmbeddingClientClass;\n\n constructor(ClientClass: OrchestrationEmbeddingClientClass) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected createClient(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n embeddingOptions: EmbeddingProviderOptions | undefined,\n ): OrchestrationEmbeddingClient {\n const mergedParams = this.mergeModelParams(settings, embeddingOptions);\n\n const embeddingConfig: EmbeddingModelConfig = {\n model: {\n name: config.modelId,\n ...(hasKeys(mergedParams) ? { params: mergedParams } : {}),\n ...(settings.modelVersion ? { version: settings.modelVersion } : {}),\n },\n };\n\n const moduleConfig: EmbeddingModuleConfig = {\n embeddings: embeddingConfig,\n ...(settings.masking && hasKeys(settings.masking)\n ? { masking: settings.masking as MaskingModule }\n : {}),\n };\n\n return new this.ClientClass(moduleConfig, config.deploymentConfig, config.destination);\n }\n\n protected async executeCall(\n client: OrchestrationEmbeddingClient,\n values: string[],\n embeddingType: \"document\" | \"query\" | \"text\" | undefined,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<OrchestrationEmbeddingResponse> {\n return client.embed({ input: values, type: embeddingType }, requestConfig);\n }\n\n protected extractEmbeddings(\n response: OrchestrationEmbeddingResponse,\n ): EmbeddingModelV3Embedding[] {\n const embeddingData = response.getEmbeddings();\n const sortedEmbeddings = [...embeddingData].sort((a, b) => a.index - b.index);\n return sortedEmbeddings.map((data) => normalizeEmbedding(data.embedding));\n }\n\n protected override extractResponseMetadata(\n response: OrchestrationEmbeddingResponse,\n ): ResponseMetadata {\n return extractResponseMetadata(response, \"response\");\n }\n\n protected extractTokenCount(response: OrchestrationEmbeddingResponse): number {\n const tokenUsage = response.getTokenUsage();\n return tokenUsage.total_tokens;\n }\n\n protected getUrl(): string {\n return \"sap-ai:orchestration/embeddings\";\n }\n\n protected override resolveWarnings(\n settings: SAPAIEmbeddingSettings,\n warnings: SharedV3Warning[],\n ): void {\n validateMaskingProvidersDeprecation(settings, warnings);\n }\n}\n","/**\n * Stream transformer for converting SAP AI SDK streaming responses\n * into Vercel AI SDK LanguageModelV3StreamPart events.\n */\nimport type {\n LanguageModelV3CallOptions,\n LanguageModelV3FinishReason,\n LanguageModelV3ResponseMetadata,\n LanguageModelV3StreamPart,\n LanguageModelV3Usage,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\n\nimport type {\n SDKCitation,\n SDKDeltaToolCall,\n SDKStreamChunk,\n SDKTokenUsage,\n} from \"./strategy-utils.js\";\n\nimport {\n buildAnthropicCacheMetadata,\n createAISDKRequestBodySummary,\n mapFinishReason,\n mapTokenUsage,\n sanitizeAsJSONArray,\n} from \"./strategy-utils.js\";\n\n/**\n * @internal\n */\nexport interface StreamState {\n activeText: boolean;\n finishReason: LanguageModelV3FinishReason;\n isFirstChunk: boolean;\n usage: LanguageModelV3Usage;\n}\n\n/**\n * @internal\n */\nexport interface StreamTransformerConfig {\n readonly cancel: () => void;\n readonly convertToAISDKError: (\n error: unknown,\n context: {\n modelId: string;\n modelType: \"languageModel\";\n operation: string;\n requestBody: unknown;\n url: string;\n },\n ) => unknown;\n readonly extractChunkMetadata: (chunk: SDKStreamChunk) => {\n requestId?: string;\n responseMetadata: LanguageModelV3ResponseMetadata;\n };\n readonly idGenerator: StreamIdGenerator;\n readonly includeRawChunks: boolean;\n readonly modelId: string;\n readonly options: LanguageModelV3CallOptions;\n readonly providerName: string;\n /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n readonly requestId?: string;\n readonly responseMetadata: LanguageModelV3ResponseMetadata & { id: string };\n readonly sdkStream: AsyncIterable<SDKStreamChunk>;\n readonly streamResponseGetCitations?: () => SDKCitation[] | undefined;\n readonly streamResponseGetFinishReason: () => null | string | undefined;\n readonly streamResponseGetIntermediateFailures?: () => undefined | unknown[];\n readonly url: string;\n readonly version: string;\n readonly warnings: readonly SharedV3Warning[];\n}\n\n/**\n * @internal\n */\nexport interface ToolCallInProgress {\n arguments: string;\n didEmitCall: boolean;\n didEmitInputStart: boolean;\n id: string | undefined;\n toolName?: string;\n}\n\n/**\n * @internal\n */\nexport class StreamIdGenerator {\n /**\n * @returns A UUID string for identifying the response.\n */\n generateResponseId(): string {\n return crypto.randomUUID();\n }\n\n /**\n * @returns A UUID string for identifying a text block.\n */\n generateTextBlockId(): string {\n return crypto.randomUUID();\n }\n\n /**\n * @returns A UUID string for identifying a tool call when the API does not provide one.\n */\n generateToolCallId(): string {\n return crypto.randomUUID();\n }\n}\n\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/**\n * Creates the initial stream state for processing streaming responses.\n * @returns The initial stream state object.\n * @internal\n */\nexport function createInitialStreamState(): StreamState {\n return {\n activeText: false,\n finishReason: {\n raw: undefined,\n unified: \"other\" as const,\n },\n isFirstChunk: true,\n usage: {\n inputTokens: {\n cacheRead: undefined,\n cacheWrite: undefined,\n noCache: undefined,\n total: undefined,\n },\n outputTokens: {\n reasoning: undefined,\n text: undefined,\n total: undefined,\n },\n },\n };\n}\n\n/**\n * Creates a ReadableStream that transforms SAP AI SDK streaming responses\n * into Vercel AI SDK LanguageModelV3StreamPart events.\n * @param config - The stream transformer configuration containing all dependencies.\n * @returns A ReadableStream of LanguageModelV3StreamPart events.\n * @internal\n */\nexport function createStreamTransformer(\n config: StreamTransformerConfig,\n): ReadableStream<LanguageModelV3StreamPart> {\n const {\n cancel,\n convertToAISDKError,\n extractChunkMetadata,\n idGenerator,\n includeRawChunks,\n modelId,\n options,\n providerName,\n requestId,\n responseMetadata,\n sdkStream,\n streamResponseGetCitations,\n streamResponseGetFinishReason,\n streamResponseGetIntermediateFailures,\n url,\n version,\n warnings,\n } = config;\n\n let textBlockId: null | string = null;\n const streamState = createInitialStreamState();\n const toolCallsInProgress = new Map<number, ToolCallInProgress>();\n const resolvedResponseMetadata = { ...responseMetadata };\n let resolvedRequestId = requestId;\n let tokenUsage: SDKTokenUsage | undefined;\n let citations: Map<string, SDKCitation> | undefined;\n\n /**\n * Retains sources from early chunks when later SDK snapshots omit them.\n * @param incoming - Citations in a chunk or final response.\n */\n function collectCitations(incoming: SDKCitation[] | undefined): void {\n if (!incoming?.length) return;\n citations ??= new Map();\n for (const citation of incoming) {\n citations.set(String(citation.ref_id ?? citation.url), citation);\n }\n }\n\n /**\n * Combines usage snapshots without losing details omitted by later chunks.\n * @param incoming - Usage in the incoming chunk.\n */\n function collectUsage(incoming: null | SDKTokenUsage | undefined): void {\n if (!incoming) return;\n const promptDetails = tokenUsage?.prompt_tokens_details;\n const incomingPromptDetails = incoming.prompt_tokens_details;\n const completionDetails = tokenUsage?.completion_tokens_details;\n const incomingCompletionDetails = incoming.completion_tokens_details;\n const cacheDetails = promptDetails?.cache_creation_token_details;\n const incomingCacheDetails = incomingPromptDetails?.cache_creation_token_details;\n tokenUsage = {\n ...tokenUsage,\n ...incoming,\n ...(promptDetails || incomingPromptDetails\n ? {\n prompt_tokens_details: {\n ...promptDetails,\n ...incomingPromptDetails,\n ...(cacheDetails || incomingCacheDetails\n ? {\n cache_creation_token_details: { ...cacheDetails, ...incomingCacheDetails },\n }\n : {}),\n },\n }\n : {}),\n ...(completionDetails || incomingCompletionDetails\n ? {\n completion_tokens_details: { ...completionDetails, ...incomingCompletionDetails },\n }\n : {}),\n };\n }\n\n /**\n * Emits tool-input-start and replays any buffered arguments as a delta.\n * @param tc - The in-progress tool call state.\n * @param controller - The transform stream controller to enqueue events into.\n */\n function emitToolInputStart(\n tc: ToolCallInProgress,\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n ): void {\n if (tc.didEmitInputStart || tc.id == null) return;\n tc.didEmitInputStart = true;\n controller.enqueue({\n id: tc.id,\n toolName: tc.toolName ?? \"\",\n type: \"tool-input-start\",\n });\n if (tc.arguments.length > 0) {\n controller.enqueue({\n delta: tc.arguments,\n id: tc.id,\n type: \"tool-input-delta\",\n });\n }\n }\n\n const iterator = safeIterate(sdkStream, options.abortSignal)[Symbol.asyncIterator]();\n let canceled = false;\n return new ReadableStream<Error | SDKStreamChunk>({\n async cancel() {\n canceled = true;\n // Abort transport before return(): an async iterator can be waiting on the next chunk.\n cancel();\n await iterator.return(undefined);\n },\n async pull(controller) {\n const { done, value } = await iterator.next();\n if (canceled) return;\n if (done) controller.close();\n else controller.enqueue(value);\n },\n }).pipeThrough(\n new TransformStream<Error | SDKStreamChunk, LanguageModelV3StreamPart>({\n flush(controller) {\n if (options.abortSignal?.aborted) {\n handleStreamError(\n createAbortError(options.abortSignal.reason),\n controller,\n convertToAISDKError,\n options,\n modelId,\n url,\n );\n return;\n }\n\n const didEmitAnyToolCalls = finalizeToolCalls(\n controller,\n toolCallsInProgress,\n idGenerator,\n emitToolInputStart,\n );\n\n if (streamState.activeText && textBlockId) {\n controller.enqueue({ id: textBlockId, type: \"text-end\" });\n }\n\n const finalFinishReason = streamResponseGetFinishReason();\n if (finalFinishReason) {\n streamState.finishReason = mapFinishReason(finalFinishReason);\n } else if (didEmitAnyToolCalls) {\n streamState.finishReason = {\n raw: undefined,\n unified: \"tool-calls\",\n };\n }\n\n // Use wire usage snapshots; SAP final aggregation can invent zero totals.\n streamState.usage = mapTokenUsage(tokenUsage);\n\n collectCitations(streamResponseGetCitations?.());\n if (citations) {\n for (const citation of citations.values()) {\n controller.enqueue({\n id: String(citation.ref_id ?? citation.url),\n sourceType: \"url\" as const,\n title: citation.title,\n type: \"source\",\n url: citation.url,\n });\n }\n }\n\n const streamIntermediateFailures = streamResponseGetIntermediateFailures?.();\n\n controller.enqueue({\n finishReason: streamState.finishReason,\n providerMetadata: {\n [providerName]: {\n ...buildAnthropicCacheMetadata(tokenUsage),\n finishReason: streamState.finishReason.raw ?? \"unknown\",\n finishReasonMapped: streamState.finishReason,\n ...(streamIntermediateFailures?.length\n ? {\n intermediateFailures: sanitizeAsJSONArray(streamIntermediateFailures),\n }\n : {}),\n ...(resolvedRequestId ? { requestId: resolvedRequestId } : {}),\n responseId: resolvedResponseMetadata.id,\n version,\n },\n },\n type: \"finish\",\n usage: streamState.usage,\n });\n },\n\n start(controller) {\n controller.enqueue({\n type: \"stream-start\",\n warnings: [...warnings],\n });\n },\n\n transform(chunk, controller) {\n if (options.abortSignal?.aborted && !(chunk instanceof Error)) {\n chunk = createAbortError(options.abortSignal.reason);\n }\n if (chunk instanceof Error) {\n handleStreamError(chunk, controller, convertToAISDKError, options, modelId, url);\n return;\n }\n\n if (includeRawChunks) {\n controller.enqueue({\n rawValue: (chunk as { _data?: unknown })._data ?? chunk,\n type: \"raw\",\n });\n }\n\n const metadata = extractChunkMetadata(chunk);\n if (metadata.requestId) resolvedRequestId = metadata.requestId;\n const incomingMetadata = metadata.responseMetadata;\n const metadataChanged =\n (incomingMetadata.id !== undefined &&\n incomingMetadata.id !== resolvedResponseMetadata.id) ||\n (incomingMetadata.modelId !== undefined &&\n incomingMetadata.modelId !== resolvedResponseMetadata.modelId) ||\n (incomingMetadata.timestamp !== undefined &&\n incomingMetadata.timestamp.getTime() !== resolvedResponseMetadata.timestamp?.getTime());\n Object.assign(resolvedResponseMetadata, incomingMetadata);\n collectUsage(chunk.getTokenUsage?.());\n collectCitations(chunk.getCitations?.());\n\n if (streamState.isFirstChunk || metadataChanged) {\n streamState.isFirstChunk = false;\n controller.enqueue({\n ...resolvedResponseMetadata,\n type: \"response-metadata\",\n });\n }\n\n const deltaToolCalls = chunk.getDeltaToolCalls();\n if (Array.isArray(deltaToolCalls) && deltaToolCalls.length > 0) {\n streamState.finishReason = {\n raw: undefined,\n unified: \"tool-calls\",\n };\n }\n\n const deltaContent = chunk.getDeltaContent();\n if (typeof deltaContent === \"string\" && deltaContent.length > 0) {\n textBlockId = handleTextDelta(\n deltaContent,\n controller,\n streamState,\n textBlockId,\n idGenerator,\n );\n }\n\n if (Array.isArray(deltaToolCalls) && deltaToolCalls.length > 0) {\n handleToolCallDeltas(deltaToolCalls, controller, toolCallsInProgress, emitToolInputStart);\n }\n\n const chunkFinishReason = chunk.getFinishReason();\n if (chunkFinishReason) {\n streamState.finishReason = mapFinishReason(chunkFinishReason);\n\n if (streamState.finishReason.unified === \"tool-calls\") {\n finalizeToolCalls(controller, toolCallsInProgress, idGenerator, emitToolInputStart);\n\n if (streamState.activeText && textBlockId) {\n controller.enqueue({ id: textBlockId, type: \"text-end\" });\n streamState.activeText = false;\n }\n }\n }\n },\n }),\n );\n}\n\n/**\n * Finalizes pending tool calls by emitting tool-input-end and tool-call events.\n * @param controller - The transform stream controller.\n * @param toolCallsInProgress - Map of in-progress tool calls.\n * @param idGenerator - ID generator for tool calls without IDs.\n * @param emitToolInputStart - Function to emit tool-input-start events.\n * @returns Whether any tool calls were finalized.\n * @internal\n */\nfunction finalizeToolCalls(\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolCallsInProgress: Map<number, ToolCallInProgress>,\n idGenerator: StreamIdGenerator,\n emitToolInputStart: (\n tc: ToolCallInProgress,\n ctrl: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n ) => void,\n): boolean {\n let didEmitAnyToolCalls = false;\n\n for (const tc of toolCallsInProgress.values()) {\n if (tc.didEmitCall) {\n continue;\n }\n\n tc.id ??= idGenerator.generateToolCallId();\n emitToolInputStart(tc, controller);\n\n didEmitAnyToolCalls = true;\n tc.didEmitCall = true;\n controller.enqueue({ id: tc.id, type: \"tool-input-end\" });\n controller.enqueue({\n input: tc.arguments,\n toolCallId: tc.id,\n toolName: tc.toolName ?? \"\",\n type: \"tool-call\",\n });\n }\n\n return didEmitAnyToolCalls;\n}\n\n/**\n * Handles a stream error by converting it and enqueuing an error event.\n * @param error - The error from the stream iteration.\n * @param controller - The transform stream controller.\n * @param convertToAISDKError - Error conversion function.\n * @param options - Language model call options for context.\n * @param modelId - Model identifier for error classification.\n * @param url - The request URL for error context.\n * @internal\n */\nfunction handleStreamError(\n error: Error,\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n convertToAISDKError: StreamTransformerConfig[\"convertToAISDKError\"],\n options: LanguageModelV3CallOptions,\n modelId: string,\n url: string,\n): void {\n const aiError = convertToAISDKError(error, {\n modelId,\n modelType: \"languageModel\",\n operation: \"doStream\",\n requestBody: createAISDKRequestBodySummary(options),\n url,\n });\n controller.enqueue({\n error: aiError instanceof Error ? aiError : new Error(String(aiError)),\n type: \"error\",\n });\n controller.terminate();\n}\n\n/**\n * Handles a text delta by managing text block lifecycle.\n * @param deltaContent - The text delta content.\n * @param controller - The transform stream controller.\n * @param streamState - The current stream state.\n * @param currentTextBlockId - The current text block ID (or null).\n * @param idGenerator - ID generator for new text blocks.\n * @returns The current text block ID (may be newly created).\n * @internal\n */\nfunction handleTextDelta(\n deltaContent: string,\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n streamState: StreamState,\n currentTextBlockId: null | string,\n idGenerator: StreamIdGenerator,\n): string {\n let textBlockId = currentTextBlockId;\n if (!streamState.activeText) {\n textBlockId = idGenerator.generateTextBlockId();\n controller.enqueue({ id: textBlockId, type: \"text-start\" });\n streamState.activeText = true;\n }\n if (textBlockId) {\n controller.enqueue({\n delta: deltaContent,\n id: textBlockId,\n type: \"text-delta\",\n });\n return textBlockId;\n }\n return currentTextBlockId ?? idGenerator.generateTextBlockId();\n}\n\n/**\n * Handles tool call delta chunks by assembling tool calls progressively.\n * @param deltaToolCalls - The tool call delta chunks from the stream.\n * @param controller - The transform stream controller.\n * @param toolCallsInProgress - Map of in-progress tool calls by index.\n * @param emitToolInputStart - Function to emit tool-input-start events.\n * @internal\n */\nfunction handleToolCallDeltas(\n deltaToolCalls: SDKDeltaToolCall[],\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolCallsInProgress: Map<number, ToolCallInProgress>,\n emitToolInputStart: (\n tc: ToolCallInProgress,\n ctrl: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n ) => void,\n): void {\n for (const toolCallChunk of deltaToolCalls) {\n const index = toolCallChunk.index;\n if (typeof index !== \"number\" || !Number.isFinite(index)) {\n continue;\n }\n\n if (!toolCallsInProgress.has(index)) {\n toolCallsInProgress.set(index, {\n arguments: \"\",\n didEmitCall: false,\n didEmitInputStart: false,\n id:\n typeof toolCallChunk.id === \"string\" && toolCallChunk.id.length > 0\n ? toolCallChunk.id\n : undefined,\n toolName: toolCallChunk.function?.name,\n });\n }\n\n const tc = toolCallsInProgress.get(index);\n if (!tc) continue;\n\n if (\n typeof toolCallChunk.id === \"string\" &&\n toolCallChunk.id.length > 0 &&\n tc.id === undefined\n ) {\n tc.id = toolCallChunk.id;\n }\n\n const nextToolName = toolCallChunk.function?.name;\n if (typeof nextToolName === \"string\" && nextToolName.length > 0) {\n tc.toolName = nextToolName;\n }\n\n if (!tc.didEmitInputStart && tc.toolName != null && tc.id != null) {\n emitToolInputStart(tc, controller);\n }\n\n const argumentsDelta = toolCallChunk.function?.arguments;\n if (typeof argumentsDelta === \"string\" && argumentsDelta.length > 0) {\n tc.arguments += argumentsDelta;\n\n if (tc.didEmitInputStart && tc.id != null) {\n controller.enqueue({\n delta: argumentsDelta,\n id: tc.id,\n type: \"tool-input-delta\",\n });\n }\n }\n }\n}\n\n/**\n * Wraps an async iterable to catch iteration errors and yield them as values.\n *\n * After the first error, the transformer emits an error event and terminates without\n * a successful finish event.\n * @param iterable - The async iterable to wrap.\n * @param abortSignal - Caller cancellation, which the SAP iterator can otherwise swallow.\n * @yields {Error | T} Original values or Error instances for caught exceptions.\n * @internal\n */\nasync function* safeIterate<T>(\n iterable: AsyncIterable<T>,\n abortSignal: AbortSignal | undefined,\n): AsyncGenerator<Error | T, void> {\n try {\n for await (const chunk of iterable) {\n abortSignal?.throwIfAborted();\n yield chunk;\n }\n abortSignal?.throwIfAborted();\n } catch (error) {\n if (abortSignal?.aborted) {\n yield createAbortError(abortSignal.reason);\n } else {\n yield error instanceof Error ? error : new Error(String(error));\n }\n }\n}\n","/** Base class for language model strategies using the Template Method pattern. */\nimport type {\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3ResponseMetadata,\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 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 } from \"./sap-ai-provider-options.js\";\nimport {\n buildGenerateResult,\n buildModelParams,\n createAISDKRequestBodySummary,\n extractCompletionMetadata,\n extractResponseMetadata,\n mapToolChoice,\n mergeRequestConfig,\n type ParamMapping,\n type SAPToolChoice,\n type SDKCitation,\n type SDKResponse,\n type SDKStreamChunk,\n} from \"./strategy-utils.js\";\nimport {\n createAbortError,\n createStreamTransformer,\n StreamIdGenerator,\n} from \"./stream-transformer.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 cancel: () => void;\n readonly getCitations?: () => SDKCitation[] | undefined;\n readonly getFinishReason: () => null | string | undefined;\n readonly getIntermediateFailures?: () => undefined | unknown[];\n /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n readonly requestId?: string;\n readonly responseHeaders?: Record<string, string>;\n readonly responseMetadata?: LanguageModelV3ResponseMetadata;\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 if (options.abortSignal?.aborted) throw createAbortError(options.abortSignal.reason);\n const commonParts = 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 mergeRequestConfig(config.requestConfig, options.abortSignal, options.headers),\n );\n\n return buildGenerateResult({\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 modelId: config.modelId,\n modelType: \"languageModel\",\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 if (options.abortSignal?.aborted) throw createAbortError(options.abortSignal.reason);\n const commonParts = 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 mergeRequestConfig(config.requestConfig, undefined, options.headers),\n );\n\n const idGenerator = new StreamIdGenerator();\n\n const streamWarnings = this.collectStreamWarnings(settings, commonParts.sapOptions);\n\n const transformedStream = createStreamTransformer({\n cancel: streamResponse.cancel,\n convertToAISDKError,\n extractChunkMetadata: (chunk) => this.extractMetadata(chunk),\n idGenerator,\n includeRawChunks: options.includeRawChunks ?? false,\n modelId: config.modelId,\n options,\n providerName: commonParts.providerName,\n requestId: streamResponse.requestId,\n responseMetadata: {\n ...streamResponse.responseMetadata,\n id: streamResponse.responseMetadata?.id ?? idGenerator.generateResponseId(),\n },\n sdkStream: streamResponse.stream,\n streamResponseGetCitations: streamResponse.getCitations,\n streamResponseGetFinishReason: streamResponse.getFinishReason,\n streamResponseGetIntermediateFailures: streamResponse.getIntermediateFailures,\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 modelId: config.modelId,\n modelType: \"languageModel\",\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 buildCommonParts(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): CommonBuildResult<ChatMessage[], SAPToolChoice | undefined> {\n const providerName = getProviderName(config.provider);\n\n const sapOptions = config.parsedProviderOptions;\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 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 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 completion metadata, request 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 responseMetadata: LanguageModelV3ResponseMetadata;\n } {\n const responseMetadata = extractCompletionMetadata(\n response as { _data?: unknown; getRequestId?: () => string | undefined },\n this.getCompletionDataPath(),\n );\n const { headers, requestId } = extractResponseMetadata(response, \"rawResponse\");\n return { requestId, responseHeaders: headers, responseMetadata };\n }\n\n /**\n * Returns the API-specific path to the completion object in an SDK payload.\n * @returns Completion path (`[\"final_result\"]` for orchestration, `[]` for Foundation Models).\n * @internal\n */\n protected abstract getCompletionDataPath(): 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; the Orchestration override defaults to true unless disabled.\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 assistant reasoning in the input history is forwarded as text.\n * @param sapOptions - Parsed provider options.\n * @param settings - Model settings.\n * @returns Whether to forward input 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","/** Foundation Models language model strategy using `@sap-ai-sdk/foundation-models`. */\nimport type { LanguageModelV3CallOptions, SharedV3Warning } from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type {\n AzureOpenAiChatClient,\n AzureOpenAiChatCompletionParameters,\n AzureOpenAiChatCompletionTool,\n} from \"@sap-ai-sdk/foundation-models\";\nimport type { ChatMessage } from \"@sap-ai-sdk/orchestration\";\n\nimport type { FoundationModelsModelSettings } from \"./sap-ai-settings.js\";\nimport type { LanguageModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport {\n BaseLanguageModelStrategy,\n type CommonBuildResult,\n type StreamCallResponse,\n} from \"./base-language-model-strategy.js\";\nimport {\n buildModelDeployment,\n convertResponseFormat,\n convertToolsToSAPFormat,\n type ParamMapping,\n type SAPToolChoice,\n type SDKResponse,\n type SDKStreamChunk,\n} from \"./strategy-utils.js\";\n\n/** @internal */\ntype FoundationModelsClient = InstanceType<typeof AzureOpenAiChatClient>;\n\n/**\n * Foundation Models API parameter mappings.\n * @internal\n */\nconst FOUNDATION_MODELS_PARAM_MAPPINGS: readonly ParamMapping[] = [\n ...BaseLanguageModelStrategy.COMMON_PARAM_MAPPINGS,\n { camelCaseKey: \"logprobs\", outputKey: \"logprobs\" },\n { camelCaseKey: \"topLogprobs\", outputKey: \"top_logprobs\" },\n { camelCaseKey: \"logitBias\", outputKey: \"logit_bias\" },\n { camelCaseKey: \"user\", outputKey: \"user\" },\n { camelCaseKey: \"n\", outputKey: \"n\" },\n] as const;\n\n/**\n * Language model strategy for the Foundation Models API.\n *\n * Provides direct access to Azure OpenAI models with parameters like:\n * - logprobs\n * - seed\n * - dataSources (On Your Data)\n * @internal\n */\nexport class FoundationModelsLanguageModelStrategy extends BaseLanguageModelStrategy<\n FoundationModelsClient,\n AzureOpenAiChatCompletionParameters,\n FoundationModelsModelSettings\n> {\n private readonly ClientClass: typeof AzureOpenAiChatClient;\n\n constructor(ClientClass: typeof AzureOpenAiChatClient) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected buildRequest(\n _config: LanguageModelStrategyConfig,\n settings: FoundationModelsModelSettings,\n options: LanguageModelV3CallOptions,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): {\n readonly request: AzureOpenAiChatCompletionParameters;\n readonly warnings: SharedV3Warning[];\n } {\n const warnings: SharedV3Warning[] = [];\n\n const toolsResult = convertToolsToSAPFormat<AzureOpenAiChatCompletionTool>(options.tools);\n warnings.push(...toolsResult.warnings);\n\n const { responseFormat, warning: responseFormatWarning } = convertResponseFormat(\n options.responseFormat,\n settings.responseFormat,\n );\n if (responseFormatWarning) {\n warnings.push(responseFormatWarning);\n }\n\n const { toolChoice } = commonParts;\n\n const request: AzureOpenAiChatCompletionParameters = {\n messages: commonParts.messages as AzureOpenAiChatCompletionParameters[\"messages\"],\n ...(commonParts.modelParams as Partial<AzureOpenAiChatCompletionParameters>),\n ...(toolsResult.tools?.length ? { tools: toolsResult.tools } : {}),\n ...(toolChoice ? { tool_choice: toolChoice } : {}),\n ...(responseFormat ? { response_format: responseFormat } : {}),\n ...(settings.dataSources?.length\n ? {\n data_sources: settings.dataSources,\n }\n : {}),\n };\n\n return { request, warnings };\n }\n\n protected createClient(\n config: LanguageModelStrategyConfig,\n settings: FoundationModelsModelSettings,\n _commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): FoundationModelsClient {\n const modelDeployment = buildModelDeployment(config, settings.modelVersion);\n return new this.ClientClass(modelDeployment, config.destination);\n }\n\n protected async executeApiCall(\n client: FoundationModelsClient,\n request: AzureOpenAiChatCompletionParameters,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<SDKResponse> {\n const response = await client.run(request, requestConfig);\n\n const { requestId, responseMetadata } = this.extractMetadata(response);\n\n return {\n getContent: () => response.getContent(),\n getFinishReason: () => response.getFinishReason(),\n getTokenUsage: () => response.getTokenUsage(),\n getToolCalls: () => response.getToolCalls(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- SAP SDK types headers as any\n rawResponse: { headers: response.rawResponse.headers },\n requestId,\n responseMetadata,\n };\n }\n\n protected async executeStreamCall(\n client: FoundationModelsClient,\n request: AzureOpenAiChatCompletionParameters,\n abortSignal: AbortSignal | undefined,\n _settings: FoundationModelsModelSettings,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<StreamCallResponse> {\n const streamResponse = await client.stream(request, abortSignal, requestConfig);\n\n const { requestId, responseHeaders, responseMetadata } = this.extractMetadata(streamResponse);\n\n return {\n cancel: () => {\n streamResponse.stream.controller.abort();\n },\n getFinishReason: () => streamResponse.getFinishReason(),\n requestId,\n responseHeaders,\n responseMetadata,\n stream: streamResponse.stream as AsyncIterable<SDKStreamChunk>,\n };\n }\n\n protected getCompletionDataPath(): readonly string[] {\n return [];\n }\n\n protected getParamMappings(): readonly ParamMapping[] {\n return FOUNDATION_MODELS_PARAM_MAPPINGS;\n }\n\n protected getUrl(): string {\n return \"sap-ai:foundation-models\";\n }\n}\n","/** Orchestration language model strategy using `@sap-ai-sdk/orchestration`. */\nimport type { LanguageModelV3CallOptions, SharedV3Warning } from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type {\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n OrchestrationClient,\n OrchestrationModuleConfig,\n OrchestrationModuleConfigList,\n} from \"@sap-ai-sdk/orchestration\";\n\nimport type { ParsePartProviderOptions } from \"./sap-ai-provider-options.js\";\nimport type {\n OrchestrationModelSettings,\n PromptTemplateRef,\n PromptTemplateRefByID,\n} from \"./sap-ai-settings.js\";\nimport type { LanguageModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport {\n BaseLanguageModelStrategy,\n type CommonBuildResult,\n type StreamCallResponse,\n} from \"./base-language-model-strategy.js\";\nimport { deepMerge } from \"./deep-merge.js\";\nimport {\n orchestrationConfigRefSchema,\n parseSAPPartProviderOptions,\n} from \"./sap-ai-provider-options.js\";\nimport { validateMaskingProvidersDeprecation } from \"./sap-ai-validation.js\";\nimport {\n convertResponseFormat,\n convertToolsToSAPFormat,\n hasKeys,\n type ParamMapping,\n type SAPResponseFormat,\n type SAPToolChoice,\n type SDKResponse,\n type SDKStreamChunk,\n} from \"./strategy-utils.js\";\n\n/** @internal */\ntype OrchestrationClientInstance = InstanceType<typeof OrchestrationClient>;\n\n/**\n * Typed resolved state for values computed in buildCommonParts and consumed in buildRequest/createClient.\n * @internal\n */\ninterface OrchestrationResolvedState {\n readonly configRef: OrchestrationModelSettings[\"orchestrationConfigRef\"];\n readonly promptTemplateRef: PromptTemplateRef | undefined;\n readonly responseFormat: SAPResponseFormat | undefined;\n readonly tools: ChatCompletionTool[] | undefined;\n}\n\n/**\n * Builds the template_ref object from a PromptTemplateRef.\n * @param ref - Template reference (by ID or by name/scenario/version).\n * @returns The template_ref object for SDK consumption.\n * @internal\n */\nfunction buildTemplateRefObject(ref: PromptTemplateRef): Record<string, unknown> {\n return isTemplateRefById(ref)\n ? {\n id: ref.id,\n ...(ref.scope && { scope: ref.scope }),\n }\n : {\n name: ref.name,\n scenario: ref.scenario,\n version: ref.version,\n ...(ref.scope && { scope: ref.scope }),\n };\n}\n\n/**\n * Type guard for template reference by ID.\n * @param ref - Template reference.\n * @returns True if reference is by ID.\n * @internal\n */\nfunction isTemplateRefById(ref: PromptTemplateRef): ref is PromptTemplateRefByID {\n return \"id\" in ref;\n}\n\n/**\n * Merges and resolves placeholder values from settings and provider options.\n * @param settings - Model settings containing placeholderValues.\n * @param sapOptions - Provider options containing placeholderValues.\n * @returns Merged placeholder values or undefined if empty.\n * @internal\n */\nfunction resolvePlaceholderValues(\n settings: OrchestrationModelSettings,\n sapOptions: Record<string, unknown> | undefined,\n): Record<string, string> | undefined {\n const merged = deepMerge(\n settings.placeholderValues as Record<string, unknown> | undefined,\n sapOptions?.placeholderValues as Record<string, unknown> | undefined,\n ) as Record<string, string>;\n\n return hasKeys(merged) ? merged : undefined;\n}\n\n/**\n * Module keys for orchestration configuration.\n * @internal\n */\nconst ORCHESTRATION_MODULE_KEYS = [\"masking\", \"filtering\", \"grounding\", \"translation\"] as const;\n\n/**\n * Module settings that are ignored when using orchestrationConfigRef.\n * @internal\n */\nconst CONFIG_REF_IGNORED_MODULES = [\n ...ORCHESTRATION_MODULE_KEYS,\n \"fallbackModuleConfigs\",\n \"promptTemplateRef\",\n \"responseFormat\",\n \"tools\",\n \"modelParams\",\n \"modelVersion\",\n] as const;\n\n/**\n * Provider options that are ignored when using orchestrationConfigRef.\n * Subset of CONFIG_REF_IGNORED_MODULES that can be passed via providerOptions.\n * @internal\n */\nconst CONFIG_REF_IGNORED_PROVIDER_OPTIONS = [\"promptTemplateRef\", \"modelParams\"] as const;\n\n/**\n * Copies non-empty orchestration modules from source to target.\n * @param target - Target object to copy modules into.\n * @param source - Source object containing module configurations.\n * @internal\n */\nfunction copyOrchestrationModules(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): void {\n for (const key of ORCHESTRATION_MODULE_KEYS) {\n const value = source[key];\n if (value && hasKeys(value)) {\n target[key] = value;\n }\n }\n}\n\n/**\n * Checks if a value is a valid orchestration configuration reference.\n * @param value - The value to check.\n * @returns True if the value is a valid orchestration configuration reference.\n * @internal\n */\nfunction isOrchestrationConfigRef(\n value: unknown,\n): value is NonNullable<OrchestrationModelSettings[\"orchestrationConfigRef\"]> {\n return orchestrationConfigRefSchema.safeParse(value).success;\n}\n\n/**\n * Orchestration API parameter mappings.\n * @internal\n */\nconst ORCHESTRATION_PARAM_MAPPINGS: readonly ParamMapping[] = [\n ...BaseLanguageModelStrategy.COMMON_PARAM_MAPPINGS,\n { camelCaseKey: \"topK\", optionKey: \"topK\", outputKey: \"top_k\" },\n] as const;\n\n/**\n * Language model strategy for the Orchestration API.\n *\n * Provides support for:\n * - Content filtering\n * - Data masking\n * - Document grounding\n * - Translation\n * - Prompt templates\n * - Orchestration config references\n * @internal\n */\nexport class OrchestrationLanguageModelStrategy extends BaseLanguageModelStrategy<\n OrchestrationClientInstance,\n ChatCompletionRequest,\n OrchestrationModelSettings\n> {\n private readonly ClientClass: typeof OrchestrationClient;\n\n constructor(ClientClass: typeof OrchestrationClient) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected buildRequest(\n _config: LanguageModelStrategyConfig,\n settings: OrchestrationModelSettings,\n options: LanguageModelV3CallOptions,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): { readonly request: ChatCompletionRequest; readonly warnings: SharedV3Warning[] } {\n const warnings: SharedV3Warning[] = [];\n\n const { configRef } = commonParts.resolvedState as OrchestrationResolvedState;\n\n if (configRef) {\n return this.buildConfigRefRequest(settings, options, commonParts, warnings);\n }\n\n return this.buildStandardRequest(settings, commonParts, warnings);\n }\n\n /**\n * Collects stream-specific warnings for orchestration.\n * @param settings - Model settings.\n * @param sapOptions - Provider options.\n * @returns Array of warnings for streaming operations.\n * @internal\n */\n protected override collectStreamWarnings(\n settings: OrchestrationModelSettings,\n sapOptions?: Record<string, unknown>,\n ): SharedV3Warning[] {\n const warnings: SharedV3Warning[] = [];\n\n // Skip warning if a valid orchestrationConfigRef is set in settings or providerOptions\n // (local module settings are ignored when using server-side config)\n const configRefCandidate =\n sapOptions?.orchestrationConfigRef ?? settings.orchestrationConfigRef;\n if (configRefCandidate && isOrchestrationConfigRef(configRefCandidate)) {\n return warnings;\n }\n\n if (settings.translation && hasKeys(settings.translation)) {\n if (!settings.streamOptions?.delimiters || settings.streamOptions.delimiters.length === 0) {\n warnings.push({\n message:\n \"Translation module is configured but streamOptions.delimiters is not set. \" +\n \"For proper sentence boundary detection during streaming with translation, \" +\n \"consider setting delimiters (e.g., ['.', '!', '?', '\\\\n']).\",\n type: \"other\",\n });\n }\n }\n\n return warnings;\n }\n\n protected createClient(\n config: LanguageModelStrategyConfig,\n settings: OrchestrationModelSettings,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): OrchestrationClientInstance {\n const { configRef, promptTemplateRef, responseFormat, tools } =\n commonParts.resolvedState as OrchestrationResolvedState;\n\n if (configRef) {\n return new this.ClientClass(configRef, config.deploymentConfig, config.destination);\n }\n\n const clientConfig = this.buildOrchestrationModuleConfig(config, settings, {\n modelParams: commonParts.modelParams,\n promptTemplateRef,\n responseFormat,\n toolChoice: commonParts.toolChoice,\n tools,\n });\n\n if (settings.fallbackModuleConfigs && settings.fallbackModuleConfigs.length > 0) {\n const configList = [\n clientConfig,\n ...settings.fallbackModuleConfigs,\n ] as OrchestrationModuleConfigList;\n return new this.ClientClass(configList, config.deploymentConfig, config.destination);\n }\n\n return new this.ClientClass(clientConfig, config.deploymentConfig, config.destination);\n }\n\n protected async executeApiCall(\n client: OrchestrationClientInstance,\n request: ChatCompletionRequest,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<SDKResponse> {\n const response = await client.chatCompletion(request, requestConfig);\n\n const { requestId, responseMetadata } = this.extractMetadata(response);\n\n return {\n getCitations: () => response.getCitations(),\n getContent: () => response.getContent(),\n getFinishReason: () => response.getFinishReason(),\n getIntermediateFailures: () => response.getIntermediateFailures(),\n getTokenUsage: () => response.getTokenUsage(),\n getToolCalls: () => response.getToolCalls(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- SAP SDK types headers as any\n rawResponse: { headers: response.rawResponse.headers },\n requestId,\n responseMetadata,\n };\n }\n\n protected async executeStreamCall(\n client: OrchestrationClientInstance,\n request: ChatCompletionRequest,\n abortSignal: AbortSignal | undefined,\n settings: OrchestrationModelSettings,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<StreamCallResponse> {\n const sdkStreamOptions = this.buildSdkStreamOptions(settings.streamOptions);\n const streamResponse = await client.stream(\n request,\n abortSignal,\n sdkStreamOptions,\n requestConfig,\n );\n\n const { requestId, responseHeaders, responseMetadata } = this.extractMetadata(streamResponse);\n\n return {\n cancel: () => {\n streamResponse.stream.controller.abort();\n },\n getCitations: () => streamResponse.getCitations(),\n getFinishReason: () => streamResponse.getFinishReason(),\n getIntermediateFailures: () => streamResponse.getIntermediateFailures(),\n requestId,\n responseHeaders,\n responseMetadata,\n stream: streamResponse.stream as AsyncIterable<SDKStreamChunk>,\n };\n }\n\n protected getCompletionDataPath(): readonly string[] {\n return [\"final_result\"];\n }\n\n protected getEscapeTemplatePlaceholders(\n sapOptions: Record<string, unknown> | undefined,\n settings: OrchestrationModelSettings,\n ): boolean {\n return (\n (sapOptions?.escapeTemplatePlaceholders as boolean | undefined) ??\n settings.escapeTemplatePlaceholders ??\n true\n );\n }\n\n protected getParamMappings(): readonly ParamMapping[] {\n return ORCHESTRATION_PARAM_MAPPINGS;\n }\n\n protected override getPartProviderOptionsParser(): ParsePartProviderOptions | undefined {\n return parseSAPPartProviderOptions;\n }\n\n protected getUrl(): string {\n return \"sap-ai:orchestration\";\n }\n\n /**\n * Resolves orchestration-specific extra state: `configRef`, `promptTemplateRef`,\n * and `tools`. Pushes the masking-providers deprecation warning when masking\n * is locally configured (skipped under `configRef` because the server-side\n * configuration overrides it).\n * @param _config - Strategy configuration (unused).\n * @param settings - Model settings.\n * @param sapOptions - Parsed provider options.\n * @param options - AI SDK call options.\n * @param warnings - Shared warnings sink.\n * @returns Resolved orchestration state.\n * @internal\n */\n protected override resolveAdditionalState(\n _config: LanguageModelStrategyConfig,\n settings: OrchestrationModelSettings,\n sapOptions: Record<string, unknown> | undefined,\n options: LanguageModelV3CallOptions,\n warnings: SharedV3Warning[],\n ): OrchestrationResolvedState {\n const configRef = this.resolveConfigRef(sapOptions, settings, warnings);\n const promptTemplateRef = this.resolvePromptTemplateRef(sapOptions, settings);\n\n let responseFormat: SAPResponseFormat | undefined;\n if (configRef === undefined) {\n validateMaskingProvidersDeprecation(settings, warnings);\n const converted = convertResponseFormat(options.responseFormat, settings.responseFormat);\n responseFormat = converted.responseFormat;\n if (converted.warning) warnings.push(converted.warning);\n }\n\n const tools = this.resolveTools(settings, options, warnings);\n\n return { configRef, promptTemplateRef, responseFormat, tools };\n }\n\n /**\n * Builds request for orchestrationConfigRef mode.\n *\n * In configRef mode, the full configuration is managed server-side.\n * This request contains messages and placeholderValues; createClient separately\n * passes the reference, including overrideConfig, to the SAP SDK.\n * @param settings - Model settings.\n * @param options - Call options.\n * @param commonParts - Common build result.\n * @param warnings - Warnings array to populate.\n * @returns Request body and warnings.\n * @internal\n */\n private buildConfigRefRequest(\n settings: OrchestrationModelSettings,\n options: LanguageModelV3CallOptions,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n warnings: SharedV3Warning[],\n ): { readonly request: ChatCompletionRequest; readonly warnings: SharedV3Warning[] } {\n warnings.push(\n ...this.collectConfigRefIgnoredWarnings(settings, options, commonParts.sapOptions),\n );\n\n const placeholderValues = resolvePlaceholderValues(settings, commonParts.sapOptions);\n\n // In configRef mode, SDK uses messagesHistory (not messages)\n const request: ChatCompletionRequest = {\n messagesHistory: commonParts.messages,\n ...(placeholderValues ? { placeholderValues } : {}),\n };\n\n return { request, warnings };\n }\n\n /**\n * Builds inline template configuration.\n * @param tools - Optional tools.\n * @param responseFormat - Optional response format.\n * @returns Prompt configuration.\n * @internal\n */\n private buildInlineTemplateConfig(\n tools: ChatCompletionTool[] | undefined,\n responseFormat: unknown,\n ): Record<string, unknown> {\n return {\n template: [],\n ...(tools && tools.length > 0 ? { tools } : {}),\n ...(responseFormat ? { response_format: responseFormat } : {}),\n };\n }\n\n /**\n * Builds the orchestration module configuration.\n * @param config - Strategy configuration.\n * @param settings - Model settings.\n * @param params - Build parameters.\n * @param params.modelParams - LLM model parameters.\n * @param params.promptTemplateRef - Optional prompt template reference.\n * @param params.responseFormat - Optional response format specification.\n * @param params.toolChoice - Optional tool choice specification.\n * @param params.tools - Optional tools for function calling.\n * @returns Orchestration module configuration.\n * @internal\n */\n private buildOrchestrationModuleConfig(\n config: LanguageModelStrategyConfig,\n settings: OrchestrationModelSettings,\n params: {\n readonly modelParams: Record<string, unknown>;\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: unknown;\n readonly toolChoice?: SAPToolChoice;\n readonly tools?: ChatCompletionTool[];\n },\n ): OrchestrationModuleConfig {\n const { modelParams, promptTemplateRef, responseFormat, toolChoice, tools } = params;\n\n const promptConfig = promptTemplateRef\n ? this.buildTemplateRefPromptConfig(promptTemplateRef, tools, responseFormat)\n : this.buildInlineTemplateConfig(tools, responseFormat);\n\n // The SDK accepts model-specific options such as tool_choice only in model.params.\n const effectiveModelParams = toolChoice\n ? { ...modelParams, tool_choice: toolChoice }\n : modelParams;\n\n const moduleConfig: OrchestrationModuleConfig = {\n promptTemplating: {\n model: {\n name: config.modelId,\n params: effectiveModelParams,\n ...(settings.modelVersion ? { version: settings.modelVersion } : {}),\n },\n prompt: promptConfig,\n },\n };\n\n copyOrchestrationModules(\n moduleConfig as unknown as Record<string, unknown>,\n settings as unknown as Record<string, unknown>,\n );\n\n return moduleConfig;\n }\n\n /**\n * Builds SAP SDK stream options from user-facing stream options.\n * @param streamOptions - User-provided stream options.\n * @returns SDK-compatible stream options object.\n * @internal\n */\n private buildSdkStreamOptions(streamOptions: OrchestrationModelSettings[\"streamOptions\"]): {\n global?: { chunk_size?: number; delimiters?: string[] };\n outputFiltering?: { overlap: number };\n promptTemplating: { include_usage: boolean };\n } {\n const delimiters = streamOptions?.delimiters;\n const hasNonEmptyDelimiters = Array.isArray(delimiters) && delimiters.length > 0;\n const hasGlobalOptions = streamOptions?.chunkSize !== undefined || hasNonEmptyDelimiters;\n\n return {\n promptTemplating: { include_usage: true },\n ...(hasGlobalOptions && {\n global: {\n ...(streamOptions?.chunkSize !== undefined && { chunk_size: streamOptions.chunkSize }),\n ...(hasNonEmptyDelimiters && {\n delimiters: Array.from(delimiters),\n }),\n },\n }),\n ...(streamOptions?.outputFilteringOverlap !== undefined && {\n outputFiltering: { overlap: streamOptions.outputFilteringOverlap },\n }),\n };\n }\n\n /**\n * Builds request for standard (non-configRef) mode.\n * @param settings - Model settings.\n * @param commonParts - Common build result.\n * @param warnings - Warnings array to populate.\n * @returns Request body and warnings.\n * @internal\n */\n private buildStandardRequest(\n settings: OrchestrationModelSettings,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n warnings: SharedV3Warning[],\n ): { readonly request: ChatCompletionRequest; readonly warnings: SharedV3Warning[] } {\n const { promptTemplateRef } = commonParts.resolvedState as OrchestrationResolvedState;\n const placeholderValues = resolvePlaceholderValues(settings, commonParts.sapOptions);\n const request: ChatCompletionRequest = {\n ...(promptTemplateRef\n ? { messagesHistory: commonParts.messages }\n : { messages: commonParts.messages }),\n ...(placeholderValues ? { placeholderValues } : {}),\n };\n\n return { request, warnings };\n }\n\n /**\n * Builds prompt configuration for template reference with optional tools/response_format.\n * @param ref - Template reference.\n * @param tools - Optional tools.\n * @param responseFormat - Optional response format.\n * @returns Prompt configuration.\n * @internal\n */\n private buildTemplateRefPromptConfig(\n ref: PromptTemplateRef,\n tools?: ChatCompletionTool[],\n responseFormat?: unknown,\n ): Record<string, unknown> {\n return {\n template_ref: buildTemplateRefObject(ref),\n ...(tools && tools.length > 0 ? { tools } : {}),\n ...(responseFormat ? { response_format: responseFormat } : {}),\n };\n }\n\n /**\n * Collects warnings for settings that will be ignored when using orchestrationConfigRef.\n * @param settings - The orchestration model settings.\n * @param options - The call options (for tools and responseFormat).\n * @param sapOptions - Parsed provider options (for promptTemplateRef in providerOptions).\n * @returns Array of warnings for ignored settings.\n * @internal\n */\n private collectConfigRefIgnoredWarnings(\n settings: OrchestrationModelSettings,\n options: LanguageModelV3CallOptions,\n sapOptions: Record<string, unknown> | undefined,\n ): SharedV3Warning[] {\n const warnings: SharedV3Warning[] = [];\n const ignoredSettings: string[] = [];\n\n for (const key of CONFIG_REF_IGNORED_MODULES) {\n const value = settings[key as keyof OrchestrationModelSettings];\n if (value !== undefined) {\n if (typeof value === \"object\" && Object.keys(value).length === 0) {\n continue; // Skip empty objects\n }\n ignoredSettings.push(key);\n }\n }\n\n for (const key of CONFIG_REF_IGNORED_PROVIDER_OPTIONS) {\n if (sapOptions?.[key] && !settings[key as keyof OrchestrationModelSettings]) {\n ignoredSettings.push(`providerOptions.${key}`);\n }\n }\n\n const optionValues: Record<string, unknown> = options;\n for (const { optionKey } of this.getParamMappings()) {\n if (optionKey && optionValues[optionKey] !== undefined) {\n ignoredSettings.push(`options.${optionKey}`);\n }\n }\n if (options.stopSequences && options.stopSequences.length > 0) {\n ignoredSettings.push(\"options.stopSequences\");\n }\n\n if (options.tools && options.tools.length > 0) {\n ignoredSettings.push(\"options.tools\");\n }\n if (options.responseFormat) {\n ignoredSettings.push(\"options.responseFormat\");\n }\n if (options.toolChoice) {\n ignoredSettings.push(\"options.toolChoice\");\n }\n\n if (ignoredSettings.length > 0) {\n warnings.push({\n message: `orchestrationConfigRef is set; the following local settings are ignored: ${ignoredSettings.join(\", \")}. The full configuration is managed by the referenced config.`,\n type: \"other\",\n });\n }\n\n return warnings;\n }\n\n /**\n * Resolves the orchestrationConfigRef from provider options or settings.\n * Parsed provider options take priority over settings. An invalid settings reference\n * is ignored with a warning; invalid per-call references fail schema parsing earlier.\n * @param sapOptions - Parsed provider options from commonParts.\n * @param settings - The model settings.\n * @param warnings - Shared warnings sink for degradation signals.\n * @returns The resolved config reference or undefined.\n * @internal\n */\n private resolveConfigRef(\n sapOptions: Record<string, unknown> | undefined,\n settings: OrchestrationModelSettings,\n warnings: SharedV3Warning[],\n ): OrchestrationModelSettings[\"orchestrationConfigRef\"] {\n const configRefCandidate =\n sapOptions?.orchestrationConfigRef ?? settings.orchestrationConfigRef;\n\n if (!configRefCandidate) {\n return undefined;\n }\n\n if (isOrchestrationConfigRef(configRefCandidate)) {\n return configRefCandidate;\n }\n\n warnings.push({\n message:\n \"orchestrationConfigRef is invalid and was ignored; falling back to local module settings.\",\n type: \"other\",\n });\n return undefined;\n }\n\n /**\n * Resolves promptTemplateRef from provider options or settings.\n *\n * Provider options take priority over settings.\n * @param sapOptions - Parsed provider options from commonParts.\n * @param settings - The model settings.\n * @returns The resolved prompt template reference or undefined.\n * @internal\n */\n private resolvePromptTemplateRef(\n sapOptions: Record<string, unknown> | undefined,\n settings: OrchestrationModelSettings,\n ): PromptTemplateRef | undefined {\n const rawTemplateRef = sapOptions?.promptTemplateRef ?? settings.promptTemplateRef;\n\n if (\n rawTemplateRef &&\n typeof rawTemplateRef === \"object\" &&\n (\"id\" in rawTemplateRef || \"name\" in rawTemplateRef)\n ) {\n return rawTemplateRef as PromptTemplateRef;\n }\n\n return undefined;\n }\n\n /**\n * Resolves tools from settings or options with orchestration-specific priority.\n *\n * Orchestration allows tools to be defined in settings (unlike Foundation Models),\n * with options.tools taking priority.\n * @param settings - Model settings.\n * @param options - Call options.\n * @param warnings - Warnings array to populate.\n * @returns Resolved tools or undefined.\n * @internal\n */\n private resolveTools(\n settings: OrchestrationModelSettings,\n options: LanguageModelV3CallOptions,\n warnings: SharedV3Warning[],\n ): ChatCompletionTool[] | undefined {\n const settingsTools = settings.tools;\n const optionsTools = options.tools;\n\n if (settingsTools && settingsTools.length > 0 && optionsTools && optionsTools.length > 0) {\n warnings.push({\n message:\n \"Both settings.tools and call options.tools were provided; preferring call options.tools.\",\n type: \"other\",\n });\n }\n\n // Use settingsTools directly if available and no optionsTools\n // (settingsTools are already in SAP format)\n if (settingsTools && settingsTools.length > 0 && (!optionsTools || optionsTools.length === 0)) {\n return settingsTools;\n }\n\n if (optionsTools && optionsTools.length > 0) {\n const result = convertToolsToSAPFormat<ChatCompletionTool>(optionsTools, {\n parser: parseSAPPartProviderOptions,\n warnings,\n });\n warnings.push(...result.warnings);\n return result.tools;\n }\n\n return undefined;\n }\n}\n","/**\n * `@jerome-benoit/sap-ai-provider/v2` AI SDK 5 (spec V2) entrypoint.\n *\n * Exposes the V2 facades (`LanguageModelV2` / `EmbeddingModelV2` /\n * `ProviderV2`) over the shared V3 core. Also available from the standalone\n * `@jerome-benoit/sap-ai-provider-v2` package. AI SDK 6 can consume these V2\n * interfaces through its compatibility layer; use `v4` with AI SDK 7.\n * @see {@link https://sdk.vercel.ai/} Vercel AI SDK documentation\n */\n\n/**\n * Utility functions for escaping template delimiters (`{{`, `{%`, `{#`) in orchestration content.\n */\nexport {\n escapeOrchestrationPlaceholders,\n unescapeOrchestrationPlaceholders,\n} from \"./convert-to-sap-messages.js\";\n\n/**\n * Embedding model class implementing EmbeddingModelV2 for SAP AI Core.\n * V2 facade over internal implementation.\n */\nexport { SAPAIEmbeddingModelV2 as SAPAIEmbeddingModel } from \"./sap-ai-embedding-model-v2.js\";\n\nexport type { SAPAIEmbeddingModelId } from \"./sap-ai-embedding-model.js\";\n\n/**\n * Custom error classes for Foundation Models API support.\n * - `UnsupportedFeatureError`: Thrown when a feature is used with an incompatible API.\n * - `ApiSwitchError`: Thrown when attempting to switch APIs at invocation time with conflicting settings.\n */\nexport { ApiSwitchError, UnsupportedFeatureError } from \"./sap-ai-error.js\";\n\n/**\n * Language model class implementing LanguageModelV2 for SAP AI Core.\n * V2 facade over internal implementation.\n */\nexport { SAPAILanguageModelV2 as SAPAILanguageModel } from \"./sap-ai-language-model-v2.js\";\n\n/**\n * Provider options for per-call configuration.\n *\n * These schemas and types enable runtime validation of provider options\n * passed via `providerOptions['sap-ai']` in Vercel AI SDK calls.\n */\nexport {\n getProviderName,\n SAP_AI_PROVIDER_NAME,\n sapAIEmbeddingProviderOptions,\n sapAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\n\nexport type {\n SAPAIEmbeddingProviderOptions,\n SAPAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\n\n/**\n * Provider factory function implementing ProviderV2 interface.\n * Creates language and embedding model instances for SAP AI Core.\n */\nexport { createSAPAIProvider, sapai } from \"./sap-ai-provider-v2.js\";\n\nexport type {\n DeploymentConfig,\n SAPAIProviderV2 as SAPAIProvider,\n SAPAIProviderSettings,\n} from \"./sap-ai-provider-v2.js\";\n\n/**\n * Model settings types and model identifier type definitions.\n */\nexport type {\n AzureOpenAiChatExtensionConfiguration,\n CommonModelParams,\n FoundationModelsDefaultSettings,\n FoundationModelsEmbeddingParams,\n FoundationModelsModelParams,\n FoundationModelsModelSettings,\n OrchestrationDefaultSettings,\n OrchestrationModelParams,\n OrchestrationModelSettings,\n OrchestrationStreamOptions,\n PromptTemplateRef,\n PromptTemplateRefByID,\n PromptTemplateRefByScenarioNameVersion,\n PromptTemplateScope,\n ResponseFormat,\n SAPAIApiType,\n SAPAIDefaultSettingsConfig,\n SAPAIEmbeddingSettings,\n SAPAIModelId,\n SAPAIModelSettings,\n SAPAISettings,\n} from \"./sap-ai-settings.js\";\n\n/**\n * SAP AI SDK types and utilities.\n *\n * Re-exported for convenience and advanced usage scenarios.\n */\nexport type {\n AssistantChatMessage,\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n ChatMessageContent,\n ChatMessages,\n Citation,\n DeveloperChatMessage,\n DocumentTranslationApplyToSelector,\n FileContent,\n FilteringModule,\n FunctionObject,\n GroundingModule,\n ImageContentUrl,\n LlmModelDetails,\n LlmModelParams,\n MaskingModule,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- Preserve the upstream deprecated public API.\n OrchestrationConfigRef,\n OrchestrationConfigRefById,\n OrchestrationConfigRefByName,\n OrchestrationConfigRefOverride,\n OrchestrationError,\n OrchestrationModuleConfig,\n OrchestrationModuleConfigList,\n PromptTemplatingModule,\n SystemChatMessage,\n ToolChatMessage,\n TranslationApplyToCategory,\n TranslationInputParameters,\n TranslationModule,\n TranslationOutputParameters,\n TranslationTargetLanguage,\n UserChatMessage,\n UserChatMessageContent,\n UserChatMessageContentItem,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Helper functions for building configurations.\n */\nexport {\n buildAzureContentSafetyFilter,\n buildDocumentGroundingConfig,\n buildDpiMaskingProvider,\n buildLlamaGuard38BFilter,\n buildTranslationConfig,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Response classes from the SAP AI SDK for orchestration results.\n */\nexport {\n OrchestrationEmbeddingResponse,\n OrchestrationResponse,\n OrchestrationStream,\n OrchestrationStreamChunkResponse,\n OrchestrationStreamResponse,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Validation utilities for API selection and feature compatibility.\n * - `resolveApi`: Resolves API type from provider/model/invocation precedence chain.\n * - `validateSettings`: Validates settings are compatible with the selected API.\n */\nexport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\n/**\n * Package version, injected at build time.\n */\nexport { VERSION } from \"./version.js\";\n\n/**\n * SAP AI SDK request configuration type for {@link SAPAIProviderSettings.requestConfig}.\n *\n * Re-exported so consumers do not need a direct dependency on `@sap-ai-sdk/core`.\n * Its shape follows the installed SAP AI SDK version.\n */\nexport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\n\n/**\n * Error handling types and classes for SAP AI Core error responses.\n */\nexport type { OrchestrationErrorResponse } from \"@sap-ai-sdk/orchestration\";\n\n/**\n * Direct access to SAP AI SDK OrchestrationClient.\n *\n * For advanced users who need to use the SAP AI SDK directly.\n */\nexport { OrchestrationClient, OrchestrationEmbeddingClient } from \"@sap-ai-sdk/orchestration\";\n\n/**\n * SAP Cloud SDK destination type for {@link SAPAIProviderSettings.destination}.\n *\n * Re-exported so consumers do not need a direct dependency on\n * `@sap-cloud-sdk/connectivity`. Its shape follows the installed SAP Cloud SDK version.\n */\nexport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n","/** Adapters for the semantic differences between the V3 core and V2 facade. */\n\nimport type {\n LanguageModelV3StreamPart as InternalStreamPart,\n LanguageModelV3Usage as InternalUsage,\n SharedV3Warning as InternalWarning,\n} from \"@ai-sdk/provider\";\nimport type {\n LanguageModelV2CallWarning,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2ProviderMetadata,\n} from \"@ai-sdk/provider-v2\";\n\n/** Stream events supported by the V2 facade. */\nexport type ConvertedV2StreamPart =\n | Exclude<LanguageModelV2StreamPart, { type: \"stream-start\" }>\n | { type: \"stream-start\"; warnings: ConvertedV2Warning[] };\n\n/** V2 warning representation used when adapting V3 feature diagnostics. */\nexport type ConvertedV2Warning = Extract<LanguageModelV2CallWarning, { type: \"other\" }>;\n\n/**\n * Converts V3-only event fields; structurally identical events pass through unchanged.\n * @param internalPart - V3 stream event\n * @returns V2 event, or null for unsupported tool approval requests\n * @internal\n */\nexport function convertStreamPartToV2(\n internalPart: InternalStreamPart,\n): ConvertedV2StreamPart | null {\n // V2 has a narrower JSON metadata type; preserve the core payload without cloning.\n const compatiblePart = internalPart as InternalStreamPart & {\n providerMetadata?: SharedV2ProviderMetadata;\n };\n switch (compatiblePart.type) {\n case \"file\": {\n const { providerMetadata: _providerMetadata, ...part } = compatiblePart;\n return part;\n }\n case \"finish\":\n return {\n ...compatiblePart,\n finishReason: compatiblePart.finishReason.unified,\n usage: convertUsageToV2(compatiblePart.usage),\n };\n case \"stream-start\":\n return { ...compatiblePart, warnings: convertWarningsToV2(compatiblePart.warnings) };\n case \"tool-approval-request\":\n return null;\n case \"tool-call\": {\n const { dynamic: _dynamic, ...part } = compatiblePart;\n return part;\n }\n case \"tool-input-start\": {\n const { dynamic: _dynamic, title: _title, ...part } = compatiblePart;\n return part;\n }\n case \"tool-result\": {\n const { dynamic: _dynamic, preliminary: _preliminary, ...part } = compatiblePart;\n // Provider execution and dynamic tool classification are independent in V3.\n return { ...part, providerExecuted: true };\n }\n default:\n return compatiblePart;\n }\n}\n\n/**\n * Flattens usage without inventing totals when either component is unknown.\n * @param internalUsage - V3 nested usage\n * @returns V2 usage\n * @internal\n */\nexport function convertUsageToV2(internalUsage: InternalUsage): LanguageModelV2Usage {\n return {\n cachedInputTokens: internalUsage.inputTokens.cacheRead,\n inputTokens: internalUsage.inputTokens.total,\n outputTokens: internalUsage.outputTokens.total,\n reasoningTokens: internalUsage.outputTokens.reasoning,\n totalTokens:\n internalUsage.inputTokens.total !== undefined &&\n internalUsage.outputTokens.total !== undefined\n ? internalUsage.inputTokens.total + internalUsage.outputTokens.total\n : undefined,\n };\n}\n\n/**\n * Converts warnings to V2's descriptive other-warning representation.\n * @param internalWarnings - V3 warnings\n * @returns V2 warnings\n * @internal\n */\nexport function convertWarningsToV2(internalWarnings: InternalWarning[]): ConvertedV2Warning[] {\n return internalWarnings.map(convertWarningToV2);\n}\n\n/**\n * Retains feature and compatibility details absent from the V2 warning union.\n * @param internalWarning - V3 warning\n * @returns V2 warning\n * @internal\n */\nexport function convertWarningToV2(internalWarning: InternalWarning): ConvertedV2Warning {\n if (internalWarning.type === \"other\") return internalWarning;\n const prefix =\n internalWarning.type === \"unsupported\" ? \"Unsupported feature\" : \"Compatibility mode\";\n return {\n message: `${prefix}: ${internalWarning.feature}${internalWarning.details ? `. ${internalWarning.details}` : \"\"}`,\n type: \"other\",\n };\n}\n\n/**\n * Converts an internal stream, preserving backpressure, cancellation and errors.\n * @param internalStream - V3 stream\n * @returns V2 stream\n * @internal\n */\nexport function createV2StreamFromInternal(\n internalStream: ReadableStream<InternalStreamPart>,\n): ReadableStream<ConvertedV2StreamPart> {\n return internalStream.pipeThrough(\n new TransformStream<InternalStreamPart, ConvertedV2StreamPart>({\n transform(chunk, controller) {\n const converted = convertStreamPartToV2(chunk);\n if (converted !== null) controller.enqueue(converted);\n },\n }),\n );\n}\n","/**\n * SAP AI Embedding Model - Vercel AI SDK EmbeddingModelV3 implementation for SAP AI Core.\n *\n * This module provides the embedding model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) to generate vector embeddings.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed | Vercel AI SDK embed()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed-many | Vercel AI SDK embedMany()}\n */\nimport type {\n EmbeddingModelV3,\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\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 { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\n\nimport type { SAPAIApiType, SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport {\n getProviderName,\n sapAIEmbeddingProviderOptions,\n validateEmbeddingModelParamsSettings,\n} from \"./sap-ai-provider-options.js\";\nimport {\n type EmbeddingModelStrategyConfig,\n getOrCreateEmbeddingModelStrategy,\n} from \"./sap-ai-strategy.js\";\nimport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\nconst DEFAULT_MAX_EMBEDDINGS_PER_CALL = 2048;\nconst maxEmbeddingsPerCallSchema = z.number().int().positive().or(z.literal(Infinity));\n\n/**\n * Model identifier for SAP AI embedding models.\n *\n * Common embedding model IDs include:\n * - `\"text-embedding-3-small\"` - OpenAI small embedding model (recommended)\n * - `\"text-embedding-3-large\"` - OpenAI large embedding model\n *\n * The actual available models depend on your SAP AI Core deployment configuration.\n * @see {@link https://help.sap.com/docs/sap-ai-core | SAP AI Core Documentation}\n */\nexport type SAPAIEmbeddingModelId = string;\n\n/** @internal */\ninterface SAPAIEmbeddingModelConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Core Embedding Model implementing Vercel AI SDK EmbeddingModelV3.\n *\n * This class provides embedding generation capabilities through SAP AI Core,\n * supporting both the Orchestration API and Foundation Models API.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider\";\n * import { embed, embedMany } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const embeddingModel = provider.embedding(\"text-embedding-3-small\");\n *\n * // Single embedding\n * const { embedding } = await embed({\n * model: embeddingModel,\n * value: \"Hello, world!\",\n * });\n *\n * // Multiple embeddings\n * const { embeddings } = await embedMany({\n * model: embeddingModel,\n * values: [\"Hello\", \"World\"],\n * });\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/embeddings | Vercel AI SDK Embeddings}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAIEmbeddingModel implements EmbeddingModelV3 {\n readonly maxEmbeddingsPerCall: number;\n readonly modelId: string;\n readonly provider: string;\n readonly specificationVersion = \"v3\" as const;\n readonly supportsParallelCalls: boolean = true;\n\n private readonly config: SAPAIEmbeddingModelConfig;\n private readonly settings: SAPAIEmbeddingSettings;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(\n modelId: SAPAIEmbeddingModelId,\n settings: SAPAIEmbeddingSettings = {},\n config: SAPAIEmbeddingModelConfig,\n ) {\n if (settings.modelParams) {\n validateEmbeddingModelParamsSettings(settings.modelParams);\n }\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n this.provider = config.provider;\n this.maxEmbeddingsPerCall = maxEmbeddingsPerCallSchema.parse(\n settings.maxEmbeddingsPerCall ?? DEFAULT_MAX_EMBEDDINGS_PER_CALL,\n );\n }\n\n async doEmbed(options: EmbeddingModelV3CallOptions): Promise<EmbeddingModelV3Result> {\n const providerName = getProviderName(this.config.provider);\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAIEmbeddingProviderOptions,\n });\n\n const effectiveApi = resolveApi(this.config.providerApi, this.settings.api, sapOptions?.api);\n\n validateSettings({\n api: effectiveApi,\n embeddingSettings: this.settings,\n invocationSettings: sapOptions ? { api: sapOptions.api } : undefined,\n modelApi: this.settings.api,\n });\n\n const strategy = await getOrCreateEmbeddingModelStrategy(effectiveApi);\n\n const strategyConfig: EmbeddingModelStrategyConfig = {\n deploymentConfig: this.config.deploymentConfig,\n destination: this.config.destination,\n modelId: this.modelId,\n parsedProviderOptions: sapOptions,\n provider: this.config.provider,\n requestConfig: this.config.requestConfig,\n };\n\n return strategy.doEmbed(strategyConfig, this.settings, options, this.maxEmbeddingsPerCall);\n }\n}\n","/** Strategy pattern infrastructure for SAP AI Core API support. */\nimport type {\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\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 { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type {\n SAPAIEmbeddingProviderOptions,\n SAPAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\nimport type {\n SAPAIApiType,\n SAPAIEmbeddingSettings,\n SAPAIModelSettings,\n} from \"./sap-ai-settings.js\";\n\n/** @internal */\nexport interface EmbeddingModelAPIStrategy {\n doEmbed(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n options: EmbeddingModelV3CallOptions,\n maxEmbeddingsPerCall: number,\n ): Promise<EmbeddingModelV3Result>;\n}\n\n/** @internal */\nexport interface EmbeddingModelStrategyConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly modelId: string;\n readonly parsedProviderOptions?: SAPAIEmbeddingProviderOptions;\n readonly provider: string;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * Strategy interface for language model API implementations.\n * @template TSettings - The model settings type, defaults to SAPAIModelSettings for backward compatibility\n * @internal\n */\nexport interface LanguageModelAPIStrategy<\n TSettings extends SAPAIModelSettings = SAPAIModelSettings,\n> {\n doGenerate(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult>;\n\n doStream(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult>;\n}\n\n/** @internal */\nexport interface LanguageModelStrategyConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly modelId: string;\n readonly parsedProviderOptions?: SAPAILanguageModelProviderOptions;\n readonly provider: string;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/** @internal */\nconst languageModelStrategyCache = new Map<SAPAIApiType, Promise<LanguageModelAPIStrategy>>();\n\n/** @internal */\nconst embeddingModelStrategyCache = new Map<SAPAIApiType, Promise<EmbeddingModelAPIStrategy>>();\n\n/** @internal */\nexport function clearStrategyCaches(): void {\n languageModelStrategyCache.clear();\n embeddingModelStrategyCache.clear();\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Embedding model strategy.\n * @internal\n */\nexport function getOrCreateEmbeddingModelStrategy(\n api: SAPAIApiType,\n): Promise<EmbeddingModelAPIStrategy> {\n const cached = embeddingModelStrategyCache.get(api);\n if (cached) {\n return cached;\n }\n\n // Cache the Promise synchronously before any await to prevent race conditions\n const strategyPromise = createEmbeddingModelStrategy(api);\n embeddingModelStrategyCache.set(api, strategyPromise);\n\n strategyPromise.catch(() => {\n embeddingModelStrategyCache.delete(api);\n });\n\n return strategyPromise;\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Language model strategy.\n * @internal\n */\nexport function getOrCreateLanguageModelStrategy(\n api: SAPAIApiType,\n): Promise<LanguageModelAPIStrategy> {\n const cached = languageModelStrategyCache.get(api);\n if (cached) {\n return cached;\n }\n\n // Cache the Promise synchronously before any await to prevent race conditions\n const strategyPromise = createLanguageModelStrategy(api);\n languageModelStrategyCache.set(api, strategyPromise);\n\n strategyPromise.catch(() => {\n languageModelStrategyCache.delete(api);\n });\n\n return strategyPromise;\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Embedding model strategy.\n */\nasync function createEmbeddingModelStrategy(api: SAPAIApiType): Promise<EmbeddingModelAPIStrategy> {\n if (api === \"foundation-models\") {\n const { AzureOpenAiEmbeddingClient } = await import(\"@sap-ai-sdk/foundation-models\");\n const { FoundationModelsEmbeddingModelStrategy } =\n await import(\"./foundation-models-embedding-model-strategy.js\");\n return new FoundationModelsEmbeddingModelStrategy(AzureOpenAiEmbeddingClient);\n }\n\n const { OrchestrationEmbeddingClient } = await import(\"@sap-ai-sdk/orchestration\");\n const { OrchestrationEmbeddingModelStrategy } =\n await import(\"./orchestration-embedding-model-strategy.js\");\n return new OrchestrationEmbeddingModelStrategy(OrchestrationEmbeddingClient);\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Language model strategy.\n */\nasync function createLanguageModelStrategy(api: SAPAIApiType): Promise<LanguageModelAPIStrategy> {\n if (api === \"foundation-models\") {\n const { AzureOpenAiChatClient } = await import(\"@sap-ai-sdk/foundation-models\");\n const { FoundationModelsLanguageModelStrategy } =\n await import(\"./foundation-models-language-model-strategy.js\");\n return new FoundationModelsLanguageModelStrategy(AzureOpenAiChatClient);\n }\n\n const { OrchestrationClient } = await import(\"@sap-ai-sdk/orchestration\");\n const { OrchestrationLanguageModelStrategy } =\n await import(\"./orchestration-language-model-strategy.js\");\n return new OrchestrationLanguageModelStrategy(OrchestrationClient);\n}\n","/**\n * SAP AI Embedding Model V2 - Vercel AI SDK EmbeddingModelV2 implementation for SAP AI Core.\n *\n * This module provides the embedding model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) to generate vector embeddings.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed | Vercel AI SDK embed()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed-many | Vercel AI SDK embedMany()}\n */\n\nimport type { EmbeddingModelV3CallOptions as InternalCallOptions } from \"@ai-sdk/provider\";\nimport type {\n EmbeddingModelV2,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n SharedV2ProviderOptions,\n} from \"@ai-sdk/provider-v2\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type { SAPAIApiType, SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport { convertWarningsToV2 } from \"./sap-ai-adapters-v3-to-v2.js\";\nimport { SAPAIEmbeddingModel } from \"./sap-ai-embedding-model.js\";\n\n/** @internal */\ninterface SAPAIEmbeddingModelV2Config {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Core Embedding Model implementing Vercel AI SDK EmbeddingModelV2.\n *\n * This class provides embedding generation capabilities through SAP AI Core,\n * supporting both the Orchestration API and Foundation Models API.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider-v2\";\n * import { embed, embedMany } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const embeddingModel = provider.textEmbeddingModel(\"text-embedding-3-small\");\n *\n * // Single embedding\n * const { embedding } = await embed({\n * model: embeddingModel,\n * value: \"Hello, world!\",\n * });\n *\n * // Multiple embeddings\n * const { embeddings } = await embedMany({\n * model: embeddingModel,\n * values: [\"Hello\", \"World\"],\n * });\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/embeddings | Vercel AI SDK Embeddings}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAIEmbeddingModelV2 implements EmbeddingModelV2<string> {\n readonly maxEmbeddingsPerCall: number;\n readonly modelId: string;\n readonly provider: string;\n readonly specificationVersion = \"v2\" as const;\n readonly supportsParallelCalls: boolean = true;\n\n /** @internal */\n private readonly internalModel: SAPAIEmbeddingModel;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(\n modelId: string,\n settings: SAPAIEmbeddingSettings,\n config: SAPAIEmbeddingModelV2Config,\n ) {\n this.internalModel = new SAPAIEmbeddingModel(modelId, settings, config);\n this.provider = this.internalModel.provider;\n this.modelId = this.internalModel.modelId;\n this.maxEmbeddingsPerCall = this.internalModel.maxEmbeddingsPerCall;\n this.supportsParallelCalls = this.internalModel.supportsParallelCalls;\n }\n\n async doEmbed(options: {\n abortSignal?: AbortSignal;\n headers?: Record<string, string | undefined>;\n providerOptions?: SharedV2ProviderOptions;\n values: string[];\n }): Promise<{\n embeddings: number[][];\n providerMetadata?: SharedV2ProviderMetadata;\n response?: {\n body?: unknown;\n headers?: SharedV2Headers;\n };\n usage?: { tokens: number };\n }> {\n // Normalize headers by removing entries with undefined values\n const normalizedHeaders: Record<string, string> | undefined = options.headers\n ? (Object.fromEntries(\n Object.entries(options.headers).filter(([, value]) => value !== undefined),\n ) as Record<string, string>)\n : undefined;\n\n // Map options for the internal model call\n const callOptions: InternalCallOptions = {\n abortSignal: options.abortSignal,\n headers: normalizedHeaders,\n providerOptions: options.providerOptions,\n values: options.values,\n };\n const result = await this.internalModel.doEmbed(callOptions);\n\n // Handle any warnings by logging them (V2 API doesn't support returning warnings)\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (result.warnings && result.warnings.length > 0) {\n const warnings = convertWarningsToV2(result.warnings);\n // Log warnings - convertWarningsToV2 normalizes all warnings to type \"other\" with message\n for (const warning of warnings) {\n console.warn(`[SAP AI Embedding] ${warning.message}`);\n }\n }\n\n // Return result in V2 format\n return {\n embeddings: result.embeddings,\n providerMetadata: result.providerMetadata as SharedV2ProviderMetadata | undefined,\n response: result.response,\n usage: result.usage,\n };\n }\n}\n","/**\n * SAP AI Language Model - Vercel AI SDK LanguageModelV3 implementation for SAP AI Core.\n *\n * This module provides the language model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) for chat completions and streaming.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/generate-text | Vercel AI SDK generateText()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/stream-text | Vercel AI SDK streamText()}\n */\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\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 { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\n\nimport type { SAPAIApiType, SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\n\nimport {\n getProviderName,\n sapAILanguageModelProviderOptions,\n validateModelParamsSettings,\n} from \"./sap-ai-provider-options.js\";\nimport {\n getOrCreateLanguageModelStrategy,\n type LanguageModelAPIStrategy,\n type LanguageModelStrategyConfig,\n} from \"./sap-ai-strategy.js\";\nimport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\n/** @internal */\ninterface SAPAILanguageModelConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Language Model implementing Vercel AI SDK LanguageModelV3.\n *\n * This class provides chat completion and streaming capabilities through SAP AI Core,\n * supporting both the Orchestration API (with content filtering, grounding, masking,\n * and translation) and Foundation Models API (direct Azure OpenAI access).\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider\";\n * import { generateText, streamText } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const model = provider(\"gpt-4.1\");\n *\n * // Non-streaming\n * const { text } = await generateText({\n * model,\n * prompt: \"Hello!\",\n * });\n *\n * // Streaming\n * const result = streamText({\n * model,\n * prompt: \"Tell me a story\",\n * });\n *\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/generating-text | Vercel AI SDK Text Generation}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAILanguageModel implements LanguageModelV3 {\n readonly modelId: SAPAIModelId;\n readonly specificationVersion = \"v3\";\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls(): Record<string, RegExp[]> {\n return {\n \"image/*\": [/^https:\\/\\/.+$/i, /^data:image\\/.*$/],\n };\n }\n\n /** @internal */\n private readonly config: SAPAILanguageModelConfig;\n\n /** @internal */\n private readonly settings: SAPAISettings;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(modelId: SAPAIModelId, settings: SAPAISettings, config: SAPAILanguageModelConfig) {\n if (settings.modelParams) {\n validateModelParamsSettings(settings.modelParams);\n }\n this.settings = settings;\n this.config = config;\n this.modelId = modelId;\n }\n\n async doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult> {\n const { strategy, strategyConfig } = await this.prepareInvocation(options);\n return strategy.doGenerate(strategyConfig, this.settings, options);\n }\n\n async doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult> {\n const { strategy, strategyConfig } = await this.prepareInvocation(options);\n return strategy.doStream(strategyConfig, this.settings, options);\n }\n\n supportsUrl(url: URL): boolean {\n if (url.protocol === \"https:\") return true;\n if (url.protocol === \"data:\") {\n return /^data:image\\//i.test(url.href);\n }\n return false;\n }\n\n /**\n * Prepares common invocation context for doGenerate and doStream.\n * @param options - AI SDK call options.\n * @returns Strategy and configuration for the invocation.\n * @internal\n */\n private async prepareInvocation(options: LanguageModelV3CallOptions): Promise<{\n strategy: LanguageModelAPIStrategy;\n strategyConfig: LanguageModelStrategyConfig;\n }> {\n const providerName = getProviderName(this.config.provider);\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAILanguageModelProviderOptions,\n });\n\n const effectiveApi = resolveApi(this.config.providerApi, this.settings.api, sapOptions?.api);\n\n validateSettings({\n api: effectiveApi,\n invocationSettings: sapOptions\n ? {\n api: sapOptions.api,\n escapeTemplatePlaceholders: sapOptions.escapeTemplatePlaceholders,\n orchestrationConfigRef: sapOptions.orchestrationConfigRef,\n placeholderValues: sapOptions.placeholderValues,\n promptTemplateRef: sapOptions.promptTemplateRef,\n }\n : undefined,\n modelApi: this.settings.api,\n modelSettings: this.settings,\n });\n\n const strategy = await getOrCreateLanguageModelStrategy(effectiveApi);\n\n const strategyConfig: LanguageModelStrategyConfig = {\n deploymentConfig: this.config.deploymentConfig,\n destination: this.config.destination,\n modelId: this.modelId,\n parsedProviderOptions: sapOptions,\n provider: this.config.provider,\n requestConfig: this.config.requestConfig,\n };\n\n return { strategy, strategyConfig };\n }\n}\n","/**\n * SAP AI Language Model V2 - Vercel AI SDK LanguageModelV2 implementation for SAP AI Core.\n *\n * This module provides the language model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) for text generation.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/generate-text | Vercel AI SDK generateText()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/stream-text | Vercel AI SDK streamText()}\n */\n\nimport type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV3CallOptions,\n} from \"@ai-sdk/provider\";\nimport type {\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2ResponseMetadata,\n LanguageModelV2Usage,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n} from \"@ai-sdk/provider-v2\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type { ConvertedV2StreamPart, ConvertedV2Warning } from \"./sap-ai-adapters-v3-to-v2.js\";\nimport type { SAPAIApiType, SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\n\nimport {\n convertUsageToV2,\n convertWarningsToV2,\n createV2StreamFromInternal,\n} from \"./sap-ai-adapters-v3-to-v2.js\";\nimport { SAPAILanguageModel as SAPAILanguageModelInternal } from \"./sap-ai-language-model.js\";\n\n// AI SDK 6.0 shipped V2 tools with the V3 provider-tool discriminator.\ntype CompatibleV2CallOptions = Omit<LanguageModelV2CallOptions, \"tools\"> & {\n tools?: LanguageModelV2CallOptions[\"tools\"] | LanguageModelV3CallOptions[\"tools\"];\n};\n\n/** @internal */\ninterface SAPAILanguageModelV2Config {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Language Model implementing Vercel AI SDK LanguageModelV2.\n *\n * This class provides chat completion and streaming capabilities through SAP AI Core,\n * supporting both the Orchestration API (with content filtering, grounding, masking,\n * and translation) and Foundation Models API (direct Azure OpenAI access).\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider-v2\";\n * import { generateText, streamText } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const model = provider(\"gpt-4.1\");\n *\n * // Non-streaming\n * const { text } = await generateText({\n * model,\n * prompt: \"Hello!\",\n * });\n *\n * // Streaming\n * const result = streamText({\n * model,\n * prompt: \"Tell me a story\",\n * });\n *\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/generating-text | Vercel AI SDK Text Generation}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAILanguageModelV2 implements LanguageModelV2 {\n readonly modelId: SAPAIModelId;\n readonly specificationVersion = \"v2\" as const;\n\n get provider(): string {\n return this.internalModel.provider;\n }\n\n get supportedUrls(): Record<string, RegExp[]> {\n return this.internalModel.supportedUrls;\n }\n\n /** @internal */\n private readonly internalModel: SAPAILanguageModelInternal;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(modelId: SAPAIModelId, settings: SAPAISettings, config: SAPAILanguageModelV2Config) {\n this.modelId = modelId;\n this.internalModel = new SAPAILanguageModelInternal(modelId, settings, config);\n }\n\n async doGenerate(options: CompatibleV2CallOptions): Promise<{\n content: LanguageModelV2Content[];\n finishReason: LanguageModelV2FinishReason;\n providerMetadata?: SharedV2ProviderMetadata;\n request?: {\n body?: unknown;\n };\n response?: LanguageModelV2ResponseMetadata & {\n body?: unknown;\n headers?: SharedV2Headers;\n };\n usage: LanguageModelV2Usage;\n warnings: ConvertedV2Warning[];\n }> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n const result = await this.internalModel.doGenerate(options as any);\n\n // Return result in V2 format\n return {\n content: result.content as LanguageModelV2Content[],\n finishReason: result.finishReason.unified,\n providerMetadata: result.providerMetadata as SharedV2ProviderMetadata | undefined,\n request: result.request,\n response: result.response,\n usage: convertUsageToV2(result.usage),\n warnings: convertWarningsToV2(result.warnings),\n };\n }\n\n async doStream(options: CompatibleV2CallOptions): Promise<{\n request?: {\n body?: unknown;\n };\n response?: {\n headers?: SharedV2Headers;\n };\n stream: ReadableStream<ConvertedV2StreamPart>;\n }> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n const result = await this.internalModel.doStream(options as any);\n\n return {\n request: result.request,\n response: result.response\n ? {\n headers: result.response.headers,\n }\n : undefined,\n stream: createV2StreamFromInternal(result.stream),\n };\n }\n}\n","import type { ImageModelV2, ProviderV2 } from \"@ai-sdk/provider-v2\";\n\nimport { NoSuchModelError } from \"@ai-sdk/provider\";\nimport { setGlobalLogLevel } from \"@sap-cloud-sdk/util\";\n\nimport type { SAPAIEmbeddingModelId } from \"./sap-ai-embedding-model.js\";\nimport type { DeploymentConfig, SAPAIProviderSettings } from \"./sap-ai-provider.js\";\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport { SAPAIEmbeddingModelV2 } from \"./sap-ai-embedding-model-v2.js\";\nimport { SAPAILanguageModelV2 } from \"./sap-ai-language-model-v2.js\";\nimport { SAP_AI_PROVIDER_NAME, validateModelParamsSettings } from \"./sap-ai-provider-options.js\";\nimport { SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\nimport { mergeSettingsWithApi } from \"./sap-ai-validation.js\";\n\nexport type { DeploymentConfig, SAPAIProviderSettings } from \"./sap-ai-provider.js\";\n\n/** SAP AI Provider interface extending Vercel AI SDK ProviderV2. */\nexport interface SAPAIProviderV2 extends ProviderV2 {\n (modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n chat(modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n /** Always throws - SAP AI Core does not support image generation. */\n imageModel(modelId: string): ImageModelV2;\n languageModel(modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n textEmbeddingModel(\n modelId: SAPAIEmbeddingModelId,\n settings?: SAPAIEmbeddingSettings,\n ): SAPAIEmbeddingModelV2;\n}\n\n/**\n * Creates an SAP AI Provider V2 instance for use with AI SDK 5.\n * AI SDK 6 can also consume this provider through its V2 compatibility layer.\n *\n * Uses the official SAP AI SDK (`@sap-ai-sdk/orchestration` and\n * `@sap-ai-sdk/foundation-models`) for API communication. Authentication is automatic via service binding\n * (VCAP_SERVICES on SAP BTP) or AICORE_SERVICE_KEY environment variable.\n * @param options - Provider configuration options.\n * @param options.api - Default API type: `'orchestration'` (default) or `'foundation-models'`.\n * @param options.defaultSettings - Default model settings applied to every model instance.\n * @param options.deploymentId - Explicit SAP AI Core deployment ID; omit for automatic deployment resolution.\n * @param options.destination - Custom SAP Cloud SDK destination configuration.\n * @param options.logLevel - Log level for SAP Cloud SDK loggers (`'debug'`, `'info'`, `'warn'`, `'error'`).\n * @param options.name - Provider name (default: `'sap-ai'`); see {@link SAPAIProviderSettings.name} for namespace rules.\n * @param options.requestConfig - Provider-level custom request configuration. See {@link SAPAIProviderSettings.requestConfig} for scope, portability, and abort semantics.\n * @param options.resourceGroup - SAP AI Core resource group (default: `'default'`); ignored when deploymentId is set.\n * @param options.warnOnAmbiguousConfig - Whether to warn when both deploymentId and resourceGroup are set.\n * @returns A configured SAP AI provider instance that can be used as a callable or via methods.\n * @example\n * // Basic usage with defaults\n * const provider = createSAPAIProvider();\n * const model = provider('gpt-4.1');\n * @example\n * // With custom configuration\n * const provider = createSAPAIProvider({\n * api: 'foundation-models',\n * resourceGroup: 'production',\n * defaultSettings: { modelParams: { temperature: 0.7 } },\n * });\n * @example\n * // Using provider methods\n * const chatModel = provider.chat('gpt-4.1');\n * const embeddingModel = provider.textEmbeddingModel('text-embedding-3-small');\n * @throws {Error} When provider function is called with the `new` keyword.\n * @throws {NoSuchModelError} When `imageModel()` is called (image generation not supported).\n * @see {@link SAPAIProviderSettings} for all configuration options.\n * @see {@link SAPAIProviderV2} for the provider interface.\n */\nexport function createSAPAIProvider(options: SAPAIProviderSettings = {}): SAPAIProviderV2 {\n if (options.defaultSettings?.modelParams) {\n validateModelParamsSettings(options.defaultSettings.modelParams);\n }\n\n const providerName = options.name ?? SAP_AI_PROVIDER_NAME;\n\n const resourceGroup = options.resourceGroup ?? \"default\";\n\n const warnOnAmbiguousConfig = options.warnOnAmbiguousConfig ?? true;\n\n if (warnOnAmbiguousConfig && options.deploymentId && options.resourceGroup) {\n console.warn(\n \"createSAPAIProvider: both 'deploymentId' and 'resourceGroup' were provided; using 'deploymentId' and ignoring 'resourceGroup'.\",\n );\n }\n\n if (typeof process === \"undefined\" || !process.env.SAP_CLOUD_SDK_LOG_LEVEL) {\n const logLevel = options.logLevel ?? \"warn\";\n setGlobalLogLevel(logLevel);\n }\n\n const deploymentConfig: DeploymentConfig = options.deploymentId\n ? { deploymentId: options.deploymentId }\n : { resourceGroup };\n\n // Provider-level API setting (defaults to 'orchestration')\n const providerApi = options.api ?? \"orchestration\";\n\n const createModel = (modelId: SAPAIModelId, settings: SAPAISettings = {}) => {\n const mergedSettings = mergeSettingsWithApi(\n options.defaultSettings as Record<string, unknown> | undefined,\n settings,\n providerApi,\n );\n\n return new SAPAILanguageModelV2(modelId, mergedSettings, {\n deploymentConfig,\n destination: options.destination,\n provider: `${providerName}.chat`,\n providerApi,\n requestConfig: options.requestConfig,\n });\n };\n\n const createEmbeddingModel = (\n modelId: SAPAIEmbeddingModelId,\n settings: SAPAIEmbeddingSettings = {},\n ): SAPAIEmbeddingModelV2 => {\n const mergedSettings = mergeSettingsWithApi(\n options.defaultSettings as Record<string, unknown> | undefined,\n settings,\n providerApi,\n );\n\n return new SAPAIEmbeddingModelV2(modelId, mergedSettings, {\n deploymentConfig,\n destination: options.destination,\n provider: `${providerName}.embedding`,\n providerApi,\n requestConfig: options.requestConfig,\n });\n };\n\n const provider = function (modelId: SAPAIModelId, settings?: SAPAISettings) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (new.target) {\n throw new Error(\"The SAP AI provider function cannot be called with the new keyword.\");\n }\n\n return createModel(modelId, settings);\n };\n\n provider.chat = createModel;\n provider.languageModel = createModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({\n message: `SAP AI Core does not support image generation. Model '${modelId}' is not available.`,\n modelId,\n modelType: \"imageModel\",\n });\n };\n\n return provider;\n}\n\n/** Default SAP AI provider instance with automatic authentication via SAP AI SDK. */\nexport const sapai = createSAPAIProvider();\n","import type { AzureOpenAiChatCompletionParameters } from \"@sap-ai-sdk/foundation-models\";\nimport type {\n ChatCompletionTool,\n ChatModel,\n FilteringModule,\n GroundingModule,\n MaskingModule,\n OrchestrationConfigRefById,\n OrchestrationConfigRefByName,\n OrchestrationModuleConfig,\n TranslationModule,\n} from \"@sap-ai-sdk/orchestration\";\n\n/** Azure OpenAI chat extension configuration for \"On Your Data\" RAG scenarios. */\nexport type AzureOpenAiChatExtensionConfiguration = NonNullable<\n AzureOpenAiChatCompletionParameters[\"data_sources\"]\n>[number];\n\n/**\n * Common model parameters shared between both APIs.\n *\n * Known parameters are validated by Zod in constructor settings and per-call\n * `modelParams` provider options; additional model-specific keys are passed through.\n */\nexport interface CommonModelParams {\n /**\n * Frequency penalty to reduce repetition of token sequences.\n * Range: -2.0 to 2.0\n */\n readonly frequencyPenalty?: number;\n /**\n * Maximum number of tokens to generate.\n * Range: Positive integer\n */\n readonly maxTokens?: number;\n /**\n * Number of completions to generate.\n * Availability depends on the selected SAP API and model; no model-family filtering is applied.\n * Range: Positive integer\n */\n readonly n?: number;\n /** Whether to enable parallel tool calls when multiple tools are available. */\n readonly parallel_tool_calls?: boolean;\n /**\n * Presence penalty to encourage talking about new topics.\n * Range: -2.0 to 2.0\n */\n readonly presencePenalty?: number;\n /** Index signature for additional model-specific parameters. */\n readonly [key: string]: unknown;\n /**\n * Sampling temperature controlling randomness.\n * Higher values (e.g., 1.0) make output more random, lower values (e.g., 0.2) more deterministic.\n * Range: 0 to 2\n */\n readonly temperature?: number;\n /**\n * Nucleus sampling parameter. Only tokens with cumulative probability up to `topP` are considered.\n * Range: 0 to 1\n */\n readonly topP?: number;\n}\n\n/** Default settings configuration when using Foundation Models API. */\nexport interface FoundationModelsDefaultSettings {\n readonly api: \"foundation-models\";\n readonly settings?: FoundationModelsModelSettings;\n}\n\n/** Model parameters for Foundation Models Embedding API. */\nexport interface FoundationModelsEmbeddingParams {\n readonly dimensions?: number;\n readonly encoding_format?: \"base64\" | \"float\";\n readonly user?: string;\n}\n\n/** Model parameters for Foundation Models API with Azure OpenAI-specific extensions. */\nexport interface FoundationModelsModelParams extends CommonModelParams {\n readonly logit_bias?: AzureOpenAiChatCompletionParameters[\"logit_bias\"];\n readonly logprobs?: AzureOpenAiChatCompletionParameters[\"logprobs\"];\n readonly seed?: AzureOpenAiChatCompletionParameters[\"seed\"];\n readonly stop?: AzureOpenAiChatCompletionParameters[\"stop\"];\n /** Requires logprobs=true. */\n readonly top_logprobs?: AzureOpenAiChatCompletionParameters[\"top_logprobs\"];\n readonly user?: AzureOpenAiChatCompletionParameters[\"user\"];\n}\n\n/** Model settings when using Foundation Models API. */\nexport interface FoundationModelsModelSettings {\n readonly api: \"foundation-models\";\n /** Azure OpenAI \"On Your Data\" configuration for RAG scenarios. */\n readonly dataSources?: AzureOpenAiChatExtensionConfiguration[];\n /**\n * Forward assistant reasoning from the input history as text; does not enable reasoning output.\n * @default false\n */\n readonly includeReasoning?: boolean;\n readonly modelParams?: FoundationModelsModelParams;\n readonly modelVersion?: string;\n readonly responseFormat?: ResponseFormat;\n}\n\n/** Default settings configuration when using Orchestration API. */\nexport interface OrchestrationDefaultSettings {\n readonly api?: \"orchestration\";\n readonly settings?: OrchestrationModelSettings;\n}\n\n/** Model parameters for Orchestration API. */\nexport type OrchestrationModelParams = CommonModelParams;\n\n/** Model settings when using Orchestration API with filtering, grounding, masking, and translation. */\nexport interface OrchestrationModelSettings {\n readonly api?: \"orchestration\";\n /** @default true */\n readonly escapeTemplatePlaceholders?: boolean;\n /**\n * Additional module configurations for prompt module fallback.\n * These entries follow the primary configuration in the list passed to the SAP SDK.\n * Each entry is a full `OrchestrationModuleConfig` with its own model, prompt, and modules.\n * @example\n * ```ts\n * fallbackModuleConfigs: [\n * {\n * promptTemplating: {\n * model: { name: \"gpt-4.1-mini\" },\n * prompt: { template: [] },\n * },\n * },\n * ]\n * ```\n */\n readonly fallbackModuleConfigs?: OrchestrationModuleConfig[];\n readonly filtering?: FilteringModule;\n readonly grounding?: GroundingModule;\n /**\n * Forward assistant reasoning from the input history as text; does not enable reasoning output.\n * @default false\n */\n readonly includeReasoning?: boolean;\n readonly masking?: MaskingModule | { providers: MaskingModule[\"masking_providers\"] };\n readonly modelParams?: OrchestrationModelParams;\n readonly modelVersion?: string;\n /**\n * Reference to a complete orchestration configuration stored in SAP AI Core Prompt Registry.\n * When provided, local module settings (filtering, masking, grounding, translation, tools,\n * promptTemplateRef, responseFormat) are ignored as the full configuration is managed\n * by the referenced config. The reference, including its explicit `overrideConfig`,\n * is passed to the SAP SDK; messages and `placeholderValues` remain request inputs.\n * @example { id: \"f47ac10b-58cc-4372-a567-0e02b2c3d479\" }\n * @example { scenario: \"customer-support\", name: \"prod-config\", version: \"1.0.0\" }\n */\n readonly orchestrationConfigRef?: OrchestrationConfigRefById | OrchestrationConfigRefByName;\n readonly placeholderValues?: Record<string, string>;\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: ResponseFormat;\n /**\n * Options for streaming behavior with locally configured post-LLM modules.\n * Includes direct `doStream()` calls; ignored when `orchestrationConfigRef` is used.\n */\n readonly streamOptions?: OrchestrationStreamOptions;\n readonly tools?: ChatCompletionTool[];\n readonly translation?: TranslationModule;\n}\n\n/**\n * Stream options for orchestration post-LLM module processing.\n * Controls chunking behavior for translation, filtering, and other modules during streaming.\n * Ignored with `orchestrationConfigRef`; configure streaming in the stored\n * configuration or its `overrideConfig` instead.\n */\nexport interface OrchestrationStreamOptions {\n /**\n * Minimum number of characters per chunk for post-LLM modules.\n * Valid range: 1-10000. Defaults to 100.\n */\n readonly chunkSize?: number;\n /**\n * Delimiters for splitting stream into chunks (e.g., sentence boundaries).\n * Recommended for translation; the provider warns when local translation settings lack them.\n * @example [\"\\n\", \".\", \"?\", \"!\"]\n */\n readonly delimiters?: readonly string[];\n /**\n * Additional characters from previous chunks sent to output filtering for context.\n * Valid range: 0-10000.\n */\n readonly outputFilteringOverlap?: number;\n}\n\n/** Reference to a template in SAP AI Core's Prompt Registry. */\nexport type PromptTemplateRef = PromptTemplateRefByID | PromptTemplateRefByScenarioNameVersion;\n\n/** Reference to a Prompt Registry template by ID. */\nexport interface PromptTemplateRefByID {\n readonly id: string;\n readonly scope?: PromptTemplateScope;\n}\n\n/** Reference to a Prompt Registry template by scenario, name, and version. */\nexport interface PromptTemplateRefByScenarioNameVersion {\n readonly name: string;\n readonly scenario: string;\n readonly scope?: PromptTemplateScope;\n readonly version: string;\n}\n\n/** Scope for Prompt Registry templates: 'tenant' (default) or 'resource_group'. */\nexport type PromptTemplateScope = \"resource_group\" | \"tenant\";\n\n/** Response format for structured output (OpenAI-compatible). */\nexport type ResponseFormat = AzureOpenAiChatCompletionParameters[\"response_format\"];\n\n/**\n * Supported API types for SAP AI Core.\n *\n * - `'orchestration'` - Full-featured API with data masking, content filtering, document grounding, and translation.\n * - `'foundation-models'` - Direct model access with Azure OpenAI-specific parameters like `logprobs`, `seed`, and `dataSources`.\n */\nexport type SAPAIApiType = \"foundation-models\" | \"orchestration\";\n\n/** Union type for API-specific default settings configuration. */\nexport type SAPAIDefaultSettingsConfig =\n FoundationModelsDefaultSettings | OrchestrationDefaultSettings;\n\n/** Settings for the SAP AI Embedding Model. */\nexport interface SAPAIEmbeddingSettings {\n readonly api?: SAPAIApiType;\n /** Orchestration API only. */\n readonly masking?: MaskingModule | { providers: MaskingModule[\"masking_providers\"] };\n /**\n * Maximum batch size: a positive integer, or `Infinity` for no provider-side limit.\n * @default 2048\n */\n readonly maxEmbeddingsPerCall?: number;\n readonly modelParams?: FoundationModelsEmbeddingParams | Record<string, unknown>;\n readonly modelVersion?: string;\n readonly [key: string]: unknown;\n /**\n * Orchestration embedding input type; ignored by Foundation Models.\n * @default 'text'\n */\n readonly type?: \"document\" | \"query\" | \"text\";\n}\n\n/**\n * Supported model IDs in SAP AI Core.\n *\n * Model availability depends on tenant configuration and region.\n * Common values include: `'gpt-4.1'`, `'gpt-4.1-mini'`, `'anthropic--claude-4.5-sonnet'`, `'gemini-2.5-pro'`.\n * @see {@link https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/models-and-scenarios-in-generative-ai-hub | SAP AI Core Models}\n */\nexport type SAPAIModelId = ChatModel;\n\n/**\n * Union type for model settings - supports both APIs.\n *\n * Use `FoundationModelsModelSettings` for Foundation Models API features (dataSources, logprobs, seed).\n * Use `OrchestrationModelSettings` for Orchestration API features (filtering, grounding, masking, translation).\n */\nexport type SAPAIModelSettings = FoundationModelsModelSettings | OrchestrationModelSettings;\n\n/** Re-exported SAP AI SDK orchestration types. */\nexport type {\n FilteringModule,\n GroundingModule,\n MaskingModule,\n TranslationModule,\n} from \"@sap-ai-sdk/orchestration\";\n\nexport {\n buildAzureContentSafetyFilter,\n buildDocumentGroundingConfig,\n buildDpiMaskingProvider,\n buildLlamaGuard38BFilter,\n buildTranslationConfig,\n} from \"@sap-ai-sdk/orchestration\";\n\n/**\n * Settings for configuring SAP AI Core model behavior.\n * Legacy interface maintained for backward compatibility - prefer OrchestrationModelSettings\n * or FoundationModelsModelSettings for API-specific type safety.\n */\nexport interface SAPAISettings {\n readonly api?: SAPAIApiType;\n /** @default true */\n readonly escapeTemplatePlaceholders?: boolean;\n /** Orchestration API only. */\n readonly fallbackModuleConfigs?: OrchestrationModuleConfig[];\n /** Orchestration API only. */\n readonly filtering?: FilteringModule;\n /** Orchestration API only. */\n readonly grounding?: GroundingModule;\n /**\n * Forward assistant reasoning from the input history as text; does not enable reasoning output.\n * @default false\n */\n readonly includeReasoning?: boolean;\n /** Orchestration API only. */\n readonly masking?: MaskingModule | { providers: MaskingModule[\"masking_providers\"] };\n readonly modelParams?: CommonModelParams;\n readonly modelVersion?: string;\n /** Orchestration API only. */\n readonly orchestrationConfigRef?: OrchestrationConfigRefById | OrchestrationConfigRefByName;\n /** Orchestration API only. */\n readonly placeholderValues?: Record<string, string>;\n /** Orchestration API only. */\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: ResponseFormat;\n /** Orchestration API only; ignored when `orchestrationConfigRef` is used. */\n readonly streamOptions?: OrchestrationStreamOptions;\n /** Orchestration API only. */\n readonly tools?: ChatCompletionTool[];\n /** Orchestration API only. */\n readonly translation?: TranslationModule;\n}\n\nexport type {\n AssistantChatMessage,\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n ChatMessageContent,\n ChatMessages,\n Citation,\n DeveloperChatMessage,\n DocumentTranslationApplyToSelector,\n FileContent,\n FunctionObject,\n ImageContentUrl,\n LlmModelDetails,\n LlmModelParams,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- Preserve the upstream deprecated public API.\n OrchestrationConfigRef,\n OrchestrationConfigRefById,\n OrchestrationConfigRefByName,\n OrchestrationConfigRefOverride,\n OrchestrationError,\n OrchestrationModuleConfig,\n OrchestrationModuleConfigList,\n PromptTemplatingModule,\n SystemChatMessage,\n ToolChatMessage,\n TranslationApplyToCategory,\n TranslationInputParameters,\n TranslationOutputParameters,\n TranslationTargetLanguage,\n UserChatMessage,\n UserChatMessageContent,\n UserChatMessageContentItem,\n} from \"@sap-ai-sdk/orchestration\";\n\nexport {\n OrchestrationEmbeddingResponse,\n OrchestrationResponse,\n OrchestrationStream,\n OrchestrationStreamChunkResponse,\n OrchestrationStreamResponse,\n} from \"@sap-ai-sdk/orchestration\";\n"],"mappings":"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","names":["message","import_provider","import_zod","import_provider","convertToAISDKError","import_provider_utils","import_zod","FoundationModelsEmbeddingModelStrategy","OrchestrationEmbeddingClient","OrchestrationEmbeddingModelStrategy","FoundationModelsLanguageModelStrategy","OrchestrationClient","OrchestrationLanguageModelStrategy","import_provider_utils","import_provider","import_util","import_orchestration","import_orchestration"]}
|
|
1
|
+
{"version":3,"sources":["../src/sap-ai-provider-options.ts","../src/convert-to-sap-messages.ts","../src/sap-ai-error.ts","../src/abort-utils.ts","../src/deep-merge.ts","../src/strategy-utils.ts","../src/version.ts","../src/base-embedding-model-strategy.ts","../src/foundation-models-embedding-model-strategy.ts","../src/sap-ai-validation.ts","../src/orchestration-embedding-model-strategy.ts","../src/responses-adapters-v3-to-v4.ts","../src/adapter-metadata.ts","../src/responses-adapters-v4-to-v3.ts","../src/sap-http-stream.ts","../src/responses-http-transport.ts","../src/responses-language-model-strategy.ts","../src/stream-transformer.ts","../src/base-language-model-strategy.ts","../src/foundation-models-language-model-strategy.ts","../src/orchestration-language-model-strategy.ts","../src/index-v2.ts","../src/sap-ai-adapters-v3-to-v2.ts","../src/map-readable-stream.ts","../src/sap-ai-embedding-model.ts","../src/sap-ai-strategy.ts","../src/sap-ai-embedding-model-v2.ts","../src/sap-ai-adapters-v2-to-v3.ts","../src/sap-ai-language-model.ts","../src/sap-ai-language-model-v2.ts","../src/sap-ai-provider-v2.ts","../src/sap-ai-settings.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","import type {\n AssistantChatMessage,\n ChatMessage,\n ReasoningBlock,\n SystemChatMessage,\n ToolChatMessage,\n UserChatMessage,\n UserChatMessageContentItem,\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\nimport { orchestrationReasoningBlockSchema } 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 /** Configured namespace for lossless native Orchestration reasoning history. */\n readonly nativeReasoningProviderName?: string;\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 * Issues reported by the parser are forwarded to the AI SDK call result.\n * The SAP parser deduplicates identical messages rather than warning per occurrence.\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\nconst SUPPORTED_IMAGE_FORMATS = [\"image/png\", \"image/jpeg\", \"image/jpg\", \"image/gif\", \"image/webp\"];\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 * Serializes tool output, preserving BigInt values as strings and using a text\n * representation when JSON serialization is unavailable (for example, cycles).\n * @param value - The tool output to serialize.\n * @returns JSON or fallback text.\n * @throws {InvalidPromptError} When neither JSON nor text serialization is possible.\n * @internal\n */\nfunction safeJsonStringify(value: unknown): string {\n try {\n const serialized: unknown = JSON.stringify(value, (_key, val) =>\n typeof val === \"bigint\" ? val.toString() : (val as unknown),\n );\n if (typeof serialized === \"string\") return serialized;\n } catch {\n // Fall back to the output's text representation.\n }\n try {\n return String(value);\n } catch {\n throw new InvalidPromptError({ message: \"Tool output cannot be serialized.\", prompt: value });\n }\n}\n\n/**\n * Serializes tool arguments, rejecting values that cannot be represented as JSON.\n * @param input - Tool arguments or an already serialized JSON string.\n * @returns Serialized arguments.\n */\nfunction serializeToolCallInput(input: unknown): string {\n try {\n if (typeof input === \"string\") {\n JSON.parse(input);\n return input;\n }\n const serialized: unknown = JSON.stringify(input);\n if (typeof serialized === \"string\") return serialized;\n } catch {\n // Report invalid arguments as a prompt error instead of emitting an invalid SAP request.\n }\n throw new InvalidPromptError({\n message: \"Tool call input must be JSON-serializable.\",\n prompt: input,\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 * Encodes bytes as base64 using `btoa`, without the Node.js `Buffer` global.\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 // Native validation rejects detached and out-of-bounds views, including empty ones.\n Uint8Array.prototype.at.call(bytes, 0);\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 * Maps V3 message roles to SAP messages:\n * - `system` → `SystemChatMessage`\n * - `user` (text/images/files) → `UserChatMessage`\n * - `assistant` (text/tool-calls, optionally reasoning) → `AssistantChatMessage`\n * - `tool` (direct text values; other output variants as JSON) → `ToolChatMessage`\n * Unsupported assistant parts and non-result tool parts are ignored, with\n * warnings when a warning sink is supplied.\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 user content or file data types.\n * @throws {InvalidPromptError} When message roles or tool arguments are invalid, or tool output cannot be serialized.\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: undefined | { cacheControl?: CacheControl; text: string }[] = parser\n ? []\n : undefined;\n let anyCacheControl = false;\n let reasoningContent: ReasoningBlock[] | undefined;\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 const nativeNamespace = options.nativeReasoningProviderName;\n const nativeOptions: unknown =\n nativeNamespace === undefined ? undefined : part.providerOptions?.[nativeNamespace];\n if (\n nativeOptions !== null &&\n typeof nativeOptions === \"object\" &&\n !Array.isArray(nativeOptions) &&\n Object.hasOwn(nativeOptions, \"reasoningContent\")\n ) {\n const parsed = orchestrationReasoningBlockSchema.safeParse(\n (nativeOptions as Record<string, unknown>).reasoningContent,\n );\n if (!parsed.success) {\n throw new InvalidPromptError({\n message: \"Invalid native Orchestration reasoning metadata.\",\n prompt,\n });\n }\n (reasoningContent ??= []).push(parsed.data);\n break;\n }\n if (includeReasoning && part.text) {\n const reasoning = `<think>${part.text}</think>`;\n text += reasoning;\n textParts?.push({ text: reasoning });\n }\n break;\n }\n case \"text\": {\n if (!part.text) break;\n const partOpts = parsePart(part.providerOptions);\n const cacheControl = partOpts?.cacheControl;\n text += part.text;\n textParts?.push(\n cacheControl ? { cacheControl, text: part.text } : { text: part.text },\n );\n if (cacheControl) anyCacheControl = true;\n break;\n }\n case \"tool-call\": {\n const partOpts = parsePart(part.providerOptions);\n if (partOpts?.cacheControl) {\n pushWarningOnce(\n \"cacheControl on assistant tool-call\",\n \"SAP orchestration does not expose cache_control on the assistant tool-call envelope.\",\n );\n }\n const argumentsJson = serializeToolCallInput(part.input);\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 || reasoningContent?.length) {\n const assistantMessage: AssistantChatMessage = {\n content:\n anyCacheControl && textParts\n ? textParts.map((p) => wrapAsTextContent(maybeEscape(p.text), p.cacheControl))\n : maybeEscape(text),\n role: \"assistant\",\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n ...(reasoningContent && { reasoning_content: reasoningContent }),\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 outputText =\n part.output.type === \"text\" ? part.output.value : safeJsonStringify(part.output);\n const escaped = maybeEscape(outputText);\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: UserChatMessageContentItem[] = [];\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 const normalizedMediaType = part.mediaType.toLowerCase();\n if (normalizedMediaType.startsWith(\"image/\")) {\n const isWildcardImageUrl =\n getURLHref(part.data) !== undefined && normalizedMediaType === \"image/*\";\n if (!isWildcardImageUrl && !SUPPORTED_IMAGE_FORMATS.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, \"{\");\n}\n\n/**\n * Returns a file URL or builds a base64 data URL from inline file data.\n *\n * Genuine URL objects pass through without being fetched. Base64 strings are\n * embedded verbatim without validation; Uint8Array and ArrayBuffer inputs are\n * encoded. Buffer-like objects must have a custom `toString(\"base64\")` method\n * returning canonical base64. Other objects are rejected.\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 original URL string or an inline data URL.\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","/** Error conversion utilities for SAP AI Core to Vercel AI SDK error types. */\nimport type { OrchestrationErrorResponse } from \"@sap-ai-sdk/orchestration\";\n\nimport {\n APICallError,\n InvalidPromptError,\n LoadAPIKeyError,\n NoSuchModelError,\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\";\nimport { isErrorWithCause } from \"@sap-cloud-sdk/util\";\n\nimport type { SAPAIApiType } from \"./sap-ai-settings.js\";\n\ninterface AxiosResponse {\n data?: unknown;\n headers?: unknown;\n status?: number;\n}\n\n/** Request metadata used when translating SAP failures. */\ninterface ErrorContext {\n httpStatusCode?: number;\n modelId?: string;\n modelType?: \"embeddingModel\" | \"languageModel\";\n operation?: string;\n requestBody?: unknown;\n responseHeaders?: Record<string, string>;\n url?: string;\n}\n\n/** Diagnostic response body is retained explicitly, never appended to the message. */\ninterface ResolvedErrorContext extends ErrorContext {\n responseBody?: string;\n}\n\n/**\n * @internal\n */\nconst HTTP_STATUS = {\n BAD_REQUEST: 400,\n CLIENT_CLOSED_REQUEST: 499,\n CONFLICT: 409,\n FORBIDDEN: 403,\n INTERNAL_ERROR: 500,\n NOT_FOUND: 404,\n RATE_LIMIT: 429,\n REQUEST_TIMEOUT: 408,\n SERVICE_UNAVAILABLE: 503,\n UNAUTHORIZED: 401,\n} as const;\n\nconst RETRYABLE_NETWORK_CODES = new Set([\n \"EAI_AGAIN\",\n \"ECONNABORTED\",\n \"ECONNREFUSED\",\n \"ECONNRESET\",\n \"EHOSTUNREACH\",\n \"ENETUNREACH\",\n \"ENOTFOUND\",\n \"EPIPE\",\n \"ETIMEDOUT\",\n]);\n\n/**\n * Error message matchers for categorization and retryability.\n * @internal\n */\nconst ERROR_MATCHERS = [\n {\n category: \"network\",\n isRetryable: true,\n keywords: [\"econnrefused\", \"enotfound\", \"network\", \"timeout\"],\n statusCode: HTTP_STATUS.SERVICE_UNAVAILABLE,\n },\n {\n category: \"destination\",\n isRetryable: false,\n keywords: [\"could not resolve destination\"],\n message: (original: string) =>\n `SAP AI Core destination error: ${original}\\n\\n` +\n `Check your destination configuration or provide a valid destinationName.`,\n statusCode: HTTP_STATUS.BAD_REQUEST,\n },\n {\n category: \"content filtered\",\n isRetryable: false,\n keywords: [\"filtered by the output filter\"],\n message: (original: string) =>\n `Content was filtered: ${original}\\n\\n` +\n `The model's response was blocked by content safety filters. Try a different prompt.`,\n statusCode: HTTP_STATUS.BAD_REQUEST,\n },\n {\n category: \"stream consumption\",\n isRetryable: false,\n keywords: [\"consumed stream\"],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"streaming\",\n isRetryable: true,\n keywords: [\n \"iterating over\",\n \"parse message into json\",\n \"received from\",\n \"no body\",\n \"invalid sse payload\",\n ],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"configuration\",\n isRetryable: false,\n keywords: [\n \"prompt template or messages must be defined\",\n \"filtering parameters cannot be empty\",\n \"templating yaml string must be non-empty\",\n \"could not access response data\",\n \"could not parse json\",\n \"error parsing yaml\",\n \"yaml does not conform\",\n \"validation errors\",\n ],\n statusCode: HTTP_STATUS.BAD_REQUEST,\n },\n {\n category: \"environment\",\n isRetryable: false,\n keywords: [\"buffer is not available as globals\"],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"response stream\",\n isRetryable: false,\n keywords: [\"response stream is undefined\"],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"response processing\",\n isRetryable: true,\n keywords: [\n \"response is required to process\",\n \"stream is still open\",\n \"data is not available yet\",\n ],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"deployment retrieval\",\n isRetryable: true,\n keywords: [\"failed to fetch the list of deployments\"],\n statusCode: HTTP_STATUS.SERVICE_UNAVAILABLE,\n },\n {\n category: \"stream buffer\",\n isRetryable: false,\n keywords: [\"received non-uint8array\"],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n] as const;\n\n/**\n * Keywords that indicate an authentication error.\n * @internal\n */\nconst AUTHENTICATION_ERROR_KEYWORDS = [\n \"authentication\",\n \"unauthorized\",\n \"aicore_service_key\",\n \"invalid credentials\",\n \"service credentials\",\n \"service binding\",\n] as const;\n\n/**\n * Keywords that indicate a deployment/model resolution error.\n * @internal\n */\nconst DEPLOYMENT_ERROR_KEYWORDS = [\n \"failed to resolve deployment\",\n \"no deployment matched\",\n] as const;\n\n/**\n * Error thrown when attempting to switch APIs at invocation time with conflicting model settings.\n * @example\n * ```typescript\n * const model = provider(\"gpt-4.1\", { filtering: { ... } });\n *\n * await generateText({\n * model,\n * providerOptions: { [SAP_AI_PROVIDER_NAME]: { api: \"foundation-models\" } },\n * prompt: \"Hello\",\n * });\n * // Throws: ApiSwitchError(\"orchestration\", \"foundation-models\", \"filtering\")\n * ```\n * @see {@link validateSettings} - Main validation function that throws this error\n * @see {@link UnsupportedFeatureError} - Related error for features unsupported by an API\n */\nexport class ApiSwitchError extends Error {\n /**\n * Creates a new ApiSwitchError.\n * @param fromApi - The API the model was configured with.\n * @param toApi - The API being switched to at invocation time.\n * @param conflictingFeature - The feature that prevents the API switch.\n */\n constructor(\n public readonly fromApi: SAPAIApiType,\n public readonly toApi: SAPAIApiType,\n public readonly conflictingFeature: string,\n ) {\n super(\n `Cannot switch from ${fromApi} to ${toApi} API at invocation time because ` +\n `${conflictingFeature} would be ignored. Create a new model instance without ` +\n `${fromApi}-specific features, or keep using the ${fromApi} API.`,\n );\n this.name = \"ApiSwitchError\";\n }\n}\n\n/**\n * Error thrown when a feature is used with an incompatible API.\n * @example\n * ```typescript\n * throw new UnsupportedFeatureError(\"Content filtering\", \"foundation-models\", \"orchestration\");\n * // Rejects the request: content filtering requires the Orchestration API.\n * ```\n * @see {@link validateSettings} - Main validation function that throws this error\n * @see {@link ApiSwitchError} - Related error for API switching conflicts\n */\nexport class UnsupportedFeatureError extends Error {\n /**\n * Creates a new UnsupportedFeatureError.\n * @param feature - The name of the unsupported feature (e.g., \"Content filtering\").\n * @param api - The API being used that does not support the feature.\n * @param suggestedApi - The API that supports this feature.\n */\n constructor(\n public readonly feature: string,\n public readonly api: SAPAIApiType,\n public readonly suggestedApi: SAPAIApiType,\n ) {\n const names: Record<SAPAIApiType, string> = {\n \"foundation-models\": \"Foundation Models\",\n orchestration: \"Orchestration\",\n responses: \"Responses\",\n };\n const apiName = names[api];\n const suggestedApiName = names[suggestedApi];\n super(`${feature} is not supported by ${apiName} API. Use ${suggestedApiName} API instead.`);\n this.name = \"UnsupportedFeatureError\";\n }\n}\n\n/**\n * Converts a structured SAP error response to the appropriate Vercel AI SDK error.\n * @param errorResponse - SAP orchestration error response.\n * @param context - Request context.\n * @param context.modelId - Known requested model ID, preferred over message-based extraction.\n * @param context.modelType - Requested model kind (defaults to languageModel).\n * @param context.httpStatusCode - Fallback HTTP status when the body code is missing or outside the HTTP status range.\n * @param context.requestBody - Original request body.\n * @param context.responseHeaders - Response headers.\n * @param context.url - Request URL.\n * @returns LoadAPIKeyError for 401/403, NoSuchModelError for 404, or APICallError otherwise.\n */\nexport function convertSAPErrorToAPICallError(\n errorResponse: OrchestrationErrorResponse,\n context?: ErrorContext,\n): APICallError | LoadAPIKeyError | NoSuchModelError {\n const { code, location, message, requestId } = extractErrorFields(errorResponse);\n\n const statusCode = getStatusCodeFromSAPError(code, context?.httpStatusCode);\n\n const responseBody = JSON.stringify({\n error: {\n code,\n location,\n message,\n request_id: requestId,\n },\n });\n\n let enhancedMessage = message;\n\n if (statusCode === HTTP_STATUS.UNAUTHORIZED || statusCode === HTTP_STATUS.FORBIDDEN) {\n enhancedMessage +=\n \"\\n\\nAuthentication failed. Verify your AICORE_SERVICE_KEY environment variable is set correctly.\" +\n \"\\nSee: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/create-service-key\";\n if (requestId) {\n enhancedMessage += `\\nRequest ID: ${requestId}`;\n }\n return new LoadAPIKeyError({\n message: enhancedMessage,\n });\n }\n\n if (statusCode === HTTP_STATUS.NOT_FOUND) {\n enhancedMessage +=\n \"\\n\\nResource not found. The model or deployment may not exist in your SAP AI Core instance.\" +\n \"\\nSee: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/create-deployment-for-orchestration\";\n if (requestId) {\n enhancedMessage += `\\nRequest ID: ${requestId}`;\n }\n const modelId = context?.modelId ?? extractModelIdentifier(message, location);\n return new NoSuchModelError({\n message: enhancedMessage,\n modelId: modelId ?? \"unknown\",\n modelType: context?.modelType ?? \"languageModel\",\n });\n }\n\n if (statusCode === HTTP_STATUS.RATE_LIMIT) {\n enhancedMessage +=\n \"\\n\\nRate limit exceeded. Please try again later or contact your SAP administrator.\" +\n \"\\nSee: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/rate-limits\";\n } else if (statusCode >= HTTP_STATUS.INTERNAL_ERROR) {\n enhancedMessage +=\n \"\\n\\nSAP AI Core service error. This is typically a temporary issue. Retries depend on the caller's retry configuration.\" +\n \"\\nSee: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/troubleshooting\";\n } else if (location) {\n enhancedMessage += `\\n\\nError location: ${location}`;\n }\n\n if (requestId) {\n enhancedMessage += `\\nRequest ID: ${requestId}`;\n }\n\n return new APICallError({\n isRetryable: isRetryable(statusCode),\n message: enhancedMessage,\n requestBodyValues: context?.requestBody,\n responseBody,\n responseHeaders: context?.responseHeaders,\n statusCode,\n url: context?.url ?? \"\",\n });\n}\n\n/**\n * Converts SAP failures while preserving standard request and API errors across SDK versions.\n * @param error - Error to convert.\n * @param context - Request context.\n * @param context.modelId - Known requested model ID, preferred over message-based extraction.\n * @param context.modelType - Requested model kind (defaults to languageModel).\n * @param context.operation - Operation name.\n * @param context.requestBody - Original request body.\n * @param context.responseHeaders - Response headers.\n * @param context.url - Request URL.\n * @returns Vercel AI SDK error.\n */\nexport function convertToAISDKError(\n error: unknown,\n context?: ErrorContext,\n):\n | APICallError\n | InvalidPromptError\n | LoadAPIKeyError\n | NoSuchModelError\n | UnsupportedFunctionalityError {\n if (\n APICallError.isInstance(error) ||\n LoadAPIKeyError.isInstance(error) ||\n NoSuchModelError.isInstance(error) ||\n InvalidPromptError.isInstance(error) ||\n UnsupportedFunctionalityError.isInstance(error)\n ) {\n return error;\n }\n\n const { aborted, networkCode, noMatchingDeployment, response, rootError, syntaxError } =\n inspectError(error);\n if (noMatchingDeployment && !aborted) {\n // SAP serializes discovery criteria, including custom destination credentials.\n // Neither the criteria nor the original cause may escape this boundary.\n return new NoSuchModelError({\n message:\n \"SAP AI Core has no running deployment matching the requested model. \" +\n \"Check the model ID, model version, resource group, and deployment status in your SAP AI Core instance.\",\n modelId: context?.modelId ?? \"unknown\",\n modelType: context?.modelType ?? \"languageModel\",\n });\n }\n const responseHeaders = context?.responseHeaders ?? normalizeHeaders(response?.headers);\n if (!aborted) {\n const errorResponse = findStructuredErrorResponse(\n syntaxError ? undefined : rootError,\n response?.data,\n );\n if (errorResponse) {\n return convertSAPErrorToAPICallError(errorResponse, {\n ...context,\n httpStatusCode: response?.status ?? context?.httpStatusCode,\n responseHeaders,\n });\n }\n }\n\n const resolvedContext: ResolvedErrorContext = {\n ...context,\n responseBody: serializeAxiosResponseData(response?.data),\n responseHeaders,\n };\n if (aborted) {\n return createAPICallError(\n // Preserve cancellation priority without retaining credential-bearing criteria.\n noMatchingDeployment ? undefined : error,\n {\n isRetryable: false,\n message: \"Request was aborted by the client\",\n statusCode: HTTP_STATUS.CLIENT_CLOSED_REQUEST,\n },\n resolvedContext,\n );\n }\n\n // Successful headers do not establish a successful response-body read.\n if (\n isHttpStatus(response?.status) &&\n (networkCode === undefined ||\n syntaxError !== undefined ||\n response.status < 200 ||\n response.status >= 300)\n ) {\n return createAPICallError(\n error,\n {\n isRetryable: isRetryable(response.status),\n message:\n syntaxError && error instanceof Error\n ? error.message\n : rootError instanceof Error\n ? rootError.message\n : \"SAP AI Core request failed\",\n statusCode: response.status,\n },\n resolvedContext,\n );\n }\n\n // Native parser messages can contain credential or response fragments. Keep the\n // enclosing SDK message instead, with the original chain available only as cause.\n if (syntaxError) {\n return createAPICallError(\n error,\n {\n isRetryable: false,\n message:\n error instanceof Error && error !== syntaxError\n ? error.message\n : \"Failed to parse SAP AI Core data.\",\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n resolvedContext,\n );\n }\n\n if (networkCode) {\n return createAPICallError(\n error,\n {\n isRetryable: true,\n message: `SAP AI Core network error (${networkCode})`,\n statusCode: HTTP_STATUS.SERVICE_UNAVAILABLE,\n },\n resolvedContext,\n );\n }\n\n if (rootError instanceof Error) {\n const errorMsg = rootError.message.toLowerCase();\n const originalErrorMsg = rootError.message;\n\n if (AUTHENTICATION_ERROR_KEYWORDS.some((keyword) => errorMsg.includes(keyword))) {\n return new LoadAPIKeyError({\n message:\n `SAP AI Core authentication failed: ${originalErrorMsg}\\n\\n` +\n `Make sure your AICORE_SERVICE_KEY environment variable is set correctly.\\n` +\n `See: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/create-service-key`,\n });\n }\n\n if (DEPLOYMENT_ERROR_KEYWORDS.some((keyword) => errorMsg.includes(keyword))) {\n const modelId = context?.modelId ?? extractModelIdentifier(originalErrorMsg);\n return new NoSuchModelError({\n message:\n `SAP AI Core deployment error: ${originalErrorMsg}\\n\\n` +\n `Make sure you have a running orchestration deployment in your SAP AI Core instance.\\n` +\n `See: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/create-deployment-for-orchestration`,\n modelId: modelId ?? \"unknown\",\n modelType: context?.modelType ?? \"languageModel\",\n });\n }\n\n const statusMatch = /status code (\\d+)/i.exec(originalErrorMsg);\n const extractedStatus = statusMatch?.[1] ? Number.parseInt(statusMatch[1], 10) : undefined;\n if (isHttpStatus(extractedStatus)) {\n return createAPICallError(\n error,\n {\n isRetryable: isRetryable(extractedStatus),\n message: `SAP AI Core request failed: ${originalErrorMsg}`,\n statusCode: extractedStatus,\n },\n resolvedContext,\n );\n }\n\n for (const matcher of ERROR_MATCHERS) {\n if (matcher.keywords.some((keyword) => errorMsg.includes(keyword))) {\n const message =\n \"message\" in matcher\n ? matcher.message(originalErrorMsg)\n : `SAP AI Core ${matcher.category} error: ${originalErrorMsg}`;\n return createAPICallError(\n error,\n {\n isRetryable: matcher.isRetryable,\n message,\n statusCode: matcher.statusCode,\n },\n resolvedContext,\n );\n }\n }\n }\n\n const message =\n rootError instanceof Error\n ? rootError.message\n : typeof rootError === \"string\"\n ? rootError\n : \"Unknown error occurred\";\n\n const fullMessage = context?.operation\n ? `SAP AI Core ${context.operation} failed: ${message}`\n : `SAP AI Core error: ${message}`;\n\n return createAPICallError(\n error,\n {\n isRetryable: false,\n message: fullMessage,\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n resolvedContext,\n );\n}\n\n/**\n * Normalizes various header formats to a string record.\n * @param headers - Headers to normalize.\n * @returns Normalized headers record.\n */\nexport function normalizeHeaders(headers: unknown): Record<string, string> | undefined {\n if (!headers || typeof headers !== \"object\") return undefined;\n\n if (typeof Headers !== \"undefined\" && headers instanceof Headers) {\n const out = Object.fromEntries(headers.entries());\n return Object.keys(out).length === 0 ? undefined : out;\n }\n\n const record = headers as Record<string, unknown>;\n const entries = Object.entries(record).flatMap(([key, value]) => {\n const k = key.toLowerCase();\n if (typeof value === \"string\") return [[k, value]];\n if (Array.isArray(value)) {\n const strings = value.filter((item): item is string => typeof item === \"string\").join(\"; \");\n return strings.length > 0 ? [[k, strings]] : [];\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return [[k, String(value)]];\n }\n return [];\n });\n\n if (entries.length === 0) return undefined;\n return Object.fromEntries(entries) as Record<string, string>;\n}\n\n/**\n * Builds an API error with diagnostics kept separate from the message.\n * @param error - Original error.\n * @param options - Error options.\n * @param options.isRetryable - Whether error is retryable.\n * @param options.message - Error message.\n * @param options.statusCode - HTTP status code.\n * @param context - Request context.\n * @param context.operation - Operation name.\n * @param context.requestBody - Original request body.\n * @param context.responseHeaders - Response headers.\n * @param context.url - Request URL.\n * @returns API call error.\n * @internal\n */\nfunction createAPICallError(\n error: unknown,\n options: {\n isRetryable: boolean;\n message: string;\n statusCode: number;\n },\n context?: ResolvedErrorContext,\n): APICallError {\n return new APICallError({\n cause: error,\n isRetryable: options.isRetryable,\n message: options.message,\n requestBodyValues: context?.requestBody,\n responseBody: context?.responseBody,\n responseHeaders: context?.responseHeaders,\n statusCode: options.statusCode,\n url: context?.url ?? \"\",\n });\n}\n\n/**\n * @param response - SAP orchestration error response.\n * @returns Destructured error fields (message, code, location, requestId).\n * @internal\n */\nfunction extractErrorFields(response: OrchestrationErrorResponse): {\n code?: number;\n location?: string;\n message: string;\n requestId?: string;\n} {\n const innerError = response.error;\n if (Array.isArray(innerError)) {\n const first = innerError[0] as\n undefined | { code?: number; location?: string; message: string; request_id?: string };\n return {\n code: first?.code,\n location: first?.location,\n message: first?.message ?? \"Unknown SAP AI error\",\n requestId: first?.request_id,\n };\n }\n const entry = innerError as {\n code?: number;\n location?: string;\n message: string;\n request_id?: string;\n };\n return {\n code: entry.code,\n location: entry.location,\n message: entry.message,\n requestId: entry.request_id,\n };\n}\n\n/**\n * @param message - Error message.\n * @param location - Error location.\n * @returns Extracted model identifier.\n * @internal\n */\nfunction extractModelIdentifier(message: string, location?: string): string | undefined {\n const patterns = [\n /deployment[:\\s]+([a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*)/i,\n /model[:\\s]+([a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*)/i,\n /resource[:\\s]+([a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*)/i,\n ];\n\n for (const pattern of patterns) {\n const match = pattern.exec(message);\n if (match?.[1]) {\n return match[1];\n }\n }\n\n if (location) {\n const locationMatch = /([a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*)/.exec(location);\n if (locationMatch?.[1]) {\n return locationMatch[1];\n }\n }\n\n return undefined;\n}\n\n/**\n * @param rootError - Root cause after inspecting the chain.\n * @param axiosData - Response data retained from an Axios wrapper.\n * @returns A structured SAP response when available.\n */\nfunction findStructuredErrorResponse(\n rootError: unknown,\n axiosData: unknown,\n): OrchestrationErrorResponse | undefined {\n if (isStructuredErrorResponse(rootError)) return rootError;\n if (isStructuredErrorResponse(axiosData)) return axiosData;\n if (rootError instanceof Error) {\n const parsed = tryExtractSAPErrorFromMessage(rootError.message);\n if (isStructuredErrorResponse(parsed)) return parsed;\n }\n return undefined;\n}\n\n/**\n * @param code - SAP error code.\n * @param httpStatusCode - HTTP status code from the response, used as fallback.\n * @returns HTTP status code.\n * @internal\n */\nfunction getStatusCodeFromSAPError(code?: number, httpStatusCode?: number): number {\n if (isHttpStatus(code)) {\n return code;\n }\n\n if (isHttpStatus(httpStatusCode)) {\n return httpStatusCode;\n }\n\n return HTTP_STATUS.INTERNAL_ERROR;\n}\n\n/**\n * Inspects native and SAP cause chains once, keeping transport metadata from wrappers.\n * @param error - Raw SDK error.\n * @returns The terminal cause, transport metadata, and classified native failures.\n */\nfunction inspectError(error: unknown): {\n aborted: boolean;\n networkCode?: string;\n noMatchingDeployment: boolean;\n response?: AxiosResponse;\n rootError: unknown;\n syntaxError?: SyntaxError;\n} {\n const seen = new Set<object>();\n let rootError = error;\n let current = error;\n let response: AxiosResponse | undefined;\n let aborted = false;\n let networkCode: string | undefined;\n let noMatchingDeployment = false;\n let syntaxError: SyntaxError | undefined;\n while (typeof current === \"object\" && current !== null && !seen.has(current)) {\n seen.add(current);\n rootError = current;\n noMatchingDeployment ||=\n current instanceof Error &&\n current.message.startsWith(\"No deployment matched the given criteria:\");\n aborted ||= isAbortError(current);\n if (current instanceof SyntaxError) syntaxError ??= current;\n if (current instanceof Error && \"code\" in current && typeof current.code === \"string\") {\n if (RETRYABLE_NETWORK_CODES.has(current.code)) networkCode ??= current.code;\n }\n const entry = current as { cause?: unknown; isAxiosError?: boolean; response?: AxiosResponse };\n if (response === undefined && entry.isAxiosError === true) response = entry.response;\n // SAP ErrorWithCause exposes a native cause too. Avoid its recursive rootCause\n // getter when that cause is present so cyclic chains cannot overflow the stack.\n const cause =\n \"cause\" in entry\n ? entry.cause\n : current instanceof Error && isErrorWithCause(current)\n ? current.rootCause\n : undefined;\n if (cause === undefined || (typeof cause === \"object\" && cause !== null && seen.has(cause))) {\n break;\n }\n rootError = cause;\n current = cause;\n }\n return { aborted, networkCode, noMatchingDeployment, response, rootError, syntaxError };\n}\n\n/**\n * Identifies native aborts and Axios cancellations retained in SAP error causes.\n * @param error - Error to check.\n * @returns Whether the error represents request cancellation.\n * @internal\n */\nfunction isAbortError(error: object): boolean {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n return true;\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n return true;\n }\n const transportError = error as { code?: unknown; isAxiosError?: unknown };\n return transportError.isAxiosError === true && transportError.code === \"ERR_CANCELED\";\n}\n\n/**\n * @param status - Candidate HTTP status.\n * @returns Whether the value is an integer HTTP status.\n */\nfunction isHttpStatus(status: unknown): status is number {\n return typeof status === \"number\" && Number.isInteger(status) && status >= 100 && status < 600;\n}\n\n/**\n * @param statusCode - HTTP status code.\n * @returns True if error is retryable.\n * @internal\n */\nfunction isRetryable(statusCode: number): boolean {\n return (\n statusCode === HTTP_STATUS.REQUEST_TIMEOUT ||\n statusCode === HTTP_STATUS.CONFLICT ||\n statusCode === HTTP_STATUS.RATE_LIMIT ||\n (statusCode >= HTTP_STATUS.INTERNAL_ERROR && statusCode < 600)\n );\n}\n\n/**\n * @param error - Error to check.\n * @returns True if error is an orchestration error response.\n * @internal\n */\nfunction isStructuredErrorResponse(error: unknown): error is OrchestrationErrorResponse {\n if (error === null || typeof error !== \"object\" || !(\"error\" in error)) {\n return false;\n }\n\n const errorEnvelope = error as { error?: unknown };\n const innerError = errorEnvelope.error;\n\n if (innerError === undefined) return false;\n\n if (Array.isArray(innerError)) {\n return innerError.every((entry) => {\n if (entry === null || typeof entry !== \"object\" || !(\"message\" in entry)) {\n return false;\n }\n const errorEntry = entry as { code?: unknown; message?: unknown };\n if (typeof errorEntry.message !== \"string\") {\n return false;\n }\n if (\"code\" in entry && errorEntry.code != null && typeof errorEntry.code !== \"number\") {\n return false;\n }\n return true;\n });\n }\n\n if (typeof innerError !== \"object\" || innerError === null || !(\"message\" in innerError)) {\n return false;\n }\n\n const errorObj = innerError as { code?: unknown; message?: unknown };\n if (typeof errorObj.message !== \"string\") {\n return false;\n }\n if (\"code\" in innerError && errorObj.code != null && typeof errorObj.code !== \"number\") {\n return false;\n }\n\n return true;\n}\n\n/**\n * @param data - Data to serialize.\n * @param maxLength - Maximum output length.\n * @returns Serialized data.\n * @internal\n */\nfunction serializeAxiosResponseData(data: unknown, maxLength = 2000): string | undefined {\n if (data === undefined) return undefined;\n\n let serialized: string;\n try {\n if (typeof data === \"string\") {\n serialized = data;\n } else {\n const json: unknown = JSON.stringify(data, null, 2);\n serialized = typeof json === \"string\" ? json : `[Unable to serialize: ${typeof data}]`;\n }\n } catch {\n serialized = `[Unable to serialize: ${typeof data}]`;\n }\n\n if (serialized.length > maxLength) {\n return serialized.slice(0, maxLength) + \"...[truncated]\";\n }\n return serialized;\n}\n\n/**\n * @param message - Error message to parse.\n * @returns Extracted SAP error or null.\n * @internal\n */\nfunction tryExtractSAPErrorFromMessage(message: string): unknown {\n const startIdx = message.indexOf(\"{\");\n if (startIdx === -1) return null;\n\n let depth = 0;\n let endIdx = -1;\n let inString = false;\n let escaped = false;\n for (let i = startIdx; i < message.length; i++) {\n const character = message.charCodeAt(i);\n if (inString) {\n if (escaped) escaped = false;\n else if (character === 0x5c) escaped = true;\n else if (character === 0x22) inString = false;\n continue;\n }\n if (character === 0x22) inString = true;\n else if (character === 0x7b) depth++;\n else if (character === 0x7d) {\n depth--;\n if (depth === 0) {\n endIdx = i;\n break;\n }\n }\n }\n if (endIdx === -1) return null;\n\n try {\n const parsed: unknown = JSON.parse(message.slice(startIdx, endIdx + 1));\n\n if (parsed && typeof parsed === \"object\" && \"error\" in parsed) {\n return parsed;\n }\n\n if (parsed && typeof parsed === \"object\" && \"message\" in parsed) {\n return { error: parsed as Record<string, unknown> };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n","/** 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","/** 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 * 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","/**\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","/** Base class for embedding model strategies using the Template Method pattern. */\nimport type {\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Embedding,\n EmbeddingModelV3Result,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\n\nimport { TooManyEmbeddingValuesForCallError } from \"@ai-sdk/provider\";\n\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\nimport type { EmbeddingModelAPIStrategy, EmbeddingModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport { throwIfAborted, waitWithAbort } from \"./abort-utils.js\";\nimport { deepMerge } from \"./deep-merge.js\";\nimport { convertToAISDKError } from \"./sap-ai-error.js\";\nimport { getProviderName } from \"./sap-ai-provider-options.js\";\nimport {\n buildEmbeddingResult,\n type EmbeddingProviderOptions,\n type EmbeddingType,\n mergeRequestConfig,\n type ResponseMetadata,\n} from \"./strategy-utils.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * Abstract base class for embedding model strategies using the Template Method pattern.\n * @template TClient - The SDK client type (e.g., AzureOpenAiEmbeddingClient, OrchestrationEmbeddingClient).\n * @template TResponse - The API response type from the SDK client.\n * @internal\n */\nexport abstract class BaseEmbeddingModelStrategy<\n TClient,\n TResponse,\n> implements EmbeddingModelAPIStrategy {\n /**\n * Template method implementing the shared embedding algorithm.\n * @param config - Strategy configuration.\n * @param settings - Embedding model settings.\n * @param options - AI SDK call options.\n * @param maxEmbeddingsPerCall - Maximum embeddings per call.\n * @returns Complete embedding result for AI SDK.\n * @internal\n */\n async doEmbed(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n options: EmbeddingModelV3CallOptions,\n maxEmbeddingsPerCall: number,\n ): Promise<EmbeddingModelV3Result> {\n const { abortSignal, values } = options;\n\n try {\n if (values.length > maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n maxEmbeddingsPerCall,\n modelId: config.modelId,\n provider: config.provider,\n values,\n });\n }\n throwIfAborted(abortSignal);\n const embeddingOptions = config.parsedProviderOptions;\n const providerName = getProviderName(config.provider);\n\n const embeddingType = embeddingOptions?.type ?? settings.type ?? \"text\";\n\n const warnings: SharedV3Warning[] = [];\n this.resolveWarnings(settings, warnings);\n\n const client = this.createClient(config, settings, embeddingOptions);\n\n const response = await waitWithAbort(\n this.executeCall(\n client,\n values,\n embeddingType,\n mergeRequestConfig(config.requestConfig, abortSignal, options.headers),\n ),\n abortSignal,\n );\n throwIfAborted(abortSignal);\n\n const embeddings = this.extractEmbeddings(response);\n const totalTokens = this.extractTokenCount(response);\n const { headers: responseHeaders, requestId } = this.extractResponseMetadata(response);\n\n return buildEmbeddingResult({\n embeddings,\n modelId: config.modelId,\n providerName,\n requestId,\n responseHeaders,\n totalTokens,\n version: VERSION,\n warnings,\n });\n } catch (error) {\n if (error instanceof TooManyEmbeddingValuesForCallError) {\n throw error;\n }\n throw convertToAISDKError(error, {\n modelId: config.modelId,\n modelType: \"embeddingModel\",\n operation: \"doEmbed\",\n requestBody: { values: values.length },\n url: this.getUrl(),\n });\n }\n }\n\n /**\n * Creates the appropriate SDK client for this API.\n * @param config - Strategy configuration.\n * @param settings - Embedding model settings.\n * @param embeddingOptions - Parsed provider options from the call.\n * @returns SDK client instance.\n * @internal\n */\n protected abstract createClient(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n embeddingOptions: EmbeddingProviderOptions | undefined,\n ): TClient;\n\n /**\n * Executes the embedding API call.\n * @param client - SDK client instance.\n * @param values - Input strings to embed.\n * @param embeddingType - Type of embedding (text, query, document).\n * @param requestConfig - Request configuration with merged headers and abort signal.\n * @returns SDK response containing embeddings.\n * @internal\n */\n protected abstract executeCall(\n client: TClient,\n values: string[],\n embeddingType: EmbeddingType,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<TResponse>;\n\n /**\n * Extracts embeddings from the SDK response.\n * @param response - SDK response containing embedding data.\n * @returns Array of normalized embedding vectors.\n * @internal\n */\n protected abstract extractEmbeddings(response: TResponse): EmbeddingModelV3Embedding[];\n\n /**\n * Extracts response metadata (request id and HTTP headers) from the SDK response.\n *\n * Default returns both fields as `undefined`; subclasses override to extract from the SDK response.\n * @param _response - SDK response.\n * @returns Combined `{ headers, requestId }` metadata.\n * @internal\n */\n protected extractResponseMetadata(_response: TResponse): ResponseMetadata {\n return { headers: undefined, requestId: undefined };\n }\n\n /**\n * Extracts total token count from the SDK response.\n * @param response - SDK response containing usage data.\n * @returns Total token count used for the embedding request.\n * @internal\n */\n protected abstract extractTokenCount(response: TResponse): number;\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 protected mergeModelParams(\n settings: SAPAIEmbeddingSettings,\n embeddingOptions: EmbeddingProviderOptions | undefined,\n ): Record<string, unknown> {\n return deepMerge(\n (settings.modelParams as Record<string, unknown> | undefined) ?? {},\n embeddingOptions?.modelParams ?? {},\n );\n }\n\n /**\n * Pushes API-specific deprecation or migration warnings into the shared\n * sink. Default no-op; subclasses override to surface settings-level\n * warnings (e.g. orchestration's masking_providers deprecation).\n * @param _settings - Embedding model settings.\n * @param _warnings - Shared warnings sink for the current call.\n * @internal\n */\n protected resolveWarnings(_settings: SAPAIEmbeddingSettings, _warnings: SharedV3Warning[]): void {\n return;\n }\n}\n","/** Foundation Models embedding model strategy using `@sap-ai-sdk/foundation-models`. */\nimport type { EmbeddingModelV3Embedding } from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type {\n AzureOpenAiEmbeddingClient,\n AzureOpenAiEmbeddingParameters,\n AzureOpenAiEmbeddingResponse,\n} from \"@sap-ai-sdk/foundation-models\";\n\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\nimport type { EmbeddingModelStrategyConfig } from \"./sap-ai-strategy.js\";\nimport type { EmbeddingProviderOptions, ResponseMetadata } from \"./strategy-utils.js\";\n\nimport { BaseEmbeddingModelStrategy } from \"./base-embedding-model-strategy.js\";\nimport {\n buildModelDeployment,\n extractResponseMetadata,\n hasKeys,\n normalizeEmbedding,\n} from \"./strategy-utils.js\";\n\n/**\n * Client with pre-merged params for thread-safe concurrent requests.\n * @internal\n */\ninterface FMEmbeddingClientWithContext {\n client: AzureOpenAiEmbeddingClient;\n mergedParams: Record<string, unknown> | undefined;\n}\n\n/** @internal */\ntype FoundationModelsEmbeddingClientClass = typeof AzureOpenAiEmbeddingClient;\n\n/**\n * Embedding model strategy for the Foundation Models API.\n *\n * Provides direct access to Azure OpenAI embedding models.\n * @internal\n */\nexport class FoundationModelsEmbeddingModelStrategy extends BaseEmbeddingModelStrategy<\n FMEmbeddingClientWithContext,\n AzureOpenAiEmbeddingResponse\n> {\n private readonly ClientClass: FoundationModelsEmbeddingClientClass;\n\n constructor(ClientClass: FoundationModelsEmbeddingClientClass) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected createClient(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n embeddingOptions: EmbeddingProviderOptions | undefined,\n ): FMEmbeddingClientWithContext {\n const mergedParams = this.mergeModelParams(settings, embeddingOptions);\n\n return {\n client: new this.ClientClass(\n buildModelDeployment(config, settings.modelVersion),\n config.destination,\n ),\n mergedParams: hasKeys(mergedParams) ? mergedParams : undefined,\n };\n }\n\n protected async executeCall(\n clientWithContext: FMEmbeddingClientWithContext,\n values: string[],\n _embeddingType: unknown,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<AzureOpenAiEmbeddingResponse> {\n const request = this.buildRequest(values, clientWithContext.mergedParams);\n return clientWithContext.client.run(request, requestConfig);\n }\n\n protected extractEmbeddings(response: AzureOpenAiEmbeddingResponse): EmbeddingModelV3Embedding[] {\n // SDK types include `& Record<string, any>` which requires explicit extraction\n const embeddingData = response._data.data;\n const sortedEmbeddings = embeddingData.slice().sort((a, b) => a.index - b.index);\n return sortedEmbeddings.map((item) => normalizeEmbedding(item.embedding as number[]));\n }\n\n protected override extractResponseMetadata(\n response: AzureOpenAiEmbeddingResponse,\n ): ResponseMetadata {\n return extractResponseMetadata(response, \"rawResponse\");\n }\n\n protected extractTokenCount(response: AzureOpenAiEmbeddingResponse): number {\n return response._data.usage.total_tokens;\n }\n\n protected getUrl(): string {\n return \"sap-ai:foundation-models/embeddings\";\n }\n\n private buildRequest(\n values: string[],\n mergedParams: Record<string, unknown> | undefined,\n ): AzureOpenAiEmbeddingParameters {\n return {\n ...(mergedParams ?? {}),\n input: values,\n };\n }\n}\n","/** Validation and resolution functions for SAP AI API-specific features. */\nimport type { SharedV3Warning } from \"@ai-sdk/provider\";\n\nimport type {\n FoundationModelsModelSettings,\n OrchestrationModelSettings,\n SAPAIApiType,\n SAPAIEmbeddingSettings,\n SAPAIModelSettings,\n SAPAISettings,\n} from \"./sap-ai-settings.js\";\n\nimport { deepMerge } from \"./deep-merge.js\";\nimport { ApiSwitchError, UnsupportedFeatureError } from \"./sap-ai-error.js\";\nimport {\n dropUnsupportedParamsSchema,\n responsesModelOptionsSchema,\n} from \"./sap-ai-provider-options.js\";\n\n/**\n * Type guard for Foundation Models API settings.\n * @param settings - Settings to check.\n * @returns True if settings are for Foundation Models API.\n */\nexport function isFoundationModelsSettings(\n settings: SAPAIModelSettings | SAPAISettings,\n): settings is FoundationModelsModelSettings {\n return settings.api === \"foundation-models\";\n}\n\n/**\n * Type guard for Orchestration API settings.\n * @param settings - Settings to check.\n * @returns True if settings are for Orchestration API.\n */\nexport function isOrchestrationSettings(\n settings: SAPAIModelSettings | SAPAISettings,\n): settings is OrchestrationModelSettings {\n return settings.api === undefined || settings.api === \"orchestration\";\n}\n\n/**\n * Validates escapeTemplatePlaceholders option based on API type.\n *\n * Jinja2 template escaping is only supported by the Orchestration API.\n * @param api - SAP AI API type.\n * @param escapeTemplatePlaceholders - Whether to escape template placeholders.\n * @throws {UnsupportedFeatureError} When escapeTemplatePlaceholders is true with a direct model API.\n * @internal\n */\nfunction validateEscapeTemplatePlaceholders(\n api: SAPAIApiType,\n escapeTemplatePlaceholders: boolean | undefined,\n): void {\n if (api !== \"orchestration\" && escapeTemplatePlaceholders === true) {\n throw new UnsupportedFeatureError(\n ESCAPE_TEMPLATE_PLACEHOLDERS_DESCRIPTION,\n api,\n \"orchestration\",\n );\n }\n}\n\n/**\n * Validates that Foundation Models-only options are not used with another API.\n *\n * Foundation Models-only features:\n * - `dataSources` - Azure On Your Data configuration\n * @param api - Selected SAP API.\n * @param settings - Settings to validate.\n * @throws {UnsupportedFeatureError} When dataSources is set with another API.\n * @internal\n */\nfunction validateFoundationModelsOnlyOptions(\n api: SAPAIApiType,\n settings: SAPAIModelSettings | SAPAISettings | undefined,\n): void {\n if (!settings) return;\n\n const fmSettings = settings as FoundationModelsModelSettings;\n\n for (const feature of FOUNDATION_MODELS_ONLY_FEATURE_KEYS) {\n if (fmSettings[feature] !== undefined) {\n throw new UnsupportedFeatureError(\n FOUNDATION_MODELS_ONLY_FEATURES[feature],\n api,\n \"foundation-models\",\n );\n }\n }\n}\n\n/**\n * Validates that Orchestration-only embedding options are not used with a direct model API.\n *\n * Orchestration-only embedding features:\n * - `masking` - Data masking module\n * @param settings - Embedding settings to validate.\n * @throws {UnsupportedFeatureError} When masking is set with a direct model API.\n * @internal\n */\nfunction validateOrchestrationOnlyEmbeddingOptions(\n settings: SAPAIEmbeddingSettings | undefined,\n): void {\n if (!settings) return;\n\n for (const feature of ORCHESTRATION_ONLY_EMBEDDING_FEATURE_KEYS) {\n if (settings[feature] !== undefined) {\n throw new UnsupportedFeatureError(\n ORCHESTRATION_ONLY_EMBEDDING_FEATURES[feature],\n \"foundation-models\",\n \"orchestration\",\n );\n }\n }\n}\n\n/**\n * Validates that Orchestration-only options are not used with a direct model API.\n *\n * Orchestration-only features:\n * - `dropUnsupportedParams` - Unsupported parameter handling for the primary local model\n * - `fallbackModuleConfigs` - Prompt module fallback configuration list\n * - `filtering` - Content filtering module\n * - `grounding` - Document grounding module\n * - `masking` - Data masking module\n * - `orchestrationConfigRef` - Prompt Registry configuration reference\n * - `placeholderValues` - Jinja2 template placeholder values\n * - `promptTemplateRef` - Prompt Registry template reference\n * - `streamOptions` - Post-LLM module streaming configuration\n * - `tools` - SAP-format tool definitions (use AI SDK tools instead)\n * - `translation` - Translation module\n * @param api - Selected SAP API.\n * @param settings - Settings to validate.\n * @throws {UnsupportedFeatureError} When any Orchestration-only feature is set with a direct model API.\n * @internal\n */\nfunction validateOrchestrationOnlyOptions(\n api: SAPAIApiType,\n settings: SAPAIModelSettings | SAPAISettings | undefined,\n): void {\n if (!settings) return;\n\n const orchSettings = settings as OrchestrationModelSettings;\n\n for (const feature of ORCHESTRATION_ONLY_FEATURE_KEYS) {\n if (orchSettings[feature] !== undefined) {\n throw new UnsupportedFeatureError(ORCHESTRATION_ONLY_FEATURES[feature], api, \"orchestration\");\n }\n }\n}\n\n/**\n * Keys for Orchestration-only features.\n * @internal\n */\nconst ORCHESTRATION_ONLY_FEATURE_KEYS = [\n \"dropUnsupportedParams\",\n \"fallbackModuleConfigs\",\n \"filtering\",\n \"grounding\",\n \"masking\",\n \"orchestrationConfigRef\",\n \"placeholderValues\",\n \"promptTemplateRef\",\n \"streamOptions\",\n \"tools\",\n \"translation\",\n] as const;\n\n/**\n * Mapping of Orchestration-only feature keys to human-readable descriptions.\n * Used for generating consistent error messages.\n * @internal\n */\nconst ORCHESTRATION_ONLY_FEATURES: Readonly<\n Record<(typeof ORCHESTRATION_ONLY_FEATURE_KEYS)[number], string>\n> = {\n dropUnsupportedParams: \"Unsupported parameter handling (dropUnsupportedParams)\",\n fallbackModuleConfigs: \"Fallback module configurations (fallbackModuleConfigs)\",\n filtering: \"Content filtering\",\n grounding: \"Document grounding\",\n masking: \"Data masking\",\n orchestrationConfigRef: \"Orchestration config reference (orchestrationConfigRef)\",\n placeholderValues: \"Placeholder values (placeholderValues)\",\n promptTemplateRef: \"Prompt template reference (promptTemplateRef)\",\n streamOptions: \"Stream options for post-LLM modules\",\n tools: \"SAP-format tool definitions (use AI SDK tools instead)\",\n translation: \"Translation\",\n} as const;\n\n/**\n * Keys for Foundation Models-only features.\n * @internal\n */\nconst FOUNDATION_MODELS_ONLY_FEATURE_KEYS = [\"dataSources\"] as const;\n\n/**\n * Mapping of Foundation Models-only feature keys to human-readable descriptions.\n * Used for generating consistent error messages.\n * @internal\n */\nconst FOUNDATION_MODELS_ONLY_FEATURES: Readonly<\n Record<(typeof FOUNDATION_MODELS_ONLY_FEATURE_KEYS)[number], string>\n> = {\n dataSources: \"Azure On Your Data (dataSources)\",\n} as const;\n\n/**\n * Subset of Orchestration-only features that can be set at invocation level.\n * @internal\n */\nconst ORCHESTRATION_ONLY_INVOCATION_FEATURE_KEYS = [\n \"dropUnsupportedParams\",\n \"orchestrationConfigRef\",\n \"placeholderValues\",\n \"promptTemplateRef\",\n] as const;\n\n/**\n * Keys for Orchestration-only embedding features.\n * @internal\n */\nconst ORCHESTRATION_ONLY_EMBEDDING_FEATURE_KEYS = [\"masking\"] as const;\n\n/**\n * Mapping of Orchestration-only embedding feature keys to human-readable descriptions.\n * Uses the same descriptions as the main ORCHESTRATION_ONLY_FEATURES for consistency.\n * @internal\n */\nconst ORCHESTRATION_ONLY_EMBEDDING_FEATURES: Readonly<\n Record<(typeof ORCHESTRATION_ONLY_EMBEDDING_FEATURE_KEYS)[number], string>\n> = {\n masking: ORCHESTRATION_ONLY_FEATURES.masking,\n} as const;\n\n/**\n * Human-readable description for escapeTemplatePlaceholders feature.\n * Used for generating consistent error messages.\n * @internal\n */\nconst ESCAPE_TEMPLATE_PLACEHOLDERS_DESCRIPTION =\n \"escapeTemplatePlaceholders (Jinja2 template escaping)\";\n\n/**\n * Validates that switching APIs at invocation time is allowed.\n *\n * API switching is blocked when the model was configured with features\n * that are specific to one API and incompatible with the target API.\n * @param fromApi - Source API type (configured at model creation).\n * @param toApi - Target API type (requested at invocation time).\n * @param modelSettings - Language model settings to validate for conflicts.\n * @param embeddingSettings - Embedding model settings to validate for conflicts.\n * @throws {ApiSwitchError} When the model has features incompatible with the target API.\n * @internal\n */\nfunction validateApiSwitch(\n fromApi: SAPAIApiType,\n toApi: SAPAIApiType,\n modelSettings: SAPAIModelSettings | SAPAISettings | undefined,\n embeddingSettings: SAPAIEmbeddingSettings | undefined,\n): void {\n if (fromApi === toApi) return;\n if (!modelSettings && !embeddingSettings) return;\n\n if (toApi !== \"orchestration\") {\n const orchSettings = modelSettings as OrchestrationModelSettings | undefined;\n\n for (const feature of ORCHESTRATION_ONLY_FEATURE_KEYS) {\n if (orchSettings?.[feature] !== undefined) {\n throw new ApiSwitchError(fromApi, toApi, feature);\n }\n }\n for (const feature of ORCHESTRATION_ONLY_EMBEDDING_FEATURE_KEYS) {\n if (embeddingSettings?.[feature] !== undefined) {\n throw new ApiSwitchError(fromApi, toApi, feature);\n }\n }\n }\n\n if (toApi !== \"foundation-models\") {\n const fmSettings = modelSettings as FoundationModelsModelSettings | undefined;\n\n for (const feature of FOUNDATION_MODELS_ONLY_FEATURE_KEYS) {\n if (fmSettings?.[feature] !== undefined) {\n throw new ApiSwitchError(fromApi, toApi, feature);\n }\n }\n }\n\n if (\n toApi !== \"responses\" &&\n modelSettings &&\n \"responses\" in modelSettings &&\n modelSettings.responses !== undefined\n ) {\n throw new ApiSwitchError(fromApi, toApi, \"responses\");\n }\n}\n\n/**\n * @internal\n */\nconst VALID_API_TYPES: readonly SAPAIApiType[] = [\n \"orchestration\",\n \"foundation-models\",\n \"responses\",\n];\n\n/** Options for the main validation function. */\nexport interface ValidateSettingsOptions {\n readonly api: SAPAIApiType;\n readonly embeddingSettings?: SAPAIEmbeddingSettings;\n readonly invocationSettings?: {\n readonly api?: SAPAIApiType;\n readonly dropUnsupportedParams?: boolean;\n readonly escapeTemplatePlaceholders?: boolean;\n readonly orchestrationConfigRef?: unknown;\n readonly placeholderValues?: unknown;\n readonly promptTemplateRef?: unknown;\n readonly responses?: unknown;\n };\n readonly modelApi?: SAPAIApiType;\n readonly modelSettings?: SAPAIModelSettings | SAPAISettings;\n}\n\n/**\n * Gets the effective escapeTemplatePlaceholders value based on API and settings.\n * @param api - SAP AI API type.\n * @param modelSettings - Model settings.\n * @param invocationEscape - Invocation-level escape setting.\n * @returns Effective escapeTemplatePlaceholders value.\n */\nexport function getEffectiveEscapeTemplatePlaceholders(\n api: SAPAIApiType,\n modelSettings: SAPAIModelSettings | SAPAISettings | undefined,\n invocationEscape: boolean | undefined,\n): boolean {\n if (api !== \"orchestration\") {\n return false;\n }\n\n if (invocationEscape !== undefined) {\n return invocationEscape;\n }\n\n const modelValue = (modelSettings as OrchestrationModelSettings | undefined)\n ?.escapeTemplatePlaceholders;\n if (modelValue !== undefined) {\n return modelValue;\n }\n\n return true;\n}\n\n/**\n * Merges settings with proper API precedence (callSettings > defaultSettings > fallbackApi).\n * @param defaultSettings - Provider-level default settings.\n * @param callSettings - Per-call settings that override defaults.\n * @param fallbackApi - Fallback API type when neither settings specify one.\n * @returns Merged settings with correct API precedence.\n * @internal\n */\nexport function mergeSettingsWithApi<T extends { api?: string }>(\n defaultSettings: Record<string, unknown> | undefined,\n callSettings: Partial<T>,\n fallbackApi: string,\n): T {\n return {\n ...deepMerge(defaultSettings, callSettings as Record<string, unknown>),\n api: callSettings.api ?? (defaultSettings?.api as string | undefined) ?? fallbackApi,\n } as T;\n}\n\n/**\n * Resolves the effective API type using the full precedence chain.\n * @param providerApi - Provider-level API type.\n * @param modelApi - Model-level API type.\n * @param invocationApi - Invocation-level API type.\n * @returns Resolved API type.\n */\nexport function resolveApi(\n providerApi: SAPAIApiType | undefined,\n modelApi: SAPAIApiType | undefined,\n invocationApi: SAPAIApiType | undefined,\n): SAPAIApiType {\n return invocationApi ?? modelApi ?? providerApi ?? \"orchestration\";\n}\n\n/**\n * Validates that the API value is a valid SAPAIApiType.\n * @param api - API value to validate.\n */\nexport function validateApiInput(api: unknown): void {\n if (api === undefined) return;\n\n if (typeof api !== \"string\" || !VALID_API_TYPES.includes(api as SAPAIApiType)) {\n throw new Error(\n `Invalid API type: ${JSON.stringify(api)}. ` +\n `Valid values are: ${VALID_API_TYPES.map((t) => `\"${t}\"`).join(\", \")}`,\n );\n }\n}\n\n/**\n * Pushes a deprecation warning when `settings.masking` carries `masking_providers`\n * without a `providers` block.\n * @param modelSettings - Resolved model settings (LM or embedding) that may carry a `masking` module.\n * @param warnings - Sink that collects the deprecation warning when it applies.\n * @internal\n */\nexport function validateMaskingProvidersDeprecation(\n modelSettings: undefined | { masking?: unknown },\n warnings: SharedV3Warning[],\n): void {\n const masking = modelSettings?.masking;\n if (!masking || typeof masking !== \"object\") {\n return;\n }\n const maskingRecord = masking as Record<string, unknown>;\n const hasDeprecated = maskingRecord.masking_providers !== undefined;\n const hasPreferred = maskingRecord.providers !== undefined;\n if (hasDeprecated && !hasPreferred) {\n warnings.push({\n message:\n \"settings.masking.masking_providers is deprecated and will be removed by SAP on 2027-03-20. \" +\n \"Migrate to settings.masking.providers.\",\n type: \"other\",\n });\n }\n}\n\n/**\n * Main validation function that performs all API-specific validations.\n *\n * This function orchestrates all validation checks:\n * 1. Validates API type inputs\n * 2. Checks for API switching conflicts\n * 3. Validates API-specific feature usage\n * 4. Validates template placeholder escaping\n * @param options - Validation options.\n * @throws {Error} When an invalid API type is provided.\n * @throws {ApiSwitchError} When attempting to switch APIs with incompatible settings.\n * @throws {UnsupportedFeatureError} When using features not supported by the current API.\n * @see {@link ApiSwitchError}\n * @see {@link UnsupportedFeatureError}\n */\nexport function validateSettings(options: ValidateSettingsOptions): void {\n const { api, embeddingSettings, invocationSettings, modelApi, modelSettings } = options;\n\n validateApiInput(api);\n if (invocationSettings?.api !== undefined) {\n validateApiInput(invocationSettings.api);\n }\n\n if (invocationSettings?.api !== undefined) {\n const effectiveModelApi = modelApi ?? \"orchestration\";\n if (effectiveModelApi !== invocationSettings.api) {\n validateApiSwitch(\n effectiveModelApi,\n invocationSettings.api,\n modelSettings,\n embeddingSettings,\n );\n }\n }\n\n if (api === \"responses\" && embeddingSettings !== undefined) {\n throw new UnsupportedFeatureError(\"Embeddings\", \"responses\", \"foundation-models\");\n }\n\n if (api !== \"orchestration\") {\n validateOrchestrationOnlyOptions(api, modelSettings);\n validateOrchestrationOnlyInvocationOptions(api, invocationSettings);\n validateOrchestrationOnlyEmbeddingOptions(embeddingSettings);\n }\n if (api !== \"foundation-models\") {\n validateFoundationModelsOnlyOptions(api, modelSettings);\n }\n\n const modelResponses =\n modelSettings && \"responses\" in modelSettings ? modelSettings.responses : undefined;\n const invocationResponses = invocationSettings?.responses;\n if (api !== \"responses\") {\n if (modelResponses !== undefined || invocationResponses !== undefined) {\n throw new UnsupportedFeatureError(\"Responses options (responses)\", api, \"responses\");\n }\n } else {\n if (modelResponses !== undefined) responsesModelOptionsSchema.parse(modelResponses);\n if (invocationResponses !== undefined) responsesModelOptionsSchema.parse(invocationResponses);\n }\n\n const modelDropUnsupportedParams = (modelSettings as OrchestrationModelSettings | undefined)\n ?.dropUnsupportedParams;\n if (modelDropUnsupportedParams !== undefined) {\n dropUnsupportedParamsSchema.parse(modelDropUnsupportedParams);\n }\n if (invocationSettings?.dropUnsupportedParams !== undefined) {\n dropUnsupportedParamsSchema.parse(invocationSettings.dropUnsupportedParams);\n }\n\n const modelEscape = (modelSettings as OrchestrationModelSettings | undefined)\n ?.escapeTemplatePlaceholders;\n const invocationEscape = invocationSettings?.escapeTemplatePlaceholders;\n const effectiveEscape = invocationEscape ?? modelEscape;\n validateEscapeTemplatePlaceholders(api, effectiveEscape);\n}\n\n/**\n * Validates that Orchestration-only options are not passed at invocation level with a direct model API.\n * @param api - Selected SAP API.\n * @param invocationSettings - Invocation-level settings to validate.\n * @throws {UnsupportedFeatureError} When any Orchestration-only feature is set at invocation level.\n * @internal\n */\nfunction validateOrchestrationOnlyInvocationOptions(\n api: SAPAIApiType,\n invocationSettings: ValidateSettingsOptions[\"invocationSettings\"],\n): void {\n if (!invocationSettings) return;\n\n for (const feature of ORCHESTRATION_ONLY_INVOCATION_FEATURE_KEYS) {\n if (invocationSettings[feature] !== undefined) {\n throw new UnsupportedFeatureError(ORCHESTRATION_ONLY_FEATURES[feature], api, \"orchestration\");\n }\n }\n}\n","/** Orchestration embedding model strategy using `@sap-ai-sdk/orchestration`. */\nimport type { EmbeddingModelV3Embedding, SharedV3Warning } from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type {\n EmbeddingModelConfig,\n EmbeddingModuleConfig,\n MaskingModule,\n OrchestrationEmbeddingClient,\n OrchestrationEmbeddingResponse,\n} from \"@sap-ai-sdk/orchestration\";\n\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\nimport type { EmbeddingModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport { BaseEmbeddingModelStrategy } from \"./base-embedding-model-strategy.js\";\nimport { validateMaskingProvidersDeprecation } from \"./sap-ai-validation.js\";\nimport {\n type EmbeddingProviderOptions,\n extractResponseMetadata,\n hasKeys,\n normalizeEmbedding,\n type ResponseMetadata,\n} from \"./strategy-utils.js\";\n\n/** @internal */\ntype OrchestrationEmbeddingClientClass = typeof OrchestrationEmbeddingClient;\n\n/**\n * Embedding model strategy for the Orchestration API.\n *\n * Provides support for:\n * - Data masking\n * - Model parameters configuration\n * @internal\n */\nexport class OrchestrationEmbeddingModelStrategy extends BaseEmbeddingModelStrategy<\n OrchestrationEmbeddingClient,\n OrchestrationEmbeddingResponse\n> {\n private readonly ClientClass: OrchestrationEmbeddingClientClass;\n\n constructor(ClientClass: OrchestrationEmbeddingClientClass) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected createClient(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n embeddingOptions: EmbeddingProviderOptions | undefined,\n ): OrchestrationEmbeddingClient {\n const mergedParams = this.mergeModelParams(settings, embeddingOptions);\n\n const embeddingConfig: EmbeddingModelConfig = {\n model: {\n name: config.modelId,\n ...(hasKeys(mergedParams) ? { params: mergedParams } : {}),\n ...(settings.modelVersion ? { version: settings.modelVersion } : {}),\n },\n };\n\n const moduleConfig: EmbeddingModuleConfig = {\n embeddings: embeddingConfig,\n ...(settings.masking && hasKeys(settings.masking)\n ? { masking: settings.masking as MaskingModule }\n : {}),\n };\n\n return new this.ClientClass(moduleConfig, config.deploymentConfig, config.destination);\n }\n\n protected async executeCall(\n client: OrchestrationEmbeddingClient,\n values: string[],\n embeddingType: \"document\" | \"query\" | \"text\" | undefined,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<OrchestrationEmbeddingResponse> {\n return client.embed({ input: values, type: embeddingType }, requestConfig);\n }\n\n protected extractEmbeddings(\n response: OrchestrationEmbeddingResponse,\n ): EmbeddingModelV3Embedding[] {\n const embeddingData = response.getEmbeddings();\n const sortedEmbeddings = [...embeddingData].sort((a, b) => a.index - b.index);\n return sortedEmbeddings.map((data) => normalizeEmbedding(data.embedding));\n }\n\n protected override extractResponseMetadata(\n response: OrchestrationEmbeddingResponse,\n ): ResponseMetadata {\n return extractResponseMetadata(response, \"response\");\n }\n\n protected extractTokenCount(response: OrchestrationEmbeddingResponse): number {\n const tokenUsage = response.getTokenUsage();\n return tokenUsage.total_tokens;\n }\n\n protected getUrl(): string {\n return \"sap-ai:orchestration/embeddings\";\n }\n\n protected override resolveWarnings(\n settings: SAPAIEmbeddingSettings,\n warnings: SharedV3Warning[],\n ): void {\n validateMaskingProvidersDeprecation(settings, warnings);\n }\n}\n","/** Input adapter: convert shared V3 calls to the OpenAI Responses V4 delegate contract. */\nimport type {\n LanguageModelV3CallOptions,\n LanguageModelV3Prompt,\n LanguageModelV3ToolResultOutput,\n LanguageModelV4CallOptions,\n LanguageModelV4Prompt,\n LanguageModelV4ToolResultOutput,\n} from \"@ai-sdk/provider\";\n\nimport { UnsupportedFunctionalityError } from \"@ai-sdk/provider\";\nimport { getTopLevelMediaType } from \"@ai-sdk/provider-utils\";\n\nimport { getURLHref } from \"./convert-to-sap-messages.js\";\n\ntype V3Part = Exclude<LanguageModelV3Prompt[number], { role: \"system\" }>[\"content\"][number];\ntype V3ToolItem = Extract<LanguageModelV3ToolResultOutput, { type: \"content\" }>[\"value\"][number];\ntype V4Part = Exclude<LanguageModelV4Prompt[number], { role: \"system\" }>[\"content\"][number];\ntype V4ToolItem = Extract<LanguageModelV4ToolResultOutput, { type: \"content\" }>[\"value\"][number];\n\n/**\n * Tags V3 prompt files and tool-result media for the V4 delegate.\n * @param options - The normalized V3 invocation, including provider namespaces.\n * @returns V4 options that retain the invocation's data and transport settings.\n */\nexport function convertResponsesCallToV4(\n options: LanguageModelV3CallOptions,\n): LanguageModelV4CallOptions {\n return {\n ...options,\n prompt: options.prompt.map((message) => {\n switch (message.role) {\n case \"assistant\":\n return { ...message, content: message.content.map(convertPromptPart) };\n case \"system\":\n return message;\n case \"tool\":\n return {\n ...message,\n content: message.content.map((part) =>\n part.type === \"tool-result\" ? convertToolResult(part) : part,\n ),\n };\n case \"user\":\n return {\n ...message,\n content: message.content.map((part) =>\n part.type === \"file\" ? convertFile(part) : part,\n ),\n };\n }\n }),\n };\n}\n\n/**\n * Tags inline bytes and canonicalizes URL objects for the delegate's serializer.\n * @param part - A V3 prompt file.\n * @returns The tagged V4 file.\n */\nfunction convertFile(part: Extract<V3Part, { type: \"file\" }>): Extract<V4Part, { type: \"file\" }> {\n const data = part.data;\n const href = getURLHref(data);\n if (href !== undefined) {\n const url =\n data instanceof URL && data.toString === URL.prototype.toString ? data : new URL(href);\n return { ...part, data: { type: \"url\", url } };\n }\n // The V3 union leaves only inline data once URL internal slots have been ruled out.\n return { ...part, data: { data: data as string | Uint8Array, type: \"data\" } };\n}\n\n/**\n * Converts assistant history to the delegate's prompt contract.\n * @param part - A V3 assistant part.\n * @returns Its V4 equivalent.\n */\nfunction convertPromptPart(\n part: Exclude<\n LanguageModelV3Prompt[number],\n { role: \"system\" | \"tool\" | \"user\" }\n >[\"content\"][number],\n): Exclude<LanguageModelV4Prompt[number], { role: \"system\" | \"tool\" | \"user\" }>[\"content\"][number] {\n if (part.type === \"file\") {\n throw new UnsupportedFunctionalityError({\n functionality: \"Responses assistant file history is not supported.\",\n });\n }\n if (part.type === \"tool-result\") return convertToolResult(part);\n return part;\n}\n\n/**\n * Retains file and image categories when tagging tool-result media.\n * @param item - A V3 tool-result content item.\n * @returns The matching V4 content item.\n */\nfunction convertToolItem(item: V3ToolItem): V4ToolItem {\n switch (item.type) {\n case \"custom\":\n case \"text\":\n return item;\n case \"file-data\":\n case \"image-data\": {\n const delegateIsImage = getTopLevelMediaType(item.mediaType) === \"image\";\n if (delegateIsImage !== (item.type === \"image-data\")) {\n throw new UnsupportedFunctionalityError({\n functionality:\n \"Responses tool-result media whose legacy category disagrees with its media type.\",\n });\n }\n return { ...item, data: { data: item.data, type: \"data\" }, type: \"file\" };\n }\n case \"file-id\":\n case \"image-file-id\":\n return {\n data: {\n reference: typeof item.fileId === \"string\" ? { openai: item.fileId } : item.fileId,\n type: \"reference\",\n },\n mediaType: item.type === \"image-file-id\" ? \"image\" : \"application/octet-stream\",\n providerOptions: item.providerOptions,\n type: \"file\",\n };\n case \"file-url\":\n case \"image-url\":\n return {\n data: { type: \"url\", url: new URL(item.url) },\n mediaType: item.type === \"image-url\" ? \"image\" : \"application/octet-stream\",\n providerOptions: item.providerOptions,\n type: \"file\",\n };\n }\n}\n\n/**\n * Converts nested tool-result media without altering non-media outputs.\n * @param part - A V3 tool result.\n * @returns A V4 tool result with the same call identity and options.\n */\nfunction convertToolResult(\n part: Extract<V3Part, { type: \"tool-result\" }>,\n): Extract<V4Part, { type: \"tool-result\" }> {\n return part.output.type === \"content\"\n ? { ...part, output: { ...part.output, value: part.output.value.map(convertToolItem) } }\n : { ...part, output: part.output };\n}\n","/** Private metadata for lossless round trips through the shared V3 contract. */\nimport type { LanguageModelV3FinishReason, LanguageModelV4FinishReason } from \"@ai-sdk/provider\";\n\n// Static CommonJS facades and lazily loaded ESM strategies must share this identity.\nexport const ORIGINAL_V4_FINISH_REASON = Symbol.for(\n \"@jerome-benoit/sap-ai-provider/adapter-metadata.originalV4FinishReason\",\n);\n\nexport type FinishReasonWithV4Metadata = LanguageModelV3FinishReason & {\n [ORIGINAL_V4_FINISH_REASON]?: LanguageModelV4FinishReason;\n};\n","/** Output adapter: convert OpenAI Responses V4 results to the shared V3 contract. */\nimport type {\n LanguageModelV3Content,\n LanguageModelV3File,\n LanguageModelV3FinishReason,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamPart,\n LanguageModelV4Content,\n LanguageModelV4File,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamPart,\n SharedV3Warning,\n SharedV4Warning,\n} from \"@ai-sdk/provider\";\n\nimport { UnsupportedFunctionalityError } from \"@ai-sdk/provider\";\n\nimport { ORIGINAL_V4_FINISH_REASON } from \"./adapter-metadata.js\";\n\n/** V3-compatible content retaining V4 text citations for the V4 facade. */\ntype ResponsesV3Content =\n | Exclude<LanguageModelV3Content, { type: \"text\" }>\n | (Extract<LanguageModelV3Content, { type: \"text\" }> &\n Pick<Extract<LanguageModelV4Content, { type: \"text\" }>, \"citations\">);\n\n/** Internal result extensions survive V3-shaped spreads without widening public V3 APIs. */\ntype ResponsesV3GenerateResult = Omit<LanguageModelV3GenerateResult, \"content\"> &\n Pick<LanguageModelV4GenerateResult, \"structuredOutputText\"> & {\n content: ResponsesV3Content[];\n };\n\n/** Only existing V3 event kinds carry these preserved V4 fields. */\ntype ResponsesV3StreamPart =\n | Exclude<LanguageModelV3StreamPart, { type: \"text-end\" | \"tool-input-start\" }>\n | (Extract<LanguageModelV3StreamPart, { type: \"text-end\" }> &\n Pick<Extract<LanguageModelV4StreamPart, { type: \"text-end\" }>, \"citations\">)\n | (Extract<LanguageModelV3StreamPart, { type: \"tool-input-start\" }> &\n Pick<Extract<LanguageModelV4StreamPart, { type: \"tool-input-start\" }>, \"inputEncoding\">);\n\n/**\n * Unwraps V4 generated files and maps warnings and finish reasons to V3.\n * @param result - The OpenAI V4 generation result.\n * @returns A result suitable for the shared V3 core.\n */\nexport function convertResponsesResultToV3(\n result: LanguageModelV4GenerateResult,\n): ResponsesV3GenerateResult {\n return {\n ...result,\n content: result.content.map(convertContent),\n finishReason: convertFinishReason(result.finishReason),\n warnings: result.warnings.map(convertWarning),\n };\n}\n\n/**\n * Converts one delegate event inside the existing demand-driven stream wrapper.\n * @param part - The OpenAI V4 event.\n * @returns The corresponding V3 event.\n */\nexport function convertResponsesStreamPartToV3(\n part: LanguageModelV4StreamPart,\n): ResponsesV3StreamPart {\n switch (part.type) {\n case \"custom\":\n case \"reasoning-file\":\n throw new UnsupportedFunctionalityError({\n functionality: `Responses '${part.type}' output has no V3 equivalent.`,\n });\n case \"file\":\n return convertGeneratedFile(part);\n case \"finish\":\n return { ...part, finishReason: convertFinishReason(part.finishReason) };\n case \"stream-start\":\n return { ...part, warnings: part.warnings.map(convertWarning) };\n default:\n return part;\n }\n}\n\n/**\n * Rejects V4-only output instead of leaking invalid content through V2/V3 APIs.\n * @param part - Generated V4 content.\n * @returns Content representable by the shared V3 core.\n */\nfunction convertContent(part: LanguageModelV4Content): ResponsesV3Content {\n if (part.type === \"custom\" || part.type === \"reasoning-file\") {\n throw new UnsupportedFunctionalityError({\n functionality: `Responses '${part.type}' output has no V3 equivalent.`,\n });\n }\n return part.type === \"file\" ? convertGeneratedFile(part) : part;\n}\n\n/**\n * Preserves native finish diagnostics when V3 cannot name the unified reason.\n * @param reason - The V4 finish reason.\n * @returns The corresponding V3 finish reason.\n */\nfunction convertFinishReason(\n reason: LanguageModelV4GenerateResult[\"finishReason\"],\n): LanguageModelV3FinishReason {\n if (reason.unified !== \"interrupted\") return reason as LanguageModelV3FinishReason;\n const converted: LanguageModelV3FinishReason = { ...reason, unified: \"other\" };\n return Object.defineProperty(converted, ORIGINAL_V4_FINISH_REASON, { value: reason });\n}\n\n/**\n * Unwraps generated inline data without fetching URL-backed output.\n * @param part - A generated V4 file.\n * @returns Its inline V3 equivalent.\n */\nfunction convertGeneratedFile(part: LanguageModelV4File): LanguageModelV3File {\n if (part.data.type !== \"data\") {\n throw new UnsupportedFunctionalityError({\n functionality: \"Responses generated file URLs have no V3 equivalent and are not fetched.\",\n });\n }\n return { ...part, data: part.data.data };\n}\n\n/**\n * Retains deprecation diagnostics in the V3 warning union.\n * @param warning - A delegate warning.\n * @returns A V3-compatible warning.\n */\nfunction convertWarning(warning: SharedV4Warning): SharedV3Warning {\n return warning.type === \"deprecated\"\n ? { message: `${warning.setting}: ${warning.message}`, type: \"other\" }\n : warning;\n}\n","/** Native SAP HTTP stream lifecycle and bounded failure diagnostics. */\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpResponse } from \"@sap-cloud-sdk/http-client\";\n\nimport { AISDKError } from \"@ai-sdk/provider\";\nimport { isErrorWithCause } from \"@sap-cloud-sdk/util\";\n\nimport { throwIfAborted, waitWithAbort } from \"./abort-utils.js\";\nexport interface FailedHttpRequest extends Error {\n isAxiosError: true;\n response: SAPHttpResponse;\n}\nexport type SAPHttpMiddleware = NonNullable<CustomRequestConfig[\"middleware\"]>[number];\n\nexport type SAPHttpResponse = HttpResponse;\n\ninterface HttpResponseEvents {\n destroy: (error?: Error) => void;\n once: (event: string, listener: () => void) => unknown;\n removeListener: (event: string, listener: () => void) => unknown;\n}\n\ninterface HttpStreamResources {\n readonly data: unknown;\n readonly request?: unknown;\n}\ninterface NativeStreamResponse {\n readonly rawResponse: SAPHttpResponse;\n readonly stream: { readonly controller: AbortController };\n}\n\ntype ResponseBodyDisposer = (retainedRequest?: unknown) => void;\n\ninterface StreamResponseOwnership extends HttpStreamResources {\n disposeTimeout: ResponseBodyDisposer | undefined;\n readonly fromTransport: boolean;\n}\n\nconst ERROR_BODY_TRUNCATION = \"...[truncated]\";\n// Reserve the marker inside the shared HTTP diagnostic serializer's 2,000-character limit.\nconst MAX_ERROR_BODY_BYTES = 2_000 - ERROR_BODY_TRUNCATION.length;\nexport const ERROR_BODY_READ_FAILURE = Symbol(\"sap-ai.httpErrorBodyReadFailure\");\nconst disposedStreams = new WeakSet();\n// Retain provenance after release so later cancellation cannot use raw fallback cleanup.\nconst leasedStreams = new WeakSet();\nconst streamLeases = new WeakMap<object, () => void>();\n/**\n * Releases an HTTP response that arrives after its caller has cancelled.\n * @param response - A late SDK response whose stream has no consumer.\n * @param retainedRequest - A request transferred to a recovered successful stream.\n */\nexport function destroyHttpResponse(\n response: HttpStreamResources,\n retainedRequest?: unknown,\n): void {\n const body: unknown = response.data;\n const request: unknown = response.request;\n try {\n if (isDestroyableRequest(body)) body.destroy();\n } finally {\n if (request !== retainedRequest && isDestroyableRequest(request)) request.destroy();\n }\n}\n/**\n * Releases an abandoned SDK stream without starting its SSE iterator.\n * @param response - Raw stream response returned by either SAP client.\n */\nexport function disposeSapStream(response: NativeStreamResponse): void {\n if (disposedStreams.has(response)) return;\n disposedStreams.add(response);\n try {\n response.stream.controller.abort();\n } finally {\n if (leasedStreams.has(response)) releaseSapStream(response);\n else destroyHttpResponse(response.rawResponse);\n }\n}\n/**\n * Preserves only the final middleware failure before SAP's JSON-only stream parser.\n * @param execute - Starts the raw SDK stream with the supplied middleware chain.\n * @param signal - Caller cancellation forwarded separately to the SDK.\n * @param requestConfig - Existing caller transport and retry middleware.\n * @returns A live SDK stream, with successful ownership transferred to its caller.\n */\nexport async function executeSapStream<T extends NativeStreamResponse>(\n execute: (requestConfig: CustomRequestConfig) => Promise<T>,\n signal: AbortSignal | undefined,\n requestConfig: CustomRequestConfig | undefined,\n): Promise<T> {\n const responses: StreamResponseOwnership[] = [];\n const cleanups = new Set<() => void>();\n let closed = false;\n let transferred = false;\n let failedRequest: FailedHttpRequest | undefined;\n let failedError: unknown;\n\n const release = () => {\n closed = true;\n signal?.removeEventListener(\"abort\", release);\n // Each snapshot owns the resources observed before middleware can replace them.\n // A consumed native body has already returned its request's socket to the pool.\n for (const response of responses) {\n if (response.fromTransport && isConsumedHttpBody(response.data)) continue;\n const consumedRequest = responses.some(\n (other) =>\n other.fromTransport &&\n other.request === response.request &&\n isConsumedHttpBody(other.data),\n );\n try {\n const dispose = response.disposeTimeout;\n const retainedRequest = consumedRequest ? response.request : undefined;\n if (dispose && cleanups.has(dispose)) dispose(retainedRequest);\n else destroyHttpResponse(response, retainedRequest);\n } catch {\n // Cleanup must not replace the operation's primary outcome.\n }\n }\n responses.length = 0;\n cleanups.clear();\n };\n const ownResponse = (\n response: SAPHttpResponse,\n request: CustomRequestConfig,\n fromTransport: boolean,\n failed: boolean,\n ) => {\n const data: unknown = response.data;\n const nativeRequest: unknown = response.request;\n const owned = responses.find((other) => other.data === data && other.request === nativeRequest);\n if (owned) {\n if (failed && !owned.disposeTimeout) {\n owned.disposeTimeout = preserveResponseBodyTimeout(response, request, cleanups);\n }\n } else {\n responses.push({\n data,\n disposeTimeout: failed\n ? preserveResponseBodyTimeout(response, request, cleanups)\n : undefined,\n fromTransport,\n request: nativeRequest,\n });\n }\n if (closed || signal?.aborted) release();\n };\n const observeResponse: SAPHttpMiddleware =\n ({ fn }) =>\n async (request) => {\n try {\n const response = await fn(request);\n ownResponse(response, request, true, false);\n return response;\n } catch (error) {\n const failed = findFailedHttpRequest(error);\n if (failed) ownResponse(failed.response, request, true, true);\n throw error;\n }\n };\n const captureFinalFailure: SAPHttpMiddleware =\n ({ fn }) =>\n async (request) => {\n try {\n const response = await fn(request);\n ownResponse(response, request, false, false);\n return response;\n } catch (error) {\n const failed = findFailedHttpRequest(error);\n if (!failed) throw error;\n failedRequest = failed;\n failedError = error;\n // Middleware can reject a successful response or substitute its body.\n ownResponse(failed.response, request, false, true);\n return failed.response;\n }\n };\n try {\n const response = await waitWithAbort(\n execute({\n ...requestConfig,\n middleware: [captureFinalFailure, ...(requestConfig?.middleware ?? []), observeResponse],\n }),\n signal,\n disposeSapStream,\n );\n if (signal?.aborted) {\n try {\n disposeSapStream(response);\n } finally {\n throwIfAborted(signal);\n }\n }\n if (failedRequest) {\n try {\n await readHttpErrorBody(\n failedRequest.response,\n createErrorByteStream(failedRequest.response),\n signal,\n );\n } catch {\n // Diagnostic failures never replace the final native HTTP failure.\n throwIfAborted(signal);\n }\n throw failedError;\n }\n if (responses.length > 0) {\n // Do not inspect optional rawResponse metadata here. A lease keeps both\n // replacement streams and wrappers around original bodies alive until done.\n streamLeases.set(response, release);\n leasedStreams.add(response);\n signal?.addEventListener(\"abort\", release, { once: true });\n if (signal?.aborted) {\n releaseSapStream(response);\n throwIfAborted(signal);\n }\n transferred = true;\n }\n return response;\n } finally {\n if (!transferred) release();\n }\n}\n\n/**\n * Finds the final Axios failure without crossing a classified AI SDK boundary.\n * @param error - Original rejection from the configured middleware chain.\n * @returns The nested failed request, if reachable within the bounded cause chain.\n */\nexport function findFailedHttpRequest(error: unknown): FailedHttpRequest | undefined {\n const seen = new Set<object>();\n let current = error;\n for (let depth = 0; depth < 32; depth++) {\n if (typeof current !== \"object\" || current === null || seen.has(current)) return undefined;\n if (AISDKError.isInstance(current)) return undefined;\n seen.add(current);\n if (isFailedHttpRequest(current)) return current;\n // SAP's legacy rootCause getter can recurse. Prefer its native cause even\n // when undefined, and never inspect both representations of the same chain.\n current =\n \"cause\" in current\n ? current.cause\n : current instanceof Error && isErrorWithCause(current)\n ? current.rootCause\n : undefined;\n }\n return undefined;\n}\n\n/**\n * Identifies the native request used to close a preserved HTTP-error response.\n * @param request - Request attached to an Axios response.\n * @returns Whether the request supports cancellation by destruction.\n */\nexport function isDestroyableRequest(request: unknown): request is { destroy: () => void } {\n return (\n typeof request === \"object\" &&\n request !== null &&\n \"destroy\" in request &&\n typeof request.destroy === \"function\"\n );\n}\n\n/**\n * Keeps Axios's socket inactivity timeout effective after streamed headers settle.\n * @param response - Native response observed before configured middleware resumes.\n * @param requestConfig - Fallback settings when resolved Axios metadata is unavailable.\n * @param cleanups - Disposes responses abandoned by cancellation or middleware retries.\n * @returns The setup disposer; omit it from setup cleanup when the body is transferred.\n */\nexport function preserveResponseBodyTimeout(\n response: SAPHttpResponse,\n requestConfig: CustomRequestConfig,\n cleanups: Set<() => void>,\n): ResponseBodyDisposer | undefined {\n const body: unknown = response.data;\n const request: unknown = response.request;\n if (!isHttpResponseEvents(body) || !isHttpResponseEvents(request)) return;\n const responseConfig: unknown = \"config\" in response ? response.config : undefined;\n const timeoutConfig =\n typeof responseConfig === \"object\" && responseConfig !== null && !Array.isArray(responseConfig)\n ? (responseConfig as Record<string, unknown>)\n : requestConfig;\n let ownsRequest = true;\n\n const release = () => {\n request.removeListener(\"timeout\", onTimeout);\n body.removeListener(\"end\", release);\n body.removeListener(\"error\", onFailure);\n body.removeListener(\"close\", onFailure);\n cleanups.delete(dispose);\n };\n const onFailure = () => {\n try {\n if (ownsRequest) request.destroy();\n } finally {\n release();\n }\n };\n const dispose: ResponseBodyDisposer = (retainedRequest) => {\n ownsRequest = request !== retainedRequest;\n request.removeListener(\"timeout\", onTimeout);\n // Keep the error observer until close: destruction can emit an error asynchronously.\n try {\n body.destroy();\n } finally {\n if (ownsRequest) request.destroy();\n }\n };\n const onTimeout = () => {\n const nativeResponse: unknown = \"res\" in request ? request.res : undefined;\n // A fully received body can remain buffered while configured middleware waits.\n if (\n typeof nativeResponse === \"object\" &&\n nativeResponse !== null &&\n \"complete\" in nativeResponse &&\n nativeResponse.complete === true\n ) {\n release();\n return;\n }\n const timeout: unknown = timeoutConfig.timeout;\n const timeoutErrorMessage: unknown = timeoutConfig.timeoutErrorMessage;\n const transitional: unknown = timeoutConfig.transitional;\n const clarifyTimeoutError =\n typeof transitional === \"object\" &&\n transitional !== null &&\n \"clarifyTimeoutError\" in transitional &&\n transitional.clarifyTimeoutError === true;\n const message =\n typeof timeoutErrorMessage === \"string\" && timeoutErrorMessage\n ? timeoutErrorMessage\n : (typeof timeout === \"number\" || typeof timeout === \"string\") && timeout\n ? `timeout of ${String(timeout)}ms exceeded`\n : \"timeout exceeded\";\n // Aborting the controller here would misclassify inactivity as caller cancellation.\n body.destroy(\n Object.assign(new Error(message), {\n code: clarifyTimeoutError ? \"ETIMEDOUT\" : \"ECONNABORTED\",\n }),\n );\n request.destroy();\n };\n request.once(\"timeout\", onTimeout);\n body.once(\"end\", release);\n body.once(\"error\", onFailure);\n body.once(\"close\", onFailure);\n cleanups.add(dispose);\n return dispose;\n}\n\n/**\n * Retains bounded UTF-8 diagnostics, parsing JSON only after a complete body.\n * @param response - Native failed response whose data will hold the diagnostic.\n * @param stream - Byte stream owned by this failure.\n * @param signal - Caller cancellation, distinct from diagnostic truncation.\n * @returns Any secondary read failure, kept outside the native cause chain.\n */\nexport async function readHttpErrorBody(\n response: SAPHttpResponse,\n stream: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): Promise<unknown> {\n const decoder = new TextDecoder();\n const reader = stream.getReader();\n let retainedBytes = 0;\n let text = \"\";\n let truncated = false;\n let readFailure: unknown;\n try {\n for (;;) {\n const chunk = await waitWithAbort(reader.read(), signal);\n if (chunk.done) {\n text += decoder.decode();\n break;\n }\n const remaining = MAX_ERROR_BODY_BYTES - retainedBytes;\n text += decoder.decode(chunk.value.subarray(0, remaining), { stream: true });\n retainedBytes += Math.min(chunk.value.byteLength, remaining);\n if (chunk.value.byteLength > remaining) {\n truncated = true;\n await reader.cancel(\"HTTP error diagnostic limit exceeded\");\n break;\n }\n }\n } catch (error) {\n readFailure = error;\n if (!truncated) text += decoder.decode();\n void reader.cancel(error).catch(() => {\n // The original diagnostic read failure remains primary.\n });\n } finally {\n if (signal?.aborted) {\n destroyHttpResponse(response);\n void reader.cancel(signal.reason).catch(() => {\n // Caller cancellation remains primary while teardown settles.\n });\n }\n reader.releaseLock();\n }\n response.data = truncated ? text + ERROR_BODY_TRUNCATION : text;\n if (!truncated && readFailure === undefined) {\n try {\n response.data = JSON.parse(text) as unknown;\n } catch {\n response.data = text;\n }\n }\n throwIfAborted(signal);\n return readFailure;\n}\n/**\n * Keeps observed transport resources alive until the returned SSE iterator ends.\n * @param response - SDK response holding the operation's resource lease.\n * @param stream - SDK iterator, which must not start during setup.\n * @returns The iterator with finalization cleanup, or the unchanged unowned iterator.\n */\nexport function withSapStreamCleanup<T>(\n response: NativeStreamResponse,\n stream: AsyncIterable<T>,\n): AsyncIterable<T> {\n if (!streamLeases.has(response)) return stream;\n return iterate();\n\n /**\n * Iterates SDK chunks while releasing the owned transport on every exit.\n * @returns The SDK iterator with finalization cleanup.\n * @yields {T} Each original SDK chunk.\n */\n async function* iterate(): AsyncGenerator<T> {\n try {\n yield* stream;\n } finally {\n releaseSapStream(response);\n }\n }\n}\n\n/**\n * Adapts only failed native bodies; successful SDK SSE ownership stays untouched.\n * @param response - Failed native HTTP response.\n * @returns Byte stream consumed by the shared bounded diagnostic reader.\n */\nfunction createErrorByteStream(response: SAPHttpResponse): ReadableStream<Uint8Array> {\n const body: unknown = response.data;\n if (\n typeof body !== \"object\" ||\n body === null ||\n !(Symbol.asyncIterator in body) ||\n typeof body[Symbol.asyncIterator] !== \"function\"\n ) {\n throw new TypeError(\"SAP did not return a readable HTTP error body.\");\n }\n const iterator = (body as AsyncIterable<unknown>)[Symbol.asyncIterator]();\n const encoder = new TextEncoder();\n return new ReadableStream<Uint8Array>(\n {\n cancel() {\n destroyHttpResponse(response);\n },\n async pull(controller) {\n try {\n const chunk = await iterator.next();\n if (chunk.done) controller.close();\n else if (typeof chunk.value === \"string\") controller.enqueue(encoder.encode(chunk.value));\n else if (chunk.value instanceof Uint8Array) controller.enqueue(chunk.value);\n else throw new TypeError(\"SAP returned a non-byte HTTP error chunk.\");\n } catch (error) {\n try {\n destroyHttpResponse(response);\n } catch {\n // Teardown cannot replace the native HTTP failure or its diagnostics.\n } finally {\n controller.error(error);\n }\n }\n },\n },\n { highWaterMark: 0 },\n );\n}\n/**\n * Identifies a consumed native body whose request may have released its socket.\n * @param body - Original body observed at the transport boundary.\n * @returns Whether the native readable has reached its end.\n */\nfunction isConsumedHttpBody(body: unknown): boolean {\n return (\n typeof body === \"object\" &&\n body !== null &&\n \"readableEnded\" in body &&\n body.readableEnded === true\n );\n}\n/**\n * Identifies the HTTP errors whose response streams need preservation.\n * @param error - Failure reported by the SAP HTTP middleware chain.\n * @returns Whether the failure includes a native Axios response.\n */\nfunction isFailedHttpRequest(error: unknown): error is FailedHttpRequest {\n return (\n error instanceof Error &&\n \"isAxiosError\" in error &&\n error.isAxiosError === true &&\n \"response\" in error &&\n typeof error.response === \"object\" &&\n error.response !== null\n );\n}\n/**\n * Identifies native HTTP requests and response streams without importing Node APIs.\n * @param value - Native object returned by the SAP HTTP client.\n * @returns Whether lifecycle listeners and destruction are supported.\n */\nfunction isHttpResponseEvents(value: unknown): value is HttpResponseEvents {\n return (\n isDestroyableRequest(value) &&\n \"once\" in value &&\n typeof value.once === \"function\" &&\n \"removeListener\" in value &&\n typeof value.removeListener === \"function\"\n );\n}\n/**\n * Releases the transport resources leased to a recovered SDK stream.\n * @param response - SDK response whose iteration has ended or been cancelled.\n */\nfunction releaseSapStream(response: NativeStreamResponse): void {\n const release = streamLeases.get(response);\n streamLeases.delete(response);\n release?.();\n}\n","/** Fetch-compatible Responses transport backed by the SAP SDK HTTP client. */\nimport type { LanguageModelV3CallOptions } from \"@ai-sdk/provider\";\nimport type { FetchFunction } from \"@ai-sdk/provider-utils\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\n\nimport { APICallError } from \"@ai-sdk/provider\";\nimport { getFoundationModelDeploymentId, getResourceGroup } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport { executeRequest, getAiCoreDestination } from \"@sap-ai-sdk/core\";\nimport { getTargetUrl } from \"@sap-ai-sdk/core/internal.js\";\n\nimport type { SAPAISettings } from \"./sap-ai-settings.js\";\nimport type { LanguageModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport { createAbortError, throwIfAborted, waitWithAbort } from \"./abort-utils.js\";\nimport { convertToAISDKError, normalizeHeaders } from \"./sap-ai-error.js\";\nimport {\n destroyHttpResponse,\n ERROR_BODY_READ_FAILURE,\n type FailedHttpRequest,\n findFailedHttpRequest,\n isDestroyableRequest,\n preserveResponseBodyTimeout,\n readHttpErrorBody,\n type SAPHttpMiddleware,\n type SAPHttpResponse,\n} from \"./sap-http-stream.js\";\nimport {\n buildModelDeployment,\n createAISDKRequestBodySummary,\n mergeRequestConfig,\n} from \"./strategy-utils.js\";\n\n/**\n * Resolves a SAP deployment and adapts its HTTP transport to the OpenAI provider.\n * @param config - SAP deployment and transport configuration.\n * @param settings - Resolved model settings.\n * @param options - Standard AI SDK call options.\n * @returns The deployment base URL and a fetch-compatible SAP transport.\n * @internal\n */\nexport async function createResponsesTransport(\n config: LanguageModelStrategyConfig,\n settings: SAPAISettings,\n options: LanguageModelV3CallOptions,\n): Promise<{ baseURL: string; dispose: (reason?: unknown) => void; fetch: FetchFunction }> {\n throwIfAborted(options.abortSignal);\n const deployment = buildModelDeployment(config, settings.modelVersion);\n // SAP's discovery helpers expose no signal; cancel the wait and observe late rejections.\n const [deploymentId, destination] = await waitWithAbort(\n Promise.all([\n getFoundationModelDeploymentId(deployment, \"azure-openai\", config.destination),\n getAiCoreDestination(config.destination),\n ]),\n options.abortSignal,\n );\n throwIfAborted(options.abortSignal);\n\n const deploymentPath = `/inference/deployments/${encodeURIComponent(deploymentId)}`;\n const baseURL = getTargetUrl(destination.url, deploymentPath);\n const endpoint = new URL(`${baseURL}/responses`);\n const requestConfig = mergeRequestConfig(\n config.requestConfig,\n options.abortSignal,\n options.headers,\n );\n const activeRequests = new Set<(reason?: unknown) => void>();\n let disposed = false;\n let disposalReason: unknown;\n const dispose = (reason?: unknown) => {\n if (disposed) return;\n disposed = true;\n disposalReason = reason;\n for (const release of activeRequests) {\n try {\n release(reason);\n } catch {\n // Disposal must never replace the invocation's primary failure.\n }\n }\n activeRequests.clear();\n };\n\n const fetch: FetchFunction = async (input, init) => {\n if (disposed) throw createAbortError(disposalReason);\n const url = new URL(typeof input === \"string\" || input instanceof URL ? input : input.url);\n if (url.origin !== endpoint.origin || url.pathname !== endpoint.pathname) {\n throw new TypeError(\"SAP Responses requests must target the configured deployment.\");\n }\n if (init?.method !== \"POST\" || typeof init.body !== \"string\") {\n throw new TypeError(\"SAP Responses requires a POST request with a JSON body.\");\n }\n const body: unknown = JSON.parse(init.body);\n const operation =\n typeof body === \"object\" && body !== null && \"stream\" in body && body.stream === true\n ? \"doStream\"\n : \"doGenerate\";\n const controller = new AbortController();\n const signal = options.abortSignal ?? init.signal;\n const bodyTimeoutCleanups = new Set<() => void>();\n let abortFailedRequest: (() => void) | undefined;\n let activeResponse: SAPHttpResponse | undefined;\n const onAbort = () => {\n controller.abort(signal?.reason);\n };\n const cleanup = () => {\n activeRequests.delete(disposeRequest);\n signal?.removeEventListener(\"abort\", onAbort);\n if (abortFailedRequest) controller.signal.removeEventListener(\"abort\", abortFailedRequest);\n for (const dispose of bodyTimeoutCleanups) dispose();\n activeResponse = undefined;\n };\n const disposeRequest = (reason?: unknown) => {\n try {\n controller.abort(reason);\n } finally {\n try {\n if (activeResponse) destroyHttpResponse(activeResponse);\n } finally {\n cleanup();\n }\n }\n };\n throwIfAborted(signal ?? undefined);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n activeRequests.add(disposeRequest);\n\n const headers = new Headers(init.headers);\n // Authentication belongs to the SAP destination, not the delegate's placeholder key.\n headers.delete(\"authorization\");\n const configuredHeaders = Object.fromEntries(\n Object.entries(requestConfig?.headers ?? {}).map(([key, value]) => [\n key.toLowerCase(),\n value,\n ]),\n );\n\n let failedRequest: FailedHttpRequest | undefined;\n let failedError: unknown;\n const watchResponse = (response: SAPHttpResponse, request: CustomRequestConfig) => {\n activeResponse = response;\n if (controller.signal.aborted) destroyHttpResponse(response);\n else preserveResponseBodyTimeout(response, request, bodyTimeoutCleanups);\n return response;\n };\n const preserveBodyTimeout: SAPHttpMiddleware =\n ({ fn }) =>\n async (request) => {\n try {\n return watchResponse(await fn(request), request);\n } catch (error) {\n const failed = findFailedHttpRequest(error);\n if (failed) watchResponse(failed.response, request);\n throw error;\n }\n };\n const preserveErrorResponse: SAPHttpMiddleware =\n ({ fn }) =>\n async (request) => {\n try {\n return await fn(request);\n } catch (error) {\n const failed = findFailedHttpRequest(error);\n if (!failed) throw error;\n // SAP's stream error parser assumes JSON. Retain the response before it can\n // discard status and headers when an intermediary returns HTML or an empty body.\n failedRequest = failed;\n failedError = error;\n const request: unknown = failed.response.request;\n if (isDestroyableRequest(request)) {\n // A rejected Axios request no longer observes the request abort signal.\n abortFailedRequest = () => {\n request.destroy();\n };\n if (controller.signal.aborted) abortFailedRequest();\n else controller.signal.addEventListener(\"abort\", abortFailedRequest, { once: true });\n }\n return failed.response;\n }\n };\n\n try {\n const pendingResponse = executeRequest(\n {\n apiVersion: \"2024-10-21\",\n resourceGroup: getResourceGroup(deployment),\n url: `${deploymentPath}/responses`,\n },\n body,\n {\n ...requestConfig,\n headers: { ...Object.fromEntries(headers), ...configuredHeaders },\n middleware: [\n preserveErrorResponse,\n ...(requestConfig?.middleware ?? []),\n preserveBodyTimeout,\n ],\n responseType: \"stream\",\n signal: controller.signal,\n },\n config.destination,\n );\n const response = await waitWithAbort(pendingResponse, controller.signal, destroyHttpResponse);\n activeResponse = response;\n if (controller.signal.aborted) {\n destroyHttpResponse(response);\n throw createAbortError(controller.signal.reason);\n }\n const responseBody: unknown = response.data;\n const responseStream = createByteStream(\n responseBody,\n controller,\n cleanup,\n config,\n options,\n operation,\n );\n if (failedRequest) {\n const readFailure = await readHttpErrorBody(\n failedRequest.response,\n responseStream,\n signal ?? undefined,\n );\n const failure = convertToAISDKError(failedError, {\n modelId: config.modelId,\n modelType: \"languageModel\",\n operation,\n requestBody: createAISDKRequestBodySummary(options),\n url: \"sap-ai:responses\",\n });\n // Secondary body diagnostics must not enter the native cause chain:\n // the delegate scans that chain for network codes and can override HTTP retryability.\n if (readFailure !== undefined && APICallError.isInstance(failure)) {\n Object.defineProperty(failure, ERROR_BODY_READ_FAILURE, { value: readFailure });\n }\n throw failure;\n }\n return new Response(responseStream, {\n headers: normalizeHeaders(response.headers),\n status: response.status,\n });\n } catch (error) {\n dispose(error);\n throw error;\n }\n };\n\n return { baseURL, dispose, fetch };\n}\n\n/**\n * Converts SAP's streaming response without buffering or losing cancellation.\n * @param body - The SAP HTTP client's Node stream.\n * @param requestController - Controls the upstream SAP request.\n * @param cleanup - Removes the caller's abort listener.\n * @param config - Model configuration for safe error conversion.\n * @param options - Standard AI SDK call options.\n * @param operation - Operation derived from the delegate's request body.\n * @returns A native byte stream consumed by the OpenAI provider.\n */\nfunction createByteStream(\n body: unknown,\n requestController: AbortController,\n cleanup: () => void,\n config: LanguageModelStrategyConfig,\n options: LanguageModelV3CallOptions,\n operation: \"doGenerate\" | \"doStream\",\n): ReadableStream<Uint8Array> {\n if (\n typeof body !== \"object\" ||\n body === null ||\n !(Symbol.asyncIterator in body) ||\n typeof body[Symbol.asyncIterator] !== \"function\"\n ) {\n requestController.abort();\n cleanup();\n throw new TypeError(\"SAP Responses did not return a readable response body.\");\n }\n\n const source = body as AsyncIterable<unknown> & { destroy?: () => void };\n const iterator = source[Symbol.asyncIterator]();\n const encoder = new TextEncoder();\n // Axios may already have rejected at the headers of a non-success response.\n const onAbort = () => source.destroy?.();\n const cleanupStream = () => {\n requestController.signal.removeEventListener(\"abort\", onAbort);\n cleanup();\n };\n requestController.signal.addEventListener(\"abort\", onAbort, { once: true });\n if (requestController.signal.aborted) onAbort();\n\n return new ReadableStream<Uint8Array>(\n {\n async cancel(reason) {\n requestController.abort(reason);\n cleanupStream();\n if (source.destroy) {\n source.destroy();\n } else {\n await iterator.return?.();\n }\n },\n async pull(controller) {\n try {\n throwIfAborted(requestController.signal);\n const chunk = await iterator.next();\n throwIfAborted(requestController.signal);\n if (chunk.done) {\n cleanupStream();\n controller.close();\n } else if (typeof chunk.value === \"string\") {\n controller.enqueue(encoder.encode(chunk.value));\n } else if (chunk.value instanceof Uint8Array) {\n controller.enqueue(chunk.value);\n } else {\n throw new TypeError(\"SAP Responses returned a non-byte response chunk.\");\n }\n } catch (error) {\n const failure = requestController.signal.aborted\n ? createAbortError(requestController.signal.reason)\n : error;\n requestController.abort(error);\n cleanupStream();\n source.destroy?.();\n controller.error(\n convertToAISDKError(failure, {\n modelId: config.modelId,\n modelType: \"languageModel\",\n operation,\n requestBody: createAISDKRequestBodySummary(options),\n url: \"sap-ai:responses\",\n }),\n );\n }\n },\n },\n { highWaterMark: 0 },\n );\n}\n","/** OpenAI Responses through SAP AI Core's authenticated HTTP transport. */\nimport type {\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3Prompt,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n LanguageModelV3ToolResultOutput,\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4Citation,\n SharedV3ProviderMetadata,\n SharedV3ProviderOptions,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\n\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { APICallError } from \"@ai-sdk/provider\";\nimport { z } from \"zod\";\n\nimport type { SAPAIModelSettings, SAPAISettings } from \"./sap-ai-settings.js\";\nimport type { LanguageModelAPIStrategy, LanguageModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport { createAbortError } from \"./abort-utils.js\";\nimport { convertResponsesCallToV4 } from \"./responses-adapters-v3-to-v4.js\";\nimport {\n convertResponsesResultToV3,\n convertResponsesStreamPartToV3,\n} from \"./responses-adapters-v4-to-v3.js\";\nimport { createResponsesTransport } from \"./responses-http-transport.js\";\nimport { convertToAISDKError } from \"./sap-ai-error.js\";\nimport { getProviderName } from \"./sap-ai-provider-options.js\";\nimport { createAISDKRequestBodySummary } from \"./strategy-utils.js\";\nimport { VERSION } from \"./version.js\";\n\nconst MODEL_PARAMETERS = new Set([\n \"frequencyPenalty\",\n \"maxTokens\",\n \"parallel_tool_calls\",\n \"presencePenalty\",\n \"temperature\",\n \"topP\",\n]);\n\nconst OPENAI_STREAM_ERROR_SCHEMA = z.object({\n data: z.object({ type: z.enum([\"error\", \"response.failed\"]) }).loose(),\n isRetryable: z.boolean(),\n message: z.string(),\n statusCode: z.number().int().min(400).max(599),\n});\n\ntype PromptPart = Exclude<LanguageModelV3Prompt[number], { role: \"system\" }>[\"content\"][number];\n\n/**\n * Responses strategy shared by the V2, V3, and V4 public providers.\n * @internal\n */\nexport class ResponsesLanguageModelStrategy implements LanguageModelAPIStrategy {\n async doGenerate(\n config: LanguageModelStrategyConfig,\n settings: SAPAIModelSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n let dispose: ((reason?: unknown) => void) | undefined;\n try {\n const prepared = await prepareModel(config, settings, options);\n dispose = prepared.dispose;\n const { input, model, providerName, warnings } = prepared;\n const result = convertResponsesResultToV3(await model.doGenerate(input));\n return {\n ...result,\n content: result.content.map((part) => fromOpenAIContent(part, providerName)),\n providerMetadata: responseMetadata(result.providerMetadata, providerName),\n warnings: [...warnings, ...result.warnings],\n };\n } catch (error) {\n const failure = convertError(error, config, options, \"doGenerate\");\n dispose?.(failure);\n throw failure;\n }\n }\n\n async doStream(\n config: LanguageModelStrategyConfig,\n settings: SAPAIModelSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n let dispose: ((reason?: unknown) => void) | undefined;\n try {\n const prepared = await prepareModel(config, settings, options);\n dispose = prepared.dispose;\n const { input, model, providerName, warnings } = prepared;\n const result = await model.doStream(input);\n const reader = result.stream.getReader();\n let cancelled = false;\n const isCancelled = () => cancelled;\n return {\n ...result,\n stream: new ReadableStream<LanguageModelV3StreamPart>(\n {\n async cancel(reason) {\n cancelled = true;\n dispose?.(reason);\n try {\n await reader.cancel(reason);\n } finally {\n reader.releaseLock();\n }\n },\n async pull(controller) {\n try {\n if (options.abortSignal?.aborted)\n throw createAbortError(options.abortSignal.reason);\n const next = await reader.read();\n if (isCancelled()) return;\n if (options.abortSignal?.aborted)\n throw createAbortError(options.abortSignal.reason);\n if (next.done) {\n reader.releaseLock();\n controller.close();\n return;\n }\n const part = convertResponsesStreamPartToV3(next.value);\n if (part.type === \"stream-start\") {\n controller.enqueue({ ...part, warnings: [...warnings, ...part.warnings] });\n } else if (part.type === \"finish\") {\n controller.enqueue({\n ...part,\n providerMetadata: responseMetadata(part.providerMetadata, providerName),\n });\n } else if (part.type === \"error\") {\n controller.enqueue({\n ...part,\n error: convertError(part.error, config, options, \"doStream\"),\n });\n } else if (\"providerMetadata\" in part || part.type === \"text-end\") {\n controller.enqueue(fromOpenAIContent(part, providerName));\n } else {\n controller.enqueue(part);\n }\n } catch (error) {\n if (isCancelled()) return;\n const failure = convertError(error, config, options, \"doStream\");\n dispose?.(failure);\n // Cleanup failures must not replace the original request or cancellation error.\n await reader.cancel(error).catch(() => undefined);\n if (isCancelled()) return;\n reader.releaseLock();\n controller.enqueue({\n error: failure,\n type: \"error\",\n });\n controller.close();\n }\n },\n },\n { highWaterMark: 0 },\n ),\n };\n } catch (error) {\n const failure = convertError(error, config, options, \"doStream\");\n dispose?.(failure);\n throw failure;\n }\n }\n}\n\n/**\n * Applies the provider's shared error contract without copying transport credentials.\n * @param error - Delegate or SAP transport error.\n * @param config - Model configuration.\n * @param options - Invocation options.\n * @param operation - Generation operation.\n * @returns The corresponding AI SDK error.\n */\nfunction convertError(\n error: unknown,\n config: LanguageModelStrategyConfig,\n options: LanguageModelV3CallOptions,\n operation: \"doGenerate\" | \"doStream\",\n) {\n // The delegate can hide a classified body-read failure under a successful HTTP status.\n if (\n APICallError.isInstance(error) &&\n error.message === \"Failed to process successful response\" &&\n error.statusCode !== undefined &&\n error.statusCode >= 200 &&\n error.statusCode < 300 &&\n APICallError.isInstance(error.cause)\n ) {\n return error.cause;\n }\n if (operation === \"doStream\" && !APICallError.isInstance(error)) {\n const parsed = OPENAI_STREAM_ERROR_SCHEMA.safeParse(error);\n if (parsed.success) {\n return new APICallError({\n cause: error,\n data: parsed.data.data,\n isRetryable: parsed.data.isRetryable,\n message: parsed.data.message,\n requestBodyValues: createAISDKRequestBodySummary(options),\n statusCode: parsed.data.statusCode,\n url: \"sap-ai:responses\",\n });\n }\n }\n return convertToAISDKError(error, {\n modelId: config.modelId,\n modelType: \"languageModel\",\n operation,\n requestBody: createAISDKRequestBodySummary(options),\n url: \"sap-ai:responses\",\n });\n}\n\n/**\n * Exposes native Responses metadata under the configured SAP namespace.\n * @param metadata - Responses metadata.\n * @param providerName - Configured SAP provider namespace.\n * @returns Namespaced metadata.\n */\nfunction fromOpenAI(\n metadata: SharedV3ProviderMetadata | undefined,\n providerName: string,\n): SharedV3ProviderMetadata | undefined {\n if (providerName === \"openai\" || !metadata?.openai) return metadata;\n const { openai, ...rest } = metadata;\n return { ...rest, [providerName]: { ...rest[providerName], ...openai } };\n}\n\n/**\n * Remaps only citation source metadata, retaining untouched sources and positions.\n * @param citations - V4 citations preserved through the shared V3 core.\n * @param providerName - Resolved SAP provider namespace.\n * @returns The original array unless a source namespace changes.\n */\nfunction fromOpenAICitations(\n citations: LanguageModelV4Citation[] | undefined,\n providerName: string,\n): LanguageModelV4Citation[] | undefined {\n if (providerName === \"openai\" || !citations) return citations;\n let mapped: LanguageModelV4Citation[] | undefined;\n let index = 0;\n for (const citation of citations) {\n const providerMetadata = fromOpenAI(citation.source.providerMetadata, providerName);\n if (providerMetadata !== citation.source.providerMetadata) {\n mapped ??= citations.slice();\n mapped[index] = {\n ...citation,\n source: { ...citation.source, providerMetadata },\n };\n }\n index++;\n }\n return mapped ?? citations;\n}\n\n/**\n * Applies the same namespace policy to direct metadata and nested citation sources.\n * @param part - Content or a text-end event, including preserved V4 citation fields.\n * @param providerName - Resolved SAP provider namespace.\n * @returns The original part when no metadata changes, otherwise an immutable copy.\n */\nfunction fromOpenAIContent<\n T extends {\n citations?: LanguageModelV4Citation[];\n providerMetadata?: SharedV3ProviderMetadata;\n },\n>(part: T, providerName: string): T {\n const providerMetadata = fromOpenAI(part.providerMetadata, providerName);\n const citations = fromOpenAICitations(part.citations, providerName);\n if (providerMetadata === part.providerMetadata && citations === part.citations) return part;\n if (providerMetadata === part.providerMetadata) return { ...part, citations };\n return citations === part.citations\n ? { ...part, providerMetadata }\n : { ...part, citations, providerMetadata };\n}\n\n/**\n * Maps configured structured output to the common AI SDK call format.\n * @param settings - Model settings.\n * @returns The corresponding AI SDK response format.\n */\nfunction modelResponseFormat(\n settings: SAPAISettings,\n): LanguageModelV3CallOptions[\"responseFormat\"] {\n const format = settings.responseFormat;\n if (!format || format.type === \"text\") return format;\n if (format.type === \"json_object\") return { type: \"json\" };\n const schema = format.json_schema;\n return {\n description: schema.description,\n name: schema.name,\n schema:\n schema.schema === undefined ? undefined : z.record(z.string(), z.json()).parse(schema.schema),\n type: \"json\",\n };\n}\n\n/**\n * Resolves SAP transport and maps the provider's configuration to Responses options.\n * @param config - SAP deployment and transport configuration.\n * @param settings - Model defaults.\n * @param options - Invocation options.\n * @returns The delegate and its normalized invocation.\n */\nasync function prepareModel(\n config: LanguageModelStrategyConfig,\n settings: SAPAISettings,\n options: LanguageModelV3CallOptions,\n): Promise<{\n dispose: (reason?: unknown) => void;\n input: LanguageModelV4CallOptions;\n model: LanguageModelV4;\n providerName: string;\n warnings: SharedV3Warning[];\n}> {\n if (options.abortSignal?.aborted) {\n throw createAbortError(options.abortSignal.reason);\n }\n const providerName = getProviderName(config.provider);\n const sapOptions = config.parsedProviderOptions;\n const parameters = { ...settings.modelParams, ...sapOptions?.modelParams };\n const warnings: SharedV3Warning[] = Object.keys(parameters)\n .filter((key) => !MODEL_PARAMETERS.has(key))\n .map((key) => ({\n details: \"Use the responses option for Responses-specific parameters.\",\n feature: `modelParams.${key}`,\n type: \"unsupported\",\n }));\n if (sapOptions?.includeReasoning ?? settings.includeReasoning) {\n warnings.push({\n details: \"Responses preserves native reasoning history instead of converting it to text.\",\n feature: \"includeReasoning\",\n type: \"unsupported\",\n });\n }\n const responseOptions = {\n ...(parameters.parallel_tool_calls !== undefined\n ? { parallelToolCalls: parameters.parallel_tool_calls }\n : {}),\n ...(settings.responseFormat?.type === \"json_schema\"\n ? { strictJsonSchema: settings.responseFormat.json_schema.strict }\n : {}),\n store: false,\n ...settings.responses,\n ...sapOptions?.responses,\n };\n const reasoning = \"reasoning\" in options ? options.reasoning : undefined;\n if (typeof reasoning === \"string\" && reasoning !== \"provider-default\") {\n responseOptions.reasoningEffort = reasoning;\n }\n const input: LanguageModelV3CallOptions = {\n ...options,\n frequencyPenalty: options.frequencyPenalty ?? parameters.frequencyPenalty,\n maxOutputTokens: options.maxOutputTokens ?? parameters.maxTokens,\n presencePenalty: options.presencePenalty ?? parameters.presencePenalty,\n prompt: toOpenAIPrompt(options.prompt, providerName),\n providerOptions: {\n ...options.providerOptions,\n openai: responseOptions,\n },\n responseFormat: options.responseFormat ?? modelResponseFormat(settings),\n temperature: options.temperature ?? parameters.temperature,\n tools: options.tools?.map((tool) =>\n tool.type === \"function\"\n ? {\n ...tool,\n providerOptions: toOpenAI(tool.providerOptions, providerName),\n strict: tool.strict ?? false,\n }\n : tool,\n ),\n topP: options.topP ?? parameters.topP,\n };\n const convertedInput = convertResponsesCallToV4(input);\n const transport = await createResponsesTransport(config, settings, options);\n const model = createOpenAI({\n // Authentication is supplied by SAP's transport, not an OpenAI API key.\n apiKey: \"sap-ai-core\",\n baseURL: transport.baseURL,\n fetch: transport.fetch,\n }).responses(config.modelId);\n return { dispose: transport.dispose, input: convertedInput, model, providerName, warnings };\n}\n\n/**\n * Adds provider identity to the final Responses metadata.\n * @param metadata - Delegate metadata.\n * @param providerName - Configured SAP provider namespace.\n * @returns Final provider metadata.\n */\nfunction responseMetadata(\n metadata: SharedV3ProviderMetadata | undefined,\n providerName: string,\n): SharedV3ProviderMetadata {\n const mapped = fromOpenAI(metadata, providerName);\n return {\n ...mapped,\n [providerName]: { ...mapped?.[providerName], api: \"responses\", version: VERSION },\n };\n}\n\n/**\n * Restores the native namespace used by OpenAI's history converter.\n * @param options - Provider options on a message, part, or tool.\n * @param providerName - Configured SAP provider namespace.\n * @returns Options with a native OpenAI slice.\n */\nfunction toOpenAI(\n options: SharedV3ProviderOptions | undefined,\n providerName: string,\n): SharedV3ProviderOptions | undefined {\n if (providerName === \"openai\" || !options?.[providerName]) return options;\n return { ...options, openai: { ...options.openai, ...options[providerName] } };\n}\n\n/**\n * Translates provider-specific file IDs and metadata nested in tool output.\n * @param output - Tool output.\n * @param providerName - Configured SAP provider namespace.\n * @returns Tool output with native Responses identifiers.\n */\nfunction toOpenAIOutput(\n output: LanguageModelV3ToolResultOutput & { providerOptions?: SharedV3ProviderOptions },\n providerName: string,\n): LanguageModelV3ToolResultOutput {\n const mappedOutput = {\n ...output,\n providerOptions: toOpenAI(output.providerOptions, providerName),\n };\n if (mappedOutput.type !== \"content\") return mappedOutput;\n return {\n ...mappedOutput,\n value: mappedOutput.value.map((part) => ({\n ...part,\n ...((part.type === \"file-id\" || part.type === \"image-file-id\") &&\n typeof part.fileId !== \"string\" &&\n part.fileId[providerName]\n ? { fileId: { ...part.fileId, openai: part.fileId[providerName] } }\n : {}),\n ...(\"providerOptions\" in part\n ? { providerOptions: toOpenAI(part.providerOptions, providerName) }\n : {}),\n })),\n };\n}\n\n/**\n * Translates one prompt part while preserving its message-specific type.\n * @param part - Input part.\n * @param providerName - Configured SAP provider namespace.\n * @returns The translated input part.\n */\nfunction toOpenAIPart<T extends PromptPart>(part: T, providerName: string): T {\n return {\n ...part,\n ...(part.type === \"tool-result\" ? { output: toOpenAIOutput(part.output, providerName) } : {}),\n providerOptions: toOpenAI(part.providerOptions, providerName),\n };\n}\n\n/**\n * Preserves reasoning IDs, encrypted content, and tool metadata across requests.\n * @param prompt - The normalized AI SDK prompt.\n * @param providerName - Configured SAP provider namespace.\n * @returns The prompt understood by the Responses delegate.\n */\nfunction toOpenAIPrompt(\n prompt: LanguageModelV3Prompt,\n providerName: string,\n): LanguageModelV3Prompt {\n return prompt.map((message) => {\n const providerOptions = toOpenAI(message.providerOptions, providerName);\n switch (message.role) {\n case \"assistant\":\n return {\n ...message,\n content: message.content.map((part) => toOpenAIPart(part, providerName)),\n providerOptions,\n };\n case \"system\":\n return { ...message, providerOptions };\n case \"tool\":\n return {\n ...message,\n content: message.content.map((part) => toOpenAIPart(part, providerName)),\n providerOptions,\n };\n case \"user\":\n return {\n ...message,\n content: message.content.map((part) => toOpenAIPart(part, providerName)),\n providerOptions,\n };\n }\n });\n}\n","/**\n * Stream transformer for converting SAP AI SDK streaming responses\n * into Vercel AI SDK LanguageModelV3StreamPart events.\n */\nimport type {\n JSONObject,\n LanguageModelV3CallOptions,\n LanguageModelV3FinishReason,\n LanguageModelV3ResponseMetadata,\n LanguageModelV3StreamPart,\n LanguageModelV3Usage,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport type { ReasoningBlock } from \"@sap-ai-sdk/orchestration\";\n\nimport type {\n SDKCitation,\n SDKDeltaToolCall,\n SDKStreamChunk,\n SDKTokenUsage,\n} from \"./strategy-utils.js\";\n\nimport { createAbortError } from \"./abort-utils.js\";\nimport { orchestrationReasoningBlockSchema } from \"./sap-ai-provider-options.js\";\nimport {\n buildAnthropicCacheMetadata,\n buildOrchestrationReasoningMetadata,\n createAISDKRequestBodySummary,\n getProviderFinishReason,\n mapFinishReason,\n mapTokenUsage,\n parseProviderSpecificFields,\n sanitizeAsJSONArray,\n} from \"./strategy-utils.js\";\n\n/**\n * @internal\n */\nexport interface StreamState {\n activeText: boolean;\n finishReason: LanguageModelV3FinishReason;\n isFirstChunk: boolean;\n usage: LanguageModelV3Usage;\n}\n\n/**\n * @internal\n */\nexport interface StreamTransformerConfig {\n readonly cancel: () => void;\n readonly convertToAISDKError: (\n error: unknown,\n context: {\n modelId: string;\n modelType: \"languageModel\";\n operation: string;\n requestBody: unknown;\n url: string;\n },\n ) => unknown;\n readonly extractChunkMetadata: (chunk: SDKStreamChunk) => {\n requestId?: string;\n responseMetadata: LanguageModelV3ResponseMetadata;\n };\n readonly extractProviderSpecificFields?: (chunk: SDKStreamChunk) => unknown;\n readonly extractReasoningBlocks?: (chunk: SDKStreamChunk) => unknown;\n readonly idGenerator: StreamIdGenerator;\n readonly includeRawChunks: boolean;\n readonly modelId: string;\n readonly options: LanguageModelV3CallOptions;\n readonly providerName: string;\n /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n readonly requestId?: string;\n readonly responseMetadata: LanguageModelV3ResponseMetadata & { id: string };\n readonly sdkStream: AsyncIterable<SDKStreamChunk>;\n readonly streamResponseGetCitations?: () => SDKCitation[] | undefined;\n readonly streamResponseGetFinishReason: () => null | string | undefined;\n readonly streamResponseGetIntermediateFailures?: () => undefined | unknown[];\n readonly url: string;\n readonly version: string;\n readonly warnings: readonly SharedV3Warning[];\n}\n\n/**\n * @internal\n */\nexport interface ToolCallInProgress {\n arguments: string;\n didEmitCall: boolean;\n didEmitInputStart: boolean;\n id: string | undefined;\n toolName?: string;\n}\n\n/**\n * @internal\n */\nexport class StreamIdGenerator {\n /**\n * @returns A UUID string for identifying a native reasoning block.\n */\n generateReasoningBlockId(): string {\n return crypto.randomUUID();\n }\n\n /**\n * @returns A UUID string for identifying the response.\n */\n generateResponseId(): string {\n return crypto.randomUUID();\n }\n\n /**\n * @returns A UUID string for identifying a text block.\n */\n generateTextBlockId(): string {\n return crypto.randomUUID();\n }\n\n /**\n * @returns A UUID string for identifying a tool call when the API does not provide one.\n */\n generateToolCallId(): string {\n return crypto.randomUUID();\n }\n}\n\n/**\n * Creates the initial stream state for processing streaming responses.\n * @returns The initial stream state object.\n * @internal\n */\nexport function createInitialStreamState(): StreamState {\n return {\n activeText: false,\n finishReason: {\n raw: undefined,\n unified: \"other\" as const,\n },\n isFirstChunk: true,\n usage: {\n inputTokens: {\n cacheRead: undefined,\n cacheWrite: undefined,\n noCache: undefined,\n total: undefined,\n },\n outputTokens: {\n reasoning: undefined,\n text: undefined,\n total: undefined,\n },\n },\n };\n}\n\n/**\n * Creates a ReadableStream that transforms SAP AI SDK streaming responses\n * into Vercel AI SDK LanguageModelV3StreamPart events.\n * @param config - The stream transformer configuration containing all dependencies.\n * @returns A ReadableStream of LanguageModelV3StreamPart events.\n * @internal\n */\nexport function createStreamTransformer(\n config: StreamTransformerConfig,\n): ReadableStream<LanguageModelV3StreamPart> {\n const {\n cancel,\n convertToAISDKError,\n extractChunkMetadata,\n extractProviderSpecificFields,\n extractReasoningBlocks,\n idGenerator,\n includeRawChunks,\n modelId,\n options,\n providerName,\n requestId,\n responseMetadata,\n sdkStream,\n streamResponseGetCitations,\n streamResponseGetFinishReason,\n streamResponseGetIntermediateFailures,\n url,\n version,\n warnings,\n } = config;\n\n let textBlockId: null | string = null;\n const streamState = createInitialStreamState();\n const toolCallsInProgress = new Map<number, ToolCallInProgress>();\n const resolvedResponseMetadata = { ...responseMetadata };\n let resolvedRequestId = requestId;\n let tokenUsage: SDKTokenUsage | undefined;\n let citations: Map<string, SDKCitation> | undefined;\n let providerSpecificFields: JSONObject | undefined;\n let providerFinishReason: string | undefined;\n let reasoningBlocks: undefined | { block: ReasoningBlock; id: string }[];\n\n /**\n * Retains SAP's positional reasoning blocks until EOF, including late signature updates.\n * @param incoming - Unvalidated native reasoning collection from the SDK.\n * @param controller - Output event controller.\n * @returns False after emitting a terminal validation error; true otherwise.\n */\n function collectReasoningBlocks(\n incoming: unknown,\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n ): boolean {\n if (incoming === undefined) return true;\n if (!Array.isArray(incoming)) {\n handleStreamError(\n new TypeError(\"Invalid Orchestration reasoning_content: expected an array.\"),\n controller,\n convertToAISDKError,\n options,\n modelId,\n url,\n );\n return false;\n }\n const blocks: unknown[] = incoming;\n if (blocks.length === 0) return true;\n reasoningBlocks ??= [];\n for (const [index, value] of blocks.entries()) {\n const parsed = orchestrationReasoningBlockSchema.safeParse(value);\n if (!parsed.success) {\n handleStreamError(parsed.error, controller, convertToAISDKError, options, modelId, url);\n return false;\n }\n const block = parsed.data;\n let state = reasoningBlocks[index];\n if (state) {\n state.block.content = (state.block.content ?? \"\") + (block.content ?? \"\");\n if (block.signature) state.block.signature = block.signature;\n } else {\n state = { block, id: idGenerator.generateReasoningBlockId() };\n reasoningBlocks.push(state);\n controller.enqueue({ id: state.id, type: \"reasoning-start\" });\n }\n if (block.content) {\n controller.enqueue({ delta: block.content, id: state.id, type: \"reasoning-delta\" });\n }\n }\n return true;\n }\n\n /**\n * Retains sources from early chunks when later SDK snapshots omit them.\n * @param incoming - Citations in a chunk or final response.\n */\n function collectCitations(incoming: SDKCitation[] | undefined): void {\n if (!incoming?.length) return;\n citations ??= new Map();\n for (const citation of incoming) {\n citations.set(String(citation.ref_id ?? citation.url), citation);\n }\n }\n\n /**\n * Combines usage snapshots without losing details omitted by later chunks.\n * @param incoming - Usage in the incoming chunk.\n */\n function collectUsage(incoming: null | SDKTokenUsage | undefined): void {\n if (!incoming) return;\n const promptDetails = tokenUsage?.prompt_tokens_details;\n const incomingPromptDetails = incoming.prompt_tokens_details;\n const completionDetails = tokenUsage?.completion_tokens_details;\n const incomingCompletionDetails = incoming.completion_tokens_details;\n const cacheDetails = promptDetails?.cache_creation_token_details;\n const incomingCacheDetails = incomingPromptDetails?.cache_creation_token_details;\n tokenUsage = {\n ...tokenUsage,\n ...incoming,\n ...(promptDetails || incomingPromptDetails\n ? {\n prompt_tokens_details: {\n ...promptDetails,\n ...incomingPromptDetails,\n ...(cacheDetails || incomingCacheDetails\n ? {\n cache_creation_token_details: { ...cacheDetails, ...incomingCacheDetails },\n }\n : {}),\n },\n }\n : {}),\n ...(completionDetails || incomingCompletionDetails\n ? {\n completion_tokens_details: { ...completionDetails, ...incomingCompletionDetails },\n }\n : {}),\n };\n }\n\n /**\n * Emits tool-input-start and replays any buffered arguments as a delta.\n * @param tc - The in-progress tool call state.\n * @param controller - The transform stream controller to enqueue events into.\n */\n function emitToolInputStart(\n tc: ToolCallInProgress,\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n ): void {\n if (tc.didEmitInputStart || tc.id == null) return;\n tc.didEmitInputStart = true;\n controller.enqueue({\n id: tc.id,\n toolName: tc.toolName ?? \"\",\n type: \"tool-input-start\",\n });\n if (tc.arguments.length > 0) {\n controller.enqueue({\n delta: tc.arguments,\n id: tc.id,\n type: \"tool-input-delta\",\n });\n }\n }\n\n const iterator = safeIterate(sdkStream, options.abortSignal)[Symbol.asyncIterator]();\n let canceled = false;\n return new ReadableStream<Error | SDKStreamChunk>({\n async cancel() {\n canceled = true;\n // Abort transport before return(): an async iterator can be waiting on the next chunk.\n cancel();\n await iterator.return(undefined);\n },\n async pull(controller) {\n const { done, value } = await iterator.next();\n if (canceled) return;\n if (done) controller.close();\n else controller.enqueue(value);\n },\n }).pipeThrough(\n new TransformStream<Error | SDKStreamChunk, LanguageModelV3StreamPart>({\n flush(controller) {\n if (options.abortSignal?.aborted) {\n handleStreamError(\n createAbortError(options.abortSignal.reason),\n controller,\n convertToAISDKError,\n options,\n modelId,\n url,\n );\n return;\n }\n\n for (const state of reasoningBlocks ?? []) {\n controller.enqueue({\n id: state.id,\n providerMetadata: buildOrchestrationReasoningMetadata(state.block, providerName),\n type: \"reasoning-end\",\n });\n }\n\n const didEmitAnyToolCalls = finalizeToolCalls(\n controller,\n toolCallsInProgress,\n idGenerator,\n emitToolInputStart,\n );\n\n if (streamState.activeText && textBlockId) {\n controller.enqueue({ id: textBlockId, type: \"text-end\" });\n }\n\n const finalFinishReason = streamResponseGetFinishReason();\n if (finalFinishReason) {\n streamState.finishReason = mapFinishReason(finalFinishReason, providerFinishReason);\n } else if (didEmitAnyToolCalls) {\n streamState.finishReason = {\n raw: providerFinishReason,\n unified: \"tool-calls\",\n };\n }\n if (providerFinishReason !== undefined) {\n streamState.finishReason = { ...streamState.finishReason, raw: providerFinishReason };\n }\n\n // Use wire usage snapshots; SAP final aggregation can invent zero totals.\n streamState.usage = mapTokenUsage(tokenUsage);\n\n collectCitations(streamResponseGetCitations?.());\n if (citations) {\n for (const citation of citations.values()) {\n controller.enqueue({\n id: String(citation.ref_id ?? citation.url),\n sourceType: \"url\" as const,\n title: citation.title,\n type: \"source\",\n url: citation.url,\n });\n }\n }\n\n const streamIntermediateFailures = streamResponseGetIntermediateFailures?.();\n\n controller.enqueue({\n finishReason: streamState.finishReason,\n providerMetadata: {\n [providerName]: {\n ...buildAnthropicCacheMetadata(tokenUsage),\n finishReason: streamState.finishReason.raw ?? \"unknown\",\n finishReasonMapped: streamState.finishReason,\n ...(providerSpecificFields && { providerSpecificFields }),\n ...(streamIntermediateFailures?.length\n ? {\n intermediateFailures: sanitizeAsJSONArray(streamIntermediateFailures),\n }\n : {}),\n ...(resolvedRequestId ? { requestId: resolvedRequestId } : {}),\n responseId: resolvedResponseMetadata.id,\n version,\n },\n },\n type: \"finish\",\n usage: streamState.usage,\n });\n },\n\n start(controller) {\n controller.enqueue({\n type: \"stream-start\",\n warnings: [...warnings],\n });\n },\n\n transform(chunk, controller) {\n if (options.abortSignal?.aborted && !(chunk instanceof Error)) {\n chunk = createAbortError(options.abortSignal.reason);\n }\n if (chunk instanceof Error) {\n handleStreamError(chunk, controller, convertToAISDKError, options, modelId, url);\n return;\n }\n\n if (includeRawChunks) {\n controller.enqueue({\n rawValue: (chunk as { _data?: unknown })._data ?? chunk,\n type: \"raw\",\n });\n }\n\n const metadata = extractChunkMetadata(chunk);\n if (metadata.requestId) resolvedRequestId = metadata.requestId;\n const incomingMetadata = metadata.responseMetadata;\n const metadataChanged =\n (incomingMetadata.id !== undefined &&\n incomingMetadata.id !== resolvedResponseMetadata.id) ||\n (incomingMetadata.modelId !== undefined &&\n incomingMetadata.modelId !== resolvedResponseMetadata.modelId) ||\n (incomingMetadata.timestamp !== undefined &&\n incomingMetadata.timestamp.getTime() !== resolvedResponseMetadata.timestamp?.getTime());\n Object.assign(resolvedResponseMetadata, incomingMetadata);\n collectUsage(chunk.getTokenUsage?.());\n collectCitations(chunk.getCitations?.());\n const incomingProviderFields = parseProviderSpecificFields(\n extractProviderSpecificFields?.(chunk),\n );\n if (incomingProviderFields) {\n providerSpecificFields = { ...providerSpecificFields, ...incomingProviderFields };\n providerFinishReason =\n getProviderFinishReason(incomingProviderFields) ?? providerFinishReason;\n }\n if (!collectReasoningBlocks(extractReasoningBlocks?.(chunk), controller)) return;\n\n if (streamState.isFirstChunk || metadataChanged) {\n streamState.isFirstChunk = false;\n controller.enqueue({\n ...resolvedResponseMetadata,\n type: \"response-metadata\",\n });\n }\n\n const deltaToolCalls = chunk.getDeltaToolCalls();\n if (Array.isArray(deltaToolCalls) && deltaToolCalls.length > 0) {\n streamState.finishReason = {\n raw: undefined,\n unified: \"tool-calls\",\n };\n }\n\n const deltaContent = chunk.getDeltaContent();\n if (typeof deltaContent === \"string\" && deltaContent.length > 0) {\n textBlockId = handleTextDelta(\n deltaContent,\n controller,\n streamState,\n textBlockId,\n idGenerator,\n );\n }\n\n if (Array.isArray(deltaToolCalls) && deltaToolCalls.length > 0) {\n handleToolCallDeltas(deltaToolCalls, controller, toolCallsInProgress, emitToolInputStart);\n }\n\n const chunkFinishReason = chunk.getFinishReason();\n if (chunkFinishReason) {\n streamState.finishReason = mapFinishReason(chunkFinishReason, providerFinishReason);\n\n if (streamState.finishReason.unified === \"tool-calls\") {\n finalizeToolCalls(controller, toolCallsInProgress, idGenerator, emitToolInputStart);\n\n if (streamState.activeText && textBlockId) {\n controller.enqueue({ id: textBlockId, type: \"text-end\" });\n streamState.activeText = false;\n }\n }\n }\n },\n }),\n );\n}\n\n/**\n * Finalizes pending tool calls by emitting tool-input-end and tool-call events.\n * @param controller - The transform stream controller.\n * @param toolCallsInProgress - Map of in-progress tool calls.\n * @param idGenerator - ID generator for tool calls without IDs.\n * @param emitToolInputStart - Function to emit tool-input-start events.\n * @returns Whether any tool calls were finalized.\n * @internal\n */\nfunction finalizeToolCalls(\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolCallsInProgress: Map<number, ToolCallInProgress>,\n idGenerator: StreamIdGenerator,\n emitToolInputStart: (\n tc: ToolCallInProgress,\n ctrl: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n ) => void,\n): boolean {\n let didEmitAnyToolCalls = false;\n\n for (const tc of toolCallsInProgress.values()) {\n if (tc.didEmitCall) {\n continue;\n }\n\n tc.id ??= idGenerator.generateToolCallId();\n emitToolInputStart(tc, controller);\n\n didEmitAnyToolCalls = true;\n tc.didEmitCall = true;\n controller.enqueue({ id: tc.id, type: \"tool-input-end\" });\n controller.enqueue({\n input: tc.arguments,\n toolCallId: tc.id,\n toolName: tc.toolName ?? \"\",\n type: \"tool-call\",\n });\n }\n\n return didEmitAnyToolCalls;\n}\n\n/**\n * Handles a stream error by converting it and enqueuing an error event.\n * @param error - The error from the stream iteration.\n * @param controller - The transform stream controller.\n * @param convertToAISDKError - Error conversion function.\n * @param options - Language model call options for context.\n * @param modelId - Model identifier for error classification.\n * @param url - The request URL for error context.\n * @internal\n */\nfunction handleStreamError(\n error: Error,\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n convertToAISDKError: StreamTransformerConfig[\"convertToAISDKError\"],\n options: LanguageModelV3CallOptions,\n modelId: string,\n url: string,\n): void {\n const aiError = convertToAISDKError(error, {\n modelId,\n modelType: \"languageModel\",\n operation: \"doStream\",\n requestBody: createAISDKRequestBodySummary(options),\n url,\n });\n controller.enqueue({\n error: aiError instanceof Error ? aiError : new Error(String(aiError)),\n type: \"error\",\n });\n controller.terminate();\n}\n\n/**\n * Handles a text delta by managing text block lifecycle.\n * @param deltaContent - The text delta content.\n * @param controller - The transform stream controller.\n * @param streamState - The current stream state.\n * @param currentTextBlockId - The current text block ID (or null).\n * @param idGenerator - ID generator for new text blocks.\n * @returns The current text block ID (may be newly created).\n * @internal\n */\nfunction handleTextDelta(\n deltaContent: string,\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n streamState: StreamState,\n currentTextBlockId: null | string,\n idGenerator: StreamIdGenerator,\n): string {\n let textBlockId = currentTextBlockId;\n if (!streamState.activeText) {\n textBlockId = idGenerator.generateTextBlockId();\n controller.enqueue({ id: textBlockId, type: \"text-start\" });\n streamState.activeText = true;\n }\n if (textBlockId) {\n controller.enqueue({\n delta: deltaContent,\n id: textBlockId,\n type: \"text-delta\",\n });\n return textBlockId;\n }\n return currentTextBlockId ?? idGenerator.generateTextBlockId();\n}\n\n/**\n * Handles tool call delta chunks by assembling tool calls progressively.\n * @param deltaToolCalls - The tool call delta chunks from the stream.\n * @param controller - The transform stream controller.\n * @param toolCallsInProgress - Map of in-progress tool calls by index.\n * @param emitToolInputStart - Function to emit tool-input-start events.\n * @internal\n */\nfunction handleToolCallDeltas(\n deltaToolCalls: SDKDeltaToolCall[],\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolCallsInProgress: Map<number, ToolCallInProgress>,\n emitToolInputStart: (\n tc: ToolCallInProgress,\n ctrl: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n ) => void,\n): void {\n for (const toolCallChunk of deltaToolCalls) {\n const index = toolCallChunk.index;\n if (typeof index !== \"number\" || !Number.isFinite(index)) {\n continue;\n }\n\n if (!toolCallsInProgress.has(index)) {\n toolCallsInProgress.set(index, {\n arguments: \"\",\n didEmitCall: false,\n didEmitInputStart: false,\n id:\n typeof toolCallChunk.id === \"string\" && toolCallChunk.id.length > 0\n ? toolCallChunk.id\n : undefined,\n toolName: toolCallChunk.function?.name,\n });\n }\n\n const tc = toolCallsInProgress.get(index);\n if (!tc) continue;\n\n if (\n typeof toolCallChunk.id === \"string\" &&\n toolCallChunk.id.length > 0 &&\n tc.id === undefined\n ) {\n tc.id = toolCallChunk.id;\n }\n\n const nextToolName = toolCallChunk.function?.name;\n if (typeof nextToolName === \"string\" && nextToolName.length > 0) {\n tc.toolName = nextToolName;\n }\n\n if (!tc.didEmitInputStart && tc.toolName != null && tc.id != null) {\n emitToolInputStart(tc, controller);\n }\n\n const argumentsDelta = toolCallChunk.function?.arguments;\n if (typeof argumentsDelta === \"string\" && argumentsDelta.length > 0) {\n tc.arguments += argumentsDelta;\n\n if (tc.didEmitInputStart && tc.id != null) {\n controller.enqueue({\n delta: argumentsDelta,\n id: tc.id,\n type: \"tool-input-delta\",\n });\n }\n }\n }\n}\n\n/**\n * Wraps an async iterable to catch iteration errors and yield them as values.\n *\n * After the first error, the transformer emits an error event and terminates without\n * a successful finish event.\n * @param iterable - The async iterable to wrap.\n * @param abortSignal - Caller cancellation, which the SAP iterator can otherwise swallow.\n * @yields {Error | T} Original values or Error instances for caught exceptions.\n * @internal\n */\nasync function* safeIterate<T>(\n iterable: AsyncIterable<T>,\n abortSignal: AbortSignal | undefined,\n): AsyncGenerator<Error | T, void> {\n try {\n for await (const chunk of iterable) {\n abortSignal?.throwIfAborted();\n yield chunk;\n }\n abortSignal?.throwIfAborted();\n } catch (error) {\n if (abortSignal?.aborted) {\n yield createAbortError(abortSignal.reason);\n } else {\n yield error instanceof Error ? error : new Error(String(error));\n }\n }\n}\n","/** Base class for language model strategies using the Template Method pattern. */\nimport type {\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3ResponseMetadata,\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 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 { throwIfAborted, waitWithAbort } from \"./abort-utils.js\";\nimport { convertToSAPMessages } from \"./convert-to-sap-messages.js\";\nimport { convertToAISDKError, normalizeHeaders } from \"./sap-ai-error.js\";\nimport { getProviderName } from \"./sap-ai-provider-options.js\";\nimport {\n buildGenerateResult,\n buildModelParams,\n createAISDKRequestBodySummary,\n extractCompletionMetadata,\n extractResponseMetadata,\n mapToolChoice,\n mergeRequestConfig,\n type ParamMapping,\n type SAPToolChoice,\n type SDKCitation,\n type SDKResponse,\n type SDKStreamChunk,\n} from \"./strategy-utils.js\";\nimport { createStreamTransformer, StreamIdGenerator } from \"./stream-transformer.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 cancel: () => void;\n readonly extractProviderSpecificFields?: (chunk: SDKStreamChunk) => unknown;\n readonly extractReasoningBlocks?: (chunk: SDKStreamChunk) => unknown;\n readonly getCitations?: () => SDKCitation[] | undefined;\n readonly getFinishReason: () => null | string | undefined;\n readonly getIntermediateFailures?: () => undefined | unknown[];\n /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n readonly requestId?: string;\n readonly responseHeaders?: Record<string, string>;\n readonly responseMetadata?: LanguageModelV3ResponseMetadata;\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 throwIfAborted(options.abortSignal);\n const commonParts = 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 waitWithAbort(\n this.executeApiCall(\n client,\n request,\n mergeRequestConfig(config.requestConfig, options.abortSignal, options.headers),\n ),\n options.abortSignal,\n );\n throwIfAborted(options.abortSignal);\n\n return buildGenerateResult({\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 modelId: config.modelId,\n modelType: \"languageModel\",\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 throwIfAborted(options.abortSignal);\n const commonParts = 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 mergeRequestConfig(config.requestConfig, undefined, options.headers),\n commonParts,\n );\n if (options.abortSignal?.aborted) {\n try {\n streamResponse.cancel();\n } finally {\n throwIfAborted(options.abortSignal);\n }\n }\n\n const idGenerator = new StreamIdGenerator();\n\n const streamWarnings = this.collectStreamWarnings(settings, commonParts.sapOptions);\n\n const transformedStream = createStreamTransformer({\n cancel: streamResponse.cancel,\n convertToAISDKError,\n extractChunkMetadata: (chunk) => this.extractMetadata(chunk),\n extractProviderSpecificFields: streamResponse.extractProviderSpecificFields,\n extractReasoningBlocks: streamResponse.extractReasoningBlocks,\n idGenerator,\n includeRawChunks: options.includeRawChunks ?? false,\n modelId: config.modelId,\n options,\n providerName: commonParts.providerName,\n requestId: streamResponse.requestId,\n responseMetadata: {\n ...streamResponse.responseMetadata,\n id: streamResponse.responseMetadata?.id ?? idGenerator.generateResponseId(),\n },\n sdkStream: streamResponse.stream,\n streamResponseGetCitations: streamResponse.getCitations,\n streamResponseGetFinishReason: streamResponse.getFinishReason,\n streamResponseGetIntermediateFailures: streamResponse.getIntermediateFailures,\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 modelId: config.modelId,\n modelType: \"languageModel\",\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 buildCommonParts(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): CommonBuildResult<ChatMessage[], SAPToolChoice | undefined> {\n const providerName = getProviderName(config.provider);\n\n const sapOptions = config.parsedProviderOptions;\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 nativeReasoningProviderName: this.getNativeReasoningProviderName(providerName),\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 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 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 * @param commonParts - Common build result (resolved state, provider options, etc.).\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 commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): Promise<StreamCallResponse>;\n\n /**\n * Resolves completion metadata, request 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 responseMetadata: LanguageModelV3ResponseMetadata;\n } {\n const responseMetadata = extractCompletionMetadata(\n response as { _data?: unknown; getRequestId?: () => string | undefined },\n this.getCompletionDataPath(),\n );\n const { headers, requestId } = extractResponseMetadata(response, \"rawResponse\");\n return { requestId, responseHeaders: headers, responseMetadata };\n }\n\n /**\n * Returns the API-specific path to the completion object in an SDK payload.\n * @returns Completion path (`[\"final_result\"]` for orchestration, `[]` for Foundation Models).\n * @internal\n */\n protected abstract getCompletionDataPath(): 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; the Orchestration override defaults to true unless disabled.\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 assistant reasoning in the input history is forwarded as text.\n * @param sapOptions - Parsed provider options.\n * @param settings - Model settings.\n * @returns Whether to forward input 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) ??\n (\"includeReasoning\" in settings ? settings.includeReasoning : false) ??\n false\n );\n }\n\n /**\n * Enables native reasoning history only for strategies supporting the Orchestration wire format.\n * @param _providerName - Configured provider namespace.\n * @returns The native reasoning namespace, or undefined for legacy text-only history.\n * @internal\n */\n protected getNativeReasoningProviderName(_providerName: string): string | undefined {\n return undefined;\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","/** Foundation Models language model strategy using `@sap-ai-sdk/foundation-models`. */\nimport type { LanguageModelV3CallOptions, SharedV3Warning } from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type {\n AzureOpenAiChatClient,\n AzureOpenAiChatCompletionParameters,\n AzureOpenAiChatCompletionTool,\n} from \"@sap-ai-sdk/foundation-models\";\nimport type { ChatMessage } from \"@sap-ai-sdk/orchestration\";\n\nimport type { FoundationModelsModelSettings } from \"./sap-ai-settings.js\";\nimport type { LanguageModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport {\n BaseLanguageModelStrategy,\n type CommonBuildResult,\n type StreamCallResponse,\n} from \"./base-language-model-strategy.js\";\nimport { disposeSapStream, executeSapStream, withSapStreamCleanup } from \"./sap-http-stream.js\";\nimport {\n buildModelDeployment,\n convertResponseFormat,\n convertToolsToSAPFormat,\n type ParamMapping,\n type SAPToolChoice,\n type SDKResponse,\n type SDKStreamChunk,\n} from \"./strategy-utils.js\";\n\n/** @internal */\ntype FoundationModelsClient = InstanceType<typeof AzureOpenAiChatClient>;\n\n/**\n * Foundation Models API parameter mappings.\n * @internal\n */\nconst FOUNDATION_MODELS_PARAM_MAPPINGS: readonly ParamMapping[] = [\n ...BaseLanguageModelStrategy.COMMON_PARAM_MAPPINGS,\n { camelCaseKey: \"logprobs\", outputKey: \"logprobs\" },\n { camelCaseKey: \"topLogprobs\", outputKey: \"top_logprobs\" },\n { camelCaseKey: \"logitBias\", outputKey: \"logit_bias\" },\n { camelCaseKey: \"user\", outputKey: \"user\" },\n { camelCaseKey: \"n\", outputKey: \"n\" },\n] as const;\n\n/**\n * Language model strategy for the Foundation Models API.\n *\n * Provides direct access to Azure OpenAI models with parameters like:\n * - logprobs\n * - seed\n * - dataSources (On Your Data)\n * @internal\n */\nexport class FoundationModelsLanguageModelStrategy extends BaseLanguageModelStrategy<\n FoundationModelsClient,\n AzureOpenAiChatCompletionParameters,\n FoundationModelsModelSettings\n> {\n private readonly ClientClass: typeof AzureOpenAiChatClient;\n\n constructor(ClientClass: typeof AzureOpenAiChatClient) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected buildRequest(\n _config: LanguageModelStrategyConfig,\n settings: FoundationModelsModelSettings,\n options: LanguageModelV3CallOptions,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): {\n readonly request: AzureOpenAiChatCompletionParameters;\n readonly warnings: SharedV3Warning[];\n } {\n const warnings: SharedV3Warning[] = [];\n\n const toolsResult = convertToolsToSAPFormat<AzureOpenAiChatCompletionTool>(options.tools);\n warnings.push(...toolsResult.warnings);\n\n const { responseFormat, warning: responseFormatWarning } = convertResponseFormat(\n options.responseFormat,\n settings.responseFormat,\n );\n if (responseFormatWarning) {\n warnings.push(responseFormatWarning);\n }\n\n const { toolChoice } = commonParts;\n\n const request: AzureOpenAiChatCompletionParameters = {\n messages: commonParts.messages as AzureOpenAiChatCompletionParameters[\"messages\"],\n ...(commonParts.modelParams as Partial<AzureOpenAiChatCompletionParameters>),\n ...(toolsResult.tools?.length ? { tools: toolsResult.tools } : {}),\n ...(toolChoice ? { tool_choice: toolChoice } : {}),\n ...(responseFormat ? { response_format: responseFormat } : {}),\n ...(settings.dataSources?.length\n ? {\n data_sources: settings.dataSources,\n }\n : {}),\n };\n\n return { request, warnings };\n }\n\n protected createClient(\n config: LanguageModelStrategyConfig,\n settings: FoundationModelsModelSettings,\n _commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): FoundationModelsClient {\n const modelDeployment = buildModelDeployment(config, settings.modelVersion);\n return new this.ClientClass(modelDeployment, config.destination);\n }\n\n protected async executeApiCall(\n client: FoundationModelsClient,\n request: AzureOpenAiChatCompletionParameters,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<SDKResponse> {\n const response = await client.run(request, requestConfig);\n\n const { requestId, responseMetadata } = this.extractMetadata(response);\n\n return {\n getContent: () => response.getContent(),\n getFinishReason: () => response.getFinishReason(),\n getTokenUsage: () => response.getTokenUsage(),\n getToolCalls: () => response.getToolCalls(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- SAP SDK types headers as any\n rawResponse: { headers: response.rawResponse.headers },\n requestId,\n responseMetadata,\n };\n }\n\n protected async executeStreamCall(\n client: FoundationModelsClient,\n request: AzureOpenAiChatCompletionParameters,\n abortSignal: AbortSignal | undefined,\n _settings: FoundationModelsModelSettings,\n requestConfig: CustomRequestConfig | undefined,\n _commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): Promise<StreamCallResponse> {\n const streamResponse = await executeSapStream(\n (streamRequestConfig) => client.stream(request, abortSignal, streamRequestConfig),\n abortSignal,\n requestConfig,\n );\n\n const { requestId, responseHeaders, responseMetadata } = this.extractMetadata(streamResponse);\n\n return {\n cancel: () => {\n disposeSapStream(streamResponse);\n },\n getFinishReason: () => streamResponse.getFinishReason(),\n requestId,\n responseHeaders,\n responseMetadata,\n stream: withSapStreamCleanup(\n streamResponse,\n streamResponse.stream as AsyncIterable<SDKStreamChunk>,\n ),\n };\n }\n\n protected getCompletionDataPath(): readonly string[] {\n return [];\n }\n\n protected getParamMappings(): readonly ParamMapping[] {\n return FOUNDATION_MODELS_PARAM_MAPPINGS;\n }\n\n protected getUrl(): string {\n return \"sap-ai:foundation-models\";\n }\n}\n","/** Orchestration language model strategy using `@sap-ai-sdk/orchestration`. */\nimport type { LanguageModelV3CallOptions, SharedV3Warning } from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type {\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n OrchestrationClient,\n OrchestrationModuleConfig,\n OrchestrationModuleConfigList,\n OrchestrationStreamChunkResponse,\n} from \"@sap-ai-sdk/orchestration\";\n\nimport type { ParsePartProviderOptions } from \"./sap-ai-provider-options.js\";\nimport type {\n OrchestrationModelSettings,\n PromptTemplateRef,\n PromptTemplateRefByID,\n} from \"./sap-ai-settings.js\";\nimport type { LanguageModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport {\n BaseLanguageModelStrategy,\n type CommonBuildResult,\n type StreamCallResponse,\n} from \"./base-language-model-strategy.js\";\nimport { deepMerge } from \"./deep-merge.js\";\nimport {\n orchestrationConfigRefSchema,\n parseSAPPartProviderOptions,\n} from \"./sap-ai-provider-options.js\";\nimport { validateMaskingProvidersDeprecation } from \"./sap-ai-validation.js\";\nimport { disposeSapStream, executeSapStream, withSapStreamCleanup } from \"./sap-http-stream.js\";\nimport {\n convertResponseFormat,\n convertToolsToSAPFormat,\n hasKeys,\n type ParamMapping,\n type SAPResponseFormat,\n type SAPToolChoice,\n type SDKResponse,\n type SDKStreamChunk,\n} from \"./strategy-utils.js\";\n\n/** @internal */\ntype OrchestrationClientInstance = InstanceType<typeof OrchestrationClient>;\n\n/**\n * Typed resolved state for values computed in buildCommonParts and consumed in buildRequest/createClient.\n * @internal\n */\ninterface OrchestrationResolvedState {\n readonly configRef: OrchestrationModelSettings[\"orchestrationConfigRef\"];\n readonly dropUnsupportedParams: boolean | undefined;\n readonly promptTemplateRef: PromptTemplateRef | undefined;\n readonly responseFormat: SAPResponseFormat | undefined;\n readonly tools: ChatCompletionTool[] | undefined;\n}\n\n/**\n * Builds the template_ref object from a PromptTemplateRef.\n * @param ref - Template reference (by ID or by name/scenario/version).\n * @returns The template_ref object for SDK consumption.\n * @internal\n */\nfunction buildTemplateRefObject(ref: PromptTemplateRef): Record<string, unknown> {\n return isTemplateRefById(ref)\n ? {\n id: ref.id,\n ...(ref.scope && { scope: ref.scope }),\n }\n : {\n name: ref.name,\n scenario: ref.scenario,\n version: ref.version,\n ...(ref.scope && { scope: ref.scope }),\n };\n}\n\n/**\n * Type guard for template reference by ID.\n * @param ref - Template reference.\n * @returns True if reference is by ID.\n * @internal\n */\nfunction isTemplateRefById(ref: PromptTemplateRef): ref is PromptTemplateRefByID {\n return \"id\" in ref;\n}\n\n/**\n * Merges and resolves placeholder values from settings and provider options.\n * @param settings - Model settings containing placeholderValues.\n * @param sapOptions - Provider options containing placeholderValues.\n * @returns Merged placeholder values or undefined if empty.\n * @internal\n */\nfunction resolvePlaceholderValues(\n settings: OrchestrationModelSettings,\n sapOptions: Record<string, unknown> | undefined,\n): Record<string, string> | undefined {\n const merged = deepMerge(\n settings.placeholderValues as Record<string, unknown> | undefined,\n sapOptions?.placeholderValues as Record<string, unknown> | undefined,\n ) as Record<string, string>;\n\n return hasKeys(merged) ? merged : undefined;\n}\n\n/**\n * Module keys for orchestration configuration.\n * @internal\n */\nconst ORCHESTRATION_MODULE_KEYS = [\"masking\", \"filtering\", \"grounding\", \"translation\"] as const;\n\n/**\n * Module settings that are ignored when using orchestrationConfigRef.\n * @internal\n */\nconst CONFIG_REF_IGNORED_MODULES = [\n ...ORCHESTRATION_MODULE_KEYS,\n \"dropUnsupportedParams\",\n \"fallbackModuleConfigs\",\n \"promptTemplateRef\",\n \"responseFormat\",\n \"tools\",\n \"modelParams\",\n \"modelVersion\",\n] as const;\n\n/**\n * Provider options that are ignored when using orchestrationConfigRef.\n * Subset of CONFIG_REF_IGNORED_MODULES that can be passed via providerOptions.\n * @internal\n */\nconst CONFIG_REF_IGNORED_PROVIDER_OPTIONS = [\n \"dropUnsupportedParams\",\n \"promptTemplateRef\",\n \"modelParams\",\n] as const;\n\n/**\n * Copies non-empty orchestration modules from source to target.\n * @param target - Target object to copy modules into.\n * @param source - Source object containing module configurations.\n * @internal\n */\nfunction copyOrchestrationModules(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): void {\n for (const key of ORCHESTRATION_MODULE_KEYS) {\n const value = source[key];\n if (value && hasKeys(value)) {\n target[key] = value;\n }\n }\n}\n\n/**\n * Checks if a value is a valid orchestration configuration reference.\n * @param value - The value to check.\n * @returns True if the value is a valid orchestration configuration reference.\n * @internal\n */\nfunction isOrchestrationConfigRef(\n value: unknown,\n): value is NonNullable<OrchestrationModelSettings[\"orchestrationConfigRef\"]> {\n return orchestrationConfigRefSchema.safeParse(value).success;\n}\n\n/**\n * Orchestration API parameter mappings.\n * @internal\n */\nconst ORCHESTRATION_PARAM_MAPPINGS: readonly ParamMapping[] = [\n ...BaseLanguageModelStrategy.COMMON_PARAM_MAPPINGS,\n { camelCaseKey: \"topK\", optionKey: \"topK\", outputKey: \"top_k\" },\n] as const;\n\n/**\n * Language model strategy for the Orchestration API.\n *\n * Provides support for:\n * - Content filtering\n * - Data masking\n * - Document grounding\n * - Translation\n * - Prompt templates\n * - Orchestration config references\n * @internal\n */\nexport class OrchestrationLanguageModelStrategy extends BaseLanguageModelStrategy<\n OrchestrationClientInstance,\n ChatCompletionRequest,\n OrchestrationModelSettings\n> {\n private readonly ClientClass: typeof OrchestrationClient;\n\n constructor(ClientClass: typeof OrchestrationClient) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected buildRequest(\n _config: LanguageModelStrategyConfig,\n settings: OrchestrationModelSettings,\n options: LanguageModelV3CallOptions,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): { readonly request: ChatCompletionRequest; readonly warnings: SharedV3Warning[] } {\n const warnings: SharedV3Warning[] = [];\n\n const { configRef } = commonParts.resolvedState as OrchestrationResolvedState;\n\n if (configRef) {\n return this.buildConfigRefRequest(settings, options, commonParts, warnings);\n }\n\n return this.buildStandardRequest(settings, commonParts, warnings);\n }\n\n /**\n * Collects stream-specific warnings for orchestration.\n * @param settings - Model settings.\n * @param sapOptions - Provider options.\n * @returns Array of warnings for streaming operations.\n * @internal\n */\n protected override collectStreamWarnings(\n settings: OrchestrationModelSettings,\n sapOptions?: Record<string, unknown>,\n ): SharedV3Warning[] {\n const warnings: SharedV3Warning[] = [];\n\n // A valid configRef owns streaming server-side; flag only explicitly set\n // streamOptions (other ignored settings are reported by buildConfigRefRequest).\n const configRefCandidate =\n sapOptions?.orchestrationConfigRef ?? settings.orchestrationConfigRef;\n if (configRefCandidate && isOrchestrationConfigRef(configRefCandidate)) {\n if (settings.streamOptions && hasKeys(settings.streamOptions)) {\n warnings.push({\n message:\n \"orchestrationConfigRef is set; local streamOptions are ignored. \" +\n \"Configure streaming in the referenced configuration or its overrideConfig.\",\n type: \"other\",\n });\n }\n return warnings;\n }\n\n if (settings.translation && hasKeys(settings.translation)) {\n if (!settings.streamOptions?.delimiters || settings.streamOptions.delimiters.length === 0) {\n warnings.push({\n message:\n \"Translation module is configured but streamOptions.delimiters is not set. \" +\n \"For proper sentence boundary detection during streaming with translation, \" +\n \"consider setting delimiters (e.g., ['.', '!', '?', '\\\\n']).\",\n type: \"other\",\n });\n }\n }\n\n return warnings;\n }\n\n protected createClient(\n config: LanguageModelStrategyConfig,\n settings: OrchestrationModelSettings,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): OrchestrationClientInstance {\n const { configRef, dropUnsupportedParams, promptTemplateRef, responseFormat, tools } =\n commonParts.resolvedState as OrchestrationResolvedState;\n\n if (configRef) {\n return new this.ClientClass(configRef, config.deploymentConfig, config.destination);\n }\n\n const clientConfig = this.buildOrchestrationModuleConfig(config, settings, {\n dropUnsupportedParams,\n modelParams: commonParts.modelParams,\n promptTemplateRef,\n responseFormat,\n toolChoice: commonParts.toolChoice,\n tools,\n });\n\n if (settings.fallbackModuleConfigs && settings.fallbackModuleConfigs.length > 0) {\n const configList = [\n clientConfig,\n ...settings.fallbackModuleConfigs,\n ] as OrchestrationModuleConfigList;\n return new this.ClientClass(configList, config.deploymentConfig, config.destination);\n }\n\n return new this.ClientClass(clientConfig, config.deploymentConfig, config.destination);\n }\n\n protected async executeApiCall(\n client: OrchestrationClientInstance,\n request: ChatCompletionRequest,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<SDKResponse> {\n const response = await client.chatCompletion(request, requestConfig);\n\n const { requestId, responseMetadata } = this.extractMetadata(response);\n\n return {\n getCitations: () => response.getCitations(),\n getContent: () => response.getContent(),\n getFinishReason: () => response.getFinishReason(),\n getIntermediateFailures: () => response.getIntermediateFailures(),\n getProviderSpecificFields: () => response.findChoiceByIndex(0)?.provider_specific_fields,\n getReasoningBlocks: () => response.getAssistantMessage()?.reasoning_content,\n getTokenUsage: () => response.getTokenUsage(),\n getToolCalls: () => response.getToolCalls(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- SAP SDK types headers as any\n rawResponse: { headers: response.rawResponse.headers },\n requestId,\n responseMetadata,\n };\n }\n\n protected async executeStreamCall(\n client: OrchestrationClientInstance,\n request: ChatCompletionRequest,\n abortSignal: AbortSignal | undefined,\n settings: OrchestrationModelSettings,\n requestConfig: CustomRequestConfig | undefined,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): Promise<StreamCallResponse> {\n // A configRef owns streaming server-side; the SDK ignores (and warns about)\n // request-level stream options, so omit them.\n const { configRef } = commonParts.resolvedState as OrchestrationResolvedState;\n const sdkStreamOptions = configRef\n ? undefined\n : this.buildSdkStreamOptions(settings.streamOptions);\n const streamResponse = await executeSapStream(\n (streamRequestConfig) =>\n client.stream(request, abortSignal, sdkStreamOptions, streamRequestConfig),\n abortSignal,\n requestConfig,\n );\n\n const { requestId, responseHeaders, responseMetadata } = this.extractMetadata(streamResponse);\n\n return {\n cancel: () => {\n disposeSapStream(streamResponse);\n },\n extractProviderSpecificFields: (chunk) =>\n (chunk as OrchestrationStreamChunkResponse).findChoiceByIndex(0)?.provider_specific_fields,\n extractReasoningBlocks: (chunk) =>\n (chunk as OrchestrationStreamChunkResponse).findChoiceByIndex(0)?.delta.reasoning_content,\n getCitations: () => streamResponse.getCitations(),\n getFinishReason: () => streamResponse.getFinishReason(),\n getIntermediateFailures: () => streamResponse.getIntermediateFailures(),\n requestId,\n responseHeaders,\n responseMetadata,\n stream: withSapStreamCleanup(\n streamResponse,\n streamResponse.stream as AsyncIterable<SDKStreamChunk>,\n ),\n };\n }\n\n protected getCompletionDataPath(): readonly string[] {\n return [\"final_result\"];\n }\n\n protected getEscapeTemplatePlaceholders(\n sapOptions: Record<string, unknown> | undefined,\n settings: OrchestrationModelSettings,\n ): boolean {\n return (\n (sapOptions?.escapeTemplatePlaceholders as boolean | undefined) ??\n settings.escapeTemplatePlaceholders ??\n true\n );\n }\n\n protected override getNativeReasoningProviderName(providerName: string): string {\n return providerName;\n }\n\n protected getParamMappings(): readonly ParamMapping[] {\n return ORCHESTRATION_PARAM_MAPPINGS;\n }\n\n protected override getPartProviderOptionsParser(): ParsePartProviderOptions | undefined {\n return parseSAPPartProviderOptions;\n }\n\n protected getUrl(): string {\n return \"sap-ai:orchestration\";\n }\n\n /**\n * Resolves orchestration-specific extra state: `configRef`, `promptTemplateRef`,\n * and `tools`. Pushes the masking-providers deprecation warning when masking\n * is locally configured (skipped under `configRef` because the server-side\n * configuration overrides it).\n * @param _config - Strategy configuration (unused).\n * @param settings - Model settings.\n * @param sapOptions - Parsed provider options.\n * @param options - AI SDK call options.\n * @param warnings - Shared warnings sink.\n * @returns Resolved orchestration state.\n * @internal\n */\n protected override resolveAdditionalState(\n _config: LanguageModelStrategyConfig,\n settings: OrchestrationModelSettings,\n sapOptions: Record<string, unknown> | undefined,\n options: LanguageModelV3CallOptions,\n warnings: SharedV3Warning[],\n ): OrchestrationResolvedState {\n const configRef = this.resolveConfigRef(sapOptions, settings, warnings);\n const promptTemplateRef = this.resolvePromptTemplateRef(sapOptions, settings);\n\n let responseFormat: SAPResponseFormat | undefined;\n if (configRef === undefined) {\n validateMaskingProvidersDeprecation(settings, warnings);\n const converted = convertResponseFormat(options.responseFormat, settings.responseFormat);\n responseFormat = converted.responseFormat;\n if (converted.warning) warnings.push(converted.warning);\n }\n\n const tools = this.resolveTools(settings, options, warnings);\n\n const dropUnsupportedParams =\n (sapOptions?.dropUnsupportedParams as boolean | undefined) ?? settings.dropUnsupportedParams;\n return { configRef, dropUnsupportedParams, promptTemplateRef, responseFormat, tools };\n }\n\n /**\n * Builds request for orchestrationConfigRef mode.\n *\n * In configRef mode, the full configuration is managed server-side.\n * This request contains messages and placeholderValues; createClient separately\n * passes the reference, including overrideConfig, to the SAP SDK.\n * @param settings - Model settings.\n * @param options - Call options.\n * @param commonParts - Common build result.\n * @param warnings - Warnings array to populate.\n * @returns Request body and warnings.\n * @internal\n */\n private buildConfigRefRequest(\n settings: OrchestrationModelSettings,\n options: LanguageModelV3CallOptions,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n warnings: SharedV3Warning[],\n ): { readonly request: ChatCompletionRequest; readonly warnings: SharedV3Warning[] } {\n warnings.push(\n ...this.collectConfigRefIgnoredWarnings(settings, options, commonParts.sapOptions),\n );\n\n const placeholderValues = resolvePlaceholderValues(settings, commonParts.sapOptions);\n\n // In configRef mode, SDK uses messagesHistory (not messages)\n const request: ChatCompletionRequest = {\n messagesHistory: commonParts.messages,\n ...(placeholderValues ? { placeholderValues } : {}),\n };\n\n return { request, warnings };\n }\n\n /**\n * Builds inline template configuration.\n * @param tools - Optional tools.\n * @param responseFormat - Optional response format.\n * @returns Prompt configuration.\n * @internal\n */\n private buildInlineTemplateConfig(\n tools: ChatCompletionTool[] | undefined,\n responseFormat: unknown,\n ): Record<string, unknown> {\n return {\n template: [],\n ...(tools && tools.length > 0 ? { tools } : {}),\n ...(responseFormat ? { response_format: responseFormat } : {}),\n };\n }\n\n /**\n * Builds the orchestration module configuration.\n * @param config - Strategy configuration.\n * @param settings - Model settings.\n * @param params - Build parameters.\n * @param params.dropUnsupportedParams - Optional unsupported-parameter policy for the primary model.\n * @param params.modelParams - LLM model parameters.\n * @param params.promptTemplateRef - Optional prompt template reference.\n * @param params.responseFormat - Optional response format specification.\n * @param params.toolChoice - Optional tool choice specification.\n * @param params.tools - Optional tools for function calling.\n * @returns Orchestration module configuration.\n * @internal\n */\n private buildOrchestrationModuleConfig(\n config: LanguageModelStrategyConfig,\n settings: OrchestrationModelSettings,\n params: {\n readonly dropUnsupportedParams?: boolean;\n readonly modelParams: Record<string, unknown>;\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: unknown;\n readonly toolChoice?: SAPToolChoice;\n readonly tools?: ChatCompletionTool[];\n },\n ): OrchestrationModuleConfig {\n const {\n dropUnsupportedParams,\n modelParams,\n promptTemplateRef,\n responseFormat,\n toolChoice,\n tools,\n } = params;\n\n const promptConfig = promptTemplateRef\n ? this.buildTemplateRefPromptConfig(promptTemplateRef, tools, responseFormat)\n : this.buildInlineTemplateConfig(tools, responseFormat);\n\n // The SDK accepts model-specific options such as tool_choice only in model.params.\n const effectiveModelParams = toolChoice\n ? { ...modelParams, tool_choice: toolChoice }\n : modelParams;\n\n const moduleConfig: OrchestrationModuleConfig = {\n promptTemplating: {\n model: {\n name: config.modelId,\n params: effectiveModelParams,\n ...(settings.modelVersion ? { version: settings.modelVersion } : {}),\n ...(dropUnsupportedParams !== undefined\n ? { drop_unsupported_params: dropUnsupportedParams }\n : {}),\n },\n prompt: promptConfig,\n },\n };\n\n copyOrchestrationModules(\n moduleConfig as unknown as Record<string, unknown>,\n settings as unknown as Record<string, unknown>,\n );\n\n return moduleConfig;\n }\n\n /**\n * Builds SAP SDK stream options from user-facing stream options.\n * @param streamOptions - User-provided stream options.\n * @returns SDK-compatible stream options object.\n * @internal\n */\n private buildSdkStreamOptions(streamOptions: OrchestrationModelSettings[\"streamOptions\"]): {\n global?: { chunk_size?: number; delimiters?: string[] };\n outputFiltering?: { overlap: number };\n promptTemplating: { include_usage: boolean };\n } {\n const delimiters = streamOptions?.delimiters;\n const hasNonEmptyDelimiters = Array.isArray(delimiters) && delimiters.length > 0;\n const hasGlobalOptions = streamOptions?.chunkSize !== undefined || hasNonEmptyDelimiters;\n\n return {\n promptTemplating: { include_usage: true },\n ...(hasGlobalOptions && {\n global: {\n ...(streamOptions?.chunkSize !== undefined && { chunk_size: streamOptions.chunkSize }),\n ...(hasNonEmptyDelimiters && {\n delimiters: Array.from(delimiters),\n }),\n },\n }),\n ...(streamOptions?.outputFilteringOverlap !== undefined && {\n outputFiltering: { overlap: streamOptions.outputFilteringOverlap },\n }),\n };\n }\n\n /**\n * Builds request for standard (non-configRef) mode.\n * @param settings - Model settings.\n * @param commonParts - Common build result.\n * @param warnings - Warnings array to populate.\n * @returns Request body and warnings.\n * @internal\n */\n private buildStandardRequest(\n settings: OrchestrationModelSettings,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n warnings: SharedV3Warning[],\n ): { readonly request: ChatCompletionRequest; readonly warnings: SharedV3Warning[] } {\n const { promptTemplateRef } = commonParts.resolvedState as OrchestrationResolvedState;\n const placeholderValues = resolvePlaceholderValues(settings, commonParts.sapOptions);\n const request: ChatCompletionRequest = {\n ...(promptTemplateRef\n ? { messagesHistory: commonParts.messages }\n : { messages: commonParts.messages }),\n ...(placeholderValues ? { placeholderValues } : {}),\n };\n\n return { request, warnings };\n }\n\n /**\n * Builds prompt configuration for template reference with optional tools/response_format.\n * @param ref - Template reference.\n * @param tools - Optional tools.\n * @param responseFormat - Optional response format.\n * @returns Prompt configuration.\n * @internal\n */\n private buildTemplateRefPromptConfig(\n ref: PromptTemplateRef,\n tools?: ChatCompletionTool[],\n responseFormat?: unknown,\n ): Record<string, unknown> {\n return {\n template_ref: buildTemplateRefObject(ref),\n ...(tools && tools.length > 0 ? { tools } : {}),\n ...(responseFormat ? { response_format: responseFormat } : {}),\n };\n }\n\n /**\n * Collects warnings for settings that will be ignored when using orchestrationConfigRef.\n * @param settings - The orchestration model settings.\n * @param options - The call options (for tools and responseFormat).\n * @param sapOptions - Parsed provider options (for promptTemplateRef in providerOptions).\n * @returns Array of warnings for ignored settings.\n * @internal\n */\n private collectConfigRefIgnoredWarnings(\n settings: OrchestrationModelSettings,\n options: LanguageModelV3CallOptions,\n sapOptions: Record<string, unknown> | undefined,\n ): SharedV3Warning[] {\n const warnings: SharedV3Warning[] = [];\n const ignoredSettings: string[] = [];\n\n for (const key of CONFIG_REF_IGNORED_MODULES) {\n const value = settings[key as keyof OrchestrationModelSettings];\n if (value !== undefined) {\n if (typeof value === \"object\" && Object.keys(value).length === 0) {\n continue; // Skip empty objects\n }\n ignoredSettings.push(key);\n }\n }\n\n for (const key of CONFIG_REF_IGNORED_PROVIDER_OPTIONS) {\n if (sapOptions?.[key] !== undefined && settings[key] === undefined) {\n ignoredSettings.push(`providerOptions.${key}`);\n }\n }\n\n const optionValues: Record<string, unknown> = options;\n for (const { optionKey } of this.getParamMappings()) {\n if (optionKey && optionValues[optionKey] !== undefined) {\n ignoredSettings.push(`options.${optionKey}`);\n }\n }\n if (options.stopSequences && options.stopSequences.length > 0) {\n ignoredSettings.push(\"options.stopSequences\");\n }\n\n if (options.tools && options.tools.length > 0) {\n ignoredSettings.push(\"options.tools\");\n }\n if (options.responseFormat) {\n ignoredSettings.push(\"options.responseFormat\");\n }\n if (options.toolChoice) {\n ignoredSettings.push(\"options.toolChoice\");\n }\n\n if (ignoredSettings.length > 0) {\n warnings.push({\n message: `orchestrationConfigRef is set; the following local settings are ignored: ${ignoredSettings.join(\", \")}. The full configuration is managed by the referenced config.`,\n type: \"other\",\n });\n }\n\n return warnings;\n }\n\n /**\n * Resolves the orchestrationConfigRef from provider options or settings.\n * Parsed provider options take priority over settings. An invalid settings reference\n * is ignored with a warning; invalid per-call references fail schema parsing earlier.\n * @param sapOptions - Parsed provider options from commonParts.\n * @param settings - The model settings.\n * @param warnings - Shared warnings sink for degradation signals.\n * @returns The resolved config reference or undefined.\n * @internal\n */\n private resolveConfigRef(\n sapOptions: Record<string, unknown> | undefined,\n settings: OrchestrationModelSettings,\n warnings: SharedV3Warning[],\n ): OrchestrationModelSettings[\"orchestrationConfigRef\"] {\n const configRefCandidate =\n sapOptions?.orchestrationConfigRef ?? settings.orchestrationConfigRef;\n\n if (!configRefCandidate) {\n return undefined;\n }\n\n if (isOrchestrationConfigRef(configRefCandidate)) {\n return configRefCandidate;\n }\n\n warnings.push({\n message:\n \"orchestrationConfigRef is invalid and was ignored; falling back to local module settings.\",\n type: \"other\",\n });\n return undefined;\n }\n\n /**\n * Resolves promptTemplateRef from provider options or settings.\n *\n * Provider options take priority over settings.\n * @param sapOptions - Parsed provider options from commonParts.\n * @param settings - The model settings.\n * @returns The resolved prompt template reference or undefined.\n * @internal\n */\n private resolvePromptTemplateRef(\n sapOptions: Record<string, unknown> | undefined,\n settings: OrchestrationModelSettings,\n ): PromptTemplateRef | undefined {\n const rawTemplateRef = sapOptions?.promptTemplateRef ?? settings.promptTemplateRef;\n\n if (\n rawTemplateRef &&\n typeof rawTemplateRef === \"object\" &&\n (\"id\" in rawTemplateRef || \"name\" in rawTemplateRef)\n ) {\n return rawTemplateRef as PromptTemplateRef;\n }\n\n return undefined;\n }\n\n /**\n * Resolves tools from settings or options with orchestration-specific priority.\n *\n * Orchestration allows tools to be defined in settings (unlike Foundation Models),\n * with options.tools taking priority.\n * @param settings - Model settings.\n * @param options - Call options.\n * @param warnings - Warnings array to populate.\n * @returns Resolved tools or undefined.\n * @internal\n */\n private resolveTools(\n settings: OrchestrationModelSettings,\n options: LanguageModelV3CallOptions,\n warnings: SharedV3Warning[],\n ): ChatCompletionTool[] | undefined {\n const settingsTools = settings.tools;\n const optionsTools = options.tools;\n\n if (settingsTools && settingsTools.length > 0 && optionsTools && optionsTools.length > 0) {\n warnings.push({\n message:\n \"Both settings.tools and call options.tools were provided; preferring call options.tools.\",\n type: \"other\",\n });\n }\n\n // Use settingsTools directly if available and no optionsTools\n // (settingsTools are already in SAP format)\n if (settingsTools && settingsTools.length > 0 && (!optionsTools || optionsTools.length === 0)) {\n return settingsTools;\n }\n\n if (optionsTools && optionsTools.length > 0) {\n const result = convertToolsToSAPFormat<ChatCompletionTool>(optionsTools, {\n parser: parseSAPPartProviderOptions,\n warnings,\n });\n warnings.push(...result.warnings);\n return result.tools;\n }\n\n return undefined;\n }\n}\n","/**\n * `@jerome-benoit/sap-ai-provider/v2` AI SDK 5 (spec V2) entrypoint.\n *\n * Exposes the V2 facades (`LanguageModelV2` / `EmbeddingModelV2` /\n * `ProviderV2`) over the shared V3 core. Also available from the standalone\n * `@jerome-benoit/sap-ai-provider-v2` package. AI SDK 6 can consume these V2\n * interfaces through its compatibility layer; use `v4` with AI SDK 7.\n * @see {@link https://sdk.vercel.ai/} Vercel AI SDK documentation\n */\n\n/**\n * Utility functions for escaping template delimiters (`{{`, `{%`, `{#`) in orchestration content.\n */\nexport {\n escapeOrchestrationPlaceholders,\n unescapeOrchestrationPlaceholders,\n} from \"./convert-to-sap-messages.js\";\n\n/**\n * Embedding model class implementing EmbeddingModelV2 for SAP AI Core.\n * V2 facade over internal implementation.\n */\nexport { SAPAIEmbeddingModelV2 as SAPAIEmbeddingModel } from \"./sap-ai-embedding-model-v2.js\";\n\nexport type { SAPAIEmbeddingModelId } from \"./sap-ai-embedding-model.js\";\n\n/**\n * Custom error classes for Foundation Models API support.\n * - `UnsupportedFeatureError`: Thrown when a feature is used with an incompatible API.\n * - `ApiSwitchError`: Thrown when attempting to switch APIs at invocation time with conflicting settings.\n */\nexport { ApiSwitchError, UnsupportedFeatureError } from \"./sap-ai-error.js\";\n\n/**\n * Language model class implementing LanguageModelV2 for SAP AI Core.\n * V2 facade over internal implementation.\n */\nexport { SAPAILanguageModelV2 as SAPAILanguageModel } from \"./sap-ai-language-model-v2.js\";\n\n/**\n * Provider options for per-call configuration.\n *\n * These schemas and types enable runtime validation of provider options\n * passed via `providerOptions['sap-ai']` in Vercel AI SDK calls.\n */\nexport {\n getProviderName,\n SAP_AI_PROVIDER_NAME,\n sapAIEmbeddingProviderOptions,\n sapAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\n\nexport type {\n SAPAIEmbeddingProviderOptions,\n SAPAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\n\n/**\n * Provider factory function implementing ProviderV2 interface.\n * Creates language and embedding model instances for SAP AI Core.\n */\nexport { createSAPAIProvider, sapai } from \"./sap-ai-provider-v2.js\";\n\nexport type {\n DeploymentConfig,\n SAPAIProviderV2 as SAPAIProvider,\n SAPAIProviderSettings,\n} from \"./sap-ai-provider-v2.js\";\n\n/**\n * Model settings types and model identifier type definitions.\n */\nexport type {\n AzureOpenAiChatExtensionConfiguration,\n CommonModelParams,\n FoundationModelsDefaultSettings,\n FoundationModelsEmbeddingParams,\n FoundationModelsModelParams,\n FoundationModelsModelSettings,\n OrchestrationDefaultSettings,\n OrchestrationModelParams,\n OrchestrationModelSettings,\n OrchestrationStreamOptions,\n PromptTemplateRef,\n PromptTemplateRefByID,\n PromptTemplateRefByScenarioNameVersion,\n PromptTemplateScope,\n ResponseFormat,\n ResponsesDefaultSettings,\n ResponsesModelOptions,\n ResponsesModelSettings,\n SAPAIApiType,\n SAPAIDefaultSettingsConfig,\n SAPAIEmbeddingSettings,\n SAPAIModelId,\n SAPAIModelSettings,\n SAPAISettings,\n} from \"./sap-ai-settings.js\";\n\n/**\n * SAP AI SDK types and utilities.\n *\n * Re-exported for convenience and advanced usage scenarios.\n */\nexport type {\n AssistantChatMessage,\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n ChatMessageContent,\n ChatMessages,\n Citation,\n DeveloperChatMessage,\n DocumentTranslationApplyToSelector,\n FileContent,\n FilteringModule,\n FunctionObject,\n GroundingModule,\n ImageContentUrl,\n LlmModelDetails,\n LlmModelParams,\n MaskingModule,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- Preserve the upstream deprecated public API.\n OrchestrationConfigRef,\n OrchestrationConfigRefById,\n OrchestrationConfigRefByName,\n OrchestrationConfigRefOverride,\n OrchestrationError,\n OrchestrationModuleConfig,\n OrchestrationModuleConfigList,\n PromptTemplatingModule,\n SystemChatMessage,\n ToolChatMessage,\n TranslationApplyToCategory,\n TranslationInputParameters,\n TranslationModule,\n TranslationOutputParameters,\n TranslationTargetLanguage,\n UserChatMessage,\n UserChatMessageContent,\n UserChatMessageContentItem,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Helper functions for building configurations.\n */\nexport {\n buildAzureContentSafetyFilter,\n buildDocumentGroundingConfig,\n buildDpiMaskingProvider,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- Preserve the upstream deprecated public API.\n buildLlamaGuard38BFilter,\n buildTranslationConfig,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Response classes from the SAP AI SDK for orchestration results.\n */\nexport {\n OrchestrationEmbeddingResponse,\n OrchestrationResponse,\n OrchestrationStream,\n OrchestrationStreamChunkResponse,\n OrchestrationStreamResponse,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Validation utilities for API selection and feature compatibility.\n * - `resolveApi`: Resolves API type from provider/model/invocation precedence chain.\n * - `validateSettings`: Validates settings are compatible with the selected API.\n */\nexport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\n/**\n * Package version, injected at build time.\n */\nexport { VERSION } from \"./version.js\";\n\n/** Public contract types keep downstream inferred declarations nameable. */\nexport type {\n JSONArray,\n JSONObject,\n JSONSchema7,\n JSONValue,\n LanguageModelV2ResponseMetadata,\n} from \"@ai-sdk/provider-v2\";\n\n/** The shared core exposes distinct V3 JSON types in provider options and compatible tools. */\nexport type {\n LanguageModelV3CallOptions,\n JSONArray as V3JSONArray,\n JSONObject as V3JSONObject,\n JSONValue as V3JSONValue,\n} from \"@ai-sdk/provider-v3\";\n\n/**\n * SAP AI SDK request configuration type for {@link SAPAIProviderSettings.requestConfig}.\n *\n * Re-exported so consumers do not need a direct dependency on `@sap-ai-sdk/core`.\n * Its shape follows the installed SAP AI SDK version.\n */\nexport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\n\n/**\n * Error handling types and classes for SAP AI Core error responses.\n */\nexport type { OrchestrationErrorResponse } from \"@sap-ai-sdk/orchestration\";\n\n/**\n * Direct access to SAP AI SDK OrchestrationClient.\n *\n * For advanced users who need to use the SAP AI SDK directly.\n */\nexport { OrchestrationClient, OrchestrationEmbeddingClient } from \"@sap-ai-sdk/orchestration\";\n\n/**\n * SAP Cloud SDK destination type for {@link SAPAIProviderSettings.destination}.\n *\n * Re-exported so consumers do not need a direct dependency on\n * `@sap-cloud-sdk/connectivity`. Its shape follows the installed SAP Cloud SDK version.\n */\nexport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n","/** Adapters for the semantic differences between the V3 core and V2 facade. */\n\nimport type {\n LanguageModelV3StreamPart as InternalStreamPart,\n LanguageModelV3Usage as InternalUsage,\n SharedV3Warning as InternalWarning,\n} from \"@ai-sdk/provider\";\nimport type {\n LanguageModelV2CallWarning,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2ProviderMetadata,\n} from \"@ai-sdk/provider-v2\";\n\nimport { UnsupportedFunctionalityError } from \"@ai-sdk/provider\";\n\nimport { mapReadableStream } from \"./map-readable-stream.js\";\n\n/** Stream events supported by the V2 facade. */\nexport type ConvertedV2StreamPart =\n | Exclude<LanguageModelV2StreamPart, { type: \"stream-start\" }>\n | { type: \"stream-start\"; warnings: ConvertedV2Warning[] };\n\n/** V2 warning representation used when adapting V3 feature diagnostics. */\nexport type ConvertedV2Warning = Extract<LanguageModelV2CallWarning, { type: \"other\" }>;\n\n/**\n * Converts V3-only event fields; structurally identical events pass through unchanged.\n * @param internalPart - V3 stream event\n * @returns V2 event.\n * @throws {UnsupportedFunctionalityError} When the event requires tool approval.\n * @internal\n */\nexport function convertStreamPartToV2(internalPart: InternalStreamPart): ConvertedV2StreamPart {\n // V2 has a narrower JSON metadata type; preserve the core payload without cloning.\n const compatiblePart = internalPart as InternalStreamPart & {\n providerMetadata?: SharedV2ProviderMetadata;\n };\n switch (compatiblePart.type) {\n case \"file\": {\n const { providerMetadata: _providerMetadata, ...part } = compatiblePart;\n return part;\n }\n case \"finish\":\n return {\n ...compatiblePart,\n finishReason: compatiblePart.finishReason.unified,\n usage: convertUsageToV2(compatiblePart.usage),\n };\n case \"stream-start\":\n return { ...compatiblePart, warnings: convertWarningsToV2(compatiblePart.warnings) };\n case \"tool-approval-request\":\n throw createV2ToolApprovalError();\n case \"tool-call\": {\n const { dynamic: _dynamic, ...part } = compatiblePart;\n return part;\n }\n case \"tool-input-start\": {\n const { dynamic: _dynamic, title: _title, ...part } = compatiblePart;\n return part;\n }\n case \"tool-result\": {\n const { dynamic: _dynamic, preliminary: _preliminary, ...part } = compatiblePart;\n // Provider execution and dynamic tool classification are independent in V3.\n return { ...part, providerExecuted: true };\n }\n default:\n return compatiblePart;\n }\n}\n\n/**\n * Flattens usage without inventing totals when either component is unknown.\n * @param internalUsage - V3 nested usage\n * @returns V2 usage\n * @internal\n */\nexport function convertUsageToV2(internalUsage: InternalUsage): LanguageModelV2Usage {\n return {\n cachedInputTokens: internalUsage.inputTokens.cacheRead,\n inputTokens: internalUsage.inputTokens.total,\n outputTokens: internalUsage.outputTokens.total,\n reasoningTokens: internalUsage.outputTokens.reasoning,\n totalTokens:\n internalUsage.inputTokens.total !== undefined &&\n internalUsage.outputTokens.total !== undefined\n ? internalUsage.inputTokens.total + internalUsage.outputTokens.total\n : undefined,\n };\n}\n\n/**\n * Converts warnings to V2's descriptive other-warning representation.\n * @param internalWarnings - V3 warnings\n * @returns V2 warnings\n * @internal\n */\nexport function convertWarningsToV2(internalWarnings: InternalWarning[]): ConvertedV2Warning[] {\n return internalWarnings.map(convertWarningToV2);\n}\n\n/**\n * Retains feature and compatibility details absent from the V2 warning union.\n * @param internalWarning - V3 warning\n * @returns V2 warning\n * @internal\n */\nexport function convertWarningToV2(internalWarning: InternalWarning): ConvertedV2Warning {\n if (internalWarning.type === \"other\") return internalWarning;\n const prefix =\n internalWarning.type === \"unsupported\" ? \"Unsupported feature\" : \"Compatibility mode\";\n return {\n message: `${prefix}: ${internalWarning.feature}${internalWarning.details ? `. ${internalWarning.details}` : \"\"}`,\n type: \"other\",\n };\n}\n\n/**\n * Converts an internal stream, preserving backpressure, cancellation and errors.\n * @param internalStream - V3 stream\n * @returns V2 stream\n * @internal\n */\nexport function createV2StreamFromInternal(\n internalStream: ReadableStream<InternalStreamPart>,\n): ReadableStream<ConvertedV2StreamPart> {\n return mapReadableStream(internalStream, convertStreamPartToV2);\n}\n\n/**\n * Identifies a native tool approval that the V2 contract cannot represent.\n * @returns An actionable error for V2 consumers.\n * @internal\n */\nexport function createV2ToolApprovalError(): UnsupportedFunctionalityError {\n return new UnsupportedFunctionalityError({\n functionality:\n \"Tool approvals are unavailable through the V2 provider. Use /v3 with AI SDK 6 or /v4 with AI SDK 7.\",\n });\n}\n","/** Demand-driven stream conversion shared by the public model facades. */\n\n/**\n * Maps source values only when requested, skipping null conversion results.\n * @param source - Stream whose cancellation and errors must be preserved.\n * @param convert - Synchronous conversion; null drops an unsupported event.\n * @returns A stream that does not prefetch source values.\n * @internal\n */\nexport function mapReadableStream<TInput, TOutput>(\n source: ReadableStream<TInput>,\n convert: (value: TInput) => null | TOutput,\n): ReadableStream<TOutput> {\n const reader = source.getReader();\n let cancelled = false;\n\n return new ReadableStream<TOutput>(\n {\n async cancel(reason) {\n cancelled = true;\n try {\n await reader.cancel(reason);\n } finally {\n reader.releaseLock();\n }\n },\n async pull(controller) {\n try {\n for (;;) {\n const next = await reader.read();\n if (cancelled) return;\n if (next.done) {\n reader.releaseLock();\n controller.close();\n return;\n }\n const converted = convert(next.value);\n if (converted !== null) {\n controller.enqueue(converted);\n return;\n }\n }\n } catch (error) {\n if (cancelled) return;\n // Source cleanup must not replace the conversion or upstream failure.\n await reader.cancel(error).catch(() => undefined);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Cancellation can race asynchronous cleanup.\n if (cancelled) return;\n reader.releaseLock();\n controller.error(error);\n }\n },\n },\n { highWaterMark: 0 },\n );\n}\n","/**\n * SAP AI Embedding Model - Vercel AI SDK EmbeddingModelV3 implementation for SAP AI Core.\n *\n * This module provides the embedding model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) to generate vector embeddings.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed | Vercel AI SDK embed()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed-many | Vercel AI SDK embedMany()}\n */\nimport type {\n EmbeddingModelV3,\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\n} from \"@ai-sdk/provider-v3\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\n\nimport type { SAPAIApiType, SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport {\n getProviderName,\n sapAIEmbeddingProviderOptions,\n validateEmbeddingModelParamsSettings,\n} from \"./sap-ai-provider-options.js\";\nimport {\n type EmbeddingModelStrategyConfig,\n getOrCreateEmbeddingModelStrategy,\n} from \"./sap-ai-strategy.js\";\nimport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\nconst DEFAULT_MAX_EMBEDDINGS_PER_CALL = 2048;\nconst maxEmbeddingsPerCallSchema = z.number().int().positive().or(z.literal(Infinity));\n\n/**\n * Model identifier for SAP AI embedding models.\n *\n * Common embedding model IDs include:\n * - `\"text-embedding-3-small\"` - OpenAI small embedding model (recommended)\n * - `\"text-embedding-3-large\"` - OpenAI large embedding model\n *\n * The actual available models depend on your SAP AI Core deployment configuration.\n * @see {@link https://help.sap.com/docs/sap-ai-core | SAP AI Core Documentation}\n */\nexport type SAPAIEmbeddingModelId = string;\n\n/** @internal */\ninterface SAPAIEmbeddingModelConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Core Embedding Model implementing Vercel AI SDK EmbeddingModelV3.\n *\n * This class provides embedding generation capabilities through SAP AI Core,\n * supporting both the Orchestration API and Foundation Models API.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider\";\n * import { embed, embedMany } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const embeddingModel = provider.embedding(\"text-embedding-3-small\");\n *\n * // Single embedding\n * const { embedding } = await embed({\n * model: embeddingModel,\n * value: \"Hello, world!\",\n * });\n *\n * // Multiple embeddings\n * const { embeddings } = await embedMany({\n * model: embeddingModel,\n * values: [\"Hello\", \"World\"],\n * });\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/embeddings | Vercel AI SDK Embeddings}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAIEmbeddingModel implements EmbeddingModelV3 {\n readonly maxEmbeddingsPerCall: number;\n readonly modelId: string;\n readonly provider: string;\n readonly specificationVersion = \"v3\" as const;\n readonly supportsParallelCalls: boolean = true;\n\n private readonly config: SAPAIEmbeddingModelConfig;\n private readonly settings: SAPAIEmbeddingSettings;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(\n modelId: SAPAIEmbeddingModelId,\n settings: SAPAIEmbeddingSettings = {},\n config: SAPAIEmbeddingModelConfig,\n ) {\n if (settings.modelParams) {\n validateEmbeddingModelParamsSettings(settings.modelParams);\n }\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n this.provider = config.provider;\n this.maxEmbeddingsPerCall = maxEmbeddingsPerCallSchema.parse(\n settings.maxEmbeddingsPerCall ?? DEFAULT_MAX_EMBEDDINGS_PER_CALL,\n );\n }\n\n async doEmbed(options: EmbeddingModelV3CallOptions): Promise<EmbeddingModelV3Result> {\n const providerName = getProviderName(this.config.provider);\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAIEmbeddingProviderOptions,\n });\n\n const effectiveApi = resolveApi(this.config.providerApi, this.settings.api, sapOptions?.api);\n\n validateSettings({\n api: effectiveApi,\n embeddingSettings: this.settings,\n invocationSettings: sapOptions ? { api: sapOptions.api } : undefined,\n modelApi: this.settings.api,\n });\n\n const strategy = await getOrCreateEmbeddingModelStrategy(effectiveApi);\n\n const strategyConfig: EmbeddingModelStrategyConfig = {\n deploymentConfig: this.config.deploymentConfig,\n destination: this.config.destination,\n modelId: this.modelId,\n parsedProviderOptions: sapOptions,\n provider: this.config.provider,\n requestConfig: this.config.requestConfig,\n };\n\n // Bridge readonly strategy JSON to the mutable V3 contract without copying.\n return strategy.doEmbed(\n strategyConfig,\n this.settings,\n options,\n this.maxEmbeddingsPerCall,\n ) as Promise<EmbeddingModelV3Result>;\n }\n}\n","/** Strategy pattern infrastructure for SAP AI Core API support. */\nimport type {\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\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 { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type {\n SAPAIEmbeddingProviderOptions,\n SAPAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\nimport type {\n SAPAIApiType,\n SAPAIEmbeddingSettings,\n SAPAIModelSettings,\n} from \"./sap-ai-settings.js\";\n\n/** @internal */\nexport interface EmbeddingModelAPIStrategy {\n doEmbed(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n options: EmbeddingModelV3CallOptions,\n maxEmbeddingsPerCall: number,\n ): Promise<EmbeddingModelV3Result>;\n}\n\n/** @internal */\nexport interface EmbeddingModelStrategyConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly modelId: string;\n readonly parsedProviderOptions?: SAPAIEmbeddingProviderOptions;\n readonly provider: string;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * Strategy interface for language model API implementations.\n * @template TSettings - The model settings type, defaults to SAPAIModelSettings for backward compatibility\n * @internal\n */\nexport interface LanguageModelAPIStrategy<\n TSettings extends SAPAIModelSettings = SAPAIModelSettings,\n> {\n doGenerate(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult>;\n\n doStream(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult>;\n}\n\n/** @internal */\nexport interface LanguageModelStrategyConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly modelId: string;\n readonly parsedProviderOptions?: SAPAILanguageModelProviderOptions;\n readonly provider: string;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/** @internal */\nconst languageModelStrategyCache = new Map<SAPAIApiType, Promise<LanguageModelAPIStrategy>>();\n\n/** @internal */\nconst embeddingModelStrategyCache = new Map<SAPAIApiType, Promise<EmbeddingModelAPIStrategy>>();\n\n/** @internal */\nexport function clearStrategyCaches(): void {\n languageModelStrategyCache.clear();\n embeddingModelStrategyCache.clear();\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Embedding model strategy.\n * @internal\n */\nexport function getOrCreateEmbeddingModelStrategy(\n api: SAPAIApiType,\n): Promise<EmbeddingModelAPIStrategy> {\n const cached = embeddingModelStrategyCache.get(api);\n if (cached) {\n return cached;\n }\n\n // Cache the Promise synchronously before any await to prevent race conditions\n const strategyPromise = createEmbeddingModelStrategy(api);\n embeddingModelStrategyCache.set(api, strategyPromise);\n\n strategyPromise.catch(() => {\n embeddingModelStrategyCache.delete(api);\n });\n\n return strategyPromise;\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Language model strategy.\n * @internal\n */\nexport function getOrCreateLanguageModelStrategy(\n api: SAPAIApiType,\n): Promise<LanguageModelAPIStrategy> {\n const cached = languageModelStrategyCache.get(api);\n if (cached) {\n return cached;\n }\n\n // Cache the Promise synchronously before any await to prevent race conditions\n const strategyPromise = createLanguageModelStrategy(api);\n languageModelStrategyCache.set(api, strategyPromise);\n\n strategyPromise.catch(() => {\n languageModelStrategyCache.delete(api);\n });\n\n return strategyPromise;\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Embedding model strategy.\n */\nasync function createEmbeddingModelStrategy(api: SAPAIApiType): Promise<EmbeddingModelAPIStrategy> {\n if (api === \"responses\") {\n const { UnsupportedFeatureError } = await import(\"./sap-ai-error.js\");\n throw new UnsupportedFeatureError(\"Embeddings\", \"responses\", \"foundation-models\");\n }\n\n if (api === \"foundation-models\") {\n const { AzureOpenAiEmbeddingClient } = await import(\"@sap-ai-sdk/foundation-models\");\n const { FoundationModelsEmbeddingModelStrategy } =\n await import(\"./foundation-models-embedding-model-strategy.js\");\n return new FoundationModelsEmbeddingModelStrategy(AzureOpenAiEmbeddingClient);\n }\n\n const { OrchestrationEmbeddingClient } = await import(\"@sap-ai-sdk/orchestration\");\n const { OrchestrationEmbeddingModelStrategy } =\n await import(\"./orchestration-embedding-model-strategy.js\");\n return new OrchestrationEmbeddingModelStrategy(OrchestrationEmbeddingClient);\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Language model strategy.\n */\nasync function createLanguageModelStrategy(api: SAPAIApiType): Promise<LanguageModelAPIStrategy> {\n if (api === \"responses\") {\n const { ResponsesLanguageModelStrategy } =\n await import(\"./responses-language-model-strategy.js\");\n return new ResponsesLanguageModelStrategy();\n }\n\n if (api === \"foundation-models\") {\n const { AzureOpenAiChatClient } = await import(\"@sap-ai-sdk/foundation-models\");\n const { FoundationModelsLanguageModelStrategy } =\n await import(\"./foundation-models-language-model-strategy.js\");\n return new FoundationModelsLanguageModelStrategy(AzureOpenAiChatClient);\n }\n\n const { OrchestrationClient } = await import(\"@sap-ai-sdk/orchestration\");\n const { OrchestrationLanguageModelStrategy } =\n await import(\"./orchestration-language-model-strategy.js\");\n return new OrchestrationLanguageModelStrategy(OrchestrationClient);\n}\n","/**\n * SAP AI Embedding Model V2 - Vercel AI SDK EmbeddingModelV2 implementation for SAP AI Core.\n *\n * This module provides the embedding model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) to generate vector embeddings.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed | Vercel AI SDK embed()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed-many | Vercel AI SDK embedMany()}\n */\n\nimport type {\n EmbeddingModelV2,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n SharedV2ProviderOptions,\n} from \"@ai-sdk/provider-v2\";\nimport type { EmbeddingModelV3CallOptions as InternalCallOptions } from \"@ai-sdk/provider-v3\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type { SAPAIApiType, SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport { convertWarningsToV2 } from \"./sap-ai-adapters-v3-to-v2.js\";\nimport { SAPAIEmbeddingModel } from \"./sap-ai-embedding-model.js\";\n\n/** @internal */\ninterface SAPAIEmbeddingModelV2Config {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Core Embedding Model implementing Vercel AI SDK EmbeddingModelV2.\n *\n * This class provides embedding generation capabilities through SAP AI Core,\n * supporting both the Orchestration API and Foundation Models API.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider-v2\";\n * import { embed, embedMany } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const embeddingModel = provider.textEmbeddingModel(\"text-embedding-3-small\");\n *\n * // Single embedding\n * const { embedding } = await embed({\n * model: embeddingModel,\n * value: \"Hello, world!\",\n * });\n *\n * // Multiple embeddings\n * const { embeddings } = await embedMany({\n * model: embeddingModel,\n * values: [\"Hello\", \"World\"],\n * });\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/embeddings | Vercel AI SDK Embeddings}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAIEmbeddingModelV2 implements EmbeddingModelV2<string> {\n readonly maxEmbeddingsPerCall: number;\n readonly modelId: string;\n readonly provider: string;\n readonly specificationVersion = \"v2\" as const;\n readonly supportsParallelCalls: boolean = true;\n\n /** @internal */\n private readonly internalModel: SAPAIEmbeddingModel;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(\n modelId: string,\n settings: SAPAIEmbeddingSettings,\n config: SAPAIEmbeddingModelV2Config,\n ) {\n this.internalModel = new SAPAIEmbeddingModel(modelId, settings, config);\n this.provider = this.internalModel.provider;\n this.modelId = this.internalModel.modelId;\n this.maxEmbeddingsPerCall = this.internalModel.maxEmbeddingsPerCall;\n this.supportsParallelCalls = this.internalModel.supportsParallelCalls;\n }\n\n async doEmbed(options: {\n abortSignal?: AbortSignal;\n headers?: Record<string, string | undefined>;\n providerOptions?: SharedV2ProviderOptions;\n values: string[];\n }): Promise<{\n embeddings: number[][];\n providerMetadata?: SharedV2ProviderMetadata;\n response?: {\n body?: unknown;\n headers?: SharedV2Headers;\n };\n usage?: { tokens: number };\n }> {\n // Normalize headers by removing entries with undefined values\n const normalizedHeaders: Record<string, string> | undefined = options.headers\n ? (Object.fromEntries(\n Object.entries(options.headers).filter(([, value]) => value !== undefined),\n ) as Record<string, string>)\n : undefined;\n\n // Map options for the internal model call\n const callOptions: InternalCallOptions = {\n abortSignal: options.abortSignal,\n headers: normalizedHeaders,\n providerOptions: options.providerOptions,\n values: options.values,\n };\n const result = await this.internalModel.doEmbed(callOptions);\n\n // Handle any warnings by logging them (V2 API doesn't support returning warnings)\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (result.warnings && result.warnings.length > 0) {\n const warnings = convertWarningsToV2(result.warnings);\n // Log warnings - convertWarningsToV2 normalizes all warnings to type \"other\" with message\n for (const warning of warnings) {\n console.warn(`[SAP AI Embedding] ${warning.message}`);\n }\n }\n\n // Return result in V2 format\n return {\n embeddings: result.embeddings,\n providerMetadata: result.providerMetadata as SharedV2ProviderMetadata | undefined,\n response: result.response,\n usage: result.usage,\n };\n }\n}\n","/** Normalizes AI SDK 5 prompt media for the shared V3 core. */\nimport type {\n LanguageModelV2Prompt,\n LanguageModelV2ToolResultOutput,\n LanguageModelV2ToolResultPart,\n LanguageModelV3Prompt,\n LanguageModelV3ToolResultOutput,\n LanguageModelV3ToolResultPart,\n} from \"@ai-sdk/provider\";\n\nimport { resolveFullMediaType } from \"@ai-sdk/provider-utils\";\n\ntype V3ToolContentItem = Extract<\n LanguageModelV3ToolResultOutput,\n { type: \"content\" }\n>[\"value\"][number];\n\n/**\n * Converts legacy tool media while preserving other V2 and compatible V3 parts.\n * @param prompt - The V2 prompt or compatible V3 history.\n * @returns Prompt content understood by the V3 strategies.\n * @internal\n */\nexport function normalizeV2PromptToV3(\n prompt: LanguageModelV2Prompt | LanguageModelV3Prompt,\n): LanguageModelV3Prompt {\n return prompt.map((message) => {\n switch (message.role) {\n case \"assistant\":\n return {\n ...message,\n content: message.content.map((part) =>\n part.type === \"tool-result\" ? normalizeToolResultPart(part) : part,\n ),\n };\n case \"tool\":\n return {\n ...message,\n content: message.content.map((part) =>\n part.type === \"tool-result\" ? normalizeToolResultPart(part) : part,\n ),\n };\n default:\n return message;\n }\n });\n}\n\n/**\n * Normalizes media in a tool output without changing scalar or error outputs.\n * @param output - Legacy or compatible tool output.\n * @returns Tool output with V3 media discriminators.\n */\nfunction normalizeToolOutput(\n output: LanguageModelV2ToolResultOutput | LanguageModelV3ToolResultOutput,\n): LanguageModelV3ToolResultOutput {\n if (output.type !== \"content\") return output;\n return {\n ...output,\n value: output.value.map((item): V3ToolContentItem => {\n if (item.type !== \"media\") return item;\n const mediaType = resolveFullMediaType({\n part: {\n data: { data: item.data, type: \"data\" },\n mediaType: item.mediaType.toLowerCase(),\n type: \"file\",\n },\n });\n return {\n ...item,\n mediaType,\n type: mediaType.startsWith(\"image/\") ? \"image-data\" : \"file-data\",\n };\n }),\n };\n}\n\n/**\n * Preserves tool-result metadata while adapting its nested media content.\n * @param part - Legacy or compatible tool result.\n * @returns The tool result understood by the V3 core.\n */\nfunction normalizeToolResultPart(\n part: LanguageModelV2ToolResultPart | LanguageModelV3ToolResultPart,\n): LanguageModelV3ToolResultPart {\n return { ...part, output: normalizeToolOutput(part.output) };\n}\n","/**\n * SAP AI Language Model - Vercel AI SDK LanguageModelV3 implementation for SAP AI Core.\n *\n * This module provides the language model implementation that connects to SAP AI Core\n * services (Orchestration, Foundation Models Chat Completions, or OpenAI Responses)\n * for text generation and streaming.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/generate-text | Vercel AI SDK generateText()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/stream-text | Vercel AI SDK streamText()}\n */\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n} from \"@ai-sdk/provider-v3\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\n\nimport type { SAPAIApiType, SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\n\nimport {\n getProviderName,\n sapAILanguageModelProviderOptions,\n validateModelParamsSettings,\n} from \"./sap-ai-provider-options.js\";\nimport {\n getOrCreateLanguageModelStrategy,\n type LanguageModelAPIStrategy,\n type LanguageModelStrategyConfig,\n} from \"./sap-ai-strategy.js\";\nimport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\n/** @internal */\ninterface SAPAILanguageModelConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Language Model implementing Vercel AI SDK LanguageModelV3.\n *\n * This class provides text generation and streaming through SAP AI Core using\n * Orchestration (with content filtering, grounding, masking, and translation),\n * Foundation Models Chat Completions, or native OpenAI Responses.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider\";\n * import { generateText, streamText } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const model = provider(\"gpt-4.1\");\n *\n * // Non-streaming\n * const { text } = await generateText({\n * model,\n * prompt: \"Hello!\",\n * });\n *\n * // Streaming\n * const result = streamText({\n * model,\n * prompt: \"Tell me a story\",\n * });\n *\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/generating-text | Vercel AI SDK Text Generation}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAILanguageModel implements LanguageModelV3 {\n readonly modelId: SAPAIModelId;\n readonly specificationVersion = \"v3\";\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls(): Record<string, RegExp[]> {\n return {\n \"image/*\": [/^https:\\/\\/.+$/i, /^data:image\\/.*$/],\n };\n }\n\n /** @internal */\n private readonly config: SAPAILanguageModelConfig;\n\n /** @internal */\n private readonly settings: SAPAISettings;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(modelId: SAPAIModelId, settings: SAPAISettings, config: SAPAILanguageModelConfig) {\n if (settings.modelParams) {\n validateModelParamsSettings(settings.modelParams);\n }\n this.settings = settings;\n this.config = config;\n this.modelId = modelId;\n }\n\n async doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult> {\n const { strategy, strategyConfig } = await this.prepareInvocation(options);\n const result = strategy.doGenerate(strategyConfig, this.settings, options);\n // Bridge readonly strategy JSON to the mutable V3 contract without copying.\n return result as Promise<LanguageModelV3GenerateResult>;\n }\n\n async doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult> {\n const { strategy, strategyConfig } = await this.prepareInvocation(options);\n const result = strategy.doStream(strategyConfig, this.settings, options);\n // Preserve the stream itself while exposing AI SDK 6's mutable JSON contract.\n return result as Promise<LanguageModelV3StreamResult>;\n }\n\n supportsUrl(url: URL): boolean {\n if (url.protocol === \"https:\") return true;\n if (url.protocol === \"data:\") {\n return /^data:image\\//i.test(url.href);\n }\n return false;\n }\n\n /**\n * Prepares common invocation context for doGenerate and doStream.\n * @param options - AI SDK call options.\n * @returns Strategy and configuration for the invocation.\n * @internal\n */\n private async prepareInvocation(options: LanguageModelV3CallOptions): Promise<{\n strategy: LanguageModelAPIStrategy;\n strategyConfig: LanguageModelStrategyConfig;\n }> {\n const providerName = getProviderName(this.config.provider);\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAILanguageModelProviderOptions,\n });\n\n const effectiveApi = resolveApi(this.config.providerApi, this.settings.api, sapOptions?.api);\n\n validateSettings({\n api: effectiveApi,\n invocationSettings: sapOptions\n ? {\n api: sapOptions.api,\n dropUnsupportedParams: sapOptions.dropUnsupportedParams,\n escapeTemplatePlaceholders: sapOptions.escapeTemplatePlaceholders,\n orchestrationConfigRef: sapOptions.orchestrationConfigRef,\n placeholderValues: sapOptions.placeholderValues,\n promptTemplateRef: sapOptions.promptTemplateRef,\n responses: sapOptions.responses,\n }\n : undefined,\n modelApi: this.settings.api,\n modelSettings: this.settings,\n });\n\n const strategy = await getOrCreateLanguageModelStrategy(effectiveApi);\n\n const strategyConfig: LanguageModelStrategyConfig = {\n deploymentConfig: this.config.deploymentConfig,\n destination: this.config.destination,\n modelId: this.modelId,\n parsedProviderOptions: sapOptions,\n provider: this.config.provider,\n requestConfig: this.config.requestConfig,\n };\n\n return { strategy, strategyConfig };\n }\n}\n","/**\n * SAP AI Language Model V2 - Vercel AI SDK LanguageModelV2 implementation for SAP AI Core.\n *\n * This module provides the language model implementation that connects to SAP AI Core\n * services (Orchestration, Foundation Models Chat Completions, or OpenAI Responses) for text generation.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/generate-text | Vercel AI SDK generateText()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/stream-text | Vercel AI SDK streamText()}\n */\n\nimport type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV3CallOptions as StrategyLanguageModelCallOptions,\n} from \"@ai-sdk/provider\";\nimport type {\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2ResponseMetadata,\n LanguageModelV2Usage,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n} from \"@ai-sdk/provider-v2\";\nimport type { LanguageModelV3CallOptions } from \"@ai-sdk/provider-v3\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type { ConvertedV2StreamPart, ConvertedV2Warning } from \"./sap-ai-adapters-v3-to-v2.js\";\nimport type { SAPAIApiType, SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\n\nimport { normalizeV2PromptToV3 } from \"./sap-ai-adapters-v2-to-v3.js\";\nimport {\n convertUsageToV2,\n convertWarningsToV2,\n createV2StreamFromInternal,\n createV2ToolApprovalError,\n} from \"./sap-ai-adapters-v3-to-v2.js\";\nimport { SAPAILanguageModel as SAPAILanguageModelInternal } from \"./sap-ai-language-model.js\";\n\n// AI SDK 6.0 shipped V2 tools with the V3 provider-tool discriminator.\ntype CompatibleV2CallOptions = Omit<LanguageModelV2CallOptions, \"tools\"> & {\n tools?: LanguageModelV2CallOptions[\"tools\"] | LanguageModelV3CallOptions[\"tools\"];\n};\n\n/** @internal */\ninterface SAPAILanguageModelV2Config {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Language Model implementing Vercel AI SDK LanguageModelV2.\n *\n * This class provides chat completion and streaming capabilities through SAP AI Core,\n * supporting the Orchestration API (with content filtering, grounding, masking,\n * and translation), Foundation Models Chat Completions, and native OpenAI Responses\n * through SAP AI Core.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider-v2\";\n * import { generateText, streamText } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const model = provider(\"gpt-4.1\");\n *\n * // Non-streaming\n * const { text } = await generateText({\n * model,\n * prompt: \"Hello!\",\n * });\n *\n * // Streaming\n * const result = streamText({\n * model,\n * prompt: \"Tell me a story\",\n * });\n *\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/generating-text | Vercel AI SDK Text Generation}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAILanguageModelV2 implements LanguageModelV2 {\n readonly modelId: SAPAIModelId;\n readonly specificationVersion = \"v2\" as const;\n\n get provider(): string {\n return this.internalModel.provider;\n }\n\n get supportedUrls(): Record<string, RegExp[]> {\n return this.internalModel.supportedUrls;\n }\n\n /** @internal */\n private readonly internalModel: SAPAILanguageModelInternal;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(modelId: SAPAIModelId, settings: SAPAISettings, config: SAPAILanguageModelV2Config) {\n this.modelId = modelId;\n this.internalModel = new SAPAILanguageModelInternal(modelId, settings, config);\n }\n\n async doGenerate(options: CompatibleV2CallOptions): Promise<{\n content: LanguageModelV2Content[];\n finishReason: LanguageModelV2FinishReason;\n providerMetadata?: SharedV2ProviderMetadata;\n request?: {\n body?: unknown;\n };\n response?: LanguageModelV2ResponseMetadata & {\n body?: unknown;\n headers?: SharedV2Headers;\n };\n usage: LanguageModelV2Usage;\n warnings: ConvertedV2Warning[];\n }> {\n const result = await this.internalModel.doGenerate(normalizeCallOptions(options));\n if (result.content.some((part) => part.type === \"tool-approval-request\")) {\n throw createV2ToolApprovalError();\n }\n\n // Return result in V2 format\n return {\n content: result.content as LanguageModelV2Content[],\n finishReason: result.finishReason.unified,\n providerMetadata: result.providerMetadata as SharedV2ProviderMetadata | undefined,\n request: result.request,\n response: result.response,\n usage: convertUsageToV2(result.usage),\n warnings: convertWarningsToV2(result.warnings),\n };\n }\n\n async doStream(options: CompatibleV2CallOptions): Promise<{\n request?: {\n body?: unknown;\n };\n response?: {\n headers?: SharedV2Headers;\n };\n stream: ReadableStream<ConvertedV2StreamPart>;\n }> {\n const result = await this.internalModel.doStream(normalizeCallOptions(options));\n\n return {\n request: result.request,\n response: result.response\n ? {\n headers: result.response.headers,\n }\n : undefined,\n stream: createV2StreamFromInternal(result.stream),\n };\n }\n}\n\n/**\n * Adapts the V2 prompt while retaining existing tool compatibility behavior.\n * @param options - V2 call options.\n * @returns Call options for the shared V3 core.\n */\nfunction normalizeCallOptions(options: CompatibleV2CallOptions): LanguageModelV3CallOptions {\n const normalized: StrategyLanguageModelCallOptions = {\n ...options,\n prompt: normalizeV2PromptToV3(options.prompt),\n // Legacy provider-defined tools keep their unsupported warning/skip behavior.\n tools: options.tools as LanguageModelV3CallOptions[\"tools\"],\n };\n // Prompt normalization preserves JSON values; only the core's mutable JSON type is narrower.\n return normalized as LanguageModelV3CallOptions;\n}\n","import type { ImageModelV2, ProviderV2 } from \"@ai-sdk/provider-v2\";\n\nimport { NoSuchModelError } from \"@ai-sdk/provider\";\nimport { setGlobalLogLevel } from \"@sap-cloud-sdk/util\";\n\nimport type { SAPAIEmbeddingModelId } from \"./sap-ai-embedding-model.js\";\nimport type { DeploymentConfig, SAPAIProviderSettings } from \"./sap-ai-provider.js\";\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport { SAPAIEmbeddingModelV2 } from \"./sap-ai-embedding-model-v2.js\";\nimport { SAPAILanguageModelV2 } from \"./sap-ai-language-model-v2.js\";\nimport { SAP_AI_PROVIDER_NAME, validateModelParamsSettings } from \"./sap-ai-provider-options.js\";\nimport { SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\nimport { mergeSettingsWithApi } from \"./sap-ai-validation.js\";\n\nexport type { DeploymentConfig, SAPAIProviderSettings } from \"./sap-ai-provider.js\";\n\n/** SAP AI Provider interface extending Vercel AI SDK ProviderV2. */\nexport interface SAPAIProviderV2 extends ProviderV2 {\n (modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n chat(modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n /** Always throws - SAP AI Core does not support image generation. */\n imageModel(modelId: string): ImageModelV2;\n languageModel(modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n textEmbeddingModel(\n modelId: SAPAIEmbeddingModelId,\n settings?: SAPAIEmbeddingSettings,\n ): SAPAIEmbeddingModelV2;\n}\n\n/**\n * Creates an SAP AI Provider V2 instance for use with AI SDK 5.\n * AI SDK 6 can also consume this provider through its V2 compatibility layer.\n *\n * Uses SAP AI SDK clients for Orchestration and Foundation Models, and its HTTP\n * transport with the OpenAI provider for Responses. Authentication uses a service\n * binding (VCAP_SERVICES on SAP BTP) or the AICORE_SERVICE_KEY environment variable.\n * @param options - Provider configuration options.\n * @param options.api - Default API type: `'orchestration'` (default), `'foundation-models'`, or `'responses'`.\n * @param options.defaultSettings - Default model settings applied to every model instance.\n * @param options.deploymentId - Explicit SAP AI Core deployment ID; omit for automatic deployment resolution.\n * @param options.destination - Custom SAP Cloud SDK destination configuration.\n * @param options.logLevel - Log level for SAP Cloud SDK loggers (`'debug'`, `'info'`, `'warn'`, `'error'`).\n * @param options.name - Provider name (default: `'sap-ai'`); see {@link SAPAIProviderSettings.name} for namespace rules.\n * @param options.requestConfig - Provider-level custom request configuration. See {@link SAPAIProviderSettings.requestConfig} for scope, portability, and abort semantics.\n * @param options.resourceGroup - SAP AI Core resource group (default: `'default'`); ignored when deploymentId is set.\n * @param options.warnOnAmbiguousConfig - Whether to warn when both deploymentId and resourceGroup are set.\n * @returns A configured SAP AI provider instance that can be used as a callable or via methods.\n * @example\n * // Basic usage with defaults\n * const provider = createSAPAIProvider();\n * const model = provider('gpt-4.1');\n * @example\n * // With custom configuration\n * const provider = createSAPAIProvider({\n * api: 'foundation-models',\n * resourceGroup: 'production',\n * defaultSettings: { modelParams: { temperature: 0.7 } },\n * });\n * @example\n * // Using provider methods\n * const chatModel = provider.chat('gpt-4.1');\n * const embeddingModel = provider.textEmbeddingModel('text-embedding-3-small');\n * @throws {Error} When provider function is called with the `new` keyword.\n * @throws {NoSuchModelError} When `imageModel()` is called (image generation not supported).\n * @see {@link SAPAIProviderSettings} for all configuration options.\n * @see {@link SAPAIProviderV2} for the provider interface.\n */\nexport function createSAPAIProvider(options: SAPAIProviderSettings = {}): SAPAIProviderV2 {\n if (options.defaultSettings?.modelParams) {\n validateModelParamsSettings(options.defaultSettings.modelParams);\n }\n\n const providerName = options.name ?? SAP_AI_PROVIDER_NAME;\n\n const resourceGroup = options.resourceGroup ?? \"default\";\n\n const warnOnAmbiguousConfig = options.warnOnAmbiguousConfig ?? true;\n\n if (warnOnAmbiguousConfig && options.deploymentId && options.resourceGroup) {\n console.warn(\n \"createSAPAIProvider: both 'deploymentId' and 'resourceGroup' were provided; using 'deploymentId' and ignoring 'resourceGroup'.\",\n );\n }\n\n if (typeof process === \"undefined\" || !process.env.SAP_CLOUD_SDK_LOG_LEVEL) {\n const logLevel = options.logLevel ?? \"warn\";\n setGlobalLogLevel(logLevel);\n }\n\n const deploymentConfig: DeploymentConfig = options.deploymentId\n ? { deploymentId: options.deploymentId }\n : { resourceGroup };\n\n // Provider-level API setting (defaults to 'orchestration')\n const providerApi = options.api ?? \"orchestration\";\n\n const createModel = (modelId: SAPAIModelId, settings: SAPAISettings = {}) => {\n const mergedSettings = mergeSettingsWithApi(\n options.defaultSettings as Record<string, unknown> | undefined,\n settings,\n providerApi,\n );\n\n return new SAPAILanguageModelV2(modelId, mergedSettings, {\n deploymentConfig,\n destination: options.destination,\n provider: `${providerName}.chat`,\n providerApi,\n requestConfig: options.requestConfig,\n });\n };\n\n const createEmbeddingModel = (\n modelId: SAPAIEmbeddingModelId,\n settings: SAPAIEmbeddingSettings = {},\n ): SAPAIEmbeddingModelV2 => {\n const mergedSettings = mergeSettingsWithApi(\n options.defaultSettings as Record<string, unknown> | undefined,\n settings,\n providerApi,\n );\n\n return new SAPAIEmbeddingModelV2(modelId, mergedSettings, {\n deploymentConfig,\n destination: options.destination,\n provider: `${providerName}.embedding`,\n providerApi,\n requestConfig: options.requestConfig,\n });\n };\n\n const provider = function (modelId: SAPAIModelId, settings?: SAPAISettings) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (new.target) {\n throw new Error(\"The SAP AI provider function cannot be called with the new keyword.\");\n }\n\n return createModel(modelId, settings);\n };\n\n provider.chat = createModel;\n provider.languageModel = createModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({\n message: `SAP AI Core does not support image generation. Model '${modelId}' is not available.`,\n modelId,\n modelType: \"imageModel\",\n });\n };\n\n return provider;\n}\n\n/** Default SAP AI provider instance with automatic authentication via SAP AI SDK. */\nexport const sapai = createSAPAIProvider();\n","import type { OpenAIResponsesProviderOptions } from \"@ai-sdk/openai\";\nimport type { AzureOpenAiChatCompletionParameters } from \"@sap-ai-sdk/foundation-models\";\nimport type {\n ChatCompletionTool,\n ChatModel,\n FilteringModule,\n GroundingModule,\n MaskingModule,\n OrchestrationConfigRefById,\n OrchestrationConfigRefByName,\n OrchestrationModuleConfig,\n TranslationModule,\n} from \"@sap-ai-sdk/orchestration\";\n\n/** Azure OpenAI chat extension configuration for \"On Your Data\" RAG scenarios. */\nexport type AzureOpenAiChatExtensionConfiguration = NonNullable<\n AzureOpenAiChatCompletionParameters[\"data_sources\"]\n>[number];\n\n/**\n * Common model parameters shared between APIs.\n *\n * Known parameters are validated by Zod in constructor settings and per-call\n * `modelParams` provider options; additional model-specific keys are passed through.\n */\nexport interface CommonModelParams {\n /**\n * Frequency penalty to reduce repetition of token sequences.\n * Range: -2.0 to 2.0\n */\n readonly frequencyPenalty?: number;\n /**\n * Maximum number of tokens to generate.\n * Range: Positive integer\n */\n readonly maxTokens?: number;\n /**\n * Number of completions to generate.\n * Availability depends on the selected SAP API and model; no model-family filtering is applied.\n * Range: Positive integer\n */\n readonly n?: number;\n /** Whether to enable parallel tool calls when multiple tools are available. */\n readonly parallel_tool_calls?: boolean;\n /**\n * Presence penalty to encourage talking about new topics.\n * Range: -2.0 to 2.0\n */\n readonly presencePenalty?: number;\n /** Index signature for additional model-specific parameters. */\n readonly [key: string]: unknown;\n /**\n * Sampling temperature controlling randomness.\n * Higher values (e.g., 1.0) make output more random, lower values (e.g., 0.2) more deterministic.\n * Range: 0 to 2\n */\n readonly temperature?: number;\n /**\n * Nucleus sampling parameter. Only tokens with cumulative probability up to `topP` are considered.\n * Range: 0 to 1\n */\n readonly topP?: number;\n}\n\n/** Default settings configuration when using Foundation Models API. */\nexport interface FoundationModelsDefaultSettings {\n readonly api: \"foundation-models\";\n readonly settings?: FoundationModelsModelSettings;\n}\n\n/** Model parameters for Foundation Models Embedding API. */\nexport interface FoundationModelsEmbeddingParams {\n readonly dimensions?: number;\n readonly encoding_format?: \"base64\" | \"float\";\n readonly user?: string;\n}\n\n/** Model parameters for Foundation Models API with Azure OpenAI-specific extensions. */\nexport interface FoundationModelsModelParams extends CommonModelParams {\n readonly logit_bias?: AzureOpenAiChatCompletionParameters[\"logit_bias\"];\n readonly logprobs?: AzureOpenAiChatCompletionParameters[\"logprobs\"];\n readonly seed?: AzureOpenAiChatCompletionParameters[\"seed\"];\n readonly stop?: AzureOpenAiChatCompletionParameters[\"stop\"];\n /** Requires logprobs=true. */\n readonly top_logprobs?: AzureOpenAiChatCompletionParameters[\"top_logprobs\"];\n readonly user?: AzureOpenAiChatCompletionParameters[\"user\"];\n}\n\n/** Model settings when using Foundation Models API. */\nexport interface FoundationModelsModelSettings {\n readonly api: \"foundation-models\";\n /** Azure OpenAI \"On Your Data\" configuration for RAG scenarios. */\n readonly dataSources?: AzureOpenAiChatExtensionConfiguration[];\n /**\n * Forward assistant reasoning from the input history as text; does not enable reasoning output.\n * @default false\n */\n readonly includeReasoning?: boolean;\n readonly modelParams?: FoundationModelsModelParams;\n readonly modelVersion?: string;\n readonly responseFormat?: ResponseFormat;\n}\n\n/** Default settings configuration when using Orchestration API. */\nexport interface OrchestrationDefaultSettings {\n readonly api?: \"orchestration\";\n readonly settings?: OrchestrationModelSettings;\n}\n\n/** Model parameters for Orchestration API. */\nexport type OrchestrationModelParams = CommonModelParams;\n\n/** Model settings when using Orchestration API with filtering, grounding, masking, and translation. */\nexport interface OrchestrationModelSettings {\n readonly api?: \"orchestration\";\n /**\n * Whether Orchestration drops parameters unsupported by Responses-only models.\n * Applies to the primary local model, not fallback models or stored configurations.\n * Omitted values retain the SAP service default; false requests an explicit error.\n */\n readonly dropUnsupportedParams?: boolean;\n /** @default true */\n readonly escapeTemplatePlaceholders?: boolean;\n /**\n * Additional module configurations for prompt module fallback.\n * These entries follow the primary configuration in the list passed to the SAP SDK.\n * Each entry is a full `OrchestrationModuleConfig` with its own model, prompt, and modules.\n * @example\n * ```ts\n * fallbackModuleConfigs: [\n * {\n * promptTemplating: {\n * model: { name: \"gpt-4.1-mini\" },\n * prompt: { template: [] },\n * },\n * },\n * ]\n * ```\n */\n readonly fallbackModuleConfigs?: OrchestrationModuleConfig[];\n readonly filtering?: FilteringModule;\n readonly grounding?: GroundingModule;\n /**\n * Forward assistant reasoning from the input history as text; does not enable reasoning output.\n * @default false\n */\n readonly includeReasoning?: boolean;\n readonly masking?: MaskingModule | { providers: MaskingModule[\"masking_providers\"] };\n readonly modelParams?: OrchestrationModelParams;\n readonly modelVersion?: string;\n /**\n * Reference to a complete orchestration configuration stored in SAP AI Core Prompt Registry.\n * When provided, local module settings (filtering, masking, grounding, translation, tools,\n * promptTemplateRef, responseFormat) are ignored as the full configuration is managed\n * by the referenced config. The reference, including its explicit `overrideConfig`,\n * is passed to the SAP SDK; messages and `placeholderValues` remain request inputs.\n * @example { id: \"f47ac10b-58cc-4372-a567-0e02b2c3d479\" }\n * @example { scenario: \"customer-support\", name: \"prod-config\", version: \"1.0.0\" }\n */\n readonly orchestrationConfigRef?: OrchestrationConfigRefById | OrchestrationConfigRefByName;\n readonly placeholderValues?: Record<string, string>;\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: ResponseFormat;\n /**\n * Options for streaming behavior with locally configured post-LLM modules.\n * Includes direct `doStream()` calls; ignored when `orchestrationConfigRef` is used.\n */\n readonly streamOptions?: OrchestrationStreamOptions;\n readonly tools?: ChatCompletionTool[];\n readonly translation?: TranslationModule;\n}\n\n/**\n * Stream options for orchestration post-LLM module processing.\n * Controls chunking behavior for translation, filtering, and other modules during streaming.\n * Ignored with `orchestrationConfigRef`; configure streaming in the stored\n * configuration or its `overrideConfig` instead.\n */\nexport interface OrchestrationStreamOptions {\n /**\n * Minimum number of characters per chunk for post-LLM modules.\n * Valid range: 1-10000. Defaults to 100.\n */\n readonly chunkSize?: number;\n /**\n * Delimiters for splitting stream into chunks (e.g., sentence boundaries).\n * Recommended for translation; the provider warns when local translation settings lack them.\n * @example [\"\\n\", \".\", \"?\", \"!\"]\n */\n readonly delimiters?: readonly string[];\n /**\n * Additional characters from previous chunks sent to output filtering for context.\n * Valid range: 0-10000.\n */\n readonly outputFilteringOverlap?: number;\n}\n\n/** Reference to a template in SAP AI Core's Prompt Registry. */\nexport type PromptTemplateRef = PromptTemplateRefByID | PromptTemplateRefByScenarioNameVersion;\n\n/** Reference to a Prompt Registry template by ID. */\nexport interface PromptTemplateRefByID {\n readonly id: string;\n readonly scope?: PromptTemplateScope;\n}\n\n/** Reference to a Prompt Registry template by scenario, name, and version. */\nexport interface PromptTemplateRefByScenarioNameVersion {\n readonly name: string;\n readonly scenario: string;\n readonly scope?: PromptTemplateScope;\n readonly version: string;\n}\n\n/** Scope for Prompt Registry templates: 'tenant' (default) or 'resource_group'. */\nexport type PromptTemplateScope = \"resource_group\" | \"tenant\";\n\n/** Response format for structured output (OpenAI-compatible). */\nexport type ResponseFormat = AzureOpenAiChatCompletionParameters[\"response_format\"];\n\n/** Default settings configuration when using the Responses API. */\nexport interface ResponsesDefaultSettings {\n readonly api: \"responses\";\n readonly settings?: ResponsesModelSettings;\n}\n\n/** Model-specific Responses API options, validated by the OpenAI provider. */\nexport type ResponsesModelOptions = Omit<OpenAIResponsesProviderOptions, \"metadata\"> & {\n readonly metadata?: null | Record<string, string>;\n};\n\n/** Model settings for the OpenAI Responses API through SAP AI Core. */\nexport interface ResponsesModelSettings {\n readonly api: \"responses\";\n readonly modelParams?: CommonModelParams;\n readonly modelVersion?: string;\n readonly responseFormat?: ResponseFormat;\n readonly responses?: ResponsesModelOptions;\n}\n\n/**\n * Supported API types for SAP AI Core.\n *\n * - `'orchestration'` - Full-featured API with data masking, content filtering, document grounding, and translation.\n * - `'foundation-models'` - Direct model access with Azure OpenAI-specific parameters like `logprobs`, `seed`, and `dataSources`.\n * - `'responses'` - OpenAI Responses API with native reasoning and tool-call history.\n */\nexport type SAPAIApiType = \"foundation-models\" | \"orchestration\" | \"responses\";\n\n/** Union type for API-specific default settings configuration. */\nexport type SAPAIDefaultSettingsConfig =\n FoundationModelsDefaultSettings | OrchestrationDefaultSettings | ResponsesDefaultSettings;\n\n/** Settings for the SAP AI Embedding Model. */\nexport interface SAPAIEmbeddingSettings {\n readonly api?: SAPAIApiType;\n /** Orchestration API only. */\n readonly masking?: MaskingModule | { providers: MaskingModule[\"masking_providers\"] };\n /**\n * Maximum batch size: a positive integer, or `Infinity` for no provider-side limit.\n * @default 2048\n */\n readonly maxEmbeddingsPerCall?: number;\n readonly modelParams?: FoundationModelsEmbeddingParams | Record<string, unknown>;\n readonly modelVersion?: string;\n readonly [key: string]: unknown;\n /**\n * Orchestration embedding input type; ignored by Foundation Models.\n * @default 'text'\n */\n readonly type?: \"document\" | \"query\" | \"text\";\n}\n\n/**\n * Supported model IDs in SAP AI Core.\n *\n * Model availability depends on tenant configuration and region.\n * Common values include: `'gpt-4.1'`, `'gpt-4.1-mini'`, `'anthropic--claude-4.5-sonnet'`, `'gemini-2.5-pro'`.\n * @see {@link https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/models-and-scenarios-in-generative-ai-hub | SAP AI Core Models}\n */\nexport type SAPAIModelId = ChatModel;\n\n/**\n * Union type for API-specific model settings.\n *\n * Use `FoundationModelsModelSettings` for Foundation Models API features (dataSources, logprobs, seed).\n * Use `OrchestrationModelSettings` for Orchestration API features (filtering, grounding, masking, translation).\n * Use `ResponsesModelSettings` for native OpenAI Responses options and reasoning history.\n */\nexport type SAPAIModelSettings =\n FoundationModelsModelSettings | OrchestrationModelSettings | ResponsesModelSettings;\n\n/** Re-exported SAP AI SDK orchestration types. */\nexport type {\n FilteringModule,\n GroundingModule,\n MaskingModule,\n TranslationModule,\n} from \"@sap-ai-sdk/orchestration\";\n\nexport {\n buildAzureContentSafetyFilter,\n buildDocumentGroundingConfig,\n buildDpiMaskingProvider,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- Preserve the upstream deprecated public API.\n buildLlamaGuard38BFilter,\n buildTranslationConfig,\n} from \"@sap-ai-sdk/orchestration\";\n\n/**\n * Settings for configuring SAP AI Core model behavior.\n * Legacy interface maintained for backward compatibility. Prefer the API-specific\n * OrchestrationModelSettings, FoundationModelsModelSettings, or ResponsesModelSettings types.\n */\nexport interface SAPAISettings {\n readonly api?: SAPAIApiType;\n /** Orchestration API only; controls unsupported parameters on the primary local model. */\n readonly dropUnsupportedParams?: boolean;\n /** @default true */\n readonly escapeTemplatePlaceholders?: boolean;\n /** Orchestration API only. */\n readonly fallbackModuleConfigs?: OrchestrationModuleConfig[];\n /** Orchestration API only. */\n readonly filtering?: FilteringModule;\n /** Orchestration API only. */\n readonly grounding?: GroundingModule;\n /**\n * Forward assistant reasoning from the input history as text; does not enable reasoning output.\n * @default false\n */\n readonly includeReasoning?: boolean;\n /** Orchestration API only. */\n readonly masking?: MaskingModule | { providers: MaskingModule[\"masking_providers\"] };\n readonly modelParams?: CommonModelParams;\n readonly modelVersion?: string;\n /** Orchestration API only. */\n readonly orchestrationConfigRef?: OrchestrationConfigRefById | OrchestrationConfigRefByName;\n /** Orchestration API only. */\n readonly placeholderValues?: Record<string, string>;\n /** Orchestration API only. */\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: ResponseFormat;\n /** Responses API only. */\n readonly responses?: ResponsesModelOptions;\n /** Orchestration API only; ignored when `orchestrationConfigRef` is used. */\n readonly streamOptions?: OrchestrationStreamOptions;\n /** Orchestration API only. */\n readonly tools?: ChatCompletionTool[];\n /** Orchestration API only. */\n readonly translation?: TranslationModule;\n}\n\nexport type {\n AssistantChatMessage,\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n ChatMessageContent,\n ChatMessages,\n Citation,\n DeveloperChatMessage,\n DocumentTranslationApplyToSelector,\n FileContent,\n FunctionObject,\n ImageContentUrl,\n LlmModelDetails,\n LlmModelParams,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- Preserve the upstream deprecated public API.\n OrchestrationConfigRef,\n OrchestrationConfigRefById,\n OrchestrationConfigRefByName,\n OrchestrationConfigRefOverride,\n OrchestrationError,\n OrchestrationModuleConfig,\n OrchestrationModuleConfigList,\n PromptTemplatingModule,\n SystemChatMessage,\n ToolChatMessage,\n TranslationApplyToCategory,\n TranslationInputParameters,\n TranslationOutputParameters,\n TranslationTargetLanguage,\n UserChatMessage,\n UserChatMessageContent,\n UserChatMessageContentItem,\n} from \"@sap-ai-sdk/orchestration\";\n\nexport {\n OrchestrationEmbeddingResponse,\n OrchestrationResponse,\n OrchestrationStream,\n OrchestrationStreamChunkResponse,\n OrchestrationStreamResponse,\n} from \"@sap-ai-sdk/orchestration\";\n"],"mappings":"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","names":["message","import_provider","import_zod","import_provider","import_provider","import_provider_utils","import_provider","import_provider","import_util","dispose","request","import_provider","import_internal","import_provider","import_zod","convertToAISDKError","responseMetadata","responseMetadata","responseMetadata","responseMetadata","import_provider","import_provider_utils","import_zod","UnsupportedFeatureError","FoundationModelsEmbeddingModelStrategy","OrchestrationEmbeddingClient","OrchestrationEmbeddingModelStrategy","ResponsesLanguageModelStrategy","FoundationModelsLanguageModelStrategy","OrchestrationClient","OrchestrationLanguageModelStrategy","import_provider_utils","import_provider_utils","import_provider","import_util","import_orchestration","import_orchestration"]}
|