@jerome-benoit/sap-ai-provider 4.4.5 → 4.4.8

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 (27) hide show
  1. package/README.md +28 -27
  2. package/dist/{chunk-24QM3M77.js → chunk-J6IX7CM7.js} +2 -2
  3. package/dist/chunk-J6IX7CM7.js.map +1 -0
  4. package/dist/{chunk-LSTAKB2E.js → chunk-PF3ZCJ3H.js} +21 -5
  5. package/dist/{chunk-LSTAKB2E.js.map → chunk-PF3ZCJ3H.js.map} +1 -1
  6. package/dist/chunk-XU6SXOA2.js +170 -0
  7. package/dist/chunk-XU6SXOA2.js.map +1 -0
  8. package/dist/{foundation-models-embedding-model-strategy-XFI3YVEE.js → foundation-models-embedding-model-strategy-BAZN2P7Z.js} +3 -3
  9. package/dist/foundation-models-language-model-strategy-NKCAFUUQ.js +86 -0
  10. package/dist/foundation-models-language-model-strategy-NKCAFUUQ.js.map +1 -0
  11. package/dist/index.cjs +621 -250
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.cts +29 -28
  14. package/dist/index.d.ts +29 -28
  15. package/dist/index.js +86 -23
  16. package/dist/index.js.map +1 -1
  17. package/dist/{orchestration-embedding-model-strategy-UGNXVHCS.js → orchestration-embedding-model-strategy-2TODFL4O.js} +3 -3
  18. package/dist/orchestration-language-model-strategy-62DDBL3A.js +435 -0
  19. package/dist/orchestration-language-model-strategy-62DDBL3A.js.map +1 -0
  20. package/package.json +5 -5
  21. package/dist/chunk-24QM3M77.js.map +0 -1
  22. package/dist/foundation-models-language-model-strategy-XTKFTZTL.js +0 -160
  23. package/dist/foundation-models-language-model-strategy-XTKFTZTL.js.map +0 -1
  24. package/dist/orchestration-language-model-strategy-NNQ7KFNH.js +0 -236
  25. package/dist/orchestration-language-model-strategy-NNQ7KFNH.js.map +0 -1
  26. /package/dist/{foundation-models-embedding-model-strategy-XFI3YVEE.js.map → foundation-models-embedding-model-strategy-BAZN2P7Z.js.map} +0 -0
  27. /package/dist/{orchestration-embedding-model-strategy-UGNXVHCS.js.map → orchestration-embedding-model-strategy-2TODFL4O.js.map} +0 -0
package/README.md CHANGED
@@ -70,9 +70,12 @@ SAP's enterprise-grade AI models through the familiar Vercel AI SDK interface.
70
70
  - 🎨 **Multiple Models** - Support for GPT-4, Claude, Gemini, Nova, and more
71
71
  - ⚡ **Language Model V3** - Latest Vercel AI SDK specification with enhanced
72
72
  streaming
73
- - 📊 **Text Embeddings** - Generate vector embeddings for RAG and semantic search
74
- - 🔀 **Dual API Support** - Choose between Orchestration or Foundation Models API
75
- per provider, model, or call
73
+ - 📊 **Text Embeddings** - Generate vector embeddings for RAG and semantic
74
+ search
75
+ - 🔀 **Dual API Support** - Choose between Orchestration or Foundation Models
76
+ API per provider, model, or call
77
+ - 📦 **Stored Configuration Support** - Reference orchestration configurations
78
+ or prompt templates from SAP AI Core
76
79
 
77
80
  ## Quick Start
78
81
 
@@ -290,7 +293,8 @@ const result = await generateText({
290
293
  [examples/example-streaming-chat.ts](./examples/example-streaming-chat.ts)
291
294
 
292
295
  ```typescript
293
- import { streamText, APICallError } from "ai";
296
+ import { streamText } from "ai";
297
+ import { APICallError } from "@ai-sdk/provider";
294
298
 
295
299
  try {
296
300
  const result = streamText({
@@ -627,7 +631,8 @@ authentication, model parameters, data masking, content filtering, and more.
627
631
 
628
632
  **Common Configuration:**
629
633
 
630
- - `name`: Provider name (default: `'sap-ai'`). Used as key in `providerOptions`/`providerMetadata`.
634
+ - `name`: Provider name (default: `'sap-ai'`). Used as key in
635
+ `providerOptions`/`providerMetadata`.
631
636
  - `resourceGroup`: SAP AI Core resource group (default: 'default')
632
637
  - `deploymentId`: Specific deployment ID (auto-resolved if not set)
633
638
  - `modelParams`: Temperature, maxTokens, topP, and other generation parameters
@@ -648,8 +653,8 @@ error handling across providers.
648
653
 
649
654
  - **[API Reference - Error Handling](./API_REFERENCE.md#error-handling--reference)** -
650
655
  Complete examples, error types, and SAP-specific metadata
651
- - **[Troubleshooting Guide](./TROUBLESHOOTING.md)** - Solutions for common errors
652
- (401, 404, 429, 5xx)
656
+ - **[Troubleshooting Guide](./TROUBLESHOOTING.md)** - Solutions for common
657
+ errors (401, 404, 429, 5xx)
653
658
 
654
659
  ## Troubleshooting
655
660
 
@@ -661,17 +666,11 @@ error handling across providers.
661
666
  - **Streaming**: Iterate `textStream` correctly; don't mix `generateText` and
662
667
  `streamText`
663
668
 
664
- **For comprehensive troubleshooting, see
665
- [Troubleshooting Guide](./TROUBLESHOOTING.md)** with detailed solutions for:
666
-
667
- - [Authentication Failed (401)](./TROUBLESHOOTING.md#problem-authentication-failed-or-401-errors)
668
- - [Model Not Found (404)](./TROUBLESHOOTING.md#problem-404-modeldeployment-not-found)
669
- - [Rate Limit (429)](./TROUBLESHOOTING.md#problem-429-rate-limit-exceeded)
670
- - [Server Errors (500-504)](./TROUBLESHOOTING.md#problem-500502503504-server-errors)
671
- - [Streaming Issues](./TROUBLESHOOTING.md#streaming-issues)
672
- - [Tool Calling Problems](./TROUBLESHOOTING.md#tool-calling-issues)
669
+ **For detailed solutions**, see **[Troubleshooting Guide](./TROUBLESHOOTING.md)**
670
+ covering authentication, model discovery, rate limiting, server errors,
671
+ streaming, and tool calling.
673
672
 
674
- Error code reference table:
673
+ **Error codes:**
675
674
  [API Reference - HTTP Status Codes](./API_REFERENCE.md#http-status-code-reference)
676
675
 
677
676
  ## Performance
@@ -688,7 +687,8 @@ Error code reference table:
688
687
 
689
688
  Follow security best practices when handling credentials. See
690
689
  [Environment Setup - Security Best Practices](./ENVIRONMENT_SETUP.md#security-best-practices)
691
- for detailed guidance on credential management, key rotation, and secure deployment.
690
+ for detailed guidance on credential management, key rotation, and secure
691
+ deployment.
692
692
 
693
693
  ## Debug Mode
694
694
 
@@ -756,8 +756,9 @@ complete upgrade instructions.**
756
756
  ### Upgrading from v2.x to v3.x
757
757
 
758
758
  Version 3.0 standardizes error handling to use Vercel AI SDK native error types.
759
- **See the [Migration Guide](./MIGRATION_GUIDE.md#version-2x-to-3x-breaking-changes) for complete upgrade
760
- instructions.**
759
+ **See the
760
+ [Migration Guide](./MIGRATION_GUIDE.md#version-2x-to-3x-breaking-changes) for
761
+ complete upgrade instructions.**
761
762
 
762
763
  **Key changes:**
763
764
 
@@ -768,8 +769,8 @@ instructions.**
768
769
  ### Upgrading from v1.x to v2.x
769
770
 
770
771
  Version 2.0 uses the official SAP AI SDK. **See the
771
- [Migration Guide](./MIGRATION_GUIDE.md#version-1x-to-2x-breaking-changes) for complete upgrade
772
- instructions.**
772
+ [Migration Guide](./MIGRATION_GUIDE.md#version-1x-to-2x-breaking-changes) for
773
+ complete upgrade instructions.**
773
774
 
774
775
  **Key changes:**
775
776
 
@@ -783,9 +784,9 @@ instructions.**
783
784
  ## Important Note
784
785
 
785
786
  > **Third-Party Provider**: This SAP AI Provider
786
- > (`@jerome-benoit/sap-ai-provider`) is developed and maintained by jerome-benoit, not
787
- > by SAP SE. While it uses the official SAP AI SDK and integrates with SAP AI
788
- > Core services, it is not an official SAP product.
787
+ > (`@jerome-benoit/sap-ai-provider`) is developed and maintained by
788
+ > jerome-benoit, not by SAP SE. While it uses the official SAP AI SDK and
789
+ > integrates with SAP AI Core services, it is not an official SAP product.
789
790
 
790
791
  ## Contributing
791
792
 
@@ -810,8 +811,8 @@ for details.
810
811
 
811
812
  ### Community
812
813
 
813
- - 🐛 [Issue Tracker](https://github.com/jerome-benoit/sap-ai-provider/issues) - Report
814
- bugs, request features, and ask questions
814
+ - 🐛 [Issue Tracker](https://github.com/jerome-benoit/sap-ai-provider/issues) -
815
+ Report bugs, request features, and ask questions
815
816
 
816
817
  ### Related Projects
817
818
 
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  deepMerge,
3
3
  validateModelParamsWithWarnings
4
- } from "./chunk-LSTAKB2E.js";
4
+ } from "./chunk-PF3ZCJ3H.js";
5
5
 
6
6
  // src/strategy-utils.ts
7
7
  import { z } from "zod";
@@ -588,4 +588,4 @@ export {
588
588
  mapToolChoice,
589
589
  normalizeEmbedding
590
590
  };
591
- //# sourceMappingURL=chunk-24QM3M77.js.map
591
+ //# sourceMappingURL=chunk-J6IX7CM7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/strategy-utils.ts"],"sourcesContent":["/**\n * Shared utilities for SAP AI Core strategy implementations.\n */\nimport type {\n EmbeddingModelV3Embedding,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3FunctionTool,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamPart,\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 { z } from \"zod\";\n\nimport { deepMerge } from \"./deep-merge.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 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 * @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 type: \"object\";\n};\n\n/**\n * @internal\n */\nexport interface SDKResponse {\n getContent(): null | string | undefined;\n getFinishReason(): null | string | undefined;\n getTokenUsage(): undefined | { completion_tokens?: number; prompt_tokens?: number };\n getToolCalls():\n | null\n | undefined\n | {\n function: { arguments: string; name: string };\n id: string;\n }[];\n rawResponse: { headers: Headers | Record<string, string> };\n}\n\n/**\n * @internal\n */\nexport interface SDKStreamChunk {\n _data?: unknown;\n getDeltaContent(): null | string | undefined;\n getDeltaToolCalls():\n | null\n | undefined\n | {\n function?: { arguments?: string; name?: string };\n id?: string;\n index?: number;\n }[];\n getFinishReason(): null | string | undefined;\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 responseId: string;\n readonly sdkStream: AsyncIterable<SDKStreamChunk>;\n readonly streamResponseGetFinishReason: () => null | string | undefined;\n readonly streamResponseGetTokenUsage: () =>\n | null\n | undefined\n | { completion_tokens?: number; prompt_tokens?: number };\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 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 return {\n content,\n finishReason,\n providerMetadata: {\n [providerName]: {\n finishReason: finishReasonRaw ?? \"unknown\",\n finishReasonMapped: finishReason,\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 modelId,\n timestamp: new Date(),\n },\n usage: {\n inputTokens: {\n cacheRead: undefined,\n cacheWrite: undefined,\n noCache: tokenUsage?.prompt_tokens,\n total: tokenUsage?.prompt_tokens,\n },\n outputTokens: {\n reasoning: undefined,\n text: tokenUsage?.completion_tokens,\n total: tokenUsage?.completion_tokens,\n },\n },\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 responseId,\n sdkStream,\n streamResponseGetFinishReason,\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 new ReadableStream<LanguageModelV3StreamPart>({\n cancel() {\n // No cleanup needed - SDK handles stream cancellation internally\n },\n async start(controller) {\n controller.enqueue({\n type: \"stream-start\",\n warnings: [...warnings],\n });\n\n try {\n for await (const chunk of sdkStream) {\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 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 streamState.usage.inputTokens.total = finalUsage.prompt_tokens;\n streamState.usage.inputTokens.noCache = finalUsage.prompt_tokens;\n streamState.usage.outputTokens.total = finalUsage.completion_tokens;\n streamState.usage.outputTokens.text = finalUsage.completion_tokens;\n }\n\n controller.enqueue({\n finishReason: streamState.finishReason,\n providerMetadata: {\n [providerName]: {\n finishReason: streamState.finishReason.raw,\n responseId,\n version,\n },\n },\n type: \"finish\",\n usage: streamState.usage,\n });\n\n controller.close();\n } catch (error) {\n const aiError = convertToAISDKError(error, {\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.close();\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 && Object.keys(inputSchema).length > 0) {\n const hasProperties =\n inputSchema.properties &&\n typeof inputSchema.properties === \"object\" &&\n Object.keys(inputSchema.properties).length > 0;\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 * 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 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"],"mappings":"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","names":["toolCalls"]}
@@ -29811,6 +29811,18 @@ var promptTemplateRefSchema = z.union([
29811
29811
  promptTemplateRefByIdSchema,
29812
29812
  promptTemplateRefByScenarioNameVersionSchema
29813
29813
  ]);
29814
+ var orchestrationConfigRefByIdSchema = z.object({
29815
+ id: z.string().min(1, "Config ID cannot be empty")
29816
+ });
29817
+ var orchestrationConfigRefByScenarioNameVersionSchema = z.object({
29818
+ name: z.string().min(1, "Config name cannot be empty"),
29819
+ scenario: z.string().min(1, "Scenario cannot be empty"),
29820
+ version: z.string().min(1, "Version cannot be empty")
29821
+ });
29822
+ var orchestrationConfigRefSchema = z.union([
29823
+ orchestrationConfigRefByIdSchema,
29824
+ orchestrationConfigRefByScenarioNameVersionSchema
29825
+ ]);
29814
29826
  var sapAILanguageModelProviderOptions = lazySchema(
29815
29827
  () => zodSchema(
29816
29828
  z.object({
@@ -29818,6 +29830,7 @@ var sapAILanguageModelProviderOptions = lazySchema(
29818
29830
  escapeTemplatePlaceholders: z.boolean().optional(),
29819
29831
  includeReasoning: z.boolean().optional(),
29820
29832
  modelParams: modelParamsSchema.optional(),
29833
+ orchestrationConfigRef: orchestrationConfigRefSchema.optional(),
29821
29834
  placeholderValues: z.record(z.string(), z.string()).optional(),
29822
29835
  promptTemplateRef: promptTemplateRefSchema.optional()
29823
29836
  })
@@ -29917,7 +29930,7 @@ var ApiSwitchError = class extends Error {
29917
29930
  */
29918
29931
  constructor(fromApi, toApi, conflictingFeature) {
29919
29932
  super(
29920
- `Cannot switch from ${fromApi} to ${toApi} API at invocation time because the model was configured with ${conflictingFeature}. Create a new model instance instead.`
29933
+ `Cannot switch from ${fromApi} to ${toApi} API at invocation time because ${conflictingFeature} would be ignored. Create a new model instance without ${fromApi}-specific features, or keep using the ${fromApi} API.`
29921
29934
  );
29922
29935
  this.fromApi = fromApi;
29923
29936
  this.toApi = toApi;
@@ -29929,13 +29942,15 @@ var UnsupportedFeatureError = class extends Error {
29929
29942
  /**
29930
29943
  * Creates a new UnsupportedFeatureError.
29931
29944
  * @param feature - The name of the unsupported feature (e.g., "Content filtering").
29932
- * @param api - The API being used where the feature is not supported.
29945
+ * @param api - The API being used where the feature will be ignored.
29933
29946
  * @param suggestedApi - The API that supports this feature.
29934
29947
  */
29935
29948
  constructor(feature, api, suggestedApi) {
29936
29949
  const apiName = api === "foundation-models" ? "Foundation Models" : "Orchestration";
29937
29950
  const suggestedApiName = suggestedApi === "foundation-models" ? "Foundation Models" : "Orchestration";
29938
- super(`${feature} is not supported with ${apiName} API. Use ${suggestedApiName} API instead.`);
29951
+ super(
29952
+ `${feature} is only available with ${suggestedApiName} API and will be ignored by ${apiName} API.`
29953
+ );
29939
29954
  this.feature = feature;
29940
29955
  this.api = api;
29941
29956
  this.suggestedApi = suggestedApi;
@@ -30366,7 +30381,7 @@ function tryExtractSAPErrorFromMessage(message) {
30366
30381
  }
30367
30382
 
30368
30383
  // src/version.ts
30369
- var VERSION = true ? "4.4.5" : "0.0.0-test";
30384
+ var VERSION = true ? "4.4.8" : "0.0.0-test";
30370
30385
 
30371
30386
  export {
30372
30387
  __toESM,
@@ -30375,6 +30390,7 @@ export {
30375
30390
  validateEmbeddingModelParamsSettings,
30376
30391
  validateModelParamsSettings,
30377
30392
  validateModelParamsWithWarnings,
30393
+ orchestrationConfigRefSchema,
30378
30394
  sapAILanguageModelProviderOptions,
30379
30395
  sapAIEmbeddingProviderOptions,
30380
30396
  deepMerge,
@@ -30418,4 +30434,4 @@ mime-types/index.js:
30418
30434
  axios/dist/node/axios.cjs:
30419
30435
  (*! Axios v1.13.4 Copyright (c) 2026 Matt Zabriskie and contributors *)
30420
30436
  */
30421
- //# sourceMappingURL=chunk-LSTAKB2E.js.map
30437
+ //# sourceMappingURL=chunk-PF3ZCJ3H.js.map