@jerome-benoit/sap-ai-provider-v2 4.4.18 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +16 -9
  2. package/dist/{chunk-BBWFNLML.js → chunk-BV5Y6RMC.js} +3 -3
  3. package/dist/{chunk-O6ASHXPO.js → chunk-DBAIFR3B.js} +445 -321
  4. package/dist/{chunk-O6ASHXPO.js.map → chunk-DBAIFR3B.js.map} +1 -1
  5. package/dist/{chunk-SD6CRCHX.js → chunk-DQXZH6CW.js} +50 -43
  6. package/dist/chunk-DQXZH6CW.js.map +1 -0
  7. package/dist/{chunk-4CAVT2YC.js → chunk-KS5QNMYZ.js} +193 -146
  8. package/dist/chunk-KS5QNMYZ.js.map +1 -0
  9. package/dist/{chunk-3M6NFVCS.js → chunk-WYDTQDMJ.js} +11 -5
  10. package/dist/chunk-WYDTQDMJ.js.map +1 -0
  11. package/dist/{foundation-models-embedding-model-strategy-XJV5REFR.js → foundation-models-embedding-model-strategy-XLD3PGCK.js} +4 -4
  12. package/dist/{foundation-models-language-model-strategy-X6VNJZFG.js → foundation-models-language-model-strategy-SNBZBWX4.js} +12 -7
  13. package/dist/foundation-models-language-model-strategy-SNBZBWX4.js.map +1 -0
  14. package/dist/index.cjs +714 -509
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.cts +19 -2
  17. package/dist/index.d.ts +19 -2
  18. package/dist/index.js +6 -6
  19. package/dist/index.js.map +1 -1
  20. package/dist/{orchestration-embedding-model-strategy-3GIX5HAR.js → orchestration-embedding-model-strategy-6BKD5NW7.js} +4 -4
  21. package/dist/{orchestration-language-model-strategy-GYBTFP2F.js → orchestration-language-model-strategy-OYSEPGQG.js} +23 -6
  22. package/dist/orchestration-language-model-strategy-OYSEPGQG.js.map +1 -0
  23. package/package.json +20 -20
  24. package/dist/chunk-3M6NFVCS.js.map +0 -1
  25. package/dist/chunk-4CAVT2YC.js.map +0 -1
  26. package/dist/chunk-SD6CRCHX.js.map +0 -1
  27. package/dist/foundation-models-language-model-strategy-X6VNJZFG.js.map +0 -1
  28. package/dist/orchestration-language-model-strategy-GYBTFP2F.js.map +0 -1
  29. /package/dist/{chunk-BBWFNLML.js.map → chunk-BV5Y6RMC.js.map} +0 -0
  30. /package/dist/{foundation-models-embedding-model-strategy-XJV5REFR.js.map → foundation-models-embedding-model-strategy-XLD3PGCK.js.map} +0 -0
  31. /package/dist/{orchestration-embedding-model-strategy-3GIX5HAR.js.map → orchestration-embedding-model-strategy-6BKD5NW7.js.map} +0 -0
package/dist/index.d.cts CHANGED
@@ -2,8 +2,8 @@ import { EmbeddingModelV2, SharedV2ProviderOptions, SharedV2ProviderMetadata, Sh
2
2
  import { DeploymentIdConfig, ResourceGroupConfig } from '@sap-ai-sdk/ai-api/internal.js';
3
3
  import { HttpDestinationOrFetchOptions } from '@sap-cloud-sdk/connectivity';
4
4
  import { AzureOpenAiChatCompletionParameters } from '@sap-ai-sdk/foundation-models';
5
- import { FilteringModule, GroundingModule, MaskingModule, OrchestrationConfigRef, ChatCompletionTool, TranslationModule, ChatModel } from '@sap-ai-sdk/orchestration';
6
- export { AssistantChatMessage, ChatCompletionRequest, ChatCompletionTool, ChatMessage, DeveloperChatMessage, DocumentTranslationApplyToSelector, FilteringModule, FunctionObject, GroundingModule, LlmModelDetails, LlmModelParams, MaskingModule, OrchestrationClient, OrchestrationConfigRef, OrchestrationEmbeddingClient, OrchestrationEmbeddingResponse, OrchestrationErrorResponse, OrchestrationModuleConfig, OrchestrationResponse, OrchestrationStream, OrchestrationStreamChunkResponse, OrchestrationStreamResponse, PromptTemplatingModule, SystemChatMessage, ToolChatMessage, TranslationApplyToCategory, TranslationInputParameters, TranslationModule, TranslationOutputParameters, TranslationTargetLanguage, UserChatMessage, buildAzureContentSafetyFilter, buildDocumentGroundingConfig, buildDpiMaskingProvider, buildLlamaGuard38BFilter, buildTranslationConfig } from '@sap-ai-sdk/orchestration';
5
+ import { OrchestrationModuleConfig, FilteringModule, GroundingModule, MaskingModule, OrchestrationConfigRef, ChatCompletionTool, TranslationModule, ChatModel } from '@sap-ai-sdk/orchestration';
6
+ export { AssistantChatMessage, ChatCompletionRequest, ChatCompletionTool, ChatMessage, ChatMessageContent, ChatMessages, Citation, DeveloperChatMessage, DocumentTranslationApplyToSelector, FileContent, FilteringModule, FunctionObject, GroundingModule, ImageContentUrl, LlmModelDetails, LlmModelParams, MaskingModule, OrchestrationClient, OrchestrationConfigRef, OrchestrationEmbeddingClient, OrchestrationEmbeddingResponse, OrchestrationError, OrchestrationErrorResponse, OrchestrationModuleConfig, OrchestrationModuleConfigList, OrchestrationResponse, OrchestrationStream, OrchestrationStreamChunkResponse, OrchestrationStreamResponse, PromptTemplatingModule, SystemChatMessage, ToolChatMessage, TranslationApplyToCategory, TranslationInputParameters, TranslationModule, TranslationOutputParameters, TranslationTargetLanguage, UserChatMessage, UserChatMessageContent, UserChatMessageContentItem, buildAzureContentSafetyFilter, buildDocumentGroundingConfig, buildDpiMaskingProvider, buildLlamaGuard38BFilter, buildTranslationConfig } from '@sap-ai-sdk/orchestration';
7
7
  import * as _ai_sdk_provider_utils from '@ai-sdk/provider-utils';
8
8
  import { InferSchema } from '@ai-sdk/provider-utils';
9
9
 
@@ -117,6 +117,23 @@ interface OrchestrationModelSettings {
117
117
  readonly api?: "orchestration";
118
118
  /** @default true */
119
119
  readonly escapeTemplatePlaceholders?: boolean;
120
+ /**
121
+ * Additional module configurations for prompt module fallback.
122
+ * The SDK tries the primary configuration first, then each fallback in order until one succeeds.
123
+ * Each entry is a full `OrchestrationModuleConfig` with its own model, prompt, and modules.
124
+ * @example
125
+ * ```ts
126
+ * fallbackModuleConfigs: [
127
+ * {
128
+ * promptTemplating: {
129
+ * model: { name: "gpt-4.1-mini" },
130
+ * prompt: { template: [] },
131
+ * },
132
+ * },
133
+ * ]
134
+ * ```
135
+ */
136
+ readonly fallbackModuleConfigs?: OrchestrationModuleConfig[];
120
137
  readonly filtering?: FilteringModule;
121
138
  readonly grounding?: GroundingModule;
122
139
  /** @default false */
package/dist/index.d.ts CHANGED
@@ -2,8 +2,8 @@ import { EmbeddingModelV2, SharedV2ProviderOptions, SharedV2ProviderMetadata, Sh
2
2
  import { DeploymentIdConfig, ResourceGroupConfig } from '@sap-ai-sdk/ai-api/internal.js';
3
3
  import { HttpDestinationOrFetchOptions } from '@sap-cloud-sdk/connectivity';
4
4
  import { AzureOpenAiChatCompletionParameters } from '@sap-ai-sdk/foundation-models';
5
- import { FilteringModule, GroundingModule, MaskingModule, OrchestrationConfigRef, ChatCompletionTool, TranslationModule, ChatModel } from '@sap-ai-sdk/orchestration';
6
- export { AssistantChatMessage, ChatCompletionRequest, ChatCompletionTool, ChatMessage, DeveloperChatMessage, DocumentTranslationApplyToSelector, FilteringModule, FunctionObject, GroundingModule, LlmModelDetails, LlmModelParams, MaskingModule, OrchestrationClient, OrchestrationConfigRef, OrchestrationEmbeddingClient, OrchestrationEmbeddingResponse, OrchestrationErrorResponse, OrchestrationModuleConfig, OrchestrationResponse, OrchestrationStream, OrchestrationStreamChunkResponse, OrchestrationStreamResponse, PromptTemplatingModule, SystemChatMessage, ToolChatMessage, TranslationApplyToCategory, TranslationInputParameters, TranslationModule, TranslationOutputParameters, TranslationTargetLanguage, UserChatMessage, buildAzureContentSafetyFilter, buildDocumentGroundingConfig, buildDpiMaskingProvider, buildLlamaGuard38BFilter, buildTranslationConfig } from '@sap-ai-sdk/orchestration';
5
+ import { OrchestrationModuleConfig, FilteringModule, GroundingModule, MaskingModule, OrchestrationConfigRef, ChatCompletionTool, TranslationModule, ChatModel } from '@sap-ai-sdk/orchestration';
6
+ export { AssistantChatMessage, ChatCompletionRequest, ChatCompletionTool, ChatMessage, ChatMessageContent, ChatMessages, Citation, DeveloperChatMessage, DocumentTranslationApplyToSelector, FileContent, FilteringModule, FunctionObject, GroundingModule, ImageContentUrl, LlmModelDetails, LlmModelParams, MaskingModule, OrchestrationClient, OrchestrationConfigRef, OrchestrationEmbeddingClient, OrchestrationEmbeddingResponse, OrchestrationError, OrchestrationErrorResponse, OrchestrationModuleConfig, OrchestrationModuleConfigList, OrchestrationResponse, OrchestrationStream, OrchestrationStreamChunkResponse, OrchestrationStreamResponse, PromptTemplatingModule, SystemChatMessage, ToolChatMessage, TranslationApplyToCategory, TranslationInputParameters, TranslationModule, TranslationOutputParameters, TranslationTargetLanguage, UserChatMessage, UserChatMessageContent, UserChatMessageContentItem, buildAzureContentSafetyFilter, buildDocumentGroundingConfig, buildDpiMaskingProvider, buildLlamaGuard38BFilter, buildTranslationConfig } from '@sap-ai-sdk/orchestration';
7
7
  import * as _ai_sdk_provider_utils from '@ai-sdk/provider-utils';
8
8
  import { InferSchema } from '@ai-sdk/provider-utils';
9
9
 
@@ -117,6 +117,23 @@ interface OrchestrationModelSettings {
117
117
  readonly api?: "orchestration";
118
118
  /** @default true */
119
119
  readonly escapeTemplatePlaceholders?: boolean;
120
+ /**
121
+ * Additional module configurations for prompt module fallback.
122
+ * The SDK tries the primary configuration first, then each fallback in order until one succeeds.
123
+ * Each entry is a full `OrchestrationModuleConfig` with its own model, prompt, and modules.
124
+ * @example
125
+ * ```ts
126
+ * fallbackModuleConfigs: [
127
+ * {
128
+ * promptTemplating: {
129
+ * model: { name: "gpt-4.1-mini" },
130
+ * prompt: { template: [] },
131
+ * },
132
+ * },
133
+ * ]
134
+ * ```
135
+ */
136
+ readonly fallbackModuleConfigs?: OrchestrationModuleConfig[];
120
137
  readonly filtering?: FilteringModule;
121
138
  readonly grounding?: GroundingModule;
122
139
  /** @default false */
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import {createRequire as __createRequire} from 'module';var require=__createRequ
2
2
  import {
3
3
  escapeOrchestrationPlaceholders,
4
4
  unescapeOrchestrationPlaceholders
5
- } from "./chunk-SD6CRCHX.js";
5
+ } from "./chunk-DQXZH6CW.js";
6
6
  import {
7
7
  ApiSwitchError,
8
8
  SAP_AI_PROVIDER_NAME,
@@ -16,7 +16,7 @@ import {
16
16
  sapAILanguageModelProviderOptions,
17
17
  validateEmbeddingModelParamsSettings,
18
18
  validateModelParamsSettings
19
- } from "./chunk-O6ASHXPO.js";
19
+ } from "./chunk-DBAIFR3B.js";
20
20
 
21
21
  // src/sap-ai-adapters-v3-to-v2.ts
22
22
  function convertFinishReasonToV2(internalFinishReason) {
@@ -272,21 +272,21 @@ function getOrCreateLanguageModelStrategy(api) {
272
272
  async function createEmbeddingModelStrategy(api) {
273
273
  if (api === "foundation-models") {
274
274
  const { AzureOpenAiEmbeddingClient } = await import("@sap-ai-sdk/foundation-models");
275
- const { FoundationModelsEmbeddingModelStrategy } = await import("./foundation-models-embedding-model-strategy-XJV5REFR.js");
275
+ const { FoundationModelsEmbeddingModelStrategy } = await import("./foundation-models-embedding-model-strategy-XLD3PGCK.js");
276
276
  return new FoundationModelsEmbeddingModelStrategy(AzureOpenAiEmbeddingClient);
277
277
  }
278
278
  const { OrchestrationEmbeddingClient: OrchestrationEmbeddingClient2 } = await import("@sap-ai-sdk/orchestration");
279
- const { OrchestrationEmbeddingModelStrategy } = await import("./orchestration-embedding-model-strategy-3GIX5HAR.js");
279
+ const { OrchestrationEmbeddingModelStrategy } = await import("./orchestration-embedding-model-strategy-6BKD5NW7.js");
280
280
  return new OrchestrationEmbeddingModelStrategy(OrchestrationEmbeddingClient2);
281
281
  }
282
282
  async function createLanguageModelStrategy(api) {
283
283
  if (api === "foundation-models") {
284
284
  const { AzureOpenAiChatClient } = await import("@sap-ai-sdk/foundation-models");
285
- const { FoundationModelsLanguageModelStrategy } = await import("./foundation-models-language-model-strategy-X6VNJZFG.js");
285
+ const { FoundationModelsLanguageModelStrategy } = await import("./foundation-models-language-model-strategy-SNBZBWX4.js");
286
286
  return new FoundationModelsLanguageModelStrategy(AzureOpenAiChatClient);
287
287
  }
288
288
  const { OrchestrationClient: OrchestrationClient2 } = await import("@sap-ai-sdk/orchestration");
289
- const { OrchestrationLanguageModelStrategy } = await import("./orchestration-language-model-strategy-GYBTFP2F.js");
289
+ const { OrchestrationLanguageModelStrategy } = await import("./orchestration-language-model-strategy-OYSEPGQG.js");
290
290
  return new OrchestrationLanguageModelStrategy(OrchestrationClient2);
291
291
  }
292
292
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sap-ai-adapters-v3-to-v2.ts","../src/sap-ai-embedding-model.ts","../src/sap-ai-strategy.ts","../src/sap-ai-validation.ts","../src/sap-ai-embedding-model-v2.ts","../src/sap-ai-language-model.ts","../src/sap-ai-language-model-v2.ts","../src/sap-ai-provider-v2.ts","../src/sap-ai-settings.ts","../src/index-v2.ts"],"sourcesContent":["/** Adapters to convert internal (V3) formats to LanguageModelV2 formats for the V2 facade. */\n\nimport type {\n LanguageModelV3FinishReason as InternalFinishReason,\n LanguageModelV3StreamPart as InternalStreamPart,\n LanguageModelV3Usage as InternalUsage,\n SharedV3Warning as InternalWarning,\n LanguageModelV2CallWarning,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2ProviderMetadata,\n SharedV3ProviderMetadata,\n} from \"@ai-sdk/provider\";\n\n/**\n * Converts internal finish reason to V2 format.\n * @param internalFinishReason - Internal finish reason object `{ unified, raw? }`.\n * @returns V2 finish reason string.\n * @internal\n */\nexport function convertFinishReasonToV2(\n internalFinishReason: InternalFinishReason,\n): LanguageModelV2FinishReason {\n return internalFinishReason.unified;\n}\n\n/**\n * Converts V3 provider metadata to V2 format.\n *\n * Both are `Record<string, Record<string, JSONValue>>` compatible; cast for type safety.\n * @param metadata - V3 provider metadata.\n * @returns V2 provider metadata.\n * @internal\n */\nexport function convertProviderMetadataToV2(\n metadata: SharedV3ProviderMetadata | undefined,\n): SharedV2ProviderMetadata | undefined {\n return metadata as SharedV2ProviderMetadata | undefined;\n}\n\n/**\n * Converts internal stream part to V2 format.\n *\n * Handles all V3→V2 semantic differences explicitly:\n * - `file`: removes V3-only `providerMetadata`\n * - `finish`: converts `usage`, `finishReason`, casts `providerMetadata`\n * - `stream-start`: converts `warnings` array\n * - `tool-approval-request`: V3-only, returns `null`\n * - `tool-call`: removes V3-only `dynamic`\n * - `tool-input-start`: removes V3-only `dynamic`, `title`\n * - `tool-result`: maps `dynamic` → `providerExecuted`, removes `preliminary`\n * - `source`: casts `providerMetadata`\n * - `response-metadata`: identical structure, passthrough\n * - `text-*`, `reasoning-*`, `tool-input-delta`, `tool-input-end`: casts `providerMetadata`\n * - `raw`, `error`: identical structure, passthrough\n * @param internalPart - Internal stream part.\n * @returns V2 stream part, or `null` if no V2 equivalent exists.\n * @internal\n */\nexport function convertStreamPartToV2(\n internalPart: InternalStreamPart,\n): LanguageModelV2StreamPart | null {\n switch (internalPart.type) {\n case \"error\":\n return {\n error: internalPart.error,\n type: \"error\",\n };\n\n case \"file\":\n return {\n data: internalPart.data,\n mediaType: internalPart.mediaType,\n type: \"file\",\n };\n\n case \"finish\":\n return {\n finishReason: convertFinishReasonToV2(internalPart.finishReason),\n type: \"finish\",\n usage: convertUsageToV2(internalPart.usage),\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"raw\":\n return {\n rawValue: internalPart.rawValue,\n type: \"raw\",\n };\n\n case \"reasoning-delta\":\n return {\n delta: internalPart.delta,\n id: internalPart.id,\n type: \"reasoning-delta\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"reasoning-end\":\n return {\n id: internalPart.id,\n type: \"reasoning-end\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"reasoning-start\":\n return {\n id: internalPart.id,\n type: \"reasoning-start\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"response-metadata\":\n return {\n id: internalPart.id,\n modelId: internalPart.modelId,\n timestamp: internalPart.timestamp,\n type: \"response-metadata\",\n };\n\n case \"source\":\n if (internalPart.sourceType === \"url\") {\n return {\n id: internalPart.id,\n sourceType: \"url\",\n title: internalPart.title,\n type: \"source\",\n url: internalPart.url,\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n }\n return {\n filename: internalPart.filename,\n id: internalPart.id,\n mediaType: internalPart.mediaType,\n sourceType: \"document\",\n title: internalPart.title,\n type: \"source\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"stream-start\":\n return {\n type: \"stream-start\",\n warnings: convertWarningsToV2(internalPart.warnings),\n };\n\n case \"text-delta\":\n return {\n delta: internalPart.delta,\n id: internalPart.id,\n type: \"text-delta\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"text-end\":\n return {\n id: internalPart.id,\n type: \"text-end\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"text-start\":\n return {\n id: internalPart.id,\n type: \"text-start\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"tool-approval-request\":\n return null;\n\n case \"tool-call\":\n return {\n input: internalPart.input,\n toolCallId: internalPart.toolCallId,\n toolName: internalPart.toolName,\n type: \"tool-call\",\n ...(internalPart.providerExecuted !== undefined && {\n providerExecuted: internalPart.providerExecuted,\n }),\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"tool-input-delta\":\n return {\n delta: internalPart.delta,\n id: internalPart.id,\n type: \"tool-input-delta\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"tool-input-end\":\n return {\n id: internalPart.id,\n type: \"tool-input-end\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"tool-input-start\":\n return {\n id: internalPart.id,\n toolName: internalPart.toolName,\n type: \"tool-input-start\",\n ...(internalPart.providerExecuted !== undefined && {\n providerExecuted: internalPart.providerExecuted,\n }),\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"tool-result\":\n return {\n result: internalPart.result,\n toolCallId: internalPart.toolCallId,\n toolName: internalPart.toolName,\n type: \"tool-result\",\n ...(internalPart.isError !== undefined && { isError: internalPart.isError }),\n ...(internalPart.dynamic !== undefined && { providerExecuted: internalPart.dynamic }),\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n }\n}\n\n/**\n * Converts internal usage (nested format) to V2 usage (flat format).\n * @param internalUsage - Internal usage object with nested `inputTokens`/`outputTokens`.\n * @returns V2 usage object with flat token counts.\n * @internal\n */\nexport function convertUsageToV2(internalUsage: InternalUsage): LanguageModelV2Usage {\n return {\n cachedInputTokens: internalUsage.inputTokens.cacheRead,\n inputTokens: internalUsage.inputTokens.total,\n outputTokens: internalUsage.outputTokens.total,\n reasoningTokens: internalUsage.outputTokens.reasoning,\n totalTokens:\n internalUsage.inputTokens.total !== undefined &&\n internalUsage.outputTokens.total !== undefined\n ? internalUsage.inputTokens.total + internalUsage.outputTokens.total\n : undefined,\n };\n}\n\n/**\n * Converts internal warnings array to V2 warnings array.\n * @param internalWarnings - Internal warning objects.\n * @returns V2 warning objects.\n * @internal\n */\nexport function convertWarningsToV2(\n internalWarnings: InternalWarning[],\n): LanguageModelV2CallWarning[] {\n return internalWarnings.map(convertWarningToV2);\n}\n\n/**\n * Converts internal warning to V2 warning format.\n *\n * Maps `unsupported`/`compatibility` warnings to V2 `other` type with descriptive message.\n * @param internalWarning - Internal warning object.\n * @returns V2 warning object.\n * @internal\n */\nexport function convertWarningToV2(internalWarning: InternalWarning): LanguageModelV2CallWarning {\n if (internalWarning.type === \"unsupported\") {\n return {\n message: internalWarning.details\n ? `Unsupported feature: ${internalWarning.feature}. ${internalWarning.details}`\n : `Unsupported feature: ${internalWarning.feature}`,\n type: \"other\",\n };\n }\n\n if (internalWarning.type === \"compatibility\") {\n return {\n message: internalWarning.details\n ? `Compatibility mode: ${internalWarning.feature}. ${internalWarning.details}`\n : `Compatibility mode: ${internalWarning.feature}`,\n type: \"other\",\n };\n }\n\n return {\n message: internalWarning.message,\n type: \"other\",\n };\n}\n\n/**\n * Transforms internal stream to V2 ReadableStream.\n * @param internalStream - Internal ReadableStream to transform.\n * @returns V2-formatted ReadableStream.\n * @internal\n */\nexport function createV2StreamFromInternal(\n internalStream: ReadableStream<InternalStreamPart>,\n): ReadableStream<LanguageModelV2StreamPart> {\n return internalStream.pipeThrough(\n new TransformStream<InternalStreamPart, LanguageModelV2StreamPart>({\n transform(chunk, controller) {\n const converted = convertStreamPartToV2(chunk);\n if (converted != null) {\n controller.enqueue(converted);\n }\n },\n }),\n );\n}\n","/**\n * SAP AI Embedding Model - Vercel AI SDK EmbeddingModelV3 implementation for SAP AI Core.\n *\n * This module provides the embedding model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) to generate vector embeddings.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed | Vercel AI SDK embed()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed-many | Vercel AI SDK embedMany()}\n */\nimport type {\n EmbeddingModelV3,\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\n\nimport type { SAPAIApiType, SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport {\n getProviderName,\n sapAIEmbeddingProviderOptions,\n validateEmbeddingModelParamsSettings,\n} from \"./sap-ai-provider-options.js\";\nimport {\n type EmbeddingModelStrategyConfig,\n getOrCreateEmbeddingModelStrategy,\n} from \"./sap-ai-strategy.js\";\nimport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\nconst DEFAULT_MAX_EMBEDDINGS_PER_CALL = 2048;\n\n/**\n * Model identifier for SAP AI embedding models.\n *\n * Common embedding model IDs include:\n * - `\"text-embedding-3-small\"` - OpenAI small embedding model (recommended)\n * - `\"text-embedding-3-large\"` - OpenAI large embedding model\n *\n * The actual available models depend on your SAP AI Core deployment configuration.\n * @see {@link https://help.sap.com/docs/sap-ai-core | SAP AI Core Documentation}\n */\nexport type SAPAIEmbeddingModelId = string;\n\n/** @internal */\ninterface SAPAIEmbeddingModelConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n}\n\n/**\n * SAP AI Core Embedding Model implementing Vercel AI SDK EmbeddingModelV3.\n *\n * This class provides embedding generation capabilities through SAP AI Core,\n * supporting both the Orchestration API and Foundation Models API.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider\";\n * import { embed, embedMany } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const embeddingModel = provider.embedding(\"text-embedding-3-small\");\n *\n * // Single embedding\n * const { embedding } = await embed({\n * model: embeddingModel,\n * value: \"Hello, world!\",\n * });\n *\n * // Multiple embeddings\n * const { embeddings } = await embedMany({\n * model: embeddingModel,\n * values: [\"Hello\", \"World\"],\n * });\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/embeddings | Vercel AI SDK Embeddings}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAIEmbeddingModel implements EmbeddingModelV3 {\n readonly maxEmbeddingsPerCall: number;\n readonly modelId: string;\n readonly provider: string;\n readonly specificationVersion = \"v3\" as const;\n readonly supportsParallelCalls: boolean = true;\n\n private readonly config: SAPAIEmbeddingModelConfig;\n private readonly settings: SAPAIEmbeddingSettings;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(\n modelId: SAPAIEmbeddingModelId,\n settings: SAPAIEmbeddingSettings = {},\n config: SAPAIEmbeddingModelConfig,\n ) {\n if (settings.modelParams) {\n validateEmbeddingModelParamsSettings(settings.modelParams);\n }\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n this.provider = config.provider;\n this.maxEmbeddingsPerCall = settings.maxEmbeddingsPerCall ?? DEFAULT_MAX_EMBEDDINGS_PER_CALL;\n }\n\n async doEmbed(options: EmbeddingModelV3CallOptions): Promise<EmbeddingModelV3Result> {\n const providerName = getProviderName(this.config.provider);\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAIEmbeddingProviderOptions,\n });\n\n const effectiveApi = resolveApi(this.config.providerApi, this.settings.api, sapOptions?.api);\n\n validateSettings({\n api: effectiveApi,\n embeddingSettings: this.settings,\n invocationSettings: sapOptions ? { api: sapOptions.api } : undefined,\n modelApi: this.settings.api,\n });\n\n const strategy = await getOrCreateEmbeddingModelStrategy(effectiveApi);\n\n const strategyConfig: EmbeddingModelStrategyConfig = {\n deploymentConfig: this.config.deploymentConfig,\n destination: this.config.destination,\n modelId: this.modelId,\n provider: this.config.provider,\n };\n\n return strategy.doEmbed(strategyConfig, this.settings, options, this.maxEmbeddingsPerCall);\n }\n}\n","/** Strategy pattern infrastructure for SAP AI Core API support. */\nimport type {\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type {\n SAPAIApiType,\n SAPAIEmbeddingSettings,\n SAPAIModelSettings,\n} from \"./sap-ai-settings.js\";\n\n/** @internal */\nexport interface EmbeddingModelAPIStrategy {\n doEmbed(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n options: EmbeddingModelV3CallOptions,\n maxEmbeddingsPerCall: number,\n ): Promise<EmbeddingModelV3Result>;\n}\n\n/** @internal */\nexport interface EmbeddingModelStrategyConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly modelId: string;\n readonly provider: string;\n}\n\n/**\n * Strategy interface for language model API implementations.\n * @template TSettings - The model settings type, defaults to SAPAIModelSettings for backward compatibility\n * @internal\n */\nexport interface LanguageModelAPIStrategy<\n TSettings extends SAPAIModelSettings = SAPAIModelSettings,\n> {\n doGenerate(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult>;\n\n doStream(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult>;\n}\n\n/** @internal */\nexport interface LanguageModelStrategyConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly modelId: string;\n readonly provider: string;\n}\n\n/** @internal */\nconst languageModelStrategyCache = new Map<SAPAIApiType, Promise<LanguageModelAPIStrategy>>();\n\n/** @internal */\nconst embeddingModelStrategyCache = new Map<SAPAIApiType, Promise<EmbeddingModelAPIStrategy>>();\n\n/** @internal */\nexport function clearStrategyCaches(): void {\n languageModelStrategyCache.clear();\n embeddingModelStrategyCache.clear();\n}\n\n/**\n * @returns Embedding model strategy cache size.\n * @internal\n */\nexport function getEmbeddingModelStrategyCacheSize(): number {\n return embeddingModelStrategyCache.size;\n}\n\n/**\n * @returns Language model strategy cache size.\n * @internal\n */\nexport function getLanguageModelStrategyCacheSize(): number {\n return languageModelStrategyCache.size;\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Embedding model strategy.\n * @internal\n */\nexport function getOrCreateEmbeddingModelStrategy(\n api: SAPAIApiType,\n): Promise<EmbeddingModelAPIStrategy> {\n const cached = embeddingModelStrategyCache.get(api);\n if (cached) {\n return cached;\n }\n\n // Cache the Promise synchronously before any await to prevent race conditions\n const strategyPromise = createEmbeddingModelStrategy(api);\n embeddingModelStrategyCache.set(api, strategyPromise);\n\n strategyPromise.catch(() => {\n embeddingModelStrategyCache.delete(api);\n });\n\n return strategyPromise;\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Language model strategy.\n * @internal\n */\nexport function getOrCreateLanguageModelStrategy(\n api: SAPAIApiType,\n): Promise<LanguageModelAPIStrategy> {\n const cached = languageModelStrategyCache.get(api);\n if (cached) {\n return cached;\n }\n\n // Cache the Promise synchronously before any await to prevent race conditions\n const strategyPromise = createLanguageModelStrategy(api);\n languageModelStrategyCache.set(api, strategyPromise);\n\n strategyPromise.catch(() => {\n languageModelStrategyCache.delete(api);\n });\n\n return strategyPromise;\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Embedding model strategy.\n */\nasync function createEmbeddingModelStrategy(api: SAPAIApiType): Promise<EmbeddingModelAPIStrategy> {\n if (api === \"foundation-models\") {\n const { AzureOpenAiEmbeddingClient } = await import(\"@sap-ai-sdk/foundation-models\");\n const { FoundationModelsEmbeddingModelStrategy } =\n await import(\"./foundation-models-embedding-model-strategy.js\");\n return new FoundationModelsEmbeddingModelStrategy(AzureOpenAiEmbeddingClient);\n }\n\n const { OrchestrationEmbeddingClient } = await import(\"@sap-ai-sdk/orchestration\");\n const { OrchestrationEmbeddingModelStrategy } =\n await import(\"./orchestration-embedding-model-strategy.js\");\n return new OrchestrationEmbeddingModelStrategy(OrchestrationEmbeddingClient);\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Language model strategy.\n */\nasync function createLanguageModelStrategy(api: SAPAIApiType): Promise<LanguageModelAPIStrategy> {\n if (api === \"foundation-models\") {\n const { AzureOpenAiChatClient } = await import(\"@sap-ai-sdk/foundation-models\");\n const { FoundationModelsLanguageModelStrategy } =\n await import(\"./foundation-models-language-model-strategy.js\");\n return new FoundationModelsLanguageModelStrategy(AzureOpenAiChatClient);\n }\n\n const { OrchestrationClient } = await import(\"@sap-ai-sdk/orchestration\");\n const { OrchestrationLanguageModelStrategy } =\n await import(\"./orchestration-language-model-strategy.js\");\n return new OrchestrationLanguageModelStrategy(OrchestrationClient);\n}\n","/** Validation and resolution functions for SAP AI API-specific features. */\nimport type {\n FoundationModelsModelSettings,\n OrchestrationModelSettings,\n SAPAIApiType,\n SAPAIEmbeddingSettings,\n SAPAIModelSettings,\n SAPAISettings,\n} from \"./sap-ai-settings.js\";\n\nimport { deepMerge } from \"./deep-merge.js\";\nimport { ApiSwitchError, UnsupportedFeatureError } from \"./sap-ai-error.js\";\n\n/**\n * Type guard for Foundation Models API settings.\n * @param settings - Settings to check.\n * @returns True if settings are for Foundation Models API.\n */\nexport function isFoundationModelsSettings(\n settings: SAPAIModelSettings | SAPAISettings,\n): settings is FoundationModelsModelSettings {\n return settings.api === \"foundation-models\";\n}\n\n/**\n * Type guard for Orchestration API settings.\n * @param settings - Settings to check.\n * @returns True if settings are for Orchestration API.\n */\nexport function isOrchestrationSettings(\n settings: SAPAIModelSettings | SAPAISettings,\n): settings is OrchestrationModelSettings {\n return settings.api === undefined || settings.api === \"orchestration\";\n}\n\n/**\n * Validates escapeTemplatePlaceholders option based on API type.\n *\n * Jinja2 template escaping is only supported by the Orchestration API.\n * @param api - SAP AI API type.\n * @param escapeTemplatePlaceholders - Whether to escape template placeholders.\n * @throws {UnsupportedFeatureError} When escapeTemplatePlaceholders is true with Foundation Models API.\n * @internal\n */\nfunction validateEscapeTemplatePlaceholders(\n api: SAPAIApiType,\n escapeTemplatePlaceholders: boolean | undefined,\n): void {\n if (api === \"foundation-models\" && escapeTemplatePlaceholders === true) {\n throw new UnsupportedFeatureError(\n ESCAPE_TEMPLATE_PLACEHOLDERS_DESCRIPTION,\n \"foundation-models\",\n \"orchestration\",\n );\n }\n}\n\n/**\n * Validates that Foundation Models-only options are not used with Orchestration API.\n *\n * Foundation Models-only features:\n * - `dataSources` - Azure On Your Data configuration\n * @param settings - Settings to validate.\n * @throws {UnsupportedFeatureError} When dataSources is set with Orchestration API.\n * @internal\n */\nfunction validateFoundationModelsOnlyOptions(\n settings: SAPAIModelSettings | SAPAISettings | undefined,\n): void {\n if (!settings) return;\n\n const fmSettings = settings as FoundationModelsModelSettings;\n\n for (const feature of FOUNDATION_MODELS_ONLY_FEATURE_KEYS) {\n if (fmSettings[feature] !== undefined) {\n throw new UnsupportedFeatureError(\n FOUNDATION_MODELS_ONLY_FEATURES[feature],\n \"orchestration\",\n \"foundation-models\",\n );\n }\n }\n}\n\n/**\n * Validates that Orchestration-only embedding options are not used with Foundation Models API.\n *\n * Orchestration-only embedding features:\n * - `masking` - Data masking module\n * @param settings - Embedding settings to validate.\n * @throws {UnsupportedFeatureError} When masking is set with Foundation Models API.\n * @internal\n */\nfunction validateOrchestrationOnlyEmbeddingOptions(\n settings: SAPAIEmbeddingSettings | undefined,\n): void {\n if (!settings) return;\n\n for (const feature of ORCHESTRATION_ONLY_EMBEDDING_FEATURE_KEYS) {\n if (settings[feature] !== undefined) {\n throw new UnsupportedFeatureError(\n ORCHESTRATION_ONLY_EMBEDDING_FEATURES[feature],\n \"foundation-models\",\n \"orchestration\",\n );\n }\n }\n}\n\n/**\n * Validates that Orchestration-only options are not used with Foundation Models API.\n *\n * Orchestration-only features:\n * - `filtering` - Content filtering module\n * - `grounding` - Document grounding module\n * - `masking` - Data masking module\n * - `orchestrationConfigRef` - Prompt Registry configuration reference\n * - `placeholderValues` - Jinja2 template placeholder values\n * - `promptTemplateRef` - Prompt Registry template reference\n * - `tools` - SAP-format tool definitions (use AI SDK tools instead)\n * - `translation` - Translation module\n * @param settings - Settings to validate.\n * @throws {UnsupportedFeatureError} When any Orchestration-only feature is set with Foundation Models API.\n * @internal\n */\nfunction validateOrchestrationOnlyOptions(\n settings: SAPAIModelSettings | SAPAISettings | undefined,\n): void {\n if (!settings) return;\n\n const orchSettings = settings as OrchestrationModelSettings;\n\n for (const feature of ORCHESTRATION_ONLY_FEATURE_KEYS) {\n if (orchSettings[feature] !== undefined) {\n throw new UnsupportedFeatureError(\n ORCHESTRATION_ONLY_FEATURES[feature],\n \"foundation-models\",\n \"orchestration\",\n );\n }\n }\n}\n\n/**\n * Keys for Orchestration-only features.\n * @internal\n */\nconst ORCHESTRATION_ONLY_FEATURE_KEYS = [\n \"filtering\",\n \"grounding\",\n \"masking\",\n \"orchestrationConfigRef\",\n \"placeholderValues\",\n \"promptTemplateRef\",\n \"streamOptions\",\n \"tools\",\n \"translation\",\n] as const;\n\n/**\n * Mapping of Orchestration-only feature keys to human-readable descriptions.\n * Used for generating consistent error messages.\n * @internal\n */\nconst ORCHESTRATION_ONLY_FEATURES: Readonly<\n Record<(typeof ORCHESTRATION_ONLY_FEATURE_KEYS)[number], string>\n> = {\n filtering: \"Content filtering\",\n grounding: \"Document grounding\",\n masking: \"Data masking\",\n orchestrationConfigRef: \"Orchestration config reference (orchestrationConfigRef)\",\n placeholderValues: \"Placeholder values (placeholderValues)\",\n promptTemplateRef: \"Prompt template reference (promptTemplateRef)\",\n streamOptions: \"Stream options for post-LLM modules\",\n tools: \"SAP-format tool definitions (use AI SDK tools instead)\",\n translation: \"Translation\",\n} as const;\n\n/**\n * Keys for Foundation Models-only features.\n * @internal\n */\nconst FOUNDATION_MODELS_ONLY_FEATURE_KEYS = [\"dataSources\"] as const;\n\n/**\n * Mapping of Foundation Models-only feature keys to human-readable descriptions.\n * Used for generating consistent error messages.\n * @internal\n */\nconst FOUNDATION_MODELS_ONLY_FEATURES: Readonly<\n Record<(typeof FOUNDATION_MODELS_ONLY_FEATURE_KEYS)[number], string>\n> = {\n dataSources: \"Azure On Your Data (dataSources)\",\n} as const;\n\n/**\n * Subset of Orchestration-only features that can be set at invocation level.\n * @internal\n */\nconst ORCHESTRATION_ONLY_INVOCATION_FEATURE_KEYS = [\n \"orchestrationConfigRef\",\n \"placeholderValues\",\n \"promptTemplateRef\",\n] as const;\n\n/**\n * Keys for Orchestration-only embedding features.\n * @internal\n */\nconst ORCHESTRATION_ONLY_EMBEDDING_FEATURE_KEYS = [\"masking\"] as const;\n\n/**\n * Mapping of Orchestration-only embedding feature keys to human-readable descriptions.\n * Uses the same descriptions as the main ORCHESTRATION_ONLY_FEATURES for consistency.\n * @internal\n */\nconst ORCHESTRATION_ONLY_EMBEDDING_FEATURES: Readonly<\n Record<(typeof ORCHESTRATION_ONLY_EMBEDDING_FEATURE_KEYS)[number], string>\n> = {\n masking: ORCHESTRATION_ONLY_FEATURES.masking,\n} as const;\n\n/**\n * Human-readable description for escapeTemplatePlaceholders feature.\n * Used for generating consistent error messages.\n * @internal\n */\nconst ESCAPE_TEMPLATE_PLACEHOLDERS_DESCRIPTION =\n \"escapeTemplatePlaceholders (Jinja2 template escaping)\";\n\n/**\n * Validates that switching APIs at invocation time is allowed.\n *\n * API switching is blocked when the model was configured with features\n * that are specific to one API and incompatible with the target API.\n * @param fromApi - Source API type (configured at model creation).\n * @param toApi - Target API type (requested at invocation time).\n * @param modelSettings - Model settings to validate for conflicts.\n * @throws {ApiSwitchError} When the model has features incompatible with the target API.\n * @internal\n */\nfunction validateApiSwitch(\n fromApi: SAPAIApiType,\n toApi: SAPAIApiType,\n modelSettings: SAPAIModelSettings | SAPAISettings | undefined,\n): void {\n if (fromApi === toApi) return;\n if (!modelSettings) return;\n\n if (fromApi === \"orchestration\" && toApi === \"foundation-models\") {\n const orchSettings = modelSettings as OrchestrationModelSettings;\n\n for (const feature of ORCHESTRATION_ONLY_FEATURE_KEYS) {\n if (orchSettings[feature] !== undefined) {\n throw new ApiSwitchError(fromApi, toApi, feature);\n }\n }\n }\n\n if (fromApi === \"foundation-models\" && toApi === \"orchestration\") {\n const fmSettings = modelSettings as FoundationModelsModelSettings;\n\n for (const feature of FOUNDATION_MODELS_ONLY_FEATURE_KEYS) {\n if (fmSettings[feature] !== undefined) {\n throw new ApiSwitchError(fromApi, toApi, feature);\n }\n }\n }\n}\n\n/**\n * @internal\n */\nconst VALID_API_TYPES: readonly SAPAIApiType[] = [\"orchestration\", \"foundation-models\"];\n\n/** Options for the main validation function. */\nexport interface ValidateSettingsOptions {\n readonly api: SAPAIApiType;\n readonly embeddingSettings?: SAPAIEmbeddingSettings;\n readonly invocationSettings?: {\n readonly api?: SAPAIApiType;\n readonly escapeTemplatePlaceholders?: boolean;\n readonly orchestrationConfigRef?: unknown;\n readonly placeholderValues?: unknown;\n readonly promptTemplateRef?: unknown;\n };\n readonly modelApi?: SAPAIApiType;\n readonly modelSettings?: SAPAIModelSettings | SAPAISettings;\n}\n\n/**\n * Gets the effective escapeTemplatePlaceholders value based on API and settings.\n * @param api - SAP AI API type.\n * @param modelSettings - Model settings.\n * @param invocationEscape - Invocation-level escape setting.\n * @returns Effective escapeTemplatePlaceholders value.\n */\nexport function getEffectiveEscapeTemplatePlaceholders(\n api: SAPAIApiType,\n modelSettings: SAPAIModelSettings | SAPAISettings | undefined,\n invocationEscape: boolean | undefined,\n): boolean {\n if (api === \"foundation-models\") {\n return false;\n }\n\n if (invocationEscape !== undefined) {\n return invocationEscape;\n }\n\n const modelValue = (modelSettings as OrchestrationModelSettings | undefined)\n ?.escapeTemplatePlaceholders;\n if (modelValue !== undefined) {\n return modelValue;\n }\n\n return true;\n}\n\n/**\n * Merges settings with proper API precedence (callSettings > defaultSettings > fallbackApi).\n * @param defaultSettings - Provider-level default settings.\n * @param callSettings - Per-call settings that override defaults.\n * @param fallbackApi - Fallback API type when neither settings specify one.\n * @returns Merged settings with correct API precedence.\n * @internal\n */\nexport function mergeSettingsWithApi<T extends { api?: string }>(\n defaultSettings: Record<string, unknown> | undefined,\n callSettings: Partial<T>,\n fallbackApi: string,\n): T {\n return {\n ...deepMerge(defaultSettings, callSettings as Record<string, unknown>),\n api: callSettings.api ?? (defaultSettings?.api as string | undefined) ?? fallbackApi,\n } as T;\n}\n\n/**\n * Resolves the effective API type using the full precedence chain.\n * @param providerApi - Provider-level API type.\n * @param modelApi - Model-level API type.\n * @param invocationApi - Invocation-level API type.\n * @returns Resolved API type.\n */\nexport function resolveApi(\n providerApi: SAPAIApiType | undefined,\n modelApi: SAPAIApiType | undefined,\n invocationApi: SAPAIApiType | undefined,\n): SAPAIApiType {\n return invocationApi ?? modelApi ?? providerApi ?? \"orchestration\";\n}\n\n/**\n * Validates that the API value is a valid SAPAIApiType.\n * @param api - API value to validate.\n */\nexport function validateApiInput(api: unknown): void {\n if (api === undefined) return;\n\n if (typeof api !== \"string\" || !VALID_API_TYPES.includes(api as SAPAIApiType)) {\n throw new Error(\n `Invalid API type: ${JSON.stringify(api)}. ` +\n `Valid values are: ${VALID_API_TYPES.map((t) => `\"${t}\"`).join(\", \")}`,\n );\n }\n}\n\n/**\n * Main validation function that performs all API-specific validations.\n *\n * This function orchestrates all validation checks:\n * 1. Validates API type inputs\n * 2. Checks for API switching conflicts\n * 3. Validates API-specific feature usage\n * 4. Validates template placeholder escaping\n * @param options - Validation options.\n * @throws {Error} When an invalid API type is provided.\n * @throws {ApiSwitchError} When attempting to switch APIs with incompatible settings.\n * @throws {UnsupportedFeatureError} When using features not supported by the current API.\n * @see {@link ApiSwitchError}\n * @see {@link UnsupportedFeatureError}\n */\nexport function validateSettings(options: ValidateSettingsOptions): void {\n const { api, embeddingSettings, invocationSettings, modelApi, modelSettings } = options;\n\n validateApiInput(api);\n if (invocationSettings?.api !== undefined) {\n validateApiInput(invocationSettings.api);\n }\n\n if (invocationSettings?.api !== undefined) {\n const effectiveModelApi = modelApi ?? \"orchestration\";\n if (effectiveModelApi !== invocationSettings.api) {\n validateApiSwitch(effectiveModelApi, invocationSettings.api, modelSettings);\n }\n }\n\n if (api === \"foundation-models\") {\n validateOrchestrationOnlyOptions(modelSettings);\n validateOrchestrationOnlyInvocationOptions(invocationSettings);\n validateOrchestrationOnlyEmbeddingOptions(embeddingSettings);\n } else {\n validateFoundationModelsOnlyOptions(modelSettings);\n }\n\n const modelEscape = (modelSettings as OrchestrationModelSettings | undefined)\n ?.escapeTemplatePlaceholders;\n const invocationEscape = invocationSettings?.escapeTemplatePlaceholders;\n const effectiveEscape = invocationEscape ?? modelEscape;\n validateEscapeTemplatePlaceholders(api, effectiveEscape);\n}\n\n/**\n * Validates that Orchestration-only options are not passed at invocation level with Foundation Models API.\n * @param invocationSettings - Invocation-level settings to validate.\n * @throws {UnsupportedFeatureError} When any Orchestration-only feature is set at invocation level.\n * @internal\n */\nfunction validateOrchestrationOnlyInvocationOptions(\n invocationSettings: ValidateSettingsOptions[\"invocationSettings\"],\n): void {\n if (!invocationSettings) return;\n\n for (const feature of ORCHESTRATION_ONLY_INVOCATION_FEATURE_KEYS) {\n if (invocationSettings[feature] !== undefined) {\n throw new UnsupportedFeatureError(\n ORCHESTRATION_ONLY_FEATURES[feature],\n \"foundation-models\",\n \"orchestration\",\n );\n }\n }\n}\n","/**\n * SAP AI Embedding Model V2 - Vercel AI SDK EmbeddingModelV2 implementation for SAP AI Core.\n *\n * This module provides the embedding model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) to generate vector embeddings.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed | Vercel AI SDK embed()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed-many | Vercel AI SDK embedMany()}\n */\n\nimport type {\n EmbeddingModelV2,\n EmbeddingModelV3CallOptions as InternalCallOptions,\n SharedV3ProviderMetadata as InternalProviderMetadata,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n SharedV2ProviderOptions,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type { SAPAIApiType, SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport { convertWarningsToV2 } from \"./sap-ai-adapters-v3-to-v2.js\";\nimport { SAPAIEmbeddingModel } from \"./sap-ai-embedding-model.js\";\n\n/** @internal */\ninterface SAPAIEmbeddingModelV2Config {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n}\n\n/**\n * SAP AI Core Embedding Model implementing Vercel AI SDK EmbeddingModelV2.\n *\n * This class provides embedding generation capabilities through SAP AI Core,\n * supporting both the Orchestration API and Foundation Models API.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider-v2\";\n * import { embed, embedMany } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const embeddingModel = provider.textEmbeddingModel(\"text-embedding-3-small\");\n *\n * // Single embedding\n * const { embedding } = await embed({\n * model: embeddingModel,\n * value: \"Hello, world!\",\n * });\n *\n * // Multiple embeddings\n * const { embeddings } = await embedMany({\n * model: embeddingModel,\n * values: [\"Hello\", \"World\"],\n * });\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/embeddings | Vercel AI SDK Embeddings}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAIEmbeddingModelV2 implements EmbeddingModelV2<string> {\n readonly maxEmbeddingsPerCall: number;\n readonly modelId: string;\n readonly provider: string;\n readonly specificationVersion = \"v2\" as const;\n readonly supportsParallelCalls: boolean = true;\n\n /** @internal */\n private readonly internalModel: SAPAIEmbeddingModel;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(\n modelId: string,\n settings: SAPAIEmbeddingSettings,\n config: SAPAIEmbeddingModelV2Config,\n ) {\n this.internalModel = new SAPAIEmbeddingModel(modelId, settings, config);\n this.provider = this.internalModel.provider;\n this.modelId = this.internalModel.modelId;\n this.maxEmbeddingsPerCall = this.internalModel.maxEmbeddingsPerCall;\n this.supportsParallelCalls = this.internalModel.supportsParallelCalls;\n }\n\n async doEmbed(options: {\n abortSignal?: AbortSignal;\n headers?: Record<string, string | undefined>;\n providerOptions?: SharedV2ProviderOptions;\n values: string[];\n }): Promise<{\n embeddings: number[][];\n providerMetadata?: SharedV2ProviderMetadata;\n response?: {\n body?: unknown;\n headers?: SharedV2Headers;\n };\n usage?: { tokens: number };\n }> {\n // Normalize headers by removing entries with undefined values\n const normalizedHeaders: Record<string, string> | undefined = options.headers\n ? (Object.fromEntries(\n Object.entries(options.headers).filter(([, value]) => value !== undefined),\n ) as Record<string, string>)\n : undefined;\n\n // Map options for the internal model call\n const callOptions: InternalCallOptions = {\n abortSignal: options.abortSignal,\n headers: normalizedHeaders,\n providerOptions: options.providerOptions,\n values: options.values,\n };\n const result = await this.internalModel.doEmbed(callOptions);\n\n // Handle any warnings by logging them (V2 API doesn't support returning warnings)\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (result.warnings && result.warnings.length > 0) {\n const warnings = convertWarningsToV2(result.warnings);\n // Log warnings - convertWarningsToV2 normalizes all warnings to type \"other\" with message\n for (const warning of warnings) {\n if (warning.type === \"other\") {\n console.warn(`[SAP AI Embedding] ${warning.message}`);\n }\n }\n }\n\n // Return result in V2 format\n return {\n embeddings: result.embeddings,\n providerMetadata: castProviderMetadataToV2(result.providerMetadata),\n response: result.response\n ? {\n body: result.response.body,\n headers: result.response.headers as SharedV2Headers | undefined,\n }\n : undefined,\n usage: result.usage,\n };\n }\n}\n\n/**\n * Casts internal provider metadata to V2 format.\n * @param metadata - Internal provider metadata.\n * @returns V2 provider metadata.\n * @internal\n */\nfunction castProviderMetadataToV2(\n metadata: InternalProviderMetadata | undefined,\n): SharedV2ProviderMetadata | undefined {\n // Safe cast - SAP implementation uses conditional spreads to avoid undefined values\n return metadata as SharedV2ProviderMetadata | undefined;\n}\n","/**\n * SAP AI Language Model - Vercel AI SDK LanguageModelV3 implementation for SAP AI Core.\n *\n * This module provides the language model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) for chat completions and streaming.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/generate-text | Vercel AI SDK generateText()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/stream-text | Vercel AI SDK streamText()}\n */\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\n\nimport type { SAPAIApiType, SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\n\nimport {\n getProviderName,\n sapAILanguageModelProviderOptions,\n validateModelParamsSettings,\n} from \"./sap-ai-provider-options.js\";\nimport {\n getOrCreateLanguageModelStrategy,\n type LanguageModelAPIStrategy,\n type LanguageModelStrategyConfig,\n} from \"./sap-ai-strategy.js\";\nimport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\n/** @internal */\ninterface SAPAILanguageModelConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n}\n\n/**\n * SAP AI Language Model implementing Vercel AI SDK LanguageModelV3.\n *\n * This class provides chat completion and streaming capabilities through SAP AI Core,\n * supporting both the Orchestration API (with content filtering, grounding, masking,\n * and translation) and Foundation Models API (direct Azure OpenAI access).\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider\";\n * import { generateText, streamText } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const model = provider(\"gpt-4.1\");\n *\n * // Non-streaming\n * const { text } = await generateText({\n * model,\n * prompt: \"Hello!\",\n * });\n *\n * // Streaming\n * const result = streamText({\n * model,\n * prompt: \"Tell me a story\",\n * });\n *\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/generating-text | Vercel AI SDK Text Generation}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAILanguageModel implements LanguageModelV3 {\n readonly modelId: SAPAIModelId;\n readonly specificationVersion = \"v3\";\n readonly supportsImageUrls: boolean = true;\n readonly supportsMultipleCompletions: boolean = true;\n readonly supportsParallelToolCalls: boolean = true;\n readonly supportsStreaming: boolean = true;\n readonly supportsStructuredOutputs: boolean = true;\n readonly supportsToolCalls: boolean = true;\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls(): Record<string, RegExp[]> {\n return {\n \"image/*\": [/^https:\\/\\/.+$/i, /^data:image\\/.*$/],\n };\n }\n\n /** @internal */\n private readonly config: SAPAILanguageModelConfig;\n\n /** @internal */\n private readonly settings: SAPAISettings;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(modelId: SAPAIModelId, settings: SAPAISettings, config: SAPAILanguageModelConfig) {\n if (settings.modelParams) {\n validateModelParamsSettings(settings.modelParams);\n }\n this.settings = settings;\n this.config = config;\n this.modelId = modelId;\n }\n\n async doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult> {\n const { strategy, strategyConfig } = await this.prepareInvocation(options);\n return strategy.doGenerate(strategyConfig, this.settings, options);\n }\n\n async doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult> {\n const { strategy, strategyConfig } = await this.prepareInvocation(options);\n return strategy.doStream(strategyConfig, this.settings, options);\n }\n\n supportsUrl(url: URL): boolean {\n if (url.protocol === \"https:\") return true;\n if (url.protocol === \"data:\") {\n return /^data:image\\//i.test(url.href);\n }\n return false;\n }\n\n /**\n * Prepares common invocation context for doGenerate and doStream.\n * @param options - AI SDK call options.\n * @returns Strategy and configuration for the invocation.\n * @internal\n */\n private async prepareInvocation(options: LanguageModelV3CallOptions): Promise<{\n strategy: LanguageModelAPIStrategy;\n strategyConfig: LanguageModelStrategyConfig;\n }> {\n const providerName = getProviderName(this.config.provider);\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAILanguageModelProviderOptions,\n });\n\n const effectiveApi = resolveApi(this.config.providerApi, this.settings.api, sapOptions?.api);\n\n validateSettings({\n api: effectiveApi,\n invocationSettings: sapOptions\n ? {\n api: sapOptions.api,\n escapeTemplatePlaceholders: sapOptions.escapeTemplatePlaceholders,\n orchestrationConfigRef: sapOptions.orchestrationConfigRef,\n placeholderValues: sapOptions.placeholderValues,\n promptTemplateRef: sapOptions.promptTemplateRef,\n }\n : undefined,\n modelApi: this.settings.api,\n modelSettings: this.settings,\n });\n\n const strategy = await getOrCreateLanguageModelStrategy(effectiveApi);\n\n const strategyConfig: LanguageModelStrategyConfig = {\n deploymentConfig: this.config.deploymentConfig,\n destination: this.config.destination,\n modelId: this.modelId,\n provider: this.config.provider,\n };\n\n return { strategy, strategyConfig };\n }\n}\n","/**\n * SAP AI Language Model V2 - Vercel AI SDK LanguageModelV2 implementation for SAP AI Core.\n *\n * This module provides the language model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) for text generation.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/generate-text | Vercel AI SDK generateText()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/stream-text | Vercel AI SDK streamText()}\n */\n\nimport type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2CallWarning,\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2ResponseMetadata,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type { SAPAIApiType, SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\n\nimport {\n convertFinishReasonToV2,\n convertUsageToV2,\n convertWarningsToV2,\n createV2StreamFromInternal,\n} from \"./sap-ai-adapters-v3-to-v2.js\";\nimport { SAPAILanguageModel as SAPAILanguageModelInternal } from \"./sap-ai-language-model.js\";\n\n/** @internal */\ninterface SAPAILanguageModelV2Config {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n}\n\n/**\n * SAP AI Language Model implementing Vercel AI SDK LanguageModelV2.\n *\n * This class provides chat completion and streaming capabilities through SAP AI Core,\n * supporting both the Orchestration API (with content filtering, grounding, masking,\n * and translation) and Foundation Models API (direct Azure OpenAI access).\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider-v2\";\n * import { generateText, streamText } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const model = provider(\"gpt-4.1\");\n *\n * // Non-streaming\n * const { text } = await generateText({\n * model,\n * prompt: \"Hello!\",\n * });\n *\n * // Streaming\n * const result = streamText({\n * model,\n * prompt: \"Tell me a story\",\n * });\n *\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/generating-text | Vercel AI SDK Text Generation}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAILanguageModelV2 implements LanguageModelV2 {\n readonly modelId: SAPAIModelId;\n readonly specificationVersion = \"v2\" as const;\n\n get provider(): string {\n return this.internalModel.provider;\n }\n\n get supportedUrls(): Record<string, RegExp[]> {\n return this.internalModel.supportedUrls;\n }\n\n /** @internal */\n private readonly internalModel: SAPAILanguageModelInternal;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(modelId: SAPAIModelId, settings: SAPAISettings, config: SAPAILanguageModelV2Config) {\n this.modelId = modelId;\n this.internalModel = new SAPAILanguageModelInternal(modelId, settings, config);\n }\n\n async doGenerate(options: LanguageModelV2CallOptions): Promise<{\n content: LanguageModelV2Content[];\n finishReason: LanguageModelV2FinishReason;\n providerMetadata?: SharedV2ProviderMetadata;\n request?: {\n body?: unknown;\n };\n response?: LanguageModelV2ResponseMetadata & {\n body?: unknown;\n headers?: SharedV2Headers;\n };\n usage: LanguageModelV2Usage;\n warnings: LanguageModelV2CallWarning[];\n }> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n const result = await this.internalModel.doGenerate(options as any);\n\n // Return result in V2 format\n return {\n content: result.content as LanguageModelV2Content[],\n finishReason: convertFinishReasonToV2(result.finishReason),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n providerMetadata: result.providerMetadata as any,\n request: result.request,\n response: result.response\n ? {\n body: result.response.body,\n headers: result.response.headers as SharedV2Headers | undefined,\n id: result.response.id,\n modelId: result.response.modelId,\n timestamp: result.response.timestamp,\n }\n : undefined,\n usage: convertUsageToV2(result.usage),\n warnings: convertWarningsToV2(result.warnings),\n };\n }\n\n async doStream(options: LanguageModelV2CallOptions): Promise<{\n request?: {\n body?: unknown;\n };\n response?: {\n headers?: SharedV2Headers;\n };\n stream: ReadableStream<LanguageModelV2StreamPart>;\n }> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n const result = await this.internalModel.doStream(options as any);\n\n return {\n request: result.request,\n response: result.response\n ? {\n headers: result.response.headers as SharedV2Headers | undefined,\n }\n : undefined,\n stream: createV2StreamFromInternal(result.stream),\n };\n }\n}\n","import type { ImageModelV2, ProviderV2 } from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport { NoSuchModelError } from \"@ai-sdk/provider\";\nimport { setGlobalLogLevel } from \"@sap-cloud-sdk/util\";\n\nimport type { SAPAIEmbeddingModelId } from \"./sap-ai-embedding-model.js\";\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport { SAPAIEmbeddingModelV2 } from \"./sap-ai-embedding-model-v2.js\";\nimport { SAPAILanguageModelV2 } from \"./sap-ai-language-model-v2.js\";\nimport {\n SAP_AI_PROVIDER_NAME,\n validateEmbeddingModelParamsSettings,\n validateModelParamsSettings,\n} from \"./sap-ai-provider-options.js\";\nimport { SAPAIApiType, SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\nimport { mergeSettingsWithApi } from \"./sap-ai-validation.js\";\n\n/** @internal */\nexport type DeploymentConfig = DeploymentIdConfig | ResourceGroupConfig;\n\n/**\n * Configuration settings for the SAP AI Provider.\n * See {@link createSAPAIProvider} for authentication details.\n */\nexport interface SAPAIProviderSettings {\n /**\n * SAP AI Core API to use for all models created by this provider.\n * Can be overridden at model creation time or per-call via providerOptions.\n * - `'orchestration'` (default): SAP AI Core Orchestration API - supports filtering, grounding, masking, translation\n * - `'foundation-models'`: SAP AI Core Foundation Models API - supports dataSources, logprobs, seed, etc.\n * @default 'orchestration'\n */\n readonly api?: SAPAIApiType;\n\n /** Default model settings applied to every model instance. Per-call settings override these. */\n readonly defaultSettings?: SAPAISettings;\n\n /** SAP AI Core deployment ID. If not provided, the SDK resolves deployment automatically. */\n readonly deploymentId?: string;\n\n /** Custom destination configuration for SAP AI Core. */\n readonly destination?: HttpDestinationOrFetchOptions;\n\n /**\n * Log level for SAP Cloud SDK loggers.\n * Controls verbosity of internal SAP SDK logging (e.g., authentication, service binding).\n * Note: SAP_CLOUD_SDK_LOG_LEVEL environment variable takes precedence if set.\n * @default 'warn'\n */\n readonly logLevel?: \"debug\" | \"error\" | \"info\" | \"warn\";\n\n /**\n * Provider name used as key for `providerOptions` and `providerMetadata`.\n * @default 'sap-ai'\n */\n readonly name?: string;\n\n /**\n * SAP AI Core resource group for resource isolation and access control.\n * @default 'default'\n */\n readonly resourceGroup?: string;\n\n /** Whether to emit warnings for ambiguous configurations (e.g. both deploymentId and resourceGroup). */\n readonly warnOnAmbiguousConfig?: boolean;\n}\n\n/** SAP AI Provider interface extending Vercel AI SDK ProviderV2. */\nexport interface SAPAIProviderV2 extends ProviderV2 {\n (modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n chat(modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n /** Always throws - SAP AI Core does not support image generation. */\n imageModel(modelId: string): ImageModelV2;\n languageModel(modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n textEmbeddingModel(\n modelId: SAPAIEmbeddingModelId,\n settings?: SAPAIEmbeddingSettings,\n ): SAPAIEmbeddingModelV2;\n}\n\n/**\n * Creates an SAP AI Provider instance for use with the Vercel AI SDK.\n *\n * Uses the official SAP AI SDK (`@sap-ai-sdk/orchestration` and\n * `@sap-ai-sdk/foundation-models`) for API communication. Authentication is automatic via service binding\n * (VCAP_SERVICES on SAP BTP) or AICORE_SERVICE_KEY environment variable.\n * @param options - Provider configuration options.\n * @param options.api - Default API type: `'orchestration'` (default) or `'foundation-models'`.\n * @param options.defaultSettings - Default model settings applied to every model instance.\n * @param options.deploymentId - SAP AI Core deployment ID for automatic deployment resolution.\n * @param options.destination - Custom SAP Cloud SDK destination configuration.\n * @param options.logLevel - Log level for SAP Cloud SDK loggers (`'debug'`, `'info'`, `'warn'`, `'error'`).\n * @param options.name - Provider name used as key in `providerOptions` (default: `'sap-ai'`).\n * @param options.resourceGroup - SAP AI Core resource group (default: `'default'`).\n * @param options.warnOnAmbiguousConfig - Whether to warn when both deploymentId and resourceGroup are set.\n * @returns A configured SAP AI provider instance that can be used as a callable or via methods.\n * @example\n * // Basic usage with defaults\n * const provider = createSAPAIProvider();\n * const model = provider('gpt-4.1');\n * @example\n * // With custom configuration\n * const provider = createSAPAIProvider({\n * api: 'foundation-models',\n * resourceGroup: 'production',\n * defaultSettings: { modelParams: { temperature: 0.7 } },\n * });\n * @example\n * // Using provider methods\n * const chatModel = provider.chat('gpt-4.1');\n * const embeddingModel = provider.textEmbeddingModel('text-embedding-3-small');\n * @throws {Error} When provider function is called with the `new` keyword.\n * @throws {NoSuchModelError} When `imageModel()` is called (image generation not supported).\n * @see {@link SAPAIProviderSettings} for all configuration options.\n * @see {@link SAPAIProviderV2} for the provider interface.\n */\nexport function createSAPAIProvider(options: SAPAIProviderSettings = {}): SAPAIProviderV2 {\n if (options.defaultSettings?.modelParams) {\n validateModelParamsSettings(options.defaultSettings.modelParams);\n }\n\n const providerName = options.name ?? SAP_AI_PROVIDER_NAME;\n\n const resourceGroup = options.resourceGroup ?? \"default\";\n\n const warnOnAmbiguousConfig = options.warnOnAmbiguousConfig ?? true;\n\n if (warnOnAmbiguousConfig && options.deploymentId && options.resourceGroup) {\n console.warn(\n \"createSAPAIProvider: both 'deploymentId' and 'resourceGroup' were provided; using 'deploymentId' and ignoring 'resourceGroup'.\",\n );\n }\n\n if (!process.env.SAP_CLOUD_SDK_LOG_LEVEL) {\n const logLevel = options.logLevel ?? \"warn\";\n setGlobalLogLevel(logLevel);\n }\n\n const deploymentConfig: DeploymentConfig = options.deploymentId\n ? { deploymentId: options.deploymentId }\n : { resourceGroup };\n\n // Provider-level API setting (defaults to 'orchestration')\n const providerApi = options.api ?? \"orchestration\";\n\n const createModel = (modelId: SAPAIModelId, settings: SAPAISettings = {}) => {\n if (settings.modelParams) {\n validateModelParamsSettings(settings.modelParams);\n }\n\n const mergedSettings = mergeSettingsWithApi<SAPAISettings>(\n options.defaultSettings as Record<string, unknown> | undefined,\n settings,\n providerApi,\n );\n\n return new SAPAILanguageModelV2(modelId, mergedSettings, {\n deploymentConfig,\n destination: options.destination,\n provider: `${providerName}.chat`,\n providerApi,\n });\n };\n\n const createEmbeddingModel = (\n modelId: SAPAIEmbeddingModelId,\n settings: SAPAIEmbeddingSettings = {},\n ): SAPAIEmbeddingModelV2 => {\n if (settings.modelParams) {\n validateEmbeddingModelParamsSettings(settings.modelParams);\n }\n\n const mergedSettings = mergeSettingsWithApi<SAPAIEmbeddingSettings>(\n options.defaultSettings as Record<string, unknown> | undefined,\n settings,\n providerApi,\n );\n\n return new SAPAIEmbeddingModelV2(modelId, mergedSettings, {\n deploymentConfig,\n destination: options.destination,\n provider: `${providerName}.embedding`,\n providerApi,\n });\n };\n\n const provider = function (modelId: SAPAIModelId, settings?: SAPAISettings) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (new.target) {\n throw new Error(\"The SAP AI provider function cannot be called with the new keyword.\");\n }\n\n return createModel(modelId, settings);\n };\n\n provider.chat = createModel;\n provider.languageModel = createModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({\n message: `SAP AI Core does not support image generation. Model '${modelId}' is not available.`,\n modelId,\n modelType: \"imageModel\",\n });\n };\n\n return provider as SAPAIProviderV2;\n}\n\n/** Default SAP AI provider instance with automatic authentication via SAP AI SDK. */\nexport const sapai = createSAPAIProvider();\n","import type { AzureOpenAiChatCompletionParameters } from \"@sap-ai-sdk/foundation-models\";\nimport type {\n ChatCompletionTool,\n ChatModel,\n FilteringModule,\n GroundingModule,\n MaskingModule,\n OrchestrationConfigRef,\n TranslationModule,\n} from \"@sap-ai-sdk/orchestration\";\n\n/** Azure OpenAI chat extension configuration for \"On Your Data\" RAG scenarios. */\nexport type AzureOpenAiChatExtensionConfiguration = NonNullable<\n AzureOpenAiChatCompletionParameters[\"data_sources\"]\n>[number];\n\n/**\n * Common model parameters shared between both APIs.\n *\n * These parameters control text generation behavior and are validated by Zod schemas\n * when passed via `providerOptions`.\n */\nexport interface CommonModelParams {\n /**\n * Frequency penalty to reduce repetition of token sequences.\n * Range: -2.0 to 2.0\n */\n readonly frequencyPenalty?: number;\n /**\n * Maximum number of tokens to generate.\n * Range: Positive integer\n */\n readonly maxTokens?: number;\n /**\n * Number of completions to generate.\n * Not supported by Amazon/Anthropic models.\n * Range: Positive integer\n */\n readonly n?: number;\n /** Whether to enable parallel tool calls when multiple tools are available. */\n readonly parallel_tool_calls?: boolean;\n /**\n * Presence penalty to encourage talking about new topics.\n * Range: -2.0 to 2.0\n */\n readonly presencePenalty?: number;\n /** Index signature for additional model-specific parameters. */\n readonly [key: string]: unknown;\n /**\n * Sampling temperature controlling randomness.\n * Higher values (e.g., 1.0) make output more random, lower values (e.g., 0.2) more deterministic.\n * Range: 0 to 2\n */\n readonly temperature?: number;\n /**\n * Nucleus sampling parameter. Only tokens with cumulative probability up to `topP` are considered.\n * Range: 0 to 1\n */\n readonly topP?: number;\n}\n\n/** Default settings configuration when using Foundation Models API. */\nexport interface FoundationModelsDefaultSettings {\n readonly api: \"foundation-models\";\n readonly settings?: FoundationModelsModelSettings;\n}\n\n/** Model parameters for Foundation Models Embedding API. */\nexport interface FoundationModelsEmbeddingParams {\n readonly dimensions?: number;\n readonly encoding_format?: \"base64\" | \"float\";\n readonly user?: string;\n}\n\n/** Model parameters for Foundation Models API with Azure OpenAI-specific extensions. */\nexport interface FoundationModelsModelParams extends CommonModelParams {\n readonly logit_bias?: AzureOpenAiChatCompletionParameters[\"logit_bias\"];\n readonly logprobs?: AzureOpenAiChatCompletionParameters[\"logprobs\"];\n readonly seed?: AzureOpenAiChatCompletionParameters[\"seed\"];\n readonly stop?: AzureOpenAiChatCompletionParameters[\"stop\"];\n /** Requires logprobs=true. */\n readonly top_logprobs?: AzureOpenAiChatCompletionParameters[\"top_logprobs\"];\n readonly user?: AzureOpenAiChatCompletionParameters[\"user\"];\n}\n\n/** Model settings when using Foundation Models API. */\nexport interface FoundationModelsModelSettings {\n readonly api: \"foundation-models\";\n /** Azure OpenAI \"On Your Data\" configuration for RAG scenarios. */\n readonly dataSources?: AzureOpenAiChatExtensionConfiguration[];\n /** @default false */\n readonly includeReasoning?: boolean;\n readonly modelParams?: FoundationModelsModelParams;\n readonly modelVersion?: string;\n readonly responseFormat?: ResponseFormat;\n}\n\n/** Default settings configuration when using Orchestration API. */\nexport interface OrchestrationDefaultSettings {\n readonly api?: \"orchestration\";\n readonly settings?: OrchestrationModelSettings;\n}\n\n/** Model parameters for Orchestration API. */\nexport type OrchestrationModelParams = CommonModelParams;\n\n/** Model settings when using Orchestration API with filtering, grounding, masking, and translation. */\nexport interface OrchestrationModelSettings {\n readonly api?: \"orchestration\";\n /** @default true */\n readonly escapeTemplatePlaceholders?: boolean;\n readonly filtering?: FilteringModule;\n readonly grounding?: GroundingModule;\n /** @default false */\n readonly includeReasoning?: boolean;\n readonly masking?: MaskingModule;\n readonly modelParams?: OrchestrationModelParams;\n readonly modelVersion?: string;\n /**\n * Reference to a complete orchestration configuration stored in SAP AI Core Prompt Registry.\n * When provided, local module settings (filtering, masking, grounding, translation, tools,\n * promptTemplateRef, responseFormat) are ignored as the full configuration is managed\n * by the referenced config. Only `placeholderValues` and messages are passed through.\n * @example { id: \"f47ac10b-58cc-4372-a567-0e02b2c3d479\" }\n * @example { scenario: \"customer-support\", name: \"prod-config\", version: \"1.0.0\" }\n */\n readonly orchestrationConfigRef?: OrchestrationConfigRef;\n readonly placeholderValues?: Record<string, string>;\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: ResponseFormat;\n /**\n * Options for streaming behavior with post-LLM modules.\n * Only applies when using `streamText()` with orchestration modules.\n */\n readonly streamOptions?: OrchestrationStreamOptions;\n readonly tools?: ChatCompletionTool[];\n readonly translation?: TranslationModule;\n}\n\n/**\n * Stream options for orchestration post-LLM module processing.\n * Controls chunking behavior for translation, filtering, and other modules during streaming.\n */\nexport interface OrchestrationStreamOptions {\n /**\n * Minimum number of characters per chunk for post-LLM modules.\n * Valid range: 1-10000. Defaults to 100.\n */\n readonly chunkSize?: number;\n /**\n * Delimiters for splitting stream into chunks (e.g., sentence boundaries).\n * Required when translation module is configured.\n * @example [\"\\n\", \".\", \"?\", \"!\"]\n */\n readonly delimiters?: readonly string[];\n /**\n * Additional characters from previous chunks sent to output filtering for context.\n * Valid range: 0-10000.\n */\n readonly outputFilteringOverlap?: number;\n}\n\n/** Reference to a template in SAP AI Core's Prompt Registry. */\nexport type PromptTemplateRef = PromptTemplateRefByID | PromptTemplateRefByScenarioNameVersion;\n\n/** Reference to a Prompt Registry template by ID. */\nexport interface PromptTemplateRefByID {\n readonly id: string;\n readonly scope?: PromptTemplateScope;\n}\n\n/** Reference to a Prompt Registry template by scenario, name, and version. */\nexport interface PromptTemplateRefByScenarioNameVersion {\n readonly name: string;\n readonly scenario: string;\n readonly scope?: PromptTemplateScope;\n readonly version: string;\n}\n\n/** Scope for Prompt Registry templates: 'tenant' (default) or 'resource_group'. */\nexport type PromptTemplateScope = \"resource_group\" | \"tenant\";\n\n/** Response format for structured output (OpenAI-compatible). */\nexport type ResponseFormat = AzureOpenAiChatCompletionParameters[\"response_format\"];\n\n/**\n * Supported API types for SAP AI Core.\n *\n * - `'orchestration'` - Full-featured API with data masking, content filtering, document grounding, and translation.\n * - `'foundation-models'` - Direct model access with Azure OpenAI-specific parameters like `logprobs`, `seed`, and `dataSources`.\n */\nexport type SAPAIApiType = \"foundation-models\" | \"orchestration\";\n\n/** Union type for API-specific default settings configuration. */\nexport type SAPAIDefaultSettingsConfig =\n | FoundationModelsDefaultSettings\n | OrchestrationDefaultSettings;\n\n/** Settings for the SAP AI Embedding Model. */\nexport interface SAPAIEmbeddingSettings {\n readonly api?: SAPAIApiType;\n /** Orchestration API only. */\n readonly masking?: MaskingModule;\n /** @default 2048 */\n readonly maxEmbeddingsPerCall?: number;\n readonly modelParams?: FoundationModelsEmbeddingParams | Record<string, unknown>;\n readonly modelVersion?: string;\n readonly [key: string]: unknown;\n /** @default 'text' */\n readonly type?: \"document\" | \"query\" | \"text\";\n}\n\n/**\n * Supported model IDs in SAP AI Core.\n *\n * Model availability depends on tenant configuration and region.\n * Common values include: `'gpt-4.1'`, `'gpt-4.1-mini'`, `'anthropic--claude-4.5-sonnet'`, `'gemini-2.5-pro'`.\n * @see {@link https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/models-and-scenarios-in-generative-ai-hub|SAP AI Core Models}\n */\nexport type SAPAIModelId = ChatModel;\n\n/**\n * Union type for model settings - supports both APIs.\n *\n * Use `FoundationModelsModelSettings` for Foundation Models API features (dataSources, logprobs, seed).\n * Use `OrchestrationModelSettings` for Orchestration API features (filtering, grounding, masking, translation).\n */\nexport type SAPAIModelSettings = FoundationModelsModelSettings | OrchestrationModelSettings;\n\n/** Re-exported Azure OpenAI types from `@sap-ai-sdk/foundation-models`. */\nexport type {\n AzureOpenAiChatCompletionParameters,\n AzureOpenAiChatCompletionRequestAssistantMessage,\n AzureOpenAiChatCompletionRequestMessage,\n AzureOpenAiChatCompletionRequestSystemMessage,\n AzureOpenAiChatCompletionRequestToolMessage,\n AzureOpenAiChatCompletionRequestUserMessage,\n AzureOpenAiChatCompletionTool,\n AzureOpenAiEmbeddingParameters,\n AzureOpenAiFunctionObject,\n} from \"@sap-ai-sdk/foundation-models\";\n\n/** Re-exported SAP AI SDK orchestration types. */\nexport type {\n FilteringModule,\n GroundingModule,\n MaskingModule,\n TranslationModule,\n} from \"@sap-ai-sdk/orchestration\";\n\nexport {\n buildAzureContentSafetyFilter,\n buildDocumentGroundingConfig,\n buildDpiMaskingProvider,\n buildLlamaGuard38BFilter,\n buildTranslationConfig,\n} from \"@sap-ai-sdk/orchestration\";\n\n/**\n * Settings for configuring SAP AI Core model behavior.\n * Legacy interface maintained for backward compatibility - prefer OrchestrationModelSettings\n * or FoundationModelsModelSettings for API-specific type safety.\n */\nexport interface SAPAISettings {\n readonly api?: SAPAIApiType;\n /** @default true */\n readonly escapeTemplatePlaceholders?: boolean;\n /** Orchestration API only. */\n readonly filtering?: FilteringModule;\n /** Orchestration API only. */\n readonly grounding?: GroundingModule;\n /** @default false */\n readonly includeReasoning?: boolean;\n /** Orchestration API only. */\n readonly masking?: MaskingModule;\n readonly modelParams?: CommonModelParams;\n readonly modelVersion?: string;\n /** Orchestration API only. */\n readonly orchestrationConfigRef?: OrchestrationConfigRef;\n /** Orchestration API only. */\n readonly placeholderValues?: Record<string, string>;\n /** Orchestration API only. */\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: ResponseFormat;\n /** Orchestration API only. */\n readonly streamOptions?: OrchestrationStreamOptions;\n /** Orchestration API only. */\n readonly tools?: ChatCompletionTool[];\n /** Orchestration API only. */\n readonly translation?: TranslationModule;\n}\n\nexport type {\n AssistantChatMessage,\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n DeveloperChatMessage,\n DocumentTranslationApplyToSelector,\n FunctionObject,\n LlmModelDetails,\n LlmModelParams,\n OrchestrationConfigRef,\n OrchestrationModuleConfig,\n PromptTemplatingModule,\n SystemChatMessage,\n ToolChatMessage,\n TranslationApplyToCategory,\n TranslationInputParameters,\n TranslationOutputParameters,\n TranslationTargetLanguage,\n UserChatMessage,\n} from \"@sap-ai-sdk/orchestration\";\n\nexport {\n OrchestrationEmbeddingResponse,\n OrchestrationResponse,\n OrchestrationStream,\n OrchestrationStreamChunkResponse,\n OrchestrationStreamResponse,\n} from \"@sap-ai-sdk/orchestration\";\n","/**\n * `@jerome-benoit/sap-ai-provider-v2`\n *\n * Vercel AI SDK V2 provider for SAP AI Core.\n *\n * This package provides LanguageModelV2 and EmbeddingModelV2 interfaces\n * for compatibility with Vercel AI SDK. Internally uses the provider's\n * implementation with automatic format transformation to V2.\n * @see {@link https://sdk.vercel.ai/} Vercel AI SDK documentation\n */\n\n/**\n * Utility functions for escaping template delimiters (`{{`, `{%`, `{#`) in orchestration content.\n */\nexport {\n escapeOrchestrationPlaceholders,\n unescapeOrchestrationPlaceholders,\n} from \"./convert-to-sap-messages.js\";\n\n/**\n * Embedding model class implementing EmbeddingModelV2 for SAP AI Core.\n * V2 facade over internal implementation.\n */\nexport { SAPAIEmbeddingModelV2 as SAPAIEmbeddingModel } from \"./sap-ai-embedding-model-v2.js\";\n\nexport type { SAPAIEmbeddingModelId } from \"./sap-ai-embedding-model.js\";\n\n/**\n * Custom error classes for Foundation Models API support.\n * - `UnsupportedFeatureError`: Thrown when a feature is used with an incompatible API.\n * - `ApiSwitchError`: Thrown when attempting to switch APIs at invocation time with conflicting settings.\n */\nexport { ApiSwitchError, UnsupportedFeatureError } from \"./sap-ai-error.js\";\n\n/**\n * Language model class implementing LanguageModelV2 for SAP AI Core.\n * V2 facade over internal implementation.\n */\nexport { SAPAILanguageModelV2 as SAPAILanguageModel } from \"./sap-ai-language-model-v2.js\";\n\n/**\n * Provider options for per-call configuration.\n *\n * These schemas and types enable runtime validation of provider options\n * passed via `providerOptions['sap-ai']` in Vercel AI SDK calls.\n */\nexport {\n getProviderName,\n SAP_AI_PROVIDER_NAME,\n sapAIEmbeddingProviderOptions,\n sapAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\n\nexport type {\n SAPAIEmbeddingProviderOptions,\n SAPAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\n\n/**\n * Provider factory function implementing ProviderV2 interface.\n * Creates language and embedding model instances for SAP AI Core.\n */\nexport { createSAPAIProvider, sapai } from \"./sap-ai-provider-v2.js\";\n\nexport type {\n DeploymentConfig,\n SAPAIProviderV2 as SAPAIProvider,\n SAPAIProviderSettings,\n} from \"./sap-ai-provider-v2.js\";\n\n/**\n * Model settings types and model identifier type definitions.\n */\nexport type {\n AzureOpenAiChatExtensionConfiguration,\n CommonModelParams,\n FoundationModelsDefaultSettings,\n FoundationModelsEmbeddingParams,\n FoundationModelsModelParams,\n FoundationModelsModelSettings,\n OrchestrationDefaultSettings,\n OrchestrationModelParams,\n OrchestrationModelSettings,\n OrchestrationStreamOptions,\n PromptTemplateRef,\n PromptTemplateRefByID,\n PromptTemplateRefByScenarioNameVersion,\n PromptTemplateScope,\n ResponseFormat,\n SAPAIApiType,\n SAPAIDefaultSettingsConfig,\n SAPAIEmbeddingSettings,\n SAPAIModelId,\n SAPAIModelSettings,\n SAPAISettings,\n} from \"./sap-ai-settings.js\";\n\n/**\n * SAP AI SDK types and utilities.\n *\n * Re-exported for convenience and advanced usage scenarios.\n */\nexport type {\n AssistantChatMessage,\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n DeveloperChatMessage,\n DocumentTranslationApplyToSelector,\n FilteringModule,\n FunctionObject,\n GroundingModule,\n LlmModelDetails,\n LlmModelParams,\n MaskingModule,\n OrchestrationConfigRef,\n OrchestrationModuleConfig,\n PromptTemplatingModule,\n SystemChatMessage,\n ToolChatMessage,\n TranslationApplyToCategory,\n TranslationInputParameters,\n TranslationModule,\n TranslationOutputParameters,\n TranslationTargetLanguage,\n UserChatMessage,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Helper functions for building configurations.\n */\nexport {\n buildAzureContentSafetyFilter,\n buildDocumentGroundingConfig,\n buildDpiMaskingProvider,\n buildLlamaGuard38BFilter,\n buildTranslationConfig,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Response classes from the SAP AI SDK for orchestration results.\n */\nexport {\n OrchestrationEmbeddingResponse,\n OrchestrationResponse,\n OrchestrationStream,\n OrchestrationStreamChunkResponse,\n OrchestrationStreamResponse,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Validation utilities for API selection and feature compatibility.\n * - `resolveApi`: Resolves API type from provider/model/invocation precedence chain.\n * - `validateSettings`: Validates settings are compatible with the selected API.\n */\nexport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\n/**\n * Package version, injected at build time.\n */\nexport { VERSION } from \"./version.js\";\n\n/**\n * Error handling types and classes for SAP AI Core error responses.\n */\nexport type { OrchestrationErrorResponse } from \"@sap-ai-sdk/orchestration\";\n\n/**\n * Direct access to SAP AI SDK OrchestrationClient.\n *\n * For advanced users who need to use the SAP AI SDK directly.\n */\nexport { OrchestrationClient, OrchestrationEmbeddingClient } from \"@sap-ai-sdk/orchestration\";\n"],"mappings":"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","names":["OrchestrationEmbeddingClient","OrchestrationClient","parseProviderOptions","parseProviderOptions"]}
1
+ {"version":3,"sources":["../src/sap-ai-adapters-v3-to-v2.ts","../src/sap-ai-embedding-model.ts","../src/sap-ai-strategy.ts","../src/sap-ai-validation.ts","../src/sap-ai-embedding-model-v2.ts","../src/sap-ai-language-model.ts","../src/sap-ai-language-model-v2.ts","../src/sap-ai-provider-v2.ts","../src/sap-ai-settings.ts","../src/index-v2.ts"],"sourcesContent":["/** Adapters to convert internal (V3) formats to LanguageModelV2 formats for the V2 facade. */\n\nimport type {\n LanguageModelV3FinishReason as InternalFinishReason,\n LanguageModelV3StreamPart as InternalStreamPart,\n LanguageModelV3Usage as InternalUsage,\n SharedV3Warning as InternalWarning,\n LanguageModelV2CallWarning,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2ProviderMetadata,\n SharedV3ProviderMetadata,\n} from \"@ai-sdk/provider\";\n\n/**\n * Converts internal finish reason to V2 format.\n * @param internalFinishReason - Internal finish reason object `{ unified, raw? }`.\n * @returns V2 finish reason string.\n * @internal\n */\nexport function convertFinishReasonToV2(\n internalFinishReason: InternalFinishReason,\n): LanguageModelV2FinishReason {\n return internalFinishReason.unified;\n}\n\n/**\n * Converts V3 provider metadata to V2 format.\n *\n * Both are `Record<string, Record<string, JSONValue>>` compatible; cast for type safety.\n * @param metadata - V3 provider metadata.\n * @returns V2 provider metadata.\n * @internal\n */\nexport function convertProviderMetadataToV2(\n metadata: SharedV3ProviderMetadata | undefined,\n): SharedV2ProviderMetadata | undefined {\n return metadata as SharedV2ProviderMetadata | undefined;\n}\n\n/**\n * Converts internal stream part to V2 format.\n *\n * Handles all V3→V2 semantic differences explicitly:\n * - `file`: removes V3-only `providerMetadata`\n * - `finish`: converts `usage`, `finishReason`, casts `providerMetadata`\n * - `stream-start`: converts `warnings` array\n * - `tool-approval-request`: V3-only, returns `null`\n * - `tool-call`: removes V3-only `dynamic`\n * - `tool-input-start`: removes V3-only `dynamic`, `title`\n * - `tool-result`: maps `dynamic` → `providerExecuted`, removes `preliminary`\n * - `source`: casts `providerMetadata`\n * - `response-metadata`: identical structure, passthrough\n * - `text-*`, `reasoning-*`, `tool-input-delta`, `tool-input-end`: casts `providerMetadata`\n * - `raw`, `error`: identical structure, passthrough\n * @param internalPart - Internal stream part.\n * @returns V2 stream part, or `null` if no V2 equivalent exists.\n * @internal\n */\nexport function convertStreamPartToV2(\n internalPart: InternalStreamPart,\n): LanguageModelV2StreamPart | null {\n switch (internalPart.type) {\n case \"error\":\n return {\n error: internalPart.error,\n type: \"error\",\n };\n\n case \"file\":\n return {\n data: internalPart.data,\n mediaType: internalPart.mediaType,\n type: \"file\",\n };\n\n case \"finish\":\n return {\n finishReason: convertFinishReasonToV2(internalPart.finishReason),\n type: \"finish\",\n usage: convertUsageToV2(internalPart.usage),\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"raw\":\n return {\n rawValue: internalPart.rawValue,\n type: \"raw\",\n };\n\n case \"reasoning-delta\":\n return {\n delta: internalPart.delta,\n id: internalPart.id,\n type: \"reasoning-delta\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"reasoning-end\":\n return {\n id: internalPart.id,\n type: \"reasoning-end\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"reasoning-start\":\n return {\n id: internalPart.id,\n type: \"reasoning-start\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"response-metadata\":\n return {\n id: internalPart.id,\n modelId: internalPart.modelId,\n timestamp: internalPart.timestamp,\n type: \"response-metadata\",\n };\n\n case \"source\":\n if (internalPart.sourceType === \"url\") {\n return {\n id: internalPart.id,\n sourceType: \"url\",\n title: internalPart.title,\n type: \"source\",\n url: internalPart.url,\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n }\n return {\n filename: internalPart.filename,\n id: internalPart.id,\n mediaType: internalPart.mediaType,\n sourceType: \"document\",\n title: internalPart.title,\n type: \"source\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"stream-start\":\n return {\n type: \"stream-start\",\n warnings: convertWarningsToV2(internalPart.warnings),\n };\n\n case \"text-delta\":\n return {\n delta: internalPart.delta,\n id: internalPart.id,\n type: \"text-delta\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"text-end\":\n return {\n id: internalPart.id,\n type: \"text-end\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"text-start\":\n return {\n id: internalPart.id,\n type: \"text-start\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"tool-approval-request\":\n return null;\n\n case \"tool-call\":\n return {\n input: internalPart.input,\n toolCallId: internalPart.toolCallId,\n toolName: internalPart.toolName,\n type: \"tool-call\",\n ...(internalPart.providerExecuted !== undefined && {\n providerExecuted: internalPart.providerExecuted,\n }),\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"tool-input-delta\":\n return {\n delta: internalPart.delta,\n id: internalPart.id,\n type: \"tool-input-delta\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"tool-input-end\":\n return {\n id: internalPart.id,\n type: \"tool-input-end\",\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"tool-input-start\":\n return {\n id: internalPart.id,\n toolName: internalPart.toolName,\n type: \"tool-input-start\",\n ...(internalPart.providerExecuted !== undefined && {\n providerExecuted: internalPart.providerExecuted,\n }),\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n\n case \"tool-result\":\n return {\n result: internalPart.result,\n toolCallId: internalPart.toolCallId,\n toolName: internalPart.toolName,\n type: \"tool-result\",\n ...(internalPart.isError !== undefined && { isError: internalPart.isError }),\n ...(internalPart.dynamic !== undefined && { providerExecuted: internalPart.dynamic }),\n ...(internalPart.providerMetadata !== undefined && {\n providerMetadata: convertProviderMetadataToV2(internalPart.providerMetadata),\n }),\n };\n }\n}\n\n/**\n * Converts internal usage (nested format) to V2 usage (flat format).\n * @param internalUsage - Internal usage object with nested `inputTokens`/`outputTokens`.\n * @returns V2 usage object with flat token counts.\n * @internal\n */\nexport function convertUsageToV2(internalUsage: InternalUsage): LanguageModelV2Usage {\n return {\n cachedInputTokens: internalUsage.inputTokens.cacheRead,\n inputTokens: internalUsage.inputTokens.total,\n outputTokens: internalUsage.outputTokens.total,\n reasoningTokens: internalUsage.outputTokens.reasoning,\n totalTokens:\n internalUsage.inputTokens.total !== undefined &&\n internalUsage.outputTokens.total !== undefined\n ? internalUsage.inputTokens.total + internalUsage.outputTokens.total\n : undefined,\n };\n}\n\n/**\n * Converts internal warnings array to V2 warnings array.\n * @param internalWarnings - Internal warning objects.\n * @returns V2 warning objects.\n * @internal\n */\nexport function convertWarningsToV2(\n internalWarnings: InternalWarning[],\n): LanguageModelV2CallWarning[] {\n return internalWarnings.map(convertWarningToV2);\n}\n\n/**\n * Converts internal warning to V2 warning format.\n *\n * Maps `unsupported`/`compatibility` warnings to V2 `other` type with descriptive message.\n * @param internalWarning - Internal warning object.\n * @returns V2 warning object.\n * @internal\n */\nexport function convertWarningToV2(internalWarning: InternalWarning): LanguageModelV2CallWarning {\n if (internalWarning.type === \"unsupported\") {\n return {\n message: internalWarning.details\n ? `Unsupported feature: ${internalWarning.feature}. ${internalWarning.details}`\n : `Unsupported feature: ${internalWarning.feature}`,\n type: \"other\",\n };\n }\n\n if (internalWarning.type === \"compatibility\") {\n return {\n message: internalWarning.details\n ? `Compatibility mode: ${internalWarning.feature}. ${internalWarning.details}`\n : `Compatibility mode: ${internalWarning.feature}`,\n type: \"other\",\n };\n }\n\n return {\n message: internalWarning.message,\n type: \"other\",\n };\n}\n\n/**\n * Transforms internal stream to V2 ReadableStream.\n * @param internalStream - Internal ReadableStream to transform.\n * @returns V2-formatted ReadableStream.\n * @internal\n */\nexport function createV2StreamFromInternal(\n internalStream: ReadableStream<InternalStreamPart>,\n): ReadableStream<LanguageModelV2StreamPart> {\n return internalStream.pipeThrough(\n new TransformStream<InternalStreamPart, LanguageModelV2StreamPart>({\n transform(chunk, controller) {\n const converted = convertStreamPartToV2(chunk);\n if (converted != null) {\n controller.enqueue(converted);\n }\n },\n }),\n );\n}\n","/**\n * SAP AI Embedding Model - Vercel AI SDK EmbeddingModelV3 implementation for SAP AI Core.\n *\n * This module provides the embedding model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) to generate vector embeddings.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed | Vercel AI SDK embed()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed-many | Vercel AI SDK embedMany()}\n */\nimport type {\n EmbeddingModelV3,\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\n\nimport type { SAPAIApiType, SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport {\n getProviderName,\n sapAIEmbeddingProviderOptions,\n validateEmbeddingModelParamsSettings,\n} from \"./sap-ai-provider-options.js\";\nimport {\n type EmbeddingModelStrategyConfig,\n getOrCreateEmbeddingModelStrategy,\n} from \"./sap-ai-strategy.js\";\nimport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\nconst DEFAULT_MAX_EMBEDDINGS_PER_CALL = 2048;\n\n/**\n * Model identifier for SAP AI embedding models.\n *\n * Common embedding model IDs include:\n * - `\"text-embedding-3-small\"` - OpenAI small embedding model (recommended)\n * - `\"text-embedding-3-large\"` - OpenAI large embedding model\n *\n * The actual available models depend on your SAP AI Core deployment configuration.\n * @see {@link https://help.sap.com/docs/sap-ai-core | SAP AI Core Documentation}\n */\nexport type SAPAIEmbeddingModelId = string;\n\n/** @internal */\ninterface SAPAIEmbeddingModelConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n}\n\n/**\n * SAP AI Core Embedding Model implementing Vercel AI SDK EmbeddingModelV3.\n *\n * This class provides embedding generation capabilities through SAP AI Core,\n * supporting both the Orchestration API and Foundation Models API.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider\";\n * import { embed, embedMany } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const embeddingModel = provider.embedding(\"text-embedding-3-small\");\n *\n * // Single embedding\n * const { embedding } = await embed({\n * model: embeddingModel,\n * value: \"Hello, world!\",\n * });\n *\n * // Multiple embeddings\n * const { embeddings } = await embedMany({\n * model: embeddingModel,\n * values: [\"Hello\", \"World\"],\n * });\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/embeddings | Vercel AI SDK Embeddings}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAIEmbeddingModel implements EmbeddingModelV3 {\n readonly maxEmbeddingsPerCall: number;\n readonly modelId: string;\n readonly provider: string;\n readonly specificationVersion = \"v3\" as const;\n readonly supportsParallelCalls: boolean = true;\n\n private readonly config: SAPAIEmbeddingModelConfig;\n private readonly settings: SAPAIEmbeddingSettings;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(\n modelId: SAPAIEmbeddingModelId,\n settings: SAPAIEmbeddingSettings = {},\n config: SAPAIEmbeddingModelConfig,\n ) {\n if (settings.modelParams) {\n validateEmbeddingModelParamsSettings(settings.modelParams);\n }\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n this.provider = config.provider;\n this.maxEmbeddingsPerCall = settings.maxEmbeddingsPerCall ?? DEFAULT_MAX_EMBEDDINGS_PER_CALL;\n }\n\n async doEmbed(options: EmbeddingModelV3CallOptions): Promise<EmbeddingModelV3Result> {\n const providerName = getProviderName(this.config.provider);\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAIEmbeddingProviderOptions,\n });\n\n const effectiveApi = resolveApi(this.config.providerApi, this.settings.api, sapOptions?.api);\n\n validateSettings({\n api: effectiveApi,\n embeddingSettings: this.settings,\n invocationSettings: sapOptions ? { api: sapOptions.api } : undefined,\n modelApi: this.settings.api,\n });\n\n const strategy = await getOrCreateEmbeddingModelStrategy(effectiveApi);\n\n const strategyConfig: EmbeddingModelStrategyConfig = {\n deploymentConfig: this.config.deploymentConfig,\n destination: this.config.destination,\n modelId: this.modelId,\n provider: this.config.provider,\n };\n\n return strategy.doEmbed(strategyConfig, this.settings, options, this.maxEmbeddingsPerCall);\n }\n}\n","/** Strategy pattern infrastructure for SAP AI Core API support. */\nimport type {\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type {\n SAPAIApiType,\n SAPAIEmbeddingSettings,\n SAPAIModelSettings,\n} from \"./sap-ai-settings.js\";\n\n/** @internal */\nexport interface EmbeddingModelAPIStrategy {\n doEmbed(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n options: EmbeddingModelV3CallOptions,\n maxEmbeddingsPerCall: number,\n ): Promise<EmbeddingModelV3Result>;\n}\n\n/** @internal */\nexport interface EmbeddingModelStrategyConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly modelId: string;\n readonly provider: string;\n}\n\n/**\n * Strategy interface for language model API implementations.\n * @template TSettings - The model settings type, defaults to SAPAIModelSettings for backward compatibility\n * @internal\n */\nexport interface LanguageModelAPIStrategy<\n TSettings extends SAPAIModelSettings = SAPAIModelSettings,\n> {\n doGenerate(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult>;\n\n doStream(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult>;\n}\n\n/** @internal */\nexport interface LanguageModelStrategyConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly modelId: string;\n readonly provider: string;\n}\n\n/** @internal */\nconst languageModelStrategyCache = new Map<SAPAIApiType, Promise<LanguageModelAPIStrategy>>();\n\n/** @internal */\nconst embeddingModelStrategyCache = new Map<SAPAIApiType, Promise<EmbeddingModelAPIStrategy>>();\n\n/** @internal */\nexport function clearStrategyCaches(): void {\n languageModelStrategyCache.clear();\n embeddingModelStrategyCache.clear();\n}\n\n/**\n * @returns Embedding model strategy cache size.\n * @internal\n */\nexport function getEmbeddingModelStrategyCacheSize(): number {\n return embeddingModelStrategyCache.size;\n}\n\n/**\n * @returns Language model strategy cache size.\n * @internal\n */\nexport function getLanguageModelStrategyCacheSize(): number {\n return languageModelStrategyCache.size;\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Embedding model strategy.\n * @internal\n */\nexport function getOrCreateEmbeddingModelStrategy(\n api: SAPAIApiType,\n): Promise<EmbeddingModelAPIStrategy> {\n const cached = embeddingModelStrategyCache.get(api);\n if (cached) {\n return cached;\n }\n\n // Cache the Promise synchronously before any await to prevent race conditions\n const strategyPromise = createEmbeddingModelStrategy(api);\n embeddingModelStrategyCache.set(api, strategyPromise);\n\n strategyPromise.catch(() => {\n embeddingModelStrategyCache.delete(api);\n });\n\n return strategyPromise;\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Language model strategy.\n * @internal\n */\nexport function getOrCreateLanguageModelStrategy(\n api: SAPAIApiType,\n): Promise<LanguageModelAPIStrategy> {\n const cached = languageModelStrategyCache.get(api);\n if (cached) {\n return cached;\n }\n\n // Cache the Promise synchronously before any await to prevent race conditions\n const strategyPromise = createLanguageModelStrategy(api);\n languageModelStrategyCache.set(api, strategyPromise);\n\n strategyPromise.catch(() => {\n languageModelStrategyCache.delete(api);\n });\n\n return strategyPromise;\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Embedding model strategy.\n */\nasync function createEmbeddingModelStrategy(api: SAPAIApiType): Promise<EmbeddingModelAPIStrategy> {\n if (api === \"foundation-models\") {\n const { AzureOpenAiEmbeddingClient } = await import(\"@sap-ai-sdk/foundation-models\");\n const { FoundationModelsEmbeddingModelStrategy } =\n await import(\"./foundation-models-embedding-model-strategy.js\");\n return new FoundationModelsEmbeddingModelStrategy(AzureOpenAiEmbeddingClient);\n }\n\n const { OrchestrationEmbeddingClient } = await import(\"@sap-ai-sdk/orchestration\");\n const { OrchestrationEmbeddingModelStrategy } =\n await import(\"./orchestration-embedding-model-strategy.js\");\n return new OrchestrationEmbeddingModelStrategy(OrchestrationEmbeddingClient);\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Language model strategy.\n */\nasync function createLanguageModelStrategy(api: SAPAIApiType): Promise<LanguageModelAPIStrategy> {\n if (api === \"foundation-models\") {\n const { AzureOpenAiChatClient } = await import(\"@sap-ai-sdk/foundation-models\");\n const { FoundationModelsLanguageModelStrategy } =\n await import(\"./foundation-models-language-model-strategy.js\");\n return new FoundationModelsLanguageModelStrategy(AzureOpenAiChatClient);\n }\n\n const { OrchestrationClient } = await import(\"@sap-ai-sdk/orchestration\");\n const { OrchestrationLanguageModelStrategy } =\n await import(\"./orchestration-language-model-strategy.js\");\n return new OrchestrationLanguageModelStrategy(OrchestrationClient);\n}\n","/** Validation and resolution functions for SAP AI API-specific features. */\nimport type {\n FoundationModelsModelSettings,\n OrchestrationModelSettings,\n SAPAIApiType,\n SAPAIEmbeddingSettings,\n SAPAIModelSettings,\n SAPAISettings,\n} from \"./sap-ai-settings.js\";\n\nimport { deepMerge } from \"./deep-merge.js\";\nimport { ApiSwitchError, UnsupportedFeatureError } from \"./sap-ai-error.js\";\n\n/**\n * Type guard for Foundation Models API settings.\n * @param settings - Settings to check.\n * @returns True if settings are for Foundation Models API.\n */\nexport function isFoundationModelsSettings(\n settings: SAPAIModelSettings | SAPAISettings,\n): settings is FoundationModelsModelSettings {\n return settings.api === \"foundation-models\";\n}\n\n/**\n * Type guard for Orchestration API settings.\n * @param settings - Settings to check.\n * @returns True if settings are for Orchestration API.\n */\nexport function isOrchestrationSettings(\n settings: SAPAIModelSettings | SAPAISettings,\n): settings is OrchestrationModelSettings {\n return settings.api === undefined || settings.api === \"orchestration\";\n}\n\n/**\n * Validates escapeTemplatePlaceholders option based on API type.\n *\n * Jinja2 template escaping is only supported by the Orchestration API.\n * @param api - SAP AI API type.\n * @param escapeTemplatePlaceholders - Whether to escape template placeholders.\n * @throws {UnsupportedFeatureError} When escapeTemplatePlaceholders is true with Foundation Models API.\n * @internal\n */\nfunction validateEscapeTemplatePlaceholders(\n api: SAPAIApiType,\n escapeTemplatePlaceholders: boolean | undefined,\n): void {\n if (api === \"foundation-models\" && escapeTemplatePlaceholders === true) {\n throw new UnsupportedFeatureError(\n ESCAPE_TEMPLATE_PLACEHOLDERS_DESCRIPTION,\n \"foundation-models\",\n \"orchestration\",\n );\n }\n}\n\n/**\n * Validates that Foundation Models-only options are not used with Orchestration API.\n *\n * Foundation Models-only features:\n * - `dataSources` - Azure On Your Data configuration\n * @param settings - Settings to validate.\n * @throws {UnsupportedFeatureError} When dataSources is set with Orchestration API.\n * @internal\n */\nfunction validateFoundationModelsOnlyOptions(\n settings: SAPAIModelSettings | SAPAISettings | undefined,\n): void {\n if (!settings) return;\n\n const fmSettings = settings as FoundationModelsModelSettings;\n\n for (const feature of FOUNDATION_MODELS_ONLY_FEATURE_KEYS) {\n if (fmSettings[feature] !== undefined) {\n throw new UnsupportedFeatureError(\n FOUNDATION_MODELS_ONLY_FEATURES[feature],\n \"orchestration\",\n \"foundation-models\",\n );\n }\n }\n}\n\n/**\n * Validates that Orchestration-only embedding options are not used with Foundation Models API.\n *\n * Orchestration-only embedding features:\n * - `masking` - Data masking module\n * @param settings - Embedding settings to validate.\n * @throws {UnsupportedFeatureError} When masking is set with Foundation Models API.\n * @internal\n */\nfunction validateOrchestrationOnlyEmbeddingOptions(\n settings: SAPAIEmbeddingSettings | undefined,\n): void {\n if (!settings) return;\n\n for (const feature of ORCHESTRATION_ONLY_EMBEDDING_FEATURE_KEYS) {\n if (settings[feature] !== undefined) {\n throw new UnsupportedFeatureError(\n ORCHESTRATION_ONLY_EMBEDDING_FEATURES[feature],\n \"foundation-models\",\n \"orchestration\",\n );\n }\n }\n}\n\n/**\n * Validates that Orchestration-only options are not used with Foundation Models API.\n *\n * Orchestration-only features:\n * - `filtering` - Content filtering module\n * - `grounding` - Document grounding module\n * - `masking` - Data masking module\n * - `orchestrationConfigRef` - Prompt Registry configuration reference\n * - `placeholderValues` - Jinja2 template placeholder values\n * - `promptTemplateRef` - Prompt Registry template reference\n * - `tools` - SAP-format tool definitions (use AI SDK tools instead)\n * - `translation` - Translation module\n * @param settings - Settings to validate.\n * @throws {UnsupportedFeatureError} When any Orchestration-only feature is set with Foundation Models API.\n * @internal\n */\nfunction validateOrchestrationOnlyOptions(\n settings: SAPAIModelSettings | SAPAISettings | undefined,\n): void {\n if (!settings) return;\n\n const orchSettings = settings as OrchestrationModelSettings;\n\n for (const feature of ORCHESTRATION_ONLY_FEATURE_KEYS) {\n if (orchSettings[feature] !== undefined) {\n throw new UnsupportedFeatureError(\n ORCHESTRATION_ONLY_FEATURES[feature],\n \"foundation-models\",\n \"orchestration\",\n );\n }\n }\n}\n\n/**\n * Keys for Orchestration-only features.\n * @internal\n */\nconst ORCHESTRATION_ONLY_FEATURE_KEYS = [\n \"filtering\",\n \"grounding\",\n \"masking\",\n \"orchestrationConfigRef\",\n \"placeholderValues\",\n \"promptTemplateRef\",\n \"streamOptions\",\n \"tools\",\n \"translation\",\n] as const;\n\n/**\n * Mapping of Orchestration-only feature keys to human-readable descriptions.\n * Used for generating consistent error messages.\n * @internal\n */\nconst ORCHESTRATION_ONLY_FEATURES: Readonly<\n Record<(typeof ORCHESTRATION_ONLY_FEATURE_KEYS)[number], string>\n> = {\n filtering: \"Content filtering\",\n grounding: \"Document grounding\",\n masking: \"Data masking\",\n orchestrationConfigRef: \"Orchestration config reference (orchestrationConfigRef)\",\n placeholderValues: \"Placeholder values (placeholderValues)\",\n promptTemplateRef: \"Prompt template reference (promptTemplateRef)\",\n streamOptions: \"Stream options for post-LLM modules\",\n tools: \"SAP-format tool definitions (use AI SDK tools instead)\",\n translation: \"Translation\",\n} as const;\n\n/**\n * Keys for Foundation Models-only features.\n * @internal\n */\nconst FOUNDATION_MODELS_ONLY_FEATURE_KEYS = [\"dataSources\"] as const;\n\n/**\n * Mapping of Foundation Models-only feature keys to human-readable descriptions.\n * Used for generating consistent error messages.\n * @internal\n */\nconst FOUNDATION_MODELS_ONLY_FEATURES: Readonly<\n Record<(typeof FOUNDATION_MODELS_ONLY_FEATURE_KEYS)[number], string>\n> = {\n dataSources: \"Azure On Your Data (dataSources)\",\n} as const;\n\n/**\n * Subset of Orchestration-only features that can be set at invocation level.\n * @internal\n */\nconst ORCHESTRATION_ONLY_INVOCATION_FEATURE_KEYS = [\n \"orchestrationConfigRef\",\n \"placeholderValues\",\n \"promptTemplateRef\",\n] as const;\n\n/**\n * Keys for Orchestration-only embedding features.\n * @internal\n */\nconst ORCHESTRATION_ONLY_EMBEDDING_FEATURE_KEYS = [\"masking\"] as const;\n\n/**\n * Mapping of Orchestration-only embedding feature keys to human-readable descriptions.\n * Uses the same descriptions as the main ORCHESTRATION_ONLY_FEATURES for consistency.\n * @internal\n */\nconst ORCHESTRATION_ONLY_EMBEDDING_FEATURES: Readonly<\n Record<(typeof ORCHESTRATION_ONLY_EMBEDDING_FEATURE_KEYS)[number], string>\n> = {\n masking: ORCHESTRATION_ONLY_FEATURES.masking,\n} as const;\n\n/**\n * Human-readable description for escapeTemplatePlaceholders feature.\n * Used for generating consistent error messages.\n * @internal\n */\nconst ESCAPE_TEMPLATE_PLACEHOLDERS_DESCRIPTION =\n \"escapeTemplatePlaceholders (Jinja2 template escaping)\";\n\n/**\n * Validates that switching APIs at invocation time is allowed.\n *\n * API switching is blocked when the model was configured with features\n * that are specific to one API and incompatible with the target API.\n * @param fromApi - Source API type (configured at model creation).\n * @param toApi - Target API type (requested at invocation time).\n * @param modelSettings - Model settings to validate for conflicts.\n * @throws {ApiSwitchError} When the model has features incompatible with the target API.\n * @internal\n */\nfunction validateApiSwitch(\n fromApi: SAPAIApiType,\n toApi: SAPAIApiType,\n modelSettings: SAPAIModelSettings | SAPAISettings | undefined,\n): void {\n if (fromApi === toApi) return;\n if (!modelSettings) return;\n\n if (fromApi === \"orchestration\" && toApi === \"foundation-models\") {\n const orchSettings = modelSettings as OrchestrationModelSettings;\n\n for (const feature of ORCHESTRATION_ONLY_FEATURE_KEYS) {\n if (orchSettings[feature] !== undefined) {\n throw new ApiSwitchError(fromApi, toApi, feature);\n }\n }\n }\n\n if (fromApi === \"foundation-models\" && toApi === \"orchestration\") {\n const fmSettings = modelSettings as FoundationModelsModelSettings;\n\n for (const feature of FOUNDATION_MODELS_ONLY_FEATURE_KEYS) {\n if (fmSettings[feature] !== undefined) {\n throw new ApiSwitchError(fromApi, toApi, feature);\n }\n }\n }\n}\n\n/**\n * @internal\n */\nconst VALID_API_TYPES: readonly SAPAIApiType[] = [\"orchestration\", \"foundation-models\"];\n\n/** Options for the main validation function. */\nexport interface ValidateSettingsOptions {\n readonly api: SAPAIApiType;\n readonly embeddingSettings?: SAPAIEmbeddingSettings;\n readonly invocationSettings?: {\n readonly api?: SAPAIApiType;\n readonly escapeTemplatePlaceholders?: boolean;\n readonly orchestrationConfigRef?: unknown;\n readonly placeholderValues?: unknown;\n readonly promptTemplateRef?: unknown;\n };\n readonly modelApi?: SAPAIApiType;\n readonly modelSettings?: SAPAIModelSettings | SAPAISettings;\n}\n\n/**\n * Gets the effective escapeTemplatePlaceholders value based on API and settings.\n * @param api - SAP AI API type.\n * @param modelSettings - Model settings.\n * @param invocationEscape - Invocation-level escape setting.\n * @returns Effective escapeTemplatePlaceholders value.\n */\nexport function getEffectiveEscapeTemplatePlaceholders(\n api: SAPAIApiType,\n modelSettings: SAPAIModelSettings | SAPAISettings | undefined,\n invocationEscape: boolean | undefined,\n): boolean {\n if (api === \"foundation-models\") {\n return false;\n }\n\n if (invocationEscape !== undefined) {\n return invocationEscape;\n }\n\n const modelValue = (modelSettings as OrchestrationModelSettings | undefined)\n ?.escapeTemplatePlaceholders;\n if (modelValue !== undefined) {\n return modelValue;\n }\n\n return true;\n}\n\n/**\n * Merges settings with proper API precedence (callSettings > defaultSettings > fallbackApi).\n * @param defaultSettings - Provider-level default settings.\n * @param callSettings - Per-call settings that override defaults.\n * @param fallbackApi - Fallback API type when neither settings specify one.\n * @returns Merged settings with correct API precedence.\n * @internal\n */\nexport function mergeSettingsWithApi<T extends { api?: string }>(\n defaultSettings: Record<string, unknown> | undefined,\n callSettings: Partial<T>,\n fallbackApi: string,\n): T {\n return {\n ...deepMerge(defaultSettings, callSettings as Record<string, unknown>),\n api: callSettings.api ?? (defaultSettings?.api as string | undefined) ?? fallbackApi,\n } as T;\n}\n\n/**\n * Resolves the effective API type using the full precedence chain.\n * @param providerApi - Provider-level API type.\n * @param modelApi - Model-level API type.\n * @param invocationApi - Invocation-level API type.\n * @returns Resolved API type.\n */\nexport function resolveApi(\n providerApi: SAPAIApiType | undefined,\n modelApi: SAPAIApiType | undefined,\n invocationApi: SAPAIApiType | undefined,\n): SAPAIApiType {\n return invocationApi ?? modelApi ?? providerApi ?? \"orchestration\";\n}\n\n/**\n * Validates that the API value is a valid SAPAIApiType.\n * @param api - API value to validate.\n */\nexport function validateApiInput(api: unknown): void {\n if (api === undefined) return;\n\n if (typeof api !== \"string\" || !VALID_API_TYPES.includes(api as SAPAIApiType)) {\n throw new Error(\n `Invalid API type: ${JSON.stringify(api)}. ` +\n `Valid values are: ${VALID_API_TYPES.map((t) => `\"${t}\"`).join(\", \")}`,\n );\n }\n}\n\n/**\n * Main validation function that performs all API-specific validations.\n *\n * This function orchestrates all validation checks:\n * 1. Validates API type inputs\n * 2. Checks for API switching conflicts\n * 3. Validates API-specific feature usage\n * 4. Validates template placeholder escaping\n * @param options - Validation options.\n * @throws {Error} When an invalid API type is provided.\n * @throws {ApiSwitchError} When attempting to switch APIs with incompatible settings.\n * @throws {UnsupportedFeatureError} When using features not supported by the current API.\n * @see {@link ApiSwitchError}\n * @see {@link UnsupportedFeatureError}\n */\nexport function validateSettings(options: ValidateSettingsOptions): void {\n const { api, embeddingSettings, invocationSettings, modelApi, modelSettings } = options;\n\n validateApiInput(api);\n if (invocationSettings?.api !== undefined) {\n validateApiInput(invocationSettings.api);\n }\n\n if (invocationSettings?.api !== undefined) {\n const effectiveModelApi = modelApi ?? \"orchestration\";\n if (effectiveModelApi !== invocationSettings.api) {\n validateApiSwitch(effectiveModelApi, invocationSettings.api, modelSettings);\n }\n }\n\n if (api === \"foundation-models\") {\n validateOrchestrationOnlyOptions(modelSettings);\n validateOrchestrationOnlyInvocationOptions(invocationSettings);\n validateOrchestrationOnlyEmbeddingOptions(embeddingSettings);\n } else {\n validateFoundationModelsOnlyOptions(modelSettings);\n }\n\n const modelEscape = (modelSettings as OrchestrationModelSettings | undefined)\n ?.escapeTemplatePlaceholders;\n const invocationEscape = invocationSettings?.escapeTemplatePlaceholders;\n const effectiveEscape = invocationEscape ?? modelEscape;\n validateEscapeTemplatePlaceholders(api, effectiveEscape);\n}\n\n/**\n * Validates that Orchestration-only options are not passed at invocation level with Foundation Models API.\n * @param invocationSettings - Invocation-level settings to validate.\n * @throws {UnsupportedFeatureError} When any Orchestration-only feature is set at invocation level.\n * @internal\n */\nfunction validateOrchestrationOnlyInvocationOptions(\n invocationSettings: ValidateSettingsOptions[\"invocationSettings\"],\n): void {\n if (!invocationSettings) return;\n\n for (const feature of ORCHESTRATION_ONLY_INVOCATION_FEATURE_KEYS) {\n if (invocationSettings[feature] !== undefined) {\n throw new UnsupportedFeatureError(\n ORCHESTRATION_ONLY_FEATURES[feature],\n \"foundation-models\",\n \"orchestration\",\n );\n }\n }\n}\n","/**\n * SAP AI Embedding Model V2 - Vercel AI SDK EmbeddingModelV2 implementation for SAP AI Core.\n *\n * This module provides the embedding model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) to generate vector embeddings.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed | Vercel AI SDK embed()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed-many | Vercel AI SDK embedMany()}\n */\n\nimport type {\n EmbeddingModelV2,\n EmbeddingModelV3CallOptions as InternalCallOptions,\n SharedV3ProviderMetadata as InternalProviderMetadata,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n SharedV2ProviderOptions,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type { SAPAIApiType, SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport { convertWarningsToV2 } from \"./sap-ai-adapters-v3-to-v2.js\";\nimport { SAPAIEmbeddingModel } from \"./sap-ai-embedding-model.js\";\n\n/** @internal */\ninterface SAPAIEmbeddingModelV2Config {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n}\n\n/**\n * SAP AI Core Embedding Model implementing Vercel AI SDK EmbeddingModelV2.\n *\n * This class provides embedding generation capabilities through SAP AI Core,\n * supporting both the Orchestration API and Foundation Models API.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider-v2\";\n * import { embed, embedMany } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const embeddingModel = provider.textEmbeddingModel(\"text-embedding-3-small\");\n *\n * // Single embedding\n * const { embedding } = await embed({\n * model: embeddingModel,\n * value: \"Hello, world!\",\n * });\n *\n * // Multiple embeddings\n * const { embeddings } = await embedMany({\n * model: embeddingModel,\n * values: [\"Hello\", \"World\"],\n * });\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/embeddings | Vercel AI SDK Embeddings}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAIEmbeddingModelV2 implements EmbeddingModelV2<string> {\n readonly maxEmbeddingsPerCall: number;\n readonly modelId: string;\n readonly provider: string;\n readonly specificationVersion = \"v2\" as const;\n readonly supportsParallelCalls: boolean = true;\n\n /** @internal */\n private readonly internalModel: SAPAIEmbeddingModel;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(\n modelId: string,\n settings: SAPAIEmbeddingSettings,\n config: SAPAIEmbeddingModelV2Config,\n ) {\n this.internalModel = new SAPAIEmbeddingModel(modelId, settings, config);\n this.provider = this.internalModel.provider;\n this.modelId = this.internalModel.modelId;\n this.maxEmbeddingsPerCall = this.internalModel.maxEmbeddingsPerCall;\n this.supportsParallelCalls = this.internalModel.supportsParallelCalls;\n }\n\n async doEmbed(options: {\n abortSignal?: AbortSignal;\n headers?: Record<string, string | undefined>;\n providerOptions?: SharedV2ProviderOptions;\n values: string[];\n }): Promise<{\n embeddings: number[][];\n providerMetadata?: SharedV2ProviderMetadata;\n response?: {\n body?: unknown;\n headers?: SharedV2Headers;\n };\n usage?: { tokens: number };\n }> {\n // Normalize headers by removing entries with undefined values\n const normalizedHeaders: Record<string, string> | undefined = options.headers\n ? (Object.fromEntries(\n Object.entries(options.headers).filter(([, value]) => value !== undefined),\n ) as Record<string, string>)\n : undefined;\n\n // Map options for the internal model call\n const callOptions: InternalCallOptions = {\n abortSignal: options.abortSignal,\n headers: normalizedHeaders,\n providerOptions: options.providerOptions,\n values: options.values,\n };\n const result = await this.internalModel.doEmbed(callOptions);\n\n // Handle any warnings by logging them (V2 API doesn't support returning warnings)\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (result.warnings && result.warnings.length > 0) {\n const warnings = convertWarningsToV2(result.warnings);\n // Log warnings - convertWarningsToV2 normalizes all warnings to type \"other\" with message\n for (const warning of warnings) {\n if (warning.type === \"other\") {\n console.warn(`[SAP AI Embedding] ${warning.message}`);\n }\n }\n }\n\n // Return result in V2 format\n return {\n embeddings: result.embeddings,\n providerMetadata: castProviderMetadataToV2(result.providerMetadata),\n response: result.response\n ? {\n body: result.response.body,\n headers: result.response.headers as SharedV2Headers | undefined,\n }\n : undefined,\n usage: result.usage,\n };\n }\n}\n\n/**\n * Casts internal provider metadata to V2 format.\n * @param metadata - Internal provider metadata.\n * @returns V2 provider metadata.\n * @internal\n */\nfunction castProviderMetadataToV2(\n metadata: InternalProviderMetadata | undefined,\n): SharedV2ProviderMetadata | undefined {\n // Safe cast - SAP implementation uses conditional spreads to avoid undefined values\n return metadata as SharedV2ProviderMetadata | undefined;\n}\n","/**\n * SAP AI Language Model - Vercel AI SDK LanguageModelV3 implementation for SAP AI Core.\n *\n * This module provides the language model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) for chat completions and streaming.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/generate-text | Vercel AI SDK generateText()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/stream-text | Vercel AI SDK streamText()}\n */\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\n\nimport type { SAPAIApiType, SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\n\nimport {\n getProviderName,\n sapAILanguageModelProviderOptions,\n validateModelParamsSettings,\n} from \"./sap-ai-provider-options.js\";\nimport {\n getOrCreateLanguageModelStrategy,\n type LanguageModelAPIStrategy,\n type LanguageModelStrategyConfig,\n} from \"./sap-ai-strategy.js\";\nimport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\n/** @internal */\ninterface SAPAILanguageModelConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n}\n\n/**\n * SAP AI Language Model implementing Vercel AI SDK LanguageModelV3.\n *\n * This class provides chat completion and streaming capabilities through SAP AI Core,\n * supporting both the Orchestration API (with content filtering, grounding, masking,\n * and translation) and Foundation Models API (direct Azure OpenAI access).\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider\";\n * import { generateText, streamText } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const model = provider(\"gpt-4.1\");\n *\n * // Non-streaming\n * const { text } = await generateText({\n * model,\n * prompt: \"Hello!\",\n * });\n *\n * // Streaming\n * const result = streamText({\n * model,\n * prompt: \"Tell me a story\",\n * });\n *\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/generating-text | Vercel AI SDK Text Generation}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAILanguageModel implements LanguageModelV3 {\n readonly modelId: SAPAIModelId;\n readonly specificationVersion = \"v3\";\n readonly supportsImageUrls: boolean = true;\n readonly supportsMultipleCompletions: boolean = true;\n readonly supportsParallelToolCalls: boolean = true;\n readonly supportsStreaming: boolean = true;\n readonly supportsStructuredOutputs: boolean = true;\n readonly supportsToolCalls: boolean = true;\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls(): Record<string, RegExp[]> {\n return {\n \"image/*\": [/^https:\\/\\/.+$/i, /^data:image\\/.*$/],\n };\n }\n\n /** @internal */\n private readonly config: SAPAILanguageModelConfig;\n\n /** @internal */\n private readonly settings: SAPAISettings;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(modelId: SAPAIModelId, settings: SAPAISettings, config: SAPAILanguageModelConfig) {\n if (settings.modelParams) {\n validateModelParamsSettings(settings.modelParams);\n }\n this.settings = settings;\n this.config = config;\n this.modelId = modelId;\n }\n\n async doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult> {\n const { strategy, strategyConfig } = await this.prepareInvocation(options);\n return strategy.doGenerate(strategyConfig, this.settings, options);\n }\n\n async doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult> {\n const { strategy, strategyConfig } = await this.prepareInvocation(options);\n return strategy.doStream(strategyConfig, this.settings, options);\n }\n\n supportsUrl(url: URL): boolean {\n if (url.protocol === \"https:\") return true;\n if (url.protocol === \"data:\") {\n return /^data:image\\//i.test(url.href);\n }\n return false;\n }\n\n /**\n * Prepares common invocation context for doGenerate and doStream.\n * @param options - AI SDK call options.\n * @returns Strategy and configuration for the invocation.\n * @internal\n */\n private async prepareInvocation(options: LanguageModelV3CallOptions): Promise<{\n strategy: LanguageModelAPIStrategy;\n strategyConfig: LanguageModelStrategyConfig;\n }> {\n const providerName = getProviderName(this.config.provider);\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAILanguageModelProviderOptions,\n });\n\n const effectiveApi = resolveApi(this.config.providerApi, this.settings.api, sapOptions?.api);\n\n validateSettings({\n api: effectiveApi,\n invocationSettings: sapOptions\n ? {\n api: sapOptions.api,\n escapeTemplatePlaceholders: sapOptions.escapeTemplatePlaceholders,\n orchestrationConfigRef: sapOptions.orchestrationConfigRef,\n placeholderValues: sapOptions.placeholderValues,\n promptTemplateRef: sapOptions.promptTemplateRef,\n }\n : undefined,\n modelApi: this.settings.api,\n modelSettings: this.settings,\n });\n\n const strategy = await getOrCreateLanguageModelStrategy(effectiveApi);\n\n const strategyConfig: LanguageModelStrategyConfig = {\n deploymentConfig: this.config.deploymentConfig,\n destination: this.config.destination,\n modelId: this.modelId,\n provider: this.config.provider,\n };\n\n return { strategy, strategyConfig };\n }\n}\n","/**\n * SAP AI Language Model V2 - Vercel AI SDK LanguageModelV2 implementation for SAP AI Core.\n *\n * This module provides the language model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) for text generation.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/generate-text | Vercel AI SDK generateText()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/stream-text | Vercel AI SDK streamText()}\n */\n\nimport type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2CallWarning,\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2ResponseMetadata,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type { SAPAIApiType, SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\n\nimport {\n convertFinishReasonToV2,\n convertUsageToV2,\n convertWarningsToV2,\n createV2StreamFromInternal,\n} from \"./sap-ai-adapters-v3-to-v2.js\";\nimport { SAPAILanguageModel as SAPAILanguageModelInternal } from \"./sap-ai-language-model.js\";\n\n/** @internal */\ninterface SAPAILanguageModelV2Config {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n}\n\n/**\n * SAP AI Language Model implementing Vercel AI SDK LanguageModelV2.\n *\n * This class provides chat completion and streaming capabilities through SAP AI Core,\n * supporting both the Orchestration API (with content filtering, grounding, masking,\n * and translation) and Foundation Models API (direct Azure OpenAI access).\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider-v2\";\n * import { generateText, streamText } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const model = provider(\"gpt-4.1\");\n *\n * // Non-streaming\n * const { text } = await generateText({\n * model,\n * prompt: \"Hello!\",\n * });\n *\n * // Streaming\n * const result = streamText({\n * model,\n * prompt: \"Tell me a story\",\n * });\n *\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/generating-text | Vercel AI SDK Text Generation}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAILanguageModelV2 implements LanguageModelV2 {\n readonly modelId: SAPAIModelId;\n readonly specificationVersion = \"v2\" as const;\n\n get provider(): string {\n return this.internalModel.provider;\n }\n\n get supportedUrls(): Record<string, RegExp[]> {\n return this.internalModel.supportedUrls;\n }\n\n /** @internal */\n private readonly internalModel: SAPAILanguageModelInternal;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(modelId: SAPAIModelId, settings: SAPAISettings, config: SAPAILanguageModelV2Config) {\n this.modelId = modelId;\n this.internalModel = new SAPAILanguageModelInternal(modelId, settings, config);\n }\n\n async doGenerate(options: LanguageModelV2CallOptions): Promise<{\n content: LanguageModelV2Content[];\n finishReason: LanguageModelV2FinishReason;\n providerMetadata?: SharedV2ProviderMetadata;\n request?: {\n body?: unknown;\n };\n response?: LanguageModelV2ResponseMetadata & {\n body?: unknown;\n headers?: SharedV2Headers;\n };\n usage: LanguageModelV2Usage;\n warnings: LanguageModelV2CallWarning[];\n }> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n const result = await this.internalModel.doGenerate(options as any);\n\n // Return result in V2 format\n return {\n content: result.content as LanguageModelV2Content[],\n finishReason: convertFinishReasonToV2(result.finishReason),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n providerMetadata: result.providerMetadata as any,\n request: result.request,\n response: result.response\n ? {\n body: result.response.body,\n headers: result.response.headers as SharedV2Headers | undefined,\n id: result.response.id,\n modelId: result.response.modelId,\n timestamp: result.response.timestamp,\n }\n : undefined,\n usage: convertUsageToV2(result.usage),\n warnings: convertWarningsToV2(result.warnings),\n };\n }\n\n async doStream(options: LanguageModelV2CallOptions): Promise<{\n request?: {\n body?: unknown;\n };\n response?: {\n headers?: SharedV2Headers;\n };\n stream: ReadableStream<LanguageModelV2StreamPart>;\n }> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n const result = await this.internalModel.doStream(options as any);\n\n return {\n request: result.request,\n response: result.response\n ? {\n headers: result.response.headers as SharedV2Headers | undefined,\n }\n : undefined,\n stream: createV2StreamFromInternal(result.stream),\n };\n }\n}\n","import type { ImageModelV2, ProviderV2 } from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport { NoSuchModelError } from \"@ai-sdk/provider\";\nimport { setGlobalLogLevel } from \"@sap-cloud-sdk/util\";\n\nimport type { SAPAIEmbeddingModelId } from \"./sap-ai-embedding-model.js\";\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport { SAPAIEmbeddingModelV2 } from \"./sap-ai-embedding-model-v2.js\";\nimport { SAPAILanguageModelV2 } from \"./sap-ai-language-model-v2.js\";\nimport {\n SAP_AI_PROVIDER_NAME,\n validateEmbeddingModelParamsSettings,\n validateModelParamsSettings,\n} from \"./sap-ai-provider-options.js\";\nimport { SAPAIApiType, SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\nimport { mergeSettingsWithApi } from \"./sap-ai-validation.js\";\n\n/** @internal */\nexport type DeploymentConfig = DeploymentIdConfig | ResourceGroupConfig;\n\n/**\n * Configuration settings for the SAP AI Provider.\n * See {@link createSAPAIProvider} for authentication details.\n */\nexport interface SAPAIProviderSettings {\n /**\n * SAP AI Core API to use for all models created by this provider.\n * Can be overridden at model creation time or per-call via providerOptions.\n * - `'orchestration'` (default): SAP AI Core Orchestration API - supports filtering, grounding, masking, translation\n * - `'foundation-models'`: SAP AI Core Foundation Models API - supports dataSources, logprobs, seed, etc.\n * @default 'orchestration'\n */\n readonly api?: SAPAIApiType;\n\n /** Default model settings applied to every model instance. Per-call settings override these. */\n readonly defaultSettings?: SAPAISettings;\n\n /** SAP AI Core deployment ID. If not provided, the SDK resolves deployment automatically. */\n readonly deploymentId?: string;\n\n /** Custom destination configuration for SAP AI Core. */\n readonly destination?: HttpDestinationOrFetchOptions;\n\n /**\n * Log level for SAP Cloud SDK loggers.\n * Controls verbosity of internal SAP SDK logging (e.g., authentication, service binding).\n * Note: SAP_CLOUD_SDK_LOG_LEVEL environment variable takes precedence if set.\n * @default 'warn'\n */\n readonly logLevel?: \"debug\" | \"error\" | \"info\" | \"warn\";\n\n /**\n * Provider name used as key for `providerOptions` and `providerMetadata`.\n * @default 'sap-ai'\n */\n readonly name?: string;\n\n /**\n * SAP AI Core resource group for resource isolation and access control.\n * @default 'default'\n */\n readonly resourceGroup?: string;\n\n /** Whether to emit warnings for ambiguous configurations (e.g. both deploymentId and resourceGroup). */\n readonly warnOnAmbiguousConfig?: boolean;\n}\n\n/** SAP AI Provider interface extending Vercel AI SDK ProviderV2. */\nexport interface SAPAIProviderV2 extends ProviderV2 {\n (modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n chat(modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n /** Always throws - SAP AI Core does not support image generation. */\n imageModel(modelId: string): ImageModelV2;\n languageModel(modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n textEmbeddingModel(\n modelId: SAPAIEmbeddingModelId,\n settings?: SAPAIEmbeddingSettings,\n ): SAPAIEmbeddingModelV2;\n}\n\n/**\n * Creates an SAP AI Provider instance for use with the Vercel AI SDK.\n *\n * Uses the official SAP AI SDK (`@sap-ai-sdk/orchestration` and\n * `@sap-ai-sdk/foundation-models`) for API communication. Authentication is automatic via service binding\n * (VCAP_SERVICES on SAP BTP) or AICORE_SERVICE_KEY environment variable.\n * @param options - Provider configuration options.\n * @param options.api - Default API type: `'orchestration'` (default) or `'foundation-models'`.\n * @param options.defaultSettings - Default model settings applied to every model instance.\n * @param options.deploymentId - SAP AI Core deployment ID for automatic deployment resolution.\n * @param options.destination - Custom SAP Cloud SDK destination configuration.\n * @param options.logLevel - Log level for SAP Cloud SDK loggers (`'debug'`, `'info'`, `'warn'`, `'error'`).\n * @param options.name - Provider name used as key in `providerOptions` (default: `'sap-ai'`).\n * @param options.resourceGroup - SAP AI Core resource group (default: `'default'`).\n * @param options.warnOnAmbiguousConfig - Whether to warn when both deploymentId and resourceGroup are set.\n * @returns A configured SAP AI provider instance that can be used as a callable or via methods.\n * @example\n * // Basic usage with defaults\n * const provider = createSAPAIProvider();\n * const model = provider('gpt-4.1');\n * @example\n * // With custom configuration\n * const provider = createSAPAIProvider({\n * api: 'foundation-models',\n * resourceGroup: 'production',\n * defaultSettings: { modelParams: { temperature: 0.7 } },\n * });\n * @example\n * // Using provider methods\n * const chatModel = provider.chat('gpt-4.1');\n * const embeddingModel = provider.textEmbeddingModel('text-embedding-3-small');\n * @throws {Error} When provider function is called with the `new` keyword.\n * @throws {NoSuchModelError} When `imageModel()` is called (image generation not supported).\n * @see {@link SAPAIProviderSettings} for all configuration options.\n * @see {@link SAPAIProviderV2} for the provider interface.\n */\nexport function createSAPAIProvider(options: SAPAIProviderSettings = {}): SAPAIProviderV2 {\n if (options.defaultSettings?.modelParams) {\n validateModelParamsSettings(options.defaultSettings.modelParams);\n }\n\n const providerName = options.name ?? SAP_AI_PROVIDER_NAME;\n\n const resourceGroup = options.resourceGroup ?? \"default\";\n\n const warnOnAmbiguousConfig = options.warnOnAmbiguousConfig ?? true;\n\n if (warnOnAmbiguousConfig && options.deploymentId && options.resourceGroup) {\n console.warn(\n \"createSAPAIProvider: both 'deploymentId' and 'resourceGroup' were provided; using 'deploymentId' and ignoring 'resourceGroup'.\",\n );\n }\n\n if (!process.env.SAP_CLOUD_SDK_LOG_LEVEL) {\n const logLevel = options.logLevel ?? \"warn\";\n setGlobalLogLevel(logLevel);\n }\n\n const deploymentConfig: DeploymentConfig = options.deploymentId\n ? { deploymentId: options.deploymentId }\n : { resourceGroup };\n\n // Provider-level API setting (defaults to 'orchestration')\n const providerApi = options.api ?? \"orchestration\";\n\n const createModel = (modelId: SAPAIModelId, settings: SAPAISettings = {}) => {\n if (settings.modelParams) {\n validateModelParamsSettings(settings.modelParams);\n }\n\n const mergedSettings = mergeSettingsWithApi<SAPAISettings>(\n options.defaultSettings as Record<string, unknown> | undefined,\n settings,\n providerApi,\n );\n\n return new SAPAILanguageModelV2(modelId, mergedSettings, {\n deploymentConfig,\n destination: options.destination,\n provider: `${providerName}.chat`,\n providerApi,\n });\n };\n\n const createEmbeddingModel = (\n modelId: SAPAIEmbeddingModelId,\n settings: SAPAIEmbeddingSettings = {},\n ): SAPAIEmbeddingModelV2 => {\n if (settings.modelParams) {\n validateEmbeddingModelParamsSettings(settings.modelParams);\n }\n\n const mergedSettings = mergeSettingsWithApi<SAPAIEmbeddingSettings>(\n options.defaultSettings as Record<string, unknown> | undefined,\n settings,\n providerApi,\n );\n\n return new SAPAIEmbeddingModelV2(modelId, mergedSettings, {\n deploymentConfig,\n destination: options.destination,\n provider: `${providerName}.embedding`,\n providerApi,\n });\n };\n\n const provider = function (modelId: SAPAIModelId, settings?: SAPAISettings) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (new.target) {\n throw new Error(\"The SAP AI provider function cannot be called with the new keyword.\");\n }\n\n return createModel(modelId, settings);\n };\n\n provider.chat = createModel;\n provider.languageModel = createModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({\n message: `SAP AI Core does not support image generation. Model '${modelId}' is not available.`,\n modelId,\n modelType: \"imageModel\",\n });\n };\n\n return provider as SAPAIProviderV2;\n}\n\n/** Default SAP AI provider instance with automatic authentication via SAP AI SDK. */\nexport const sapai = createSAPAIProvider();\n","import type { AzureOpenAiChatCompletionParameters } from \"@sap-ai-sdk/foundation-models\";\nimport type {\n ChatCompletionTool,\n ChatModel,\n FilteringModule,\n GroundingModule,\n MaskingModule,\n OrchestrationConfigRef,\n OrchestrationModuleConfig,\n TranslationModule,\n} from \"@sap-ai-sdk/orchestration\";\n\n/** Azure OpenAI chat extension configuration for \"On Your Data\" RAG scenarios. */\nexport type AzureOpenAiChatExtensionConfiguration = NonNullable<\n AzureOpenAiChatCompletionParameters[\"data_sources\"]\n>[number];\n\n/**\n * Common model parameters shared between both APIs.\n *\n * These parameters control text generation behavior and are validated by Zod schemas\n * when passed via `providerOptions`.\n */\nexport interface CommonModelParams {\n /**\n * Frequency penalty to reduce repetition of token sequences.\n * Range: -2.0 to 2.0\n */\n readonly frequencyPenalty?: number;\n /**\n * Maximum number of tokens to generate.\n * Range: Positive integer\n */\n readonly maxTokens?: number;\n /**\n * Number of completions to generate.\n * Not supported by Amazon/Anthropic models.\n * Range: Positive integer\n */\n readonly n?: number;\n /** Whether to enable parallel tool calls when multiple tools are available. */\n readonly parallel_tool_calls?: boolean;\n /**\n * Presence penalty to encourage talking about new topics.\n * Range: -2.0 to 2.0\n */\n readonly presencePenalty?: number;\n /** Index signature for additional model-specific parameters. */\n readonly [key: string]: unknown;\n /**\n * Sampling temperature controlling randomness.\n * Higher values (e.g., 1.0) make output more random, lower values (e.g., 0.2) more deterministic.\n * Range: 0 to 2\n */\n readonly temperature?: number;\n /**\n * Nucleus sampling parameter. Only tokens with cumulative probability up to `topP` are considered.\n * Range: 0 to 1\n */\n readonly topP?: number;\n}\n\n/** Default settings configuration when using Foundation Models API. */\nexport interface FoundationModelsDefaultSettings {\n readonly api: \"foundation-models\";\n readonly settings?: FoundationModelsModelSettings;\n}\n\n/** Model parameters for Foundation Models Embedding API. */\nexport interface FoundationModelsEmbeddingParams {\n readonly dimensions?: number;\n readonly encoding_format?: \"base64\" | \"float\";\n readonly user?: string;\n}\n\n/** Model parameters for Foundation Models API with Azure OpenAI-specific extensions. */\nexport interface FoundationModelsModelParams extends CommonModelParams {\n readonly logit_bias?: AzureOpenAiChatCompletionParameters[\"logit_bias\"];\n readonly logprobs?: AzureOpenAiChatCompletionParameters[\"logprobs\"];\n readonly seed?: AzureOpenAiChatCompletionParameters[\"seed\"];\n readonly stop?: AzureOpenAiChatCompletionParameters[\"stop\"];\n /** Requires logprobs=true. */\n readonly top_logprobs?: AzureOpenAiChatCompletionParameters[\"top_logprobs\"];\n readonly user?: AzureOpenAiChatCompletionParameters[\"user\"];\n}\n\n/** Model settings when using Foundation Models API. */\nexport interface FoundationModelsModelSettings {\n readonly api: \"foundation-models\";\n /** Azure OpenAI \"On Your Data\" configuration for RAG scenarios. */\n readonly dataSources?: AzureOpenAiChatExtensionConfiguration[];\n /** @default false */\n readonly includeReasoning?: boolean;\n readonly modelParams?: FoundationModelsModelParams;\n readonly modelVersion?: string;\n readonly responseFormat?: ResponseFormat;\n}\n\n/** Default settings configuration when using Orchestration API. */\nexport interface OrchestrationDefaultSettings {\n readonly api?: \"orchestration\";\n readonly settings?: OrchestrationModelSettings;\n}\n\n/** Model parameters for Orchestration API. */\nexport type OrchestrationModelParams = CommonModelParams;\n\n/** Model settings when using Orchestration API with filtering, grounding, masking, and translation. */\nexport interface OrchestrationModelSettings {\n readonly api?: \"orchestration\";\n /** @default true */\n readonly escapeTemplatePlaceholders?: boolean;\n /**\n * Additional module configurations for prompt module fallback.\n * The SDK tries the primary configuration first, then each fallback in order until one succeeds.\n * Each entry is a full `OrchestrationModuleConfig` with its own model, prompt, and modules.\n * @example\n * ```ts\n * fallbackModuleConfigs: [\n * {\n * promptTemplating: {\n * model: { name: \"gpt-4.1-mini\" },\n * prompt: { template: [] },\n * },\n * },\n * ]\n * ```\n */\n readonly fallbackModuleConfigs?: OrchestrationModuleConfig[];\n readonly filtering?: FilteringModule;\n readonly grounding?: GroundingModule;\n /** @default false */\n readonly includeReasoning?: boolean;\n readonly masking?: MaskingModule;\n readonly modelParams?: OrchestrationModelParams;\n readonly modelVersion?: string;\n /**\n * Reference to a complete orchestration configuration stored in SAP AI Core Prompt Registry.\n * When provided, local module settings (filtering, masking, grounding, translation, tools,\n * promptTemplateRef, responseFormat) are ignored as the full configuration is managed\n * by the referenced config. Only `placeholderValues` and messages are passed through.\n * @example { id: \"f47ac10b-58cc-4372-a567-0e02b2c3d479\" }\n * @example { scenario: \"customer-support\", name: \"prod-config\", version: \"1.0.0\" }\n */\n readonly orchestrationConfigRef?: OrchestrationConfigRef;\n readonly placeholderValues?: Record<string, string>;\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: ResponseFormat;\n /**\n * Options for streaming behavior with post-LLM modules.\n * Only applies when using `streamText()` with orchestration modules.\n */\n readonly streamOptions?: OrchestrationStreamOptions;\n readonly tools?: ChatCompletionTool[];\n readonly translation?: TranslationModule;\n}\n\n/**\n * Stream options for orchestration post-LLM module processing.\n * Controls chunking behavior for translation, filtering, and other modules during streaming.\n */\nexport interface OrchestrationStreamOptions {\n /**\n * Minimum number of characters per chunk for post-LLM modules.\n * Valid range: 1-10000. Defaults to 100.\n */\n readonly chunkSize?: number;\n /**\n * Delimiters for splitting stream into chunks (e.g., sentence boundaries).\n * Required when translation module is configured.\n * @example [\"\\n\", \".\", \"?\", \"!\"]\n */\n readonly delimiters?: readonly string[];\n /**\n * Additional characters from previous chunks sent to output filtering for context.\n * Valid range: 0-10000.\n */\n readonly outputFilteringOverlap?: number;\n}\n\n/** Reference to a template in SAP AI Core's Prompt Registry. */\nexport type PromptTemplateRef = PromptTemplateRefByID | PromptTemplateRefByScenarioNameVersion;\n\n/** Reference to a Prompt Registry template by ID. */\nexport interface PromptTemplateRefByID {\n readonly id: string;\n readonly scope?: PromptTemplateScope;\n}\n\n/** Reference to a Prompt Registry template by scenario, name, and version. */\nexport interface PromptTemplateRefByScenarioNameVersion {\n readonly name: string;\n readonly scenario: string;\n readonly scope?: PromptTemplateScope;\n readonly version: string;\n}\n\n/** Scope for Prompt Registry templates: 'tenant' (default) or 'resource_group'. */\nexport type PromptTemplateScope = \"resource_group\" | \"tenant\";\n\n/** Response format for structured output (OpenAI-compatible). */\nexport type ResponseFormat = AzureOpenAiChatCompletionParameters[\"response_format\"];\n\n/**\n * Supported API types for SAP AI Core.\n *\n * - `'orchestration'` - Full-featured API with data masking, content filtering, document grounding, and translation.\n * - `'foundation-models'` - Direct model access with Azure OpenAI-specific parameters like `logprobs`, `seed`, and `dataSources`.\n */\nexport type SAPAIApiType = \"foundation-models\" | \"orchestration\";\n\n/** Union type for API-specific default settings configuration. */\nexport type SAPAIDefaultSettingsConfig =\n | FoundationModelsDefaultSettings\n | OrchestrationDefaultSettings;\n\n/** Settings for the SAP AI Embedding Model. */\nexport interface SAPAIEmbeddingSettings {\n readonly api?: SAPAIApiType;\n /** Orchestration API only. */\n readonly masking?: MaskingModule;\n /** @default 2048 */\n readonly maxEmbeddingsPerCall?: number;\n readonly modelParams?: FoundationModelsEmbeddingParams | Record<string, unknown>;\n readonly modelVersion?: string;\n readonly [key: string]: unknown;\n /** @default 'text' */\n readonly type?: \"document\" | \"query\" | \"text\";\n}\n\n/**\n * Supported model IDs in SAP AI Core.\n *\n * Model availability depends on tenant configuration and region.\n * Common values include: `'gpt-4.1'`, `'gpt-4.1-mini'`, `'anthropic--claude-4.5-sonnet'`, `'gemini-2.5-pro'`.\n * @see {@link https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/models-and-scenarios-in-generative-ai-hub|SAP AI Core Models}\n */\nexport type SAPAIModelId = ChatModel;\n\n/**\n * Union type for model settings - supports both APIs.\n *\n * Use `FoundationModelsModelSettings` for Foundation Models API features (dataSources, logprobs, seed).\n * Use `OrchestrationModelSettings` for Orchestration API features (filtering, grounding, masking, translation).\n */\nexport type SAPAIModelSettings = FoundationModelsModelSettings | OrchestrationModelSettings;\n\n/** Re-exported Azure OpenAI types from `@sap-ai-sdk/foundation-models`. */\nexport type {\n AzureOpenAiChatCompletionParameters,\n AzureOpenAiChatCompletionRequestAssistantMessage,\n AzureOpenAiChatCompletionRequestMessage,\n AzureOpenAiChatCompletionRequestSystemMessage,\n AzureOpenAiChatCompletionRequestToolMessage,\n AzureOpenAiChatCompletionRequestUserMessage,\n AzureOpenAiChatCompletionTool,\n AzureOpenAiEmbeddingParameters,\n AzureOpenAiFunctionObject,\n} from \"@sap-ai-sdk/foundation-models\";\n\n/** Re-exported SAP AI SDK orchestration types. */\nexport type {\n FilteringModule,\n GroundingModule,\n MaskingModule,\n TranslationModule,\n} from \"@sap-ai-sdk/orchestration\";\n\nexport {\n buildAzureContentSafetyFilter,\n buildDocumentGroundingConfig,\n buildDpiMaskingProvider,\n buildLlamaGuard38BFilter,\n buildTranslationConfig,\n} from \"@sap-ai-sdk/orchestration\";\n\n/**\n * Settings for configuring SAP AI Core model behavior.\n * Legacy interface maintained for backward compatibility - prefer OrchestrationModelSettings\n * or FoundationModelsModelSettings for API-specific type safety.\n */\nexport interface SAPAISettings {\n readonly api?: SAPAIApiType;\n /** @default true */\n readonly escapeTemplatePlaceholders?: boolean;\n /** Orchestration API only. */\n readonly filtering?: FilteringModule;\n /** Orchestration API only. */\n readonly grounding?: GroundingModule;\n /** @default false */\n readonly includeReasoning?: boolean;\n /** Orchestration API only. */\n readonly masking?: MaskingModule;\n readonly modelParams?: CommonModelParams;\n readonly modelVersion?: string;\n /** Orchestration API only. */\n readonly orchestrationConfigRef?: OrchestrationConfigRef;\n /** Orchestration API only. */\n readonly placeholderValues?: Record<string, string>;\n /** Orchestration API only. */\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: ResponseFormat;\n /** Orchestration API only. */\n readonly streamOptions?: OrchestrationStreamOptions;\n /** Orchestration API only. */\n readonly tools?: ChatCompletionTool[];\n /** Orchestration API only. */\n readonly translation?: TranslationModule;\n}\n\nexport type {\n AssistantChatMessage,\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n ChatMessageContent,\n ChatMessages,\n Citation,\n DeveloperChatMessage,\n DocumentTranslationApplyToSelector,\n FileContent,\n FunctionObject,\n ImageContentUrl,\n LlmModelDetails,\n LlmModelParams,\n OrchestrationConfigRef,\n OrchestrationError,\n OrchestrationModuleConfig,\n OrchestrationModuleConfigList,\n PromptTemplatingModule,\n SystemChatMessage,\n ToolChatMessage,\n TranslationApplyToCategory,\n TranslationInputParameters,\n TranslationOutputParameters,\n TranslationTargetLanguage,\n UserChatMessage,\n UserChatMessageContent,\n UserChatMessageContentItem,\n} from \"@sap-ai-sdk/orchestration\";\n\nexport {\n OrchestrationEmbeddingResponse,\n OrchestrationResponse,\n OrchestrationStream,\n OrchestrationStreamChunkResponse,\n OrchestrationStreamResponse,\n} from \"@sap-ai-sdk/orchestration\";\n","/**\n * `@jerome-benoit/sap-ai-provider-v2`\n *\n * Vercel AI SDK V2 provider for SAP AI Core.\n *\n * This package provides LanguageModelV2 and EmbeddingModelV2 interfaces\n * for compatibility with Vercel AI SDK. Internally uses the provider's\n * implementation with automatic format transformation to V2.\n * @see {@link https://sdk.vercel.ai/} Vercel AI SDK documentation\n */\n\n/**\n * Utility functions for escaping template delimiters (`{{`, `{%`, `{#`) in orchestration content.\n */\nexport {\n escapeOrchestrationPlaceholders,\n unescapeOrchestrationPlaceholders,\n} from \"./convert-to-sap-messages.js\";\n\n/**\n * Embedding model class implementing EmbeddingModelV2 for SAP AI Core.\n * V2 facade over internal implementation.\n */\nexport { SAPAIEmbeddingModelV2 as SAPAIEmbeddingModel } from \"./sap-ai-embedding-model-v2.js\";\n\nexport type { SAPAIEmbeddingModelId } from \"./sap-ai-embedding-model.js\";\n\n/**\n * Custom error classes for Foundation Models API support.\n * - `UnsupportedFeatureError`: Thrown when a feature is used with an incompatible API.\n * - `ApiSwitchError`: Thrown when attempting to switch APIs at invocation time with conflicting settings.\n */\nexport { ApiSwitchError, UnsupportedFeatureError } from \"./sap-ai-error.js\";\n\n/**\n * Language model class implementing LanguageModelV2 for SAP AI Core.\n * V2 facade over internal implementation.\n */\nexport { SAPAILanguageModelV2 as SAPAILanguageModel } from \"./sap-ai-language-model-v2.js\";\n\n/**\n * Provider options for per-call configuration.\n *\n * These schemas and types enable runtime validation of provider options\n * passed via `providerOptions['sap-ai']` in Vercel AI SDK calls.\n */\nexport {\n getProviderName,\n SAP_AI_PROVIDER_NAME,\n sapAIEmbeddingProviderOptions,\n sapAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\n\nexport type {\n SAPAIEmbeddingProviderOptions,\n SAPAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\n\n/**\n * Provider factory function implementing ProviderV2 interface.\n * Creates language and embedding model instances for SAP AI Core.\n */\nexport { createSAPAIProvider, sapai } from \"./sap-ai-provider-v2.js\";\n\nexport type {\n DeploymentConfig,\n SAPAIProviderV2 as SAPAIProvider,\n SAPAIProviderSettings,\n} from \"./sap-ai-provider-v2.js\";\n\n/**\n * Model settings types and model identifier type definitions.\n */\nexport type {\n AzureOpenAiChatExtensionConfiguration,\n CommonModelParams,\n FoundationModelsDefaultSettings,\n FoundationModelsEmbeddingParams,\n FoundationModelsModelParams,\n FoundationModelsModelSettings,\n OrchestrationDefaultSettings,\n OrchestrationModelParams,\n OrchestrationModelSettings,\n OrchestrationStreamOptions,\n PromptTemplateRef,\n PromptTemplateRefByID,\n PromptTemplateRefByScenarioNameVersion,\n PromptTemplateScope,\n ResponseFormat,\n SAPAIApiType,\n SAPAIDefaultSettingsConfig,\n SAPAIEmbeddingSettings,\n SAPAIModelId,\n SAPAIModelSettings,\n SAPAISettings,\n} from \"./sap-ai-settings.js\";\n\n/**\n * SAP AI SDK types and utilities.\n *\n * Re-exported for convenience and advanced usage scenarios.\n */\nexport type {\n AssistantChatMessage,\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n ChatMessageContent,\n ChatMessages,\n Citation,\n DeveloperChatMessage,\n DocumentTranslationApplyToSelector,\n FileContent,\n FilteringModule,\n FunctionObject,\n GroundingModule,\n ImageContentUrl,\n LlmModelDetails,\n LlmModelParams,\n MaskingModule,\n OrchestrationConfigRef,\n OrchestrationError,\n OrchestrationModuleConfig,\n OrchestrationModuleConfigList,\n PromptTemplatingModule,\n SystemChatMessage,\n ToolChatMessage,\n TranslationApplyToCategory,\n TranslationInputParameters,\n TranslationModule,\n TranslationOutputParameters,\n TranslationTargetLanguage,\n UserChatMessage,\n UserChatMessageContent,\n UserChatMessageContentItem,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Helper functions for building configurations.\n */\nexport {\n buildAzureContentSafetyFilter,\n buildDocumentGroundingConfig,\n buildDpiMaskingProvider,\n buildLlamaGuard38BFilter,\n buildTranslationConfig,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Response classes from the SAP AI SDK for orchestration results.\n */\nexport {\n OrchestrationEmbeddingResponse,\n OrchestrationResponse,\n OrchestrationStream,\n OrchestrationStreamChunkResponse,\n OrchestrationStreamResponse,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Validation utilities for API selection and feature compatibility.\n * - `resolveApi`: Resolves API type from provider/model/invocation precedence chain.\n * - `validateSettings`: Validates settings are compatible with the selected API.\n */\nexport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\n/**\n * Package version, injected at build time.\n */\nexport { VERSION } from \"./version.js\";\n\n/**\n * Error handling types and classes for SAP AI Core error responses.\n */\nexport type { OrchestrationErrorResponse } from \"@sap-ai-sdk/orchestration\";\n\n/**\n * Direct access to SAP AI SDK OrchestrationClient.\n *\n * For advanced users who need to use the SAP AI SDK directly.\n */\nexport { OrchestrationClient, OrchestrationEmbeddingClient } from \"@sap-ai-sdk/orchestration\";\n"],"mappings":"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","names":["OrchestrationEmbeddingClient","OrchestrationClient","parseProviderOptions","parseProviderOptions"]}