@jerome-benoit/sap-ai-provider-v2 5.0.0 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -16
- package/dist/{chunk-BIBSYTMU.js → chunk-2KOXKYVT.js} +5 -7
- package/dist/{chunk-BIBSYTMU.js.map → chunk-2KOXKYVT.js.map} +1 -1
- package/dist/{chunk-WNR7DC4V.js → chunk-643USI3B.js} +7 -7
- package/dist/{chunk-WNR7DC4V.js.map → chunk-643USI3B.js.map} +1 -1
- package/dist/{chunk-Q5JV4I6D.js → chunk-AFZC2DH2.js} +2 -2
- package/dist/chunk-AFZC2DH2.js.map +1 -0
- package/dist/{chunk-FY2HO62O.js → chunk-JRUSQTKB.js} +3 -3
- package/dist/{chunk-QDUZRLMI.js → chunk-MF3VO3ER.js} +1 -1
- package/dist/chunk-MF3VO3ER.js.map +1 -0
- package/dist/{chunk-TXZZURBA.js → chunk-U23M3VYO.js} +2 -2
- package/dist/{foundation-models-embedding-model-strategy-JJBN3TQI.js → foundation-models-embedding-model-strategy-2GUADNXT.js} +4 -4
- package/dist/{foundation-models-language-model-strategy-6ELKE34K.js → foundation-models-language-model-strategy-5AYZ5KHA.js} +5 -5
- package/dist/index.cjs +11 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +46 -26
- package/dist/index.d.ts +46 -26
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/{orchestration-embedding-model-strategy-QI72OB3E.js → orchestration-embedding-model-strategy-F7WHDLX7.js} +5 -5
- package/dist/{orchestration-language-model-strategy-X4FZNLSA.js → orchestration-language-model-strategy-Z72AFW62.js} +10 -9
- package/dist/orchestration-language-model-strategy-Z72AFW62.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-Q5JV4I6D.js.map +0 -1
- package/dist/chunk-QDUZRLMI.js.map +0 -1
- package/dist/orchestration-language-model-strategy-X4FZNLSA.js.map +0 -1
- /package/dist/{chunk-FY2HO62O.js.map → chunk-JRUSQTKB.js.map} +0 -0
- /package/dist/{chunk-TXZZURBA.js.map → chunk-U23M3VYO.js.map} +0 -0
- /package/dist/{foundation-models-embedding-model-strategy-JJBN3TQI.js.map → foundation-models-embedding-model-strategy-2GUADNXT.js.map} +0 -0
- /package/dist/{foundation-models-language-model-strategy-6ELKE34K.js.map → foundation-models-language-model-strategy-5AYZ5KHA.js.map} +0 -0
- /package/dist/{orchestration-embedding-model-strategy-QI72OB3E.js.map → orchestration-embedding-model-strategy-F7WHDLX7.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
convertToSAPMessages
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-MF3VO3ER.js";
|
|
5
5
|
import {
|
|
6
6
|
StreamIdGenerator,
|
|
7
7
|
buildGenerateResult,
|
|
@@ -11,14 +11,14 @@ import {
|
|
|
11
11
|
extractCompletionId,
|
|
12
12
|
extractResponseMetadata,
|
|
13
13
|
mapToolChoice
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-AFZC2DH2.js";
|
|
15
15
|
import {
|
|
16
16
|
VERSION,
|
|
17
17
|
convertToAISDKError,
|
|
18
18
|
getProviderName,
|
|
19
19
|
normalizeHeaders,
|
|
20
20
|
sapAILanguageModelProviderOptions
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-2KOXKYVT.js";
|
|
22
22
|
|
|
23
23
|
// src/base-language-model-strategy.ts
|
|
24
24
|
import { parseProviderOptions } from "@ai-sdk/provider-utils";
|
|
@@ -200,17 +200,17 @@ var BaseLanguageModelStrategy = class {
|
|
|
200
200
|
* Returns whether to escape template placeholders for this API.
|
|
201
201
|
* @param _sapOptions - Parsed provider options (unused in base implementation).
|
|
202
202
|
* @param _settings - Model settings (unused in base implementation).
|
|
203
|
-
* @returns false by default; Orchestration
|
|
203
|
+
* @returns false by default; the Orchestration override defaults to true unless disabled.
|
|
204
204
|
* @internal
|
|
205
205
|
*/
|
|
206
206
|
getEscapeTemplatePlaceholders(_sapOptions, _settings) {
|
|
207
207
|
return false;
|
|
208
208
|
}
|
|
209
209
|
/**
|
|
210
|
-
* Returns whether
|
|
210
|
+
* Returns whether assistant reasoning in the input history is forwarded as text.
|
|
211
211
|
* @param sapOptions - Parsed provider options.
|
|
212
212
|
* @param settings - Model settings.
|
|
213
|
-
* @returns Whether to
|
|
213
|
+
* @returns Whether to forward input reasoning (checks sapOptions then settings, defaults to false).
|
|
214
214
|
* @internal
|
|
215
215
|
*/
|
|
216
216
|
getIncludeReasoning(sapOptions, settings) {
|
|
@@ -248,4 +248,4 @@ var BaseLanguageModelStrategy = class {
|
|
|
248
248
|
export {
|
|
249
249
|
BaseLanguageModelStrategy
|
|
250
250
|
};
|
|
251
|
-
//# sourceMappingURL=chunk-
|
|
251
|
+
//# sourceMappingURL=chunk-643USI3B.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/base-language-model-strategy.ts"],"sourcesContent":["/** Base class for language model strategies using the Template Method pattern. */\nimport type {\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { ChatMessage } from \"@sap-ai-sdk/orchestration\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\n\nimport type { ParsePartProviderOptions } from \"./sap-ai-provider-options.js\";\nimport type { SAPAIModelSettings } from \"./sap-ai-settings.js\";\nimport type { LanguageModelAPIStrategy, LanguageModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport { convertToSAPMessages } from \"./convert-to-sap-messages.js\";\nimport { convertToAISDKError, normalizeHeaders } from \"./sap-ai-error.js\";\nimport { getProviderName, sapAILanguageModelProviderOptions } from \"./sap-ai-provider-options.js\";\nimport {\n buildGenerateResult,\n buildModelParams,\n createAISDKRequestBodySummary,\n createStreamTransformer,\n extractCompletionId,\n extractResponseMetadata,\n mapToolChoice,\n type ParamMapping,\n type SAPToolChoice,\n type SDKCitation,\n type SDKResponse,\n type SDKStreamChunk,\n type SDKTokenUsage,\n StreamIdGenerator,\n} from \"./strategy-utils.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * Result of building common parts for a language model request.\n * @template TMessages - The message array type (e.g., `ChatMessage[]`, `AzureOpenAiChatCompletionRequestMessage[]`)\n * @template TToolChoice - The tool choice type (e.g., `SAPToolChoice`)\n * @internal\n */\nexport interface CommonBuildResult<TMessages extends unknown[] = unknown[], TToolChoice = unknown> {\n readonly messages: TMessages;\n readonly modelParams: Record<string, unknown>;\n readonly providerName: string;\n readonly resolvedState?: unknown;\n readonly sapOptions: Record<string, unknown> | undefined;\n readonly toolChoice: TToolChoice;\n readonly warnings: SharedV3Warning[];\n}\n\n/**\n * Stream response shape returned by executeStreamCall.\n * @internal\n */\nexport interface StreamCallResponse {\n readonly getCitations?: () => SDKCitation[] | undefined;\n readonly getFinishReason: () => null | string | undefined;\n readonly getIntermediateFailures?: () => undefined | unknown[];\n readonly getTokenUsage: () => null | SDKTokenUsage | undefined;\n /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n readonly requestId?: string;\n readonly responseHeaders?: Record<string, string>;\n /** Server-provided completion ID extracted from _data, if available. */\n readonly responseId?: string;\n readonly stream: AsyncIterable<SDKStreamChunk>;\n}\n\n/**\n * Abstract base class for language model strategies using the Template Method pattern.\n * @template TClient - The SDK client type (e.g., AzureOpenAiChatClient, OrchestrationClient).\n * @template TRequest - The API request type (e.g., AzureOpenAiChatCompletionParameters).\n * @template TSettings - The model settings type extending SAPAIModelSettings.\n * @internal\n */\nexport abstract class BaseLanguageModelStrategy<\n TClient,\n TRequest,\n TSettings extends SAPAIModelSettings = SAPAIModelSettings,\n> implements LanguageModelAPIStrategy<TSettings> {\n /**\n * Common parameter mappings for language model APIs.\n * @internal\n */\n static readonly COMMON_PARAM_MAPPINGS: readonly ParamMapping[] = [\n { camelCaseKey: \"maxTokens\", optionKey: \"maxOutputTokens\", outputKey: \"max_completion_tokens\" },\n { camelCaseKey: \"temperature\", optionKey: \"temperature\", outputKey: \"temperature\" },\n { camelCaseKey: \"topP\", optionKey: \"topP\", outputKey: \"top_p\" },\n {\n camelCaseKey: \"frequencyPenalty\",\n optionKey: \"frequencyPenalty\",\n outputKey: \"frequency_penalty\",\n },\n {\n camelCaseKey: \"presencePenalty\",\n optionKey: \"presencePenalty\",\n outputKey: \"presence_penalty\",\n },\n { camelCaseKey: \"seed\", optionKey: \"seed\", outputKey: \"seed\" },\n { optionKey: \"reasoning\", outputKey: \"reasoning_effort\" },\n { camelCaseKey: \"parallel_tool_calls\", outputKey: \"parallel_tool_calls\" },\n ] as const;\n\n async doGenerate(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n try {\n const commonParts = await this.buildCommonParts(config, settings, options);\n const { request, warnings } = this.buildRequest(config, settings, options, commonParts);\n\n const client = this.createClient(config, settings, commonParts);\n\n const response = await this.executeApiCall(\n client,\n request,\n options.abortSignal ?? undefined,\n config.requestConfig,\n );\n\n return buildGenerateResult({\n modelId: config.modelId,\n providerName: commonParts.providerName,\n requestBody: request,\n requestId: response.requestId,\n response,\n responseHeaders: normalizeHeaders(response.rawResponse.headers),\n version: VERSION,\n warnings: [...commonParts.warnings, ...warnings],\n });\n } catch (error) {\n throw convertToAISDKError(error, {\n operation: \"doGenerate\",\n requestBody: createAISDKRequestBodySummary(options),\n url: this.getUrl(),\n });\n }\n }\n\n async doStream(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n try {\n const commonParts = await this.buildCommonParts(config, settings, options);\n const { request, warnings } = this.buildRequest(config, settings, options, commonParts);\n\n const client = this.createClient(config, settings, commonParts);\n\n const streamResponse = await this.executeStreamCall(\n client,\n request,\n options.abortSignal ?? undefined,\n settings,\n config.requestConfig,\n );\n\n const idGenerator = new StreamIdGenerator();\n const responseId = streamResponse.responseId ?? idGenerator.generateResponseId();\n\n const streamWarnings = this.collectStreamWarnings(settings, commonParts.sapOptions);\n\n const transformedStream = createStreamTransformer({\n convertToAISDKError,\n idGenerator,\n includeRawChunks: options.includeRawChunks ?? false,\n modelId: config.modelId,\n options,\n providerName: commonParts.providerName,\n requestId: streamResponse.requestId,\n responseId,\n sdkStream: streamResponse.stream,\n streamResponseGetCitations: streamResponse.getCitations,\n streamResponseGetFinishReason: streamResponse.getFinishReason,\n streamResponseGetIntermediateFailures: streamResponse.getIntermediateFailures,\n streamResponseGetTokenUsage: streamResponse.getTokenUsage,\n url: this.getUrl(),\n version: VERSION,\n warnings: [...commonParts.warnings, ...warnings, ...streamWarnings],\n });\n\n return {\n request: {\n body: request,\n },\n response: {\n headers: streamResponse.responseHeaders,\n },\n stream: transformedStream,\n };\n } catch (error) {\n throw convertToAISDKError(error, {\n operation: \"doStream\",\n requestBody: createAISDKRequestBodySummary(options),\n url: this.getUrl(),\n });\n }\n }\n\n /**\n * Builds common parts shared between doGenerate and doStream.\n * @param config - Strategy configuration.\n * @param settings - Model settings.\n * @param options - AI SDK call options.\n * @returns Common build result with typed messages and tool choice.\n * @internal\n */\n protected async buildCommonParts(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>> {\n const providerName = getProviderName(config.provider);\n\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAILanguageModelProviderOptions,\n });\n\n const warnings: SharedV3Warning[] = [];\n\n const resolvedState = this.resolveAdditionalState(\n config,\n settings,\n sapOptions,\n options,\n warnings,\n );\n\n const messages = convertToSAPMessages(options.prompt, {\n escapeTemplatePlaceholders: this.getEscapeTemplatePlaceholders(sapOptions, settings),\n includeReasoning: this.getIncludeReasoning(sapOptions, settings),\n parsePartProviderOptions: this.getPartProviderOptionsParser(),\n warnings,\n });\n\n const { modelParams, warnings: paramWarnings } = buildModelParams({\n options,\n paramMappings: this.getParamMappings(),\n providerModelParams: sapOptions?.modelParams,\n settingsModelParams: settings.modelParams,\n });\n warnings.push(...paramWarnings);\n\n const toolChoice = mapToolChoice(options.toolChoice);\n\n return {\n messages,\n modelParams,\n providerName,\n resolvedState,\n sapOptions,\n toolChoice,\n warnings,\n };\n }\n\n /**\n * Builds the API-specific request body.\n * @param config - Strategy configuration.\n * @param settings - Model settings.\n * @param options - AI SDK call options.\n * @param commonParts - Common build result from base class.\n * @returns Request body and accumulated warnings.\n * @internal\n */\n protected abstract buildRequest(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): { readonly request: TRequest; readonly warnings: SharedV3Warning[] };\n\n /**\n * Collects stream-specific warnings.\n * Override in subclasses to add API-specific streaming warnings.\n * @param _settings - Model settings (unused in base implementation).\n * @param _sapOptions - Provider options (unused in base implementation).\n * @returns Array of warnings for streaming operations.\n * @internal\n */\n protected collectStreamWarnings(\n _settings: TSettings,\n _sapOptions?: Record<string, unknown>,\n ): SharedV3Warning[] {\n return [];\n }\n\n /**\n * Creates the appropriate SDK client for this API.\n * @param config - Strategy configuration.\n * @param settings - Model settings.\n * @param commonParts - Common build result (messages, options, etc.).\n * @returns SDK client instance.\n * @internal\n */\n protected abstract createClient(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): TClient;\n\n /**\n * Executes the non-streaming API call.\n * @param client - SDK client instance.\n * @param request - Request body.\n * @param abortSignal - Optional abort signal.\n * @param requestConfig - Optional custom request configuration (e.g. custom headers).\n * @returns SDK response.\n * @internal\n */\n protected abstract executeApiCall(\n client: TClient,\n request: TRequest,\n abortSignal: AbortSignal | undefined,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<SDKResponse>;\n\n /**\n * Executes the streaming API call.\n * @param client - SDK client instance.\n * @param request - Request body.\n * @param abortSignal - Optional abort signal.\n * @param settings - Model settings for API-specific stream options.\n * @param requestConfig - Optional custom request configuration (e.g. custom headers).\n * @returns Stream response with accessors.\n * @internal\n */\n protected abstract executeStreamCall(\n client: TClient,\n request: TRequest,\n abortSignal: AbortSignal | undefined,\n settings: TSettings,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<StreamCallResponse>;\n\n /**\n * Resolves request id, completion id, and normalised headers from an SDK response.\n * @param response - Raw SDK response or stream response.\n * @returns Combined metadata fragment.\n * @internal\n */\n protected extractMetadata(response: unknown): {\n requestId?: string;\n responseHeaders?: Record<string, string>;\n responseId?: string;\n } {\n const responseId = extractCompletionId(\n response as { _data?: unknown; getRequestId?: () => string | undefined },\n this.getCompletionIdPath(),\n );\n const { headers, requestId } = extractResponseMetadata(response, \"rawResponse\");\n return { requestId, responseHeaders: headers, responseId };\n }\n\n /**\n * Returns the API-specific dotted path used to read the completion id off\n * the SDK response's internal `_data` payload.\n * @returns Path traversed under `_data` (e.g. `[\"final_result\",\"id\"]`, `[\"id\"]`).\n * @internal\n */\n protected abstract getCompletionIdPath(): readonly string[];\n\n /**\n * Returns whether to escape template placeholders for this API.\n * @param _sapOptions - Parsed provider options (unused in base implementation).\n * @param _settings - Model settings (unused in base implementation).\n * @returns false by default; Orchestration strategy overrides to return true.\n * @internal\n */\n protected getEscapeTemplatePlaceholders(\n _sapOptions: Record<string, unknown> | undefined,\n _settings: TSettings,\n ): boolean {\n return false;\n }\n\n /**\n * Returns whether to include reasoning in the response.\n * @param sapOptions - Parsed provider options.\n * @param settings - Model settings.\n * @returns Whether to include reasoning (checks sapOptions then settings, defaults to false).\n * @internal\n */\n protected getIncludeReasoning(\n sapOptions: Record<string, unknown> | undefined,\n settings: TSettings,\n ): boolean {\n return (\n (sapOptions?.includeReasoning as boolean | undefined) ?? settings.includeReasoning ?? false\n );\n }\n\n /**\n * Returns the parameter mappings specific to this API strategy.\n * @returns Array of parameter mappings.\n * @internal\n */\n protected abstract getParamMappings(): readonly ParamMapping[];\n\n /**\n * Returns a parser for per-message-part `providerOptions['sap-ai']`.\n *\n * Default returns `undefined`; strategies honouring part-level directives\n * (e.g. Anthropic `cacheControl` on orchestration) override to return a parser.\n * @returns Parser callback, or undefined to disable per-part plumbing.\n * @internal\n */\n protected getPartProviderOptionsParser(): ParsePartProviderOptions | undefined {\n return undefined;\n }\n\n /**\n * Returns the URL identifier for this API (used in error messages).\n * @returns URL string identifier.\n * @internal\n */\n protected abstract getUrl(): string;\n\n /**\n * Resolves API-specific extra state shared between doGenerate and doStream\n * (e.g. orchestration `configRef` / `promptTemplateRef` / `tools`). Override\n * to add API-specific deprecation checks or pre-resolve auxiliary inputs.\n * Pushed warnings flow into the shared sink.\n * @param _config - Strategy configuration.\n * @param _settings - Model settings.\n * @param _sapOptions - Parsed provider options, or `undefined`.\n * @param _options - AI SDK call options.\n * @param _warnings - Shared warnings sink for the current call.\n * @returns Strategy-specific resolved state, or `undefined` (default).\n * @internal\n */\n protected resolveAdditionalState(\n _config: LanguageModelStrategyConfig,\n _settings: TSettings,\n _sapOptions: Record<string, unknown> | undefined,\n _options: LanguageModelV3CallOptions,\n _warnings: SharedV3Warning[],\n ): unknown {\n return undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAUA,SAAS,4BAA4B;AAmE9B,IAAe,4BAAf,MAI0C;AAAA;AAAA;AAAA;AAAA;AAAA,EAK/C,OAAgB,wBAAiD;AAAA,IAC/D,EAAE,cAAc,aAAa,WAAW,mBAAmB,WAAW,wBAAwB;AAAA,IAC9F,EAAE,cAAc,eAAe,WAAW,eAAe,WAAW,cAAc;AAAA,IAClF,EAAE,cAAc,QAAQ,WAAW,QAAQ,WAAW,QAAQ;AAAA,IAC9D;AAAA,MACE,cAAc;AAAA,MACd,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,cAAc;AAAA,MACd,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAAA,IACA,EAAE,cAAc,QAAQ,WAAW,QAAQ,WAAW,OAAO;AAAA,IAC7D,EAAE,WAAW,aAAa,WAAW,mBAAmB;AAAA,IACxD,EAAE,cAAc,uBAAuB,WAAW,sBAAsB;AAAA,EAC1E;AAAA,EAEA,MAAM,WACJ,QACA,UACA,SACwC;AACxC,QAAI;AACF,YAAM,cAAc,MAAM,KAAK,iBAAiB,QAAQ,UAAU,OAAO;AACzE,YAAM,EAAE,SAAS,SAAS,IAAI,KAAK,aAAa,QAAQ,UAAU,SAAS,WAAW;AAEtF,YAAM,SAAS,KAAK,aAAa,QAAQ,UAAU,WAAW;AAE9D,YAAM,WAAW,MAAM,KAAK;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,QAAQ,eAAe;AAAA,QACvB,OAAO;AAAA,MACT;AAEA,aAAO,oBAAoB;AAAA,QACzB,SAAS,OAAO;AAAA,QAChB,cAAc,YAAY;AAAA,QAC1B,aAAa;AAAA,QACb,WAAW,SAAS;AAAA,QACpB;AAAA,QACA,iBAAiB,iBAAiB,SAAS,YAAY,OAAO;AAAA,QAC9D,SAAS;AAAA,QACT,UAAU,CAAC,GAAG,YAAY,UAAU,GAAG,QAAQ;AAAA,MACjD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,oBAAoB,OAAO;AAAA,QAC/B,WAAW;AAAA,QACX,aAAa,8BAA8B,OAAO;AAAA,QAClD,KAAK,KAAK,OAAO;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,QACA,UACA,SACsC;AACtC,QAAI;AACF,YAAM,cAAc,MAAM,KAAK,iBAAiB,QAAQ,UAAU,OAAO;AACzE,YAAM,EAAE,SAAS,SAAS,IAAI,KAAK,aAAa,QAAQ,UAAU,SAAS,WAAW;AAEtF,YAAM,SAAS,KAAK,aAAa,QAAQ,UAAU,WAAW;AAE9D,YAAM,iBAAiB,MAAM,KAAK;AAAA,QAChC;AAAA,QACA;AAAA,QACA,QAAQ,eAAe;AAAA,QACvB;AAAA,QACA,OAAO;AAAA,MACT;AAEA,YAAM,cAAc,IAAI,kBAAkB;AAC1C,YAAM,aAAa,eAAe,cAAc,YAAY,mBAAmB;AAE/E,YAAM,iBAAiB,KAAK,sBAAsB,UAAU,YAAY,UAAU;AAElF,YAAM,oBAAoB,wBAAwB;AAAA,QAChD;AAAA,QACA;AAAA,QACA,kBAAkB,QAAQ,oBAAoB;AAAA,QAC9C,SAAS,OAAO;AAAA,QAChB;AAAA,QACA,cAAc,YAAY;AAAA,QAC1B,WAAW,eAAe;AAAA,QAC1B;AAAA,QACA,WAAW,eAAe;AAAA,QAC1B,4BAA4B,eAAe;AAAA,QAC3C,+BAA+B,eAAe;AAAA,QAC9C,uCAAuC,eAAe;AAAA,QACtD,6BAA6B,eAAe;AAAA,QAC5C,KAAK,KAAK,OAAO;AAAA,QACjB,SAAS;AAAA,QACT,UAAU,CAAC,GAAG,YAAY,UAAU,GAAG,UAAU,GAAG,cAAc;AAAA,MACpE,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA,UAAU;AAAA,UACR,SAAS,eAAe;AAAA,QAC1B;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF,SAAS,OAAO;AACd,YAAM,oBAAoB,OAAO;AAAA,QAC/B,WAAW;AAAA,QACX,aAAa,8BAA8B,OAAO;AAAA,QAClD,KAAK,KAAK,OAAO;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAgB,iBACd,QACA,UACA,SACsE;AACtE,UAAM,eAAe,gBAAgB,OAAO,QAAQ;AAEpD,UAAM,aAAa,MAAM,qBAAqB;AAAA,MAC5C,UAAU;AAAA,MACV,iBAAiB,QAAQ;AAAA,MACzB,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,WAA8B,CAAC;AAErC,UAAM,gBAAgB,KAAK;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,WAAW,qBAAqB,QAAQ,QAAQ;AAAA,MACpD,4BAA4B,KAAK,8BAA8B,YAAY,QAAQ;AAAA,MACnF,kBAAkB,KAAK,oBAAoB,YAAY,QAAQ;AAAA,MAC/D,0BAA0B,KAAK,6BAA6B;AAAA,MAC5D;AAAA,IACF,CAAC;AAED,UAAM,EAAE,aAAa,UAAU,cAAc,IAAI,iBAAiB;AAAA,MAChE;AAAA,MACA,eAAe,KAAK,iBAAiB;AAAA,MACrC,qBAAqB,YAAY;AAAA,MACjC,qBAAqB,SAAS;AAAA,IAChC,CAAC;AACD,aAAS,KAAK,GAAG,aAAa;AAE9B,UAAM,aAAa,cAAc,QAAQ,UAAU;AAEnD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BU,sBACR,WACA,aACmB;AACnB,WAAO,CAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwDU,gBAAgB,UAIxB;AACA,UAAM,aAAa;AAAA,MACjB;AAAA,MACA,KAAK,oBAAoB;AAAA,IAC3B;AACA,UAAM,EAAE,SAAS,UAAU,IAAI,wBAAwB,UAAU,aAAa;AAC9E,WAAO,EAAE,WAAW,iBAAiB,SAAS,WAAW;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBU,8BACR,aACA,WACS;AACT,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASU,oBACR,YACA,UACS;AACT,WACG,YAAY,oBAA4C,SAAS,oBAAoB;AAAA,EAE1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBU,+BAAqE;AAC7E,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBU,uBACR,SACA,WACA,aACA,UACA,WACS;AACT,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/base-language-model-strategy.ts"],"sourcesContent":["/** Base class for language model strategies using the Template Method pattern. */\nimport type {\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { ChatMessage } from \"@sap-ai-sdk/orchestration\";\n\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\n\nimport type { ParsePartProviderOptions } from \"./sap-ai-provider-options.js\";\nimport type { SAPAIModelSettings } from \"./sap-ai-settings.js\";\nimport type { LanguageModelAPIStrategy, LanguageModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport { convertToSAPMessages } from \"./convert-to-sap-messages.js\";\nimport { convertToAISDKError, normalizeHeaders } from \"./sap-ai-error.js\";\nimport { getProviderName, sapAILanguageModelProviderOptions } from \"./sap-ai-provider-options.js\";\nimport {\n buildGenerateResult,\n buildModelParams,\n createAISDKRequestBodySummary,\n createStreamTransformer,\n extractCompletionId,\n extractResponseMetadata,\n mapToolChoice,\n type ParamMapping,\n type SAPToolChoice,\n type SDKCitation,\n type SDKResponse,\n type SDKStreamChunk,\n type SDKTokenUsage,\n StreamIdGenerator,\n} from \"./strategy-utils.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * Result of building common parts for a language model request.\n * @template TMessages - The message array type (e.g., `ChatMessage[]`, `AzureOpenAiChatCompletionRequestMessage[]`)\n * @template TToolChoice - The tool choice type (e.g., `SAPToolChoice`)\n * @internal\n */\nexport interface CommonBuildResult<TMessages extends unknown[] = unknown[], TToolChoice = unknown> {\n readonly messages: TMessages;\n readonly modelParams: Record<string, unknown>;\n readonly providerName: string;\n readonly resolvedState?: unknown;\n readonly sapOptions: Record<string, unknown> | undefined;\n readonly toolChoice: TToolChoice;\n readonly warnings: SharedV3Warning[];\n}\n\n/**\n * Stream response shape returned by executeStreamCall.\n * @internal\n */\nexport interface StreamCallResponse {\n readonly getCitations?: () => SDKCitation[] | undefined;\n readonly getFinishReason: () => null | string | undefined;\n readonly getIntermediateFailures?: () => undefined | unknown[];\n readonly getTokenUsage: () => null | SDKTokenUsage | undefined;\n /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n readonly requestId?: string;\n readonly responseHeaders?: Record<string, string>;\n /** Server-provided completion ID extracted from _data, if available. */\n readonly responseId?: string;\n readonly stream: AsyncIterable<SDKStreamChunk>;\n}\n\n/**\n * Abstract base class for language model strategies using the Template Method pattern.\n * @template TClient - The SDK client type (e.g., AzureOpenAiChatClient, OrchestrationClient).\n * @template TRequest - The API request type (e.g., AzureOpenAiChatCompletionParameters).\n * @template TSettings - The model settings type extending SAPAIModelSettings.\n * @internal\n */\nexport abstract class BaseLanguageModelStrategy<\n TClient,\n TRequest,\n TSettings extends SAPAIModelSettings = SAPAIModelSettings,\n> implements LanguageModelAPIStrategy<TSettings> {\n /**\n * Common parameter mappings for language model APIs.\n * @internal\n */\n static readonly COMMON_PARAM_MAPPINGS: readonly ParamMapping[] = [\n { camelCaseKey: \"maxTokens\", optionKey: \"maxOutputTokens\", outputKey: \"max_completion_tokens\" },\n { camelCaseKey: \"temperature\", optionKey: \"temperature\", outputKey: \"temperature\" },\n { camelCaseKey: \"topP\", optionKey: \"topP\", outputKey: \"top_p\" },\n {\n camelCaseKey: \"frequencyPenalty\",\n optionKey: \"frequencyPenalty\",\n outputKey: \"frequency_penalty\",\n },\n {\n camelCaseKey: \"presencePenalty\",\n optionKey: \"presencePenalty\",\n outputKey: \"presence_penalty\",\n },\n { camelCaseKey: \"seed\", optionKey: \"seed\", outputKey: \"seed\" },\n { optionKey: \"reasoning\", outputKey: \"reasoning_effort\" },\n { camelCaseKey: \"parallel_tool_calls\", outputKey: \"parallel_tool_calls\" },\n ] as const;\n\n async doGenerate(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n try {\n const commonParts = await this.buildCommonParts(config, settings, options);\n const { request, warnings } = this.buildRequest(config, settings, options, commonParts);\n\n const client = this.createClient(config, settings, commonParts);\n\n const response = await this.executeApiCall(\n client,\n request,\n options.abortSignal ?? undefined,\n config.requestConfig,\n );\n\n return buildGenerateResult({\n modelId: config.modelId,\n providerName: commonParts.providerName,\n requestBody: request,\n requestId: response.requestId,\n response,\n responseHeaders: normalizeHeaders(response.rawResponse.headers),\n version: VERSION,\n warnings: [...commonParts.warnings, ...warnings],\n });\n } catch (error) {\n throw convertToAISDKError(error, {\n operation: \"doGenerate\",\n requestBody: createAISDKRequestBodySummary(options),\n url: this.getUrl(),\n });\n }\n }\n\n async doStream(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n try {\n const commonParts = await this.buildCommonParts(config, settings, options);\n const { request, warnings } = this.buildRequest(config, settings, options, commonParts);\n\n const client = this.createClient(config, settings, commonParts);\n\n const streamResponse = await this.executeStreamCall(\n client,\n request,\n options.abortSignal ?? undefined,\n settings,\n config.requestConfig,\n );\n\n const idGenerator = new StreamIdGenerator();\n const responseId = streamResponse.responseId ?? idGenerator.generateResponseId();\n\n const streamWarnings = this.collectStreamWarnings(settings, commonParts.sapOptions);\n\n const transformedStream = createStreamTransformer({\n convertToAISDKError,\n idGenerator,\n includeRawChunks: options.includeRawChunks ?? false,\n modelId: config.modelId,\n options,\n providerName: commonParts.providerName,\n requestId: streamResponse.requestId,\n responseId,\n sdkStream: streamResponse.stream,\n streamResponseGetCitations: streamResponse.getCitations,\n streamResponseGetFinishReason: streamResponse.getFinishReason,\n streamResponseGetIntermediateFailures: streamResponse.getIntermediateFailures,\n streamResponseGetTokenUsage: streamResponse.getTokenUsage,\n url: this.getUrl(),\n version: VERSION,\n warnings: [...commonParts.warnings, ...warnings, ...streamWarnings],\n });\n\n return {\n request: {\n body: request,\n },\n response: {\n headers: streamResponse.responseHeaders,\n },\n stream: transformedStream,\n };\n } catch (error) {\n throw convertToAISDKError(error, {\n operation: \"doStream\",\n requestBody: createAISDKRequestBodySummary(options),\n url: this.getUrl(),\n });\n }\n }\n\n /**\n * Builds common parts shared between doGenerate and doStream.\n * @param config - Strategy configuration.\n * @param settings - Model settings.\n * @param options - AI SDK call options.\n * @returns Common build result with typed messages and tool choice.\n * @internal\n */\n protected async buildCommonParts(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): Promise<CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>> {\n const providerName = getProviderName(config.provider);\n\n const sapOptions = await parseProviderOptions({\n provider: providerName,\n providerOptions: options.providerOptions,\n schema: sapAILanguageModelProviderOptions,\n });\n\n const warnings: SharedV3Warning[] = [];\n\n const resolvedState = this.resolveAdditionalState(\n config,\n settings,\n sapOptions,\n options,\n warnings,\n );\n\n const messages = convertToSAPMessages(options.prompt, {\n escapeTemplatePlaceholders: this.getEscapeTemplatePlaceholders(sapOptions, settings),\n includeReasoning: this.getIncludeReasoning(sapOptions, settings),\n parsePartProviderOptions: this.getPartProviderOptionsParser(),\n warnings,\n });\n\n const { modelParams, warnings: paramWarnings } = buildModelParams({\n options,\n paramMappings: this.getParamMappings(),\n providerModelParams: sapOptions?.modelParams,\n settingsModelParams: settings.modelParams,\n });\n warnings.push(...paramWarnings);\n\n const toolChoice = mapToolChoice(options.toolChoice);\n\n return {\n messages,\n modelParams,\n providerName,\n resolvedState,\n sapOptions,\n toolChoice,\n warnings,\n };\n }\n\n /**\n * Builds the API-specific request body.\n * @param config - Strategy configuration.\n * @param settings - Model settings.\n * @param options - AI SDK call options.\n * @param commonParts - Common build result from base class.\n * @returns Request body and accumulated warnings.\n * @internal\n */\n protected abstract buildRequest(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): { readonly request: TRequest; readonly warnings: SharedV3Warning[] };\n\n /**\n * Collects stream-specific warnings.\n * Override in subclasses to add API-specific streaming warnings.\n * @param _settings - Model settings (unused in base implementation).\n * @param _sapOptions - Provider options (unused in base implementation).\n * @returns Array of warnings for streaming operations.\n * @internal\n */\n protected collectStreamWarnings(\n _settings: TSettings,\n _sapOptions?: Record<string, unknown>,\n ): SharedV3Warning[] {\n return [];\n }\n\n /**\n * Creates the appropriate SDK client for this API.\n * @param config - Strategy configuration.\n * @param settings - Model settings.\n * @param commonParts - Common build result (messages, options, etc.).\n * @returns SDK client instance.\n * @internal\n */\n protected abstract createClient(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): TClient;\n\n /**\n * Executes the non-streaming API call.\n * @param client - SDK client instance.\n * @param request - Request body.\n * @param abortSignal - Optional abort signal.\n * @param requestConfig - Optional custom request configuration (e.g. custom headers).\n * @returns SDK response.\n * @internal\n */\n protected abstract executeApiCall(\n client: TClient,\n request: TRequest,\n abortSignal: AbortSignal | undefined,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<SDKResponse>;\n\n /**\n * Executes the streaming API call.\n * @param client - SDK client instance.\n * @param request - Request body.\n * @param abortSignal - Optional abort signal.\n * @param settings - Model settings for API-specific stream options.\n * @param requestConfig - Optional custom request configuration (e.g. custom headers).\n * @returns Stream response with accessors.\n * @internal\n */\n protected abstract executeStreamCall(\n client: TClient,\n request: TRequest,\n abortSignal: AbortSignal | undefined,\n settings: TSettings,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<StreamCallResponse>;\n\n /**\n * Resolves request id, completion id, and normalised headers from an SDK response.\n * @param response - Raw SDK response or stream response.\n * @returns Combined metadata fragment.\n * @internal\n */\n protected extractMetadata(response: unknown): {\n requestId?: string;\n responseHeaders?: Record<string, string>;\n responseId?: string;\n } {\n const responseId = extractCompletionId(\n response as { _data?: unknown; getRequestId?: () => string | undefined },\n this.getCompletionIdPath(),\n );\n const { headers, requestId } = extractResponseMetadata(response, \"rawResponse\");\n return { requestId, responseHeaders: headers, responseId };\n }\n\n /**\n * Returns the API-specific dotted path used to read the completion id off\n * the SDK response's internal `_data` payload.\n * @returns Path traversed under `_data` (e.g. `[\"final_result\",\"id\"]`, `[\"id\"]`).\n * @internal\n */\n protected abstract getCompletionIdPath(): readonly string[];\n\n /**\n * Returns whether to escape template placeholders for this API.\n * @param _sapOptions - Parsed provider options (unused in base implementation).\n * @param _settings - Model settings (unused in base implementation).\n * @returns false by default; the Orchestration override defaults to true unless disabled.\n * @internal\n */\n protected getEscapeTemplatePlaceholders(\n _sapOptions: Record<string, unknown> | undefined,\n _settings: TSettings,\n ): boolean {\n return false;\n }\n\n /**\n * Returns whether assistant reasoning in the input history is forwarded as text.\n * @param sapOptions - Parsed provider options.\n * @param settings - Model settings.\n * @returns Whether to forward input reasoning (checks sapOptions then settings, defaults to false).\n * @internal\n */\n protected getIncludeReasoning(\n sapOptions: Record<string, unknown> | undefined,\n settings: TSettings,\n ): boolean {\n return (\n (sapOptions?.includeReasoning as boolean | undefined) ?? settings.includeReasoning ?? false\n );\n }\n\n /**\n * Returns the parameter mappings specific to this API strategy.\n * @returns Array of parameter mappings.\n * @internal\n */\n protected abstract getParamMappings(): readonly ParamMapping[];\n\n /**\n * Returns a parser for per-message-part `providerOptions['sap-ai']`.\n *\n * Default returns `undefined`; strategies honouring part-level directives\n * (e.g. Anthropic `cacheControl` on orchestration) override to return a parser.\n * @returns Parser callback, or undefined to disable per-part plumbing.\n * @internal\n */\n protected getPartProviderOptionsParser(): ParsePartProviderOptions | undefined {\n return undefined;\n }\n\n /**\n * Returns the URL identifier for this API (used in error messages).\n * @returns URL string identifier.\n * @internal\n */\n protected abstract getUrl(): string;\n\n /**\n * Resolves API-specific extra state shared between doGenerate and doStream\n * (e.g. orchestration `configRef` / `promptTemplateRef` / `tools`). Override\n * to add API-specific deprecation checks or pre-resolve auxiliary inputs.\n * Pushed warnings flow into the shared sink.\n * @param _config - Strategy configuration.\n * @param _settings - Model settings.\n * @param _sapOptions - Parsed provider options, or `undefined`.\n * @param _options - AI SDK call options.\n * @param _warnings - Shared warnings sink for the current call.\n * @returns Strategy-specific resolved state, or `undefined` (default).\n * @internal\n */\n protected resolveAdditionalState(\n _config: LanguageModelStrategyConfig,\n _settings: TSettings,\n _sapOptions: Record<string, unknown> | undefined,\n _options: LanguageModelV3CallOptions,\n _warnings: SharedV3Warning[],\n ): unknown {\n return undefined;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
normalizeHeaders,
|
|
6
6
|
sapAIEmbeddingProviderOptions,
|
|
7
7
|
validateModelParamsWithWarnings
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-2KOXKYVT.js";
|
|
9
9
|
|
|
10
10
|
// src/strategy-utils.ts
|
|
11
11
|
import { TooManyEmbeddingValuesForCallError } from "@ai-sdk/provider";
|
|
@@ -825,4 +825,4 @@ export {
|
|
|
825
825
|
normalizeEmbedding,
|
|
826
826
|
prepareEmbeddingCall
|
|
827
827
|
};
|
|
828
|
-
//# sourceMappingURL=chunk-
|
|
828
|
+
//# sourceMappingURL=chunk-AFZC2DH2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/strategy-utils.ts","../src/stream-transformer.ts"],"sourcesContent":["/**\n * Shared utilities for SAP AI Core strategy implementations.\n */\nimport type {\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Embedding,\n EmbeddingModelV3Result,\n JSONArray,\n JSONObject,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3FunctionTool,\n LanguageModelV3GenerateResult,\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 { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type { ZodType } from \"zod\";\n\nimport { TooManyEmbeddingValuesForCallError } from \"@ai-sdk/provider\";\nimport { parseProviderOptions } from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\n\nimport type { ParsePartProviderOptions } from \"./sap-ai-provider-options.js\";\n\nimport { deepMerge } from \"./deep-merge.js\";\nimport { normalizeHeaders } from \"./sap-ai-error.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\" } | { type: \"auto\" } | { type: \"none\" } | { type: \"required\" };\n\n/**\n * Anthropic prompt-cache breakdown surfaced via `providerMetadata[providerName].cacheUsage`.\n *\n * Mirrors the per-TTL ephemeral bucket shape returned by the SAP AI SDK token usage\n * payload (`prompt_tokens_details.cache_creation_token_details`).\n * @internal\n */\nexport type AnthropicCacheUsage = NonNullable<\n NonNullable<SDKTokenUsage[\"prompt_tokens_details\"]>[\"cache_creation_token_details\"]\n>;\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 * Optional plumbing accepted by `convertToolsToSAPFormat`.\n *\n * Strategies that honour per-tool `providerOptions['sap-ai']` (e.g. orchestration\n * Anthropic `cacheControl`) supply a `parser`; Foundation Models omits it.\n * @internal\n */\nexport interface ConvertToolsOptions {\n readonly parser?: ParsePartProviderOptions;\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 requestId?: string;\n readonly responseHeaders?: Record<string, string>;\n readonly totalTokens: number;\n readonly version: string;\n readonly warnings?: readonly SharedV3Warning[];\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 /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n readonly requestId?: string;\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 * Response metadata extracted from an SDK response: server-provided request id\n * and normalised HTTP headers.\n * @internal\n */\nexport interface ResponseMetadata {\n readonly headers: Record<string, string> | undefined;\n readonly requestId: string | undefined;\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 cache_control?: { ttl?: \"1h\" | \"5m\"; type: \"ephemeral\" };\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\" | \"none\" | \"required\" | { 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 /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n requestId?: string;\n responseId?: string;\n}\n\nexport {\n createInitialStreamState,\n createStreamTransformer,\n StreamIdGenerator,\n type StreamState,\n type StreamTransformerConfig,\n type ToolCallInProgress,\n} from \"./stream-transformer.js\";\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 accepted_prediction_tokens?: number;\n audio_tokens?: number;\n reasoning_tokens?: number;\n rejected_prediction_tokens?: number;\n };\n prompt_tokens?: number;\n prompt_tokens_details?: {\n audio_tokens?: number;\n cache_creation_token_details?: {\n ephemeral_1h_input_tokens?: number;\n ephemeral_5m_input_tokens?: number;\n };\n cache_creation_tokens?: number;\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 * 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 * Returns the Anthropic prompt-caching slice of `providerMetadata[provider]` as a\n * spread-ready fragment.\n *\n * Returns `{ cacheUsage }` when at least one ephemeral TTL bucket is populated;\n * otherwise `{}` so callers can `...` it unconditionally.\n * @param tokenUsage - Raw token usage from the SAP SDK response.\n * @returns Spread-ready provider-metadata fragment.\n * @internal\n */\nexport function buildAnthropicCacheMetadata(tokenUsage: null | SDKTokenUsage | undefined): {\n cacheUsage?: AnthropicCacheUsage;\n} {\n const details = tokenUsage?.prompt_tokens_details?.cache_creation_token_details;\n if (\n !details ||\n ((details.ephemeral_5m_input_tokens ?? 0) === 0 &&\n (details.ephemeral_1h_input_tokens ?? 0) === 0)\n ) {\n return {};\n }\n return { cacheUsage: details };\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 {\n embeddings,\n modelId,\n providerName,\n requestId,\n responseHeaders,\n totalTokens,\n version,\n warnings,\n } = config;\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [providerName]: {\n model: modelId,\n ...(requestId ? { requestId } : {}),\n version,\n },\n };\n\n return {\n embeddings,\n providerMetadata,\n ...(responseHeaders ? { response: { headers: responseHeaders } } : {}),\n usage: { tokens: totalTokens },\n warnings: warnings ? [...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 {\n modelId,\n providerName,\n requestBody,\n requestId,\n response,\n responseHeaders,\n version,\n 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 ...buildAnthropicCacheMetadata(tokenUsage),\n finishReason: finishReasonRaw ?? \"unknown\",\n finishReasonMapped: finishReason,\n ...(intermediateFailures?.length\n ? { intermediateFailures: sanitizeAsJSONArray(intermediateFailures) }\n : {}),\n ...(requestId ? { requestId } : {}),\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,\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 * Computes the non-cached prompt tokens from a prompt-token total and its cache slices.\n *\n * Returns `undefined` when the total is unknown. Returns the total unchanged when no\n * cache breakdown is reported. Otherwise subtracts both cache buckets and clamps the\n * result at zero to defend against inconsistent SDK token counts where\n * `cached + cacheWrite > prompt`.\n * @param promptTokens - Total prompt tokens reported by the SDK.\n * @param cachedTokens - Tokens served from the prompt cache.\n * @param cacheWriteTokens - Tokens written to the prompt cache.\n * @returns The non-cached prompt token count, or `undefined` when unknown.\n * @internal\n */\nexport function computeNoCache(\n promptTokens: number | undefined,\n cachedTokens: number | undefined,\n cacheWriteTokens: number | undefined,\n): number | undefined {\n if (promptTokens == null) {\n return undefined;\n }\n if (cachedTokens == null && cacheWriteTokens == null) {\n return promptTokens;\n }\n return Math.max(0, promptTokens - (cachedTokens ?? 0) - (cacheWriteTokens ?? 0));\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 * @param options - Optional per-tool parsing config.\n * @param options.parser - Reads per-tool `providerOptions['sap-ai']` and returns parsed directives, or `undefined` when none apply.\n * @param options.warnings - Sink for Zod validation issues raised while parsing.\n * @returns The converted tools and any warnings.\n * @internal\n */\nexport function convertToolsToSAPFormat<T extends SAPTool<unknown>>(\n tools: AISDKTool[] | undefined,\n options: ConvertToolsOptions = {},\n): ConvertedToolsResult<T> {\n const { parser, warnings: parserWarnings } = options;\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 functionTool = tool as LanguageModelV3FunctionTool;\n const { parameters, warning } = extractToolParameters(functionTool);\n if (warning) {\n warnings.push(warning);\n }\n\n const cacheControl = parser?.(functionTool.providerOptions, parserWarnings)?.cacheControl;\n\n return {\n ...(cacheControl ? { cache_control: cacheControl } : {}),\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 * Resolves the SDK completion identifier from an internal `_data` payload, falling back to\n * the pipeline request id reported by `getRequestId()` when the path is not present.\n *\n * Tolerates SDKs that omit `_data` entirely or expose `getRequestId()` as a non-function.\n * @param response - SDK response object exposing `_data` and optionally `getRequestId()`.\n * @param response._data - Internal SDK payload that holds the completion id under `dataPath`.\n * @param response.getRequestId - Function returning the SAP AI Core pipeline request id.\n * @param dataPath - Dotted property path traversed under `_data` (e.g. `[\"final_result\",\"id\"]`).\n * @returns The first non-empty completion id found along the path, or `undefined`.\n * @internal\n */\nexport function extractCompletionId(\n response: { _data?: unknown; getRequestId?: () => string | undefined },\n dataPath: readonly string[],\n): string | undefined {\n let cursor: unknown = response._data;\n for (const key of dataPath) {\n if (cursor !== null && typeof cursor === \"object\" && key in cursor) {\n cursor = (cursor as Record<string, unknown>)[key];\n } else {\n cursor = undefined;\n break;\n }\n }\n if (typeof cursor === \"string\" && cursor.length > 0) {\n return cursor;\n }\n const fn = response.getRequestId;\n if (typeof fn !== \"function\") {\n return undefined;\n }\n try {\n const rid = fn.call(response);\n return typeof rid === \"string\" && rid.length > 0 ? rid : undefined;\n } catch {\n return undefined;\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 the request id and normalised headers from an SDK response.\n *\n * Resolves `requestId` from `getRequestId()` first; when absent, falls back to the\n * `x-request-id` header. Tolerates SDKs that omit `getRequestId`, expose it as a\n * non-function, or raise from the `headers` accessor. `field` selects the underlying\n * HttpResponse wrapper (`rawResponse` for foundation-models, `response` for orchestration).\n * @param response - SDK response object.\n * @param field - Property containing the underlying HttpResponse wrapper.\n * @returns Combined `{ requestId, headers }` with both fields defensively gathered.\n * @internal\n */\nexport function extractResponseMetadata(\n response: unknown,\n field: \"rawResponse\" | \"response\",\n): ResponseMetadata {\n let requestId: string | undefined;\n const fn = (response as null | { getRequestId?: unknown })?.getRequestId;\n if (typeof fn === \"function\") {\n try {\n const value = (fn as () => string | undefined).call(response);\n requestId = typeof value === \"string\" && value.length > 0 ? value : undefined;\n } catch {\n requestId = undefined;\n }\n }\n\n let rawHeaders: unknown;\n try {\n const wrapper = (response as null | Record<string, unknown>)?.[field] as\n undefined | { headers?: unknown };\n rawHeaders = wrapper?.headers;\n } catch {\n rawHeaders = undefined;\n }\n const headers = rawHeaders === undefined ? undefined : normalizeHeaders(rawHeaders);\n\n if (requestId === undefined && typeof headers?.[\"x-request-id\"] === \"string\") {\n requestId = headers[\"x-request-id\"];\n }\n\n return { headers, requestId };\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 case \"guardrail_intervened\":\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 case \"tool_use\":\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 *\n * `usage.raw` is populated only when the SDK reports fields not represented in\n * `inputTokens` / `outputTokens` (audio or prediction-token buckets); otherwise omitted.\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 cacheWriteTokens = tokenUsage?.prompt_tokens_details?.cache_creation_tokens;\n const reasoningTokens = tokenUsage?.completion_tokens_details?.reasoning_tokens;\n const promptTokens = tokenUsage?.prompt_tokens;\n\n const promptDetails = tokenUsage?.prompt_tokens_details;\n const completionDetails = tokenUsage?.completion_tokens_details;\n const hasUnmappedFields =\n promptDetails?.audio_tokens != null ||\n completionDetails?.audio_tokens != null ||\n completionDetails?.accepted_prediction_tokens != null ||\n completionDetails?.rejected_prediction_tokens != null;\n\n return {\n inputTokens: {\n cacheRead: cachedTokens,\n cacheWrite: cacheWriteTokens,\n noCache: computeNoCache(promptTokens, cachedTokens, cacheWriteTokens),\n total: promptTokens,\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 ...(hasUnmappedFields && tokenUsage ? { raw: sanitizeAsJSONObject(tokenUsage) } : {}),\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 * Merges provider-level `requestConfig` with the per-call `abortSignal`.\n *\n * The AI SDK `abortSignal` always wins: any `signal` present on `requestConfig` is\n * dropped so callers cannot accidentally bypass the abort contract described in the\n * JSDoc of `SAPAIProviderSettings.requestConfig`.\n * @param requestConfig - Provider-level custom request configuration.\n * @param abortSignal - Per-call abort signal from the AI SDK.\n * @returns Merged configuration, or `undefined` when there is nothing to forward.\n * @internal\n */\nexport function mergeRequestConfig(\n requestConfig: CustomRequestConfig | undefined,\n abortSignal: AbortSignal | undefined,\n): CustomRequestConfig | undefined {\n const { signal: _dropped, ...rest } = requestConfig ?? {};\n if (abortSignal) return { ...rest, signal: abortSignal };\n return Object.keys(rest).length > 0 ? rest : undefined;\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\nconst jsonReplacer = (_key: string, value: unknown): unknown =>\n typeof value === \"bigint\" ? value.toString() : value;\n\n/**\n * Coerces an array into a JSON-conformant payload suitable for `providerMetadata` values.\n *\n * Non-serialisable entries (functions, symbols, `undefined`) are dropped or replaced\n * by `null` per `JSON.stringify` defaults. Bigint values become decimal strings.\n * Returns an empty array when the entire payload cannot be serialised (e.g. circular\n * references).\n * @param value - Candidate array.\n * @returns JSON-safe array.\n * @internal\n */\nexport function sanitizeAsJSONArray(value: readonly unknown[]): JSONArray {\n try {\n return JSON.parse(JSON.stringify(value, jsonReplacer)) as JSONArray;\n } catch {\n return [];\n }\n}\n\n/**\n * Coerces an object into a JSON-conformant payload suitable for `providerMetadata` or\n * `LanguageModelV3Usage.raw`.\n *\n * Non-serialisable values are dropped per `JSON.stringify` defaults. Bigint values\n * become decimal strings. Returns an empty object when the entire payload cannot be\n * serialised.\n * @param value - Candidate object.\n * @returns JSON-safe object.\n * @internal\n */\nexport function sanitizeAsJSONObject(value: object): JSONObject {\n try {\n return JSON.parse(JSON.stringify(value, jsonReplacer)) as JSONObject;\n } catch {\n return {};\n }\n}\n","/**\n * Stream transformer for converting SAP AI SDK streaming responses\n * into Vercel AI SDK LanguageModelV3StreamPart events.\n */\nimport type {\n LanguageModelV3CallOptions,\n LanguageModelV3FinishReason,\n LanguageModelV3StreamPart,\n LanguageModelV3Usage,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\n\nimport { convertAsyncIteratorToReadableStream } from \"@ai-sdk/provider-utils\";\n\nimport type {\n SDKCitation,\n SDKDeltaToolCall,\n SDKStreamChunk,\n SDKTokenUsage,\n} from \"./strategy-utils.js\";\n\nimport {\n buildAnthropicCacheMetadata,\n createAISDKRequestBodySummary,\n mapFinishReason,\n mapTokenUsage,\n sanitizeAsJSONArray,\n} from \"./strategy-utils.js\";\n\n/**\n * @internal\n */\nexport interface StreamState {\n activeText: boolean;\n finishReason: LanguageModelV3FinishReason;\n isFirstChunk: boolean;\n usage: LanguageModelV3Usage;\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 /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n readonly requestId?: 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 | undefined;\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 * @returns A UUID string for identifying a tool call when the API does not provide one.\n */\n generateToolCallId(): string {\n return crypto.randomUUID();\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 requestId,\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 /**\n * Emits tool-input-start and replays any buffered arguments as a delta.\n * @param tc - The in-progress tool call state.\n * @param controller - The transform stream controller to enqueue events into.\n */\n function emitToolInputStart(\n tc: ToolCallInProgress,\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n ): void {\n if (tc.didEmitInputStart || tc.id == null) return;\n tc.didEmitInputStart = true;\n controller.enqueue({\n id: tc.id,\n toolName: tc.toolName ?? \"\",\n type: \"tool-input-start\",\n });\n if (tc.arguments.length > 0) {\n controller.enqueue({\n delta: tc.arguments,\n id: tc.id,\n type: \"tool-input-delta\",\n });\n }\n }\n\n return convertAsyncIteratorToReadableStream(\n safeIterate(sdkStream)[Symbol.asyncIterator](),\n ).pipeThrough(\n new TransformStream<Error | SDKStreamChunk, LanguageModelV3StreamPart>({\n flush(controller) {\n const didEmitAnyToolCalls = finalizeToolCalls(\n controller,\n toolCallsInProgress,\n idGenerator,\n emitToolInputStart,\n );\n\n if (streamState.activeText && textBlockId) {\n controller.enqueue({ id: textBlockId, type: \"text-end\" });\n }\n\n const finalFinishReason = streamResponseGetFinishReason();\n if (finalFinishReason) {\n streamState.finishReason = mapFinishReason(finalFinishReason);\n } else if (didEmitAnyToolCalls) {\n streamState.finishReason = {\n raw: undefined,\n unified: \"tool-calls\",\n };\n }\n\n const finalUsage = streamResponseGetTokenUsage();\n if (finalUsage) {\n streamState.usage = mapTokenUsage(finalUsage);\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 ...buildAnthropicCacheMetadata(finalUsage),\n finishReason: streamState.finishReason.raw ?? \"unknown\",\n finishReasonMapped: streamState.finishReason,\n ...(streamIntermediateFailures?.length\n ? {\n intermediateFailures: sanitizeAsJSONArray(streamIntermediateFailures),\n }\n : {}),\n ...(requestId ? { requestId } : {}),\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 handleStreamError(chunk, controller, convertToAISDKError, options, url);\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 textBlockId = handleTextDelta(\n deltaContent,\n controller,\n streamState,\n textBlockId,\n idGenerator,\n );\n }\n\n if (Array.isArray(deltaToolCalls) && deltaToolCalls.length > 0) {\n handleToolCallDeltas(deltaToolCalls, controller, toolCallsInProgress, emitToolInputStart);\n }\n\n const chunkFinishReason = chunk.getFinishReason();\n if (chunkFinishReason) {\n streamState.finishReason = mapFinishReason(chunkFinishReason);\n\n if (streamState.finishReason.unified === \"tool-calls\") {\n finalizeToolCalls(controller, toolCallsInProgress, idGenerator, emitToolInputStart);\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 * Finalizes pending tool calls by emitting tool-input-end and tool-call events.\n * @param controller - The transform stream controller.\n * @param toolCallsInProgress - Map of in-progress tool calls.\n * @param idGenerator - ID generator for tool calls without IDs.\n * @param emitToolInputStart - Function to emit tool-input-start events.\n * @returns Whether any tool calls were finalized.\n * @internal\n */\nfunction finalizeToolCalls(\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolCallsInProgress: Map<number, ToolCallInProgress>,\n idGenerator: StreamIdGenerator,\n emitToolInputStart: (\n tc: ToolCallInProgress,\n ctrl: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n ) => void,\n): boolean {\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 tc.id ??= idGenerator.generateToolCallId();\n emitToolInputStart(tc, controller);\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 return didEmitAnyToolCalls;\n}\n\n/**\n * Handles a stream error by converting it and enqueuing an error event.\n * @param error - The error from the stream iteration.\n * @param controller - The transform stream controller.\n * @param convertToAISDKError - Error conversion function.\n * @param options - Language model call options for context.\n * @param url - The request URL for error context.\n * @internal\n */\nfunction handleStreamError(\n error: Error,\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n convertToAISDKError: StreamTransformerConfig[\"convertToAISDKError\"],\n options: LanguageModelV3CallOptions,\n url: string,\n): void {\n const aiError = convertToAISDKError(error, {\n operation: \"doStream\",\n requestBody: createAISDKRequestBodySummary(options),\n url,\n });\n controller.enqueue({\n error: aiError instanceof Error ? aiError : new Error(String(aiError)),\n type: \"error\",\n });\n controller.terminate();\n}\n\n/**\n * Handles a text delta by managing text block lifecycle.\n * @param deltaContent - The text delta content.\n * @param controller - The transform stream controller.\n * @param streamState - The current stream state.\n * @param currentTextBlockId - The current text block ID (or null).\n * @param idGenerator - ID generator for new text blocks.\n * @returns The current text block ID (may be newly created).\n * @internal\n */\nfunction handleTextDelta(\n deltaContent: string,\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n streamState: StreamState,\n currentTextBlockId: null | string,\n idGenerator: StreamIdGenerator,\n): string {\n let textBlockId = currentTextBlockId;\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 return textBlockId;\n }\n return currentTextBlockId ?? idGenerator.generateTextBlockId();\n}\n\n/**\n * Handles tool call delta chunks by assembling tool calls progressively.\n * @param deltaToolCalls - The tool call delta chunks from the stream.\n * @param controller - The transform stream controller.\n * @param toolCallsInProgress - Map of in-progress tool calls by index.\n * @param emitToolInputStart - Function to emit tool-input-start events.\n * @internal\n */\nfunction handleToolCallDeltas(\n deltaToolCalls: SDKDeltaToolCall[],\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolCallsInProgress: Map<number, ToolCallInProgress>,\n emitToolInputStart: (\n tc: ToolCallInProgress,\n ctrl: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n ) => void,\n): void {\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:\n typeof toolCallChunk.id === \"string\" && toolCallChunk.id.length > 0\n ? toolCallChunk.id\n : undefined,\n toolName: toolCallChunk.function?.name,\n });\n }\n\n const tc = toolCallsInProgress.get(index);\n if (!tc) continue;\n\n if (\n typeof toolCallChunk.id === \"string\" &&\n toolCallChunk.id.length > 0 &&\n tc.id === undefined\n ) {\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 != null && tc.id != null) {\n emitToolInputStart(tc, controller);\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 && tc.id != null) {\n controller.enqueue({\n delta: argumentsDelta,\n id: tc.id,\n type: \"tool-input-delta\",\n });\n }\n }\n }\n}\n\n/**\n * Wraps an async iterable to catch iteration errors and yield them as values.\n *\n * Intentionally single-error: after yielding the first Error, this generator completes.\n * The downstream TransformStream terminates via `controller.error()` on receiving an Error,\n * so no further values would be consumed. This is a cooperative contract — the stream\n * pipeline guarantees no reads after the first error event.\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":[]}
|
|
@@ -2,12 +2,12 @@ import {createRequire as __createRequire} from 'module';var require=__createRequ
|
|
|
2
2
|
import {
|
|
3
3
|
buildEmbeddingResult,
|
|
4
4
|
prepareEmbeddingCall
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-AFZC2DH2.js";
|
|
6
6
|
import {
|
|
7
7
|
VERSION,
|
|
8
8
|
convertToAISDKError,
|
|
9
9
|
deepMerge
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-2KOXKYVT.js";
|
|
11
11
|
|
|
12
12
|
// src/base-embedding-model-strategy.ts
|
|
13
13
|
import { TooManyEmbeddingValuesForCallError } from "@ai-sdk/provider";
|
|
@@ -96,4 +96,4 @@ var BaseEmbeddingModelStrategy = class {
|
|
|
96
96
|
export {
|
|
97
97
|
BaseEmbeddingModelStrategy
|
|
98
98
|
};
|
|
99
|
-
//# sourceMappingURL=chunk-
|
|
99
|
+
//# sourceMappingURL=chunk-JRUSQTKB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/convert-to-sap-messages.ts"],"sourcesContent":["import type {\n AssistantChatMessage,\n ChatMessage,\n SystemChatMessage,\n ToolChatMessage,\n UserChatMessage,\n} from \"@sap-ai-sdk/orchestration\";\n\nimport {\n InvalidPromptError,\n LanguageModelV3Prompt,\n type SharedV3Warning,\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\";\n\nimport type { CacheControl, ParsePartProviderOptions } from \"./sap-ai-provider-options.js\";\n\n/**\n * Options for converting Vercel AI SDK prompts to SAP AI SDK messages.\n * @see {@link convertToSAPMessages}\n */\nexport interface ConvertToSAPMessagesOptions {\n /**\n * Whether to escape Jinja2 template delimiters (`{{`, `{%`, `{#`) in message content.\n * This prevents SAP orchestration from interpreting user content as template syntax.\n * @default true\n */\n readonly escapeTemplatePlaceholders?: boolean;\n /**\n * Whether to include assistant reasoning parts (wrapped in `<think>` tags).\n * @default false\n */\n readonly includeReasoning?: boolean;\n /**\n * Optional callback that reads per-part `providerOptions['sap-ai']` (e.g. Anthropic\n * `cacheControl`) and forwards the result onto the SAP message item. Strategies that\n * do not honour part-level directives (Foundation Models) leave this undefined.\n * @default undefined\n */\n readonly parsePartProviderOptions?: ParsePartProviderOptions;\n /**\n * Optional sink for validation warnings raised by `parsePartProviderOptions`.\n * Issues reported by the parser are forwarded to the AI SDK call result.\n * The SAP parser deduplicates identical messages rather than warning per occurrence.\n */\n readonly warnings?: SharedV3Warning[];\n}\n\n/**\n * @internal\n */\nconst ZERO_WIDTH_SPACE = \"\\u200B\";\n\n/** Native cross-realm ArrayBuffer brand descriptor. */\nconst ARRAY_BUFFER_BYTE_LENGTH_DESCRIPTOR = Object.getOwnPropertyDescriptor(\n ArrayBuffer.prototype,\n \"byteLength\",\n);\n\n/** Native Uint8Array length descriptor, immune to subclass overrides. */\nconst TYPED_ARRAY_LENGTH_DESCRIPTOR = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(Uint8Array.prototype) as object,\n \"length\",\n);\n\n/** Native cross-realm typed array brand descriptor. */\nconst TYPED_ARRAY_TAG_DESCRIPTOR = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(Uint8Array.prototype) as object,\n Symbol.toStringTag,\n);\n\n/** Native cross-realm URL href descriptor. */\nconst URL_HREF_DESCRIPTOR = Object.getOwnPropertyDescriptor(URL.prototype, \"href\");\n\n/**\n * Returns the canonical href for genuine URL values across JavaScript realms.\n * @param value - The value to inspect.\n * @returns The URL href, or undefined when the value lacks URL internal slots.\n */\nexport function getURLHref(value: unknown): string | undefined {\n if (typeof value !== \"object\" || value === null || URL_HREF_DESCRIPTOR?.get === undefined) {\n return undefined;\n }\n try {\n const href: unknown = URL_HREF_DESCRIPTOR.get.call(value);\n return typeof href === \"string\" ? href : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Returns the RFC 4648 value of a base64 character.\n * @param charCode - The character's UTF-16 code unit.\n * @returns The base64 sextet value, or -1 when invalid.\n */\nfunction base64SextetValue(charCode: number): number {\n if (charCode >= 0x41 && charCode <= 0x5a) return charCode - 0x41;\n if (charCode >= 0x61 && charCode <= 0x7a) return charCode - 0x61 + 26;\n if (charCode >= 0x30 && charCode <= 0x39) return charCode - 0x30 + 52;\n if (charCode === 0x2b) return 62;\n if (charCode === 0x2f) return 63;\n return -1;\n}\n\n/**\n * Detects genuine ArrayBuffer values across JavaScript realms.\n * @param value - The value to inspect.\n * @returns Whether the value has ArrayBuffer internal slots.\n */\nfunction isArrayBuffer(value: unknown): value is ArrayBuffer {\n if (\n typeof value !== \"object\" ||\n value === null ||\n ARRAY_BUFFER_BYTE_LENGTH_DESCRIPTOR?.get === undefined\n ) {\n return false;\n }\n try {\n ARRAY_BUFFER_BYTE_LENGTH_DESCRIPTOR.get.call(value);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validates canonical RFC 4648 base64 in linear time and constant stack space.\n * @param value - The candidate base64 value.\n * @returns Whether the value is canonical RFC 4648 base64.\n */\nfunction isCanonicalBase64(value: string): boolean {\n const length = value.length;\n if (length % 4 !== 0) return false;\n\n let padding = 0;\n if (length > 0 && value.charCodeAt(length - 1) === 0x3d) padding++;\n if (length > 1 && value.charCodeAt(length - 2) === 0x3d) padding++;\n\n const payloadLength = length - padding;\n for (let index = 0; index < payloadLength; index++) {\n if (base64SextetValue(value.charCodeAt(index)) < 0) return false;\n }\n\n if (padding === 0) return true;\n const lastValue = base64SextetValue(value.charCodeAt(payloadLength - 1));\n return padding === 1 ? (lastValue & 0x03) === 0 : (lastValue & 0x0f) === 0;\n}\n\n/**\n * Detects genuine Uint8Array values across JavaScript realms.\n * @param value - The value to inspect.\n * @returns Whether the value has Uint8Array internal slots.\n */\nfunction isUint8Array(value: unknown): value is Uint8Array {\n if (\n typeof value !== \"object\" ||\n value === null ||\n TYPED_ARRAY_TAG_DESCRIPTOR?.get === undefined\n ) {\n return false;\n }\n try {\n return TYPED_ARRAY_TAG_DESCRIPTOR.get.call(value) === \"Uint8Array\";\n } catch {\n return false;\n }\n}\n\n/**\n * Safely serializes a value to JSON string, handling edge cases that would cause JSON.stringify to throw.\n *\n * Handles:\n * - Circular references (objects that reference themselves)\n * - BigInt values (converted to string representation)\n * - Undefined values and symbols (handled by JSON.stringify's default behavior)\n * @param value - The value to serialize.\n * @returns JSON string representation, or a fallback string representation if serialization fails.\n * @internal\n */\nfunction safeJsonStringify(value: unknown): string {\n try {\n return JSON.stringify(value, (_key, val) =>\n typeof val === \"bigint\" ? val.toString() : (val as unknown),\n );\n } catch {\n return String(value);\n }\n}\n\n/**\n * Wraps a text payload as a SAP `TextContent` block, attaching `cache_control` when set.\n * @param text - Pre-escaped text payload.\n * @param cacheControl - Optional Anthropic prompt-cache directive.\n * @returns SAP `TextContent` block.\n */\nfunction wrapAsTextContent(\n text: string,\n cacheControl: CacheControl | undefined,\n): { cache_control?: CacheControl; text: string; type: \"text\" } {\n return cacheControl\n ? { cache_control: cacheControl, text, type: \"text\" }\n : { text, type: \"text\" };\n}\n\n/**\n * @internal\n */\nconst JINJA2_DELIMITERS_PATTERN = /\\{(?=[{%#])/g;\n\n/**\n * @internal\n */\nconst JINJA2_DELIMITERS_ESCAPED_PATTERN = new RegExp(`\\\\{${ZERO_WIDTH_SPACE}([{%#])`, \"g\");\n\n/**\n * @internal\n */\ninterface UserContentItem {\n readonly cache_control?: { ttl?: \"1h\" | \"5m\"; type: \"ephemeral\" };\n readonly file?: {\n readonly file_data: string;\n readonly filename?: string;\n };\n readonly image_url?: {\n readonly url: string;\n };\n readonly text?: string;\n readonly type: \"file\" | \"image_url\" | \"text\";\n}\n\n/**\n * Encodes bytes as base64 using `btoa`, without the Node.js `Buffer` global.\n * @internal\n * @param bytes - The bytes to encode.\n * @returns The base64 string (empty string for empty input).\n */\nexport function base64FromBytes(bytes: Uint8Array): string {\n const CHUNK_SIZE = 0x8000;\n let byteLength: unknown;\n try {\n byteLength = TYPED_ARRAY_LENGTH_DESCRIPTOR?.get?.call(bytes);\n } catch {\n throw new UnsupportedFunctionalityError({\n functionality: \"Invalid Uint8Array file data.\",\n });\n }\n if (typeof byteLength !== \"number\") {\n throw new UnsupportedFunctionalityError({\n functionality: \"Invalid Uint8Array file data.\",\n });\n }\n\n const codeUnits = new Array<number>(Math.min(CHUNK_SIZE, byteLength));\n let binary = \"\";\n for (let offset = 0; offset < byteLength; offset += CHUNK_SIZE) {\n const chunkLength = Math.min(CHUNK_SIZE, byteLength - offset);\n codeUnits.length = chunkLength;\n for (let index = 0; index < chunkLength; index++) {\n const byte = bytes[offset + index];\n if (byte === undefined) {\n throw new UnsupportedFunctionalityError({\n functionality: \"Invalid Uint8Array file data.\",\n });\n }\n codeUnits[index] = byte;\n }\n binary += String.fromCharCode(...codeUnits);\n }\n return btoa(binary);\n}\n\n/**\n * Converts Vercel AI SDK prompt to SAP AI SDK ChatMessage array.\n *\n * Maps V3 message roles to SAP messages:\n * - `system` → `SystemChatMessage`\n * - `user` (text/images/files) → `UserChatMessage`\n * - `assistant` (text/tool-calls, optionally reasoning) → `AssistantChatMessage`\n * - `tool` (JSON-serialized tool-result outputs) → `ToolChatMessage`\n * Unsupported assistant parts and non-result tool parts are ignored, with\n * warnings when a warning sink is supplied.\n * @param prompt - The Vercel AI SDK LanguageModelV3Prompt to convert.\n * @param options - Conversion options.\n * @param options.escapeTemplatePlaceholders - Whether to escape Jinja2 template delimiters (default: true).\n * @param options.includeReasoning - Whether to include assistant reasoning parts (default: false).\n * @param options.parsePartProviderOptions - Optional callback to read per-part `providerOptions['sap-ai']`. Strategies opt in to honour part-level directives such as Anthropic `cacheControl`.\n * @param options.warnings - Optional sink the parser pushes Zod validation issues into.\n * @returns SAP AI SDK ChatMessage array ready for orchestration requests.\n * @throws {UnsupportedFunctionalityError} When encountering unsupported user content or file data types.\n * @throws {InvalidPromptError} When encountering unsupported message roles.\n */\nexport function convertToSAPMessages(\n prompt: LanguageModelV3Prompt,\n options: ConvertToSAPMessagesOptions = {},\n): ChatMessage[] {\n const messages: ChatMessage[] = [];\n const includeReasoning = options.includeReasoning ?? false;\n const escapeTemplatePlaceholders = options.escapeTemplatePlaceholders ?? true;\n\n const maybeEscape = (text: string): string =>\n escapeTemplatePlaceholders ? escapeOrchestrationPlaceholders(text) : text;\n\n const parser = options.parsePartProviderOptions;\n const parsePart = parser\n ? (providerOptions: unknown) => parser(providerOptions, options.warnings)\n : () => undefined;\n\n const pushWarningOnce = (feature: string, details: string): void => {\n if (!options.warnings) return;\n if (!options.warnings.some((w) => (w as { feature?: string }).feature === feature)) {\n options.warnings.push({ details, feature, type: \"unsupported\" });\n }\n };\n\n for (const message of prompt) {\n switch (message.role) {\n case \"assistant\": {\n let text = \"\";\n const textParts: {\n cacheControl?: { ttl?: \"1h\" | \"5m\"; type: \"ephemeral\" };\n text: string;\n }[] = [];\n let anyCacheControl = false;\n const toolCalls: {\n function: { arguments: string; name: string };\n id: string;\n type: \"function\";\n }[] = [];\n\n for (const part of message.content) {\n switch (part.type) {\n case \"file\": {\n pushWarningOnce(\n \"file content in assistant message\",\n \"SAP orchestration assistant messages carry text and tool calls only; file parts are ignored.\",\n );\n break;\n }\n case \"reasoning\": {\n if (includeReasoning && part.text) {\n const escaped = `<think>${maybeEscape(part.text)}</think>`;\n text += escaped;\n textParts.push({ text: escaped });\n }\n break;\n }\n case \"text\": {\n const escaped = maybeEscape(part.text);\n if (!escaped) break;\n const partOpts = parsePart(part.providerOptions);\n const cacheControl = partOpts?.cacheControl;\n text += escaped;\n textParts.push(cacheControl ? { cacheControl, text: escaped } : { text: escaped });\n if (cacheControl) anyCacheControl = true;\n break;\n }\n case \"tool-call\": {\n const partOpts = parsePart(part.providerOptions);\n if (partOpts?.cacheControl && options.warnings) {\n const feature = \"cacheControl on assistant tool-call\";\n if (\n !options.warnings.some((w) => (w as { feature?: string }).feature === feature)\n ) {\n options.warnings.push({\n details:\n \"SAP orchestration does not expose cache_control on the assistant tool-call envelope.\",\n feature,\n type: \"unsupported\",\n });\n }\n }\n // Normalize tool call input to JSON string (Vercel AI SDK provides strings or objects)\n let argumentsJson: string;\n if (typeof part.input === \"string\") {\n argumentsJson = part.input;\n } else {\n argumentsJson = JSON.stringify(part.input);\n }\n\n // Escape tool call arguments if needed (they may contain placeholder syntax)\n toolCalls.push({\n function: {\n arguments: maybeEscape(argumentsJson),\n name: part.toolName,\n },\n id: part.toolCallId,\n type: \"function\",\n });\n break;\n }\n default: {\n pushWarningOnce(\n \"unsupported assistant content\",\n \"Unsupported assistant content type; part ignored.\",\n );\n break;\n }\n }\n }\n\n if (text || toolCalls.length > 0) {\n const assistantMessage: AssistantChatMessage = {\n content: anyCacheControl\n ? textParts.map((p) => wrapAsTextContent(p.text, p.cacheControl))\n : text,\n role: \"assistant\",\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n messages.push(assistantMessage);\n }\n break;\n }\n\n case \"system\": {\n const partOpts = parsePart(message.providerOptions);\n const cacheControl = partOpts?.cacheControl;\n const text = maybeEscape(message.content);\n const systemMessage: SystemChatMessage = {\n content: cacheControl ? [wrapAsTextContent(text, cacheControl)] : text,\n role: \"system\",\n };\n messages.push(systemMessage);\n break;\n }\n\n case \"tool\": {\n for (const part of message.content) {\n if (part.type === \"tool-result\") {\n const partOpts = parsePart(part.providerOptions);\n const cacheControl = partOpts?.cacheControl;\n const serializedOutput = safeJsonStringify(part.output);\n const escaped = maybeEscape(serializedOutput);\n const toolMessage: ToolChatMessage = {\n content: cacheControl ? [wrapAsTextContent(escaped, cacheControl)] : escaped,\n role: \"tool\",\n tool_call_id: part.toolCallId,\n };\n messages.push(toolMessage);\n } else {\n pushWarningOnce(\n \"non-tool-result content in tool message\",\n \"Only tool-result parts are forwarded to SAP; other tool content is ignored.\",\n );\n }\n }\n break;\n }\n\n case \"user\": {\n const contentParts: UserContentItem[] = [];\n\n for (const part of message.content) {\n const partOpts = parsePart(part.providerOptions);\n const cacheControl = partOpts?.cacheControl;\n switch (part.type) {\n case \"file\": {\n const fileDataUrl = buildDataUrl(part);\n\n if (part.mediaType.startsWith(\"image/\")) {\n const supportedFormats = [\n \"image/png\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/gif\",\n \"image/webp\",\n ];\n const normalizedMediaType = part.mediaType.toLowerCase();\n const isWildcardImageUrl =\n getURLHref(part.data) !== undefined && normalizedMediaType === \"image/*\";\n if (!isWildcardImageUrl && !supportedFormats.includes(normalizedMediaType)) {\n console.warn(\n `Image format ${part.mediaType} may not be supported by all models. ` +\n `Recommended formats: PNG, JPEG, GIF, WebP`,\n );\n }\n\n contentParts.push({\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n image_url: {\n url: fileDataUrl,\n },\n type: \"image_url\",\n });\n } else {\n contentParts.push({\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n file: {\n file_data: fileDataUrl,\n ...(part.filename ? { filename: part.filename } : {}),\n },\n type: \"file\",\n });\n }\n break;\n }\n case \"text\": {\n contentParts.push({\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n text: maybeEscape(part.text),\n type: \"text\",\n });\n break;\n }\n default: {\n throw new UnsupportedFunctionalityError({\n functionality: `Content type ${(part as { type: string }).type}`,\n });\n }\n }\n }\n\n const firstPart = contentParts[0];\n const userMessage: UserChatMessage =\n contentParts.length === 1 &&\n firstPart?.type === \"text\" &&\n firstPart.cache_control === undefined\n ? {\n content: firstPart.text ?? \"\",\n role: \"user\",\n }\n : {\n content: contentParts,\n role: \"user\",\n };\n\n messages.push(userMessage);\n break;\n }\n\n default: {\n const _exhaustiveCheck: never = message;\n throw new InvalidPromptError({\n message: `Unsupported role: ${(_exhaustiveCheck as { role: string }).role}`,\n prompt: JSON.stringify(message),\n });\n }\n }\n }\n\n return messages;\n}\n\n/**\n * Escapes Jinja2 template delimiters by inserting zero-width spaces.\n *\n * Converts `{{`, `{%`, `{#` to `{\\u200B{`, `{\\u200B%`, `{\\u200B#` respectively.\n * This prevents SAP orchestration from interpreting user content as template syntax.\n * @param text - The text to escape.\n * @returns The escaped text with zero-width spaces inserted.\n * @see {@link unescapeOrchestrationPlaceholders} for the reverse operation.\n */\nexport function escapeOrchestrationPlaceholders(text: string): string {\n if (!text) return text;\n return text.replaceAll(JINJA2_DELIMITERS_PATTERN, `{${ZERO_WIDTH_SPACE}`);\n}\n\n/**\n * Reverses escaping by removing zero-width spaces from template delimiters.\n * Useful for processing model responses that may contain escaped delimiters.\n * @param text - The text to unescape.\n * @returns The unescaped text with zero-width spaces removed.\n * @see {@link escapeOrchestrationPlaceholders} for the escaping operation.\n */\nexport function unescapeOrchestrationPlaceholders(text: string): string {\n if (!text) return text;\n return text.replaceAll(JINJA2_DELIMITERS_ESCAPED_PATTERN, \"{$1\");\n}\n\n/**\n * Returns a file URL or builds a base64 data URL from inline file data.\n *\n * Genuine URL objects pass through without being fetched. Base64 strings are\n * embedded verbatim without validation; Uint8Array and ArrayBuffer inputs are\n * encoded. Buffer-like objects must have a custom `toString(\"base64\")` method\n * returning canonical base64. Other objects are rejected.\n * @internal\n * @param part - The file part containing data and mediaType.\n * @param part.data - The file data.\n * @param part.mediaType - The MIME type of the file.\n * @returns The original URL string or an inline data URL.\n * @throws {UnsupportedFunctionalityError} If the data type is not supported.\n */\nfunction buildDataUrl(part: { data: unknown; mediaType: string }): string {\n const { data, mediaType } = part;\n const href = getURLHref(data);\n if (href !== undefined) return href;\n\n if (typeof data === \"string\") return `data:${mediaType};base64,${data}`;\n\n if (isUint8Array(data)) {\n return `data:${mediaType};base64,${base64FromBytes(data)}`;\n }\n\n if (isArrayBuffer(data)) {\n let bytes: Uint8Array;\n try {\n bytes = new Uint8Array(data);\n } catch {\n throw new UnsupportedFunctionalityError({\n functionality: \"Detached ArrayBuffer file data is unsupported.\",\n });\n }\n return `data:${mediaType};base64,${base64FromBytes(bytes)}`;\n }\n\n if (typeof data === \"object\" && data !== null) {\n const toString = (data as { toString?: unknown }).toString;\n if (typeof toString === \"function\" && toString !== Object.prototype.toString) {\n const encoded: unknown = toString.call(data, \"base64\");\n if (typeof encoded === \"string\" && isCanonicalBase64(encoded)) {\n return `data:${mediaType};base64,${encoded}`;\n }\n }\n }\n\n throw new UnsupportedFunctionalityError({\n functionality:\n \"Unsupported file data type. Expected base64 string, Uint8Array, ArrayBuffer, URL, or a buffer-like object returning canonical base64.\",\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
ApiSwitchError,
|
|
4
4
|
UnsupportedFeatureError,
|
|
5
5
|
deepMerge
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-2KOXKYVT.js";
|
|
7
7
|
|
|
8
8
|
// src/sap-ai-validation.ts
|
|
9
9
|
function validateEscapeTemplatePlaceholders(api, escapeTemplatePlaceholders) {
|
|
@@ -187,4 +187,4 @@ export {
|
|
|
187
187
|
validateMaskingProvidersDeprecation,
|
|
188
188
|
validateSettings
|
|
189
189
|
};
|
|
190
|
-
//# sourceMappingURL=chunk-
|
|
190
|
+
//# sourceMappingURL=chunk-U23M3VYO.js.map
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
BaseEmbeddingModelStrategy
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-JRUSQTKB.js";
|
|
5
5
|
import {
|
|
6
6
|
buildModelDeployment,
|
|
7
7
|
extractResponseMetadata,
|
|
8
8
|
hasKeys,
|
|
9
9
|
mergeRequestConfig,
|
|
10
10
|
normalizeEmbedding
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-AFZC2DH2.js";
|
|
12
|
+
import "./chunk-2KOXKYVT.js";
|
|
13
13
|
|
|
14
14
|
// src/foundation-models-embedding-model-strategy.ts
|
|
15
15
|
var FoundationModelsEmbeddingModelStrategy = class extends BaseEmbeddingModelStrategy {
|
|
@@ -56,4 +56,4 @@ var FoundationModelsEmbeddingModelStrategy = class extends BaseEmbeddingModelStr
|
|
|
56
56
|
export {
|
|
57
57
|
FoundationModelsEmbeddingModelStrategy
|
|
58
58
|
};
|
|
59
|
-
//# sourceMappingURL=foundation-models-embedding-model-strategy-
|
|
59
|
+
//# sourceMappingURL=foundation-models-embedding-model-strategy-2GUADNXT.js.map
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
BaseLanguageModelStrategy
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-643USI3B.js";
|
|
5
|
+
import "./chunk-MF3VO3ER.js";
|
|
6
6
|
import {
|
|
7
7
|
buildModelDeployment,
|
|
8
8
|
convertResponseFormat,
|
|
9
9
|
convertToolsToSAPFormat,
|
|
10
10
|
mergeRequestConfig
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-AFZC2DH2.js";
|
|
12
|
+
import "./chunk-2KOXKYVT.js";
|
|
13
13
|
|
|
14
14
|
// src/foundation-models-language-model-strategy.ts
|
|
15
15
|
var FOUNDATION_MODELS_PARAM_MAPPINGS = [
|
|
@@ -97,4 +97,4 @@ var FoundationModelsLanguageModelStrategy = class extends BaseLanguageModelStrat
|
|
|
97
97
|
export {
|
|
98
98
|
FoundationModelsLanguageModelStrategy
|
|
99
99
|
};
|
|
100
|
-
//# sourceMappingURL=foundation-models-language-model-strategy-
|
|
100
|
+
//# sourceMappingURL=foundation-models-language-model-strategy-5AYZ5KHA.js.map
|
package/dist/index.cjs
CHANGED
|
@@ -30914,7 +30914,7 @@ Request ID: ${requestId}`;
|
|
|
30914
30914
|
if (statusCode === HTTP_STATUS.RATE_LIMIT) {
|
|
30915
30915
|
enhancedMessage += "\n\nRate limit exceeded. Please try again later or contact your SAP administrator.\nSee: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/rate-limits";
|
|
30916
30916
|
} else if (statusCode >= HTTP_STATUS.INTERNAL_ERROR) {
|
|
30917
|
-
enhancedMessage += "\n\nSAP AI Core service error. This is typically a temporary issue.
|
|
30917
|
+
enhancedMessage += "\n\nSAP AI Core service error. This is typically a temporary issue. Retries depend on the caller's retry configuration.\nSee: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/troubleshooting";
|
|
30918
30918
|
} else if (location) {
|
|
30919
30919
|
enhancedMessage += `
|
|
30920
30920
|
|
|
@@ -31389,15 +31389,13 @@ The model's response was blocked by content safety filters. Try a different prom
|
|
|
31389
31389
|
/**
|
|
31390
31390
|
* Creates a new UnsupportedFeatureError.
|
|
31391
31391
|
* @param feature - The name of the unsupported feature (e.g., "Content filtering").
|
|
31392
|
-
* @param api - The API being used
|
|
31392
|
+
* @param api - The API being used that does not support the feature.
|
|
31393
31393
|
* @param suggestedApi - The API that supports this feature.
|
|
31394
31394
|
*/
|
|
31395
31395
|
constructor(feature, api, suggestedApi) {
|
|
31396
31396
|
const apiName = api === "foundation-models" ? "Foundation Models" : "Orchestration";
|
|
31397
31397
|
const suggestedApiName = suggestedApi === "foundation-models" ? "Foundation Models" : "Orchestration";
|
|
31398
|
-
super(
|
|
31399
|
-
`${feature} is only available with ${suggestedApiName} API and will be ignored by ${apiName} API.`
|
|
31400
|
-
);
|
|
31398
|
+
super(`${feature} is not supported by ${apiName} API. Use ${suggestedApiName} API instead.`);
|
|
31401
31399
|
this.feature = feature;
|
|
31402
31400
|
this.api = api;
|
|
31403
31401
|
this.suggestedApi = suggestedApi;
|
|
@@ -32231,7 +32229,7 @@ var VERSION;
|
|
|
32231
32229
|
var init_version = __esm({
|
|
32232
32230
|
"src/version.ts"() {
|
|
32233
32231
|
"use strict";
|
|
32234
|
-
VERSION = true ? "5.0.
|
|
32232
|
+
VERSION = true ? "5.0.1" : "0.0.0-test";
|
|
32235
32233
|
}
|
|
32236
32234
|
});
|
|
32237
32235
|
|
|
@@ -32818,17 +32816,17 @@ var init_base_language_model_strategy = __esm({
|
|
|
32818
32816
|
* Returns whether to escape template placeholders for this API.
|
|
32819
32817
|
* @param _sapOptions - Parsed provider options (unused in base implementation).
|
|
32820
32818
|
* @param _settings - Model settings (unused in base implementation).
|
|
32821
|
-
* @returns false by default; Orchestration
|
|
32819
|
+
* @returns false by default; the Orchestration override defaults to true unless disabled.
|
|
32822
32820
|
* @internal
|
|
32823
32821
|
*/
|
|
32824
32822
|
getEscapeTemplatePlaceholders(_sapOptions, _settings) {
|
|
32825
32823
|
return false;
|
|
32826
32824
|
}
|
|
32827
32825
|
/**
|
|
32828
|
-
* Returns whether
|
|
32826
|
+
* Returns whether assistant reasoning in the input history is forwarded as text.
|
|
32829
32827
|
* @param sapOptions - Parsed provider options.
|
|
32830
32828
|
* @param settings - Model settings.
|
|
32831
|
-
* @returns Whether to
|
|
32829
|
+
* @returns Whether to forward input reasoning (checks sapOptions then settings, defaults to false).
|
|
32832
32830
|
* @internal
|
|
32833
32831
|
*/
|
|
32834
32832
|
getIncludeReasoning(sapOptions, settings) {
|
|
@@ -33164,7 +33162,8 @@ var init_orchestration_language_model_strategy = __esm({
|
|
|
33164
33162
|
* Builds request for orchestrationConfigRef mode.
|
|
33165
33163
|
*
|
|
33166
33164
|
* In configRef mode, the full configuration is managed server-side.
|
|
33167
|
-
*
|
|
33165
|
+
* This request contains messages and placeholderValues; createClient separately
|
|
33166
|
+
* passes the reference, including overrideConfig, to the SAP SDK.
|
|
33168
33167
|
* @param settings - Model settings.
|
|
33169
33168
|
* @param options - Call options.
|
|
33170
33169
|
* @param commonParts - Common build result.
|
|
@@ -33340,8 +33339,8 @@ var init_orchestration_language_model_strategy = __esm({
|
|
|
33340
33339
|
}
|
|
33341
33340
|
/**
|
|
33342
33341
|
* Resolves the orchestrationConfigRef from provider options or settings.
|
|
33343
|
-
*
|
|
33344
|
-
* ignored with a warning
|
|
33342
|
+
* Parsed provider options take priority over settings. An invalid settings reference
|
|
33343
|
+
* is ignored with a warning; invalid per-call references fail schema parsing earlier.
|
|
33345
33344
|
* @param sapOptions - Parsed provider options from commonParts.
|
|
33346
33345
|
* @param settings - The model settings.
|
|
33347
33346
|
* @param warnings - Shared warnings sink for degradation signals.
|