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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/{chunk-WYDTQDMJ.js → chunk-7HX5A5XW.js} +4 -4
  2. package/dist/chunk-7HX5A5XW.js.map +1 -0
  3. package/dist/{chunk-DQXZH6CW.js → chunk-IIBSUXGT.js} +3 -2
  4. package/dist/chunk-IIBSUXGT.js.map +1 -0
  5. package/dist/{chunk-BV5Y6RMC.js → chunk-M6USM33F.js} +11 -4
  6. package/dist/chunk-M6USM33F.js.map +1 -0
  7. package/dist/{chunk-DBAIFR3B.js → chunk-TE3CYVU3.js} +64 -64
  8. package/dist/{chunk-DBAIFR3B.js.map → chunk-TE3CYVU3.js.map} +1 -1
  9. package/dist/{chunk-KS5QNMYZ.js → chunk-WO5UACI5.js} +23 -21
  10. package/dist/chunk-WO5UACI5.js.map +1 -0
  11. package/dist/{foundation-models-embedding-model-strategy-XLD3PGCK.js → foundation-models-embedding-model-strategy-A6CA7NXP.js} +5 -10
  12. package/dist/foundation-models-embedding-model-strategy-A6CA7NXP.js.map +1 -0
  13. package/dist/{foundation-models-language-model-strategy-SNBZBWX4.js → foundation-models-language-model-strategy-DZMPSOJK.js} +6 -6
  14. package/dist/foundation-models-language-model-strategy-DZMPSOJK.js.map +1 -0
  15. package/dist/index.cjs +197 -218
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.js +102 -125
  20. package/dist/index.js.map +1 -1
  21. package/dist/{orchestration-embedding-model-strategy-6BKD5NW7.js → orchestration-embedding-model-strategy-M3POCUFM.js} +5 -10
  22. package/dist/orchestration-embedding-model-strategy-M3POCUFM.js.map +1 -0
  23. package/dist/{orchestration-language-model-strategy-OYSEPGQG.js → orchestration-language-model-strategy-Q3LPRWX5.js} +5 -5
  24. package/dist/orchestration-language-model-strategy-Q3LPRWX5.js.map +1 -0
  25. package/package.json +2 -2
  26. package/dist/chunk-BV5Y6RMC.js.map +0 -1
  27. package/dist/chunk-DQXZH6CW.js.map +0 -1
  28. package/dist/chunk-KS5QNMYZ.js.map +0 -1
  29. package/dist/chunk-WYDTQDMJ.js.map +0 -1
  30. package/dist/foundation-models-embedding-model-strategy-XLD3PGCK.js.map +0 -1
  31. package/dist/foundation-models-language-model-strategy-SNBZBWX4.js.map +0 -1
  32. package/dist/orchestration-embedding-model-strategy-6BKD5NW7.js.map +0 -1
  33. package/dist/orchestration-language-model-strategy-OYSEPGQG.js.map +0 -1
@@ -4,7 +4,7 @@ import {
4
4
  getProviderName,
5
5
  sapAIEmbeddingProviderOptions,
6
6
  validateModelParamsWithWarnings
7
- } from "./chunk-DBAIFR3B.js";
7
+ } from "./chunk-TE3CYVU3.js";
8
8
 
9
9
  // src/strategy-utils.ts
10
10
  import { TooManyEmbeddingValuesForCallError } from "@ai-sdk/provider";
@@ -99,19 +99,7 @@ function buildGenerateResult(config) {
99
99
  modelId,
100
100
  timestamp: /* @__PURE__ */ new Date()
101
101
  },
102
- usage: {
103
- inputTokens: {
104
- cacheRead: tokenUsage?.prompt_tokens_details?.cached_tokens,
105
- cacheWrite: void 0,
106
- noCache: tokenUsage?.prompt_tokens_details?.cached_tokens != null ? (tokenUsage.prompt_tokens ?? 0) - tokenUsage.prompt_tokens_details.cached_tokens : tokenUsage?.prompt_tokens,
107
- total: tokenUsage?.prompt_tokens
108
- },
109
- outputTokens: {
110
- reasoning: tokenUsage?.completion_tokens_details?.reasoning_tokens,
111
- text: tokenUsage?.completion_tokens_details?.reasoning_tokens != null ? (tokenUsage.completion_tokens ?? 0) - tokenUsage.completion_tokens_details.reasoning_tokens : tokenUsage?.completion_tokens,
112
- total: tokenUsage?.completion_tokens
113
- }
114
- },
102
+ usage: mapTokenUsage(tokenUsage),
115
103
  warnings
116
104
  };
117
105
  }
@@ -341,12 +329,9 @@ function createStreamTransformer(config) {
341
329
  }
342
330
  const finalUsage = streamResponseGetTokenUsage();
343
331
  if (finalUsage) {
344
- streamState.usage.inputTokens.total = finalUsage.prompt_tokens;
345
- streamState.usage.inputTokens.cacheRead = finalUsage.prompt_tokens_details?.cached_tokens;
346
- streamState.usage.inputTokens.noCache = finalUsage.prompt_tokens_details?.cached_tokens != null ? (finalUsage.prompt_tokens ?? 0) - finalUsage.prompt_tokens_details.cached_tokens : finalUsage.prompt_tokens;
347
- streamState.usage.outputTokens.total = finalUsage.completion_tokens;
348
- streamState.usage.outputTokens.reasoning = finalUsage.completion_tokens_details?.reasoning_tokens;
349
- streamState.usage.outputTokens.text = finalUsage.completion_tokens_details?.reasoning_tokens != null ? (finalUsage.completion_tokens ?? 0) - finalUsage.completion_tokens_details.reasoning_tokens : finalUsage.completion_tokens;
332
+ const mapped = mapTokenUsage(finalUsage);
333
+ streamState.usage.inputTokens = mapped.inputTokens;
334
+ streamState.usage.outputTokens = mapped.outputTokens;
350
335
  }
351
336
  const streamCitations = streamResponseGetCitations?.();
352
337
  if (streamCitations?.length) {
@@ -606,6 +591,23 @@ function mapFinishReason(reason) {
606
591
  return { raw, unified: "other" };
607
592
  }
608
593
  }
594
+ function mapTokenUsage(tokenUsage) {
595
+ const cachedTokens = tokenUsage?.prompt_tokens_details?.cached_tokens;
596
+ const reasoningTokens = tokenUsage?.completion_tokens_details?.reasoning_tokens;
597
+ return {
598
+ inputTokens: {
599
+ cacheRead: cachedTokens,
600
+ cacheWrite: void 0,
601
+ noCache: cachedTokens != null ? (tokenUsage?.prompt_tokens ?? 0) - cachedTokens : tokenUsage?.prompt_tokens,
602
+ total: tokenUsage?.prompt_tokens
603
+ },
604
+ outputTokens: {
605
+ reasoning: reasoningTokens,
606
+ text: reasoningTokens != null ? (tokenUsage?.completion_tokens ?? 0) - reasoningTokens : tokenUsage?.completion_tokens,
607
+ total: tokenUsage?.completion_tokens
608
+ }
609
+ };
610
+ }
609
611
  function mapToolChoice(toolChoice) {
610
612
  if (!toolChoice) {
611
613
  return void 0;
@@ -680,4 +682,4 @@ export {
680
682
  normalizeEmbedding,
681
683
  prepareEmbeddingCall
682
684
  };
683
- //# sourceMappingURL=chunk-KS5QNMYZ.js.map
685
+ //# sourceMappingURL=chunk-WO5UACI5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/strategy-utils.ts"],"sourcesContent":["/**\n * Shared utilities for SAP AI Core strategy implementations.\n */\nimport type {\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Embedding,\n EmbeddingModelV3Result,\n JSONArray,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3FunctionTool,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamPart,\n LanguageModelV3Usage,\n SharedV3ProviderMetadata,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport type { DeploymentIdConfig, ResourceGroupConfig } from \"@sap-ai-sdk/ai-api/internal.js\";\nimport type { ZodType } from \"zod\";\n\nimport { TooManyEmbeddingValuesForCallError } from \"@ai-sdk/provider\";\nimport { convertAsyncIteratorToReadableStream, parseProviderOptions } from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\n\nimport { deepMerge } from \"./deep-merge.js\";\nimport { getProviderName, sapAIEmbeddingProviderOptions } from \"./sap-ai-provider-options.js\";\nimport { validateModelParamsWithWarnings } from \"./sap-ai-provider-options.js\";\n\n/**\n * @internal\n */\nexport interface AISDKTool {\n description?: string;\n inputSchema?: unknown;\n name: string;\n type: string;\n}\n\n/**\n * @internal\n */\nexport type AISDKToolChoice =\n | { toolName: string; type: \"tool\" }\n | { type: \"auto\" }\n | { type: \"none\" }\n | { type: \"required\" };\n\n/**\n * @internal\n */\nexport interface BaseEmbeddingConfig {\n readonly maxEmbeddingsPerCall: number;\n readonly modelId: string;\n readonly provider: string;\n}\n\n/**\n * @internal\n */\nexport interface BaseModelDeploymentConfig {\n readonly deploymentConfig: DeploymentIdConfig | ResourceGroupConfig;\n readonly modelId: string;\n}\n\n/**\n * @internal\n */\nexport interface BuildModelParamsConfig {\n readonly options: LanguageModelV3CallOptions;\n readonly paramMappings: readonly ParamMapping[];\n readonly providerModelParams?: Record<string, unknown>;\n readonly settingsModelParams?: Record<string, unknown>;\n}\n\n/**\n * @internal\n */\nexport interface BuildModelParamsResult {\n readonly modelParams: Record<string, unknown>;\n readonly warnings: SharedV3Warning[];\n}\n\n/**\n * @internal\n */\nexport interface ConvertedResponseFormatResult {\n readonly responseFormat: SAPResponseFormat | undefined;\n readonly warning: SharedV3Warning | undefined;\n}\n\n/**\n * @internal\n */\nexport interface ConvertedToolsResult<T> {\n readonly tools: T[] | undefined;\n readonly warnings: SharedV3Warning[];\n}\n\n/**\n * Parsed embedding provider options from AI SDK call.\n * @internal\n */\nexport interface EmbeddingProviderOptions {\n readonly modelParams?: Record<string, unknown>;\n readonly type?: EmbeddingType;\n}\n\n/**\n * @internal\n */\nexport interface EmbeddingResultConfig {\n readonly embeddings: EmbeddingModelV3Embedding[];\n readonly modelId: string;\n readonly providerName: string;\n readonly totalTokens: number;\n readonly version: string;\n}\n\n/**\n * Valid embedding types for orchestration API.\n * @internal\n */\nexport type EmbeddingType = \"document\" | \"query\" | \"text\";\n\n/**\n * @internal\n */\nexport interface ExtractedToolParameters {\n readonly parameters: SAPToolParameters;\n readonly warning?: SharedV3Warning;\n}\n\n/**\n * @internal\n */\nexport interface FunctionToolWithParameters extends LanguageModelV3FunctionTool {\n readonly parameters?: unknown;\n}\n\n/**\n * @internal\n */\nexport interface GenerateResultConfig {\n readonly modelId: string;\n readonly providerName: string;\n readonly requestBody: unknown;\n readonly response: SDKResponse;\n readonly responseHeaders: Record<string, string> | undefined;\n readonly version: string;\n readonly warnings: SharedV3Warning[];\n}\n\n/**\n * Parameter mapping for AI SDK options → SAP model params.\n * @internal\n */\nexport interface ParamMapping {\n readonly camelCaseKey?: string;\n readonly optionKey?: string;\n readonly outputKey: string;\n}\n\n/**\n * @internal\n */\nexport type SAPResponseFormat =\n | {\n json_schema: {\n description?: string;\n name: string;\n schema: Record<string, unknown>;\n strict: boolean | null;\n };\n type: \"json_schema\";\n }\n | { type: \"json_object\" }\n | { type: \"text\" };\n\n/**\n * @internal\n */\nexport interface SAPTool<P = SAPToolParameters> {\n function: {\n description?: string;\n name: string;\n parameters?: P;\n };\n type: \"function\";\n}\n\n/**\n * @internal\n */\nexport type SAPToolChoice =\n | \"auto\"\n | \"none\"\n | \"required\"\n | { function: { name: string }; type: \"function\" };\n\n/**\n * @internal\n */\nexport type SAPToolParameters = Record<string, unknown> & {\n properties: Record<string, unknown>;\n required: string[];\n type: \"object\";\n};\n\n/**\n * @internal\n */\nexport interface SDKCitation {\n end_index?: number;\n ref_id?: number;\n start_index?: number;\n title: string;\n url: string;\n}\n\n/**\n * @internal\n */\nexport interface SDKDeltaToolCall {\n function?: { arguments?: string; name?: string };\n id?: string;\n index?: number;\n}\n\n/**\n * @internal\n */\nexport interface SDKResponse {\n getCitations?(): SDKCitation[] | undefined;\n getContent(): null | string | undefined;\n getFinishReason(): null | string | undefined;\n getIntermediateFailures?(): undefined | unknown[];\n getTokenUsage(): SDKTokenUsage | undefined;\n getToolCalls(): null | SDKToolCall[] | undefined;\n rawResponse: { headers: Headers | Record<string, string> };\n responseId?: string;\n}\n\n/**\n * @internal\n */\nexport interface SDKStreamChunk {\n _data?: unknown;\n getDeltaContent(): null | string | undefined;\n getDeltaToolCalls(): null | SDKDeltaToolCall[] | undefined;\n getFinishReason(): null | string | undefined;\n}\n\n/**\n * Token usage shape returned by SAP AI SDK responses.\n *\n * Shared by both doGenerate and doStream paths, this type captures the\n * superset of fields exposed by the Orchestration (`TokenUsage`) and\n * Foundation Models (`AzureOpenAiCompletionUsage`) SDKs.\n * @internal\n */\nexport interface SDKTokenUsage {\n completion_tokens?: number;\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n prompt_tokens?: number;\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n}\n\n/**\n * @internal\n */\nexport interface SDKToolCall {\n function: { arguments: string; name: string };\n id: string;\n}\n\n/**\n * @internal\n */\nexport interface StreamState {\n activeText: boolean;\n finishReason: LanguageModelV3FinishReason;\n isFirstChunk: boolean;\n usage: {\n inputTokens: {\n cacheRead: number | undefined;\n cacheWrite: number | undefined;\n noCache: number | undefined;\n total: number | undefined;\n };\n outputTokens: {\n reasoning: number | undefined;\n text: number | undefined;\n total: number | undefined;\n };\n };\n}\n\n/**\n * @internal\n */\nexport interface StreamTransformerConfig {\n readonly convertToAISDKError: (\n error: unknown,\n context: { operation: string; requestBody: unknown; url: string },\n ) => unknown;\n readonly idGenerator: StreamIdGenerator;\n readonly includeRawChunks: boolean;\n readonly modelId: string;\n readonly options: LanguageModelV3CallOptions;\n readonly providerName: string;\n readonly responseHeaders?: Record<string, string>;\n readonly responseId: string;\n readonly sdkStream: AsyncIterable<SDKStreamChunk>;\n readonly streamResponseGetCitations?: () => SDKCitation[] | undefined;\n readonly streamResponseGetFinishReason: () => null | string | undefined;\n readonly streamResponseGetIntermediateFailures?: () => undefined | unknown[];\n readonly streamResponseGetTokenUsage: () => null | SDKTokenUsage | undefined;\n readonly url: string;\n readonly version: string;\n readonly warnings: readonly SharedV3Warning[];\n}\n\n/**\n * @internal\n */\nexport interface ToolCallInProgress {\n arguments: string;\n didEmitCall: boolean;\n didEmitInputStart: boolean;\n id: string;\n toolName?: string;\n}\n\n/**\n * @internal\n */\nexport class StreamIdGenerator {\n /**\n * @returns A UUID string for identifying the response.\n */\n generateResponseId(): string {\n return crypto.randomUUID();\n }\n\n /**\n * @returns A UUID string for identifying a text block.\n */\n generateTextBlockId(): string {\n return crypto.randomUUID();\n }\n}\n\n/**\n * Applies parameter overrides from AI SDK options and modelParams.\n * @param modelParams - The model parameters object to modify.\n * @param options - AI SDK call options.\n * @param sapModelParams - Provider options model params.\n * @param settingsModelParams - Settings model params.\n * @param mappings - Parameter mappings for this strategy.\n * @internal\n */\nexport function applyParameterOverrides(\n modelParams: Record<string, unknown>,\n options: Record<string, unknown>,\n sapModelParams: Record<string, unknown> | undefined,\n settingsModelParams: Record<string, unknown> | undefined,\n mappings: readonly ParamMapping[],\n): void {\n for (const mapping of mappings) {\n const value =\n (mapping.optionKey ? options[mapping.optionKey] : undefined) ??\n (mapping.camelCaseKey ? sapModelParams?.[mapping.camelCaseKey] : undefined) ??\n (mapping.camelCaseKey ? settingsModelParams?.[mapping.camelCaseKey] : undefined);\n\n if (value !== undefined) {\n modelParams[mapping.outputKey] = value;\n }\n\n if (mapping.camelCaseKey && mapping.camelCaseKey !== mapping.outputKey) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete modelParams[mapping.camelCaseKey];\n }\n }\n}\n\n/**\n * Builds an EmbeddingModelV3Result from embedding data.\n * @param config - Configuration with embeddings and metadata.\n * @returns Complete embedding result for AI SDK.\n * @internal\n */\nexport function buildEmbeddingResult(config: EmbeddingResultConfig): EmbeddingModelV3Result {\n const { embeddings, modelId, providerName, totalTokens, version } = config;\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [providerName]: {\n model: modelId,\n version,\n },\n };\n\n return {\n embeddings,\n providerMetadata,\n usage: { tokens: totalTokens },\n warnings: [],\n };\n}\n\n/**\n * Builds a LanguageModelV3GenerateResult from SDK response.\n * @param config - Configuration with response and metadata.\n * @returns Complete generate result for AI SDK.\n * @internal\n */\nexport function buildGenerateResult(config: GenerateResultConfig): LanguageModelV3GenerateResult {\n const { modelId, providerName, requestBody, response, responseHeaders, version, warnings } =\n config;\n\n const content = extractResponseContent(response);\n\n const tokenUsage = response.getTokenUsage();\n const finishReasonRaw = response.getFinishReason();\n const finishReason = mapFinishReason(finishReasonRaw);\n\n const textContent = response.getContent();\n const toolCalls = response.getToolCalls();\n\n const rawResponseBody = {\n content: textContent,\n finishReason: finishReasonRaw,\n tokenUsage,\n toolCalls,\n };\n\n const citations = response.getCitations?.();\n if (citations?.length) {\n for (const citation of citations) {\n content.push({\n id: String(citation.ref_id ?? citation.url),\n sourceType: \"url\" as const,\n title: citation.title,\n type: \"source\" as const,\n url: citation.url,\n });\n }\n }\n\n const intermediateFailures = response.getIntermediateFailures?.();\n\n return {\n content,\n finishReason,\n providerMetadata: {\n [providerName]: {\n finishReason: finishReasonRaw ?? \"unknown\",\n finishReasonMapped: finishReason,\n ...(intermediateFailures?.length\n ? { intermediateFailures: intermediateFailures as JSONArray }\n : {}),\n ...(typeof responseHeaders?.[\"x-request-id\"] === \"string\"\n ? { requestId: responseHeaders[\"x-request-id\"] }\n : {}),\n version,\n },\n },\n request: {\n body: requestBody,\n },\n response: {\n body: rawResponseBody,\n headers: responseHeaders,\n id: response.responseId,\n modelId,\n timestamp: new Date(),\n },\n usage: mapTokenUsage(tokenUsage),\n warnings,\n };\n}\n\n/**\n * Builds a ModelDeployment object for the Foundation Models API SDK.\n * @param config - The strategy configuration containing deployment info and model ID.\n * @param modelVersion - Optional model version for model-based resolution.\n * @returns A ModelDeployment object for the Foundation Models API SDK.\n * @internal\n */\nexport function buildModelDeployment(\n config: BaseModelDeploymentConfig,\n modelVersion?: string,\n): { deploymentId: string } | { modelName: string; modelVersion?: string; resourceGroup?: string } {\n const deploymentConfig = config.deploymentConfig;\n\n if (\"deploymentId\" in deploymentConfig) {\n return { deploymentId: deploymentConfig.deploymentId };\n }\n\n const resourceGroup =\n \"resourceGroup\" in deploymentConfig ? deploymentConfig.resourceGroup : undefined;\n\n return {\n modelName: config.modelId,\n ...(modelVersion && { modelVersion }),\n ...(resourceGroup && { resourceGroup }),\n };\n}\n\n/**\n * Builds and validates model parameters from multiple sources.\n * @param config - Configuration with options, mappings, and source parameters.\n * @returns The merged model parameters and validation warnings.\n * @internal\n */\nexport function buildModelParams(config: BuildModelParamsConfig): BuildModelParamsResult {\n const { options, paramMappings, providerModelParams, settingsModelParams } = config;\n const warnings: SharedV3Warning[] = [];\n\n const modelParams: Record<string, unknown> = deepMerge(\n settingsModelParams ?? {},\n providerModelParams ?? {},\n );\n\n applyParameterOverrides(\n modelParams,\n options as Record<string, unknown>,\n providerModelParams,\n settingsModelParams,\n paramMappings,\n );\n\n if (options.stopSequences && options.stopSequences.length > 0) {\n modelParams.stop = options.stopSequences;\n }\n\n validateModelParamsWithWarnings(\n {\n frequencyPenalty: options.frequencyPenalty,\n maxTokens: options.maxOutputTokens,\n presencePenalty: options.presencePenalty,\n temperature: options.temperature,\n topP: options.topP,\n },\n warnings,\n );\n\n return { modelParams, warnings };\n}\n\n/**\n * Builds SAP AI SDK-compatible tool parameters from a JSON schema.\n * @param schema - The JSON schema to convert.\n * @returns The SAP-compatible tool parameters object.\n * @internal\n */\nexport function buildSAPToolParameters(schema: Record<string, unknown>): SAPToolParameters {\n const schemaType = schema.type;\n\n if (schemaType !== undefined && schemaType !== \"object\") {\n return {\n properties: {},\n required: [],\n type: \"object\",\n };\n }\n\n const properties =\n schema.properties && typeof schema.properties === \"object\"\n ? (schema.properties as Record<string, unknown>)\n : {};\n\n const required =\n Array.isArray(schema.required) && schema.required.every((item) => typeof item === \"string\")\n ? schema.required\n : [];\n\n const additionalFields = Object.fromEntries(\n Object.entries(schema).filter(\n ([key]) => key !== \"type\" && key !== \"properties\" && key !== \"required\",\n ),\n );\n\n return {\n properties,\n required,\n type: \"object\",\n ...additionalFields,\n };\n}\n\n/**\n * Converts AI SDK response format to SAP-compatible format.\n * @param optionsResponseFormat - The AI SDK response format from call options.\n * @param settingsResponseFormat - The fallback response format from settings.\n * @returns The converted response format and any warning.\n * @internal\n */\nexport function convertResponseFormat(\n optionsResponseFormat: LanguageModelV3CallOptions[\"responseFormat\"],\n settingsResponseFormat?: unknown,\n): ConvertedResponseFormatResult {\n let responseFormat: SAPResponseFormat | undefined;\n let warning: SharedV3Warning | undefined;\n\n if (optionsResponseFormat?.type === \"json\") {\n responseFormat = optionsResponseFormat.schema\n ? {\n json_schema: {\n description: optionsResponseFormat.description,\n name: optionsResponseFormat.name ?? \"response\",\n schema: optionsResponseFormat.schema as Record<string, unknown>,\n strict: null,\n },\n type: \"json_schema\" as const,\n }\n : { type: \"json_object\" as const };\n } else if (settingsResponseFormat) {\n responseFormat = settingsResponseFormat as SAPResponseFormat;\n }\n\n if (responseFormat && responseFormat.type !== \"text\") {\n warning = {\n message:\n \"responseFormat JSON mode is forwarded to the underlying model; support and schema adherence depend on the model/deployment.\",\n type: \"other\",\n };\n }\n\n return { responseFormat, warning };\n}\n\n/**\n * Converts AI SDK tools to SAP-compatible tool format.\n * @param tools - The AI SDK tools to convert.\n * @returns The converted tools and any warnings.\n * @internal\n */\nexport function convertToolsToSAPFormat<T extends SAPTool<unknown>>(\n tools: AISDKTool[] | undefined,\n): ConvertedToolsResult<T> {\n const warnings: SharedV3Warning[] = [];\n\n if (!tools || tools.length === 0) {\n return { tools: undefined, warnings };\n }\n\n const convertedTools = tools\n .map((tool): null | T => {\n if (tool.type === \"function\") {\n const { parameters, warning } = extractToolParameters(tool as LanguageModelV3FunctionTool);\n if (warning) {\n warnings.push(warning);\n }\n\n return {\n function: {\n name: tool.name,\n parameters,\n ...(tool.description ? { description: tool.description } : {}),\n },\n type: \"function\",\n } as T;\n } else {\n warnings.push({\n details: \"Only 'function' tool type is supported.\",\n feature: `tool type for ${tool.name}`,\n type: \"unsupported\",\n });\n return null;\n }\n })\n .filter((t): t is T => t !== null);\n\n return {\n tools: convertedTools.length > 0 ? convertedTools : undefined,\n warnings,\n };\n}\n\n/**\n * Creates a summary of Vercel AI SDK request options for error context.\n * @param options - The language model call options to summarize.\n * @returns An object summarizing the request for debugging.\n * @internal\n */\nexport function createAISDKRequestBodySummary(options: LanguageModelV3CallOptions): {\n hasImageParts: boolean;\n maxOutputTokens?: number;\n promptMessages: number;\n responseFormatType?: string;\n seed?: number;\n stopSequences?: number;\n temperature?: number;\n toolChoiceType?: string;\n tools: number;\n topK?: number;\n topP?: number;\n} {\n return {\n hasImageParts: options.prompt.some(\n (message) =>\n message.role === \"user\" &&\n message.content.some((part) => part.type === \"file\" && part.mediaType.startsWith(\"image/\")),\n ),\n maxOutputTokens: options.maxOutputTokens,\n promptMessages: options.prompt.length,\n responseFormatType: options.responseFormat?.type,\n seed: options.seed,\n stopSequences: options.stopSequences?.length,\n temperature: options.temperature,\n toolChoiceType: options.toolChoice?.type,\n tools: options.tools?.length ?? 0,\n topK: options.topK,\n topP: options.topP,\n };\n}\n\n/**\n * Creates the initial stream state for processing streaming responses.\n * @returns The initial stream state object.\n * @internal\n */\nexport function createInitialStreamState(): StreamState {\n return {\n activeText: false,\n finishReason: {\n raw: undefined,\n unified: \"other\" as const,\n },\n isFirstChunk: true,\n usage: {\n inputTokens: {\n cacheRead: undefined,\n cacheWrite: undefined,\n noCache: undefined,\n total: undefined,\n },\n outputTokens: {\n reasoning: undefined,\n text: undefined,\n total: undefined,\n },\n },\n };\n}\n\n/**\n * Creates a ReadableStream that transforms SAP AI SDK streaming responses\n * into Vercel AI SDK LanguageModelV3StreamPart events.\n * @param config - The stream transformer configuration containing all dependencies.\n * @returns A ReadableStream of LanguageModelV3StreamPart events.\n * @internal\n */\nexport function createStreamTransformer(\n config: StreamTransformerConfig,\n): ReadableStream<LanguageModelV3StreamPart> {\n const {\n convertToAISDKError,\n idGenerator,\n includeRawChunks,\n modelId,\n options,\n providerName,\n responseHeaders,\n responseId,\n sdkStream,\n streamResponseGetCitations,\n streamResponseGetFinishReason,\n streamResponseGetIntermediateFailures,\n streamResponseGetTokenUsage,\n url,\n version,\n warnings,\n } = config;\n\n let textBlockId: null | string = null;\n const streamState = createInitialStreamState();\n const toolCallsInProgress = new Map<number, ToolCallInProgress>();\n\n return convertAsyncIteratorToReadableStream(\n safeIterate(sdkStream)[Symbol.asyncIterator](),\n ).pipeThrough(\n new TransformStream<Error | SDKStreamChunk, LanguageModelV3StreamPart>({\n flush(controller) {\n const toolCalls = Array.from(toolCallsInProgress.values());\n let didEmitAnyToolCalls = false;\n\n for (const tc of toolCalls) {\n if (tc.didEmitCall) {\n continue;\n }\n\n if (!tc.didEmitInputStart) {\n tc.didEmitInputStart = true;\n controller.enqueue({\n id: tc.id,\n toolName: tc.toolName ?? \"\",\n type: \"tool-input-start\",\n });\n }\n\n didEmitAnyToolCalls = true;\n tc.didEmitCall = true;\n controller.enqueue({ id: tc.id, type: \"tool-input-end\" });\n controller.enqueue({\n input: tc.arguments,\n toolCallId: tc.id,\n toolName: tc.toolName ?? \"\",\n type: \"tool-call\",\n });\n }\n\n if (streamState.activeText && textBlockId) {\n controller.enqueue({ id: textBlockId, type: \"text-end\" });\n }\n\n const finalFinishReason = streamResponseGetFinishReason();\n if (finalFinishReason) {\n streamState.finishReason = mapFinishReason(finalFinishReason);\n } else if (didEmitAnyToolCalls) {\n streamState.finishReason = {\n raw: undefined,\n unified: \"tool-calls\",\n };\n }\n\n const finalUsage = streamResponseGetTokenUsage();\n if (finalUsage) {\n const mapped = mapTokenUsage(finalUsage);\n streamState.usage.inputTokens = mapped.inputTokens;\n streamState.usage.outputTokens = mapped.outputTokens;\n }\n\n const streamCitations = streamResponseGetCitations?.();\n if (streamCitations?.length) {\n for (const citation of streamCitations) {\n controller.enqueue({\n id: String(citation.ref_id ?? citation.url),\n sourceType: \"url\" as const,\n title: citation.title,\n type: \"source\",\n url: citation.url,\n });\n }\n }\n\n const streamIntermediateFailures = streamResponseGetIntermediateFailures?.();\n\n controller.enqueue({\n finishReason: streamState.finishReason,\n providerMetadata: {\n [providerName]: {\n finishReason: streamState.finishReason.raw,\n ...(streamIntermediateFailures?.length\n ? {\n intermediateFailures: streamIntermediateFailures as JSONArray,\n }\n : {}),\n ...(typeof responseHeaders?.[\"x-request-id\"] === \"string\"\n ? { requestId: responseHeaders[\"x-request-id\"] }\n : {}),\n responseId,\n version,\n },\n },\n type: \"finish\",\n usage: streamState.usage,\n });\n },\n\n start(controller) {\n controller.enqueue({\n type: \"stream-start\",\n warnings: [...warnings],\n });\n },\n\n transform(chunk, controller) {\n if (chunk instanceof Error) {\n const aiError = convertToAISDKError(chunk, {\n operation: \"doStream\",\n requestBody: createAISDKRequestBodySummary(options),\n url,\n });\n controller.enqueue({\n error: aiError instanceof Error ? aiError : new Error(String(aiError)),\n type: \"error\",\n });\n controller.terminate();\n return;\n }\n\n if (includeRawChunks) {\n controller.enqueue({\n rawValue: (chunk as { _data?: unknown })._data ?? chunk,\n type: \"raw\",\n });\n }\n\n if (streamState.isFirstChunk) {\n streamState.isFirstChunk = false;\n controller.enqueue({\n id: responseId,\n modelId,\n timestamp: new Date(),\n type: \"response-metadata\",\n });\n }\n\n const deltaToolCalls = chunk.getDeltaToolCalls();\n if (Array.isArray(deltaToolCalls) && deltaToolCalls.length > 0) {\n streamState.finishReason = {\n raw: undefined,\n unified: \"tool-calls\",\n };\n }\n\n const deltaContent = chunk.getDeltaContent();\n if (\n typeof deltaContent === \"string\" &&\n deltaContent.length > 0 &&\n streamState.finishReason.unified !== \"tool-calls\"\n ) {\n if (!streamState.activeText) {\n textBlockId = idGenerator.generateTextBlockId();\n controller.enqueue({ id: textBlockId, type: \"text-start\" });\n streamState.activeText = true;\n }\n if (textBlockId) {\n controller.enqueue({\n delta: deltaContent,\n id: textBlockId,\n type: \"text-delta\",\n });\n }\n }\n\n if (Array.isArray(deltaToolCalls) && deltaToolCalls.length > 0) {\n for (const toolCallChunk of deltaToolCalls) {\n const index = toolCallChunk.index;\n if (typeof index !== \"number\" || !Number.isFinite(index)) {\n continue;\n }\n\n if (!toolCallsInProgress.has(index)) {\n toolCallsInProgress.set(index, {\n arguments: \"\",\n didEmitCall: false,\n didEmitInputStart: false,\n id: toolCallChunk.id ?? `tool_${String(index)}`,\n toolName: toolCallChunk.function?.name,\n });\n }\n\n const tc = toolCallsInProgress.get(index);\n if (!tc) continue;\n\n if (toolCallChunk.id) {\n tc.id = toolCallChunk.id;\n }\n\n const nextToolName = toolCallChunk.function?.name;\n if (typeof nextToolName === \"string\" && nextToolName.length > 0) {\n tc.toolName = nextToolName;\n }\n\n if (!tc.didEmitInputStart && tc.toolName) {\n tc.didEmitInputStart = true;\n controller.enqueue({\n id: tc.id,\n toolName: tc.toolName,\n type: \"tool-input-start\",\n });\n }\n\n const argumentsDelta = toolCallChunk.function?.arguments;\n if (typeof argumentsDelta === \"string\" && argumentsDelta.length > 0) {\n tc.arguments += argumentsDelta;\n\n if (tc.didEmitInputStart) {\n controller.enqueue({\n delta: argumentsDelta,\n id: tc.id,\n type: \"tool-input-delta\",\n });\n }\n }\n }\n }\n\n const chunkFinishReason = chunk.getFinishReason();\n if (chunkFinishReason) {\n streamState.finishReason = mapFinishReason(chunkFinishReason);\n\n if (streamState.finishReason.unified === \"tool-calls\") {\n const toolCalls = Array.from(toolCallsInProgress.values());\n for (const tc of toolCalls) {\n if (tc.didEmitCall) {\n continue;\n }\n if (!tc.didEmitInputStart) {\n tc.didEmitInputStart = true;\n controller.enqueue({\n id: tc.id,\n toolName: tc.toolName ?? \"\",\n type: \"tool-input-start\",\n });\n }\n\n tc.didEmitCall = true;\n controller.enqueue({ id: tc.id, type: \"tool-input-end\" });\n controller.enqueue({\n input: tc.arguments,\n toolCallId: tc.id,\n toolName: tc.toolName ?? \"\",\n type: \"tool-call\",\n });\n }\n\n if (streamState.activeText && textBlockId) {\n controller.enqueue({ id: textBlockId, type: \"text-end\" });\n streamState.activeText = false;\n }\n }\n }\n },\n }),\n );\n}\n\n/**\n * Extracts content (text and tool calls) from SDK response.\n * @param response - SDK response object.\n * @returns Content array for LanguageModelV3GenerateResult.\n * @internal\n */\nexport function extractResponseContent(response: SDKResponse): LanguageModelV3Content[] {\n const content: LanguageModelV3Content[] = [];\n\n const textContent = response.getContent();\n if (textContent) {\n content.push({\n text: textContent,\n type: \"text\",\n });\n }\n\n const toolCalls = response.getToolCalls();\n if (toolCalls) {\n for (const toolCall of toolCalls) {\n content.push({\n input: toolCall.function.arguments,\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n type: \"tool-call\",\n });\n }\n }\n\n return content;\n}\n\n/**\n * Extracts SAP-compatible tool parameters from an AI SDK function tool.\n * @param tool - The AI SDK function tool to extract parameters from.\n * @returns The extracted parameters and optional warning.\n * @internal\n */\nexport function extractToolParameters(tool: LanguageModelV3FunctionTool): ExtractedToolParameters {\n const inputSchema = tool.inputSchema as Record<string, unknown> | undefined;\n const toolWithParams = tool as FunctionToolWithParameters;\n\n if (toolWithParams.parameters && isZodSchema(toolWithParams.parameters)) {\n try {\n const jsonSchema = z.toJSONSchema(toolWithParams.parameters);\n const schemaRecord = jsonSchema as Record<string, unknown>;\n delete schemaRecord.$schema;\n return { parameters: buildSAPToolParameters(schemaRecord) };\n } catch (error) {\n return {\n parameters: buildSAPToolParameters({}),\n warning: {\n details: `Failed to convert tool Zod schema: ${error instanceof Error ? error.message : String(error)}. Falling back to empty object schema.`,\n feature: `tool schema conversion for ${tool.name}`,\n type: \"unsupported\",\n },\n };\n }\n }\n\n if (inputSchema && hasKeys(inputSchema)) {\n const hasProperties =\n inputSchema.properties &&\n typeof inputSchema.properties === \"object\" &&\n hasKeys(inputSchema.properties);\n\n if (hasProperties) {\n return { parameters: buildSAPToolParameters(inputSchema) };\n }\n }\n\n return { parameters: buildSAPToolParameters({}) };\n}\n\n/**\n * Checks if an object has a callable parse method.\n * @param obj - The object to check for a parse method.\n * @returns True if the object has a callable parse method.\n * @internal\n */\nexport function hasCallableParse(\n obj: Record<string, unknown>,\n): obj is Record<string, unknown> & { parse: (...args: unknown[]) => unknown } {\n return typeof obj.parse === \"function\";\n}\n\n/**\n * Checks if an object has at least one own enumerable property.\n * @param obj - The object to check.\n * @returns True if the object has one or more keys.\n * @internal\n */\nexport function hasKeys(obj: object): boolean {\n return Object.keys(obj).length > 0;\n}\n\n/**\n * Type guard for Zod schema objects.\n * @param obj - The object to check.\n * @returns True if the object is a Zod schema.\n * @internal\n */\nexport function isZodSchema(obj: unknown): obj is ZodType {\n if (obj === null || typeof obj !== \"object\") {\n return false;\n }\n const record = obj as Record<string, unknown>;\n return \"_def\" in record && \"parse\" in record && hasCallableParse(record);\n}\n\n/**\n * Maps provider finish reasons to Vercel AI SDK LanguageModelV3FinishReason.\n * @param reason - The raw finish reason string from the provider.\n * @returns The unified finish reason with both raw and unified representations.\n * @internal\n */\nexport function mapFinishReason(reason: null | string | undefined): LanguageModelV3FinishReason {\n const raw = reason ?? undefined;\n\n if (!reason) {\n return { raw, unified: \"other\" };\n }\n\n switch (reason.toLowerCase()) {\n case \"content_filter\":\n return { raw, unified: \"content-filter\" };\n case \"end_turn\":\n case \"eos\":\n case \"stop\":\n case \"stop_sequence\":\n return { raw, unified: \"stop\" };\n case \"error\":\n return { raw, unified: \"error\" };\n case \"function_call\":\n case \"tool_call\":\n case \"tool_calls\":\n return { raw, unified: \"tool-calls\" };\n case \"length\":\n case \"max_tokens\":\n case \"max_tokens_reached\":\n return { raw, unified: \"length\" };\n default:\n return { raw, unified: \"other\" };\n }\n}\n\n/**\n * Maps SAP AI SDK token usage to Vercel AI SDK LanguageModelV3Usage.\n * @param tokenUsage - Raw token usage from the SAP SDK response.\n * @returns Mapped usage with input/output token breakdowns.\n * @internal\n */\nexport function mapTokenUsage(tokenUsage: null | SDKTokenUsage | undefined): LanguageModelV3Usage {\n const cachedTokens = tokenUsage?.prompt_tokens_details?.cached_tokens;\n const reasoningTokens = tokenUsage?.completion_tokens_details?.reasoning_tokens;\n\n return {\n inputTokens: {\n cacheRead: cachedTokens,\n cacheWrite: undefined,\n noCache:\n cachedTokens != null\n ? (tokenUsage?.prompt_tokens ?? 0) - cachedTokens\n : tokenUsage?.prompt_tokens,\n total: tokenUsage?.prompt_tokens,\n },\n outputTokens: {\n reasoning: reasoningTokens,\n text:\n reasoningTokens != null\n ? (tokenUsage?.completion_tokens ?? 0) - reasoningTokens\n : tokenUsage?.completion_tokens,\n total: tokenUsage?.completion_tokens,\n },\n };\n}\n\n/**\n * Maps Vercel AI SDK toolChoice to SAP Foundation Models SDK tool_choice format.\n * @param toolChoice - The Vercel AI SDK tool choice.\n * @returns The SAP SDK tool_choice format, or undefined if no mapping needed.\n * @internal\n */\nexport function mapToolChoice(toolChoice: AISDKToolChoice | undefined): SAPToolChoice | undefined {\n if (!toolChoice) {\n return undefined;\n }\n\n switch (toolChoice.type) {\n case \"auto\":\n return \"auto\";\n case \"none\":\n return \"none\";\n case \"required\":\n return \"required\";\n case \"tool\":\n return {\n function: { name: toolChoice.toolName },\n type: \"function\",\n };\n default:\n return undefined;\n }\n}\n\n/**\n * Converts SAP AI SDK embedding to Vercel AI SDK format.\n * @param embedding - The embedding as number array or base64 string.\n * @returns The normalized embedding as a number array.\n * @internal\n */\nexport function normalizeEmbedding(embedding: number[] | string): EmbeddingModelV3Embedding {\n if (Array.isArray(embedding)) {\n return embedding;\n }\n const buffer = Buffer.from(embedding, \"base64\");\n const float32Array = new Float32Array(\n buffer.buffer,\n buffer.byteOffset,\n buffer.length / Float32Array.BYTES_PER_ELEMENT,\n );\n return Array.from(float32Array);\n}\n\n/**\n * Prepares embedding call by parsing provider options and validating input count.\n * @param config - Base embedding configuration.\n * @param options - Embedding model call options.\n * @returns Parsed SAP options and provider name.\n * @throws {TooManyEmbeddingValuesForCallError} When input count exceeds maximum.\n * @internal\n */\nexport async function prepareEmbeddingCall(\n config: BaseEmbeddingConfig,\n options: EmbeddingModelV3CallOptions,\n): Promise<{ embeddingOptions: EmbeddingProviderOptions | undefined; providerName: string }> {\n const { maxEmbeddingsPerCall, modelId, provider } = config;\n const { providerOptions, values } = options;\n\n const providerName = getProviderName(provider);\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions,\n schema: sapAIEmbeddingProviderOptions,\n });\n\n if (values.length > maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n maxEmbeddingsPerCall,\n modelId,\n provider,\n values,\n });\n }\n\n return { embeddingOptions: sapOptions, providerName };\n}\n\n/**\n * Wraps an async iterable to catch iteration errors and yield them as values.\n * @param iterable - The async iterable to wrap.\n * @yields {Error | T} Original values or Error instances for caught exceptions.\n * @internal\n */\nasync function* safeIterate<T>(iterable: AsyncIterable<T>): AsyncGenerator<Error | T> {\n try {\n yield* iterable;\n } catch (error) {\n yield error instanceof Error ? error : new Error(String(error));\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,15 +1,13 @@
1
1
  import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
2
2
  import {
3
3
  BaseEmbeddingModelStrategy
4
- } from "./chunk-BV5Y6RMC.js";
4
+ } from "./chunk-M6USM33F.js";
5
5
  import {
6
6
  buildModelDeployment,
7
7
  hasKeys,
8
8
  normalizeEmbedding
9
- } from "./chunk-KS5QNMYZ.js";
10
- import {
11
- deepMerge
12
- } from "./chunk-DBAIFR3B.js";
9
+ } from "./chunk-WO5UACI5.js";
10
+ import "./chunk-TE3CYVU3.js";
13
11
 
14
12
  // src/foundation-models-embedding-model-strategy.ts
15
13
  var FoundationModelsEmbeddingModelStrategy = class extends BaseEmbeddingModelStrategy {
@@ -19,10 +17,7 @@ var FoundationModelsEmbeddingModelStrategy = class extends BaseEmbeddingModelStr
19
17
  this.ClientClass = ClientClass;
20
18
  }
21
19
  createClient(config, settings, embeddingOptions) {
22
- const mergedParams = deepMerge(
23
- settings.modelParams ?? {},
24
- embeddingOptions?.modelParams ?? {}
25
- );
20
+ const mergedParams = this.mergeModelParams(settings, embeddingOptions);
26
21
  return {
27
22
  client: new this.ClientClass(
28
23
  buildModelDeployment(config, settings.modelVersion),
@@ -56,4 +51,4 @@ var FoundationModelsEmbeddingModelStrategy = class extends BaseEmbeddingModelStr
56
51
  export {
57
52
  FoundationModelsEmbeddingModelStrategy
58
53
  };
59
- //# sourceMappingURL=foundation-models-embedding-model-strategy-XLD3PGCK.js.map
54
+ //# sourceMappingURL=foundation-models-embedding-model-strategy-A6CA7NXP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/foundation-models-embedding-model-strategy.ts"],"sourcesContent":["/** Foundation Models embedding model strategy using `@sap-ai-sdk/foundation-models`. */\nimport type { EmbeddingModelV3Embedding } from \"@ai-sdk/provider\";\nimport type {\n AzureOpenAiEmbeddingClient,\n AzureOpenAiEmbeddingParameters,\n AzureOpenAiEmbeddingResponse,\n} from \"@sap-ai-sdk/foundation-models\";\n\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\nimport type { EmbeddingModelStrategyConfig } from \"./sap-ai-strategy.js\";\nimport type { EmbeddingProviderOptions } from \"./strategy-utils.js\";\n\nimport { BaseEmbeddingModelStrategy } from \"./base-embedding-model-strategy.js\";\nimport { buildModelDeployment, hasKeys, normalizeEmbedding } from \"./strategy-utils.js\";\n\n/**\n * Client with pre-merged params for thread-safe concurrent requests.\n * @internal\n */\ninterface FMEmbeddingClientWithContext {\n client: AzureOpenAiEmbeddingClient;\n mergedParams: Record<string, unknown> | undefined;\n}\n\n/** @internal */\ntype FoundationModelsEmbeddingClientClass = typeof AzureOpenAiEmbeddingClient;\n\n/**\n * Embedding model strategy for the Foundation Models API.\n *\n * Provides direct access to Azure OpenAI embedding models.\n * @internal\n */\nexport class FoundationModelsEmbeddingModelStrategy extends BaseEmbeddingModelStrategy<\n FMEmbeddingClientWithContext,\n AzureOpenAiEmbeddingResponse\n> {\n private readonly ClientClass: FoundationModelsEmbeddingClientClass;\n\n constructor(ClientClass: FoundationModelsEmbeddingClientClass) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected createClient(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n embeddingOptions: EmbeddingProviderOptions | undefined,\n ): FMEmbeddingClientWithContext {\n const mergedParams = this.mergeModelParams(settings, embeddingOptions);\n\n return {\n client: new this.ClientClass(\n buildModelDeployment(config, settings.modelVersion),\n config.destination,\n ),\n mergedParams: hasKeys(mergedParams) ? mergedParams : undefined,\n };\n }\n\n protected async executeCall(\n clientWithContext: FMEmbeddingClientWithContext,\n values: string[],\n _embeddingType: unknown,\n abortSignal: AbortSignal | undefined,\n ): Promise<AzureOpenAiEmbeddingResponse> {\n const request = this.buildRequest(values, clientWithContext.mergedParams);\n return clientWithContext.client.run(request, abortSignal ? { signal: abortSignal } : undefined);\n }\n\n protected extractEmbeddings(response: AzureOpenAiEmbeddingResponse): EmbeddingModelV3Embedding[] {\n // SDK types include `& Record<string, any>` which requires explicit extraction\n const embeddingData = response._data.data;\n const sortedEmbeddings = embeddingData.slice().sort((a, b) => a.index - b.index);\n return sortedEmbeddings.map((item) => normalizeEmbedding(item.embedding as number[]));\n }\n\n protected extractTokenCount(response: AzureOpenAiEmbeddingResponse): number {\n return response._data.usage.total_tokens;\n }\n\n protected getUrl(): string {\n return \"sap-ai:foundation-models/embeddings\";\n }\n\n private buildRequest(\n values: string[],\n mergedParams: Record<string, unknown> | undefined,\n ): AzureOpenAiEmbeddingParameters {\n return {\n input: values,\n ...(mergedParams ?? {}),\n } as AzureOpenAiEmbeddingParameters;\n }\n}\n"],"mappings":";;;;;;;;;;;;AAiCO,IAAM,yCAAN,cAAqD,2BAG1D;AAAA,EACiB;AAAA,EAEjB,YAAY,aAAmD;AAC7D,UAAM;AACN,SAAK,cAAc;AAAA,EACrB;AAAA,EAEU,aACR,QACA,UACA,kBAC8B;AAC9B,UAAM,eAAe,KAAK,iBAAiB,UAAU,gBAAgB;AAErE,WAAO;AAAA,MACL,QAAQ,IAAI,KAAK;AAAA,QACf,qBAAqB,QAAQ,SAAS,YAAY;AAAA,QAClD,OAAO;AAAA,MACT;AAAA,MACA,cAAc,QAAQ,YAAY,IAAI,eAAe;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAgB,YACd,mBACA,QACA,gBACA,aACuC;AACvC,UAAM,UAAU,KAAK,aAAa,QAAQ,kBAAkB,YAAY;AACxE,WAAO,kBAAkB,OAAO,IAAI,SAAS,cAAc,EAAE,QAAQ,YAAY,IAAI,MAAS;AAAA,EAChG;AAAA,EAEU,kBAAkB,UAAqE;AAE/F,UAAM,gBAAgB,SAAS,MAAM;AACrC,UAAM,mBAAmB,cAAc,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC/E,WAAO,iBAAiB,IAAI,CAAC,SAAS,mBAAmB,KAAK,SAAqB,CAAC;AAAA,EACtF;AAAA,EAEU,kBAAkB,UAAgD;AAC1E,WAAO,SAAS,MAAM,MAAM;AAAA,EAC9B;AAAA,EAEU,SAAiB;AACzB,WAAO;AAAA,EACT;AAAA,EAEQ,aACN,QACA,cACgC;AAChC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,GAAI,gBAAgB,CAAC;AAAA,IACvB;AAAA,EACF;AACF;","names":[]}
@@ -1,16 +1,16 @@
1
1
  import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
2
2
  import {
3
3
  BaseLanguageModelStrategy
4
- } from "./chunk-WYDTQDMJ.js";
5
- import "./chunk-DQXZH6CW.js";
4
+ } from "./chunk-7HX5A5XW.js";
5
+ import "./chunk-IIBSUXGT.js";
6
6
  import {
7
7
  buildModelDeployment,
8
8
  convertResponseFormat,
9
9
  convertToolsToSAPFormat
10
- } from "./chunk-KS5QNMYZ.js";
10
+ } from "./chunk-WO5UACI5.js";
11
11
  import {
12
12
  normalizeHeaders
13
- } from "./chunk-DBAIFR3B.js";
13
+ } from "./chunk-TE3CYVU3.js";
14
14
 
15
15
  // src/foundation-models-language-model-strategy.ts
16
16
  var FOUNDATION_MODELS_PARAM_MAPPINGS = [
@@ -27,7 +27,7 @@ var FoundationModelsLanguageModelStrategy = class extends BaseLanguageModelStrat
27
27
  super();
28
28
  this.ClientClass = ClientClass;
29
29
  }
30
- buildRequest(config, settings, options, commonParts) {
30
+ buildRequest(_config, settings, options, commonParts) {
31
31
  const warnings = [];
32
32
  const toolsResult = convertToolsToSAPFormat(
33
33
  options.tools
@@ -89,4 +89,4 @@ var FoundationModelsLanguageModelStrategy = class extends BaseLanguageModelStrat
89
89
  export {
90
90
  FoundationModelsLanguageModelStrategy
91
91
  };
92
- //# sourceMappingURL=foundation-models-language-model-strategy-SNBZBWX4.js.map
92
+ //# sourceMappingURL=foundation-models-language-model-strategy-DZMPSOJK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/foundation-models-language-model-strategy.ts"],"sourcesContent":["/** Foundation Models language model strategy using `@sap-ai-sdk/foundation-models`. */\nimport type { LanguageModelV3CallOptions, SharedV3Warning } from \"@ai-sdk/provider\";\nimport type {\n AzureOpenAiChatClient,\n AzureOpenAiChatCompletionParameters,\n AzureOpenAiChatCompletionTool,\n} from \"@sap-ai-sdk/foundation-models\";\nimport type { ChatMessage } from \"@sap-ai-sdk/orchestration\";\n\nimport type { FoundationModelsModelSettings } from \"./sap-ai-settings.js\";\nimport type { LanguageModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport {\n BaseLanguageModelStrategy,\n type CommonBuildResult,\n type StreamCallResponse,\n} from \"./base-language-model-strategy.js\";\nimport { normalizeHeaders } from \"./sap-ai-error.js\";\nimport {\n type AISDKTool,\n buildModelDeployment,\n convertResponseFormat,\n convertToolsToSAPFormat,\n type ParamMapping,\n type SAPToolChoice,\n type SDKResponse,\n type SDKStreamChunk,\n} from \"./strategy-utils.js\";\n\n/** @internal */\ntype FoundationModelsClient = InstanceType<typeof AzureOpenAiChatClient>;\n\n/**\n * Foundation Models API parameter mappings.\n * @internal\n */\nconst FOUNDATION_MODELS_PARAM_MAPPINGS: readonly ParamMapping[] = [\n ...BaseLanguageModelStrategy.COMMON_PARAM_MAPPINGS,\n { camelCaseKey: \"logprobs\", outputKey: \"logprobs\" },\n { camelCaseKey: \"topLogprobs\", outputKey: \"top_logprobs\" },\n { camelCaseKey: \"logitBias\", outputKey: \"logit_bias\" },\n { camelCaseKey: \"user\", outputKey: \"user\" },\n { camelCaseKey: \"n\", outputKey: \"n\" },\n] as const;\n\n/**\n * Language model strategy for the Foundation Models API.\n *\n * Provides direct access to Azure OpenAI models with parameters like:\n * - logprobs\n * - seed\n * - dataSources (On Your Data)\n * @internal\n */\nexport class FoundationModelsLanguageModelStrategy extends BaseLanguageModelStrategy<\n FoundationModelsClient,\n AzureOpenAiChatCompletionParameters,\n FoundationModelsModelSettings\n> {\n private readonly ClientClass: typeof AzureOpenAiChatClient;\n\n constructor(ClientClass: typeof AzureOpenAiChatClient) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected buildRequest(\n _config: LanguageModelStrategyConfig,\n settings: FoundationModelsModelSettings,\n options: LanguageModelV3CallOptions,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): {\n readonly request: AzureOpenAiChatCompletionParameters;\n readonly warnings: SharedV3Warning[];\n } {\n const warnings: SharedV3Warning[] = [];\n\n const toolsResult = convertToolsToSAPFormat<AzureOpenAiChatCompletionTool>(\n options.tools as AISDKTool[] | undefined,\n );\n warnings.push(...toolsResult.warnings);\n\n const { responseFormat, warning: responseFormatWarning } = convertResponseFormat(\n options.responseFormat,\n settings.responseFormat,\n );\n if (responseFormatWarning) {\n warnings.push(responseFormatWarning);\n }\n\n const { toolChoice } = commonParts;\n\n const request: AzureOpenAiChatCompletionParameters = {\n messages: commonParts.messages as AzureOpenAiChatCompletionParameters[\"messages\"],\n ...commonParts.modelParams,\n ...(toolsResult.tools?.length ? { tools: toolsResult.tools } : {}),\n ...(toolChoice ? { tool_choice: toolChoice } : {}),\n ...(responseFormat ? { response_format: responseFormat } : {}),\n ...(settings.dataSources?.length\n ? {\n data_sources:\n settings.dataSources as AzureOpenAiChatCompletionParameters[\"data_sources\"],\n }\n : {}),\n };\n\n return { request, warnings };\n }\n\n protected createClient(\n config: LanguageModelStrategyConfig,\n settings: FoundationModelsModelSettings,\n _commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): FoundationModelsClient {\n const modelDeployment = buildModelDeployment(config, settings.modelVersion);\n return new this.ClientClass(modelDeployment, config.destination);\n }\n\n protected async executeApiCall(\n client: FoundationModelsClient,\n request: AzureOpenAiChatCompletionParameters,\n abortSignal: AbortSignal | undefined,\n ): Promise<SDKResponse> {\n const response = await client.run(request, abortSignal ? { signal: abortSignal } : undefined);\n\n const headers = normalizeHeaders(response.rawResponse.headers);\n\n // Extract completion ID from SDK internal data (chatcmpl-xxx style).\n // Falls back to the x-request-id header if not available.\n const completionId =\n (response as { _data?: { id?: string } })._data?.id ?? headers?.[\"x-request-id\"];\n\n return {\n getContent: () => response.getContent(),\n getFinishReason: () => response.getFinishReason(),\n getTokenUsage: () => response.getTokenUsage(),\n getToolCalls: () => response.getToolCalls(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- SAP SDK types headers as any\n rawResponse: { headers: response.rawResponse.headers },\n responseId: completionId,\n };\n }\n\n protected async executeStreamCall(\n client: FoundationModelsClient,\n request: AzureOpenAiChatCompletionParameters,\n abortSignal: AbortSignal | undefined,\n _settings: FoundationModelsModelSettings,\n ): Promise<StreamCallResponse> {\n const streamResponse = await client.stream(request, abortSignal);\n\n // AzureOpenAiChatCompletionStreamResponse exposes neither rawResponse nor _data.\n // Response headers and completion ID are unavailable — base strategy falls back to UUID.\n return {\n getFinishReason: () => streamResponse.getFinishReason(),\n getTokenUsage: () => streamResponse.getTokenUsage(),\n stream: streamResponse.stream as AsyncIterable<SDKStreamChunk>,\n };\n }\n\n protected getParamMappings(): readonly ParamMapping[] {\n return FOUNDATION_MODELS_PARAM_MAPPINGS;\n }\n\n protected getUrl(): string {\n return \"sap-ai:foundation-models\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAoCA,IAAM,mCAA4D;AAAA,EAChE,GAAG,0BAA0B;AAAA,EAC7B,EAAE,cAAc,YAAY,WAAW,WAAW;AAAA,EAClD,EAAE,cAAc,eAAe,WAAW,eAAe;AAAA,EACzD,EAAE,cAAc,aAAa,WAAW,aAAa;AAAA,EACrD,EAAE,cAAc,QAAQ,WAAW,OAAO;AAAA,EAC1C,EAAE,cAAc,KAAK,WAAW,IAAI;AACtC;AAWO,IAAM,wCAAN,cAAoD,0BAIzD;AAAA,EACiB;AAAA,EAEjB,YAAY,aAA2C;AACrD,UAAM;AACN,SAAK,cAAc;AAAA,EACrB;AAAA,EAEU,aACR,SACA,UACA,SACA,aAIA;AACA,UAAM,WAA8B,CAAC;AAErC,UAAM,cAAc;AAAA,MAClB,QAAQ;AAAA,IACV;AACA,aAAS,KAAK,GAAG,YAAY,QAAQ;AAErC,UAAM,EAAE,gBAAgB,SAAS,sBAAsB,IAAI;AAAA,MACzD,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AACA,QAAI,uBAAuB;AACzB,eAAS,KAAK,qBAAqB;AAAA,IACrC;AAEA,UAAM,EAAE,WAAW,IAAI;AAEvB,UAAM,UAA+C;AAAA,MACnD,UAAU,YAAY;AAAA,MACtB,GAAG,YAAY;AAAA,MACf,GAAI,YAAY,OAAO,SAAS,EAAE,OAAO,YAAY,MAAM,IAAI,CAAC;AAAA,MAChE,GAAI,aAAa,EAAE,aAAa,WAAW,IAAI,CAAC;AAAA,MAChD,GAAI,iBAAiB,EAAE,iBAAiB,eAAe,IAAI,CAAC;AAAA,MAC5D,GAAI,SAAS,aAAa,SACtB;AAAA,QACE,cACE,SAAS;AAAA,MACb,IACA,CAAC;AAAA,IACP;AAEA,WAAO,EAAE,SAAS,SAAS;AAAA,EAC7B;AAAA,EAEU,aACR,QACA,UACA,cACwB;AACxB,UAAM,kBAAkB,qBAAqB,QAAQ,SAAS,YAAY;AAC1E,WAAO,IAAI,KAAK,YAAY,iBAAiB,OAAO,WAAW;AAAA,EACjE;AAAA,EAEA,MAAgB,eACd,QACA,SACA,aACsB;AACtB,UAAM,WAAW,MAAM,OAAO,IAAI,SAAS,cAAc,EAAE,QAAQ,YAAY,IAAI,MAAS;AAE5F,UAAM,UAAU,iBAAiB,SAAS,YAAY,OAAO;AAI7D,UAAM,eACH,SAAyC,OAAO,MAAM,UAAU,cAAc;AAEjF,WAAO;AAAA,MACL,YAAY,MAAM,SAAS,WAAW;AAAA,MACtC,iBAAiB,MAAM,SAAS,gBAAgB;AAAA,MAChD,eAAe,MAAM,SAAS,cAAc;AAAA,MAC5C,cAAc,MAAM,SAAS,aAAa;AAAA;AAAA,MAE1C,aAAa,EAAE,SAAS,SAAS,YAAY,QAAQ;AAAA,MACrD,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAgB,kBACd,QACA,SACA,aACA,WAC6B;AAC7B,UAAM,iBAAiB,MAAM,OAAO,OAAO,SAAS,WAAW;AAI/D,WAAO;AAAA,MACL,iBAAiB,MAAM,eAAe,gBAAgB;AAAA,MACtD,eAAe,MAAM,eAAe,cAAc;AAAA,MAClD,QAAQ,eAAe;AAAA,IACzB;AAAA,EACF;AAAA,EAEU,mBAA4C;AACpD,WAAO;AAAA,EACT;AAAA,EAEU,SAAiB;AACzB,WAAO;AAAA,EACT;AACF;","names":[]}