@jerome-benoit/sap-ai-provider 4.6.1 → 4.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/dist/{chunk-IAXILSPQ.js → chunk-7HX5A5XW.js} +4 -4
  2. package/dist/{chunk-DQXZH6CW.js → chunk-IIBSUXGT.js} +3 -2
  3. package/dist/chunk-IIBSUXGT.js.map +1 -0
  4. package/dist/{chunk-HJZCRF7J.js → chunk-M6USM33F.js} +3 -3
  5. package/dist/{chunk-I5ZTK7M5.js → chunk-TE3CYVU3.js} +2 -2
  6. package/dist/{chunk-U2HDUNO7.js → chunk-WO5UACI5.js} +2 -2
  7. package/dist/chunk-WO5UACI5.js.map +1 -0
  8. package/dist/{foundation-models-embedding-model-strategy-C4SXGZ66.js → foundation-models-embedding-model-strategy-A6CA7NXP.js} +4 -4
  9. package/dist/{foundation-models-language-model-strategy-3D4V6PSZ.js → foundation-models-language-model-strategy-DZMPSOJK.js} +5 -5
  10. package/dist/index.cjs +3 -2
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.js +6 -6
  13. package/dist/{orchestration-embedding-model-strategy-7FY6NJD7.js → orchestration-embedding-model-strategy-M3POCUFM.js} +4 -4
  14. package/dist/{orchestration-language-model-strategy-FI5HLHWP.js → orchestration-language-model-strategy-Q3LPRWX5.js} +5 -5
  15. package/package.json +1 -1
  16. package/dist/chunk-DQXZH6CW.js.map +0 -1
  17. package/dist/chunk-U2HDUNO7.js.map +0 -1
  18. /package/dist/{chunk-IAXILSPQ.js.map → chunk-7HX5A5XW.js.map} +0 -0
  19. /package/dist/{chunk-HJZCRF7J.js.map → chunk-M6USM33F.js.map} +0 -0
  20. /package/dist/{chunk-I5ZTK7M5.js.map → chunk-TE3CYVU3.js.map} +0 -0
  21. /package/dist/{foundation-models-embedding-model-strategy-C4SXGZ66.js.map → foundation-models-embedding-model-strategy-A6CA7NXP.js.map} +0 -0
  22. /package/dist/{foundation-models-language-model-strategy-3D4V6PSZ.js.map → foundation-models-language-model-strategy-DZMPSOJK.js.map} +0 -0
  23. /package/dist/{orchestration-embedding-model-strategy-7FY6NJD7.js.map → orchestration-embedding-model-strategy-M3POCUFM.js.map} +0 -0
  24. /package/dist/{orchestration-language-model-strategy-FI5HLHWP.js.map → orchestration-language-model-strategy-Q3LPRWX5.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
2
2
  import {
3
3
  convertToSAPMessages
4
- } from "./chunk-DQXZH6CW.js";
4
+ } from "./chunk-IIBSUXGT.js";
5
5
  import {
6
6
  StreamIdGenerator,
7
7
  buildGenerateResult,
@@ -9,14 +9,14 @@ import {
9
9
  createAISDKRequestBodySummary,
10
10
  createStreamTransformer,
11
11
  mapToolChoice
12
- } from "./chunk-U2HDUNO7.js";
12
+ } from "./chunk-WO5UACI5.js";
13
13
  import {
14
14
  VERSION,
15
15
  convertToAISDKError,
16
16
  getProviderName,
17
17
  normalizeHeaders,
18
18
  sapAILanguageModelProviderOptions
19
- } from "./chunk-I5ZTK7M5.js";
19
+ } from "./chunk-TE3CYVU3.js";
20
20
 
21
21
  // src/base-language-model-strategy.ts
22
22
  import { parseProviderOptions } from "@ai-sdk/provider-utils";
@@ -187,4 +187,4 @@ var BaseLanguageModelStrategy = class {
187
187
  export {
188
188
  BaseLanguageModelStrategy
189
189
  };
190
- //# sourceMappingURL=chunk-IAXILSPQ.js.map
190
+ //# sourceMappingURL=chunk-7HX5A5XW.js.map
@@ -120,7 +120,8 @@ function convertToSAPMessages(prompt, options = {}) {
120
120
  } else {
121
121
  contentParts.push({
122
122
  file: {
123
- file_data: fileDataUrl
123
+ file_data: fileDataUrl,
124
+ ...part.filename ? { filename: part.filename } : {}
124
125
  },
125
126
  type: "file"
126
127
  });
@@ -201,4 +202,4 @@ export {
201
202
  escapeOrchestrationPlaceholders,
202
203
  unescapeOrchestrationPlaceholders
203
204
  };
204
- //# sourceMappingURL=chunk-DQXZH6CW.js.map
205
+ //# sourceMappingURL=chunk-IIBSUXGT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/convert-to-sap-messages.ts"],"sourcesContent":["import type {\n AssistantChatMessage,\n ChatMessage,\n SystemChatMessage,\n ToolChatMessage,\n UserChatMessage,\n} from \"@sap-ai-sdk/orchestration\";\n\nimport {\n InvalidPromptError,\n LanguageModelV3Prompt,\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\";\nimport { Buffer } from \"node:buffer\";\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\n/**\n * @internal\n */\nconst ZERO_WIDTH_SPACE = \"\\u200B\";\n\n/**\n * Safely serializes a value to JSON string, handling edge cases that would cause JSON.stringify to throw.\n *\n * Handles:\n * - Circular references (objects that reference themselves)\n * - BigInt values (converted to string representation)\n * - Undefined values and symbols (handled by JSON.stringify's default behavior)\n * @param value - The value to serialize.\n * @returns JSON string representation, or a fallback string representation if serialization fails.\n * @internal\n */\nfunction safeJsonStringify(value: unknown): string {\n try {\n return JSON.stringify(value, (_key, val) =>\n typeof val === \"bigint\" ? val.toString() : (val as unknown),\n );\n } catch {\n return String(value);\n }\n}\n\n/**\n * @internal\n */\nconst JINJA2_DELIMITERS_PATTERN = /\\{(?=[{%#])/g;\n\n/**\n * @internal\n */\nconst JINJA2_DELIMITERS_ESCAPED_PATTERN = new RegExp(`\\\\{${ZERO_WIDTH_SPACE}([{%#])`, \"g\");\n\n/**\n * @internal\n */\ninterface UserContentItem {\n readonly file?: {\n readonly file_data: string;\n readonly filename?: string;\n };\n readonly image_url?: {\n readonly url: string;\n };\n readonly text?: string;\n readonly type: \"file\" | \"image_url\" | \"text\";\n}\n\n/**\n * Converts Vercel AI SDK prompt to SAP AI SDK ChatMessage array.\n *\n * Handles all Vercel AI SDK message types:\n * - `system` → `SystemChatMessage`\n * - `user` (text/images) → `UserChatMessage`\n * - `assistant` (text/tool-calls) → `AssistantChatMessage`\n * - `tool` (tool results) → `ToolChatMessage`\n * @param prompt - The Vercel AI SDK LanguageModelV3Prompt to convert.\n * @param options - Conversion options.\n * @param options.escapeTemplatePlaceholders - Whether to escape Jinja2 template delimiters (default: true).\n * @param options.includeReasoning - Whether to include assistant reasoning parts (default: false).\n * @returns SAP AI SDK ChatMessage array ready for orchestration requests.\n * @throws {UnsupportedFunctionalityError} When encountering unsupported content types or file formats.\n * @throws {InvalidPromptError} When encountering unsupported message roles.\n */\nexport function convertToSAPMessages(\n prompt: LanguageModelV3Prompt,\n options: ConvertToSAPMessagesOptions = {},\n): ChatMessage[] {\n const messages: ChatMessage[] = [];\n const includeReasoning = options.includeReasoning ?? false;\n const escapeTemplatePlaceholders = options.escapeTemplatePlaceholders ?? true;\n\n const maybeEscape = (text: string): string =>\n escapeTemplatePlaceholders ? escapeOrchestrationPlaceholders(text) : text;\n\n for (const message of prompt) {\n switch (message.role) {\n case \"assistant\": {\n let text = \"\";\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 \"reasoning\": {\n if (includeReasoning && part.text) {\n text += `<think>${maybeEscape(part.text)}</think>`;\n }\n break;\n }\n case \"text\": {\n text += maybeEscape(part.text);\n break;\n }\n case \"tool-call\": {\n // Normalize tool call input to JSON string (Vercel AI SDK provides strings or objects)\n let argumentsJson: string;\n if (typeof part.input === \"string\") {\n argumentsJson = part.input;\n } else {\n argumentsJson = JSON.stringify(part.input);\n }\n\n // Escape tool call arguments if needed (they may contain placeholder syntax)\n toolCalls.push({\n function: {\n arguments: maybeEscape(argumentsJson),\n name: part.toolName,\n },\n id: part.toolCallId,\n type: \"function\",\n });\n break;\n }\n }\n }\n\n if (text || toolCalls.length > 0) {\n const assistantMessage: AssistantChatMessage = {\n content: 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 systemMessage: SystemChatMessage = {\n content: maybeEscape(message.content),\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 serializedOutput = safeJsonStringify(part.output);\n const toolMessage: ToolChatMessage = {\n content: maybeEscape(serializedOutput),\n role: \"tool\",\n tool_call_id: part.toolCallId,\n };\n messages.push(toolMessage);\n }\n }\n break;\n }\n\n case \"user\": {\n const contentParts: UserContentItem[] = [];\n\n for (const part of message.content) {\n switch (part.type) {\n case \"file\": {\n const fileDataUrl = buildDataUrl(part);\n\n if (part.mediaType.startsWith(\"image/\")) {\n const supportedFormats = [\n \"image/png\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/gif\",\n \"image/webp\",\n ];\n if (!supportedFormats.includes(part.mediaType.toLowerCase())) {\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 image_url: {\n url: fileDataUrl,\n },\n type: \"image_url\",\n });\n } else {\n contentParts.push({\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 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 && firstPart?.type === \"text\"\n ? {\n content: firstPart.text ?? \"\",\n role: \"user\",\n }\n : {\n content: contentParts as UserChatMessage[\"content\"],\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 *\n * Useful for processing model responses that may contain escaped delimiters.\n * @param text - The text to unescape.\n * @returns The unescaped text with zero-width spaces removed.\n * @see {@link escapeOrchestrationPlaceholders} for the escaping operation.\n */\nexport function unescapeOrchestrationPlaceholders(text: string): string {\n if (!text) return text;\n return text.replaceAll(JINJA2_DELIMITERS_ESCAPED_PATTERN, \"{$1\");\n}\n\n/**\n * Builds a data URL from a file part's data and media type.\n *\n * Supports URL, base64 string, Uint8Array, Buffer, and buffer-like objects.\n * @internal\n * @param part - The file part containing data and mediaType.\n * @param part.data - The file data as URL, base64 string, or Uint8Array.\n * @param part.mediaType - The MIME type of the file.\n * @returns The data URL string.\n * @throws {UnsupportedFunctionalityError} If the data type is not supported.\n */\nfunction buildDataUrl(part: { data: string | Uint8Array | URL; mediaType: string }): string {\n if (part.data instanceof URL) {\n return part.data.toString();\n }\n\n if (typeof part.data === \"string\") {\n return `data:${part.mediaType};base64,${part.data}`;\n }\n\n if (part.data instanceof Uint8Array) {\n const base64Data = Buffer.from(part.data).toString(\"base64\");\n return `data:${part.mediaType};base64,${base64Data}`;\n }\n\n if (Buffer.isBuffer(part.data)) {\n const base64Data = Buffer.from(part.data).toString(\"base64\");\n return `data:${part.mediaType};base64,${base64Data}`;\n }\n\n const maybeBufferLike = part.data as unknown;\n\n if (\n maybeBufferLike !== null &&\n typeof maybeBufferLike === \"object\" &&\n \"toString\" in (maybeBufferLike as Record<string, unknown>)\n ) {\n const base64Data = (\n maybeBufferLike as {\n toString: (encoding?: string) => string;\n }\n ).toString(\"base64\");\n return `data:${part.mediaType};base64,${base64Data}`;\n }\n\n throw new UnsupportedFunctionalityError({\n functionality: \"Unsupported file data type. Expected URL, base64 string, or Uint8Array.\",\n });\n}\n"],"mappings":";;;AAQA;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AACP,SAAS,cAAc;AAuBvB,IAAM,mBAAmB;AAazB,SAAS,kBAAkB,OAAwB;AACjD,MAAI;AACF,WAAO,KAAK;AAAA,MAAU;AAAA,MAAO,CAAC,MAAM,QAClC,OAAO,QAAQ,WAAW,IAAI,SAAS,IAAK;AAAA,IAC9C;AAAA,EACF,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAKA,IAAM,4BAA4B;AAKlC,IAAM,oCAAoC,IAAI,OAAO,MAAM,gBAAgB,WAAW,GAAG;AAiClF,SAAS,qBACd,QACA,UAAuC,CAAC,GACzB;AACf,QAAM,WAA0B,CAAC;AACjC,QAAM,mBAAmB,QAAQ,oBAAoB;AACrD,QAAM,6BAA6B,QAAQ,8BAA8B;AAEzE,QAAM,cAAc,CAAC,SACnB,6BAA6B,gCAAgC,IAAI,IAAI;AAEvE,aAAW,WAAW,QAAQ;AAC5B,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK,aAAa;AAChB,YAAI,OAAO;AACX,cAAM,YAIA,CAAC;AAEP,mBAAW,QAAQ,QAAQ,SAAS;AAClC,kBAAQ,KAAK,MAAM;AAAA,YACjB,KAAK,aAAa;AAChB,kBAAI,oBAAoB,KAAK,MAAM;AACjC,wBAAQ,UAAU,YAAY,KAAK,IAAI,CAAC;AAAA,cAC1C;AACA;AAAA,YACF;AAAA,YACA,KAAK,QAAQ;AACX,sBAAQ,YAAY,KAAK,IAAI;AAC7B;AAAA,YACF;AAAA,YACA,KAAK,aAAa;AAEhB,kBAAI;AACJ,kBAAI,OAAO,KAAK,UAAU,UAAU;AAClC,gCAAgB,KAAK;AAAA,cACvB,OAAO;AACL,gCAAgB,KAAK,UAAU,KAAK,KAAK;AAAA,cAC3C;AAGA,wBAAU,KAAK;AAAA,gBACb,UAAU;AAAA,kBACR,WAAW,YAAY,aAAa;AAAA,kBACpC,MAAM,KAAK;AAAA,gBACb;AAAA,gBACA,IAAI,KAAK;AAAA,gBACT,MAAM;AAAA,cACR,CAAC;AACD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,QAAQ,UAAU,SAAS,GAAG;AAChC,gBAAM,mBAAyC;AAAA,YAC7C,SAAS;AAAA,YACT,MAAM;AAAA,YACN,YAAY,UAAU,SAAS,IAAI,YAAY;AAAA,UACjD;AACA,mBAAS,KAAK,gBAAgB;AAAA,QAChC;AACA;AAAA,MACF;AAAA,MAEA,KAAK,UAAU;AACb,cAAM,gBAAmC;AAAA,UACvC,SAAS,YAAY,QAAQ,OAAO;AAAA,UACpC,MAAM;AAAA,QACR;AACA,iBAAS,KAAK,aAAa;AAC3B;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,mBAAW,QAAQ,QAAQ,SAAS;AAClC,cAAI,KAAK,SAAS,eAAe;AAC/B,kBAAM,mBAAmB,kBAAkB,KAAK,MAAM;AACtD,kBAAM,cAA+B;AAAA,cACnC,SAAS,YAAY,gBAAgB;AAAA,cACrC,MAAM;AAAA,cACN,cAAc,KAAK;AAAA,YACrB;AACA,qBAAS,KAAK,WAAW;AAAA,UAC3B;AAAA,QACF;AACA;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,cAAM,eAAkC,CAAC;AAEzC,mBAAW,QAAQ,QAAQ,SAAS;AAClC,kBAAQ,KAAK,MAAM;AAAA,YACjB,KAAK,QAAQ;AACX,oBAAM,cAAc,aAAa,IAAI;AAErC,kBAAI,KAAK,UAAU,WAAW,QAAQ,GAAG;AACvC,sBAAM,mBAAmB;AAAA,kBACvB;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,gBACF;AACA,oBAAI,CAAC,iBAAiB,SAAS,KAAK,UAAU,YAAY,CAAC,GAAG;AAC5D,0BAAQ;AAAA,oBACN,gBAAgB,KAAK,SAAS;AAAA,kBAEhC;AAAA,gBACF;AAEA,6BAAa,KAAK;AAAA,kBAChB,WAAW;AAAA,oBACT,KAAK;AAAA,kBACP;AAAA,kBACA,MAAM;AAAA,gBACR,CAAC;AAAA,cACH,OAAO;AACL,6BAAa,KAAK;AAAA,kBAChB,MAAM;AAAA,oBACJ,WAAW;AAAA,oBACX,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,kBACrD;AAAA,kBACA,MAAM;AAAA,gBACR,CAAC;AAAA,cACH;AACA;AAAA,YACF;AAAA,YACA,KAAK,QAAQ;AACX,2BAAa,KAAK;AAAA,gBAChB,MAAM,YAAY,KAAK,IAAI;AAAA,gBAC3B,MAAM;AAAA,cACR,CAAC;AACD;AAAA,YACF;AAAA,YACA,SAAS;AACP,oBAAM,IAAI,8BAA8B;AAAA,gBACtC,eAAe,gBAAiB,KAA0B,IAAI;AAAA,cAChE,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAEA,cAAM,YAAY,aAAa,CAAC;AAChC,cAAM,cACJ,aAAa,WAAW,KAAK,WAAW,SAAS,SAC7C;AAAA,UACE,SAAS,UAAU,QAAQ;AAAA,UAC3B,MAAM;AAAA,QACR,IACA;AAAA,UACE,SAAS;AAAA,UACT,MAAM;AAAA,QACR;AAEN,iBAAS,KAAK,WAAW;AACzB;AAAA,MACF;AAAA,MAEA,SAAS;AACP,cAAM,mBAA0B;AAChC,cAAM,IAAI,mBAAmB;AAAA,UAC3B,SAAS,qBAAsB,iBAAsC,IAAI;AAAA,UACzE,QAAQ,KAAK,UAAU,OAAO;AAAA,QAChC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAWO,SAAS,gCAAgC,MAAsB;AACpE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,WAAW,2BAA2B,IAAI,gBAAgB,EAAE;AAC1E;AAUO,SAAS,kCAAkC,MAAsB;AACtE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,WAAW,mCAAmC,KAAK;AACjE;AAaA,SAAS,aAAa,MAAsE;AAC1F,MAAI,KAAK,gBAAgB,KAAK;AAC5B,WAAO,KAAK,KAAK,SAAS;AAAA,EAC5B;AAEA,MAAI,OAAO,KAAK,SAAS,UAAU;AACjC,WAAO,QAAQ,KAAK,SAAS,WAAW,KAAK,IAAI;AAAA,EACnD;AAEA,MAAI,KAAK,gBAAgB,YAAY;AACnC,UAAM,aAAa,OAAO,KAAK,KAAK,IAAI,EAAE,SAAS,QAAQ;AAC3D,WAAO,QAAQ,KAAK,SAAS,WAAW,UAAU;AAAA,EACpD;AAEA,MAAI,OAAO,SAAS,KAAK,IAAI,GAAG;AAC9B,UAAM,aAAa,OAAO,KAAK,KAAK,IAAI,EAAE,SAAS,QAAQ;AAC3D,WAAO,QAAQ,KAAK,SAAS,WAAW,UAAU;AAAA,EACpD;AAEA,QAAM,kBAAkB,KAAK;AAE7B,MACE,oBAAoB,QACpB,OAAO,oBAAoB,YAC3B,cAAe,iBACf;AACA,UAAM,aACJ,gBAGA,SAAS,QAAQ;AACnB,WAAO,QAAQ,KAAK,SAAS,WAAW,UAAU;AAAA,EACpD;AAEA,QAAM,IAAI,8BAA8B;AAAA,IACtC,eAAe;AAAA,EACjB,CAAC;AACH;","names":[]}
@@ -2,12 +2,12 @@ import {createRequire as __createRequire} from 'module';var require=__createRequ
2
2
  import {
3
3
  buildEmbeddingResult,
4
4
  prepareEmbeddingCall
5
- } from "./chunk-U2HDUNO7.js";
5
+ } from "./chunk-WO5UACI5.js";
6
6
  import {
7
7
  VERSION,
8
8
  convertToAISDKError,
9
9
  deepMerge
10
- } from "./chunk-I5ZTK7M5.js";
10
+ } from "./chunk-TE3CYVU3.js";
11
11
 
12
12
  // src/base-embedding-model-strategy.ts
13
13
  var BaseEmbeddingModelStrategy = class {
@@ -58,4 +58,4 @@ var BaseEmbeddingModelStrategy = class {
58
58
  export {
59
59
  BaseEmbeddingModelStrategy
60
60
  };
61
- //# sourceMappingURL=chunk-HJZCRF7J.js.map
61
+ //# sourceMappingURL=chunk-M6USM33F.js.map
@@ -30550,7 +30550,7 @@ function tryExtractSAPErrorFromMessage(message) {
30550
30550
  }
30551
30551
 
30552
30552
  // src/version.ts
30553
- var VERSION = true ? "4.6.1" : "0.0.0-test";
30553
+ var VERSION = true ? "4.6.2" : "0.0.0-test";
30554
30554
 
30555
30555
  export {
30556
30556
  __toESM,
@@ -30603,4 +30603,4 @@ mime-types/index.js:
30603
30603
  axios/dist/node/axios.cjs:
30604
30604
  (*! Axios v1.13.6 Copyright (c) 2026 Matt Zabriskie and contributors *)
30605
30605
  */
30606
- //# sourceMappingURL=chunk-I5ZTK7M5.js.map
30606
+ //# sourceMappingURL=chunk-TE3CYVU3.js.map
@@ -4,7 +4,7 @@ import {
4
4
  getProviderName,
5
5
  sapAIEmbeddingProviderOptions,
6
6
  validateModelParamsWithWarnings
7
- } from "./chunk-I5ZTK7M5.js";
7
+ } from "./chunk-TE3CYVU3.js";
8
8
 
9
9
  // src/strategy-utils.ts
10
10
  import { TooManyEmbeddingValuesForCallError } from "@ai-sdk/provider";
@@ -682,4 +682,4 @@ export {
682
682
  normalizeEmbedding,
683
683
  prepareEmbeddingCall
684
684
  };
685
- //# sourceMappingURL=chunk-U2HDUNO7.js.map
685
+ //# sourceMappingURL=chunk-WO5UACI5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/strategy-utils.ts"],"sourcesContent":["/**\n * Shared utilities for SAP AI Core strategy implementations.\n */\nimport type {\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Embedding,\n EmbeddingModelV3Result,\n JSONArray,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3FunctionTool,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamPart,\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 { ZodType } from \"zod\";\n\nimport { TooManyEmbeddingValuesForCallError } from \"@ai-sdk/provider\";\nimport { convertAsyncIteratorToReadableStream, parseProviderOptions } from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\n\nimport { deepMerge } from \"./deep-merge.js\";\nimport { getProviderName, sapAIEmbeddingProviderOptions } from \"./sap-ai-provider-options.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\" }\n | { type: \"auto\" }\n | { type: \"none\" }\n | { type: \"required\" };\n\n/**\n * @internal\n */\nexport interface BaseEmbeddingConfig {\n readonly maxEmbeddingsPerCall: number;\n readonly modelId: string;\n readonly provider: string;\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 * 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 totalTokens: number;\n readonly version: string;\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 modelId: string;\n readonly providerName: string;\n readonly requestBody: unknown;\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 * @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 function: {\n description?: string;\n name: string;\n parameters?: P;\n };\n type: \"function\";\n}\n\n/**\n * @internal\n */\nexport type SAPToolChoice =\n | \"auto\"\n | \"none\"\n | \"required\"\n | { 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 responseId?: string;\n}\n\n/**\n * @internal\n */\nexport interface SDKStreamChunk {\n _data?: unknown;\n getDeltaContent(): null | string | undefined;\n getDeltaToolCalls(): null | SDKDeltaToolCall[] | undefined;\n getFinishReason(): null | string | 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 reasoning_tokens?: number;\n };\n prompt_tokens?: number;\n prompt_tokens_details?: {\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 * @internal\n */\nexport interface StreamState {\n activeText: boolean;\n finishReason: LanguageModelV3FinishReason;\n isFirstChunk: boolean;\n usage: {\n inputTokens: {\n cacheRead: number | undefined;\n cacheWrite: number | undefined;\n noCache: number | undefined;\n total: number | undefined;\n };\n outputTokens: {\n reasoning: number | undefined;\n text: number | undefined;\n total: number | undefined;\n };\n };\n}\n\n/**\n * @internal\n */\nexport interface StreamTransformerConfig {\n readonly convertToAISDKError: (\n error: unknown,\n context: { operation: string; requestBody: unknown; url: string },\n ) => unknown;\n readonly idGenerator: StreamIdGenerator;\n readonly includeRawChunks: boolean;\n readonly modelId: string;\n readonly options: LanguageModelV3CallOptions;\n readonly providerName: string;\n readonly responseHeaders?: Record<string, string>;\n readonly responseId: string;\n readonly sdkStream: AsyncIterable<SDKStreamChunk>;\n readonly streamResponseGetCitations?: () => SDKCitation[] | undefined;\n readonly streamResponseGetFinishReason: () => null | string | undefined;\n readonly streamResponseGetIntermediateFailures?: () => undefined | unknown[];\n readonly streamResponseGetTokenUsage: () => null | SDKTokenUsage | undefined;\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;\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/**\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 * 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 { embeddings, modelId, providerName, totalTokens, version } = config;\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [providerName]: {\n model: modelId,\n version,\n },\n };\n\n return {\n embeddings,\n providerMetadata,\n usage: { tokens: totalTokens },\n 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 { modelId, providerName, requestBody, response, responseHeaders, version, warnings } =\n config;\n\n const content = extractResponseContent(response);\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\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 finishReason: finishReasonRaw ?? \"unknown\",\n finishReasonMapped: finishReason,\n ...(intermediateFailures?.length\n ? { intermediateFailures: intermediateFailures as JSONArray }\n : {}),\n ...(typeof responseHeaders?.[\"x-request-id\"] === \"string\"\n ? { requestId: responseHeaders[\"x-request-id\"] }\n : {}),\n version,\n },\n },\n request: {\n body: requestBody,\n },\n response: {\n body: rawResponseBody,\n headers: responseHeaders,\n id: response.responseId,\n modelId,\n timestamp: new Date(),\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 as Record<string, unknown>,\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 * 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 * @returns The converted tools and any warnings.\n * @internal\n */\nexport function convertToolsToSAPFormat<T extends SAPTool<unknown>>(\n tools: AISDKTool[] | undefined,\n): ConvertedToolsResult<T> {\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 { parameters, warning } = extractToolParameters(tool as LanguageModelV3FunctionTool);\n if (warning) {\n warnings.push(warning);\n }\n\n return {\n function: {\n name: tool.name,\n parameters,\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 * 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 convertToAISDKError,\n idGenerator,\n includeRawChunks,\n modelId,\n options,\n providerName,\n responseHeaders,\n responseId,\n sdkStream,\n streamResponseGetCitations,\n streamResponseGetFinishReason,\n streamResponseGetIntermediateFailures,\n streamResponseGetTokenUsage,\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\n return convertAsyncIteratorToReadableStream(\n safeIterate(sdkStream)[Symbol.asyncIterator](),\n ).pipeThrough(\n new TransformStream<Error | SDKStreamChunk, LanguageModelV3StreamPart>({\n flush(controller) {\n const toolCalls = Array.from(toolCallsInProgress.values());\n let didEmitAnyToolCalls = false;\n\n for (const tc of toolCalls) {\n if (tc.didEmitCall) {\n continue;\n }\n\n if (!tc.didEmitInputStart) {\n tc.didEmitInputStart = true;\n controller.enqueue({\n id: tc.id,\n toolName: tc.toolName ?? \"\",\n type: \"tool-input-start\",\n });\n }\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 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 const finalUsage = streamResponseGetTokenUsage();\n if (finalUsage) {\n const mapped = mapTokenUsage(finalUsage);\n streamState.usage.inputTokens = mapped.inputTokens;\n streamState.usage.outputTokens = mapped.outputTokens;\n }\n\n const streamCitations = streamResponseGetCitations?.();\n if (streamCitations?.length) {\n for (const citation of streamCitations) {\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 finishReason: streamState.finishReason.raw,\n ...(streamIntermediateFailures?.length\n ? {\n intermediateFailures: streamIntermediateFailures as JSONArray,\n }\n : {}),\n ...(typeof responseHeaders?.[\"x-request-id\"] === \"string\"\n ? { requestId: responseHeaders[\"x-request-id\"] }\n : {}),\n responseId,\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 (chunk instanceof Error) {\n const aiError = convertToAISDKError(chunk, {\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 return;\n }\n\n if (includeRawChunks) {\n controller.enqueue({\n rawValue: (chunk as { _data?: unknown })._data ?? chunk,\n type: \"raw\",\n });\n }\n\n if (streamState.isFirstChunk) {\n streamState.isFirstChunk = false;\n controller.enqueue({\n id: responseId,\n modelId,\n timestamp: new Date(),\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 (\n typeof deltaContent === \"string\" &&\n deltaContent.length > 0 &&\n streamState.finishReason.unified !== \"tool-calls\"\n ) {\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 }\n }\n\n if (Array.isArray(deltaToolCalls) && deltaToolCalls.length > 0) {\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: toolCallChunk.id ?? `tool_${String(index)}`,\n toolName: toolCallChunk.function?.name,\n });\n }\n\n const tc = toolCallsInProgress.get(index);\n if (!tc) continue;\n\n if (toolCallChunk.id) {\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) {\n tc.didEmitInputStart = true;\n controller.enqueue({\n id: tc.id,\n toolName: tc.toolName,\n type: \"tool-input-start\",\n });\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) {\n controller.enqueue({\n delta: argumentsDelta,\n id: tc.id,\n type: \"tool-input-delta\",\n });\n }\n }\n }\n }\n\n const chunkFinishReason = chunk.getFinishReason();\n if (chunkFinishReason) {\n streamState.finishReason = mapFinishReason(chunkFinishReason);\n\n if (streamState.finishReason.unified === \"tool-calls\") {\n const toolCalls = Array.from(toolCallsInProgress.values());\n for (const tc of toolCalls) {\n if (tc.didEmitCall) {\n continue;\n }\n if (!tc.didEmitInputStart) {\n tc.didEmitInputStart = true;\n controller.enqueue({\n id: tc.id,\n toolName: tc.toolName ?? \"\",\n type: \"tool-input-start\",\n });\n }\n\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 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 * Extracts content (text and tool calls) from SDK response.\n * @param response - SDK response object.\n * @returns Content array for LanguageModelV3GenerateResult.\n * @internal\n */\nexport function extractResponseContent(response: SDKResponse): LanguageModelV3Content[] {\n const content: LanguageModelV3Content[] = [];\n\n const textContent = response.getContent();\n if (textContent) {\n content.push({\n text: textContent,\n type: \"text\",\n });\n }\n\n const toolCalls = response.getToolCalls();\n if (toolCalls) {\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\n return content;\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 && hasKeys(inputSchema)) {\n const hasProperties =\n inputSchema.properties &&\n typeof inputSchema.properties === \"object\" &&\n hasKeys(inputSchema.properties);\n\n if (hasProperties) {\n return { parameters: buildSAPToolParameters(inputSchema) };\n }\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 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 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 * @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 reasoningTokens = tokenUsage?.completion_tokens_details?.reasoning_tokens;\n\n return {\n inputTokens: {\n cacheRead: cachedTokens,\n cacheWrite: undefined,\n noCache:\n cachedTokens != null\n ? (tokenUsage?.prompt_tokens ?? 0) - cachedTokens\n : tokenUsage?.prompt_tokens,\n total: tokenUsage?.prompt_tokens,\n },\n outputTokens: {\n reasoning: reasoningTokens,\n text:\n reasoningTokens != null\n ? (tokenUsage?.completion_tokens ?? 0) - reasoningTokens\n : tokenUsage?.completion_tokens,\n total: tokenUsage?.completion_tokens,\n },\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 * 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\n/**\n * Prepares embedding call by parsing provider options and validating input count.\n * @param config - Base embedding configuration.\n * @param options - Embedding model call options.\n * @returns Parsed SAP options and provider name.\n * @throws {TooManyEmbeddingValuesForCallError} When input count exceeds maximum.\n * @internal\n */\nexport async function prepareEmbeddingCall(\n config: BaseEmbeddingConfig,\n options: EmbeddingModelV3CallOptions,\n): Promise<{ embeddingOptions: EmbeddingProviderOptions | undefined; providerName: string }> {\n const { maxEmbeddingsPerCall, modelId, provider } = config;\n const { providerOptions, values } = options;\n\n const providerName = getProviderName(provider);\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions,\n schema: sapAIEmbeddingProviderOptions,\n });\n\n if (values.length > maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n maxEmbeddingsPerCall,\n modelId,\n provider,\n values,\n });\n }\n\n return { embeddingOptions: sapOptions, providerName };\n}\n\n/**\n * Wraps an async iterable to catch iteration errors and yield them as values.\n * @param iterable - The async iterable to wrap.\n * @yields {Error | T} Original values or Error instances for caught exceptions.\n * @internal\n */\nasync function* safeIterate<T>(iterable: AsyncIterable<T>): AsyncGenerator<Error | T> {\n try {\n yield* iterable;\n } catch (error) {\n yield error instanceof Error ? error : new Error(String(error));\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,13 +1,13 @@
1
1
  import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
2
2
  import {
3
3
  BaseEmbeddingModelStrategy
4
- } from "./chunk-HJZCRF7J.js";
4
+ } from "./chunk-M6USM33F.js";
5
5
  import {
6
6
  buildModelDeployment,
7
7
  hasKeys,
8
8
  normalizeEmbedding
9
- } from "./chunk-U2HDUNO7.js";
10
- import "./chunk-I5ZTK7M5.js";
9
+ } from "./chunk-WO5UACI5.js";
10
+ import "./chunk-TE3CYVU3.js";
11
11
 
12
12
  // src/foundation-models-embedding-model-strategy.ts
13
13
  var FoundationModelsEmbeddingModelStrategy = class extends BaseEmbeddingModelStrategy {
@@ -51,4 +51,4 @@ var FoundationModelsEmbeddingModelStrategy = class extends BaseEmbeddingModelStr
51
51
  export {
52
52
  FoundationModelsEmbeddingModelStrategy
53
53
  };
54
- //# sourceMappingURL=foundation-models-embedding-model-strategy-C4SXGZ66.js.map
54
+ //# sourceMappingURL=foundation-models-embedding-model-strategy-A6CA7NXP.js.map
@@ -1,16 +1,16 @@
1
1
  import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
2
2
  import {
3
3
  BaseLanguageModelStrategy
4
- } from "./chunk-IAXILSPQ.js";
5
- import "./chunk-DQXZH6CW.js";
4
+ } from "./chunk-7HX5A5XW.js";
5
+ import "./chunk-IIBSUXGT.js";
6
6
  import {
7
7
  buildModelDeployment,
8
8
  convertResponseFormat,
9
9
  convertToolsToSAPFormat
10
- } from "./chunk-U2HDUNO7.js";
10
+ } from "./chunk-WO5UACI5.js";
11
11
  import {
12
12
  normalizeHeaders
13
- } from "./chunk-I5ZTK7M5.js";
13
+ } from "./chunk-TE3CYVU3.js";
14
14
 
15
15
  // src/foundation-models-language-model-strategy.ts
16
16
  var FOUNDATION_MODELS_PARAM_MAPPINGS = [
@@ -89,4 +89,4 @@ var FoundationModelsLanguageModelStrategy = class extends BaseLanguageModelStrat
89
89
  export {
90
90
  FoundationModelsLanguageModelStrategy
91
91
  };
92
- //# sourceMappingURL=foundation-models-language-model-strategy-3D4V6PSZ.js.map
92
+ //# sourceMappingURL=foundation-models-language-model-strategy-DZMPSOJK.js.map
package/dist/index.cjs CHANGED
@@ -145,7 +145,8 @@ function convertToSAPMessages(prompt, options = {}) {
145
145
  } else {
146
146
  contentParts.push({
147
147
  file: {
148
- file_data: fileDataUrl
148
+ file_data: fileDataUrl,
149
+ ...part.filename ? { filename: part.filename } : {}
149
150
  },
150
151
  type: "file"
151
152
  });
@@ -31435,7 +31436,7 @@ var VERSION;
31435
31436
  var init_version = __esm({
31436
31437
  "src/version.ts"() {
31437
31438
  "use strict";
31438
- VERSION = true ? "4.6.1" : "0.0.0-test";
31439
+ VERSION = true ? "4.6.2" : "0.0.0-test";
31439
31440
  }
31440
31441
  });
31441
31442