@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.
- package/README.md +28 -27
- package/dist/{chunk-24QM3M77.js → chunk-J6IX7CM7.js} +2 -2
- package/dist/chunk-J6IX7CM7.js.map +1 -0
- package/dist/{chunk-LSTAKB2E.js → chunk-PF3ZCJ3H.js} +21 -5
- package/dist/{chunk-LSTAKB2E.js.map → chunk-PF3ZCJ3H.js.map} +1 -1
- package/dist/chunk-XU6SXOA2.js +170 -0
- package/dist/chunk-XU6SXOA2.js.map +1 -0
- package/dist/{foundation-models-embedding-model-strategy-XFI3YVEE.js → foundation-models-embedding-model-strategy-BAZN2P7Z.js} +3 -3
- package/dist/foundation-models-language-model-strategy-NKCAFUUQ.js +86 -0
- package/dist/foundation-models-language-model-strategy-NKCAFUUQ.js.map +1 -0
- package/dist/index.cjs +621 -250
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +29 -28
- package/dist/index.d.ts +29 -28
- package/dist/index.js +86 -23
- package/dist/index.js.map +1 -1
- package/dist/{orchestration-embedding-model-strategy-UGNXVHCS.js → orchestration-embedding-model-strategy-2TODFL4O.js} +3 -3
- package/dist/orchestration-language-model-strategy-62DDBL3A.js +435 -0
- package/dist/orchestration-language-model-strategy-62DDBL3A.js.map +1 -0
- package/package.json +5 -5
- package/dist/chunk-24QM3M77.js.map +0 -1
- package/dist/foundation-models-language-model-strategy-XTKFTZTL.js +0 -160
- package/dist/foundation-models-language-model-strategy-XTKFTZTL.js.map +0 -1
- package/dist/orchestration-language-model-strategy-NNQ7KFNH.js +0 -236
- package/dist/orchestration-language-model-strategy-NNQ7KFNH.js.map +0 -1
- /package/dist/{foundation-models-embedding-model-strategy-XFI3YVEE.js.map → foundation-models-embedding-model-strategy-BAZN2P7Z.js.map} +0 -0
- /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
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
665
|
-
|
|
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
|
|
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
|
|
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
|
|
760
|
-
|
|
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
|
|
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
|
|
787
|
-
> by SAP SE. While it uses the official SAP AI SDK and
|
|
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) -
|
|
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-
|
|
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-
|
|
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
|
|
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
|
|
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(
|
|
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.
|
|
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-
|
|
30437
|
+
//# sourceMappingURL=chunk-PF3ZCJ3H.js.map
|