@jerome-benoit/sap-ai-provider-v2 5.0.3 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +44 -24
  2. package/dist/chunk-4ILJD6PI.js +333 -0
  3. package/dist/chunk-4ILJD6PI.js.map +1 -0
  4. package/dist/chunk-BHA5MIN6.js +224 -0
  5. package/dist/chunk-BHA5MIN6.js.map +1 -0
  6. package/dist/{chunk-4JLNWASF.js → chunk-DLGBK3C3.js} +91 -7
  7. package/dist/chunk-DLGBK3C3.js.map +1 -0
  8. package/dist/{chunk-E76ZDPIW.js → chunk-EUBI5ENK.js} +54 -27
  9. package/dist/chunk-EUBI5ENK.js.map +1 -0
  10. package/dist/{chunk-YP3AADWD.js → chunk-FKHOJ3ZC.js} +24 -3
  11. package/dist/chunk-FKHOJ3ZC.js.map +1 -0
  12. package/dist/{chunk-UIBQ5AFS.js → chunk-QFMHNGLB.js} +56 -218
  13. package/dist/chunk-QFMHNGLB.js.map +1 -0
  14. package/dist/{chunk-3H5C5U22.js → chunk-QQQYMQPU.js} +19 -10
  15. package/dist/chunk-QQQYMQPU.js.map +1 -0
  16. package/dist/{chunk-NF355OFT.js → chunk-ZOBD7PXJ.js} +116 -21
  17. package/dist/chunk-ZOBD7PXJ.js.map +1 -0
  18. package/dist/{foundation-models-embedding-model-strategy-SAVQFBF4.js → foundation-models-embedding-model-strategy-3WAKJXBY.js} +5 -4
  19. package/dist/{foundation-models-embedding-model-strategy-SAVQFBF4.js.map → foundation-models-embedding-model-strategy-3WAKJXBY.js.map} +1 -1
  20. package/dist/{foundation-models-language-model-strategy-ZDOWVYTA.js → foundation-models-language-model-strategy-PJ26VXEA.js} +21 -8
  21. package/dist/foundation-models-language-model-strategy-PJ26VXEA.js.map +1 -0
  22. package/dist/index.cjs +2008 -497
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +798 -185
  25. package/dist/index.d.ts +798 -185
  26. package/dist/index.js +148 -24
  27. package/dist/index.js.map +1 -1
  28. package/dist/{orchestration-embedding-model-strategy-GT27AFII.js → orchestration-embedding-model-strategy-AZ76XLMD.js} +6 -5
  29. package/dist/{orchestration-embedding-model-strategy-GT27AFII.js.map → orchestration-embedding-model-strategy-AZ76XLMD.js.map} +1 -1
  30. package/dist/{orchestration-language-model-strategy-7QTPQHCC.js → orchestration-language-model-strategy-CT6RHCYO.js} +48 -17
  31. package/dist/orchestration-language-model-strategy-CT6RHCYO.js.map +1 -0
  32. package/dist/responses-language-model-strategy-UYTV6TPM.js +738 -0
  33. package/dist/responses-language-model-strategy-UYTV6TPM.js.map +1 -0
  34. package/dist/sap-ai-error-UPKYWPSS.js +16 -0
  35. package/dist/sap-ai-error-UPKYWPSS.js.map +1 -0
  36. package/package.json +79 -39
  37. package/dist/chunk-3H5C5U22.js.map +0 -1
  38. package/dist/chunk-4JLNWASF.js.map +0 -1
  39. package/dist/chunk-E76ZDPIW.js.map +0 -1
  40. package/dist/chunk-NF355OFT.js.map +0 -1
  41. package/dist/chunk-UIBQ5AFS.js.map +0 -1
  42. package/dist/chunk-YP3AADWD.js.map +0 -1
  43. package/dist/foundation-models-language-model-strategy-ZDOWVYTA.js.map +0 -1
  44. package/dist/orchestration-language-model-strategy-7QTPQHCC.js.map +0 -1
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-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 for the semantic differences between the V3 core and V2 facade. */\n\nimport type {\n LanguageModelV3StreamPart as InternalStreamPart,\n LanguageModelV3Usage as InternalUsage,\n SharedV3Warning as InternalWarning,\n} from \"@ai-sdk/provider\";\nimport type {\n LanguageModelV2CallWarning,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2ProviderMetadata,\n} from \"@ai-sdk/provider-v2\";\n\n/** Stream events supported by the V2 facade. */\nexport type ConvertedV2StreamPart =\n | Exclude<LanguageModelV2StreamPart, { type: \"stream-start\" }>\n | { type: \"stream-start\"; warnings: ConvertedV2Warning[] };\n\n/** V2 warning representation used when adapting V3 feature diagnostics. */\nexport type ConvertedV2Warning = Extract<LanguageModelV2CallWarning, { type: \"other\" }>;\n\n/**\n * Converts V3-only event fields; structurally identical events pass through unchanged.\n * @param internalPart - V3 stream event\n * @returns V2 event, or null for unsupported tool approval requests\n * @internal\n */\nexport function convertStreamPartToV2(\n internalPart: InternalStreamPart,\n): ConvertedV2StreamPart | null {\n // V2 has a narrower JSON metadata type; preserve the core payload without cloning.\n const compatiblePart = internalPart as InternalStreamPart & {\n providerMetadata?: SharedV2ProviderMetadata;\n };\n switch (compatiblePart.type) {\n case \"file\": {\n const { providerMetadata: _providerMetadata, ...part } = compatiblePart;\n return part;\n }\n case \"finish\":\n return {\n ...compatiblePart,\n finishReason: compatiblePart.finishReason.unified,\n usage: convertUsageToV2(compatiblePart.usage),\n };\n case \"stream-start\":\n return { ...compatiblePart, warnings: convertWarningsToV2(compatiblePart.warnings) };\n case \"tool-approval-request\":\n return null;\n case \"tool-call\": {\n const { dynamic: _dynamic, ...part } = compatiblePart;\n return part;\n }\n case \"tool-input-start\": {\n const { dynamic: _dynamic, title: _title, ...part } = compatiblePart;\n return part;\n }\n case \"tool-result\": {\n const { dynamic: _dynamic, preliminary: _preliminary, ...part } = compatiblePart;\n // Provider execution and dynamic tool classification are independent in V3.\n return { ...part, providerExecuted: true };\n }\n default:\n return compatiblePart;\n }\n}\n\n/**\n * Flattens usage without inventing totals when either component is unknown.\n * @param internalUsage - V3 nested usage\n * @returns V2 usage\n * @internal\n */\nexport function convertUsageToV2(internalUsage: InternalUsage): LanguageModelV2Usage {\n return {\n cachedInputTokens: internalUsage.inputTokens.cacheRead,\n inputTokens: internalUsage.inputTokens.total,\n outputTokens: internalUsage.outputTokens.total,\n reasoningTokens: internalUsage.outputTokens.reasoning,\n totalTokens:\n internalUsage.inputTokens.total !== undefined &&\n internalUsage.outputTokens.total !== undefined\n ? internalUsage.inputTokens.total + internalUsage.outputTokens.total\n : undefined,\n };\n}\n\n/**\n * Converts warnings to V2's descriptive other-warning representation.\n * @param internalWarnings - V3 warnings\n * @returns V2 warnings\n * @internal\n */\nexport function convertWarningsToV2(internalWarnings: InternalWarning[]): ConvertedV2Warning[] {\n return internalWarnings.map(convertWarningToV2);\n}\n\n/**\n * Retains feature and compatibility details absent from the V2 warning union.\n * @param internalWarning - V3 warning\n * @returns V2 warning\n * @internal\n */\nexport function convertWarningToV2(internalWarning: InternalWarning): ConvertedV2Warning {\n if (internalWarning.type === \"other\") return internalWarning;\n const prefix =\n internalWarning.type === \"unsupported\" ? \"Unsupported feature\" : \"Compatibility mode\";\n return {\n message: `${prefix}: ${internalWarning.feature}${internalWarning.details ? `. ${internalWarning.details}` : \"\"}`,\n type: \"other\",\n };\n}\n\n/**\n * Converts an internal stream, preserving backpressure, cancellation and errors.\n * @param internalStream - V3 stream\n * @returns V2 stream\n * @internal\n */\nexport function createV2StreamFromInternal(\n internalStream: ReadableStream<InternalStreamPart>,\n): ReadableStream<ConvertedV2StreamPart> {\n return internalStream.pipeThrough(\n new TransformStream<InternalStreamPart, ConvertedV2StreamPart>({\n transform(chunk, controller) {\n const converted = convertStreamPartToV2(chunk);\n if (converted !== null) controller.enqueue(converted);\n },\n }),\n );\n}\n","/**\n * SAP AI Embedding Model - Vercel AI SDK EmbeddingModelV3 implementation for SAP AI Core.\n *\n * This module provides the embedding model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) to generate vector embeddings.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed | Vercel AI SDK embed()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed-many | Vercel AI SDK embedMany()}\n */\nimport type {\n EmbeddingModelV3,\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\n\nimport type { SAPAIApiType, SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport {\n getProviderName,\n sapAIEmbeddingProviderOptions,\n validateEmbeddingModelParamsSettings,\n} from \"./sap-ai-provider-options.js\";\nimport {\n type EmbeddingModelStrategyConfig,\n getOrCreateEmbeddingModelStrategy,\n} from \"./sap-ai-strategy.js\";\nimport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\nconst DEFAULT_MAX_EMBEDDINGS_PER_CALL = 2048;\nconst maxEmbeddingsPerCallSchema = z.number().int().positive().or(z.literal(Infinity));\n\n/**\n * Model identifier for SAP AI embedding models.\n *\n * Common embedding model IDs include:\n * - `\"text-embedding-3-small\"` - OpenAI small embedding model (recommended)\n * - `\"text-embedding-3-large\"` - OpenAI large embedding model\n *\n * The actual available models depend on your SAP AI Core deployment configuration.\n * @see {@link https://help.sap.com/docs/sap-ai-core | SAP AI Core Documentation}\n */\nexport type SAPAIEmbeddingModelId = string;\n\n/** @internal */\ninterface SAPAIEmbeddingModelConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Core Embedding Model implementing Vercel AI SDK EmbeddingModelV3.\n *\n * This class provides embedding generation capabilities through SAP AI Core,\n * supporting both the Orchestration API and Foundation Models API.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider\";\n * import { embed, embedMany } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const embeddingModel = provider.embedding(\"text-embedding-3-small\");\n *\n * // Single embedding\n * const { embedding } = await embed({\n * model: embeddingModel,\n * value: \"Hello, world!\",\n * });\n *\n * // Multiple embeddings\n * const { embeddings } = await embedMany({\n * model: embeddingModel,\n * values: [\"Hello\", \"World\"],\n * });\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/embeddings | Vercel AI SDK Embeddings}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAIEmbeddingModel implements EmbeddingModelV3 {\n readonly maxEmbeddingsPerCall: number;\n readonly modelId: string;\n readonly provider: string;\n readonly specificationVersion = \"v3\" as const;\n readonly supportsParallelCalls: boolean = true;\n\n private readonly config: SAPAIEmbeddingModelConfig;\n private readonly settings: SAPAIEmbeddingSettings;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(\n modelId: SAPAIEmbeddingModelId,\n settings: SAPAIEmbeddingSettings = {},\n config: SAPAIEmbeddingModelConfig,\n ) {\n if (settings.modelParams) {\n validateEmbeddingModelParamsSettings(settings.modelParams);\n }\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n this.provider = config.provider;\n this.maxEmbeddingsPerCall = maxEmbeddingsPerCallSchema.parse(\n settings.maxEmbeddingsPerCall ?? DEFAULT_MAX_EMBEDDINGS_PER_CALL,\n );\n }\n\n async doEmbed(options: EmbeddingModelV3CallOptions): Promise<EmbeddingModelV3Result> {\n const providerName = getProviderName(this.config.provider);\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAIEmbeddingProviderOptions,\n });\n\n const effectiveApi = resolveApi(this.config.providerApi, this.settings.api, sapOptions?.api);\n\n validateSettings({\n api: effectiveApi,\n embeddingSettings: this.settings,\n invocationSettings: sapOptions ? { api: sapOptions.api } : undefined,\n modelApi: this.settings.api,\n });\n\n const strategy = await getOrCreateEmbeddingModelStrategy(effectiveApi);\n\n const strategyConfig: EmbeddingModelStrategyConfig = {\n deploymentConfig: this.config.deploymentConfig,\n destination: this.config.destination,\n modelId: this.modelId,\n parsedProviderOptions: sapOptions,\n provider: this.config.provider,\n requestConfig: this.config.requestConfig,\n };\n\n return strategy.doEmbed(strategyConfig, this.settings, options, this.maxEmbeddingsPerCall);\n }\n}\n","/** Strategy pattern infrastructure for SAP AI Core API support. */\nimport type {\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type {\n SAPAIEmbeddingProviderOptions,\n SAPAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\nimport type {\n SAPAIApiType,\n SAPAIEmbeddingSettings,\n SAPAIModelSettings,\n} from \"./sap-ai-settings.js\";\n\n/** @internal */\nexport interface EmbeddingModelAPIStrategy {\n doEmbed(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n options: EmbeddingModelV3CallOptions,\n maxEmbeddingsPerCall: number,\n ): Promise<EmbeddingModelV3Result>;\n}\n\n/** @internal */\nexport interface EmbeddingModelStrategyConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly modelId: string;\n readonly parsedProviderOptions?: SAPAIEmbeddingProviderOptions;\n readonly provider: string;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * Strategy interface for language model API implementations.\n * @template TSettings - The model settings type, defaults to SAPAIModelSettings for backward compatibility\n * @internal\n */\nexport interface LanguageModelAPIStrategy<\n TSettings extends SAPAIModelSettings = SAPAIModelSettings,\n> {\n doGenerate(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult>;\n\n doStream(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult>;\n}\n\n/** @internal */\nexport interface LanguageModelStrategyConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly modelId: string;\n readonly parsedProviderOptions?: SAPAILanguageModelProviderOptions;\n readonly provider: string;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/** @internal */\nconst languageModelStrategyCache = new Map<SAPAIApiType, Promise<LanguageModelAPIStrategy>>();\n\n/** @internal */\nconst embeddingModelStrategyCache = new Map<SAPAIApiType, Promise<EmbeddingModelAPIStrategy>>();\n\n/** @internal */\nexport function clearStrategyCaches(): void {\n languageModelStrategyCache.clear();\n embeddingModelStrategyCache.clear();\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Embedding model strategy.\n * @internal\n */\nexport function getOrCreateEmbeddingModelStrategy(\n api: SAPAIApiType,\n): Promise<EmbeddingModelAPIStrategy> {\n const cached = embeddingModelStrategyCache.get(api);\n if (cached) {\n return cached;\n }\n\n // Cache the Promise synchronously before any await to prevent race conditions\n const strategyPromise = createEmbeddingModelStrategy(api);\n embeddingModelStrategyCache.set(api, strategyPromise);\n\n strategyPromise.catch(() => {\n embeddingModelStrategyCache.delete(api);\n });\n\n return strategyPromise;\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Language model strategy.\n * @internal\n */\nexport function getOrCreateLanguageModelStrategy(\n api: SAPAIApiType,\n): Promise<LanguageModelAPIStrategy> {\n const cached = languageModelStrategyCache.get(api);\n if (cached) {\n return cached;\n }\n\n // Cache the Promise synchronously before any await to prevent race conditions\n const strategyPromise = createLanguageModelStrategy(api);\n languageModelStrategyCache.set(api, strategyPromise);\n\n strategyPromise.catch(() => {\n languageModelStrategyCache.delete(api);\n });\n\n return strategyPromise;\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Embedding model strategy.\n */\nasync function createEmbeddingModelStrategy(api: SAPAIApiType): Promise<EmbeddingModelAPIStrategy> {\n if (api === \"foundation-models\") {\n const { AzureOpenAiEmbeddingClient } = await import(\"@sap-ai-sdk/foundation-models\");\n const { FoundationModelsEmbeddingModelStrategy } =\n await import(\"./foundation-models-embedding-model-strategy.js\");\n return new FoundationModelsEmbeddingModelStrategy(AzureOpenAiEmbeddingClient);\n }\n\n const { OrchestrationEmbeddingClient } = await import(\"@sap-ai-sdk/orchestration\");\n const { OrchestrationEmbeddingModelStrategy } =\n await import(\"./orchestration-embedding-model-strategy.js\");\n return new OrchestrationEmbeddingModelStrategy(OrchestrationEmbeddingClient);\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Language model strategy.\n */\nasync function createLanguageModelStrategy(api: SAPAIApiType): Promise<LanguageModelAPIStrategy> {\n if (api === \"foundation-models\") {\n const { AzureOpenAiChatClient } = await import(\"@sap-ai-sdk/foundation-models\");\n const { FoundationModelsLanguageModelStrategy } =\n await import(\"./foundation-models-language-model-strategy.js\");\n return new FoundationModelsLanguageModelStrategy(AzureOpenAiChatClient);\n }\n\n const { OrchestrationClient } = await import(\"@sap-ai-sdk/orchestration\");\n const { OrchestrationLanguageModelStrategy } =\n await import(\"./orchestration-language-model-strategy.js\");\n return new OrchestrationLanguageModelStrategy(OrchestrationClient);\n}\n","/**\n * SAP AI Embedding Model V2 - Vercel AI SDK EmbeddingModelV2 implementation for SAP AI Core.\n *\n * This module provides the embedding model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) to generate vector embeddings.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed | Vercel AI SDK embed()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed-many | Vercel AI SDK embedMany()}\n */\n\nimport type { EmbeddingModelV3CallOptions as InternalCallOptions } from \"@ai-sdk/provider\";\nimport type {\n EmbeddingModelV2,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n SharedV2ProviderOptions,\n} from \"@ai-sdk/provider-v2\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type { SAPAIApiType, SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport { convertWarningsToV2 } from \"./sap-ai-adapters-v3-to-v2.js\";\nimport { SAPAIEmbeddingModel } from \"./sap-ai-embedding-model.js\";\n\n/** @internal */\ninterface SAPAIEmbeddingModelV2Config {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Core Embedding Model implementing Vercel AI SDK EmbeddingModelV2.\n *\n * This class provides embedding generation capabilities through SAP AI Core,\n * supporting both the Orchestration API and Foundation Models API.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider-v2\";\n * import { embed, embedMany } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const embeddingModel = provider.textEmbeddingModel(\"text-embedding-3-small\");\n *\n * // Single embedding\n * const { embedding } = await embed({\n * model: embeddingModel,\n * value: \"Hello, world!\",\n * });\n *\n * // Multiple embeddings\n * const { embeddings } = await embedMany({\n * model: embeddingModel,\n * values: [\"Hello\", \"World\"],\n * });\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/embeddings | Vercel AI SDK Embeddings}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAIEmbeddingModelV2 implements EmbeddingModelV2<string> {\n readonly maxEmbeddingsPerCall: number;\n readonly modelId: string;\n readonly provider: string;\n readonly specificationVersion = \"v2\" as const;\n readonly supportsParallelCalls: boolean = true;\n\n /** @internal */\n private readonly internalModel: SAPAIEmbeddingModel;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(\n modelId: string,\n settings: SAPAIEmbeddingSettings,\n config: SAPAIEmbeddingModelV2Config,\n ) {\n this.internalModel = new SAPAIEmbeddingModel(modelId, settings, config);\n this.provider = this.internalModel.provider;\n this.modelId = this.internalModel.modelId;\n this.maxEmbeddingsPerCall = this.internalModel.maxEmbeddingsPerCall;\n this.supportsParallelCalls = this.internalModel.supportsParallelCalls;\n }\n\n async doEmbed(options: {\n abortSignal?: AbortSignal;\n headers?: Record<string, string | undefined>;\n providerOptions?: SharedV2ProviderOptions;\n values: string[];\n }): Promise<{\n embeddings: number[][];\n providerMetadata?: SharedV2ProviderMetadata;\n response?: {\n body?: unknown;\n headers?: SharedV2Headers;\n };\n usage?: { tokens: number };\n }> {\n // Normalize headers by removing entries with undefined values\n const normalizedHeaders: Record<string, string> | undefined = options.headers\n ? (Object.fromEntries(\n Object.entries(options.headers).filter(([, value]) => value !== undefined),\n ) as Record<string, string>)\n : undefined;\n\n // Map options for the internal model call\n const callOptions: InternalCallOptions = {\n abortSignal: options.abortSignal,\n headers: normalizedHeaders,\n providerOptions: options.providerOptions,\n values: options.values,\n };\n const result = await this.internalModel.doEmbed(callOptions);\n\n // Handle any warnings by logging them (V2 API doesn't support returning warnings)\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (result.warnings && result.warnings.length > 0) {\n const warnings = convertWarningsToV2(result.warnings);\n // Log warnings - convertWarningsToV2 normalizes all warnings to type \"other\" with message\n for (const warning of warnings) {\n console.warn(`[SAP AI Embedding] ${warning.message}`);\n }\n }\n\n // Return result in V2 format\n return {\n embeddings: result.embeddings,\n providerMetadata: result.providerMetadata as SharedV2ProviderMetadata | undefined,\n response: result.response,\n usage: result.usage,\n };\n }\n}\n","/**\n * SAP AI Language Model - Vercel AI SDK LanguageModelV3 implementation for SAP AI Core.\n *\n * This module provides the language model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) for chat completions and streaming.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/generate-text | Vercel AI SDK generateText()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/stream-text | Vercel AI SDK streamText()}\n */\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\n\nimport type { SAPAIApiType, SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\n\nimport {\n getProviderName,\n sapAILanguageModelProviderOptions,\n validateModelParamsSettings,\n} from \"./sap-ai-provider-options.js\";\nimport {\n getOrCreateLanguageModelStrategy,\n type LanguageModelAPIStrategy,\n type LanguageModelStrategyConfig,\n} from \"./sap-ai-strategy.js\";\nimport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\n/** @internal */\ninterface SAPAILanguageModelConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Language Model implementing Vercel AI SDK LanguageModelV3.\n *\n * This class provides chat completion and streaming capabilities through SAP AI Core,\n * supporting both the Orchestration API (with content filtering, grounding, masking,\n * and translation) and Foundation Models API (direct Azure OpenAI access).\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider\";\n * import { generateText, streamText } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const model = provider(\"gpt-4.1\");\n *\n * // Non-streaming\n * const { text } = await generateText({\n * model,\n * prompt: \"Hello!\",\n * });\n *\n * // Streaming\n * const result = streamText({\n * model,\n * prompt: \"Tell me a story\",\n * });\n *\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/generating-text | Vercel AI SDK Text Generation}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAILanguageModel implements LanguageModelV3 {\n readonly modelId: SAPAIModelId;\n readonly specificationVersion = \"v3\";\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls(): Record<string, RegExp[]> {\n return {\n \"image/*\": [/^https:\\/\\/.+$/i, /^data:image\\/.*$/],\n };\n }\n\n /** @internal */\n private readonly config: SAPAILanguageModelConfig;\n\n /** @internal */\n private readonly settings: SAPAISettings;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(modelId: SAPAIModelId, settings: SAPAISettings, config: SAPAILanguageModelConfig) {\n if (settings.modelParams) {\n validateModelParamsSettings(settings.modelParams);\n }\n this.settings = settings;\n this.config = config;\n this.modelId = modelId;\n }\n\n async doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult> {\n const { strategy, strategyConfig } = await this.prepareInvocation(options);\n return strategy.doGenerate(strategyConfig, this.settings, options);\n }\n\n async doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult> {\n const { strategy, strategyConfig } = await this.prepareInvocation(options);\n return strategy.doStream(strategyConfig, this.settings, options);\n }\n\n supportsUrl(url: URL): boolean {\n if (url.protocol === \"https:\") return true;\n if (url.protocol === \"data:\") {\n return /^data:image\\//i.test(url.href);\n }\n return false;\n }\n\n /**\n * Prepares common invocation context for doGenerate and doStream.\n * @param options - AI SDK call options.\n * @returns Strategy and configuration for the invocation.\n * @internal\n */\n private async prepareInvocation(options: LanguageModelV3CallOptions): Promise<{\n strategy: LanguageModelAPIStrategy;\n strategyConfig: LanguageModelStrategyConfig;\n }> {\n const providerName = getProviderName(this.config.provider);\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAILanguageModelProviderOptions,\n });\n\n const effectiveApi = resolveApi(this.config.providerApi, this.settings.api, sapOptions?.api);\n\n validateSettings({\n api: effectiveApi,\n invocationSettings: sapOptions\n ? {\n api: sapOptions.api,\n escapeTemplatePlaceholders: sapOptions.escapeTemplatePlaceholders,\n orchestrationConfigRef: sapOptions.orchestrationConfigRef,\n placeholderValues: sapOptions.placeholderValues,\n promptTemplateRef: sapOptions.promptTemplateRef,\n }\n : undefined,\n modelApi: this.settings.api,\n modelSettings: this.settings,\n });\n\n const strategy = await getOrCreateLanguageModelStrategy(effectiveApi);\n\n const strategyConfig: LanguageModelStrategyConfig = {\n deploymentConfig: this.config.deploymentConfig,\n destination: this.config.destination,\n modelId: this.modelId,\n parsedProviderOptions: sapOptions,\n provider: this.config.provider,\n requestConfig: this.config.requestConfig,\n };\n\n return { strategy, strategyConfig };\n }\n}\n","/**\n * SAP AI Language Model V2 - Vercel AI SDK LanguageModelV2 implementation for SAP AI Core.\n *\n * This module provides the language model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) for text generation.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/generate-text | Vercel AI SDK generateText()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/stream-text | Vercel AI SDK streamText()}\n */\n\nimport type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV3CallOptions,\n} from \"@ai-sdk/provider\";\nimport type {\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2ResponseMetadata,\n LanguageModelV2Usage,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n} from \"@ai-sdk/provider-v2\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type { ConvertedV2StreamPart, ConvertedV2Warning } from \"./sap-ai-adapters-v3-to-v2.js\";\nimport type { SAPAIApiType, SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\n\nimport {\n convertUsageToV2,\n convertWarningsToV2,\n createV2StreamFromInternal,\n} from \"./sap-ai-adapters-v3-to-v2.js\";\nimport { SAPAILanguageModel as SAPAILanguageModelInternal } from \"./sap-ai-language-model.js\";\n\n// AI SDK 6.0 shipped V2 tools with the V3 provider-tool discriminator.\ntype CompatibleV2CallOptions = Omit<LanguageModelV2CallOptions, \"tools\"> & {\n tools?: LanguageModelV2CallOptions[\"tools\"] | LanguageModelV3CallOptions[\"tools\"];\n};\n\n/** @internal */\ninterface SAPAILanguageModelV2Config {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Language Model implementing Vercel AI SDK LanguageModelV2.\n *\n * This class provides chat completion and streaming capabilities through SAP AI Core,\n * supporting both the Orchestration API (with content filtering, grounding, masking,\n * and translation) and Foundation Models API (direct Azure OpenAI access).\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider-v2\";\n * import { generateText, streamText } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const model = provider(\"gpt-4.1\");\n *\n * // Non-streaming\n * const { text } = await generateText({\n * model,\n * prompt: \"Hello!\",\n * });\n *\n * // Streaming\n * const result = streamText({\n * model,\n * prompt: \"Tell me a story\",\n * });\n *\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/generating-text | Vercel AI SDK Text Generation}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAILanguageModelV2 implements LanguageModelV2 {\n readonly modelId: SAPAIModelId;\n readonly specificationVersion = \"v2\" as const;\n\n get provider(): string {\n return this.internalModel.provider;\n }\n\n get supportedUrls(): Record<string, RegExp[]> {\n return this.internalModel.supportedUrls;\n }\n\n /** @internal */\n private readonly internalModel: SAPAILanguageModelInternal;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(modelId: SAPAIModelId, settings: SAPAISettings, config: SAPAILanguageModelV2Config) {\n this.modelId = modelId;\n this.internalModel = new SAPAILanguageModelInternal(modelId, settings, config);\n }\n\n async doGenerate(options: CompatibleV2CallOptions): Promise<{\n content: LanguageModelV2Content[];\n finishReason: LanguageModelV2FinishReason;\n providerMetadata?: SharedV2ProviderMetadata;\n request?: {\n body?: unknown;\n };\n response?: LanguageModelV2ResponseMetadata & {\n body?: unknown;\n headers?: SharedV2Headers;\n };\n usage: LanguageModelV2Usage;\n warnings: ConvertedV2Warning[];\n }> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n const result = await this.internalModel.doGenerate(options as any);\n\n // Return result in V2 format\n return {\n content: result.content as LanguageModelV2Content[],\n finishReason: result.finishReason.unified,\n providerMetadata: result.providerMetadata as SharedV2ProviderMetadata | undefined,\n request: result.request,\n response: result.response,\n usage: convertUsageToV2(result.usage),\n warnings: convertWarningsToV2(result.warnings),\n };\n }\n\n async doStream(options: CompatibleV2CallOptions): Promise<{\n request?: {\n body?: unknown;\n };\n response?: {\n headers?: SharedV2Headers;\n };\n stream: ReadableStream<ConvertedV2StreamPart>;\n }> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n const result = await this.internalModel.doStream(options as any);\n\n return {\n request: result.request,\n response: result.response\n ? {\n headers: result.response.headers,\n }\n : undefined,\n stream: createV2StreamFromInternal(result.stream),\n };\n }\n}\n","import type { ImageModelV2, ProviderV2 } from \"@ai-sdk/provider-v2\";\n\nimport { NoSuchModelError } from \"@ai-sdk/provider\";\nimport { setGlobalLogLevel } from \"@sap-cloud-sdk/util\";\n\nimport type { SAPAIEmbeddingModelId } from \"./sap-ai-embedding-model.js\";\nimport type { DeploymentConfig, SAPAIProviderSettings } from \"./sap-ai-provider.js\";\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport { SAPAIEmbeddingModelV2 } from \"./sap-ai-embedding-model-v2.js\";\nimport { SAPAILanguageModelV2 } from \"./sap-ai-language-model-v2.js\";\nimport { SAP_AI_PROVIDER_NAME, validateModelParamsSettings } from \"./sap-ai-provider-options.js\";\nimport { SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\nimport { mergeSettingsWithApi } from \"./sap-ai-validation.js\";\n\nexport type { DeploymentConfig, SAPAIProviderSettings } from \"./sap-ai-provider.js\";\n\n/** SAP AI Provider interface extending Vercel AI SDK ProviderV2. */\nexport interface SAPAIProviderV2 extends ProviderV2 {\n (modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n chat(modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n /** Always throws - SAP AI Core does not support image generation. */\n imageModel(modelId: string): ImageModelV2;\n languageModel(modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n textEmbeddingModel(\n modelId: SAPAIEmbeddingModelId,\n settings?: SAPAIEmbeddingSettings,\n ): SAPAIEmbeddingModelV2;\n}\n\n/**\n * Creates an SAP AI Provider V2 instance for use with AI SDK 5.\n * AI SDK 6 can also consume this provider through its V2 compatibility layer.\n *\n * Uses the official SAP AI SDK (`@sap-ai-sdk/orchestration` and\n * `@sap-ai-sdk/foundation-models`) for API communication. Authentication is automatic via service binding\n * (VCAP_SERVICES on SAP BTP) or AICORE_SERVICE_KEY environment variable.\n * @param options - Provider configuration options.\n * @param options.api - Default API type: `'orchestration'` (default) or `'foundation-models'`.\n * @param options.defaultSettings - Default model settings applied to every model instance.\n * @param options.deploymentId - Explicit SAP AI Core deployment ID; omit for automatic deployment resolution.\n * @param options.destination - Custom SAP Cloud SDK destination configuration.\n * @param options.logLevel - Log level for SAP Cloud SDK loggers (`'debug'`, `'info'`, `'warn'`, `'error'`).\n * @param options.name - Provider name (default: `'sap-ai'`); see {@link SAPAIProviderSettings.name} for namespace rules.\n * @param options.requestConfig - Provider-level custom request configuration. See {@link SAPAIProviderSettings.requestConfig} for scope, portability, and abort semantics.\n * @param options.resourceGroup - SAP AI Core resource group (default: `'default'`); ignored when deploymentId is set.\n * @param options.warnOnAmbiguousConfig - Whether to warn when both deploymentId and resourceGroup are set.\n * @returns A configured SAP AI provider instance that can be used as a callable or via methods.\n * @example\n * // Basic usage with defaults\n * const provider = createSAPAIProvider();\n * const model = provider('gpt-4.1');\n * @example\n * // With custom configuration\n * const provider = createSAPAIProvider({\n * api: 'foundation-models',\n * resourceGroup: 'production',\n * defaultSettings: { modelParams: { temperature: 0.7 } },\n * });\n * @example\n * // Using provider methods\n * const chatModel = provider.chat('gpt-4.1');\n * const embeddingModel = provider.textEmbeddingModel('text-embedding-3-small');\n * @throws {Error} When provider function is called with the `new` keyword.\n * @throws {NoSuchModelError} When `imageModel()` is called (image generation not supported).\n * @see {@link SAPAIProviderSettings} for all configuration options.\n * @see {@link SAPAIProviderV2} for the provider interface.\n */\nexport function createSAPAIProvider(options: SAPAIProviderSettings = {}): SAPAIProviderV2 {\n if (options.defaultSettings?.modelParams) {\n validateModelParamsSettings(options.defaultSettings.modelParams);\n }\n\n const providerName = options.name ?? SAP_AI_PROVIDER_NAME;\n\n const resourceGroup = options.resourceGroup ?? \"default\";\n\n const warnOnAmbiguousConfig = options.warnOnAmbiguousConfig ?? true;\n\n if (warnOnAmbiguousConfig && options.deploymentId && options.resourceGroup) {\n console.warn(\n \"createSAPAIProvider: both 'deploymentId' and 'resourceGroup' were provided; using 'deploymentId' and ignoring 'resourceGroup'.\",\n );\n }\n\n if (typeof process === \"undefined\" || !process.env.SAP_CLOUD_SDK_LOG_LEVEL) {\n const logLevel = options.logLevel ?? \"warn\";\n setGlobalLogLevel(logLevel);\n }\n\n const deploymentConfig: DeploymentConfig = options.deploymentId\n ? { deploymentId: options.deploymentId }\n : { resourceGroup };\n\n // Provider-level API setting (defaults to 'orchestration')\n const providerApi = options.api ?? \"orchestration\";\n\n const createModel = (modelId: SAPAIModelId, settings: SAPAISettings = {}) => {\n const mergedSettings = mergeSettingsWithApi(\n options.defaultSettings as Record<string, unknown> | undefined,\n settings,\n providerApi,\n );\n\n return new SAPAILanguageModelV2(modelId, mergedSettings, {\n deploymentConfig,\n destination: options.destination,\n provider: `${providerName}.chat`,\n providerApi,\n requestConfig: options.requestConfig,\n });\n };\n\n const createEmbeddingModel = (\n modelId: SAPAIEmbeddingModelId,\n settings: SAPAIEmbeddingSettings = {},\n ): SAPAIEmbeddingModelV2 => {\n const mergedSettings = mergeSettingsWithApi(\n options.defaultSettings as Record<string, unknown> | undefined,\n settings,\n providerApi,\n );\n\n return new SAPAIEmbeddingModelV2(modelId, mergedSettings, {\n deploymentConfig,\n destination: options.destination,\n provider: `${providerName}.embedding`,\n providerApi,\n requestConfig: options.requestConfig,\n });\n };\n\n const provider = function (modelId: SAPAIModelId, settings?: SAPAISettings) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (new.target) {\n throw new Error(\"The SAP AI provider function cannot be called with the new keyword.\");\n }\n\n return createModel(modelId, settings);\n };\n\n provider.chat = createModel;\n provider.languageModel = createModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({\n message: `SAP AI Core does not support image generation. Model '${modelId}' is not available.`,\n modelId,\n modelType: \"imageModel\",\n });\n };\n\n return provider;\n}\n\n/** Default SAP AI provider instance with automatic authentication via SAP AI SDK. */\nexport const sapai = createSAPAIProvider();\n","import type { AzureOpenAiChatCompletionParameters } from \"@sap-ai-sdk/foundation-models\";\nimport type {\n ChatCompletionTool,\n ChatModel,\n FilteringModule,\n GroundingModule,\n MaskingModule,\n OrchestrationConfigRefById,\n OrchestrationConfigRefByName,\n OrchestrationModuleConfig,\n TranslationModule,\n} from \"@sap-ai-sdk/orchestration\";\n\n/** Azure OpenAI chat extension configuration for \"On Your Data\" RAG scenarios. */\nexport type AzureOpenAiChatExtensionConfiguration = NonNullable<\n AzureOpenAiChatCompletionParameters[\"data_sources\"]\n>[number];\n\n/**\n * Common model parameters shared between both APIs.\n *\n * Known parameters are validated by Zod in constructor settings and per-call\n * `modelParams` provider options; additional model-specific keys are passed through.\n */\nexport interface CommonModelParams {\n /**\n * Frequency penalty to reduce repetition of token sequences.\n * Range: -2.0 to 2.0\n */\n readonly frequencyPenalty?: number;\n /**\n * Maximum number of tokens to generate.\n * Range: Positive integer\n */\n readonly maxTokens?: number;\n /**\n * Number of completions to generate.\n * Availability depends on the selected SAP API and model; no model-family filtering is applied.\n * Range: Positive integer\n */\n readonly n?: number;\n /** Whether to enable parallel tool calls when multiple tools are available. */\n readonly parallel_tool_calls?: boolean;\n /**\n * Presence penalty to encourage talking about new topics.\n * Range: -2.0 to 2.0\n */\n readonly presencePenalty?: number;\n /** Index signature for additional model-specific parameters. */\n readonly [key: string]: unknown;\n /**\n * Sampling temperature controlling randomness.\n * Higher values (e.g., 1.0) make output more random, lower values (e.g., 0.2) more deterministic.\n * Range: 0 to 2\n */\n readonly temperature?: number;\n /**\n * Nucleus sampling parameter. Only tokens with cumulative probability up to `topP` are considered.\n * Range: 0 to 1\n */\n readonly topP?: number;\n}\n\n/** Default settings configuration when using Foundation Models API. */\nexport interface FoundationModelsDefaultSettings {\n readonly api: \"foundation-models\";\n readonly settings?: FoundationModelsModelSettings;\n}\n\n/** Model parameters for Foundation Models Embedding API. */\nexport interface FoundationModelsEmbeddingParams {\n readonly dimensions?: number;\n readonly encoding_format?: \"base64\" | \"float\";\n readonly user?: string;\n}\n\n/** Model parameters for Foundation Models API with Azure OpenAI-specific extensions. */\nexport interface FoundationModelsModelParams extends CommonModelParams {\n readonly logit_bias?: AzureOpenAiChatCompletionParameters[\"logit_bias\"];\n readonly logprobs?: AzureOpenAiChatCompletionParameters[\"logprobs\"];\n readonly seed?: AzureOpenAiChatCompletionParameters[\"seed\"];\n readonly stop?: AzureOpenAiChatCompletionParameters[\"stop\"];\n /** Requires logprobs=true. */\n readonly top_logprobs?: AzureOpenAiChatCompletionParameters[\"top_logprobs\"];\n readonly user?: AzureOpenAiChatCompletionParameters[\"user\"];\n}\n\n/** Model settings when using Foundation Models API. */\nexport interface FoundationModelsModelSettings {\n readonly api: \"foundation-models\";\n /** Azure OpenAI \"On Your Data\" configuration for RAG scenarios. */\n readonly dataSources?: AzureOpenAiChatExtensionConfiguration[];\n /**\n * Forward assistant reasoning from the input history as text; does not enable reasoning output.\n * @default false\n */\n readonly includeReasoning?: boolean;\n readonly modelParams?: FoundationModelsModelParams;\n readonly modelVersion?: string;\n readonly responseFormat?: ResponseFormat;\n}\n\n/** Default settings configuration when using Orchestration API. */\nexport interface OrchestrationDefaultSettings {\n readonly api?: \"orchestration\";\n readonly settings?: OrchestrationModelSettings;\n}\n\n/** Model parameters for Orchestration API. */\nexport type OrchestrationModelParams = CommonModelParams;\n\n/** Model settings when using Orchestration API with filtering, grounding, masking, and translation. */\nexport interface OrchestrationModelSettings {\n readonly api?: \"orchestration\";\n /** @default true */\n readonly escapeTemplatePlaceholders?: boolean;\n /**\n * Additional module configurations for prompt module fallback.\n * These entries follow the primary configuration in the list passed to the SAP SDK.\n * Each entry is a full `OrchestrationModuleConfig` with its own model, prompt, and modules.\n * @example\n * ```ts\n * fallbackModuleConfigs: [\n * {\n * promptTemplating: {\n * model: { name: \"gpt-4.1-mini\" },\n * prompt: { template: [] },\n * },\n * },\n * ]\n * ```\n */\n readonly fallbackModuleConfigs?: OrchestrationModuleConfig[];\n readonly filtering?: FilteringModule;\n readonly grounding?: GroundingModule;\n /**\n * Forward assistant reasoning from the input history as text; does not enable reasoning output.\n * @default false\n */\n readonly includeReasoning?: boolean;\n readonly masking?: MaskingModule | { providers: MaskingModule[\"masking_providers\"] };\n readonly modelParams?: OrchestrationModelParams;\n readonly modelVersion?: string;\n /**\n * Reference to a complete orchestration configuration stored in SAP AI Core Prompt Registry.\n * When provided, local module settings (filtering, masking, grounding, translation, tools,\n * promptTemplateRef, responseFormat) are ignored as the full configuration is managed\n * by the referenced config. The reference, including its explicit `overrideConfig`,\n * is passed to the SAP SDK; messages and `placeholderValues` remain request inputs.\n * @example { id: \"f47ac10b-58cc-4372-a567-0e02b2c3d479\" }\n * @example { scenario: \"customer-support\", name: \"prod-config\", version: \"1.0.0\" }\n */\n readonly orchestrationConfigRef?: OrchestrationConfigRefById | OrchestrationConfigRefByName;\n readonly placeholderValues?: Record<string, string>;\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: ResponseFormat;\n /**\n * Options for streaming behavior with locally configured post-LLM modules.\n * Includes direct `doStream()` calls; ignored when `orchestrationConfigRef` is used.\n */\n readonly streamOptions?: OrchestrationStreamOptions;\n readonly tools?: ChatCompletionTool[];\n readonly translation?: TranslationModule;\n}\n\n/**\n * Stream options for orchestration post-LLM module processing.\n * Controls chunking behavior for translation, filtering, and other modules during streaming.\n * Ignored with `orchestrationConfigRef`; configure streaming in the stored\n * configuration or its `overrideConfig` instead.\n */\nexport interface OrchestrationStreamOptions {\n /**\n * Minimum number of characters per chunk for post-LLM modules.\n * Valid range: 1-10000. Defaults to 100.\n */\n readonly chunkSize?: number;\n /**\n * Delimiters for splitting stream into chunks (e.g., sentence boundaries).\n * Recommended for translation; the provider warns when local translation settings lack them.\n * @example [\"\\n\", \".\", \"?\", \"!\"]\n */\n readonly delimiters?: readonly string[];\n /**\n * Additional characters from previous chunks sent to output filtering for context.\n * Valid range: 0-10000.\n */\n readonly outputFilteringOverlap?: number;\n}\n\n/** Reference to a template in SAP AI Core's Prompt Registry. */\nexport type PromptTemplateRef = PromptTemplateRefByID | PromptTemplateRefByScenarioNameVersion;\n\n/** Reference to a Prompt Registry template by ID. */\nexport interface PromptTemplateRefByID {\n readonly id: string;\n readonly scope?: PromptTemplateScope;\n}\n\n/** Reference to a Prompt Registry template by scenario, name, and version. */\nexport interface PromptTemplateRefByScenarioNameVersion {\n readonly name: string;\n readonly scenario: string;\n readonly scope?: PromptTemplateScope;\n readonly version: string;\n}\n\n/** Scope for Prompt Registry templates: 'tenant' (default) or 'resource_group'. */\nexport type PromptTemplateScope = \"resource_group\" | \"tenant\";\n\n/** Response format for structured output (OpenAI-compatible). */\nexport type ResponseFormat = AzureOpenAiChatCompletionParameters[\"response_format\"];\n\n/**\n * Supported API types for SAP AI Core.\n *\n * - `'orchestration'` - Full-featured API with data masking, content filtering, document grounding, and translation.\n * - `'foundation-models'` - Direct model access with Azure OpenAI-specific parameters like `logprobs`, `seed`, and `dataSources`.\n */\nexport type SAPAIApiType = \"foundation-models\" | \"orchestration\";\n\n/** Union type for API-specific default settings configuration. */\nexport type SAPAIDefaultSettingsConfig =\n FoundationModelsDefaultSettings | OrchestrationDefaultSettings;\n\n/** Settings for the SAP AI Embedding Model. */\nexport interface SAPAIEmbeddingSettings {\n readonly api?: SAPAIApiType;\n /** Orchestration API only. */\n readonly masking?: MaskingModule | { providers: MaskingModule[\"masking_providers\"] };\n /**\n * Maximum batch size: a positive integer, or `Infinity` for no provider-side limit.\n * @default 2048\n */\n readonly maxEmbeddingsPerCall?: number;\n readonly modelParams?: FoundationModelsEmbeddingParams | Record<string, unknown>;\n readonly modelVersion?: string;\n readonly [key: string]: unknown;\n /**\n * Orchestration embedding input type; ignored by Foundation Models.\n * @default 'text'\n */\n readonly type?: \"document\" | \"query\" | \"text\";\n}\n\n/**\n * Supported model IDs in SAP AI Core.\n *\n * Model availability depends on tenant configuration and region.\n * Common values include: `'gpt-4.1'`, `'gpt-4.1-mini'`, `'anthropic--claude-4.5-sonnet'`, `'gemini-2.5-pro'`.\n * @see {@link https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/models-and-scenarios-in-generative-ai-hub | SAP AI Core Models}\n */\nexport type SAPAIModelId = ChatModel;\n\n/**\n * Union type for model settings - supports both APIs.\n *\n * Use `FoundationModelsModelSettings` for Foundation Models API features (dataSources, logprobs, seed).\n * Use `OrchestrationModelSettings` for Orchestration API features (filtering, grounding, masking, translation).\n */\nexport type SAPAIModelSettings = FoundationModelsModelSettings | OrchestrationModelSettings;\n\n/** Re-exported SAP AI SDK orchestration types. */\nexport type {\n FilteringModule,\n GroundingModule,\n MaskingModule,\n TranslationModule,\n} from \"@sap-ai-sdk/orchestration\";\n\nexport {\n buildAzureContentSafetyFilter,\n buildDocumentGroundingConfig,\n buildDpiMaskingProvider,\n buildLlamaGuard38BFilter,\n buildTranslationConfig,\n} from \"@sap-ai-sdk/orchestration\";\n\n/**\n * Settings for configuring SAP AI Core model behavior.\n * Legacy interface maintained for backward compatibility - prefer OrchestrationModelSettings\n * or FoundationModelsModelSettings for API-specific type safety.\n */\nexport interface SAPAISettings {\n readonly api?: SAPAIApiType;\n /** @default true */\n readonly escapeTemplatePlaceholders?: boolean;\n /** Orchestration API only. */\n readonly fallbackModuleConfigs?: OrchestrationModuleConfig[];\n /** Orchestration API only. */\n readonly filtering?: FilteringModule;\n /** Orchestration API only. */\n readonly grounding?: GroundingModule;\n /**\n * Forward assistant reasoning from the input history as text; does not enable reasoning output.\n * @default false\n */\n readonly includeReasoning?: boolean;\n /** Orchestration API only. */\n readonly masking?: MaskingModule | { providers: MaskingModule[\"masking_providers\"] };\n readonly modelParams?: CommonModelParams;\n readonly modelVersion?: string;\n /** Orchestration API only. */\n readonly orchestrationConfigRef?: OrchestrationConfigRefById | OrchestrationConfigRefByName;\n /** Orchestration API only. */\n readonly placeholderValues?: Record<string, string>;\n /** Orchestration API only. */\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: ResponseFormat;\n /** Orchestration API only; ignored when `orchestrationConfigRef` is used. */\n readonly streamOptions?: OrchestrationStreamOptions;\n /** Orchestration API only. */\n readonly tools?: ChatCompletionTool[];\n /** Orchestration API only. */\n readonly translation?: TranslationModule;\n}\n\nexport type {\n AssistantChatMessage,\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n ChatMessageContent,\n ChatMessages,\n Citation,\n DeveloperChatMessage,\n DocumentTranslationApplyToSelector,\n FileContent,\n FunctionObject,\n ImageContentUrl,\n LlmModelDetails,\n LlmModelParams,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- Preserve the upstream deprecated public API.\n OrchestrationConfigRef,\n OrchestrationConfigRefById,\n OrchestrationConfigRefByName,\n OrchestrationConfigRefOverride,\n OrchestrationError,\n OrchestrationModuleConfig,\n OrchestrationModuleConfigList,\n PromptTemplatingModule,\n SystemChatMessage,\n ToolChatMessage,\n TranslationApplyToCategory,\n TranslationInputParameters,\n TranslationOutputParameters,\n TranslationTargetLanguage,\n UserChatMessage,\n UserChatMessageContent,\n UserChatMessageContentItem,\n} from \"@sap-ai-sdk/orchestration\";\n\nexport {\n OrchestrationEmbeddingResponse,\n OrchestrationResponse,\n OrchestrationStream,\n OrchestrationStreamChunkResponse,\n OrchestrationStreamResponse,\n} from \"@sap-ai-sdk/orchestration\";\n","/**\n * `@jerome-benoit/sap-ai-provider/v2` AI SDK 5 (spec V2) entrypoint.\n *\n * Exposes the V2 facades (`LanguageModelV2` / `EmbeddingModelV2` /\n * `ProviderV2`) over the shared V3 core. Also available from the standalone\n * `@jerome-benoit/sap-ai-provider-v2` package. AI SDK 6 can consume these V2\n * interfaces through its compatibility layer; use `v4` with AI SDK 7.\n * @see {@link https://sdk.vercel.ai/} Vercel AI SDK documentation\n */\n\n/**\n * Utility functions for escaping template delimiters (`{{`, `{%`, `{#`) in orchestration content.\n */\nexport {\n escapeOrchestrationPlaceholders,\n unescapeOrchestrationPlaceholders,\n} from \"./convert-to-sap-messages.js\";\n\n/**\n * Embedding model class implementing EmbeddingModelV2 for SAP AI Core.\n * V2 facade over internal implementation.\n */\nexport { SAPAIEmbeddingModelV2 as SAPAIEmbeddingModel } from \"./sap-ai-embedding-model-v2.js\";\n\nexport type { SAPAIEmbeddingModelId } from \"./sap-ai-embedding-model.js\";\n\n/**\n * Custom error classes for Foundation Models API support.\n * - `UnsupportedFeatureError`: Thrown when a feature is used with an incompatible API.\n * - `ApiSwitchError`: Thrown when attempting to switch APIs at invocation time with conflicting settings.\n */\nexport { ApiSwitchError, UnsupportedFeatureError } from \"./sap-ai-error.js\";\n\n/**\n * Language model class implementing LanguageModelV2 for SAP AI Core.\n * V2 facade over internal implementation.\n */\nexport { SAPAILanguageModelV2 as SAPAILanguageModel } from \"./sap-ai-language-model-v2.js\";\n\n/**\n * Provider options for per-call configuration.\n *\n * These schemas and types enable runtime validation of provider options\n * passed via `providerOptions['sap-ai']` in Vercel AI SDK calls.\n */\nexport {\n getProviderName,\n SAP_AI_PROVIDER_NAME,\n sapAIEmbeddingProviderOptions,\n sapAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\n\nexport type {\n SAPAIEmbeddingProviderOptions,\n SAPAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\n\n/**\n * Provider factory function implementing ProviderV2 interface.\n * Creates language and embedding model instances for SAP AI Core.\n */\nexport { createSAPAIProvider, sapai } from \"./sap-ai-provider-v2.js\";\n\nexport type {\n DeploymentConfig,\n SAPAIProviderV2 as SAPAIProvider,\n SAPAIProviderSettings,\n} from \"./sap-ai-provider-v2.js\";\n\n/**\n * Model settings types and model identifier type definitions.\n */\nexport type {\n AzureOpenAiChatExtensionConfiguration,\n CommonModelParams,\n FoundationModelsDefaultSettings,\n FoundationModelsEmbeddingParams,\n FoundationModelsModelParams,\n FoundationModelsModelSettings,\n OrchestrationDefaultSettings,\n OrchestrationModelParams,\n OrchestrationModelSettings,\n OrchestrationStreamOptions,\n PromptTemplateRef,\n PromptTemplateRefByID,\n PromptTemplateRefByScenarioNameVersion,\n PromptTemplateScope,\n ResponseFormat,\n SAPAIApiType,\n SAPAIDefaultSettingsConfig,\n SAPAIEmbeddingSettings,\n SAPAIModelId,\n SAPAIModelSettings,\n SAPAISettings,\n} from \"./sap-ai-settings.js\";\n\n/**\n * SAP AI SDK types and utilities.\n *\n * Re-exported for convenience and advanced usage scenarios.\n */\nexport type {\n AssistantChatMessage,\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n ChatMessageContent,\n ChatMessages,\n Citation,\n DeveloperChatMessage,\n DocumentTranslationApplyToSelector,\n FileContent,\n FilteringModule,\n FunctionObject,\n GroundingModule,\n ImageContentUrl,\n LlmModelDetails,\n LlmModelParams,\n MaskingModule,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- Preserve the upstream deprecated public API.\n OrchestrationConfigRef,\n OrchestrationConfigRefById,\n OrchestrationConfigRefByName,\n OrchestrationConfigRefOverride,\n OrchestrationError,\n OrchestrationModuleConfig,\n OrchestrationModuleConfigList,\n PromptTemplatingModule,\n SystemChatMessage,\n ToolChatMessage,\n TranslationApplyToCategory,\n TranslationInputParameters,\n TranslationModule,\n TranslationOutputParameters,\n TranslationTargetLanguage,\n UserChatMessage,\n UserChatMessageContent,\n UserChatMessageContentItem,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Helper functions for building configurations.\n */\nexport {\n buildAzureContentSafetyFilter,\n buildDocumentGroundingConfig,\n buildDpiMaskingProvider,\n buildLlamaGuard38BFilter,\n buildTranslationConfig,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Response classes from the SAP AI SDK for orchestration results.\n */\nexport {\n OrchestrationEmbeddingResponse,\n OrchestrationResponse,\n OrchestrationStream,\n OrchestrationStreamChunkResponse,\n OrchestrationStreamResponse,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Validation utilities for API selection and feature compatibility.\n * - `resolveApi`: Resolves API type from provider/model/invocation precedence chain.\n * - `validateSettings`: Validates settings are compatible with the selected API.\n */\nexport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\n/**\n * Package version, injected at build time.\n */\nexport { VERSION } from \"./version.js\";\n\n/**\n * SAP AI SDK request configuration type for {@link SAPAIProviderSettings.requestConfig}.\n *\n * Re-exported so consumers do not need a direct dependency on `@sap-ai-sdk/core`.\n * Its shape follows the installed SAP AI SDK version.\n */\nexport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\n\n/**\n * Error handling types and classes for SAP AI Core error responses.\n */\nexport type { OrchestrationErrorResponse } from \"@sap-ai-sdk/orchestration\";\n\n/**\n * Direct access to SAP AI SDK OrchestrationClient.\n *\n * For advanced users who need to use the SAP AI SDK directly.\n */\nexport { OrchestrationClient, OrchestrationEmbeddingClient } from \"@sap-ai-sdk/orchestration\";\n\n/**\n * SAP Cloud SDK destination type for {@link SAPAIProviderSettings.destination}.\n *\n * Re-exported so consumers do not need a direct dependency on\n * `@sap-cloud-sdk/connectivity`. Its shape follows the installed SAP Cloud SDK version.\n */\nexport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n"],"mappings":"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","names":["OrchestrationEmbeddingClient","OrchestrationClient","parseProviderOptions","parseProviderOptions"]}
1
+ {"version":3,"sources":["../src/sap-ai-adapters-v3-to-v2.ts","../src/map-readable-stream.ts","../src/sap-ai-embedding-model.ts","../src/sap-ai-strategy.ts","../src/sap-ai-embedding-model-v2.ts","../src/sap-ai-adapters-v2-to-v3.ts","../src/sap-ai-language-model.ts","../src/sap-ai-language-model-v2.ts","../src/sap-ai-provider-v2.ts","../src/sap-ai-settings.ts","../src/index-v2.ts"],"sourcesContent":["/** Adapters for the semantic differences between the V3 core and V2 facade. */\n\nimport type {\n LanguageModelV3StreamPart as InternalStreamPart,\n LanguageModelV3Usage as InternalUsage,\n SharedV3Warning as InternalWarning,\n} from \"@ai-sdk/provider\";\nimport type {\n LanguageModelV2CallWarning,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n SharedV2ProviderMetadata,\n} from \"@ai-sdk/provider-v2\";\n\nimport { UnsupportedFunctionalityError } from \"@ai-sdk/provider\";\n\nimport { mapReadableStream } from \"./map-readable-stream.js\";\n\n/** Stream events supported by the V2 facade. */\nexport type ConvertedV2StreamPart =\n | Exclude<LanguageModelV2StreamPart, { type: \"stream-start\" }>\n | { type: \"stream-start\"; warnings: ConvertedV2Warning[] };\n\n/** V2 warning representation used when adapting V3 feature diagnostics. */\nexport type ConvertedV2Warning = Extract<LanguageModelV2CallWarning, { type: \"other\" }>;\n\n/**\n * Converts V3-only event fields; structurally identical events pass through unchanged.\n * @param internalPart - V3 stream event\n * @returns V2 event.\n * @throws {UnsupportedFunctionalityError} When the event requires tool approval.\n * @internal\n */\nexport function convertStreamPartToV2(internalPart: InternalStreamPart): ConvertedV2StreamPart {\n // V2 has a narrower JSON metadata type; preserve the core payload without cloning.\n const compatiblePart = internalPart as InternalStreamPart & {\n providerMetadata?: SharedV2ProviderMetadata;\n };\n switch (compatiblePart.type) {\n case \"file\": {\n const { providerMetadata: _providerMetadata, ...part } = compatiblePart;\n return part;\n }\n case \"finish\":\n return {\n ...compatiblePart,\n finishReason: compatiblePart.finishReason.unified,\n usage: convertUsageToV2(compatiblePart.usage),\n };\n case \"stream-start\":\n return { ...compatiblePart, warnings: convertWarningsToV2(compatiblePart.warnings) };\n case \"tool-approval-request\":\n throw createV2ToolApprovalError();\n case \"tool-call\": {\n const { dynamic: _dynamic, ...part } = compatiblePart;\n return part;\n }\n case \"tool-input-start\": {\n const { dynamic: _dynamic, title: _title, ...part } = compatiblePart;\n return part;\n }\n case \"tool-result\": {\n const { dynamic: _dynamic, preliminary: _preliminary, ...part } = compatiblePart;\n // Provider execution and dynamic tool classification are independent in V3.\n return { ...part, providerExecuted: true };\n }\n default:\n return compatiblePart;\n }\n}\n\n/**\n * Flattens usage without inventing totals when either component is unknown.\n * @param internalUsage - V3 nested usage\n * @returns V2 usage\n * @internal\n */\nexport function convertUsageToV2(internalUsage: InternalUsage): LanguageModelV2Usage {\n return {\n cachedInputTokens: internalUsage.inputTokens.cacheRead,\n inputTokens: internalUsage.inputTokens.total,\n outputTokens: internalUsage.outputTokens.total,\n reasoningTokens: internalUsage.outputTokens.reasoning,\n totalTokens:\n internalUsage.inputTokens.total !== undefined &&\n internalUsage.outputTokens.total !== undefined\n ? internalUsage.inputTokens.total + internalUsage.outputTokens.total\n : undefined,\n };\n}\n\n/**\n * Converts warnings to V2's descriptive other-warning representation.\n * @param internalWarnings - V3 warnings\n * @returns V2 warnings\n * @internal\n */\nexport function convertWarningsToV2(internalWarnings: InternalWarning[]): ConvertedV2Warning[] {\n return internalWarnings.map(convertWarningToV2);\n}\n\n/**\n * Retains feature and compatibility details absent from the V2 warning union.\n * @param internalWarning - V3 warning\n * @returns V2 warning\n * @internal\n */\nexport function convertWarningToV2(internalWarning: InternalWarning): ConvertedV2Warning {\n if (internalWarning.type === \"other\") return internalWarning;\n const prefix =\n internalWarning.type === \"unsupported\" ? \"Unsupported feature\" : \"Compatibility mode\";\n return {\n message: `${prefix}: ${internalWarning.feature}${internalWarning.details ? `. ${internalWarning.details}` : \"\"}`,\n type: \"other\",\n };\n}\n\n/**\n * Converts an internal stream, preserving backpressure, cancellation and errors.\n * @param internalStream - V3 stream\n * @returns V2 stream\n * @internal\n */\nexport function createV2StreamFromInternal(\n internalStream: ReadableStream<InternalStreamPart>,\n): ReadableStream<ConvertedV2StreamPart> {\n return mapReadableStream(internalStream, convertStreamPartToV2);\n}\n\n/**\n * Identifies a native tool approval that the V2 contract cannot represent.\n * @returns An actionable error for V2 consumers.\n * @internal\n */\nexport function createV2ToolApprovalError(): UnsupportedFunctionalityError {\n return new UnsupportedFunctionalityError({\n functionality:\n \"Tool approvals are unavailable through the V2 provider. Use /v3 with AI SDK 6 or /v4 with AI SDK 7.\",\n });\n}\n","/** Demand-driven stream conversion shared by the public model facades. */\n\n/**\n * Maps source values only when requested, skipping null conversion results.\n * @param source - Stream whose cancellation and errors must be preserved.\n * @param convert - Synchronous conversion; null drops an unsupported event.\n * @returns A stream that does not prefetch source values.\n * @internal\n */\nexport function mapReadableStream<TInput, TOutput>(\n source: ReadableStream<TInput>,\n convert: (value: TInput) => null | TOutput,\n): ReadableStream<TOutput> {\n const reader = source.getReader();\n let cancelled = false;\n\n return new ReadableStream<TOutput>(\n {\n async cancel(reason) {\n cancelled = true;\n try {\n await reader.cancel(reason);\n } finally {\n reader.releaseLock();\n }\n },\n async pull(controller) {\n try {\n for (;;) {\n const next = await reader.read();\n if (cancelled) return;\n if (next.done) {\n reader.releaseLock();\n controller.close();\n return;\n }\n const converted = convert(next.value);\n if (converted !== null) {\n controller.enqueue(converted);\n return;\n }\n }\n } catch (error) {\n if (cancelled) return;\n // Source cleanup must not replace the conversion or upstream failure.\n await reader.cancel(error).catch(() => undefined);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Cancellation can race asynchronous cleanup.\n if (cancelled) return;\n reader.releaseLock();\n controller.error(error);\n }\n },\n },\n { highWaterMark: 0 },\n );\n}\n","/**\n * SAP AI Embedding Model - Vercel AI SDK EmbeddingModelV3 implementation for SAP AI Core.\n *\n * This module provides the embedding model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) to generate vector embeddings.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed | Vercel AI SDK embed()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed-many | Vercel AI SDK embedMany()}\n */\nimport type {\n EmbeddingModelV3,\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\n} from \"@ai-sdk/provider-v3\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\n\nimport type { SAPAIApiType, SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport {\n getProviderName,\n sapAIEmbeddingProviderOptions,\n validateEmbeddingModelParamsSettings,\n} from \"./sap-ai-provider-options.js\";\nimport {\n type EmbeddingModelStrategyConfig,\n getOrCreateEmbeddingModelStrategy,\n} from \"./sap-ai-strategy.js\";\nimport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\nconst DEFAULT_MAX_EMBEDDINGS_PER_CALL = 2048;\nconst maxEmbeddingsPerCallSchema = z.number().int().positive().or(z.literal(Infinity));\n\n/**\n * Model identifier for SAP AI embedding models.\n *\n * Common embedding model IDs include:\n * - `\"text-embedding-3-small\"` - OpenAI small embedding model (recommended)\n * - `\"text-embedding-3-large\"` - OpenAI large embedding model\n *\n * The actual available models depend on your SAP AI Core deployment configuration.\n * @see {@link https://help.sap.com/docs/sap-ai-core | SAP AI Core Documentation}\n */\nexport type SAPAIEmbeddingModelId = string;\n\n/** @internal */\ninterface SAPAIEmbeddingModelConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Core Embedding Model implementing Vercel AI SDK EmbeddingModelV3.\n *\n * This class provides embedding generation capabilities through SAP AI Core,\n * supporting both the Orchestration API and Foundation Models API.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider\";\n * import { embed, embedMany } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const embeddingModel = provider.embedding(\"text-embedding-3-small\");\n *\n * // Single embedding\n * const { embedding } = await embed({\n * model: embeddingModel,\n * value: \"Hello, world!\",\n * });\n *\n * // Multiple embeddings\n * const { embeddings } = await embedMany({\n * model: embeddingModel,\n * values: [\"Hello\", \"World\"],\n * });\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/embeddings | Vercel AI SDK Embeddings}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAIEmbeddingModel implements EmbeddingModelV3 {\n readonly maxEmbeddingsPerCall: number;\n readonly modelId: string;\n readonly provider: string;\n readonly specificationVersion = \"v3\" as const;\n readonly supportsParallelCalls: boolean = true;\n\n private readonly config: SAPAIEmbeddingModelConfig;\n private readonly settings: SAPAIEmbeddingSettings;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(\n modelId: SAPAIEmbeddingModelId,\n settings: SAPAIEmbeddingSettings = {},\n config: SAPAIEmbeddingModelConfig,\n ) {\n if (settings.modelParams) {\n validateEmbeddingModelParamsSettings(settings.modelParams);\n }\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n this.provider = config.provider;\n this.maxEmbeddingsPerCall = maxEmbeddingsPerCallSchema.parse(\n settings.maxEmbeddingsPerCall ?? DEFAULT_MAX_EMBEDDINGS_PER_CALL,\n );\n }\n\n async doEmbed(options: EmbeddingModelV3CallOptions): Promise<EmbeddingModelV3Result> {\n const providerName = getProviderName(this.config.provider);\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAIEmbeddingProviderOptions,\n });\n\n const effectiveApi = resolveApi(this.config.providerApi, this.settings.api, sapOptions?.api);\n\n validateSettings({\n api: effectiveApi,\n embeddingSettings: this.settings,\n invocationSettings: sapOptions ? { api: sapOptions.api } : undefined,\n modelApi: this.settings.api,\n });\n\n const strategy = await getOrCreateEmbeddingModelStrategy(effectiveApi);\n\n const strategyConfig: EmbeddingModelStrategyConfig = {\n deploymentConfig: this.config.deploymentConfig,\n destination: this.config.destination,\n modelId: this.modelId,\n parsedProviderOptions: sapOptions,\n provider: this.config.provider,\n requestConfig: this.config.requestConfig,\n };\n\n // Bridge readonly strategy JSON to the mutable V3 contract without copying.\n return strategy.doEmbed(\n strategyConfig,\n this.settings,\n options,\n this.maxEmbeddingsPerCall,\n ) as Promise<EmbeddingModelV3Result>;\n }\n}\n","/** Strategy pattern infrastructure for SAP AI Core API support. */\nimport type {\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type {\n SAPAIEmbeddingProviderOptions,\n SAPAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\nimport type {\n SAPAIApiType,\n SAPAIEmbeddingSettings,\n SAPAIModelSettings,\n} from \"./sap-ai-settings.js\";\n\n/** @internal */\nexport interface EmbeddingModelAPIStrategy {\n doEmbed(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n options: EmbeddingModelV3CallOptions,\n maxEmbeddingsPerCall: number,\n ): Promise<EmbeddingModelV3Result>;\n}\n\n/** @internal */\nexport interface EmbeddingModelStrategyConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly modelId: string;\n readonly parsedProviderOptions?: SAPAIEmbeddingProviderOptions;\n readonly provider: string;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * Strategy interface for language model API implementations.\n * @template TSettings - The model settings type, defaults to SAPAIModelSettings for backward compatibility\n * @internal\n */\nexport interface LanguageModelAPIStrategy<\n TSettings extends SAPAIModelSettings = SAPAIModelSettings,\n> {\n doGenerate(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult>;\n\n doStream(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult>;\n}\n\n/** @internal */\nexport interface LanguageModelStrategyConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly modelId: string;\n readonly parsedProviderOptions?: SAPAILanguageModelProviderOptions;\n readonly provider: string;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/** @internal */\nconst languageModelStrategyCache = new Map<SAPAIApiType, Promise<LanguageModelAPIStrategy>>();\n\n/** @internal */\nconst embeddingModelStrategyCache = new Map<SAPAIApiType, Promise<EmbeddingModelAPIStrategy>>();\n\n/** @internal */\nexport function clearStrategyCaches(): void {\n languageModelStrategyCache.clear();\n embeddingModelStrategyCache.clear();\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Embedding model strategy.\n * @internal\n */\nexport function getOrCreateEmbeddingModelStrategy(\n api: SAPAIApiType,\n): Promise<EmbeddingModelAPIStrategy> {\n const cached = embeddingModelStrategyCache.get(api);\n if (cached) {\n return cached;\n }\n\n // Cache the Promise synchronously before any await to prevent race conditions\n const strategyPromise = createEmbeddingModelStrategy(api);\n embeddingModelStrategyCache.set(api, strategyPromise);\n\n strategyPromise.catch(() => {\n embeddingModelStrategyCache.delete(api);\n });\n\n return strategyPromise;\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Language model strategy.\n * @internal\n */\nexport function getOrCreateLanguageModelStrategy(\n api: SAPAIApiType,\n): Promise<LanguageModelAPIStrategy> {\n const cached = languageModelStrategyCache.get(api);\n if (cached) {\n return cached;\n }\n\n // Cache the Promise synchronously before any await to prevent race conditions\n const strategyPromise = createLanguageModelStrategy(api);\n languageModelStrategyCache.set(api, strategyPromise);\n\n strategyPromise.catch(() => {\n languageModelStrategyCache.delete(api);\n });\n\n return strategyPromise;\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Embedding model strategy.\n */\nasync function createEmbeddingModelStrategy(api: SAPAIApiType): Promise<EmbeddingModelAPIStrategy> {\n if (api === \"responses\") {\n const { UnsupportedFeatureError } = await import(\"./sap-ai-error.js\");\n throw new UnsupportedFeatureError(\"Embeddings\", \"responses\", \"foundation-models\");\n }\n\n if (api === \"foundation-models\") {\n const { AzureOpenAiEmbeddingClient } = await import(\"@sap-ai-sdk/foundation-models\");\n const { FoundationModelsEmbeddingModelStrategy } =\n await import(\"./foundation-models-embedding-model-strategy.js\");\n return new FoundationModelsEmbeddingModelStrategy(AzureOpenAiEmbeddingClient);\n }\n\n const { OrchestrationEmbeddingClient } = await import(\"@sap-ai-sdk/orchestration\");\n const { OrchestrationEmbeddingModelStrategy } =\n await import(\"./orchestration-embedding-model-strategy.js\");\n return new OrchestrationEmbeddingModelStrategy(OrchestrationEmbeddingClient);\n}\n\n/**\n * @param api - SAP AI API type.\n * @returns Language model strategy.\n */\nasync function createLanguageModelStrategy(api: SAPAIApiType): Promise<LanguageModelAPIStrategy> {\n if (api === \"responses\") {\n const { ResponsesLanguageModelStrategy } =\n await import(\"./responses-language-model-strategy.js\");\n return new ResponsesLanguageModelStrategy();\n }\n\n if (api === \"foundation-models\") {\n const { AzureOpenAiChatClient } = await import(\"@sap-ai-sdk/foundation-models\");\n const { FoundationModelsLanguageModelStrategy } =\n await import(\"./foundation-models-language-model-strategy.js\");\n return new FoundationModelsLanguageModelStrategy(AzureOpenAiChatClient);\n }\n\n const { OrchestrationClient } = await import(\"@sap-ai-sdk/orchestration\");\n const { OrchestrationLanguageModelStrategy } =\n await import(\"./orchestration-language-model-strategy.js\");\n return new OrchestrationLanguageModelStrategy(OrchestrationClient);\n}\n","/**\n * SAP AI Embedding Model V2 - Vercel AI SDK EmbeddingModelV2 implementation for SAP AI Core.\n *\n * This module provides the embedding model implementation that connects to SAP AI Core\n * services (Orchestration API or Foundation Models API) to generate vector embeddings.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed | Vercel AI SDK embed()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/embed-many | Vercel AI SDK embedMany()}\n */\n\nimport type {\n EmbeddingModelV2,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n SharedV2ProviderOptions,\n} from \"@ai-sdk/provider-v2\";\nimport type { EmbeddingModelV3CallOptions as InternalCallOptions } from \"@ai-sdk/provider-v3\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type { SAPAIApiType, SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport { convertWarningsToV2 } from \"./sap-ai-adapters-v3-to-v2.js\";\nimport { SAPAIEmbeddingModel } from \"./sap-ai-embedding-model.js\";\n\n/** @internal */\ninterface SAPAIEmbeddingModelV2Config {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Core Embedding Model implementing Vercel AI SDK EmbeddingModelV2.\n *\n * This class provides embedding generation capabilities through SAP AI Core,\n * supporting both the Orchestration API and Foundation Models API.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider-v2\";\n * import { embed, embedMany } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const embeddingModel = provider.textEmbeddingModel(\"text-embedding-3-small\");\n *\n * // Single embedding\n * const { embedding } = await embed({\n * model: embeddingModel,\n * value: \"Hello, world!\",\n * });\n *\n * // Multiple embeddings\n * const { embeddings } = await embedMany({\n * model: embeddingModel,\n * values: [\"Hello\", \"World\"],\n * });\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/embeddings | Vercel AI SDK Embeddings}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAIEmbeddingModelV2 implements EmbeddingModelV2<string> {\n readonly maxEmbeddingsPerCall: number;\n readonly modelId: string;\n readonly provider: string;\n readonly specificationVersion = \"v2\" as const;\n readonly supportsParallelCalls: boolean = true;\n\n /** @internal */\n private readonly internalModel: SAPAIEmbeddingModel;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(\n modelId: string,\n settings: SAPAIEmbeddingSettings,\n config: SAPAIEmbeddingModelV2Config,\n ) {\n this.internalModel = new SAPAIEmbeddingModel(modelId, settings, config);\n this.provider = this.internalModel.provider;\n this.modelId = this.internalModel.modelId;\n this.maxEmbeddingsPerCall = this.internalModel.maxEmbeddingsPerCall;\n this.supportsParallelCalls = this.internalModel.supportsParallelCalls;\n }\n\n async doEmbed(options: {\n abortSignal?: AbortSignal;\n headers?: Record<string, string | undefined>;\n providerOptions?: SharedV2ProviderOptions;\n values: string[];\n }): Promise<{\n embeddings: number[][];\n providerMetadata?: SharedV2ProviderMetadata;\n response?: {\n body?: unknown;\n headers?: SharedV2Headers;\n };\n usage?: { tokens: number };\n }> {\n // Normalize headers by removing entries with undefined values\n const normalizedHeaders: Record<string, string> | undefined = options.headers\n ? (Object.fromEntries(\n Object.entries(options.headers).filter(([, value]) => value !== undefined),\n ) as Record<string, string>)\n : undefined;\n\n // Map options for the internal model call\n const callOptions: InternalCallOptions = {\n abortSignal: options.abortSignal,\n headers: normalizedHeaders,\n providerOptions: options.providerOptions,\n values: options.values,\n };\n const result = await this.internalModel.doEmbed(callOptions);\n\n // Handle any warnings by logging them (V2 API doesn't support returning warnings)\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (result.warnings && result.warnings.length > 0) {\n const warnings = convertWarningsToV2(result.warnings);\n // Log warnings - convertWarningsToV2 normalizes all warnings to type \"other\" with message\n for (const warning of warnings) {\n console.warn(`[SAP AI Embedding] ${warning.message}`);\n }\n }\n\n // Return result in V2 format\n return {\n embeddings: result.embeddings,\n providerMetadata: result.providerMetadata as SharedV2ProviderMetadata | undefined,\n response: result.response,\n usage: result.usage,\n };\n }\n}\n","/** Normalizes AI SDK 5 prompt media for the shared V3 core. */\nimport type {\n LanguageModelV2Prompt,\n LanguageModelV2ToolResultOutput,\n LanguageModelV2ToolResultPart,\n LanguageModelV3Prompt,\n LanguageModelV3ToolResultOutput,\n LanguageModelV3ToolResultPart,\n} from \"@ai-sdk/provider\";\n\nimport { resolveFullMediaType } from \"@ai-sdk/provider-utils\";\n\ntype V3ToolContentItem = Extract<\n LanguageModelV3ToolResultOutput,\n { type: \"content\" }\n>[\"value\"][number];\n\n/**\n * Converts legacy tool media while preserving other V2 and compatible V3 parts.\n * @param prompt - The V2 prompt or compatible V3 history.\n * @returns Prompt content understood by the V3 strategies.\n * @internal\n */\nexport function normalizeV2PromptToV3(\n prompt: LanguageModelV2Prompt | LanguageModelV3Prompt,\n): LanguageModelV3Prompt {\n return prompt.map((message) => {\n switch (message.role) {\n case \"assistant\":\n return {\n ...message,\n content: message.content.map((part) =>\n part.type === \"tool-result\" ? normalizeToolResultPart(part) : part,\n ),\n };\n case \"tool\":\n return {\n ...message,\n content: message.content.map((part) =>\n part.type === \"tool-result\" ? normalizeToolResultPart(part) : part,\n ),\n };\n default:\n return message;\n }\n });\n}\n\n/**\n * Normalizes media in a tool output without changing scalar or error outputs.\n * @param output - Legacy or compatible tool output.\n * @returns Tool output with V3 media discriminators.\n */\nfunction normalizeToolOutput(\n output: LanguageModelV2ToolResultOutput | LanguageModelV3ToolResultOutput,\n): LanguageModelV3ToolResultOutput {\n if (output.type !== \"content\") return output;\n return {\n ...output,\n value: output.value.map((item): V3ToolContentItem => {\n if (item.type !== \"media\") return item;\n const mediaType = resolveFullMediaType({\n part: {\n data: { data: item.data, type: \"data\" },\n mediaType: item.mediaType.toLowerCase(),\n type: \"file\",\n },\n });\n return {\n ...item,\n mediaType,\n type: mediaType.startsWith(\"image/\") ? \"image-data\" : \"file-data\",\n };\n }),\n };\n}\n\n/**\n * Preserves tool-result metadata while adapting its nested media content.\n * @param part - Legacy or compatible tool result.\n * @returns The tool result understood by the V3 core.\n */\nfunction normalizeToolResultPart(\n part: LanguageModelV2ToolResultPart | LanguageModelV3ToolResultPart,\n): LanguageModelV3ToolResultPart {\n return { ...part, output: normalizeToolOutput(part.output) };\n}\n","/**\n * SAP AI Language Model - Vercel AI SDK LanguageModelV3 implementation for SAP AI Core.\n *\n * This module provides the language model implementation that connects to SAP AI Core\n * services (Orchestration, Foundation Models Chat Completions, or OpenAI Responses)\n * for text generation and streaming.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/generate-text | Vercel AI SDK generateText()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/stream-text | Vercel AI SDK streamText()}\n */\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n} from \"@ai-sdk/provider-v3\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\n\nimport type { SAPAIApiType, SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\n\nimport {\n getProviderName,\n sapAILanguageModelProviderOptions,\n validateModelParamsSettings,\n} from \"./sap-ai-provider-options.js\";\nimport {\n getOrCreateLanguageModelStrategy,\n type LanguageModelAPIStrategy,\n type LanguageModelStrategyConfig,\n} from \"./sap-ai-strategy.js\";\nimport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\n/** @internal */\ninterface SAPAILanguageModelConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Language Model implementing Vercel AI SDK LanguageModelV3.\n *\n * This class provides text generation and streaming through SAP AI Core using\n * Orchestration (with content filtering, grounding, masking, and translation),\n * Foundation Models Chat Completions, or native OpenAI Responses.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider\";\n * import { generateText, streamText } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const model = provider(\"gpt-4.1\");\n *\n * // Non-streaming\n * const { text } = await generateText({\n * model,\n * prompt: \"Hello!\",\n * });\n *\n * // Streaming\n * const result = streamText({\n * model,\n * prompt: \"Tell me a story\",\n * });\n *\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/generating-text | Vercel AI SDK Text Generation}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAILanguageModel implements LanguageModelV3 {\n readonly modelId: SAPAIModelId;\n readonly specificationVersion = \"v3\";\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls(): Record<string, RegExp[]> {\n return {\n \"image/*\": [/^https:\\/\\/.+$/i, /^data:image\\/.*$/],\n };\n }\n\n /** @internal */\n private readonly config: SAPAILanguageModelConfig;\n\n /** @internal */\n private readonly settings: SAPAISettings;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(modelId: SAPAIModelId, settings: SAPAISettings, config: SAPAILanguageModelConfig) {\n if (settings.modelParams) {\n validateModelParamsSettings(settings.modelParams);\n }\n this.settings = settings;\n this.config = config;\n this.modelId = modelId;\n }\n\n async doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult> {\n const { strategy, strategyConfig } = await this.prepareInvocation(options);\n const result = strategy.doGenerate(strategyConfig, this.settings, options);\n // Bridge readonly strategy JSON to the mutable V3 contract without copying.\n return result as Promise<LanguageModelV3GenerateResult>;\n }\n\n async doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult> {\n const { strategy, strategyConfig } = await this.prepareInvocation(options);\n const result = strategy.doStream(strategyConfig, this.settings, options);\n // Preserve the stream itself while exposing AI SDK 6's mutable JSON contract.\n return result as Promise<LanguageModelV3StreamResult>;\n }\n\n supportsUrl(url: URL): boolean {\n if (url.protocol === \"https:\") return true;\n if (url.protocol === \"data:\") {\n return /^data:image\\//i.test(url.href);\n }\n return false;\n }\n\n /**\n * Prepares common invocation context for doGenerate and doStream.\n * @param options - AI SDK call options.\n * @returns Strategy and configuration for the invocation.\n * @internal\n */\n private async prepareInvocation(options: LanguageModelV3CallOptions): Promise<{\n strategy: LanguageModelAPIStrategy;\n strategyConfig: LanguageModelStrategyConfig;\n }> {\n const providerName = getProviderName(this.config.provider);\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAILanguageModelProviderOptions,\n });\n\n const effectiveApi = resolveApi(this.config.providerApi, this.settings.api, sapOptions?.api);\n\n validateSettings({\n api: effectiveApi,\n invocationSettings: sapOptions\n ? {\n api: sapOptions.api,\n dropUnsupportedParams: sapOptions.dropUnsupportedParams,\n escapeTemplatePlaceholders: sapOptions.escapeTemplatePlaceholders,\n orchestrationConfigRef: sapOptions.orchestrationConfigRef,\n placeholderValues: sapOptions.placeholderValues,\n promptTemplateRef: sapOptions.promptTemplateRef,\n responses: sapOptions.responses,\n }\n : undefined,\n modelApi: this.settings.api,\n modelSettings: this.settings,\n });\n\n const strategy = await getOrCreateLanguageModelStrategy(effectiveApi);\n\n const strategyConfig: LanguageModelStrategyConfig = {\n deploymentConfig: this.config.deploymentConfig,\n destination: this.config.destination,\n modelId: this.modelId,\n parsedProviderOptions: sapOptions,\n provider: this.config.provider,\n requestConfig: this.config.requestConfig,\n };\n\n return { strategy, strategyConfig };\n }\n}\n","/**\n * SAP AI Language Model V2 - Vercel AI SDK LanguageModelV2 implementation for SAP AI Core.\n *\n * This module provides the language model implementation that connects to SAP AI Core\n * services (Orchestration, Foundation Models Chat Completions, or OpenAI Responses) for text generation.\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/generate-text | Vercel AI SDK generateText()}\n * @see {@link https://sdk.vercel.ai/docs/reference/ai-sdk-core/stream-text | Vercel AI SDK streamText()}\n */\n\nimport type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV3CallOptions as StrategyLanguageModelCallOptions,\n} from \"@ai-sdk/provider\";\nimport type {\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2ResponseMetadata,\n LanguageModelV2Usage,\n SharedV2Headers,\n SharedV2ProviderMetadata,\n} from \"@ai-sdk/provider-v2\";\nimport type { LanguageModelV3CallOptions } from \"@ai-sdk/provider-v3\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n\nimport type { ConvertedV2StreamPart, ConvertedV2Warning } from \"./sap-ai-adapters-v3-to-v2.js\";\nimport type { SAPAIApiType, SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\n\nimport { normalizeV2PromptToV3 } from \"./sap-ai-adapters-v2-to-v3.js\";\nimport {\n convertUsageToV2,\n convertWarningsToV2,\n createV2StreamFromInternal,\n createV2ToolApprovalError,\n} from \"./sap-ai-adapters-v3-to-v2.js\";\nimport { SAPAILanguageModel as SAPAILanguageModelInternal } from \"./sap-ai-language-model.js\";\n\n// AI SDK 6.0 shipped V2 tools with the V3 provider-tool discriminator.\ntype CompatibleV2CallOptions = Omit<LanguageModelV2CallOptions, \"tools\"> & {\n tools?: LanguageModelV2CallOptions[\"tools\"] | LanguageModelV3CallOptions[\"tools\"];\n};\n\n/** @internal */\ninterface SAPAILanguageModelV2Config {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly destination?: HttpDestinationOrFetchOptions;\n readonly provider: string;\n readonly providerApi?: SAPAIApiType;\n readonly requestConfig?: CustomRequestConfig;\n}\n\n/**\n * SAP AI Language Model implementing Vercel AI SDK LanguageModelV2.\n *\n * This class provides chat completion and streaming capabilities through SAP AI Core,\n * supporting the Orchestration API (with content filtering, grounding, masking,\n * and translation), Foundation Models Chat Completions, and native OpenAI Responses\n * through SAP AI Core.\n *\n * Users typically don't instantiate this class directly. Instead, use the\n * {@link createSAPAIProvider} factory function:\n * @example\n * ```typescript\n * import { createSAPAIProvider } from \"@jerome-benoit/sap-ai-provider-v2\";\n * import { generateText, streamText } from \"ai\";\n *\n * const provider = createSAPAIProvider();\n * const model = provider(\"gpt-4.1\");\n *\n * // Non-streaming\n * const { text } = await generateText({\n * model,\n * prompt: \"Hello!\",\n * });\n *\n * // Streaming\n * const result = streamText({\n * model,\n * prompt: \"Tell me a story\",\n * });\n *\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n * ```\n * @see {@link https://sdk.vercel.ai/docs/ai-sdk-core/generating-text | Vercel AI SDK Text Generation}\n * @see {@link createSAPAIProvider} - Factory function to create provider instances\n */\nexport class SAPAILanguageModelV2 implements LanguageModelV2 {\n readonly modelId: SAPAIModelId;\n readonly specificationVersion = \"v2\" as const;\n\n get provider(): string {\n return this.internalModel.provider;\n }\n\n get supportedUrls(): Record<string, RegExp[]> {\n return this.internalModel.supportedUrls;\n }\n\n /** @internal */\n private readonly internalModel: SAPAILanguageModelInternal;\n\n /**\n * @param modelId - Model identifier.\n * @param settings - Model settings.\n * @param config - Model configuration.\n * @internal\n */\n constructor(modelId: SAPAIModelId, settings: SAPAISettings, config: SAPAILanguageModelV2Config) {\n this.modelId = modelId;\n this.internalModel = new SAPAILanguageModelInternal(modelId, settings, config);\n }\n\n async doGenerate(options: CompatibleV2CallOptions): Promise<{\n content: LanguageModelV2Content[];\n finishReason: LanguageModelV2FinishReason;\n providerMetadata?: SharedV2ProviderMetadata;\n request?: {\n body?: unknown;\n };\n response?: LanguageModelV2ResponseMetadata & {\n body?: unknown;\n headers?: SharedV2Headers;\n };\n usage: LanguageModelV2Usage;\n warnings: ConvertedV2Warning[];\n }> {\n const result = await this.internalModel.doGenerate(normalizeCallOptions(options));\n if (result.content.some((part) => part.type === \"tool-approval-request\")) {\n throw createV2ToolApprovalError();\n }\n\n // Return result in V2 format\n return {\n content: result.content as LanguageModelV2Content[],\n finishReason: result.finishReason.unified,\n providerMetadata: result.providerMetadata as SharedV2ProviderMetadata | undefined,\n request: result.request,\n response: result.response,\n usage: convertUsageToV2(result.usage),\n warnings: convertWarningsToV2(result.warnings),\n };\n }\n\n async doStream(options: CompatibleV2CallOptions): Promise<{\n request?: {\n body?: unknown;\n };\n response?: {\n headers?: SharedV2Headers;\n };\n stream: ReadableStream<ConvertedV2StreamPart>;\n }> {\n const result = await this.internalModel.doStream(normalizeCallOptions(options));\n\n return {\n request: result.request,\n response: result.response\n ? {\n headers: result.response.headers,\n }\n : undefined,\n stream: createV2StreamFromInternal(result.stream),\n };\n }\n}\n\n/**\n * Adapts the V2 prompt while retaining existing tool compatibility behavior.\n * @param options - V2 call options.\n * @returns Call options for the shared V3 core.\n */\nfunction normalizeCallOptions(options: CompatibleV2CallOptions): LanguageModelV3CallOptions {\n const normalized: StrategyLanguageModelCallOptions = {\n ...options,\n prompt: normalizeV2PromptToV3(options.prompt),\n // Legacy provider-defined tools keep their unsupported warning/skip behavior.\n tools: options.tools as LanguageModelV3CallOptions[\"tools\"],\n };\n // Prompt normalization preserves JSON values; only the core's mutable JSON type is narrower.\n return normalized as LanguageModelV3CallOptions;\n}\n","import type { ImageModelV2, ProviderV2 } from \"@ai-sdk/provider-v2\";\n\nimport { NoSuchModelError } from \"@ai-sdk/provider\";\nimport { setGlobalLogLevel } from \"@sap-cloud-sdk/util\";\n\nimport type { SAPAIEmbeddingModelId } from \"./sap-ai-embedding-model.js\";\nimport type { DeploymentConfig, SAPAIProviderSettings } from \"./sap-ai-provider.js\";\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\n\nimport { SAPAIEmbeddingModelV2 } from \"./sap-ai-embedding-model-v2.js\";\nimport { SAPAILanguageModelV2 } from \"./sap-ai-language-model-v2.js\";\nimport { SAP_AI_PROVIDER_NAME, validateModelParamsSettings } from \"./sap-ai-provider-options.js\";\nimport { SAPAIModelId, SAPAISettings } from \"./sap-ai-settings.js\";\nimport { mergeSettingsWithApi } from \"./sap-ai-validation.js\";\n\nexport type { DeploymentConfig, SAPAIProviderSettings } from \"./sap-ai-provider.js\";\n\n/** SAP AI Provider interface extending Vercel AI SDK ProviderV2. */\nexport interface SAPAIProviderV2 extends ProviderV2 {\n (modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n chat(modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n /** Always throws - SAP AI Core does not support image generation. */\n imageModel(modelId: string): ImageModelV2;\n languageModel(modelId: SAPAIModelId, settings?: SAPAISettings): SAPAILanguageModelV2;\n textEmbeddingModel(\n modelId: SAPAIEmbeddingModelId,\n settings?: SAPAIEmbeddingSettings,\n ): SAPAIEmbeddingModelV2;\n}\n\n/**\n * Creates an SAP AI Provider V2 instance for use with AI SDK 5.\n * AI SDK 6 can also consume this provider through its V2 compatibility layer.\n *\n * Uses SAP AI SDK clients for Orchestration and Foundation Models, and its HTTP\n * transport with the OpenAI provider for Responses. Authentication uses a service\n * binding (VCAP_SERVICES on SAP BTP) or the AICORE_SERVICE_KEY environment variable.\n * @param options - Provider configuration options.\n * @param options.api - Default API type: `'orchestration'` (default), `'foundation-models'`, or `'responses'`.\n * @param options.defaultSettings - Default model settings applied to every model instance.\n * @param options.deploymentId - Explicit SAP AI Core deployment ID; omit for automatic deployment resolution.\n * @param options.destination - Custom SAP Cloud SDK destination configuration.\n * @param options.logLevel - Log level for SAP Cloud SDK loggers (`'debug'`, `'info'`, `'warn'`, `'error'`).\n * @param options.name - Provider name (default: `'sap-ai'`); see {@link SAPAIProviderSettings.name} for namespace rules.\n * @param options.requestConfig - Provider-level custom request configuration. See {@link SAPAIProviderSettings.requestConfig} for scope, portability, and abort semantics.\n * @param options.resourceGroup - SAP AI Core resource group (default: `'default'`); ignored when deploymentId is set.\n * @param options.warnOnAmbiguousConfig - Whether to warn when both deploymentId and resourceGroup are set.\n * @returns A configured SAP AI provider instance that can be used as a callable or via methods.\n * @example\n * // Basic usage with defaults\n * const provider = createSAPAIProvider();\n * const model = provider('gpt-4.1');\n * @example\n * // With custom configuration\n * const provider = createSAPAIProvider({\n * api: 'foundation-models',\n * resourceGroup: 'production',\n * defaultSettings: { modelParams: { temperature: 0.7 } },\n * });\n * @example\n * // Using provider methods\n * const chatModel = provider.chat('gpt-4.1');\n * const embeddingModel = provider.textEmbeddingModel('text-embedding-3-small');\n * @throws {Error} When provider function is called with the `new` keyword.\n * @throws {NoSuchModelError} When `imageModel()` is called (image generation not supported).\n * @see {@link SAPAIProviderSettings} for all configuration options.\n * @see {@link SAPAIProviderV2} for the provider interface.\n */\nexport function createSAPAIProvider(options: SAPAIProviderSettings = {}): SAPAIProviderV2 {\n if (options.defaultSettings?.modelParams) {\n validateModelParamsSettings(options.defaultSettings.modelParams);\n }\n\n const providerName = options.name ?? SAP_AI_PROVIDER_NAME;\n\n const resourceGroup = options.resourceGroup ?? \"default\";\n\n const warnOnAmbiguousConfig = options.warnOnAmbiguousConfig ?? true;\n\n if (warnOnAmbiguousConfig && options.deploymentId && options.resourceGroup) {\n console.warn(\n \"createSAPAIProvider: both 'deploymentId' and 'resourceGroup' were provided; using 'deploymentId' and ignoring 'resourceGroup'.\",\n );\n }\n\n if (typeof process === \"undefined\" || !process.env.SAP_CLOUD_SDK_LOG_LEVEL) {\n const logLevel = options.logLevel ?? \"warn\";\n setGlobalLogLevel(logLevel);\n }\n\n const deploymentConfig: DeploymentConfig = options.deploymentId\n ? { deploymentId: options.deploymentId }\n : { resourceGroup };\n\n // Provider-level API setting (defaults to 'orchestration')\n const providerApi = options.api ?? \"orchestration\";\n\n const createModel = (modelId: SAPAIModelId, settings: SAPAISettings = {}) => {\n const mergedSettings = mergeSettingsWithApi(\n options.defaultSettings as Record<string, unknown> | undefined,\n settings,\n providerApi,\n );\n\n return new SAPAILanguageModelV2(modelId, mergedSettings, {\n deploymentConfig,\n destination: options.destination,\n provider: `${providerName}.chat`,\n providerApi,\n requestConfig: options.requestConfig,\n });\n };\n\n const createEmbeddingModel = (\n modelId: SAPAIEmbeddingModelId,\n settings: SAPAIEmbeddingSettings = {},\n ): SAPAIEmbeddingModelV2 => {\n const mergedSettings = mergeSettingsWithApi(\n options.defaultSettings as Record<string, unknown> | undefined,\n settings,\n providerApi,\n );\n\n return new SAPAIEmbeddingModelV2(modelId, mergedSettings, {\n deploymentConfig,\n destination: options.destination,\n provider: `${providerName}.embedding`,\n providerApi,\n requestConfig: options.requestConfig,\n });\n };\n\n const provider = function (modelId: SAPAIModelId, settings?: SAPAISettings) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (new.target) {\n throw new Error(\"The SAP AI provider function cannot be called with the new keyword.\");\n }\n\n return createModel(modelId, settings);\n };\n\n provider.chat = createModel;\n provider.languageModel = createModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({\n message: `SAP AI Core does not support image generation. Model '${modelId}' is not available.`,\n modelId,\n modelType: \"imageModel\",\n });\n };\n\n return provider;\n}\n\n/** Default SAP AI provider instance with automatic authentication via SAP AI SDK. */\nexport const sapai = createSAPAIProvider();\n","import type { OpenAIResponsesProviderOptions } from \"@ai-sdk/openai\";\nimport type { AzureOpenAiChatCompletionParameters } from \"@sap-ai-sdk/foundation-models\";\nimport type {\n ChatCompletionTool,\n ChatModel,\n FilteringModule,\n GroundingModule,\n MaskingModule,\n OrchestrationConfigRefById,\n OrchestrationConfigRefByName,\n OrchestrationModuleConfig,\n TranslationModule,\n} from \"@sap-ai-sdk/orchestration\";\n\n/** Azure OpenAI chat extension configuration for \"On Your Data\" RAG scenarios. */\nexport type AzureOpenAiChatExtensionConfiguration = NonNullable<\n AzureOpenAiChatCompletionParameters[\"data_sources\"]\n>[number];\n\n/**\n * Common model parameters shared between APIs.\n *\n * Known parameters are validated by Zod in constructor settings and per-call\n * `modelParams` provider options; additional model-specific keys are passed through.\n */\nexport interface CommonModelParams {\n /**\n * Frequency penalty to reduce repetition of token sequences.\n * Range: -2.0 to 2.0\n */\n readonly frequencyPenalty?: number;\n /**\n * Maximum number of tokens to generate.\n * Range: Positive integer\n */\n readonly maxTokens?: number;\n /**\n * Number of completions to generate.\n * Availability depends on the selected SAP API and model; no model-family filtering is applied.\n * Range: Positive integer\n */\n readonly n?: number;\n /** Whether to enable parallel tool calls when multiple tools are available. */\n readonly parallel_tool_calls?: boolean;\n /**\n * Presence penalty to encourage talking about new topics.\n * Range: -2.0 to 2.0\n */\n readonly presencePenalty?: number;\n /** Index signature for additional model-specific parameters. */\n readonly [key: string]: unknown;\n /**\n * Sampling temperature controlling randomness.\n * Higher values (e.g., 1.0) make output more random, lower values (e.g., 0.2) more deterministic.\n * Range: 0 to 2\n */\n readonly temperature?: number;\n /**\n * Nucleus sampling parameter. Only tokens with cumulative probability up to `topP` are considered.\n * Range: 0 to 1\n */\n readonly topP?: number;\n}\n\n/** Default settings configuration when using Foundation Models API. */\nexport interface FoundationModelsDefaultSettings {\n readonly api: \"foundation-models\";\n readonly settings?: FoundationModelsModelSettings;\n}\n\n/** Model parameters for Foundation Models Embedding API. */\nexport interface FoundationModelsEmbeddingParams {\n readonly dimensions?: number;\n readonly encoding_format?: \"base64\" | \"float\";\n readonly user?: string;\n}\n\n/** Model parameters for Foundation Models API with Azure OpenAI-specific extensions. */\nexport interface FoundationModelsModelParams extends CommonModelParams {\n readonly logit_bias?: AzureOpenAiChatCompletionParameters[\"logit_bias\"];\n readonly logprobs?: AzureOpenAiChatCompletionParameters[\"logprobs\"];\n readonly seed?: AzureOpenAiChatCompletionParameters[\"seed\"];\n readonly stop?: AzureOpenAiChatCompletionParameters[\"stop\"];\n /** Requires logprobs=true. */\n readonly top_logprobs?: AzureOpenAiChatCompletionParameters[\"top_logprobs\"];\n readonly user?: AzureOpenAiChatCompletionParameters[\"user\"];\n}\n\n/** Model settings when using Foundation Models API. */\nexport interface FoundationModelsModelSettings {\n readonly api: \"foundation-models\";\n /** Azure OpenAI \"On Your Data\" configuration for RAG scenarios. */\n readonly dataSources?: AzureOpenAiChatExtensionConfiguration[];\n /**\n * Forward assistant reasoning from the input history as text; does not enable reasoning output.\n * @default false\n */\n readonly includeReasoning?: boolean;\n readonly modelParams?: FoundationModelsModelParams;\n readonly modelVersion?: string;\n readonly responseFormat?: ResponseFormat;\n}\n\n/** Default settings configuration when using Orchestration API. */\nexport interface OrchestrationDefaultSettings {\n readonly api?: \"orchestration\";\n readonly settings?: OrchestrationModelSettings;\n}\n\n/** Model parameters for Orchestration API. */\nexport type OrchestrationModelParams = CommonModelParams;\n\n/** Model settings when using Orchestration API with filtering, grounding, masking, and translation. */\nexport interface OrchestrationModelSettings {\n readonly api?: \"orchestration\";\n /**\n * Whether Orchestration drops parameters unsupported by Responses-only models.\n * Applies to the primary local model, not fallback models or stored configurations.\n * Omitted values retain the SAP service default; false requests an explicit error.\n */\n readonly dropUnsupportedParams?: boolean;\n /** @default true */\n readonly escapeTemplatePlaceholders?: boolean;\n /**\n * Additional module configurations for prompt module fallback.\n * These entries follow the primary configuration in the list passed to the SAP SDK.\n * Each entry is a full `OrchestrationModuleConfig` with its own model, prompt, and modules.\n * @example\n * ```ts\n * fallbackModuleConfigs: [\n * {\n * promptTemplating: {\n * model: { name: \"gpt-4.1-mini\" },\n * prompt: { template: [] },\n * },\n * },\n * ]\n * ```\n */\n readonly fallbackModuleConfigs?: OrchestrationModuleConfig[];\n readonly filtering?: FilteringModule;\n readonly grounding?: GroundingModule;\n /**\n * Forward assistant reasoning from the input history as text; does not enable reasoning output.\n * @default false\n */\n readonly includeReasoning?: boolean;\n readonly masking?: MaskingModule | { providers: MaskingModule[\"masking_providers\"] };\n readonly modelParams?: OrchestrationModelParams;\n readonly modelVersion?: string;\n /**\n * Reference to a complete orchestration configuration stored in SAP AI Core Prompt Registry.\n * When provided, local module settings (filtering, masking, grounding, translation, tools,\n * promptTemplateRef, responseFormat) are ignored as the full configuration is managed\n * by the referenced config. The reference, including its explicit `overrideConfig`,\n * is passed to the SAP SDK; messages and `placeholderValues` remain request inputs.\n * @example { id: \"f47ac10b-58cc-4372-a567-0e02b2c3d479\" }\n * @example { scenario: \"customer-support\", name: \"prod-config\", version: \"1.0.0\" }\n */\n readonly orchestrationConfigRef?: OrchestrationConfigRefById | OrchestrationConfigRefByName;\n readonly placeholderValues?: Record<string, string>;\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: ResponseFormat;\n /**\n * Options for streaming behavior with locally configured post-LLM modules.\n * Includes direct `doStream()` calls; ignored when `orchestrationConfigRef` is used.\n */\n readonly streamOptions?: OrchestrationStreamOptions;\n readonly tools?: ChatCompletionTool[];\n readonly translation?: TranslationModule;\n}\n\n/**\n * Stream options for orchestration post-LLM module processing.\n * Controls chunking behavior for translation, filtering, and other modules during streaming.\n * Ignored with `orchestrationConfigRef`; configure streaming in the stored\n * configuration or its `overrideConfig` instead.\n */\nexport interface OrchestrationStreamOptions {\n /**\n * Minimum number of characters per chunk for post-LLM modules.\n * Valid range: 1-10000. Defaults to 100.\n */\n readonly chunkSize?: number;\n /**\n * Delimiters for splitting stream into chunks (e.g., sentence boundaries).\n * Recommended for translation; the provider warns when local translation settings lack them.\n * @example [\"\\n\", \".\", \"?\", \"!\"]\n */\n readonly delimiters?: readonly string[];\n /**\n * Additional characters from previous chunks sent to output filtering for context.\n * Valid range: 0-10000.\n */\n readonly outputFilteringOverlap?: number;\n}\n\n/** Reference to a template in SAP AI Core's Prompt Registry. */\nexport type PromptTemplateRef = PromptTemplateRefByID | PromptTemplateRefByScenarioNameVersion;\n\n/** Reference to a Prompt Registry template by ID. */\nexport interface PromptTemplateRefByID {\n readonly id: string;\n readonly scope?: PromptTemplateScope;\n}\n\n/** Reference to a Prompt Registry template by scenario, name, and version. */\nexport interface PromptTemplateRefByScenarioNameVersion {\n readonly name: string;\n readonly scenario: string;\n readonly scope?: PromptTemplateScope;\n readonly version: string;\n}\n\n/** Scope for Prompt Registry templates: 'tenant' (default) or 'resource_group'. */\nexport type PromptTemplateScope = \"resource_group\" | \"tenant\";\n\n/** Response format for structured output (OpenAI-compatible). */\nexport type ResponseFormat = AzureOpenAiChatCompletionParameters[\"response_format\"];\n\n/** Default settings configuration when using the Responses API. */\nexport interface ResponsesDefaultSettings {\n readonly api: \"responses\";\n readonly settings?: ResponsesModelSettings;\n}\n\n/** Model-specific Responses API options, validated by the OpenAI provider. */\nexport type ResponsesModelOptions = Omit<OpenAIResponsesProviderOptions, \"metadata\"> & {\n readonly metadata?: null | Record<string, string>;\n};\n\n/** Model settings for the OpenAI Responses API through SAP AI Core. */\nexport interface ResponsesModelSettings {\n readonly api: \"responses\";\n readonly modelParams?: CommonModelParams;\n readonly modelVersion?: string;\n readonly responseFormat?: ResponseFormat;\n readonly responses?: ResponsesModelOptions;\n}\n\n/**\n * Supported API types for SAP AI Core.\n *\n * - `'orchestration'` - Full-featured API with data masking, content filtering, document grounding, and translation.\n * - `'foundation-models'` - Direct model access with Azure OpenAI-specific parameters like `logprobs`, `seed`, and `dataSources`.\n * - `'responses'` - OpenAI Responses API with native reasoning and tool-call history.\n */\nexport type SAPAIApiType = \"foundation-models\" | \"orchestration\" | \"responses\";\n\n/** Union type for API-specific default settings configuration. */\nexport type SAPAIDefaultSettingsConfig =\n FoundationModelsDefaultSettings | OrchestrationDefaultSettings | ResponsesDefaultSettings;\n\n/** Settings for the SAP AI Embedding Model. */\nexport interface SAPAIEmbeddingSettings {\n readonly api?: SAPAIApiType;\n /** Orchestration API only. */\n readonly masking?: MaskingModule | { providers: MaskingModule[\"masking_providers\"] };\n /**\n * Maximum batch size: a positive integer, or `Infinity` for no provider-side limit.\n * @default 2048\n */\n readonly maxEmbeddingsPerCall?: number;\n readonly modelParams?: FoundationModelsEmbeddingParams | Record<string, unknown>;\n readonly modelVersion?: string;\n readonly [key: string]: unknown;\n /**\n * Orchestration embedding input type; ignored by Foundation Models.\n * @default 'text'\n */\n readonly type?: \"document\" | \"query\" | \"text\";\n}\n\n/**\n * Supported model IDs in SAP AI Core.\n *\n * Model availability depends on tenant configuration and region.\n * Common values include: `'gpt-4.1'`, `'gpt-4.1-mini'`, `'anthropic--claude-4.5-sonnet'`, `'gemini-2.5-pro'`.\n * @see {@link https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/models-and-scenarios-in-generative-ai-hub | SAP AI Core Models}\n */\nexport type SAPAIModelId = ChatModel;\n\n/**\n * Union type for API-specific model settings.\n *\n * Use `FoundationModelsModelSettings` for Foundation Models API features (dataSources, logprobs, seed).\n * Use `OrchestrationModelSettings` for Orchestration API features (filtering, grounding, masking, translation).\n * Use `ResponsesModelSettings` for native OpenAI Responses options and reasoning history.\n */\nexport type SAPAIModelSettings =\n FoundationModelsModelSettings | OrchestrationModelSettings | ResponsesModelSettings;\n\n/** Re-exported SAP AI SDK orchestration types. */\nexport type {\n FilteringModule,\n GroundingModule,\n MaskingModule,\n TranslationModule,\n} from \"@sap-ai-sdk/orchestration\";\n\nexport {\n buildAzureContentSafetyFilter,\n buildDocumentGroundingConfig,\n buildDpiMaskingProvider,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- Preserve the upstream deprecated public API.\n buildLlamaGuard38BFilter,\n buildTranslationConfig,\n} from \"@sap-ai-sdk/orchestration\";\n\n/**\n * Settings for configuring SAP AI Core model behavior.\n * Legacy interface maintained for backward compatibility. Prefer the API-specific\n * OrchestrationModelSettings, FoundationModelsModelSettings, or ResponsesModelSettings types.\n */\nexport interface SAPAISettings {\n readonly api?: SAPAIApiType;\n /** Orchestration API only; controls unsupported parameters on the primary local model. */\n readonly dropUnsupportedParams?: boolean;\n /** @default true */\n readonly escapeTemplatePlaceholders?: boolean;\n /** Orchestration API only. */\n readonly fallbackModuleConfigs?: OrchestrationModuleConfig[];\n /** Orchestration API only. */\n readonly filtering?: FilteringModule;\n /** Orchestration API only. */\n readonly grounding?: GroundingModule;\n /**\n * Forward assistant reasoning from the input history as text; does not enable reasoning output.\n * @default false\n */\n readonly includeReasoning?: boolean;\n /** Orchestration API only. */\n readonly masking?: MaskingModule | { providers: MaskingModule[\"masking_providers\"] };\n readonly modelParams?: CommonModelParams;\n readonly modelVersion?: string;\n /** Orchestration API only. */\n readonly orchestrationConfigRef?: OrchestrationConfigRefById | OrchestrationConfigRefByName;\n /** Orchestration API only. */\n readonly placeholderValues?: Record<string, string>;\n /** Orchestration API only. */\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: ResponseFormat;\n /** Responses API only. */\n readonly responses?: ResponsesModelOptions;\n /** Orchestration API only; ignored when `orchestrationConfigRef` is used. */\n readonly streamOptions?: OrchestrationStreamOptions;\n /** Orchestration API only. */\n readonly tools?: ChatCompletionTool[];\n /** Orchestration API only. */\n readonly translation?: TranslationModule;\n}\n\nexport type {\n AssistantChatMessage,\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n ChatMessageContent,\n ChatMessages,\n Citation,\n DeveloperChatMessage,\n DocumentTranslationApplyToSelector,\n FileContent,\n FunctionObject,\n ImageContentUrl,\n LlmModelDetails,\n LlmModelParams,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- Preserve the upstream deprecated public API.\n OrchestrationConfigRef,\n OrchestrationConfigRefById,\n OrchestrationConfigRefByName,\n OrchestrationConfigRefOverride,\n OrchestrationError,\n OrchestrationModuleConfig,\n OrchestrationModuleConfigList,\n PromptTemplatingModule,\n SystemChatMessage,\n ToolChatMessage,\n TranslationApplyToCategory,\n TranslationInputParameters,\n TranslationOutputParameters,\n TranslationTargetLanguage,\n UserChatMessage,\n UserChatMessageContent,\n UserChatMessageContentItem,\n} from \"@sap-ai-sdk/orchestration\";\n\nexport {\n OrchestrationEmbeddingResponse,\n OrchestrationResponse,\n OrchestrationStream,\n OrchestrationStreamChunkResponse,\n OrchestrationStreamResponse,\n} from \"@sap-ai-sdk/orchestration\";\n","/**\n * `@jerome-benoit/sap-ai-provider/v2` AI SDK 5 (spec V2) entrypoint.\n *\n * Exposes the V2 facades (`LanguageModelV2` / `EmbeddingModelV2` /\n * `ProviderV2`) over the shared V3 core. Also available from the standalone\n * `@jerome-benoit/sap-ai-provider-v2` package. AI SDK 6 can consume these V2\n * interfaces through its compatibility layer; use `v4` with AI SDK 7.\n * @see {@link https://sdk.vercel.ai/} Vercel AI SDK documentation\n */\n\n/**\n * Utility functions for escaping template delimiters (`{{`, `{%`, `{#`) in orchestration content.\n */\nexport {\n escapeOrchestrationPlaceholders,\n unescapeOrchestrationPlaceholders,\n} from \"./convert-to-sap-messages.js\";\n\n/**\n * Embedding model class implementing EmbeddingModelV2 for SAP AI Core.\n * V2 facade over internal implementation.\n */\nexport { SAPAIEmbeddingModelV2 as SAPAIEmbeddingModel } from \"./sap-ai-embedding-model-v2.js\";\n\nexport type { SAPAIEmbeddingModelId } from \"./sap-ai-embedding-model.js\";\n\n/**\n * Custom error classes for Foundation Models API support.\n * - `UnsupportedFeatureError`: Thrown when a feature is used with an incompatible API.\n * - `ApiSwitchError`: Thrown when attempting to switch APIs at invocation time with conflicting settings.\n */\nexport { ApiSwitchError, UnsupportedFeatureError } from \"./sap-ai-error.js\";\n\n/**\n * Language model class implementing LanguageModelV2 for SAP AI Core.\n * V2 facade over internal implementation.\n */\nexport { SAPAILanguageModelV2 as SAPAILanguageModel } from \"./sap-ai-language-model-v2.js\";\n\n/**\n * Provider options for per-call configuration.\n *\n * These schemas and types enable runtime validation of provider options\n * passed via `providerOptions['sap-ai']` in Vercel AI SDK calls.\n */\nexport {\n getProviderName,\n SAP_AI_PROVIDER_NAME,\n sapAIEmbeddingProviderOptions,\n sapAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\n\nexport type {\n SAPAIEmbeddingProviderOptions,\n SAPAILanguageModelProviderOptions,\n} from \"./sap-ai-provider-options.js\";\n\n/**\n * Provider factory function implementing ProviderV2 interface.\n * Creates language and embedding model instances for SAP AI Core.\n */\nexport { createSAPAIProvider, sapai } from \"./sap-ai-provider-v2.js\";\n\nexport type {\n DeploymentConfig,\n SAPAIProviderV2 as SAPAIProvider,\n SAPAIProviderSettings,\n} from \"./sap-ai-provider-v2.js\";\n\n/**\n * Model settings types and model identifier type definitions.\n */\nexport type {\n AzureOpenAiChatExtensionConfiguration,\n CommonModelParams,\n FoundationModelsDefaultSettings,\n FoundationModelsEmbeddingParams,\n FoundationModelsModelParams,\n FoundationModelsModelSettings,\n OrchestrationDefaultSettings,\n OrchestrationModelParams,\n OrchestrationModelSettings,\n OrchestrationStreamOptions,\n PromptTemplateRef,\n PromptTemplateRefByID,\n PromptTemplateRefByScenarioNameVersion,\n PromptTemplateScope,\n ResponseFormat,\n ResponsesDefaultSettings,\n ResponsesModelOptions,\n ResponsesModelSettings,\n SAPAIApiType,\n SAPAIDefaultSettingsConfig,\n SAPAIEmbeddingSettings,\n SAPAIModelId,\n SAPAIModelSettings,\n SAPAISettings,\n} from \"./sap-ai-settings.js\";\n\n/**\n * SAP AI SDK types and utilities.\n *\n * Re-exported for convenience and advanced usage scenarios.\n */\nexport type {\n AssistantChatMessage,\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n ChatMessageContent,\n ChatMessages,\n Citation,\n DeveloperChatMessage,\n DocumentTranslationApplyToSelector,\n FileContent,\n FilteringModule,\n FunctionObject,\n GroundingModule,\n ImageContentUrl,\n LlmModelDetails,\n LlmModelParams,\n MaskingModule,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- Preserve the upstream deprecated public API.\n OrchestrationConfigRef,\n OrchestrationConfigRefById,\n OrchestrationConfigRefByName,\n OrchestrationConfigRefOverride,\n OrchestrationError,\n OrchestrationModuleConfig,\n OrchestrationModuleConfigList,\n PromptTemplatingModule,\n SystemChatMessage,\n ToolChatMessage,\n TranslationApplyToCategory,\n TranslationInputParameters,\n TranslationModule,\n TranslationOutputParameters,\n TranslationTargetLanguage,\n UserChatMessage,\n UserChatMessageContent,\n UserChatMessageContentItem,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Helper functions for building configurations.\n */\nexport {\n buildAzureContentSafetyFilter,\n buildDocumentGroundingConfig,\n buildDpiMaskingProvider,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- Preserve the upstream deprecated public API.\n buildLlamaGuard38BFilter,\n buildTranslationConfig,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Response classes from the SAP AI SDK for orchestration results.\n */\nexport {\n OrchestrationEmbeddingResponse,\n OrchestrationResponse,\n OrchestrationStream,\n OrchestrationStreamChunkResponse,\n OrchestrationStreamResponse,\n} from \"./sap-ai-settings.js\";\n\n/**\n * Validation utilities for API selection and feature compatibility.\n * - `resolveApi`: Resolves API type from provider/model/invocation precedence chain.\n * - `validateSettings`: Validates settings are compatible with the selected API.\n */\nexport { resolveApi, validateSettings } from \"./sap-ai-validation.js\";\n\n/**\n * Package version, injected at build time.\n */\nexport { VERSION } from \"./version.js\";\n\n/** Public contract types keep downstream inferred declarations nameable. */\nexport type {\n JSONArray,\n JSONObject,\n JSONSchema7,\n JSONValue,\n LanguageModelV2ResponseMetadata,\n} from \"@ai-sdk/provider-v2\";\n\n/** The shared core exposes distinct V3 JSON types in provider options and compatible tools. */\nexport type {\n LanguageModelV3CallOptions,\n JSONArray as V3JSONArray,\n JSONObject as V3JSONObject,\n JSONValue as V3JSONValue,\n} from \"@ai-sdk/provider-v3\";\n\n/**\n * SAP AI SDK request configuration type for {@link SAPAIProviderSettings.requestConfig}.\n *\n * Re-exported so consumers do not need a direct dependency on `@sap-ai-sdk/core`.\n * Its shape follows the installed SAP AI SDK version.\n */\nexport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\n\n/**\n * Error handling types and classes for SAP AI Core error responses.\n */\nexport type { OrchestrationErrorResponse } from \"@sap-ai-sdk/orchestration\";\n\n/**\n * Direct access to SAP AI SDK OrchestrationClient.\n *\n * For advanced users who need to use the SAP AI SDK directly.\n */\nexport { OrchestrationClient, OrchestrationEmbeddingClient } from \"@sap-ai-sdk/orchestration\";\n\n/**\n * SAP Cloud SDK destination type for {@link SAPAIProviderSettings.destination}.\n *\n * Re-exported so consumers do not need a direct dependency on\n * `@sap-cloud-sdk/connectivity`. Its shape follows the installed SAP Cloud SDK version.\n */\nexport type { HttpDestinationOrFetchOptions } from \"@sap-cloud-sdk/connectivity\";\n"],"mappings":"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","names":["UnsupportedFeatureError","OrchestrationEmbeddingClient","OrchestrationClient","parseProviderOptions","parseProviderOptions"]}
@@ -1,16 +1,17 @@
1
1
  import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
2
2
  import {
3
3
  BaseEmbeddingModelStrategy
4
- } from "./chunk-3H5C5U22.js";
4
+ } from "./chunk-QQQYMQPU.js";
5
5
  import {
6
6
  validateMaskingProvidersDeprecation
7
- } from "./chunk-E76ZDPIW.js";
7
+ } from "./chunk-EUBI5ENK.js";
8
8
  import {
9
9
  extractResponseMetadata,
10
10
  hasKeys,
11
11
  normalizeEmbedding
12
- } from "./chunk-4JLNWASF.js";
13
- import "./chunk-UIBQ5AFS.js";
12
+ } from "./chunk-DLGBK3C3.js";
13
+ import "./chunk-BHA5MIN6.js";
14
+ import "./chunk-QFMHNGLB.js";
14
15
 
15
16
  // src/orchestration-embedding-model-strategy.ts
16
17
  var OrchestrationEmbeddingModelStrategy = class extends BaseEmbeddingModelStrategy {
@@ -59,4 +60,4 @@ var OrchestrationEmbeddingModelStrategy = class extends BaseEmbeddingModelStrate
59
60
  export {
60
61
  OrchestrationEmbeddingModelStrategy
61
62
  };
62
- //# sourceMappingURL=orchestration-embedding-model-strategy-GT27AFII.js.map
63
+ //# sourceMappingURL=orchestration-embedding-model-strategy-AZ76XLMD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/orchestration-embedding-model-strategy.ts"],"sourcesContent":["/** Orchestration embedding model strategy using `@sap-ai-sdk/orchestration`. */\nimport type { EmbeddingModelV3Embedding, SharedV3Warning } from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type {\n EmbeddingModelConfig,\n EmbeddingModuleConfig,\n MaskingModule,\n OrchestrationEmbeddingClient,\n OrchestrationEmbeddingResponse,\n} from \"@sap-ai-sdk/orchestration\";\n\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\nimport type { EmbeddingModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport { BaseEmbeddingModelStrategy } from \"./base-embedding-model-strategy.js\";\nimport { validateMaskingProvidersDeprecation } from \"./sap-ai-validation.js\";\nimport {\n type EmbeddingProviderOptions,\n extractResponseMetadata,\n hasKeys,\n normalizeEmbedding,\n type ResponseMetadata,\n} from \"./strategy-utils.js\";\n\n/** @internal */\ntype OrchestrationEmbeddingClientClass = typeof OrchestrationEmbeddingClient;\n\n/**\n * Embedding model strategy for the Orchestration API.\n *\n * Provides support for:\n * - Data masking\n * - Model parameters configuration\n * @internal\n */\nexport class OrchestrationEmbeddingModelStrategy extends BaseEmbeddingModelStrategy<\n OrchestrationEmbeddingClient,\n OrchestrationEmbeddingResponse\n> {\n private readonly ClientClass: OrchestrationEmbeddingClientClass;\n\n constructor(ClientClass: OrchestrationEmbeddingClientClass) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected createClient(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n embeddingOptions: EmbeddingProviderOptions | undefined,\n ): OrchestrationEmbeddingClient {\n const mergedParams = this.mergeModelParams(settings, embeddingOptions);\n\n const embeddingConfig: EmbeddingModelConfig = {\n model: {\n name: config.modelId,\n ...(hasKeys(mergedParams) ? { params: mergedParams } : {}),\n ...(settings.modelVersion ? { version: settings.modelVersion } : {}),\n },\n };\n\n const moduleConfig: EmbeddingModuleConfig = {\n embeddings: embeddingConfig,\n ...(settings.masking && hasKeys(settings.masking)\n ? { masking: settings.masking as MaskingModule }\n : {}),\n };\n\n return new this.ClientClass(moduleConfig, config.deploymentConfig, config.destination);\n }\n\n protected async executeCall(\n client: OrchestrationEmbeddingClient,\n values: string[],\n embeddingType: \"document\" | \"query\" | \"text\" | undefined,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<OrchestrationEmbeddingResponse> {\n return client.embed({ input: values, type: embeddingType }, requestConfig);\n }\n\n protected extractEmbeddings(\n response: OrchestrationEmbeddingResponse,\n ): EmbeddingModelV3Embedding[] {\n const embeddingData = response.getEmbeddings();\n const sortedEmbeddings = [...embeddingData].sort((a, b) => a.index - b.index);\n return sortedEmbeddings.map((data) => normalizeEmbedding(data.embedding));\n }\n\n protected override extractResponseMetadata(\n response: OrchestrationEmbeddingResponse,\n ): ResponseMetadata {\n return extractResponseMetadata(response, \"response\");\n }\n\n protected extractTokenCount(response: OrchestrationEmbeddingResponse): number {\n const tokenUsage = response.getTokenUsage();\n return tokenUsage.total_tokens;\n }\n\n protected getUrl(): string {\n return \"sap-ai:orchestration/embeddings\";\n }\n\n protected override resolveWarnings(\n settings: SAPAIEmbeddingSettings,\n warnings: SharedV3Warning[],\n ): void {\n validateMaskingProvidersDeprecation(settings, warnings);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAmCO,IAAM,sCAAN,cAAkD,2BAGvD;AAAA,EACiB;AAAA,EAEjB,YAAY,aAAgD;AAC1D,UAAM;AACN,SAAK,cAAc;AAAA,EACrB;AAAA,EAEU,aACR,QACA,UACA,kBAC8B;AAC9B,UAAM,eAAe,KAAK,iBAAiB,UAAU,gBAAgB;AAErE,UAAM,kBAAwC;AAAA,MAC5C,OAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,GAAI,QAAQ,YAAY,IAAI,EAAE,QAAQ,aAAa,IAAI,CAAC;AAAA,QACxD,GAAI,SAAS,eAAe,EAAE,SAAS,SAAS,aAAa,IAAI,CAAC;AAAA,MACpE;AAAA,IACF;AAEA,UAAM,eAAsC;AAAA,MAC1C,YAAY;AAAA,MACZ,GAAI,SAAS,WAAW,QAAQ,SAAS,OAAO,IAC5C,EAAE,SAAS,SAAS,QAAyB,IAC7C,CAAC;AAAA,IACP;AAEA,WAAO,IAAI,KAAK,YAAY,cAAc,OAAO,kBAAkB,OAAO,WAAW;AAAA,EACvF;AAAA,EAEA,MAAgB,YACd,QACA,QACA,eACA,eACyC;AACzC,WAAO,OAAO,MAAM,EAAE,OAAO,QAAQ,MAAM,cAAc,GAAG,aAAa;AAAA,EAC3E;AAAA,EAEU,kBACR,UAC6B;AAC7B,UAAM,gBAAgB,SAAS,cAAc;AAC7C,UAAM,mBAAmB,CAAC,GAAG,aAAa,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC5E,WAAO,iBAAiB,IAAI,CAAC,SAAS,mBAAmB,KAAK,SAAS,CAAC;AAAA,EAC1E;AAAA,EAEmB,wBACjB,UACkB;AAClB,WAAO,wBAAwB,UAAU,UAAU;AAAA,EACrD;AAAA,EAEU,kBAAkB,UAAkD;AAC5E,UAAM,aAAa,SAAS,cAAc;AAC1C,WAAO,WAAW;AAAA,EACpB;AAAA,EAEU,SAAiB;AACzB,WAAO;AAAA,EACT;AAAA,EAEmB,gBACjB,UACA,UACM;AACN,wCAAoC,UAAU,QAAQ;AAAA,EACxD;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/orchestration-embedding-model-strategy.ts"],"sourcesContent":["/** Orchestration embedding model strategy using `@sap-ai-sdk/orchestration`. */\nimport type { EmbeddingModelV3Embedding, SharedV3Warning } from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type {\n EmbeddingModelConfig,\n EmbeddingModuleConfig,\n MaskingModule,\n OrchestrationEmbeddingClient,\n OrchestrationEmbeddingResponse,\n} from \"@sap-ai-sdk/orchestration\";\n\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\nimport type { EmbeddingModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport { BaseEmbeddingModelStrategy } from \"./base-embedding-model-strategy.js\";\nimport { validateMaskingProvidersDeprecation } from \"./sap-ai-validation.js\";\nimport {\n type EmbeddingProviderOptions,\n extractResponseMetadata,\n hasKeys,\n normalizeEmbedding,\n type ResponseMetadata,\n} from \"./strategy-utils.js\";\n\n/** @internal */\ntype OrchestrationEmbeddingClientClass = typeof OrchestrationEmbeddingClient;\n\n/**\n * Embedding model strategy for the Orchestration API.\n *\n * Provides support for:\n * - Data masking\n * - Model parameters configuration\n * @internal\n */\nexport class OrchestrationEmbeddingModelStrategy extends BaseEmbeddingModelStrategy<\n OrchestrationEmbeddingClient,\n OrchestrationEmbeddingResponse\n> {\n private readonly ClientClass: OrchestrationEmbeddingClientClass;\n\n constructor(ClientClass: OrchestrationEmbeddingClientClass) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected createClient(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n embeddingOptions: EmbeddingProviderOptions | undefined,\n ): OrchestrationEmbeddingClient {\n const mergedParams = this.mergeModelParams(settings, embeddingOptions);\n\n const embeddingConfig: EmbeddingModelConfig = {\n model: {\n name: config.modelId,\n ...(hasKeys(mergedParams) ? { params: mergedParams } : {}),\n ...(settings.modelVersion ? { version: settings.modelVersion } : {}),\n },\n };\n\n const moduleConfig: EmbeddingModuleConfig = {\n embeddings: embeddingConfig,\n ...(settings.masking && hasKeys(settings.masking)\n ? { masking: settings.masking as MaskingModule }\n : {}),\n };\n\n return new this.ClientClass(moduleConfig, config.deploymentConfig, config.destination);\n }\n\n protected async executeCall(\n client: OrchestrationEmbeddingClient,\n values: string[],\n embeddingType: \"document\" | \"query\" | \"text\" | undefined,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<OrchestrationEmbeddingResponse> {\n return client.embed({ input: values, type: embeddingType }, requestConfig);\n }\n\n protected extractEmbeddings(\n response: OrchestrationEmbeddingResponse,\n ): EmbeddingModelV3Embedding[] {\n const embeddingData = response.getEmbeddings();\n const sortedEmbeddings = [...embeddingData].sort((a, b) => a.index - b.index);\n return sortedEmbeddings.map((data) => normalizeEmbedding(data.embedding));\n }\n\n protected override extractResponseMetadata(\n response: OrchestrationEmbeddingResponse,\n ): ResponseMetadata {\n return extractResponseMetadata(response, \"response\");\n }\n\n protected extractTokenCount(response: OrchestrationEmbeddingResponse): number {\n const tokenUsage = response.getTokenUsage();\n return tokenUsage.total_tokens;\n }\n\n protected getUrl(): string {\n return \"sap-ai:orchestration/embeddings\";\n }\n\n protected override resolveWarnings(\n settings: SAPAIEmbeddingSettings,\n warnings: SharedV3Warning[],\n ): void {\n validateMaskingProvidersDeprecation(settings, warnings);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmCO,IAAM,sCAAN,cAAkD,2BAGvD;AAAA,EACiB;AAAA,EAEjB,YAAY,aAAgD;AAC1D,UAAM;AACN,SAAK,cAAc;AAAA,EACrB;AAAA,EAEU,aACR,QACA,UACA,kBAC8B;AAC9B,UAAM,eAAe,KAAK,iBAAiB,UAAU,gBAAgB;AAErE,UAAM,kBAAwC;AAAA,MAC5C,OAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,GAAI,QAAQ,YAAY,IAAI,EAAE,QAAQ,aAAa,IAAI,CAAC;AAAA,QACxD,GAAI,SAAS,eAAe,EAAE,SAAS,SAAS,aAAa,IAAI,CAAC;AAAA,MACpE;AAAA,IACF;AAEA,UAAM,eAAsC;AAAA,MAC1C,YAAY;AAAA,MACZ,GAAI,SAAS,WAAW,QAAQ,SAAS,OAAO,IAC5C,EAAE,SAAS,SAAS,QAAyB,IAC7C,CAAC;AAAA,IACP;AAEA,WAAO,IAAI,KAAK,YAAY,cAAc,OAAO,kBAAkB,OAAO,WAAW;AAAA,EACvF;AAAA,EAEA,MAAgB,YACd,QACA,QACA,eACA,eACyC;AACzC,WAAO,OAAO,MAAM,EAAE,OAAO,QAAQ,MAAM,cAAc,GAAG,aAAa;AAAA,EAC3E;AAAA,EAEU,kBACR,UAC6B;AAC7B,UAAM,gBAAgB,SAAS,cAAc;AAC7C,UAAM,mBAAmB,CAAC,GAAG,aAAa,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC5E,WAAO,iBAAiB,IAAI,CAAC,SAAS,mBAAmB,KAAK,SAAS,CAAC;AAAA,EAC1E;AAAA,EAEmB,wBACjB,UACkB;AAClB,WAAO,wBAAwB,UAAU,UAAU;AAAA,EACrD;AAAA,EAEU,kBAAkB,UAAkD;AAC5E,UAAM,aAAa,SAAS,cAAc;AAC1C,WAAO,WAAW;AAAA,EACpB;AAAA,EAEU,SAAiB;AACzB,WAAO;AAAA,EACT;AAAA,EAEmB,gBACjB,UACA,UACM;AACN,wCAAoC,UAAU,QAAQ;AAAA,EACxD;AACF;","names":[]}
@@ -1,21 +1,27 @@
1
1
  import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
2
2
  import {
3
3
  validateMaskingProvidersDeprecation
4
- } from "./chunk-E76ZDPIW.js";
4
+ } from "./chunk-EUBI5ENK.js";
5
5
  import {
6
6
  BaseLanguageModelStrategy
7
- } from "./chunk-NF355OFT.js";
8
- import "./chunk-YP3AADWD.js";
7
+ } from "./chunk-ZOBD7PXJ.js";
8
+ import {
9
+ disposeSapStream,
10
+ executeSapStream,
11
+ withSapStreamCleanup
12
+ } from "./chunk-4ILJD6PI.js";
13
+ import "./chunk-FKHOJ3ZC.js";
9
14
  import {
10
15
  convertResponseFormat,
11
16
  convertToolsToSAPFormat,
12
17
  hasKeys
13
- } from "./chunk-4JLNWASF.js";
18
+ } from "./chunk-DLGBK3C3.js";
14
19
  import {
15
20
  deepMerge,
16
21
  orchestrationConfigRefSchema,
17
22
  parseSAPPartProviderOptions
18
- } from "./chunk-UIBQ5AFS.js";
23
+ } from "./chunk-BHA5MIN6.js";
24
+ import "./chunk-QFMHNGLB.js";
19
25
 
20
26
  // src/orchestration-language-model-strategy.ts
21
27
  function buildTemplateRefObject(ref) {
@@ -42,6 +48,7 @@ function resolvePlaceholderValues(settings, sapOptions) {
42
48
  var ORCHESTRATION_MODULE_KEYS = ["masking", "filtering", "grounding", "translation"];
43
49
  var CONFIG_REF_IGNORED_MODULES = [
44
50
  ...ORCHESTRATION_MODULE_KEYS,
51
+ "dropUnsupportedParams",
45
52
  "fallbackModuleConfigs",
46
53
  "promptTemplateRef",
47
54
  "responseFormat",
@@ -49,7 +56,11 @@ var CONFIG_REF_IGNORED_MODULES = [
49
56
  "modelParams",
50
57
  "modelVersion"
51
58
  ];
52
- var CONFIG_REF_IGNORED_PROVIDER_OPTIONS = ["promptTemplateRef", "modelParams"];
59
+ var CONFIG_REF_IGNORED_PROVIDER_OPTIONS = [
60
+ "dropUnsupportedParams",
61
+ "promptTemplateRef",
62
+ "modelParams"
63
+ ];
53
64
  function copyOrchestrationModules(target, source) {
54
65
  for (const key of ORCHESTRATION_MODULE_KEYS) {
55
66
  const value = source[key];
@@ -109,11 +120,12 @@ var OrchestrationLanguageModelStrategy = class extends BaseLanguageModelStrategy
109
120
  return warnings;
110
121
  }
111
122
  createClient(config, settings, commonParts) {
112
- const { configRef, promptTemplateRef, responseFormat, tools } = commonParts.resolvedState;
123
+ const { configRef, dropUnsupportedParams, promptTemplateRef, responseFormat, tools } = commonParts.resolvedState;
113
124
  if (configRef) {
114
125
  return new this.ClientClass(configRef, config.deploymentConfig, config.destination);
115
126
  }
116
127
  const clientConfig = this.buildOrchestrationModuleConfig(config, settings, {
128
+ dropUnsupportedParams,
117
129
  modelParams: commonParts.modelParams,
118
130
  promptTemplateRef,
119
131
  responseFormat,
@@ -137,6 +149,8 @@ var OrchestrationLanguageModelStrategy = class extends BaseLanguageModelStrategy
137
149
  getContent: () => response.getContent(),
138
150
  getFinishReason: () => response.getFinishReason(),
139
151
  getIntermediateFailures: () => response.getIntermediateFailures(),
152
+ getProviderSpecificFields: () => response.findChoiceByIndex(0)?.provider_specific_fields,
153
+ getReasoningBlocks: () => response.getAssistantMessage()?.reasoning_content,
140
154
  getTokenUsage: () => response.getTokenUsage(),
141
155
  getToolCalls: () => response.getToolCalls(),
142
156
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- SAP SDK types headers as any
@@ -148,24 +162,28 @@ var OrchestrationLanguageModelStrategy = class extends BaseLanguageModelStrategy
148
162
  async executeStreamCall(client, request, abortSignal, settings, requestConfig, commonParts) {
149
163
  const { configRef } = commonParts.resolvedState;
150
164
  const sdkStreamOptions = configRef ? void 0 : this.buildSdkStreamOptions(settings.streamOptions);
151
- const streamResponse = await client.stream(
152
- request,
165
+ const streamResponse = await executeSapStream(
166
+ (streamRequestConfig) => client.stream(request, abortSignal, sdkStreamOptions, streamRequestConfig),
153
167
  abortSignal,
154
- sdkStreamOptions,
155
168
  requestConfig
156
169
  );
157
170
  const { requestId, responseHeaders, responseMetadata } = this.extractMetadata(streamResponse);
158
171
  return {
159
172
  cancel: () => {
160
- streamResponse.stream.controller.abort();
173
+ disposeSapStream(streamResponse);
161
174
  },
175
+ extractProviderSpecificFields: (chunk) => chunk.findChoiceByIndex(0)?.provider_specific_fields,
176
+ extractReasoningBlocks: (chunk) => chunk.findChoiceByIndex(0)?.delta.reasoning_content,
162
177
  getCitations: () => streamResponse.getCitations(),
163
178
  getFinishReason: () => streamResponse.getFinishReason(),
164
179
  getIntermediateFailures: () => streamResponse.getIntermediateFailures(),
165
180
  requestId,
166
181
  responseHeaders,
167
182
  responseMetadata,
168
- stream: streamResponse.stream
183
+ stream: withSapStreamCleanup(
184
+ streamResponse,
185
+ streamResponse.stream
186
+ )
169
187
  };
170
188
  }
171
189
  getCompletionDataPath() {
@@ -174,6 +192,9 @@ var OrchestrationLanguageModelStrategy = class extends BaseLanguageModelStrategy
174
192
  getEscapeTemplatePlaceholders(sapOptions, settings) {
175
193
  return sapOptions?.escapeTemplatePlaceholders ?? settings.escapeTemplatePlaceholders ?? true;
176
194
  }
195
+ getNativeReasoningProviderName(providerName) {
196
+ return providerName;
197
+ }
177
198
  getParamMappings() {
178
199
  return ORCHESTRATION_PARAM_MAPPINGS;
179
200
  }
@@ -207,7 +228,8 @@ var OrchestrationLanguageModelStrategy = class extends BaseLanguageModelStrategy
207
228
  if (converted.warning) warnings.push(converted.warning);
208
229
  }
209
230
  const tools = this.resolveTools(settings, options, warnings);
210
- return { configRef, promptTemplateRef, responseFormat, tools };
231
+ const dropUnsupportedParams = sapOptions?.dropUnsupportedParams ?? settings.dropUnsupportedParams;
232
+ return { configRef, dropUnsupportedParams, promptTemplateRef, responseFormat, tools };
211
233
  }
212
234
  /**
213
235
  * Builds request for orchestrationConfigRef mode.
@@ -252,6 +274,7 @@ var OrchestrationLanguageModelStrategy = class extends BaseLanguageModelStrategy
252
274
  * @param config - Strategy configuration.
253
275
  * @param settings - Model settings.
254
276
  * @param params - Build parameters.
277
+ * @param params.dropUnsupportedParams - Optional unsupported-parameter policy for the primary model.
255
278
  * @param params.modelParams - LLM model parameters.
256
279
  * @param params.promptTemplateRef - Optional prompt template reference.
257
280
  * @param params.responseFormat - Optional response format specification.
@@ -261,7 +284,14 @@ var OrchestrationLanguageModelStrategy = class extends BaseLanguageModelStrategy
261
284
  * @internal
262
285
  */
263
286
  buildOrchestrationModuleConfig(config, settings, params) {
264
- const { modelParams, promptTemplateRef, responseFormat, toolChoice, tools } = params;
287
+ const {
288
+ dropUnsupportedParams,
289
+ modelParams,
290
+ promptTemplateRef,
291
+ responseFormat,
292
+ toolChoice,
293
+ tools
294
+ } = params;
265
295
  const promptConfig = promptTemplateRef ? this.buildTemplateRefPromptConfig(promptTemplateRef, tools, responseFormat) : this.buildInlineTemplateConfig(tools, responseFormat);
266
296
  const effectiveModelParams = toolChoice ? { ...modelParams, tool_choice: toolChoice } : modelParams;
267
297
  const moduleConfig = {
@@ -269,7 +299,8 @@ var OrchestrationLanguageModelStrategy = class extends BaseLanguageModelStrategy
269
299
  model: {
270
300
  name: config.modelId,
271
301
  params: effectiveModelParams,
272
- ...settings.modelVersion ? { version: settings.modelVersion } : {}
302
+ ...settings.modelVersion ? { version: settings.modelVersion } : {},
303
+ ...dropUnsupportedParams !== void 0 ? { drop_unsupported_params: dropUnsupportedParams } : {}
273
304
  },
274
305
  prompt: promptConfig
275
306
  }
@@ -358,7 +389,7 @@ var OrchestrationLanguageModelStrategy = class extends BaseLanguageModelStrategy
358
389
  }
359
390
  }
360
391
  for (const key of CONFIG_REF_IGNORED_PROVIDER_OPTIONS) {
361
- if (sapOptions?.[key] && !settings[key]) {
392
+ if (sapOptions?.[key] !== void 0 && settings[key] === void 0) {
362
393
  ignoredSettings.push(`providerOptions.${key}`);
363
394
  }
364
395
  }
@@ -465,4 +496,4 @@ var OrchestrationLanguageModelStrategy = class extends BaseLanguageModelStrategy
465
496
  export {
466
497
  OrchestrationLanguageModelStrategy
467
498
  };
468
- //# sourceMappingURL=orchestration-language-model-strategy-7QTPQHCC.js.map
499
+ //# sourceMappingURL=orchestration-language-model-strategy-CT6RHCYO.js.map