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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/dist/{chunk-U6WJSLR7.js → chunk-3H5C5U22.js} +3 -3
  2. package/dist/{chunk-LEME2MFD.js → chunk-4JLNWASF.js} +2 -2
  3. package/dist/{chunk-NLMWIVG7.js → chunk-E76ZDPIW.js} +2 -2
  4. package/dist/{chunk-QZOZ3PZT.js → chunk-NF355OFT.js} +5 -4
  5. package/dist/{chunk-QZOZ3PZT.js.map → chunk-NF355OFT.js.map} +1 -1
  6. package/dist/{chunk-77JSAAPE.js → chunk-UIBQ5AFS.js} +2 -2
  7. package/dist/{foundation-models-embedding-model-strategy-A3WDDAYK.js → foundation-models-embedding-model-strategy-SAVQFBF4.js} +4 -4
  8. package/dist/{foundation-models-language-model-strategy-6U6KK6KH.js → foundation-models-language-model-strategy-ZDOWVYTA.js} +5 -5
  9. package/dist/{foundation-models-language-model-strategy-6U6KK6KH.js.map → foundation-models-language-model-strategy-ZDOWVYTA.js.map} +1 -1
  10. package/dist/index.cjs +13 -5
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.js +6 -6
  13. package/dist/{orchestration-embedding-model-strategy-JO3QH5MR.js → orchestration-embedding-model-strategy-GT27AFII.js} +5 -5
  14. package/dist/{orchestration-language-model-strategy-MBVA7BYX.js → orchestration-language-model-strategy-7QTPQHCC.js} +14 -7
  15. package/dist/orchestration-language-model-strategy-7QTPQHCC.js.map +1 -0
  16. package/package.json +2 -2
  17. package/dist/orchestration-language-model-strategy-MBVA7BYX.js.map +0 -1
  18. /package/dist/{chunk-U6WJSLR7.js.map → chunk-3H5C5U22.js.map} +0 -0
  19. /package/dist/{chunk-LEME2MFD.js.map → chunk-4JLNWASF.js.map} +0 -0
  20. /package/dist/{chunk-NLMWIVG7.js.map → chunk-E76ZDPIW.js.map} +0 -0
  21. /package/dist/{chunk-77JSAAPE.js.map → chunk-UIBQ5AFS.js.map} +0 -0
  22. /package/dist/{foundation-models-embedding-model-strategy-A3WDDAYK.js.map → foundation-models-embedding-model-strategy-SAVQFBF4.js.map} +0 -0
  23. /package/dist/{orchestration-embedding-model-strategy-JO3QH5MR.js.map → orchestration-embedding-model-strategy-GT27AFII.js.map} +0 -0
@@ -2,13 +2,13 @@ import {createRequire as __createRequire} from 'module';var require=__createRequ
2
2
  import {
3
3
  buildEmbeddingResult,
4
4
  mergeRequestConfig
5
- } from "./chunk-LEME2MFD.js";
5
+ } from "./chunk-4JLNWASF.js";
6
6
  import {
7
7
  VERSION,
8
8
  convertToAISDKError,
9
9
  deepMerge,
10
10
  getProviderName
11
- } from "./chunk-77JSAAPE.js";
11
+ } from "./chunk-UIBQ5AFS.js";
12
12
 
13
13
  // src/base-embedding-model-strategy.ts
14
14
  import { TooManyEmbeddingValuesForCallError } from "@ai-sdk/provider";
@@ -104,4 +104,4 @@ var BaseEmbeddingModelStrategy = class {
104
104
  export {
105
105
  BaseEmbeddingModelStrategy
106
106
  };
107
- //# sourceMappingURL=chunk-U6WJSLR7.js.map
107
+ //# sourceMappingURL=chunk-3H5C5U22.js.map
@@ -3,7 +3,7 @@ import {
3
3
  deepMerge,
4
4
  normalizeHeaders,
5
5
  validateModelParamsWithWarnings
6
- } from "./chunk-77JSAAPE.js";
6
+ } from "./chunk-UIBQ5AFS.js";
7
7
 
8
8
  // src/strategy-utils.ts
9
9
  import { z } from "zod";
@@ -497,4 +497,4 @@ export {
497
497
  normalizeEmbedding,
498
498
  sanitizeAsJSONArray
499
499
  };
500
- //# sourceMappingURL=chunk-LEME2MFD.js.map
500
+ //# sourceMappingURL=chunk-4JLNWASF.js.map
@@ -3,7 +3,7 @@ import {
3
3
  ApiSwitchError,
4
4
  UnsupportedFeatureError,
5
5
  deepMerge
6
- } from "./chunk-77JSAAPE.js";
6
+ } from "./chunk-UIBQ5AFS.js";
7
7
 
8
8
  // src/sap-ai-validation.ts
9
9
  function validateEscapeTemplatePlaceholders(api, escapeTemplatePlaceholders) {
@@ -197,4 +197,4 @@ export {
197
197
  validateMaskingProvidersDeprecation,
198
198
  validateSettings
199
199
  };
200
- //# sourceMappingURL=chunk-NLMWIVG7.js.map
200
+ //# sourceMappingURL=chunk-E76ZDPIW.js.map
@@ -14,13 +14,13 @@ import {
14
14
  mapToolChoice,
15
15
  mergeRequestConfig,
16
16
  sanitizeAsJSONArray
17
- } from "./chunk-LEME2MFD.js";
17
+ } from "./chunk-4JLNWASF.js";
18
18
  import {
19
19
  VERSION,
20
20
  convertToAISDKError,
21
21
  getProviderName,
22
22
  normalizeHeaders
23
- } from "./chunk-77JSAAPE.js";
23
+ } from "./chunk-UIBQ5AFS.js";
24
24
 
25
25
  // src/stream-transformer.ts
26
26
  var StreamIdGenerator = class {
@@ -466,7 +466,8 @@ var BaseLanguageModelStrategy = class {
466
466
  request,
467
467
  options.abortSignal ?? void 0,
468
468
  settings,
469
- mergeRequestConfig(config.requestConfig, void 0, options.headers)
469
+ mergeRequestConfig(config.requestConfig, void 0, options.headers),
470
+ commonParts
470
471
  );
471
472
  const idGenerator = new StreamIdGenerator();
472
473
  const streamWarnings = this.collectStreamWarnings(settings, commonParts.sapOptions);
@@ -631,4 +632,4 @@ var BaseLanguageModelStrategy = class {
631
632
  export {
632
633
  BaseLanguageModelStrategy
633
634
  };
634
- //# sourceMappingURL=chunk-QZOZ3PZT.js.map
635
+ //# sourceMappingURL=chunk-NF355OFT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/stream-transformer.ts","../src/base-language-model-strategy.ts"],"sourcesContent":["/**\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 LanguageModelV3ResponseMetadata,\n LanguageModelV3StreamPart,\n LanguageModelV3Usage,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\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 cancel: () => void;\n readonly convertToAISDKError: (\n error: unknown,\n context: {\n modelId: string;\n modelType: \"languageModel\";\n operation: string;\n requestBody: unknown;\n url: string;\n },\n ) => unknown;\n readonly extractChunkMetadata: (chunk: SDKStreamChunk) => {\n requestId?: string;\n responseMetadata: LanguageModelV3ResponseMetadata;\n };\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 responseMetadata: LanguageModelV3ResponseMetadata & { id: string };\n readonly sdkStream: AsyncIterable<SDKStreamChunk>;\n readonly streamResponseGetCitations?: () => SDKCitation[] | undefined;\n readonly streamResponseGetFinishReason: () => null | string | undefined;\n readonly streamResponseGetIntermediateFailures?: () => undefined | unknown[];\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 * Preserves a caller-provided reason while retaining standard abort classification.\n * @param reason - The original cancellation reason.\n * @returns An AbortError carrying the reason as its cause.\n * @internal\n */\nexport function createAbortError(reason: unknown): Error {\n const error = new Error(\"The operation was aborted.\", { cause: reason });\n error.name = \"AbortError\";\n return error;\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 cancel,\n convertToAISDKError,\n extractChunkMetadata,\n idGenerator,\n includeRawChunks,\n modelId,\n options,\n providerName,\n requestId,\n responseMetadata,\n sdkStream,\n streamResponseGetCitations,\n streamResponseGetFinishReason,\n streamResponseGetIntermediateFailures,\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 const resolvedResponseMetadata = { ...responseMetadata };\n let resolvedRequestId = requestId;\n let tokenUsage: SDKTokenUsage | undefined;\n let citations: Map<string, SDKCitation> | undefined;\n\n /**\n * Retains sources from early chunks when later SDK snapshots omit them.\n * @param incoming - Citations in a chunk or final response.\n */\n function collectCitations(incoming: SDKCitation[] | undefined): void {\n if (!incoming?.length) return;\n citations ??= new Map();\n for (const citation of incoming) {\n citations.set(String(citation.ref_id ?? citation.url), citation);\n }\n }\n\n /**\n * Combines usage snapshots without losing details omitted by later chunks.\n * @param incoming - Usage in the incoming chunk.\n */\n function collectUsage(incoming: null | SDKTokenUsage | undefined): void {\n if (!incoming) return;\n const promptDetails = tokenUsage?.prompt_tokens_details;\n const incomingPromptDetails = incoming.prompt_tokens_details;\n const completionDetails = tokenUsage?.completion_tokens_details;\n const incomingCompletionDetails = incoming.completion_tokens_details;\n const cacheDetails = promptDetails?.cache_creation_token_details;\n const incomingCacheDetails = incomingPromptDetails?.cache_creation_token_details;\n tokenUsage = {\n ...tokenUsage,\n ...incoming,\n ...(promptDetails || incomingPromptDetails\n ? {\n prompt_tokens_details: {\n ...promptDetails,\n ...incomingPromptDetails,\n ...(cacheDetails || incomingCacheDetails\n ? {\n cache_creation_token_details: { ...cacheDetails, ...incomingCacheDetails },\n }\n : {}),\n },\n }\n : {}),\n ...(completionDetails || incomingCompletionDetails\n ? {\n completion_tokens_details: { ...completionDetails, ...incomingCompletionDetails },\n }\n : {}),\n };\n }\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 const iterator = safeIterate(sdkStream, options.abortSignal)[Symbol.asyncIterator]();\n let canceled = false;\n return new ReadableStream<Error | SDKStreamChunk>({\n async cancel() {\n canceled = true;\n // Abort transport before return(): an async iterator can be waiting on the next chunk.\n cancel();\n await iterator.return(undefined);\n },\n async pull(controller) {\n const { done, value } = await iterator.next();\n if (canceled) return;\n if (done) controller.close();\n else controller.enqueue(value);\n },\n }).pipeThrough(\n new TransformStream<Error | SDKStreamChunk, LanguageModelV3StreamPart>({\n flush(controller) {\n if (options.abortSignal?.aborted) {\n handleStreamError(\n createAbortError(options.abortSignal.reason),\n controller,\n convertToAISDKError,\n options,\n modelId,\n url,\n );\n return;\n }\n\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 // Use wire usage snapshots; SAP final aggregation can invent zero totals.\n streamState.usage = mapTokenUsage(tokenUsage);\n\n collectCitations(streamResponseGetCitations?.());\n if (citations) {\n for (const citation of citations.values()) {\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(tokenUsage),\n finishReason: streamState.finishReason.raw ?? \"unknown\",\n finishReasonMapped: streamState.finishReason,\n ...(streamIntermediateFailures?.length\n ? {\n intermediateFailures: sanitizeAsJSONArray(streamIntermediateFailures),\n }\n : {}),\n ...(resolvedRequestId ? { requestId: resolvedRequestId } : {}),\n responseId: resolvedResponseMetadata.id,\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 (options.abortSignal?.aborted && !(chunk instanceof Error)) {\n chunk = createAbortError(options.abortSignal.reason);\n }\n if (chunk instanceof Error) {\n handleStreamError(chunk, controller, convertToAISDKError, options, modelId, 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 const metadata = extractChunkMetadata(chunk);\n if (metadata.requestId) resolvedRequestId = metadata.requestId;\n const incomingMetadata = metadata.responseMetadata;\n const metadataChanged =\n (incomingMetadata.id !== undefined &&\n incomingMetadata.id !== resolvedResponseMetadata.id) ||\n (incomingMetadata.modelId !== undefined &&\n incomingMetadata.modelId !== resolvedResponseMetadata.modelId) ||\n (incomingMetadata.timestamp !== undefined &&\n incomingMetadata.timestamp.getTime() !== resolvedResponseMetadata.timestamp?.getTime());\n Object.assign(resolvedResponseMetadata, incomingMetadata);\n collectUsage(chunk.getTokenUsage?.());\n collectCitations(chunk.getCitations?.());\n\n if (streamState.isFirstChunk || metadataChanged) {\n streamState.isFirstChunk = false;\n controller.enqueue({\n ...resolvedResponseMetadata,\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 (typeof deltaContent === \"string\" && deltaContent.length > 0) {\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 let didEmitAnyToolCalls = false;\n\n for (const tc of toolCallsInProgress.values()) {\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 modelId - Model identifier for error classification.\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 modelId: string,\n url: string,\n): void {\n const aiError = convertToAISDKError(error, {\n modelId,\n modelType: \"languageModel\",\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 * After the first error, the transformer emits an error event and terminates without\n * a successful finish event.\n * @param iterable - The async iterable to wrap.\n * @param abortSignal - Caller cancellation, which the SAP iterator can otherwise swallow.\n * @yields {Error | T} Original values or Error instances for caught exceptions.\n * @internal\n */\nasync function* safeIterate<T>(\n iterable: AsyncIterable<T>,\n abortSignal: AbortSignal | undefined,\n): AsyncGenerator<Error | T, void> {\n try {\n for await (const chunk of iterable) {\n abortSignal?.throwIfAborted();\n yield chunk;\n }\n abortSignal?.throwIfAborted();\n } catch (error) {\n if (abortSignal?.aborted) {\n yield createAbortError(abortSignal.reason);\n } else {\n yield error instanceof Error ? error : new Error(String(error));\n }\n }\n}\n","/** Base class for language model strategies using the Template Method pattern. */\nimport type {\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3ResponseMetadata,\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 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 } from \"./sap-ai-provider-options.js\";\nimport {\n buildGenerateResult,\n buildModelParams,\n createAISDKRequestBodySummary,\n extractCompletionMetadata,\n extractResponseMetadata,\n mapToolChoice,\n mergeRequestConfig,\n type ParamMapping,\n type SAPToolChoice,\n type SDKCitation,\n type SDKResponse,\n type SDKStreamChunk,\n} from \"./strategy-utils.js\";\nimport {\n createAbortError,\n createStreamTransformer,\n StreamIdGenerator,\n} from \"./stream-transformer.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 cancel: () => void;\n readonly getCitations?: () => SDKCitation[] | undefined;\n readonly getFinishReason: () => null | string | undefined;\n readonly getIntermediateFailures?: () => undefined | unknown[];\n /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n readonly requestId?: string;\n readonly responseHeaders?: Record<string, string>;\n readonly responseMetadata?: LanguageModelV3ResponseMetadata;\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 if (options.abortSignal?.aborted) throw createAbortError(options.abortSignal.reason);\n const commonParts = 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 mergeRequestConfig(config.requestConfig, options.abortSignal, options.headers),\n );\n\n return buildGenerateResult({\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 modelId: config.modelId,\n modelType: \"languageModel\",\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 if (options.abortSignal?.aborted) throw createAbortError(options.abortSignal.reason);\n const commonParts = 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 mergeRequestConfig(config.requestConfig, undefined, options.headers),\n );\n\n const idGenerator = new StreamIdGenerator();\n\n const streamWarnings = this.collectStreamWarnings(settings, commonParts.sapOptions);\n\n const transformedStream = createStreamTransformer({\n cancel: streamResponse.cancel,\n convertToAISDKError,\n extractChunkMetadata: (chunk) => this.extractMetadata(chunk),\n idGenerator,\n includeRawChunks: options.includeRawChunks ?? false,\n modelId: config.modelId,\n options,\n providerName: commonParts.providerName,\n requestId: streamResponse.requestId,\n responseMetadata: {\n ...streamResponse.responseMetadata,\n id: streamResponse.responseMetadata?.id ?? idGenerator.generateResponseId(),\n },\n sdkStream: streamResponse.stream,\n streamResponseGetCitations: streamResponse.getCitations,\n streamResponseGetFinishReason: streamResponse.getFinishReason,\n streamResponseGetIntermediateFailures: streamResponse.getIntermediateFailures,\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 modelId: config.modelId,\n modelType: \"languageModel\",\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 buildCommonParts(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): CommonBuildResult<ChatMessage[], SAPToolChoice | undefined> {\n const providerName = getProviderName(config.provider);\n\n const sapOptions = config.parsedProviderOptions;\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 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 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 completion metadata, request 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 responseMetadata: LanguageModelV3ResponseMetadata;\n } {\n const responseMetadata = extractCompletionMetadata(\n response as { _data?: unknown; getRequestId?: () => string | undefined },\n this.getCompletionDataPath(),\n );\n const { headers, requestId } = extractResponseMetadata(response, \"rawResponse\");\n return { requestId, responseHeaders: headers, responseMetadata };\n }\n\n /**\n * Returns the API-specific path to the completion object in an SDK payload.\n * @returns Completion path (`[\"final_result\"]` for orchestration, `[]` for Foundation Models).\n * @internal\n */\n protected abstract getCompletionDataPath(): 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":["convertToAISDKError"]}
1
+ {"version":3,"sources":["../src/stream-transformer.ts","../src/base-language-model-strategy.ts"],"sourcesContent":["/**\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 LanguageModelV3ResponseMetadata,\n LanguageModelV3StreamPart,\n LanguageModelV3Usage,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\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 cancel: () => void;\n readonly convertToAISDKError: (\n error: unknown,\n context: {\n modelId: string;\n modelType: \"languageModel\";\n operation: string;\n requestBody: unknown;\n url: string;\n },\n ) => unknown;\n readonly extractChunkMetadata: (chunk: SDKStreamChunk) => {\n requestId?: string;\n responseMetadata: LanguageModelV3ResponseMetadata;\n };\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 responseMetadata: LanguageModelV3ResponseMetadata & { id: string };\n readonly sdkStream: AsyncIterable<SDKStreamChunk>;\n readonly streamResponseGetCitations?: () => SDKCitation[] | undefined;\n readonly streamResponseGetFinishReason: () => null | string | undefined;\n readonly streamResponseGetIntermediateFailures?: () => undefined | unknown[];\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 * Preserves a caller-provided reason while retaining standard abort classification.\n * @param reason - The original cancellation reason.\n * @returns An AbortError carrying the reason as its cause.\n * @internal\n */\nexport function createAbortError(reason: unknown): Error {\n const error = new Error(\"The operation was aborted.\", { cause: reason });\n error.name = \"AbortError\";\n return error;\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 cancel,\n convertToAISDKError,\n extractChunkMetadata,\n idGenerator,\n includeRawChunks,\n modelId,\n options,\n providerName,\n requestId,\n responseMetadata,\n sdkStream,\n streamResponseGetCitations,\n streamResponseGetFinishReason,\n streamResponseGetIntermediateFailures,\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 const resolvedResponseMetadata = { ...responseMetadata };\n let resolvedRequestId = requestId;\n let tokenUsage: SDKTokenUsage | undefined;\n let citations: Map<string, SDKCitation> | undefined;\n\n /**\n * Retains sources from early chunks when later SDK snapshots omit them.\n * @param incoming - Citations in a chunk or final response.\n */\n function collectCitations(incoming: SDKCitation[] | undefined): void {\n if (!incoming?.length) return;\n citations ??= new Map();\n for (const citation of incoming) {\n citations.set(String(citation.ref_id ?? citation.url), citation);\n }\n }\n\n /**\n * Combines usage snapshots without losing details omitted by later chunks.\n * @param incoming - Usage in the incoming chunk.\n */\n function collectUsage(incoming: null | SDKTokenUsage | undefined): void {\n if (!incoming) return;\n const promptDetails = tokenUsage?.prompt_tokens_details;\n const incomingPromptDetails = incoming.prompt_tokens_details;\n const completionDetails = tokenUsage?.completion_tokens_details;\n const incomingCompletionDetails = incoming.completion_tokens_details;\n const cacheDetails = promptDetails?.cache_creation_token_details;\n const incomingCacheDetails = incomingPromptDetails?.cache_creation_token_details;\n tokenUsage = {\n ...tokenUsage,\n ...incoming,\n ...(promptDetails || incomingPromptDetails\n ? {\n prompt_tokens_details: {\n ...promptDetails,\n ...incomingPromptDetails,\n ...(cacheDetails || incomingCacheDetails\n ? {\n cache_creation_token_details: { ...cacheDetails, ...incomingCacheDetails },\n }\n : {}),\n },\n }\n : {}),\n ...(completionDetails || incomingCompletionDetails\n ? {\n completion_tokens_details: { ...completionDetails, ...incomingCompletionDetails },\n }\n : {}),\n };\n }\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 const iterator = safeIterate(sdkStream, options.abortSignal)[Symbol.asyncIterator]();\n let canceled = false;\n return new ReadableStream<Error | SDKStreamChunk>({\n async cancel() {\n canceled = true;\n // Abort transport before return(): an async iterator can be waiting on the next chunk.\n cancel();\n await iterator.return(undefined);\n },\n async pull(controller) {\n const { done, value } = await iterator.next();\n if (canceled) return;\n if (done) controller.close();\n else controller.enqueue(value);\n },\n }).pipeThrough(\n new TransformStream<Error | SDKStreamChunk, LanguageModelV3StreamPart>({\n flush(controller) {\n if (options.abortSignal?.aborted) {\n handleStreamError(\n createAbortError(options.abortSignal.reason),\n controller,\n convertToAISDKError,\n options,\n modelId,\n url,\n );\n return;\n }\n\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 // Use wire usage snapshots; SAP final aggregation can invent zero totals.\n streamState.usage = mapTokenUsage(tokenUsage);\n\n collectCitations(streamResponseGetCitations?.());\n if (citations) {\n for (const citation of citations.values()) {\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(tokenUsage),\n finishReason: streamState.finishReason.raw ?? \"unknown\",\n finishReasonMapped: streamState.finishReason,\n ...(streamIntermediateFailures?.length\n ? {\n intermediateFailures: sanitizeAsJSONArray(streamIntermediateFailures),\n }\n : {}),\n ...(resolvedRequestId ? { requestId: resolvedRequestId } : {}),\n responseId: resolvedResponseMetadata.id,\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 (options.abortSignal?.aborted && !(chunk instanceof Error)) {\n chunk = createAbortError(options.abortSignal.reason);\n }\n if (chunk instanceof Error) {\n handleStreamError(chunk, controller, convertToAISDKError, options, modelId, 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 const metadata = extractChunkMetadata(chunk);\n if (metadata.requestId) resolvedRequestId = metadata.requestId;\n const incomingMetadata = metadata.responseMetadata;\n const metadataChanged =\n (incomingMetadata.id !== undefined &&\n incomingMetadata.id !== resolvedResponseMetadata.id) ||\n (incomingMetadata.modelId !== undefined &&\n incomingMetadata.modelId !== resolvedResponseMetadata.modelId) ||\n (incomingMetadata.timestamp !== undefined &&\n incomingMetadata.timestamp.getTime() !== resolvedResponseMetadata.timestamp?.getTime());\n Object.assign(resolvedResponseMetadata, incomingMetadata);\n collectUsage(chunk.getTokenUsage?.());\n collectCitations(chunk.getCitations?.());\n\n if (streamState.isFirstChunk || metadataChanged) {\n streamState.isFirstChunk = false;\n controller.enqueue({\n ...resolvedResponseMetadata,\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 (typeof deltaContent === \"string\" && deltaContent.length > 0) {\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 let didEmitAnyToolCalls = false;\n\n for (const tc of toolCallsInProgress.values()) {\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 modelId - Model identifier for error classification.\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 modelId: string,\n url: string,\n): void {\n const aiError = convertToAISDKError(error, {\n modelId,\n modelType: \"languageModel\",\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 * After the first error, the transformer emits an error event and terminates without\n * a successful finish event.\n * @param iterable - The async iterable to wrap.\n * @param abortSignal - Caller cancellation, which the SAP iterator can otherwise swallow.\n * @yields {Error | T} Original values or Error instances for caught exceptions.\n * @internal\n */\nasync function* safeIterate<T>(\n iterable: AsyncIterable<T>,\n abortSignal: AbortSignal | undefined,\n): AsyncGenerator<Error | T, void> {\n try {\n for await (const chunk of iterable) {\n abortSignal?.throwIfAborted();\n yield chunk;\n }\n abortSignal?.throwIfAborted();\n } catch (error) {\n if (abortSignal?.aborted) {\n yield createAbortError(abortSignal.reason);\n } else {\n yield error instanceof Error ? error : new Error(String(error));\n }\n }\n}\n","/** Base class for language model strategies using the Template Method pattern. */\nimport type {\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3ResponseMetadata,\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 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 } from \"./sap-ai-provider-options.js\";\nimport {\n buildGenerateResult,\n buildModelParams,\n createAISDKRequestBodySummary,\n extractCompletionMetadata,\n extractResponseMetadata,\n mapToolChoice,\n mergeRequestConfig,\n type ParamMapping,\n type SAPToolChoice,\n type SDKCitation,\n type SDKResponse,\n type SDKStreamChunk,\n} from \"./strategy-utils.js\";\nimport {\n createAbortError,\n createStreamTransformer,\n StreamIdGenerator,\n} from \"./stream-transformer.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 cancel: () => void;\n readonly getCitations?: () => SDKCitation[] | undefined;\n readonly getFinishReason: () => null | string | undefined;\n readonly getIntermediateFailures?: () => undefined | unknown[];\n /** SAP-pipeline request id resolved by `extractResponseMetadata`. */\n readonly requestId?: string;\n readonly responseHeaders?: Record<string, string>;\n readonly responseMetadata?: LanguageModelV3ResponseMetadata;\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 if (options.abortSignal?.aborted) throw createAbortError(options.abortSignal.reason);\n const commonParts = 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 mergeRequestConfig(config.requestConfig, options.abortSignal, options.headers),\n );\n\n return buildGenerateResult({\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 modelId: config.modelId,\n modelType: \"languageModel\",\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 if (options.abortSignal?.aborted) throw createAbortError(options.abortSignal.reason);\n const commonParts = 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 mergeRequestConfig(config.requestConfig, undefined, options.headers),\n commonParts,\n );\n\n const idGenerator = new StreamIdGenerator();\n\n const streamWarnings = this.collectStreamWarnings(settings, commonParts.sapOptions);\n\n const transformedStream = createStreamTransformer({\n cancel: streamResponse.cancel,\n convertToAISDKError,\n extractChunkMetadata: (chunk) => this.extractMetadata(chunk),\n idGenerator,\n includeRawChunks: options.includeRawChunks ?? false,\n modelId: config.modelId,\n options,\n providerName: commonParts.providerName,\n requestId: streamResponse.requestId,\n responseMetadata: {\n ...streamResponse.responseMetadata,\n id: streamResponse.responseMetadata?.id ?? idGenerator.generateResponseId(),\n },\n sdkStream: streamResponse.stream,\n streamResponseGetCitations: streamResponse.getCitations,\n streamResponseGetFinishReason: streamResponse.getFinishReason,\n streamResponseGetIntermediateFailures: streamResponse.getIntermediateFailures,\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 modelId: config.modelId,\n modelType: \"languageModel\",\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 buildCommonParts(\n config: LanguageModelStrategyConfig,\n settings: TSettings,\n options: LanguageModelV3CallOptions,\n ): CommonBuildResult<ChatMessage[], SAPToolChoice | undefined> {\n const providerName = getProviderName(config.provider);\n\n const sapOptions = config.parsedProviderOptions;\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 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 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 * @param commonParts - Common build result (resolved state, provider options, etc.).\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 commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): Promise<StreamCallResponse>;\n\n /**\n * Resolves completion metadata, request 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 responseMetadata: LanguageModelV3ResponseMetadata;\n } {\n const responseMetadata = extractCompletionMetadata(\n response as { _data?: unknown; getRequestId?: () => string | undefined },\n this.getCompletionDataPath(),\n );\n const { headers, requestId } = extractResponseMetadata(response, \"rawResponse\");\n return { requestId, responseHeaders: headers, responseMetadata };\n }\n\n /**\n * Returns the API-specific path to the completion object in an SDK payload.\n * @returns Completion path (`[\"final_result\"]` for orchestration, `[]` for Foundation Models).\n * @internal\n */\n protected abstract getCompletionDataPath(): 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":["convertToAISDKError"]}
@@ -756,7 +756,7 @@ function tryExtractSAPErrorFromMessage(message) {
756
756
  }
757
757
 
758
758
  // src/version.ts
759
- var VERSION = true ? "5.0.2" : "0.0.0-test";
759
+ var VERSION = true ? "5.0.3" : "0.0.0-test";
760
760
 
761
761
  export {
762
762
  SAP_AI_PROVIDER_NAME,
@@ -775,4 +775,4 @@ export {
775
775
  normalizeHeaders,
776
776
  VERSION
777
777
  };
778
- //# sourceMappingURL=chunk-77JSAAPE.js.map
778
+ //# sourceMappingURL=chunk-UIBQ5AFS.js.map
@@ -1,14 +1,14 @@
1
1
  import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
2
2
  import {
3
3
  BaseEmbeddingModelStrategy
4
- } from "./chunk-U6WJSLR7.js";
4
+ } from "./chunk-3H5C5U22.js";
5
5
  import {
6
6
  buildModelDeployment,
7
7
  extractResponseMetadata,
8
8
  hasKeys,
9
9
  normalizeEmbedding
10
- } from "./chunk-LEME2MFD.js";
11
- import "./chunk-77JSAAPE.js";
10
+ } from "./chunk-4JLNWASF.js";
11
+ import "./chunk-UIBQ5AFS.js";
12
12
 
13
13
  // src/foundation-models-embedding-model-strategy.ts
14
14
  var FoundationModelsEmbeddingModelStrategy = class extends BaseEmbeddingModelStrategy {
@@ -55,4 +55,4 @@ var FoundationModelsEmbeddingModelStrategy = class extends BaseEmbeddingModelStr
55
55
  export {
56
56
  FoundationModelsEmbeddingModelStrategy
57
57
  };
58
- //# sourceMappingURL=foundation-models-embedding-model-strategy-A3WDDAYK.js.map
58
+ //# sourceMappingURL=foundation-models-embedding-model-strategy-SAVQFBF4.js.map
@@ -1,14 +1,14 @@
1
1
  import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
2
2
  import {
3
3
  BaseLanguageModelStrategy
4
- } from "./chunk-QZOZ3PZT.js";
4
+ } from "./chunk-NF355OFT.js";
5
5
  import "./chunk-YP3AADWD.js";
6
6
  import {
7
7
  buildModelDeployment,
8
8
  convertResponseFormat,
9
9
  convertToolsToSAPFormat
10
- } from "./chunk-LEME2MFD.js";
11
- import "./chunk-77JSAAPE.js";
10
+ } from "./chunk-4JLNWASF.js";
11
+ import "./chunk-UIBQ5AFS.js";
12
12
 
13
13
  // src/foundation-models-language-model-strategy.ts
14
14
  var FOUNDATION_MODELS_PARAM_MAPPINGS = [
@@ -67,7 +67,7 @@ var FoundationModelsLanguageModelStrategy = class extends BaseLanguageModelStrat
67
67
  responseMetadata
68
68
  };
69
69
  }
70
- async executeStreamCall(client, request, abortSignal, _settings, requestConfig) {
70
+ async executeStreamCall(client, request, abortSignal, _settings, requestConfig, _commonParts) {
71
71
  const streamResponse = await client.stream(request, abortSignal, requestConfig);
72
72
  const { requestId, responseHeaders, responseMetadata } = this.extractMetadata(streamResponse);
73
73
  return {
@@ -94,4 +94,4 @@ var FoundationModelsLanguageModelStrategy = class extends BaseLanguageModelStrat
94
94
  export {
95
95
  FoundationModelsLanguageModelStrategy
96
96
  };
97
- //# sourceMappingURL=foundation-models-language-model-strategy-6U6KK6KH.js.map
97
+ //# sourceMappingURL=foundation-models-language-model-strategy-ZDOWVYTA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/foundation-models-language-model-strategy.ts"],"sourcesContent":["/** Foundation Models language model strategy using `@sap-ai-sdk/foundation-models`. */\nimport type { LanguageModelV3CallOptions, SharedV3Warning } from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type {\n AzureOpenAiChatClient,\n AzureOpenAiChatCompletionParameters,\n AzureOpenAiChatCompletionTool,\n} from \"@sap-ai-sdk/foundation-models\";\nimport type { ChatMessage } from \"@sap-ai-sdk/orchestration\";\n\nimport type { FoundationModelsModelSettings } from \"./sap-ai-settings.js\";\nimport type { LanguageModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport {\n BaseLanguageModelStrategy,\n type CommonBuildResult,\n type StreamCallResponse,\n} from \"./base-language-model-strategy.js\";\nimport {\n buildModelDeployment,\n convertResponseFormat,\n convertToolsToSAPFormat,\n type ParamMapping,\n type SAPToolChoice,\n type SDKResponse,\n type SDKStreamChunk,\n} from \"./strategy-utils.js\";\n\n/** @internal */\ntype FoundationModelsClient = InstanceType<typeof AzureOpenAiChatClient>;\n\n/**\n * Foundation Models API parameter mappings.\n * @internal\n */\nconst FOUNDATION_MODELS_PARAM_MAPPINGS: readonly ParamMapping[] = [\n ...BaseLanguageModelStrategy.COMMON_PARAM_MAPPINGS,\n { camelCaseKey: \"logprobs\", outputKey: \"logprobs\" },\n { camelCaseKey: \"topLogprobs\", outputKey: \"top_logprobs\" },\n { camelCaseKey: \"logitBias\", outputKey: \"logit_bias\" },\n { camelCaseKey: \"user\", outputKey: \"user\" },\n { camelCaseKey: \"n\", outputKey: \"n\" },\n] as const;\n\n/**\n * Language model strategy for the Foundation Models API.\n *\n * Provides direct access to Azure OpenAI models with parameters like:\n * - logprobs\n * - seed\n * - dataSources (On Your Data)\n * @internal\n */\nexport class FoundationModelsLanguageModelStrategy extends BaseLanguageModelStrategy<\n FoundationModelsClient,\n AzureOpenAiChatCompletionParameters,\n FoundationModelsModelSettings\n> {\n private readonly ClientClass: typeof AzureOpenAiChatClient;\n\n constructor(ClientClass: typeof AzureOpenAiChatClient) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected buildRequest(\n _config: LanguageModelStrategyConfig,\n settings: FoundationModelsModelSettings,\n options: LanguageModelV3CallOptions,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): {\n readonly request: AzureOpenAiChatCompletionParameters;\n readonly warnings: SharedV3Warning[];\n } {\n const warnings: SharedV3Warning[] = [];\n\n const toolsResult = convertToolsToSAPFormat<AzureOpenAiChatCompletionTool>(options.tools);\n warnings.push(...toolsResult.warnings);\n\n const { responseFormat, warning: responseFormatWarning } = convertResponseFormat(\n options.responseFormat,\n settings.responseFormat,\n );\n if (responseFormatWarning) {\n warnings.push(responseFormatWarning);\n }\n\n const { toolChoice } = commonParts;\n\n const request: AzureOpenAiChatCompletionParameters = {\n messages: commonParts.messages as AzureOpenAiChatCompletionParameters[\"messages\"],\n ...(commonParts.modelParams as Partial<AzureOpenAiChatCompletionParameters>),\n ...(toolsResult.tools?.length ? { tools: toolsResult.tools } : {}),\n ...(toolChoice ? { tool_choice: toolChoice } : {}),\n ...(responseFormat ? { response_format: responseFormat } : {}),\n ...(settings.dataSources?.length\n ? {\n data_sources: settings.dataSources,\n }\n : {}),\n };\n\n return { request, warnings };\n }\n\n protected createClient(\n config: LanguageModelStrategyConfig,\n settings: FoundationModelsModelSettings,\n _commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): FoundationModelsClient {\n const modelDeployment = buildModelDeployment(config, settings.modelVersion);\n return new this.ClientClass(modelDeployment, config.destination);\n }\n\n protected async executeApiCall(\n client: FoundationModelsClient,\n request: AzureOpenAiChatCompletionParameters,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<SDKResponse> {\n const response = await client.run(request, requestConfig);\n\n const { requestId, responseMetadata } = this.extractMetadata(response);\n\n return {\n getContent: () => response.getContent(),\n getFinishReason: () => response.getFinishReason(),\n getTokenUsage: () => response.getTokenUsage(),\n getToolCalls: () => response.getToolCalls(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- SAP SDK types headers as any\n rawResponse: { headers: response.rawResponse.headers },\n requestId,\n responseMetadata,\n };\n }\n\n protected async executeStreamCall(\n client: FoundationModelsClient,\n request: AzureOpenAiChatCompletionParameters,\n abortSignal: AbortSignal | undefined,\n _settings: FoundationModelsModelSettings,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<StreamCallResponse> {\n const streamResponse = await client.stream(request, abortSignal, requestConfig);\n\n const { requestId, responseHeaders, responseMetadata } = this.extractMetadata(streamResponse);\n\n return {\n cancel: () => {\n streamResponse.stream.controller.abort();\n },\n getFinishReason: () => streamResponse.getFinishReason(),\n requestId,\n responseHeaders,\n responseMetadata,\n stream: streamResponse.stream as AsyncIterable<SDKStreamChunk>,\n };\n }\n\n protected getCompletionDataPath(): readonly string[] {\n return [];\n }\n\n protected getParamMappings(): readonly ParamMapping[] {\n return FOUNDATION_MODELS_PARAM_MAPPINGS;\n }\n\n protected getUrl(): string {\n return \"sap-ai:foundation-models\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAmCA,IAAM,mCAA4D;AAAA,EAChE,GAAG,0BAA0B;AAAA,EAC7B,EAAE,cAAc,YAAY,WAAW,WAAW;AAAA,EAClD,EAAE,cAAc,eAAe,WAAW,eAAe;AAAA,EACzD,EAAE,cAAc,aAAa,WAAW,aAAa;AAAA,EACrD,EAAE,cAAc,QAAQ,WAAW,OAAO;AAAA,EAC1C,EAAE,cAAc,KAAK,WAAW,IAAI;AACtC;AAWO,IAAM,wCAAN,cAAoD,0BAIzD;AAAA,EACiB;AAAA,EAEjB,YAAY,aAA2C;AACrD,UAAM;AACN,SAAK,cAAc;AAAA,EACrB;AAAA,EAEU,aACR,SACA,UACA,SACA,aAIA;AACA,UAAM,WAA8B,CAAC;AAErC,UAAM,cAAc,wBAAuD,QAAQ,KAAK;AACxF,aAAS,KAAK,GAAG,YAAY,QAAQ;AAErC,UAAM,EAAE,gBAAgB,SAAS,sBAAsB,IAAI;AAAA,MACzD,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AACA,QAAI,uBAAuB;AACzB,eAAS,KAAK,qBAAqB;AAAA,IACrC;AAEA,UAAM,EAAE,WAAW,IAAI;AAEvB,UAAM,UAA+C;AAAA,MACnD,UAAU,YAAY;AAAA,MACtB,GAAI,YAAY;AAAA,MAChB,GAAI,YAAY,OAAO,SAAS,EAAE,OAAO,YAAY,MAAM,IAAI,CAAC;AAAA,MAChE,GAAI,aAAa,EAAE,aAAa,WAAW,IAAI,CAAC;AAAA,MAChD,GAAI,iBAAiB,EAAE,iBAAiB,eAAe,IAAI,CAAC;AAAA,MAC5D,GAAI,SAAS,aAAa,SACtB;AAAA,QACE,cAAc,SAAS;AAAA,MACzB,IACA,CAAC;AAAA,IACP;AAEA,WAAO,EAAE,SAAS,SAAS;AAAA,EAC7B;AAAA,EAEU,aACR,QACA,UACA,cACwB;AACxB,UAAM,kBAAkB,qBAAqB,QAAQ,SAAS,YAAY;AAC1E,WAAO,IAAI,KAAK,YAAY,iBAAiB,OAAO,WAAW;AAAA,EACjE;AAAA,EAEA,MAAgB,eACd,QACA,SACA,eACsB;AACtB,UAAM,WAAW,MAAM,OAAO,IAAI,SAAS,aAAa;AAExD,UAAM,EAAE,WAAW,iBAAiB,IAAI,KAAK,gBAAgB,QAAQ;AAErE,WAAO;AAAA,MACL,YAAY,MAAM,SAAS,WAAW;AAAA,MACtC,iBAAiB,MAAM,SAAS,gBAAgB;AAAA,MAChD,eAAe,MAAM,SAAS,cAAc;AAAA,MAC5C,cAAc,MAAM,SAAS,aAAa;AAAA;AAAA,MAE1C,aAAa,EAAE,SAAS,SAAS,YAAY,QAAQ;AAAA,MACrD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAgB,kBACd,QACA,SACA,aACA,WACA,eAC6B;AAC7B,UAAM,iBAAiB,MAAM,OAAO,OAAO,SAAS,aAAa,aAAa;AAE9E,UAAM,EAAE,WAAW,iBAAiB,iBAAiB,IAAI,KAAK,gBAAgB,cAAc;AAE5F,WAAO;AAAA,MACL,QAAQ,MAAM;AACZ,uBAAe,OAAO,WAAW,MAAM;AAAA,MACzC;AAAA,MACA,iBAAiB,MAAM,eAAe,gBAAgB;AAAA,MACtD;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,eAAe;AAAA,IACzB;AAAA,EACF;AAAA,EAEU,wBAA2C;AACnD,WAAO,CAAC;AAAA,EACV;AAAA,EAEU,mBAA4C;AACpD,WAAO;AAAA,EACT;AAAA,EAEU,SAAiB;AACzB,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/foundation-models-language-model-strategy.ts"],"sourcesContent":["/** Foundation Models language model strategy using `@sap-ai-sdk/foundation-models`. */\nimport type { LanguageModelV3CallOptions, SharedV3Warning } from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type {\n AzureOpenAiChatClient,\n AzureOpenAiChatCompletionParameters,\n AzureOpenAiChatCompletionTool,\n} from \"@sap-ai-sdk/foundation-models\";\nimport type { ChatMessage } from \"@sap-ai-sdk/orchestration\";\n\nimport type { FoundationModelsModelSettings } from \"./sap-ai-settings.js\";\nimport type { LanguageModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport {\n BaseLanguageModelStrategy,\n type CommonBuildResult,\n type StreamCallResponse,\n} from \"./base-language-model-strategy.js\";\nimport {\n buildModelDeployment,\n convertResponseFormat,\n convertToolsToSAPFormat,\n type ParamMapping,\n type SAPToolChoice,\n type SDKResponse,\n type SDKStreamChunk,\n} from \"./strategy-utils.js\";\n\n/** @internal */\ntype FoundationModelsClient = InstanceType<typeof AzureOpenAiChatClient>;\n\n/**\n * Foundation Models API parameter mappings.\n * @internal\n */\nconst FOUNDATION_MODELS_PARAM_MAPPINGS: readonly ParamMapping[] = [\n ...BaseLanguageModelStrategy.COMMON_PARAM_MAPPINGS,\n { camelCaseKey: \"logprobs\", outputKey: \"logprobs\" },\n { camelCaseKey: \"topLogprobs\", outputKey: \"top_logprobs\" },\n { camelCaseKey: \"logitBias\", outputKey: \"logit_bias\" },\n { camelCaseKey: \"user\", outputKey: \"user\" },\n { camelCaseKey: \"n\", outputKey: \"n\" },\n] as const;\n\n/**\n * Language model strategy for the Foundation Models API.\n *\n * Provides direct access to Azure OpenAI models with parameters like:\n * - logprobs\n * - seed\n * - dataSources (On Your Data)\n * @internal\n */\nexport class FoundationModelsLanguageModelStrategy extends BaseLanguageModelStrategy<\n FoundationModelsClient,\n AzureOpenAiChatCompletionParameters,\n FoundationModelsModelSettings\n> {\n private readonly ClientClass: typeof AzureOpenAiChatClient;\n\n constructor(ClientClass: typeof AzureOpenAiChatClient) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected buildRequest(\n _config: LanguageModelStrategyConfig,\n settings: FoundationModelsModelSettings,\n options: LanguageModelV3CallOptions,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): {\n readonly request: AzureOpenAiChatCompletionParameters;\n readonly warnings: SharedV3Warning[];\n } {\n const warnings: SharedV3Warning[] = [];\n\n const toolsResult = convertToolsToSAPFormat<AzureOpenAiChatCompletionTool>(options.tools);\n warnings.push(...toolsResult.warnings);\n\n const { responseFormat, warning: responseFormatWarning } = convertResponseFormat(\n options.responseFormat,\n settings.responseFormat,\n );\n if (responseFormatWarning) {\n warnings.push(responseFormatWarning);\n }\n\n const { toolChoice } = commonParts;\n\n const request: AzureOpenAiChatCompletionParameters = {\n messages: commonParts.messages as AzureOpenAiChatCompletionParameters[\"messages\"],\n ...(commonParts.modelParams as Partial<AzureOpenAiChatCompletionParameters>),\n ...(toolsResult.tools?.length ? { tools: toolsResult.tools } : {}),\n ...(toolChoice ? { tool_choice: toolChoice } : {}),\n ...(responseFormat ? { response_format: responseFormat } : {}),\n ...(settings.dataSources?.length\n ? {\n data_sources: settings.dataSources,\n }\n : {}),\n };\n\n return { request, warnings };\n }\n\n protected createClient(\n config: LanguageModelStrategyConfig,\n settings: FoundationModelsModelSettings,\n _commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): FoundationModelsClient {\n const modelDeployment = buildModelDeployment(config, settings.modelVersion);\n return new this.ClientClass(modelDeployment, config.destination);\n }\n\n protected async executeApiCall(\n client: FoundationModelsClient,\n request: AzureOpenAiChatCompletionParameters,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<SDKResponse> {\n const response = await client.run(request, requestConfig);\n\n const { requestId, responseMetadata } = this.extractMetadata(response);\n\n return {\n getContent: () => response.getContent(),\n getFinishReason: () => response.getFinishReason(),\n getTokenUsage: () => response.getTokenUsage(),\n getToolCalls: () => response.getToolCalls(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- SAP SDK types headers as any\n rawResponse: { headers: response.rawResponse.headers },\n requestId,\n responseMetadata,\n };\n }\n\n protected async executeStreamCall(\n client: FoundationModelsClient,\n request: AzureOpenAiChatCompletionParameters,\n abortSignal: AbortSignal | undefined,\n _settings: FoundationModelsModelSettings,\n requestConfig: CustomRequestConfig | undefined,\n _commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): Promise<StreamCallResponse> {\n const streamResponse = await client.stream(request, abortSignal, requestConfig);\n\n const { requestId, responseHeaders, responseMetadata } = this.extractMetadata(streamResponse);\n\n return {\n cancel: () => {\n streamResponse.stream.controller.abort();\n },\n getFinishReason: () => streamResponse.getFinishReason(),\n requestId,\n responseHeaders,\n responseMetadata,\n stream: streamResponse.stream as AsyncIterable<SDKStreamChunk>,\n };\n }\n\n protected getCompletionDataPath(): readonly string[] {\n return [];\n }\n\n protected getParamMappings(): readonly ParamMapping[] {\n return FOUNDATION_MODELS_PARAM_MAPPINGS;\n }\n\n protected getUrl(): string {\n return \"sap-ai:foundation-models\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAmCA,IAAM,mCAA4D;AAAA,EAChE,GAAG,0BAA0B;AAAA,EAC7B,EAAE,cAAc,YAAY,WAAW,WAAW;AAAA,EAClD,EAAE,cAAc,eAAe,WAAW,eAAe;AAAA,EACzD,EAAE,cAAc,aAAa,WAAW,aAAa;AAAA,EACrD,EAAE,cAAc,QAAQ,WAAW,OAAO;AAAA,EAC1C,EAAE,cAAc,KAAK,WAAW,IAAI;AACtC;AAWO,IAAM,wCAAN,cAAoD,0BAIzD;AAAA,EACiB;AAAA,EAEjB,YAAY,aAA2C;AACrD,UAAM;AACN,SAAK,cAAc;AAAA,EACrB;AAAA,EAEU,aACR,SACA,UACA,SACA,aAIA;AACA,UAAM,WAA8B,CAAC;AAErC,UAAM,cAAc,wBAAuD,QAAQ,KAAK;AACxF,aAAS,KAAK,GAAG,YAAY,QAAQ;AAErC,UAAM,EAAE,gBAAgB,SAAS,sBAAsB,IAAI;AAAA,MACzD,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AACA,QAAI,uBAAuB;AACzB,eAAS,KAAK,qBAAqB;AAAA,IACrC;AAEA,UAAM,EAAE,WAAW,IAAI;AAEvB,UAAM,UAA+C;AAAA,MACnD,UAAU,YAAY;AAAA,MACtB,GAAI,YAAY;AAAA,MAChB,GAAI,YAAY,OAAO,SAAS,EAAE,OAAO,YAAY,MAAM,IAAI,CAAC;AAAA,MAChE,GAAI,aAAa,EAAE,aAAa,WAAW,IAAI,CAAC;AAAA,MAChD,GAAI,iBAAiB,EAAE,iBAAiB,eAAe,IAAI,CAAC;AAAA,MAC5D,GAAI,SAAS,aAAa,SACtB;AAAA,QACE,cAAc,SAAS;AAAA,MACzB,IACA,CAAC;AAAA,IACP;AAEA,WAAO,EAAE,SAAS,SAAS;AAAA,EAC7B;AAAA,EAEU,aACR,QACA,UACA,cACwB;AACxB,UAAM,kBAAkB,qBAAqB,QAAQ,SAAS,YAAY;AAC1E,WAAO,IAAI,KAAK,YAAY,iBAAiB,OAAO,WAAW;AAAA,EACjE;AAAA,EAEA,MAAgB,eACd,QACA,SACA,eACsB;AACtB,UAAM,WAAW,MAAM,OAAO,IAAI,SAAS,aAAa;AAExD,UAAM,EAAE,WAAW,iBAAiB,IAAI,KAAK,gBAAgB,QAAQ;AAErE,WAAO;AAAA,MACL,YAAY,MAAM,SAAS,WAAW;AAAA,MACtC,iBAAiB,MAAM,SAAS,gBAAgB;AAAA,MAChD,eAAe,MAAM,SAAS,cAAc;AAAA,MAC5C,cAAc,MAAM,SAAS,aAAa;AAAA;AAAA,MAE1C,aAAa,EAAE,SAAS,SAAS,YAAY,QAAQ;AAAA,MACrD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAgB,kBACd,QACA,SACA,aACA,WACA,eACA,cAC6B;AAC7B,UAAM,iBAAiB,MAAM,OAAO,OAAO,SAAS,aAAa,aAAa;AAE9E,UAAM,EAAE,WAAW,iBAAiB,iBAAiB,IAAI,KAAK,gBAAgB,cAAc;AAE5F,WAAO;AAAA,MACL,QAAQ,MAAM;AACZ,uBAAe,OAAO,WAAW,MAAM;AAAA,MACzC;AAAA,MACA,iBAAiB,MAAM,eAAe,gBAAgB;AAAA,MACtD;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,eAAe;AAAA,IACzB;AAAA,EACF;AAAA,EAEU,wBAA2C;AACnD,WAAO,CAAC;AAAA,EACV;AAAA,EAEU,mBAA4C;AACpD,WAAO;AAAA,EACT;AAAA,EAEU,SAAiB;AACzB,WAAO;AAAA,EACT;AACF;","names":[]}
package/dist/index.cjs CHANGED
@@ -1662,7 +1662,7 @@ var VERSION;
1662
1662
  var init_version = __esm({
1663
1663
  "src/version.ts"() {
1664
1664
  "use strict";
1665
- VERSION = true ? "5.0.2" : "0.0.0-test";
1665
+ VERSION = true ? "5.0.3" : "0.0.0-test";
1666
1666
  }
1667
1667
  });
1668
1668
 
@@ -2536,7 +2536,8 @@ var init_base_language_model_strategy = __esm({
2536
2536
  request,
2537
2537
  options.abortSignal ?? void 0,
2538
2538
  settings,
2539
- mergeRequestConfig(config.requestConfig, void 0, options.headers)
2539
+ mergeRequestConfig(config.requestConfig, void 0, options.headers),
2540
+ commonParts
2540
2541
  );
2541
2542
  const idGenerator = new StreamIdGenerator();
2542
2543
  const streamWarnings = this.collectStreamWarnings(settings, commonParts.sapOptions);
@@ -2767,7 +2768,7 @@ var init_foundation_models_language_model_strategy = __esm({
2767
2768
  responseMetadata
2768
2769
  };
2769
2770
  }
2770
- async executeStreamCall(client, request, abortSignal, _settings, requestConfig) {
2771
+ async executeStreamCall(client, request, abortSignal, _settings, requestConfig, _commonParts) {
2771
2772
  const streamResponse = await client.stream(request, abortSignal, requestConfig);
2772
2773
  const { requestId, responseHeaders, responseMetadata } = this.extractMetadata(streamResponse);
2773
2774
  return {
@@ -2880,6 +2881,12 @@ var init_orchestration_language_model_strategy = __esm({
2880
2881
  const warnings = [];
2881
2882
  const configRefCandidate = sapOptions?.orchestrationConfigRef ?? settings.orchestrationConfigRef;
2882
2883
  if (configRefCandidate && isOrchestrationConfigRef(configRefCandidate)) {
2884
+ if (settings.streamOptions && hasKeys(settings.streamOptions)) {
2885
+ warnings.push({
2886
+ message: "orchestrationConfigRef is set; local streamOptions are ignored. Configure streaming in the referenced configuration or its overrideConfig.",
2887
+ type: "other"
2888
+ });
2889
+ }
2883
2890
  return warnings;
2884
2891
  }
2885
2892
  if (settings.translation && hasKeys(settings.translation)) {
@@ -2929,8 +2936,9 @@ var init_orchestration_language_model_strategy = __esm({
2929
2936
  responseMetadata
2930
2937
  };
2931
2938
  }
2932
- async executeStreamCall(client, request, abortSignal, settings, requestConfig) {
2933
- const sdkStreamOptions = this.buildSdkStreamOptions(settings.streamOptions);
2939
+ async executeStreamCall(client, request, abortSignal, settings, requestConfig, commonParts) {
2940
+ const { configRef } = commonParts.resolvedState;
2941
+ const sdkStreamOptions = configRef ? void 0 : this.buildSdkStreamOptions(settings.streamOptions);
2934
2942
  const streamResponse = await client.stream(
2935
2943
  request,
2936
2944
  abortSignal,