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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +44 -24
  2. package/dist/chunk-4ILJD6PI.js +333 -0
  3. package/dist/chunk-4ILJD6PI.js.map +1 -0
  4. package/dist/chunk-BHA5MIN6.js +224 -0
  5. package/dist/chunk-BHA5MIN6.js.map +1 -0
  6. package/dist/{chunk-4JLNWASF.js → chunk-DLGBK3C3.js} +91 -7
  7. package/dist/chunk-DLGBK3C3.js.map +1 -0
  8. package/dist/{chunk-E76ZDPIW.js → chunk-EUBI5ENK.js} +54 -27
  9. package/dist/chunk-EUBI5ENK.js.map +1 -0
  10. package/dist/{chunk-YP3AADWD.js → chunk-FKHOJ3ZC.js} +24 -3
  11. package/dist/chunk-FKHOJ3ZC.js.map +1 -0
  12. package/dist/{chunk-UIBQ5AFS.js → chunk-QFMHNGLB.js} +56 -218
  13. package/dist/chunk-QFMHNGLB.js.map +1 -0
  14. package/dist/{chunk-3H5C5U22.js → chunk-QQQYMQPU.js} +19 -10
  15. package/dist/chunk-QQQYMQPU.js.map +1 -0
  16. package/dist/{chunk-NF355OFT.js → chunk-ZOBD7PXJ.js} +116 -21
  17. package/dist/chunk-ZOBD7PXJ.js.map +1 -0
  18. package/dist/{foundation-models-embedding-model-strategy-SAVQFBF4.js → foundation-models-embedding-model-strategy-3WAKJXBY.js} +5 -4
  19. package/dist/{foundation-models-embedding-model-strategy-SAVQFBF4.js.map → foundation-models-embedding-model-strategy-3WAKJXBY.js.map} +1 -1
  20. package/dist/{foundation-models-language-model-strategy-ZDOWVYTA.js → foundation-models-language-model-strategy-PJ26VXEA.js} +21 -8
  21. package/dist/foundation-models-language-model-strategy-PJ26VXEA.js.map +1 -0
  22. package/dist/index.cjs +2008 -497
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +798 -185
  25. package/dist/index.d.ts +798 -185
  26. package/dist/index.js +148 -24
  27. package/dist/index.js.map +1 -1
  28. package/dist/{orchestration-embedding-model-strategy-GT27AFII.js → orchestration-embedding-model-strategy-AZ76XLMD.js} +6 -5
  29. package/dist/{orchestration-embedding-model-strategy-GT27AFII.js.map → orchestration-embedding-model-strategy-AZ76XLMD.js.map} +1 -1
  30. package/dist/{orchestration-language-model-strategy-7QTPQHCC.js → orchestration-language-model-strategy-CT6RHCYO.js} +48 -17
  31. package/dist/orchestration-language-model-strategy-CT6RHCYO.js.map +1 -0
  32. package/dist/responses-language-model-strategy-UYTV6TPM.js +738 -0
  33. package/dist/responses-language-model-strategy-UYTV6TPM.js.map +1 -0
  34. package/dist/sap-ai-error-UPKYWPSS.js +16 -0
  35. package/dist/sap-ai-error-UPKYWPSS.js.map +1 -0
  36. package/package.json +79 -39
  37. package/dist/chunk-3H5C5U22.js.map +0 -1
  38. package/dist/chunk-4JLNWASF.js.map +0 -1
  39. package/dist/chunk-E76ZDPIW.js.map +0 -1
  40. package/dist/chunk-NF355OFT.js.map +0 -1
  41. package/dist/chunk-UIBQ5AFS.js.map +0 -1
  42. package/dist/chunk-YP3AADWD.js.map +0 -1
  43. package/dist/foundation-models-language-model-strategy-ZDOWVYTA.js.map +0 -1
  44. package/dist/orchestration-language-model-strategy-7QTPQHCC.js.map +0 -1
@@ -1 +0,0 @@
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":";;;;;;;;;;;;;;;;;;;;;;;;;AAwFO,IAAM,oBAAN,MAAwB;AAAA;AAAA;AAAA;AAAA,EAI7B,qBAA6B;AAC3B,WAAO,OAAO,WAAW;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,sBAA8B;AAC5B,WAAO,OAAO,WAAW;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,qBAA6B;AAC3B,WAAO,OAAO,WAAW;AAAA,EAC3B;AACF;AAQO,SAAS,iBAAiB,QAAwB;AACvD,QAAM,QAAQ,IAAI,MAAM,8BAA8B,EAAE,OAAO,OAAO,CAAC;AACvE,QAAM,OAAO;AACb,SAAO;AACT;AAOO,SAAS,2BAAwC;AACtD,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,cAAc;AAAA,MACZ,KAAK;AAAA,MACL,SAAS;AAAA,IACX;AAAA,IACA,cAAc;AAAA,IACd,OAAO;AAAA,MACL,aAAa;AAAA,QACX,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,MACA,cAAc;AAAA,QACZ,WAAW;AAAA,QACX,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AASO,SAAS,wBACd,QAC2C;AAC3C,QAAM;AAAA,IACJ;AAAA,IACA,qBAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,MAAI,cAA6B;AACjC,QAAM,cAAc,yBAAyB;AAC7C,QAAM,sBAAsB,oBAAI,IAAgC;AAChE,QAAM,2BAA2B,EAAE,GAAG,iBAAiB;AACvD,MAAI,oBAAoB;AACxB,MAAI;AACJ,MAAI;AAMJ,WAAS,iBAAiB,UAA2C;AACnE,QAAI,CAAC,UAAU,OAAQ;AACvB,kBAAc,oBAAI,IAAI;AACtB,eAAW,YAAY,UAAU;AAC/B,gBAAU,IAAI,OAAO,SAAS,UAAU,SAAS,GAAG,GAAG,QAAQ;AAAA,IACjE;AAAA,EACF;AAMA,WAAS,aAAa,UAAkD;AACtE,QAAI,CAAC,SAAU;AACf,UAAM,gBAAgB,YAAY;AAClC,UAAM,wBAAwB,SAAS;AACvC,UAAM,oBAAoB,YAAY;AACtC,UAAM,4BAA4B,SAAS;AAC3C,UAAM,eAAe,eAAe;AACpC,UAAM,uBAAuB,uBAAuB;AACpD,iBAAa;AAAA,MACX,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAI,iBAAiB,wBACjB;AAAA,QACE,uBAAuB;AAAA,UACrB,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAI,gBAAgB,uBAChB;AAAA,YACE,8BAA8B,EAAE,GAAG,cAAc,GAAG,qBAAqB;AAAA,UAC3E,IACA,CAAC;AAAA,QACP;AAAA,MACF,IACA,CAAC;AAAA,MACL,GAAI,qBAAqB,4BACrB;AAAA,QACE,2BAA2B,EAAE,GAAG,mBAAmB,GAAG,0BAA0B;AAAA,MAClF,IACA,CAAC;AAAA,IACP;AAAA,EACF;AAOA,WAAS,mBACP,IACA,YACM;AACN,QAAI,GAAG,qBAAqB,GAAG,MAAM,KAAM;AAC3C,OAAG,oBAAoB;AACvB,eAAW,QAAQ;AAAA,MACjB,IAAI,GAAG;AAAA,MACP,UAAU,GAAG,YAAY;AAAA,MACzB,MAAM;AAAA,IACR,CAAC;AACD,QAAI,GAAG,UAAU,SAAS,GAAG;AAC3B,iBAAW,QAAQ;AAAA,QACjB,OAAO,GAAG;AAAA,QACV,IAAI,GAAG;AAAA,QACP,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,WAAW,YAAY,WAAW,QAAQ,WAAW,EAAE,OAAO,aAAa,EAAE;AACnF,MAAI,WAAW;AACf,SAAO,IAAI,eAAuC;AAAA,IAChD,MAAM,SAAS;AACb,iBAAW;AAEX,aAAO;AACP,YAAM,SAAS,OAAO,MAAS;AAAA,IACjC;AAAA,IACA,MAAM,KAAK,YAAY;AACrB,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,SAAS,KAAK;AAC5C,UAAI,SAAU;AACd,UAAI,KAAM,YAAW,MAAM;AAAA,UACtB,YAAW,QAAQ,KAAK;AAAA,IAC/B;AAAA,EACF,CAAC,EAAE;AAAA,IACD,IAAI,gBAAmE;AAAA,MACrE,MAAM,YAAY;AAChB,YAAI,QAAQ,aAAa,SAAS;AAChC;AAAA,YACE,iBAAiB,QAAQ,YAAY,MAAM;AAAA,YAC3C;AAAA,YACAA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA;AAAA,QACF;AAEA,cAAM,sBAAsB;AAAA,UAC1B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,YAAI,YAAY,cAAc,aAAa;AACzC,qBAAW,QAAQ,EAAE,IAAI,aAAa,MAAM,WAAW,CAAC;AAAA,QAC1D;AAEA,cAAM,oBAAoB,8BAA8B;AACxD,YAAI,mBAAmB;AACrB,sBAAY,eAAe,gBAAgB,iBAAiB;AAAA,QAC9D,WAAW,qBAAqB;AAC9B,sBAAY,eAAe;AAAA,YACzB,KAAK;AAAA,YACL,SAAS;AAAA,UACX;AAAA,QACF;AAGA,oBAAY,QAAQ,cAAc,UAAU;AAE5C,yBAAiB,6BAA6B,CAAC;AAC/C,YAAI,WAAW;AACb,qBAAW,YAAY,UAAU,OAAO,GAAG;AACzC,uBAAW,QAAQ;AAAA,cACjB,IAAI,OAAO,SAAS,UAAU,SAAS,GAAG;AAAA,cAC1C,YAAY;AAAA,cACZ,OAAO,SAAS;AAAA,cAChB,MAAM;AAAA,cACN,KAAK,SAAS;AAAA,YAChB,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,6BAA6B,wCAAwC;AAE3E,mBAAW,QAAQ;AAAA,UACjB,cAAc,YAAY;AAAA,UAC1B,kBAAkB;AAAA,YAChB,CAAC,YAAY,GAAG;AAAA,cACd,GAAG,4BAA4B,UAAU;AAAA,cACzC,cAAc,YAAY,aAAa,OAAO;AAAA,cAC9C,oBAAoB,YAAY;AAAA,cAChC,GAAI,4BAA4B,SAC5B;AAAA,gBACE,sBAAsB,oBAAoB,0BAA0B;AAAA,cACtE,IACA,CAAC;AAAA,cACL,GAAI,oBAAoB,EAAE,WAAW,kBAAkB,IAAI,CAAC;AAAA,cAC5D,YAAY,yBAAyB;AAAA,cACrC;AAAA,YACF;AAAA,UACF;AAAA,UACA,MAAM;AAAA,UACN,OAAO,YAAY;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,YAAY;AAChB,mBAAW,QAAQ;AAAA,UACjB,MAAM;AAAA,UACN,UAAU,CAAC,GAAG,QAAQ;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,MAEA,UAAU,OAAO,YAAY;AAC3B,YAAI,QAAQ,aAAa,WAAW,EAAE,iBAAiB,QAAQ;AAC7D,kBAAQ,iBAAiB,QAAQ,YAAY,MAAM;AAAA,QACrD;AACA,YAAI,iBAAiB,OAAO;AAC1B,4BAAkB,OAAO,YAAYA,sBAAqB,SAAS,SAAS,GAAG;AAC/E;AAAA,QACF;AAEA,YAAI,kBAAkB;AACpB,qBAAW,QAAQ;AAAA,YACjB,UAAW,MAA8B,SAAS;AAAA,YAClD,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAEA,cAAM,WAAW,qBAAqB,KAAK;AAC3C,YAAI,SAAS,UAAW,qBAAoB,SAAS;AACrD,cAAM,mBAAmB,SAAS;AAClC,cAAM,kBACH,iBAAiB,OAAO,UACvB,iBAAiB,OAAO,yBAAyB,MAClD,iBAAiB,YAAY,UAC5B,iBAAiB,YAAY,yBAAyB,WACvD,iBAAiB,cAAc,UAC9B,iBAAiB,UAAU,QAAQ,MAAM,yBAAyB,WAAW,QAAQ;AACzF,eAAO,OAAO,0BAA0B,gBAAgB;AACxD,qBAAa,MAAM,gBAAgB,CAAC;AACpC,yBAAiB,MAAM,eAAe,CAAC;AAEvC,YAAI,YAAY,gBAAgB,iBAAiB;AAC/C,sBAAY,eAAe;AAC3B,qBAAW,QAAQ;AAAA,YACjB,GAAG;AAAA,YACH,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAEA,cAAM,iBAAiB,MAAM,kBAAkB;AAC/C,YAAI,MAAM,QAAQ,cAAc,KAAK,eAAe,SAAS,GAAG;AAC9D,sBAAY,eAAe;AAAA,YACzB,KAAK;AAAA,YACL,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,eAAe,MAAM,gBAAgB;AAC3C,YAAI,OAAO,iBAAiB,YAAY,aAAa,SAAS,GAAG;AAC/D,wBAAc;AAAA,YACZ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAEA,YAAI,MAAM,QAAQ,cAAc,KAAK,eAAe,SAAS,GAAG;AAC9D,+BAAqB,gBAAgB,YAAY,qBAAqB,kBAAkB;AAAA,QAC1F;AAEA,cAAM,oBAAoB,MAAM,gBAAgB;AAChD,YAAI,mBAAmB;AACrB,sBAAY,eAAe,gBAAgB,iBAAiB;AAE5D,cAAI,YAAY,aAAa,YAAY,cAAc;AACrD,8BAAkB,YAAY,qBAAqB,aAAa,kBAAkB;AAElF,gBAAI,YAAY,cAAc,aAAa;AACzC,yBAAW,QAAQ,EAAE,IAAI,aAAa,MAAM,WAAW,CAAC;AACxD,0BAAY,aAAa;AAAA,YAC3B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAWA,SAAS,kBACP,YACA,qBACA,aACA,oBAIS;AACT,MAAI,sBAAsB;AAE1B,aAAW,MAAM,oBAAoB,OAAO,GAAG;AAC7C,QAAI,GAAG,aAAa;AAClB;AAAA,IACF;AAEA,OAAG,OAAO,YAAY,mBAAmB;AACzC,uBAAmB,IAAI,UAAU;AAEjC,0BAAsB;AACtB,OAAG,cAAc;AACjB,eAAW,QAAQ,EAAE,IAAI,GAAG,IAAI,MAAM,iBAAiB,CAAC;AACxD,eAAW,QAAQ;AAAA,MACjB,OAAO,GAAG;AAAA,MACV,YAAY,GAAG;AAAA,MACf,UAAU,GAAG,YAAY;AAAA,MACzB,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAYA,SAAS,kBACP,OACA,YACAA,sBACA,SACA,SACA,KACM;AACN,QAAM,UAAUA,qBAAoB,OAAO;AAAA,IACzC;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa,8BAA8B,OAAO;AAAA,IAClD;AAAA,EACF,CAAC;AACD,aAAW,QAAQ;AAAA,IACjB,OAAO,mBAAmB,QAAQ,UAAU,IAAI,MAAM,OAAO,OAAO,CAAC;AAAA,IACrE,MAAM;AAAA,EACR,CAAC;AACD,aAAW,UAAU;AACvB;AAYA,SAAS,gBACP,cACA,YACA,aACA,oBACA,aACQ;AACR,MAAI,cAAc;AAClB,MAAI,CAAC,YAAY,YAAY;AAC3B,kBAAc,YAAY,oBAAoB;AAC9C,eAAW,QAAQ,EAAE,IAAI,aAAa,MAAM,aAAa,CAAC;AAC1D,gBAAY,aAAa;AAAA,EAC3B;AACA,MAAI,aAAa;AACf,eAAW,QAAQ;AAAA,MACjB,OAAO;AAAA,MACP,IAAI;AAAA,MACJ,MAAM;AAAA,IACR,CAAC;AACD,WAAO;AAAA,EACT;AACA,SAAO,sBAAsB,YAAY,oBAAoB;AAC/D;AAUA,SAAS,qBACP,gBACA,YACA,qBACA,oBAIM;AACN,aAAW,iBAAiB,gBAAgB;AAC1C,UAAM,QAAQ,cAAc;AAC5B,QAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD;AAAA,IACF;AAEA,QAAI,CAAC,oBAAoB,IAAI,KAAK,GAAG;AACnC,0BAAoB,IAAI,OAAO;AAAA,QAC7B,WAAW;AAAA,QACX,aAAa;AAAA,QACb,mBAAmB;AAAA,QACnB,IACE,OAAO,cAAc,OAAO,YAAY,cAAc,GAAG,SAAS,IAC9D,cAAc,KACd;AAAA,QACN,UAAU,cAAc,UAAU;AAAA,MACpC,CAAC;AAAA,IACH;AAEA,UAAM,KAAK,oBAAoB,IAAI,KAAK;AACxC,QAAI,CAAC,GAAI;AAET,QACE,OAAO,cAAc,OAAO,YAC5B,cAAc,GAAG,SAAS,KAC1B,GAAG,OAAO,QACV;AACA,SAAG,KAAK,cAAc;AAAA,IACxB;AAEA,UAAM,eAAe,cAAc,UAAU;AAC7C,QAAI,OAAO,iBAAiB,YAAY,aAAa,SAAS,GAAG;AAC/D,SAAG,WAAW;AAAA,IAChB;AAEA,QAAI,CAAC,GAAG,qBAAqB,GAAG,YAAY,QAAQ,GAAG,MAAM,MAAM;AACjE,yBAAmB,IAAI,UAAU;AAAA,IACnC;AAEA,UAAM,iBAAiB,cAAc,UAAU;AAC/C,QAAI,OAAO,mBAAmB,YAAY,eAAe,SAAS,GAAG;AACnE,SAAG,aAAa;AAEhB,UAAI,GAAG,qBAAqB,GAAG,MAAM,MAAM;AACzC,mBAAW,QAAQ;AAAA,UACjB,OAAO;AAAA,UACP,IAAI,GAAG;AAAA,UACP,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAYA,gBAAgB,YACd,UACA,aACiC;AACjC,MAAI;AACF,qBAAiB,SAAS,UAAU;AAClC,mBAAa,eAAe;AAC5B,YAAM;AAAA,IACR;AACA,iBAAa,eAAe;AAAA,EAC9B,SAAS,OAAO;AACd,QAAI,aAAa,SAAS;AACxB,YAAM,iBAAiB,YAAY,MAAM;AAAA,IAC3C,OAAO;AACL,YAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IAChE;AAAA,EACF;AACF;;;ACxjBO,IAAe,4BAAf,MAI0C;AAAA;AAAA;AAAA;AAAA;AAAA,EAK/C,OAAgB,wBAAiD;AAAA,IAC/D,EAAE,cAAc,aAAa,WAAW,mBAAmB,WAAW,wBAAwB;AAAA,IAC9F,EAAE,cAAc,eAAe,WAAW,eAAe,WAAW,cAAc;AAAA,IAClF,EAAE,cAAc,QAAQ,WAAW,QAAQ,WAAW,QAAQ;AAAA,IAC9D;AAAA,MACE,cAAc;AAAA,MACd,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,cAAc;AAAA,MACd,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAAA,IACA,EAAE,cAAc,QAAQ,WAAW,QAAQ,WAAW,OAAO;AAAA,IAC7D,EAAE,WAAW,aAAa,WAAW,mBAAmB;AAAA,IACxD,EAAE,cAAc,uBAAuB,WAAW,sBAAsB;AAAA,EAC1E;AAAA,EAEA,MAAM,WACJ,QACA,UACA,SACwC;AACxC,QAAI;AACF,UAAI,QAAQ,aAAa,QAAS,OAAM,iBAAiB,QAAQ,YAAY,MAAM;AACnF,YAAM,cAAc,KAAK,iBAAiB,QAAQ,UAAU,OAAO;AACnE,YAAM,EAAE,SAAS,SAAS,IAAI,KAAK,aAAa,QAAQ,UAAU,SAAS,WAAW;AAEtF,YAAM,SAAS,KAAK,aAAa,QAAQ,UAAU,WAAW;AAE9D,YAAM,WAAW,MAAM,KAAK;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,mBAAmB,OAAO,eAAe,QAAQ,aAAa,QAAQ,OAAO;AAAA,MAC/E;AAEA,aAAO,oBAAoB;AAAA,QACzB,cAAc,YAAY;AAAA,QAC1B,aAAa;AAAA,QACb,WAAW,SAAS;AAAA,QACpB;AAAA,QACA,iBAAiB,iBAAiB,SAAS,YAAY,OAAO;AAAA,QAC9D,SAAS;AAAA,QACT,UAAU,CAAC,GAAG,YAAY,UAAU,GAAG,QAAQ;AAAA,MACjD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,oBAAoB,OAAO;AAAA,QAC/B,SAAS,OAAO;AAAA,QAChB,WAAW;AAAA,QACX,WAAW;AAAA,QACX,aAAa,8BAA8B,OAAO;AAAA,QAClD,KAAK,KAAK,OAAO;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,QACA,UACA,SACsC;AACtC,QAAI;AACF,UAAI,QAAQ,aAAa,QAAS,OAAM,iBAAiB,QAAQ,YAAY,MAAM;AACnF,YAAM,cAAc,KAAK,iBAAiB,QAAQ,UAAU,OAAO;AACnE,YAAM,EAAE,SAAS,SAAS,IAAI,KAAK,aAAa,QAAQ,UAAU,SAAS,WAAW;AAEtF,YAAM,SAAS,KAAK,aAAa,QAAQ,UAAU,WAAW;AAE9D,YAAM,iBAAiB,MAAM,KAAK;AAAA,QAChC;AAAA,QACA;AAAA,QACA,QAAQ,eAAe;AAAA,QACvB;AAAA,QACA,mBAAmB,OAAO,eAAe,QAAW,QAAQ,OAAO;AAAA,QACnE;AAAA,MACF;AAEA,YAAM,cAAc,IAAI,kBAAkB;AAE1C,YAAM,iBAAiB,KAAK,sBAAsB,UAAU,YAAY,UAAU;AAElF,YAAM,oBAAoB,wBAAwB;AAAA,QAChD,QAAQ,eAAe;AAAA,QACvB;AAAA,QACA,sBAAsB,CAAC,UAAU,KAAK,gBAAgB,KAAK;AAAA,QAC3D;AAAA,QACA,kBAAkB,QAAQ,oBAAoB;AAAA,QAC9C,SAAS,OAAO;AAAA,QAChB;AAAA,QACA,cAAc,YAAY;AAAA,QAC1B,WAAW,eAAe;AAAA,QAC1B,kBAAkB;AAAA,UAChB,GAAG,eAAe;AAAA,UAClB,IAAI,eAAe,kBAAkB,MAAM,YAAY,mBAAmB;AAAA,QAC5E;AAAA,QACA,WAAW,eAAe;AAAA,QAC1B,4BAA4B,eAAe;AAAA,QAC3C,+BAA+B,eAAe;AAAA,QAC9C,uCAAuC,eAAe;AAAA,QACtD,KAAK,KAAK,OAAO;AAAA,QACjB,SAAS;AAAA,QACT,UAAU,CAAC,GAAG,YAAY,UAAU,GAAG,UAAU,GAAG,cAAc;AAAA,MACpE,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA,UAAU;AAAA,UACR,SAAS,eAAe;AAAA,QAC1B;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF,SAAS,OAAO;AACd,YAAM,oBAAoB,OAAO;AAAA,QAC/B,SAAS,OAAO;AAAA,QAChB,WAAW;AAAA,QACX,WAAW;AAAA,QACX,aAAa,8BAA8B,OAAO;AAAA,QAClD,KAAK,KAAK,OAAO;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUU,iBACR,QACA,UACA,SAC6D;AAC7D,UAAM,eAAe,gBAAgB,OAAO,QAAQ;AAEpD,UAAM,aAAa,OAAO;AAE1B,UAAM,WAA8B,CAAC;AAErC,UAAM,gBAAgB,KAAK;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,WAAW,qBAAqB,QAAQ,QAAQ;AAAA,MACpD,4BAA4B,KAAK,8BAA8B,YAAY,QAAQ;AAAA,MACnF,kBAAkB,KAAK,oBAAoB,YAAY,QAAQ;AAAA,MAC/D,0BAA0B,KAAK,6BAA6B;AAAA,MAC5D;AAAA,IACF,CAAC;AAED,UAAM,EAAE,aAAa,UAAU,cAAc,IAAI,iBAAiB;AAAA,MAChE;AAAA,MACA,eAAe,KAAK,iBAAiB;AAAA,MACrC,qBAAqB,YAAY;AAAA,MACjC,qBAAqB,SAAS;AAAA,IAChC,CAAC;AACD,aAAS,KAAK,GAAG,aAAa;AAE9B,UAAM,aAAa,cAAc,QAAQ,UAAU;AAEnD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BU,sBACR,WACA,aACmB;AACnB,WAAO,CAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwDU,gBAAgB,UAIxB;AACA,UAAM,mBAAmB;AAAA,MACvB;AAAA,MACA,KAAK,sBAAsB;AAAA,IAC7B;AACA,UAAM,EAAE,SAAS,UAAU,IAAI,wBAAwB,UAAU,aAAa;AAC9E,WAAO,EAAE,WAAW,iBAAiB,SAAS,iBAAiB;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBU,8BACR,aACA,WACS;AACT,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASU,oBACR,YACA,UACS;AACT,WACG,YAAY,oBAA4C,SAAS,oBAAoB;AAAA,EAE1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBU,+BAAqE;AAC7E,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBU,uBACR,SACA,WACA,aACA,UACA,WACS;AACT,WAAO;AAAA,EACT;AACF;","names":["convertToAISDKError"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/sap-ai-provider-options.ts","../src/deep-merge.ts","../src/sap-ai-error.ts","../src/version.ts"],"sourcesContent":["/**\n * Zod schemas for runtime validation of per-call options via `providerOptions['sap-ai']`.\n */\n\nimport type { SharedV3Warning } from \"@ai-sdk/provider\";\nimport type { InferSchema } from \"@ai-sdk/provider-utils\";\nimport type { OrchestrationConfigRefOverride } from \"@sap-ai-sdk/orchestration\";\n\nimport { lazySchema, zodSchema } from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\n\n/** Default provider name used as key in `providerOptions` and `providerMetadata` objects. */\nexport const SAP_AI_PROVIDER_NAME = \"sap-ai\" as const;\n\n/**\n * Extracts the provider name from a provider identifier (e.g., \"sap-ai.chat\" → \"sap-ai\").\n * @param providerIdentifier - The full provider identifier string.\n * @returns The prefix before the first dot, or the unchanged identifier when no dot exists.\n */\nexport function getProviderName(providerIdentifier: string): string {\n const dotIndex = providerIdentifier.indexOf(\".\");\n return dotIndex === -1 ? providerIdentifier : providerIdentifier.slice(0, dotIndex);\n}\n\n/**\n * @internal\n */\nexport const modelParamsSchema = z\n .object({\n frequencyPenalty: z.number().min(-2).max(2).optional(),\n maxTokens: z.number().int().positive().optional(),\n n: z.number().int().positive().optional(),\n parallel_tool_calls: z.boolean().optional(),\n presencePenalty: z.number().min(-2).max(2).optional(),\n temperature: z.number().min(0).max(2).optional(),\n topP: z.number().min(0).max(1).optional(),\n })\n .catchall(z.unknown());\n\n/** @internal */\nexport type ModelParams = z.infer<typeof modelParamsSchema>;\n\n/**\n * @internal\n */\nexport const embeddingModelParamsSchema = z\n .object({\n dimensions: z.number().int().positive().optional(),\n encoding_format: z.enum([\"base64\", \"binary\", \"float\"]).optional(),\n normalize: z.boolean().optional(),\n })\n .catchall(z.unknown());\n\n/** @internal */\nexport type EmbeddingModelParams = z.infer<typeof embeddingModelParamsSchema>;\n\n/**\n * Validates embedding model parameters from constructor settings.\n * @param modelParams - The model parameters to validate.\n * @returns The validated embedding model parameters.\n * @throws {z.ZodError} If validation fails.\n */\nexport function validateEmbeddingModelParamsSettings(modelParams: unknown): EmbeddingModelParams {\n return embeddingModelParamsSchema.parse(modelParams);\n}\n\n/**\n * Validates model parameters from constructor settings.\n * @param modelParams - The model parameters to validate.\n * @returns The validated model parameters.\n * @throws {z.ZodError} If validation fails.\n */\nexport function validateModelParamsSettings(modelParams: unknown): ModelParams {\n return modelParamsSchema.parse(modelParams);\n}\n\n/**\n * Validates Vercel AI SDK standard parameters and adds warnings for out-of-range values.\n * @param params - The parameters to validate.\n * @param params.frequencyPenalty - Frequency penalty value (-2.0 to 2.0).\n * @param params.maxTokens - Maximum tokens value (positive integer).\n * @param params.presencePenalty - Presence penalty value (-2.0 to 2.0).\n * @param params.temperature - Temperature value (0 to 2).\n * @param params.topP - Top-p value (0 to 1).\n * @param warnings - Array to collect validation warnings.\n */\nexport function validateModelParamsWithWarnings(\n params: {\n frequencyPenalty?: number;\n maxTokens?: number;\n presencePenalty?: number;\n temperature?: number;\n topP?: number;\n },\n warnings: SharedV3Warning[],\n): void {\n const result = modelParamsSchema.safeParse(params);\n\n if (!result.success) {\n for (const issue of result.error.issues) {\n const path = issue.path.join(\".\");\n const value = path ? (params as Record<string, unknown>)[path] : undefined;\n warnings.push({\n message: `${path}=${String(value)} is invalid: ${issue.message}. The API may reject this value.`,\n type: \"other\",\n });\n }\n }\n}\n\n/** @internal */\nexport const sapAIApiTypeSchema = z.enum([\"orchestration\", \"foundation-models\"]);\n\n/**\n * Anthropic prompt-caching directive accepted on V3 message-parts via\n * `providerOptions['sap-ai'].cacheControl`.\n * @internal\n */\nexport const cacheControlSchema = z.object({\n ttl: z.enum([\"5m\", \"1h\"]).optional(),\n type: z.literal(\"ephemeral\"),\n});\n\n/** @internal */\nexport type CacheControl = z.infer<typeof cacheControlSchema>;\n\n/**\n * Per-message-part SAP AI provider options read from\n * `LanguageModelV3*Part.providerOptions['sap-ai']`.\n * @internal\n */\nexport const sapAIPartProviderOptionsSchema = z.object({\n cacheControl: cacheControlSchema.optional(),\n});\n\n/**\n * Callback that reads per-message-part `providerOptions` and returns the validated\n * `sap-ai` slice (e.g. `cacheControl`), or `undefined` when absent or invalid.\n * Optional `warnings` sink collects validation issues; the SAP parser deduplicates identical messages.\n * @internal\n */\nexport type ParsePartProviderOptions = (\n providerOptions: unknown,\n warnings?: SharedV3Warning[],\n) => SAPAIPartProviderOptions | undefined;\n\n/** @internal */\nexport type SAPAIPartProviderOptions = z.infer<typeof sapAIPartProviderOptionsSchema>;\n\n/**\n * Parses per-part `providerOptions['sap-ai']`.\n *\n * Returns `undefined` when the block is absent or invalid. When `warnings` is\n * provided, Zod validation issues are surfaced as `SharedV3Warning` entries so\n * the strategy layer can forward them to the AI SDK call result. Identical messages\n * already present in the sink are not added again.\n * @param providerOptions - Part-level providerOptions bag.\n * @param warnings - Optional sink for Zod validation issues.\n * @returns Validated per-part options, or undefined.\n * @internal\n */\nexport function parseSAPPartProviderOptions(\n providerOptions: unknown,\n warnings?: SharedV3Warning[],\n): SAPAIPartProviderOptions | undefined {\n if (!providerOptions || typeof providerOptions !== \"object\") {\n return undefined;\n }\n const block = (providerOptions as Record<string, unknown>)[SAP_AI_PROVIDER_NAME];\n if (block === undefined) {\n return undefined;\n }\n const parsed = sapAIPartProviderOptionsSchema.safeParse(block);\n if (parsed.success) {\n return parsed.data;\n }\n if (warnings) {\n for (const issue of parsed.error.issues) {\n const path = issue.path.join(\".\");\n const message = `providerOptions['sap-ai']${path ? `.${path}` : \"\"} is invalid: ${issue.message}. The directive was dropped.`;\n if (!warnings.some((w) => (w as { message?: string }).message === message)) {\n warnings.push({ message, type: \"other\" });\n }\n }\n }\n return undefined;\n}\n\n/** @internal */\nexport const promptTemplateScopeSchema = z.enum([\"tenant\", \"resource_group\"]);\n\n/** @internal */\nexport const promptTemplateRefByIdSchema = z.object({\n id: z.string().min(1, \"Template ID cannot be empty\"),\n scope: promptTemplateScopeSchema.optional(),\n});\n\n/** @internal */\nexport const promptTemplateRefByScenarioNameVersionSchema = z.object({\n name: z.string().min(1, \"Template name cannot be empty\"),\n scenario: z.string().min(1, \"Scenario cannot be empty\"),\n scope: promptTemplateScopeSchema.optional(),\n version: z.string().min(1, \"Version cannot be empty\"),\n});\n\n/** @internal */\nexport const promptTemplateRefSchema = z.union([\n promptTemplateRefByIdSchema,\n promptTemplateRefByScenarioNameVersionSchema,\n]);\n\n/**\n * Partial override of a stored orchestration configuration, forwarded verbatim to the\n * `OrchestrationClient` constructor. Shape is owned by the SAP AI SDK\n * (`OrchestrationConfigRefOverride`); only the transport-level contract is validated here.\n * @internal\n */\nexport const orchestrationConfigRefOverrideSchema = z\n .custom<OrchestrationConfigRefOverride>(\n (value) => typeof value === \"object\" && value !== null && !Array.isArray(value),\n { message: \"overrideConfig must be an object\" },\n )\n .refine(\n (value) => {\n let stream: unknown;\n try {\n stream = value.stream;\n } catch {\n // Hostile input (throwing getter or Proxy trap): treat as invalid shape.\n return false;\n }\n return (\n stream === undefined ||\n (Boolean(stream) && typeof stream === \"object\" && !Array.isArray(stream))\n );\n },\n { message: \"overrideConfig.stream must be an object\" },\n )\n .refine(\n (value) => {\n let stream: unknown;\n try {\n stream = value.stream;\n } catch {\n // Already rejected by the previous refine.\n return true;\n }\n if (stream === undefined || stream === null || typeof stream !== \"object\") {\n return true;\n }\n try {\n return !(\"enabled\" in stream);\n } catch {\n // Hostile Proxy has-trap: treat as invalid shape.\n return false;\n }\n },\n {\n message:\n \"stream.enabled is not allowed in overrideConfig: it is controlled by the call site (stream() or chatCompletion())\",\n },\n );\n\n/** @internal */\nexport const orchestrationConfigRefByIdSchema = z.object({\n id: z.string().min(1, \"Config ID cannot be empty\"),\n overrideConfig: orchestrationConfigRefOverrideSchema.optional(),\n});\n\n/** @internal */\nexport const orchestrationConfigRefByScenarioNameVersionSchema = z.object({\n name: z.string().min(1, \"Config name cannot be empty\"),\n overrideConfig: orchestrationConfigRefOverrideSchema.optional(),\n scenario: z.string().min(1, \"Scenario cannot be empty\"),\n version: z.string().min(1, \"Version cannot be empty\"),\n});\n\n/** @internal */\nexport const orchestrationConfigRefSchema = z.union([\n orchestrationConfigRefByIdSchema,\n orchestrationConfigRefByScenarioNameVersionSchema,\n]);\n\n/** @internal */\nexport const sapAILanguageModelProviderOptions = lazySchema(() =>\n zodSchema(\n z.object({\n api: sapAIApiTypeSchema.optional(),\n escapeTemplatePlaceholders: z.boolean().optional(),\n includeReasoning: z.boolean().optional(),\n modelParams: modelParamsSchema.optional(),\n orchestrationConfigRef: orchestrationConfigRefSchema.optional(),\n placeholderValues: z.record(z.string(), z.string()).optional(),\n promptTemplateRef: promptTemplateRefSchema.optional(),\n }),\n ),\n);\n\n/** @internal */\nexport type SAPAILanguageModelProviderOptions = InferSchema<\n typeof sapAILanguageModelProviderOptions\n>;\n\n/** @internal */\nexport const sapAIEmbeddingProviderOptions = lazySchema(() =>\n zodSchema(\n z.object({\n api: sapAIApiTypeSchema.optional(),\n modelParams: embeddingModelParamsSchema.optional(),\n type: z.enum([\"document\", \"query\", \"text\"]).optional(),\n }),\n ),\n);\n\n/** @internal */\nexport type SAPAIEmbeddingProviderOptions = InferSchema<typeof sapAIEmbeddingProviderOptions>;\n","/** Plain-object merge utility with own-property copying. */\n\n/** @internal */\nconst MAX_DEPTH = 100;\n\n/**\n * Recursively merges and copies plain objects without traversing inherited properties.\n * All string keys are preserved as own data properties, including JSON Schema names\n * such as `constructor` and `__proto__`, without changing object prototypes.\n * Arrays and other non-plain values replace earlier values by reference; their\n * contents are not traversed. Undefined sources are skipped, but an explicit\n * undefined property value replaces the earlier property value.\n * @param sources - Objects to merge.\n * @returns Merged object.\n * @throws {Error} When traversed plain objects contain a cycle or exceed the depth limit.\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n ...sources: (Partial<T> | undefined)[]\n): T {\n const result: Record<string, unknown> = {};\n for (const source of sources) {\n if (source != null) mergeInto(result, source, new Set(), 0);\n }\n return result as T;\n}\n\n/**\n * @param value - Value to check.\n * @returns True if value is a plain object.\n * @internal\n */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value) as unknown;\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Merges a source into an owned accumulator with ancestor-based cycle detection.\n * @param target - Private accumulator, never a caller-owned object.\n * @param source - Source object.\n * @param ancestors - Objects in the current recursion path.\n * @param depth - Current recursion depth.\n * @returns The accumulator.\n * @internal\n */\nfunction mergeInto(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n ancestors: Set<object>,\n depth: number,\n): Record<string, unknown> {\n if (depth > MAX_DEPTH) throw new Error(\"Maximum merge depth exceeded\");\n if (ancestors.has(source)) throw new Error(\"Circular reference detected during deep merge\");\n ancestors.add(source);\n\n for (const key of Object.keys(source)) {\n const sourceValue = source[key];\n const targetValue = Object.hasOwn(target, key) ? target[key] : undefined;\n const value = isPlainObject(sourceValue)\n ? mergeInto(isPlainObject(targetValue) ? targetValue : {}, sourceValue, ancestors, depth + 1)\n : sourceValue;\n\n // Define data properties instead of invoking inherited setters such as __proto__.\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true,\n });\n }\n\n ancestors.delete(source);\n return target;\n}\n","/** Error conversion utilities for SAP AI Core to Vercel AI SDK error types. */\nimport type { OrchestrationErrorResponse } from \"@sap-ai-sdk/orchestration\";\n\nimport {\n APICallError,\n InvalidPromptError,\n LoadAPIKeyError,\n NoSuchModelError,\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\";\nimport { isErrorWithCause } from \"@sap-cloud-sdk/util\";\n\nimport type { SAPAIApiType } from \"./sap-ai-settings.js\";\n\ninterface AxiosResponse {\n data?: unknown;\n headers?: unknown;\n status?: number;\n}\n\n/** Request metadata used when translating SAP failures. */\ninterface ErrorContext {\n httpStatusCode?: number;\n modelId?: string;\n modelType?: \"embeddingModel\" | \"languageModel\";\n operation?: string;\n requestBody?: unknown;\n responseHeaders?: Record<string, string>;\n url?: string;\n}\n\n/** Diagnostic response body is retained explicitly, never appended to the message. */\ninterface ResolvedErrorContext extends ErrorContext {\n responseBody?: string;\n}\n\n/**\n * @internal\n */\nconst HTTP_STATUS = {\n BAD_REQUEST: 400,\n CLIENT_CLOSED_REQUEST: 499,\n CONFLICT: 409,\n FORBIDDEN: 403,\n INTERNAL_ERROR: 500,\n NOT_FOUND: 404,\n RATE_LIMIT: 429,\n REQUEST_TIMEOUT: 408,\n SERVICE_UNAVAILABLE: 503,\n UNAUTHORIZED: 401,\n} as const;\n\n/**\n * Error message matchers for categorization and retryability.\n * @internal\n */\nconst ERROR_MATCHERS = [\n {\n category: \"network\",\n isRetryable: true,\n keywords: [\"econnrefused\", \"enotfound\", \"network\", \"timeout\"],\n statusCode: HTTP_STATUS.SERVICE_UNAVAILABLE,\n },\n {\n category: \"destination\",\n isRetryable: false,\n keywords: [\"could not resolve destination\"],\n message: (original: string) =>\n `SAP AI Core destination error: ${original}\\n\\n` +\n `Check your destination configuration or provide a valid destinationName.`,\n statusCode: HTTP_STATUS.BAD_REQUEST,\n },\n {\n category: \"content filtered\",\n isRetryable: false,\n keywords: [\"filtered by the output filter\"],\n message: (original: string) =>\n `Content was filtered: ${original}\\n\\n` +\n `The model's response was blocked by content safety filters. Try a different prompt.`,\n statusCode: HTTP_STATUS.BAD_REQUEST,\n },\n {\n category: \"stream consumption\",\n isRetryable: false,\n keywords: [\"consumed stream\"],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"streaming\",\n isRetryable: true,\n keywords: [\n \"iterating over\",\n \"parse message into json\",\n \"received from\",\n \"no body\",\n \"invalid sse payload\",\n ],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"configuration\",\n isRetryable: false,\n keywords: [\n \"prompt template or messages must be defined\",\n \"filtering parameters cannot be empty\",\n \"templating yaml string must be non-empty\",\n \"could not access response data\",\n \"could not parse json\",\n \"error parsing yaml\",\n \"yaml does not conform\",\n \"validation errors\",\n ],\n statusCode: HTTP_STATUS.BAD_REQUEST,\n },\n {\n category: \"environment\",\n isRetryable: false,\n keywords: [\"buffer is not available as globals\"],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"response stream\",\n isRetryable: false,\n keywords: [\"response stream is undefined\"],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"response processing\",\n isRetryable: true,\n keywords: [\n \"response is required to process\",\n \"stream is still open\",\n \"data is not available yet\",\n ],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n {\n category: \"deployment retrieval\",\n isRetryable: true,\n keywords: [\"failed to fetch the list of deployments\"],\n statusCode: HTTP_STATUS.SERVICE_UNAVAILABLE,\n },\n {\n category: \"stream buffer\",\n isRetryable: false,\n keywords: [\"received non-uint8array\"],\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n] as const;\n\n/**\n * Keywords that indicate an authentication error.\n * @internal\n */\nconst AUTHENTICATION_ERROR_KEYWORDS = [\n \"authentication\",\n \"unauthorized\",\n \"aicore_service_key\",\n \"invalid credentials\",\n \"service credentials\",\n \"service binding\",\n] as const;\n\n/**\n * Keywords that indicate a deployment/model resolution error.\n * @internal\n */\nconst DEPLOYMENT_ERROR_KEYWORDS = [\n \"failed to resolve deployment\",\n \"no deployment matched\",\n] as const;\n\n/**\n * Error thrown when attempting to switch APIs at invocation time with conflicting model settings.\n * @example\n * ```typescript\n * const model = provider(\"gpt-4.1\", { filtering: { ... } });\n *\n * await generateText({\n * model,\n * providerOptions: { [SAP_AI_PROVIDER_NAME]: { api: \"foundation-models\" } },\n * prompt: \"Hello\",\n * });\n * // Throws: ApiSwitchError(\"orchestration\", \"foundation-models\", \"filtering\")\n * ```\n * @see {@link validateSettings} - Main validation function that throws this error\n * @see {@link UnsupportedFeatureError} - Related error for features unsupported by an API\n */\nexport class ApiSwitchError extends Error {\n /**\n * Creates a new ApiSwitchError.\n * @param fromApi - The API the model was configured with.\n * @param toApi - The API being switched to at invocation time.\n * @param conflictingFeature - The feature that prevents the API switch.\n */\n constructor(\n public readonly fromApi: SAPAIApiType,\n public readonly toApi: SAPAIApiType,\n public readonly conflictingFeature: string,\n ) {\n super(\n `Cannot switch from ${fromApi} to ${toApi} API at invocation time because ` +\n `${conflictingFeature} would be ignored. Create a new model instance without ` +\n `${fromApi}-specific features, or keep using the ${fromApi} API.`,\n );\n this.name = \"ApiSwitchError\";\n }\n}\n\n/**\n * Error thrown when a feature is used with an incompatible API.\n * @example\n * ```typescript\n * throw new UnsupportedFeatureError(\"Content filtering\", \"foundation-models\", \"orchestration\");\n * // Rejects the request: content filtering requires the Orchestration API.\n * ```\n * @see {@link validateSettings} - Main validation function that throws this error\n * @see {@link ApiSwitchError} - Related error for API switching conflicts\n */\nexport class UnsupportedFeatureError extends Error {\n /**\n * Creates a new UnsupportedFeatureError.\n * @param feature - The name of the unsupported feature (e.g., \"Content filtering\").\n * @param api - The API being used that does not support the feature.\n * @param suggestedApi - The API that supports this feature.\n */\n constructor(\n public readonly feature: string,\n public readonly api: SAPAIApiType,\n public readonly suggestedApi: SAPAIApiType,\n ) {\n const apiName = api === \"foundation-models\" ? \"Foundation Models\" : \"Orchestration\";\n const suggestedApiName =\n suggestedApi === \"foundation-models\" ? \"Foundation Models\" : \"Orchestration\";\n super(`${feature} is not supported by ${apiName} API. Use ${suggestedApiName} API instead.`);\n this.name = \"UnsupportedFeatureError\";\n }\n}\n\n/**\n * Converts a structured SAP error response to the appropriate Vercel AI SDK error.\n * @param errorResponse - SAP orchestration error response.\n * @param context - Request context.\n * @param context.modelId - Known requested model ID, preferred over message-based extraction.\n * @param context.modelType - Requested model kind (defaults to languageModel).\n * @param context.httpStatusCode - Fallback HTTP status when the body code is missing or outside the HTTP status range.\n * @param context.requestBody - Original request body.\n * @param context.responseHeaders - Response headers.\n * @param context.url - Request URL.\n * @returns LoadAPIKeyError for 401/403, NoSuchModelError for 404, or APICallError otherwise.\n */\nexport function convertSAPErrorToAPICallError(\n errorResponse: OrchestrationErrorResponse,\n context?: ErrorContext,\n): APICallError | LoadAPIKeyError | NoSuchModelError {\n const { code, location, message, requestId } = extractErrorFields(errorResponse);\n\n const statusCode = getStatusCodeFromSAPError(code, context?.httpStatusCode);\n\n const responseBody = JSON.stringify({\n error: {\n code,\n location,\n message,\n request_id: requestId,\n },\n });\n\n let enhancedMessage = message;\n\n if (statusCode === HTTP_STATUS.UNAUTHORIZED || statusCode === HTTP_STATUS.FORBIDDEN) {\n enhancedMessage +=\n \"\\n\\nAuthentication failed. Verify your AICORE_SERVICE_KEY environment variable is set correctly.\" +\n \"\\nSee: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/create-service-key\";\n if (requestId) {\n enhancedMessage += `\\nRequest ID: ${requestId}`;\n }\n return new LoadAPIKeyError({\n message: enhancedMessage,\n });\n }\n\n if (statusCode === HTTP_STATUS.NOT_FOUND) {\n enhancedMessage +=\n \"\\n\\nResource not found. The model or deployment may not exist in your SAP AI Core instance.\" +\n \"\\nSee: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/create-deployment-for-orchestration\";\n if (requestId) {\n enhancedMessage += `\\nRequest ID: ${requestId}`;\n }\n const modelId = context?.modelId ?? extractModelIdentifier(message, location);\n return new NoSuchModelError({\n message: enhancedMessage,\n modelId: modelId ?? \"unknown\",\n modelType: context?.modelType ?? \"languageModel\",\n });\n }\n\n if (statusCode === HTTP_STATUS.RATE_LIMIT) {\n enhancedMessage +=\n \"\\n\\nRate limit exceeded. Please try again later or contact your SAP administrator.\" +\n \"\\nSee: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/rate-limits\";\n } else if (statusCode >= HTTP_STATUS.INTERNAL_ERROR) {\n enhancedMessage +=\n \"\\n\\nSAP AI Core service error. This is typically a temporary issue. Retries depend on the caller's retry configuration.\" +\n \"\\nSee: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/troubleshooting\";\n } else if (location) {\n enhancedMessage += `\\n\\nError location: ${location}`;\n }\n\n if (requestId) {\n enhancedMessage += `\\nRequest ID: ${requestId}`;\n }\n\n return new APICallError({\n isRetryable: isRetryable(statusCode),\n message: enhancedMessage,\n requestBodyValues: context?.requestBody,\n responseBody,\n responseHeaders: context?.responseHeaders,\n statusCode,\n url: context?.url ?? \"\",\n });\n}\n\n/**\n * Converts SAP failures while preserving standard request and API errors across SDK versions.\n * @param error - Error to convert.\n * @param context - Request context.\n * @param context.modelId - Known requested model ID, preferred over message-based extraction.\n * @param context.modelType - Requested model kind (defaults to languageModel).\n * @param context.operation - Operation name.\n * @param context.requestBody - Original request body.\n * @param context.responseHeaders - Response headers.\n * @param context.url - Request URL.\n * @returns Vercel AI SDK error.\n */\nexport function convertToAISDKError(\n error: unknown,\n context?: ErrorContext,\n):\n | APICallError\n | InvalidPromptError\n | LoadAPIKeyError\n | NoSuchModelError\n | UnsupportedFunctionalityError {\n if (\n APICallError.isInstance(error) ||\n LoadAPIKeyError.isInstance(error) ||\n NoSuchModelError.isInstance(error) ||\n InvalidPromptError.isInstance(error) ||\n UnsupportedFunctionalityError.isInstance(error)\n ) {\n return error;\n }\n\n const { aborted, response, rootError } = inspectError(error);\n const responseHeaders = context?.responseHeaders ?? normalizeHeaders(response?.headers);\n if (!aborted) {\n const errorResponse = findStructuredErrorResponse(\n rootError instanceof SyntaxError ? undefined : rootError,\n response?.data,\n );\n if (errorResponse) {\n return convertSAPErrorToAPICallError(errorResponse, {\n ...context,\n httpStatusCode: response?.status ?? context?.httpStatusCode,\n responseHeaders,\n });\n }\n }\n\n const resolvedContext: ResolvedErrorContext = {\n ...context,\n responseBody: serializeAxiosResponseData(response?.data),\n responseHeaders,\n };\n if (aborted) {\n return createAPICallError(\n error,\n {\n isRetryable: false,\n message: \"Request was aborted by the client\",\n statusCode: HTTP_STATUS.CLIENT_CLOSED_REQUEST,\n },\n resolvedContext,\n );\n }\n\n if (isHttpStatus(response?.status)) {\n return createAPICallError(\n error,\n {\n isRetryable: isRetryable(response.status),\n message:\n rootError instanceof SyntaxError && error instanceof Error\n ? error.message\n : rootError instanceof Error\n ? rootError.message\n : \"SAP AI Core request failed\",\n statusCode: response.status,\n },\n resolvedContext,\n );\n }\n\n // Native parser messages can contain credential or response fragments. Keep the\n // enclosing SDK message instead, with the original chain available only as cause.\n if (rootError instanceof SyntaxError) {\n return createAPICallError(\n error,\n {\n isRetryable: false,\n message:\n error instanceof Error && error !== rootError\n ? error.message\n : \"Failed to parse SAP AI Core data.\",\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n resolvedContext,\n );\n }\n\n if (rootError instanceof Error) {\n const errorMsg = rootError.message.toLowerCase();\n const originalErrorMsg = rootError.message;\n\n if (AUTHENTICATION_ERROR_KEYWORDS.some((keyword) => errorMsg.includes(keyword))) {\n return new LoadAPIKeyError({\n message:\n `SAP AI Core authentication failed: ${originalErrorMsg}\\n\\n` +\n `Make sure your AICORE_SERVICE_KEY environment variable is set correctly.\\n` +\n `See: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/create-service-key`,\n });\n }\n\n if (DEPLOYMENT_ERROR_KEYWORDS.some((keyword) => errorMsg.includes(keyword))) {\n const modelId = context?.modelId ?? extractModelIdentifier(originalErrorMsg);\n return new NoSuchModelError({\n message:\n `SAP AI Core deployment error: ${originalErrorMsg}\\n\\n` +\n `Make sure you have a running orchestration deployment in your SAP AI Core instance.\\n` +\n `See: https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/create-deployment-for-orchestration`,\n modelId: modelId ?? \"unknown\",\n modelType: context?.modelType ?? \"languageModel\",\n });\n }\n\n const statusMatch = /status code (\\d+)/i.exec(originalErrorMsg);\n const extractedStatus = statusMatch?.[1] ? Number.parseInt(statusMatch[1], 10) : undefined;\n if (isHttpStatus(extractedStatus)) {\n return createAPICallError(\n error,\n {\n isRetryable: isRetryable(extractedStatus),\n message: `SAP AI Core request failed: ${originalErrorMsg}`,\n statusCode: extractedStatus,\n },\n resolvedContext,\n );\n }\n\n for (const matcher of ERROR_MATCHERS) {\n if (matcher.keywords.some((keyword) => errorMsg.includes(keyword))) {\n const message =\n \"message\" in matcher\n ? matcher.message(originalErrorMsg)\n : `SAP AI Core ${matcher.category} error: ${originalErrorMsg}`;\n return createAPICallError(\n error,\n {\n isRetryable: matcher.isRetryable,\n message,\n statusCode: matcher.statusCode,\n },\n resolvedContext,\n );\n }\n }\n }\n\n const message =\n rootError instanceof Error\n ? rootError.message\n : typeof rootError === \"string\"\n ? rootError\n : \"Unknown error occurred\";\n\n const fullMessage = context?.operation\n ? `SAP AI Core ${context.operation} failed: ${message}`\n : `SAP AI Core error: ${message}`;\n\n return createAPICallError(\n error,\n {\n isRetryable: false,\n message: fullMessage,\n statusCode: HTTP_STATUS.INTERNAL_ERROR,\n },\n resolvedContext,\n );\n}\n\n/**\n * Normalizes various header formats to a string record.\n * @param headers - Headers to normalize.\n * @returns Normalized headers record.\n */\nexport function normalizeHeaders(headers: unknown): Record<string, string> | undefined {\n if (!headers || typeof headers !== \"object\") return undefined;\n\n if (typeof Headers !== \"undefined\" && headers instanceof Headers) {\n const out = Object.fromEntries(headers.entries());\n return Object.keys(out).length === 0 ? undefined : out;\n }\n\n const record = headers as Record<string, unknown>;\n const entries = Object.entries(record).flatMap(([key, value]) => {\n const k = key.toLowerCase();\n if (typeof value === \"string\") return [[k, value]];\n if (Array.isArray(value)) {\n const strings = value.filter((item): item is string => typeof item === \"string\").join(\"; \");\n return strings.length > 0 ? [[k, strings]] : [];\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return [[k, String(value)]];\n }\n return [];\n });\n\n if (entries.length === 0) return undefined;\n return Object.fromEntries(entries) as Record<string, string>;\n}\n\n/**\n * Builds an API error with diagnostics kept separate from the message.\n * @param error - Original error.\n * @param options - Error options.\n * @param options.isRetryable - Whether error is retryable.\n * @param options.message - Error message.\n * @param options.statusCode - HTTP status code.\n * @param context - Request context.\n * @param context.operation - Operation name.\n * @param context.requestBody - Original request body.\n * @param context.responseHeaders - Response headers.\n * @param context.url - Request URL.\n * @returns API call error.\n * @internal\n */\nfunction createAPICallError(\n error: unknown,\n options: {\n isRetryable: boolean;\n message: string;\n statusCode: number;\n },\n context?: ResolvedErrorContext,\n): APICallError {\n return new APICallError({\n cause: error,\n isRetryable: options.isRetryable,\n message: options.message,\n requestBodyValues: context?.requestBody,\n responseBody: context?.responseBody,\n responseHeaders: context?.responseHeaders,\n statusCode: options.statusCode,\n url: context?.url ?? \"\",\n });\n}\n\n/**\n * @param response - SAP orchestration error response.\n * @returns Destructured error fields (message, code, location, requestId).\n * @internal\n */\nfunction extractErrorFields(response: OrchestrationErrorResponse): {\n code?: number;\n location?: string;\n message: string;\n requestId?: string;\n} {\n const innerError = response.error;\n if (Array.isArray(innerError)) {\n const first = innerError[0] as\n undefined | { code?: number; location?: string; message: string; request_id?: string };\n return {\n code: first?.code,\n location: first?.location,\n message: first?.message ?? \"Unknown SAP AI error\",\n requestId: first?.request_id,\n };\n }\n const entry = innerError as {\n code?: number;\n location?: string;\n message: string;\n request_id?: string;\n };\n return {\n code: entry.code,\n location: entry.location,\n message: entry.message,\n requestId: entry.request_id,\n };\n}\n\n/**\n * @param message - Error message.\n * @param location - Error location.\n * @returns Extracted model identifier.\n * @internal\n */\nfunction extractModelIdentifier(message: string, location?: string): string | undefined {\n const patterns = [\n /deployment[:\\s]+([a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*)/i,\n /model[:\\s]+([a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*)/i,\n /resource[:\\s]+([a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*)/i,\n ];\n\n for (const pattern of patterns) {\n const match = pattern.exec(message);\n if (match?.[1]) {\n return match[1];\n }\n }\n\n if (location) {\n const locationMatch = /([a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*)/.exec(location);\n if (locationMatch?.[1]) {\n return locationMatch[1];\n }\n }\n\n return undefined;\n}\n\n/**\n * @param rootError - Root cause after inspecting the chain.\n * @param axiosData - Response data retained from an Axios wrapper.\n * @returns A structured SAP response when available.\n */\nfunction findStructuredErrorResponse(\n rootError: unknown,\n axiosData: unknown,\n): OrchestrationErrorResponse | undefined {\n if (isStructuredErrorResponse(rootError)) return rootError;\n if (isStructuredErrorResponse(axiosData)) return axiosData;\n if (rootError instanceof Error) {\n const parsed = tryExtractSAPErrorFromMessage(rootError.message);\n if (isStructuredErrorResponse(parsed)) return parsed;\n }\n return undefined;\n}\n\n/**\n * @param code - SAP error code.\n * @param httpStatusCode - HTTP status code from the response, used as fallback.\n * @returns HTTP status code.\n * @internal\n */\nfunction getStatusCodeFromSAPError(code?: number, httpStatusCode?: number): number {\n if (isHttpStatus(code)) {\n return code;\n }\n\n if (isHttpStatus(httpStatusCode)) {\n return httpStatusCode;\n }\n\n return HTTP_STATUS.INTERNAL_ERROR;\n}\n\n/**\n * Inspects native and SAP cause chains once, keeping transport metadata from wrappers.\n * @param error - Raw SDK error.\n * @returns The terminal cause, nearest Axios response, and cancellation state.\n */\nfunction inspectError(error: unknown): {\n aborted: boolean;\n response?: AxiosResponse;\n rootError: unknown;\n} {\n const seen = new Set<object>();\n let rootError = error;\n let current = error;\n let response: AxiosResponse | undefined;\n let aborted = false;\n while (typeof current === \"object\" && current !== null && !seen.has(current)) {\n seen.add(current);\n rootError = current;\n aborted ||= isAbortError(current);\n const entry = current as { cause?: unknown; isAxiosError?: boolean; response?: AxiosResponse };\n if (response === undefined && entry.isAxiosError === true) response = entry.response;\n // SAP ErrorWithCause exposes a native cause too. Avoid its recursive rootCause\n // getter when that cause is present so cyclic chains cannot overflow the stack.\n const cause =\n \"cause\" in entry\n ? entry.cause\n : current instanceof Error && isErrorWithCause(current)\n ? current.rootCause\n : undefined;\n if (cause === undefined || (typeof cause === \"object\" && cause !== null && seen.has(cause))) {\n break;\n }\n rootError = cause;\n current = cause;\n }\n return { aborted, response, rootError };\n}\n\n/**\n * Identifies native aborts and Axios cancellations retained in SAP error causes.\n * @param error - Error to check.\n * @returns Whether the error represents request cancellation.\n * @internal\n */\nfunction isAbortError(error: object): boolean {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n return true;\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n return true;\n }\n const transportError = error as { code?: unknown; isAxiosError?: unknown };\n return transportError.isAxiosError === true && transportError.code === \"ERR_CANCELED\";\n}\n\n/**\n * @param status - Candidate HTTP status.\n * @returns Whether the value is an integer HTTP status.\n */\nfunction isHttpStatus(status: unknown): status is number {\n return typeof status === \"number\" && Number.isInteger(status) && status >= 100 && status < 600;\n}\n\n/**\n * @param statusCode - HTTP status code.\n * @returns True if error is retryable.\n * @internal\n */\nfunction isRetryable(statusCode: number): boolean {\n return (\n statusCode === HTTP_STATUS.REQUEST_TIMEOUT ||\n statusCode === HTTP_STATUS.CONFLICT ||\n statusCode === HTTP_STATUS.RATE_LIMIT ||\n (statusCode >= HTTP_STATUS.INTERNAL_ERROR && statusCode < 600)\n );\n}\n\n/**\n * @param error - Error to check.\n * @returns True if error is an orchestration error response.\n * @internal\n */\nfunction isStructuredErrorResponse(error: unknown): error is OrchestrationErrorResponse {\n if (error === null || typeof error !== \"object\" || !(\"error\" in error)) {\n return false;\n }\n\n const errorEnvelope = error as { error?: unknown };\n const innerError = errorEnvelope.error;\n\n if (innerError === undefined) return false;\n\n if (Array.isArray(innerError)) {\n return innerError.every((entry) => {\n if (entry === null || typeof entry !== \"object\" || !(\"message\" in entry)) {\n return false;\n }\n const errorEntry = entry as { code?: unknown; message?: unknown };\n if (typeof errorEntry.message !== \"string\") {\n return false;\n }\n if (\"code\" in entry && errorEntry.code != null && typeof errorEntry.code !== \"number\") {\n return false;\n }\n return true;\n });\n }\n\n if (typeof innerError !== \"object\" || innerError === null || !(\"message\" in innerError)) {\n return false;\n }\n\n const errorObj = innerError as { code?: unknown; message?: unknown };\n if (typeof errorObj.message !== \"string\") {\n return false;\n }\n if (\"code\" in innerError && errorObj.code != null && typeof errorObj.code !== \"number\") {\n return false;\n }\n\n return true;\n}\n\n/**\n * @param data - Data to serialize.\n * @param maxLength - Maximum output length.\n * @returns Serialized data.\n * @internal\n */\nfunction serializeAxiosResponseData(data: unknown, maxLength = 2000): string | undefined {\n if (data === undefined) return undefined;\n\n let serialized: string;\n try {\n if (typeof data === \"string\") {\n serialized = data;\n } else {\n const json: unknown = JSON.stringify(data, null, 2);\n serialized = typeof json === \"string\" ? json : `[Unable to serialize: ${typeof data}]`;\n }\n } catch {\n serialized = `[Unable to serialize: ${typeof data}]`;\n }\n\n if (serialized.length > maxLength) {\n return serialized.slice(0, maxLength) + \"...[truncated]\";\n }\n return serialized;\n}\n\n/**\n * @param message - Error message to parse.\n * @returns Extracted SAP error or null.\n * @internal\n */\nfunction tryExtractSAPErrorFromMessage(message: string): unknown {\n const startIdx = message.indexOf(\"{\");\n if (startIdx === -1) return null;\n\n let depth = 0;\n let endIdx = -1;\n let inString = false;\n let escaped = false;\n for (let i = startIdx; i < message.length; i++) {\n const character = message.charCodeAt(i);\n if (inString) {\n if (escaped) escaped = false;\n else if (character === 0x5c) escaped = true;\n else if (character === 0x22) inString = false;\n continue;\n }\n if (character === 0x22) inString = true;\n else if (character === 0x7b) depth++;\n else if (character === 0x7d) {\n depth--;\n if (depth === 0) {\n endIdx = i;\n break;\n }\n }\n }\n if (endIdx === -1) return null;\n\n try {\n const parsed: unknown = JSON.parse(message.slice(startIdx, endIdx + 1));\n\n if (parsed && typeof parsed === \"object\" && \"error\" in parsed) {\n return parsed;\n }\n\n if (parsed && typeof parsed === \"object\" && \"message\" in parsed) {\n return { error: parsed as Record<string, unknown> };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n","/**\n * Package version injected at build time via tsup define.\n * @module\n */\n\ndeclare const __PACKAGE_VERSION__: string | undefined;\n\n/** Current package version from package.json, injected at build time. */\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== \"undefined\" ? __PACKAGE_VERSION__ : \"0.0.0-test\";\n"],"mappings":"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","names":["message"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/convert-to-sap-messages.ts"],"sourcesContent":["import type {\n AssistantChatMessage,\n ChatMessage,\n SystemChatMessage,\n ToolChatMessage,\n UserChatMessage,\n UserChatMessageContentItem,\n} from \"@sap-ai-sdk/orchestration\";\n\nimport {\n InvalidPromptError,\n LanguageModelV3Prompt,\n type SharedV3Warning,\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\";\n\nimport type { CacheControl, ParsePartProviderOptions } from \"./sap-ai-provider-options.js\";\n\n/**\n * Options for converting Vercel AI SDK prompts to SAP AI SDK messages.\n * @see {@link convertToSAPMessages}\n */\nexport interface ConvertToSAPMessagesOptions {\n /**\n * Whether to escape Jinja2 template delimiters (`{{`, `{%`, `{#`) in message content.\n * This prevents SAP orchestration from interpreting user content as template syntax.\n * @default true\n */\n readonly escapeTemplatePlaceholders?: boolean;\n /**\n * Whether to include assistant reasoning parts (wrapped in `<think>` tags).\n * @default false\n */\n readonly includeReasoning?: boolean;\n /**\n * Optional callback that reads per-part `providerOptions['sap-ai']` (e.g. Anthropic\n * `cacheControl`) and forwards the result onto the SAP message item. Strategies that\n * do not honour part-level directives (Foundation Models) leave this undefined.\n * @default undefined\n */\n readonly parsePartProviderOptions?: ParsePartProviderOptions;\n /**\n * Optional sink for validation warnings raised by `parsePartProviderOptions`.\n * Issues reported by the parser are forwarded to the AI SDK call result.\n * The SAP parser deduplicates identical messages rather than warning per occurrence.\n */\n readonly warnings?: SharedV3Warning[];\n}\n\n/**\n * @internal\n */\nconst ZERO_WIDTH_SPACE = \"\\u200B\";\n\n/** Native cross-realm ArrayBuffer brand descriptor. */\nconst ARRAY_BUFFER_BYTE_LENGTH_DESCRIPTOR = Object.getOwnPropertyDescriptor(\n ArrayBuffer.prototype,\n \"byteLength\",\n);\n\n/** Native Uint8Array length descriptor, immune to subclass overrides. */\nconst TYPED_ARRAY_LENGTH_DESCRIPTOR = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(Uint8Array.prototype) as object,\n \"length\",\n);\n\nconst SUPPORTED_IMAGE_FORMATS = [\"image/png\", \"image/jpeg\", \"image/jpg\", \"image/gif\", \"image/webp\"];\n\n/** Native cross-realm typed array brand descriptor. */\nconst TYPED_ARRAY_TAG_DESCRIPTOR = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(Uint8Array.prototype) as object,\n Symbol.toStringTag,\n);\n\n/** Native cross-realm URL href descriptor. */\nconst URL_HREF_DESCRIPTOR = Object.getOwnPropertyDescriptor(URL.prototype, \"href\");\n\n/**\n * Returns the canonical href for genuine URL values across JavaScript realms.\n * @param value - The value to inspect.\n * @returns The URL href, or undefined when the value lacks URL internal slots.\n */\nexport function getURLHref(value: unknown): string | undefined {\n if (typeof value !== \"object\" || value === null || URL_HREF_DESCRIPTOR?.get === undefined) {\n return undefined;\n }\n try {\n const href: unknown = URL_HREF_DESCRIPTOR.get.call(value);\n return typeof href === \"string\" ? href : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Returns the RFC 4648 value of a base64 character.\n * @param charCode - The character's UTF-16 code unit.\n * @returns The base64 sextet value, or -1 when invalid.\n */\nfunction base64SextetValue(charCode: number): number {\n if (charCode >= 0x41 && charCode <= 0x5a) return charCode - 0x41;\n if (charCode >= 0x61 && charCode <= 0x7a) return charCode - 0x61 + 26;\n if (charCode >= 0x30 && charCode <= 0x39) return charCode - 0x30 + 52;\n if (charCode === 0x2b) return 62;\n if (charCode === 0x2f) return 63;\n return -1;\n}\n\n/**\n * Detects genuine ArrayBuffer values across JavaScript realms.\n * @param value - The value to inspect.\n * @returns Whether the value has ArrayBuffer internal slots.\n */\nfunction isArrayBuffer(value: unknown): value is ArrayBuffer {\n if (\n typeof value !== \"object\" ||\n value === null ||\n ARRAY_BUFFER_BYTE_LENGTH_DESCRIPTOR?.get === undefined\n ) {\n return false;\n }\n try {\n ARRAY_BUFFER_BYTE_LENGTH_DESCRIPTOR.get.call(value);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validates canonical RFC 4648 base64 in linear time and constant stack space.\n * @param value - The candidate base64 value.\n * @returns Whether the value is canonical RFC 4648 base64.\n */\nfunction isCanonicalBase64(value: string): boolean {\n const length = value.length;\n if (length % 4 !== 0) return false;\n\n let padding = 0;\n if (length > 0 && value.charCodeAt(length - 1) === 0x3d) padding++;\n if (length > 1 && value.charCodeAt(length - 2) === 0x3d) padding++;\n\n const payloadLength = length - padding;\n for (let index = 0; index < payloadLength; index++) {\n if (base64SextetValue(value.charCodeAt(index)) < 0) return false;\n }\n\n if (padding === 0) return true;\n const lastValue = base64SextetValue(value.charCodeAt(payloadLength - 1));\n return padding === 1 ? (lastValue & 0x03) === 0 : (lastValue & 0x0f) === 0;\n}\n\n/**\n * Detects genuine Uint8Array values across JavaScript realms.\n * @param value - The value to inspect.\n * @returns Whether the value has Uint8Array internal slots.\n */\nfunction isUint8Array(value: unknown): value is Uint8Array {\n if (\n typeof value !== \"object\" ||\n value === null ||\n TYPED_ARRAY_TAG_DESCRIPTOR?.get === undefined\n ) {\n return false;\n }\n try {\n return TYPED_ARRAY_TAG_DESCRIPTOR.get.call(value) === \"Uint8Array\";\n } catch {\n return false;\n }\n}\n\n/**\n * Serializes tool output, preserving BigInt values as strings and using a text\n * representation when JSON serialization is unavailable (for example, cycles).\n * @param value - The tool output to serialize.\n * @returns JSON or fallback text.\n * @throws {InvalidPromptError} When neither JSON nor text serialization is possible.\n * @internal\n */\nfunction safeJsonStringify(value: unknown): string {\n try {\n const serialized: unknown = JSON.stringify(value, (_key, val) =>\n typeof val === \"bigint\" ? val.toString() : (val as unknown),\n );\n if (typeof serialized === \"string\") return serialized;\n } catch {\n // Fall back to the output's text representation.\n }\n try {\n return String(value);\n } catch {\n throw new InvalidPromptError({ message: \"Tool output cannot be serialized.\", prompt: value });\n }\n}\n\n/**\n * Serializes tool arguments, rejecting values that cannot be represented as JSON.\n * @param input - Tool arguments or an already serialized JSON string.\n * @returns Serialized arguments.\n */\nfunction serializeToolCallInput(input: unknown): string {\n try {\n if (typeof input === \"string\") {\n JSON.parse(input);\n return input;\n }\n const serialized: unknown = JSON.stringify(input);\n if (typeof serialized === \"string\") return serialized;\n } catch {\n // Report invalid arguments as a prompt error instead of emitting an invalid SAP request.\n }\n throw new InvalidPromptError({\n message: \"Tool call input must be JSON-serializable.\",\n prompt: input,\n });\n}\n\n/**\n * Wraps a text payload as a SAP `TextContent` block, attaching `cache_control` when set.\n * @param text - Pre-escaped text payload.\n * @param cacheControl - Optional Anthropic prompt-cache directive.\n * @returns SAP `TextContent` block.\n */\nfunction wrapAsTextContent(\n text: string,\n cacheControl: CacheControl | undefined,\n): { cache_control?: CacheControl; text: string; type: \"text\" } {\n return cacheControl\n ? { cache_control: cacheControl, text, type: \"text\" }\n : { text, type: \"text\" };\n}\n\n/**\n * @internal\n */\nconst JINJA2_DELIMITERS_PATTERN = /\\{(?=[{%#])/g;\n\n/**\n * @internal\n */\nconst JINJA2_DELIMITERS_ESCAPED_PATTERN = new RegExp(`\\\\{${ZERO_WIDTH_SPACE}(?=[{%#])`, \"g\");\n\n/**\n * Encodes bytes as base64 using `btoa`, without the Node.js `Buffer` global.\n * @internal\n * @param bytes - The bytes to encode.\n * @returns The base64 string (empty string for empty input).\n */\nexport function base64FromBytes(bytes: Uint8Array): string {\n const CHUNK_SIZE = 0x8000;\n let byteLength: unknown;\n try {\n // Native validation rejects detached and out-of-bounds views, including empty ones.\n Uint8Array.prototype.at.call(bytes, 0);\n byteLength = TYPED_ARRAY_LENGTH_DESCRIPTOR?.get?.call(bytes);\n } catch {\n throw new UnsupportedFunctionalityError({\n functionality: \"Invalid Uint8Array file data.\",\n });\n }\n if (typeof byteLength !== \"number\") {\n throw new UnsupportedFunctionalityError({\n functionality: \"Invalid Uint8Array file data.\",\n });\n }\n\n const codeUnits = new Array<number>(Math.min(CHUNK_SIZE, byteLength));\n let binary = \"\";\n for (let offset = 0; offset < byteLength; offset += CHUNK_SIZE) {\n const chunkLength = Math.min(CHUNK_SIZE, byteLength - offset);\n codeUnits.length = chunkLength;\n for (let index = 0; index < chunkLength; index++) {\n const byte = bytes[offset + index];\n if (byte === undefined) {\n throw new UnsupportedFunctionalityError({\n functionality: \"Invalid Uint8Array file data.\",\n });\n }\n codeUnits[index] = byte;\n }\n binary += String.fromCharCode(...codeUnits);\n }\n return btoa(binary);\n}\n\n/**\n * Converts Vercel AI SDK prompt to SAP AI SDK ChatMessage array.\n *\n * Maps V3 message roles to SAP messages:\n * - `system` → `SystemChatMessage`\n * - `user` (text/images/files) → `UserChatMessage`\n * - `assistant` (text/tool-calls, optionally reasoning) → `AssistantChatMessage`\n * - `tool` (direct text values; other output variants as JSON) → `ToolChatMessage`\n * Unsupported assistant parts and non-result tool parts are ignored, with\n * warnings when a warning sink is supplied.\n * @param prompt - The Vercel AI SDK LanguageModelV3Prompt to convert.\n * @param options - Conversion options.\n * @param options.escapeTemplatePlaceholders - Whether to escape Jinja2 template delimiters (default: true).\n * @param options.includeReasoning - Whether to include assistant reasoning parts (default: false).\n * @param options.parsePartProviderOptions - Optional callback to read per-part `providerOptions['sap-ai']`. Strategies opt in to honour part-level directives such as Anthropic `cacheControl`.\n * @param options.warnings - Optional sink the parser pushes Zod validation issues into.\n * @returns SAP AI SDK ChatMessage array ready for orchestration requests.\n * @throws {UnsupportedFunctionalityError} When encountering unsupported user content or file data types.\n * @throws {InvalidPromptError} When message roles or tool arguments are invalid, or tool output cannot be serialized.\n */\nexport function convertToSAPMessages(\n prompt: LanguageModelV3Prompt,\n options: ConvertToSAPMessagesOptions = {},\n): ChatMessage[] {\n const messages: ChatMessage[] = [];\n const includeReasoning = options.includeReasoning ?? false;\n const escapeTemplatePlaceholders = options.escapeTemplatePlaceholders ?? true;\n\n const maybeEscape = (text: string): string =>\n escapeTemplatePlaceholders ? escapeOrchestrationPlaceholders(text) : text;\n\n const parser = options.parsePartProviderOptions;\n const parsePart = parser\n ? (providerOptions: unknown) => parser(providerOptions, options.warnings)\n : () => undefined;\n\n const pushWarningOnce = (feature: string, details: string): void => {\n if (!options.warnings) return;\n if (!options.warnings.some((w) => (w as { feature?: string }).feature === feature)) {\n options.warnings.push({ details, feature, type: \"unsupported\" });\n }\n };\n\n for (const message of prompt) {\n switch (message.role) {\n case \"assistant\": {\n let text = \"\";\n const textParts: undefined | { cacheControl?: CacheControl; text: string }[] = parser\n ? []\n : undefined;\n let anyCacheControl = false;\n const toolCalls: {\n function: { arguments: string; name: string };\n id: string;\n type: \"function\";\n }[] = [];\n\n for (const part of message.content) {\n switch (part.type) {\n case \"file\": {\n pushWarningOnce(\n \"file content in assistant message\",\n \"SAP orchestration assistant messages carry text and tool calls only; file parts are ignored.\",\n );\n break;\n }\n case \"reasoning\": {\n if (includeReasoning && part.text) {\n const reasoning = `<think>${part.text}</think>`;\n text += reasoning;\n textParts?.push({ text: reasoning });\n }\n break;\n }\n case \"text\": {\n if (!part.text) break;\n const partOpts = parsePart(part.providerOptions);\n const cacheControl = partOpts?.cacheControl;\n text += part.text;\n textParts?.push(\n cacheControl ? { cacheControl, text: part.text } : { text: part.text },\n );\n if (cacheControl) anyCacheControl = true;\n break;\n }\n case \"tool-call\": {\n const partOpts = parsePart(part.providerOptions);\n if (partOpts?.cacheControl) {\n pushWarningOnce(\n \"cacheControl on assistant tool-call\",\n \"SAP orchestration does not expose cache_control on the assistant tool-call envelope.\",\n );\n }\n const argumentsJson = serializeToolCallInput(part.input);\n\n // Escape tool call arguments if needed (they may contain placeholder syntax)\n toolCalls.push({\n function: {\n arguments: maybeEscape(argumentsJson),\n name: part.toolName,\n },\n id: part.toolCallId,\n type: \"function\",\n });\n break;\n }\n default: {\n pushWarningOnce(\n \"unsupported assistant content\",\n \"Unsupported assistant content type; part ignored.\",\n );\n break;\n }\n }\n }\n\n if (text || toolCalls.length > 0) {\n const assistantMessage: AssistantChatMessage = {\n content:\n anyCacheControl && textParts\n ? textParts.map((p) => wrapAsTextContent(maybeEscape(p.text), p.cacheControl))\n : maybeEscape(text),\n role: \"assistant\",\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n messages.push(assistantMessage);\n }\n break;\n }\n\n case \"system\": {\n const partOpts = parsePart(message.providerOptions);\n const cacheControl = partOpts?.cacheControl;\n const text = maybeEscape(message.content);\n const systemMessage: SystemChatMessage = {\n content: cacheControl ? [wrapAsTextContent(text, cacheControl)] : text,\n role: \"system\",\n };\n messages.push(systemMessage);\n break;\n }\n\n case \"tool\": {\n for (const part of message.content) {\n if (part.type === \"tool-result\") {\n const partOpts = parsePart(part.providerOptions);\n const cacheControl = partOpts?.cacheControl;\n const outputText =\n part.output.type === \"text\" ? part.output.value : safeJsonStringify(part.output);\n const escaped = maybeEscape(outputText);\n const toolMessage: ToolChatMessage = {\n content: cacheControl ? [wrapAsTextContent(escaped, cacheControl)] : escaped,\n role: \"tool\",\n tool_call_id: part.toolCallId,\n };\n messages.push(toolMessage);\n } else {\n pushWarningOnce(\n \"non-tool-result content in tool message\",\n \"Only tool-result parts are forwarded to SAP; other tool content is ignored.\",\n );\n }\n }\n break;\n }\n\n case \"user\": {\n const contentParts: UserChatMessageContentItem[] = [];\n\n for (const part of message.content) {\n const partOpts = parsePart(part.providerOptions);\n const cacheControl = partOpts?.cacheControl;\n switch (part.type) {\n case \"file\": {\n const fileDataUrl = buildDataUrl(part);\n\n const normalizedMediaType = part.mediaType.toLowerCase();\n if (normalizedMediaType.startsWith(\"image/\")) {\n const isWildcardImageUrl =\n getURLHref(part.data) !== undefined && normalizedMediaType === \"image/*\";\n if (!isWildcardImageUrl && !SUPPORTED_IMAGE_FORMATS.includes(normalizedMediaType)) {\n console.warn(\n `Image format ${part.mediaType} may not be supported by all models. ` +\n `Recommended formats: PNG, JPEG, GIF, WebP`,\n );\n }\n\n contentParts.push({\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n image_url: {\n url: fileDataUrl,\n },\n type: \"image_url\",\n });\n } else {\n contentParts.push({\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n file: {\n file_data: fileDataUrl,\n ...(part.filename ? { filename: part.filename } : {}),\n },\n type: \"file\",\n });\n }\n break;\n }\n case \"text\": {\n contentParts.push({\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n text: maybeEscape(part.text),\n type: \"text\",\n });\n break;\n }\n default: {\n throw new UnsupportedFunctionalityError({\n functionality: `Content type ${(part as { type: string }).type}`,\n });\n }\n }\n }\n\n const firstPart = contentParts[0];\n const userMessage: UserChatMessage =\n contentParts.length === 1 &&\n firstPart?.type === \"text\" &&\n firstPart.cache_control === undefined\n ? {\n content: firstPart.text ?? \"\",\n role: \"user\",\n }\n : {\n content: contentParts,\n role: \"user\",\n };\n\n messages.push(userMessage);\n break;\n }\n\n default: {\n const _exhaustiveCheck: never = message;\n throw new InvalidPromptError({\n message: `Unsupported role: ${(_exhaustiveCheck as { role: string }).role}`,\n prompt: JSON.stringify(message),\n });\n }\n }\n }\n\n return messages;\n}\n\n/**\n * Escapes Jinja2 template delimiters by inserting zero-width spaces.\n *\n * Converts `{{`, `{%`, `{#` to `{\\u200B{`, `{\\u200B%`, `{\\u200B#` respectively.\n * This prevents SAP orchestration from interpreting user content as template syntax.\n * @param text - The text to escape.\n * @returns The escaped text with zero-width spaces inserted.\n * @see {@link unescapeOrchestrationPlaceholders} for the reverse operation.\n */\nexport function escapeOrchestrationPlaceholders(text: string): string {\n if (!text) return text;\n return text.replaceAll(JINJA2_DELIMITERS_PATTERN, `{${ZERO_WIDTH_SPACE}`);\n}\n\n/**\n * Reverses escaping by removing zero-width spaces from template delimiters.\n * Useful for processing model responses that may contain escaped delimiters.\n * @param text - The text to unescape.\n * @returns The unescaped text with zero-width spaces removed.\n * @see {@link escapeOrchestrationPlaceholders} for the escaping operation.\n */\nexport function unescapeOrchestrationPlaceholders(text: string): string {\n if (!text) return text;\n return text.replaceAll(JINJA2_DELIMITERS_ESCAPED_PATTERN, \"{\");\n}\n\n/**\n * Returns a file URL or builds a base64 data URL from inline file data.\n *\n * Genuine URL objects pass through without being fetched. Base64 strings are\n * embedded verbatim without validation; Uint8Array and ArrayBuffer inputs are\n * encoded. Buffer-like objects must have a custom `toString(\"base64\")` method\n * returning canonical base64. Other objects are rejected.\n * @internal\n * @param part - The file part containing data and mediaType.\n * @param part.data - The file data.\n * @param part.mediaType - The MIME type of the file.\n * @returns The original URL string or an inline data URL.\n * @throws {UnsupportedFunctionalityError} If the data type is not supported.\n */\nfunction buildDataUrl(part: { data: unknown; mediaType: string }): string {\n const { data, mediaType } = part;\n const href = getURLHref(data);\n if (href !== undefined) return href;\n\n if (typeof data === \"string\") return `data:${mediaType};base64,${data}`;\n\n if (isUint8Array(data)) {\n return `data:${mediaType};base64,${base64FromBytes(data)}`;\n }\n\n if (isArrayBuffer(data)) {\n let bytes: Uint8Array;\n try {\n bytes = new Uint8Array(data);\n } catch {\n throw new UnsupportedFunctionalityError({\n functionality: \"Detached ArrayBuffer file data is unsupported.\",\n });\n }\n return `data:${mediaType};base64,${base64FromBytes(bytes)}`;\n }\n\n if (typeof data === \"object\" && data !== null) {\n const toString = (data as { toString?: unknown }).toString;\n if (typeof toString === \"function\" && toString !== Object.prototype.toString) {\n const encoded: unknown = toString.call(data, \"base64\");\n if (typeof encoded === \"string\" && isCanonicalBase64(encoded)) {\n return `data:${mediaType};base64,${encoded}`;\n }\n }\n }\n\n throw new UnsupportedFunctionalityError({\n functionality:\n \"Unsupported file data type. Expected base64 string, Uint8Array, ArrayBuffer, URL, or a buffer-like object returning canonical base64.\",\n });\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
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":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/orchestration-language-model-strategy.ts"],"sourcesContent":["/** Orchestration language model strategy using `@sap-ai-sdk/orchestration`. */\nimport type { LanguageModelV3CallOptions, SharedV3Warning } from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type {\n ChatCompletionRequest,\n ChatCompletionTool,\n ChatMessage,\n OrchestrationClient,\n OrchestrationModuleConfig,\n OrchestrationModuleConfigList,\n} from \"@sap-ai-sdk/orchestration\";\n\nimport type { ParsePartProviderOptions } from \"./sap-ai-provider-options.js\";\nimport type {\n OrchestrationModelSettings,\n PromptTemplateRef,\n PromptTemplateRefByID,\n} 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 { deepMerge } from \"./deep-merge.js\";\nimport {\n orchestrationConfigRefSchema,\n parseSAPPartProviderOptions,\n} from \"./sap-ai-provider-options.js\";\nimport { validateMaskingProvidersDeprecation } from \"./sap-ai-validation.js\";\nimport {\n convertResponseFormat,\n convertToolsToSAPFormat,\n hasKeys,\n type ParamMapping,\n type SAPResponseFormat,\n type SAPToolChoice,\n type SDKResponse,\n type SDKStreamChunk,\n} from \"./strategy-utils.js\";\n\n/** @internal */\ntype OrchestrationClientInstance = InstanceType<typeof OrchestrationClient>;\n\n/**\n * Typed resolved state for values computed in buildCommonParts and consumed in buildRequest/createClient.\n * @internal\n */\ninterface OrchestrationResolvedState {\n readonly configRef: OrchestrationModelSettings[\"orchestrationConfigRef\"];\n readonly promptTemplateRef: PromptTemplateRef | undefined;\n readonly responseFormat: SAPResponseFormat | undefined;\n readonly tools: ChatCompletionTool[] | undefined;\n}\n\n/**\n * Builds the template_ref object from a PromptTemplateRef.\n * @param ref - Template reference (by ID or by name/scenario/version).\n * @returns The template_ref object for SDK consumption.\n * @internal\n */\nfunction buildTemplateRefObject(ref: PromptTemplateRef): Record<string, unknown> {\n return isTemplateRefById(ref)\n ? {\n id: ref.id,\n ...(ref.scope && { scope: ref.scope }),\n }\n : {\n name: ref.name,\n scenario: ref.scenario,\n version: ref.version,\n ...(ref.scope && { scope: ref.scope }),\n };\n}\n\n/**\n * Type guard for template reference by ID.\n * @param ref - Template reference.\n * @returns True if reference is by ID.\n * @internal\n */\nfunction isTemplateRefById(ref: PromptTemplateRef): ref is PromptTemplateRefByID {\n return \"id\" in ref;\n}\n\n/**\n * Merges and resolves placeholder values from settings and provider options.\n * @param settings - Model settings containing placeholderValues.\n * @param sapOptions - Provider options containing placeholderValues.\n * @returns Merged placeholder values or undefined if empty.\n * @internal\n */\nfunction resolvePlaceholderValues(\n settings: OrchestrationModelSettings,\n sapOptions: Record<string, unknown> | undefined,\n): Record<string, string> | undefined {\n const merged = deepMerge(\n settings.placeholderValues as Record<string, unknown> | undefined,\n sapOptions?.placeholderValues as Record<string, unknown> | undefined,\n ) as Record<string, string>;\n\n return hasKeys(merged) ? merged : undefined;\n}\n\n/**\n * Module keys for orchestration configuration.\n * @internal\n */\nconst ORCHESTRATION_MODULE_KEYS = [\"masking\", \"filtering\", \"grounding\", \"translation\"] as const;\n\n/**\n * Module settings that are ignored when using orchestrationConfigRef.\n * @internal\n */\nconst CONFIG_REF_IGNORED_MODULES = [\n ...ORCHESTRATION_MODULE_KEYS,\n \"fallbackModuleConfigs\",\n \"promptTemplateRef\",\n \"responseFormat\",\n \"tools\",\n \"modelParams\",\n \"modelVersion\",\n] as const;\n\n/**\n * Provider options that are ignored when using orchestrationConfigRef.\n * Subset of CONFIG_REF_IGNORED_MODULES that can be passed via providerOptions.\n * @internal\n */\nconst CONFIG_REF_IGNORED_PROVIDER_OPTIONS = [\"promptTemplateRef\", \"modelParams\"] as const;\n\n/**\n * Copies non-empty orchestration modules from source to target.\n * @param target - Target object to copy modules into.\n * @param source - Source object containing module configurations.\n * @internal\n */\nfunction copyOrchestrationModules(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): void {\n for (const key of ORCHESTRATION_MODULE_KEYS) {\n const value = source[key];\n if (value && hasKeys(value)) {\n target[key] = value;\n }\n }\n}\n\n/**\n * Checks if a value is a valid orchestration configuration reference.\n * @param value - The value to check.\n * @returns True if the value is a valid orchestration configuration reference.\n * @internal\n */\nfunction isOrchestrationConfigRef(\n value: unknown,\n): value is NonNullable<OrchestrationModelSettings[\"orchestrationConfigRef\"]> {\n return orchestrationConfigRefSchema.safeParse(value).success;\n}\n\n/**\n * Orchestration API parameter mappings.\n * @internal\n */\nconst ORCHESTRATION_PARAM_MAPPINGS: readonly ParamMapping[] = [\n ...BaseLanguageModelStrategy.COMMON_PARAM_MAPPINGS,\n { camelCaseKey: \"topK\", optionKey: \"topK\", outputKey: \"top_k\" },\n] as const;\n\n/**\n * Language model strategy for the Orchestration API.\n *\n * Provides support for:\n * - Content filtering\n * - Data masking\n * - Document grounding\n * - Translation\n * - Prompt templates\n * - Orchestration config references\n * @internal\n */\nexport class OrchestrationLanguageModelStrategy extends BaseLanguageModelStrategy<\n OrchestrationClientInstance,\n ChatCompletionRequest,\n OrchestrationModelSettings\n> {\n private readonly ClientClass: typeof OrchestrationClient;\n\n constructor(ClientClass: typeof OrchestrationClient) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected buildRequest(\n _config: LanguageModelStrategyConfig,\n settings: OrchestrationModelSettings,\n options: LanguageModelV3CallOptions,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): { readonly request: ChatCompletionRequest; readonly warnings: SharedV3Warning[] } {\n const warnings: SharedV3Warning[] = [];\n\n const { configRef } = commonParts.resolvedState as OrchestrationResolvedState;\n\n if (configRef) {\n return this.buildConfigRefRequest(settings, options, commonParts, warnings);\n }\n\n return this.buildStandardRequest(settings, commonParts, warnings);\n }\n\n /**\n * Collects stream-specific warnings for orchestration.\n * @param settings - Model settings.\n * @param sapOptions - Provider options.\n * @returns Array of warnings for streaming operations.\n * @internal\n */\n protected override collectStreamWarnings(\n settings: OrchestrationModelSettings,\n sapOptions?: Record<string, unknown>,\n ): SharedV3Warning[] {\n const warnings: SharedV3Warning[] = [];\n\n // A valid configRef owns streaming server-side; flag only explicitly set\n // streamOptions (other ignored settings are reported by buildConfigRefRequest).\n const configRefCandidate =\n sapOptions?.orchestrationConfigRef ?? settings.orchestrationConfigRef;\n if (configRefCandidate && isOrchestrationConfigRef(configRefCandidate)) {\n if (settings.streamOptions && hasKeys(settings.streamOptions)) {\n warnings.push({\n message:\n \"orchestrationConfigRef is set; local streamOptions are ignored. \" +\n \"Configure streaming in the referenced configuration or its overrideConfig.\",\n type: \"other\",\n });\n }\n return warnings;\n }\n\n if (settings.translation && hasKeys(settings.translation)) {\n if (!settings.streamOptions?.delimiters || settings.streamOptions.delimiters.length === 0) {\n warnings.push({\n message:\n \"Translation module is configured but streamOptions.delimiters is not set. \" +\n \"For proper sentence boundary detection during streaming with translation, \" +\n \"consider setting delimiters (e.g., ['.', '!', '?', '\\\\n']).\",\n type: \"other\",\n });\n }\n }\n\n return warnings;\n }\n\n protected createClient(\n config: LanguageModelStrategyConfig,\n settings: OrchestrationModelSettings,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): OrchestrationClientInstance {\n const { configRef, promptTemplateRef, responseFormat, tools } =\n commonParts.resolvedState as OrchestrationResolvedState;\n\n if (configRef) {\n return new this.ClientClass(configRef, config.deploymentConfig, config.destination);\n }\n\n const clientConfig = this.buildOrchestrationModuleConfig(config, settings, {\n modelParams: commonParts.modelParams,\n promptTemplateRef,\n responseFormat,\n toolChoice: commonParts.toolChoice,\n tools,\n });\n\n if (settings.fallbackModuleConfigs && settings.fallbackModuleConfigs.length > 0) {\n const configList = [\n clientConfig,\n ...settings.fallbackModuleConfigs,\n ] as OrchestrationModuleConfigList;\n return new this.ClientClass(configList, config.deploymentConfig, config.destination);\n }\n\n return new this.ClientClass(clientConfig, config.deploymentConfig, config.destination);\n }\n\n protected async executeApiCall(\n client: OrchestrationClientInstance,\n request: ChatCompletionRequest,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<SDKResponse> {\n const response = await client.chatCompletion(request, requestConfig);\n\n const { requestId, responseMetadata } = this.extractMetadata(response);\n\n return {\n getCitations: () => response.getCitations(),\n getContent: () => response.getContent(),\n getFinishReason: () => response.getFinishReason(),\n getIntermediateFailures: () => response.getIntermediateFailures(),\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: OrchestrationClientInstance,\n request: ChatCompletionRequest,\n abortSignal: AbortSignal | undefined,\n settings: OrchestrationModelSettings,\n requestConfig: CustomRequestConfig | undefined,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n ): Promise<StreamCallResponse> {\n // A configRef owns streaming server-side; the SDK ignores (and warns about)\n // request-level stream options, so omit them.\n const { configRef } = commonParts.resolvedState as OrchestrationResolvedState;\n const sdkStreamOptions = configRef\n ? undefined\n : this.buildSdkStreamOptions(settings.streamOptions);\n const streamResponse = await client.stream(\n request,\n abortSignal,\n sdkStreamOptions,\n requestConfig,\n );\n\n const { requestId, responseHeaders, responseMetadata } = this.extractMetadata(streamResponse);\n\n return {\n cancel: () => {\n streamResponse.stream.controller.abort();\n },\n getCitations: () => streamResponse.getCitations(),\n getFinishReason: () => streamResponse.getFinishReason(),\n getIntermediateFailures: () => streamResponse.getIntermediateFailures(),\n requestId,\n responseHeaders,\n responseMetadata,\n stream: streamResponse.stream as AsyncIterable<SDKStreamChunk>,\n };\n }\n\n protected getCompletionDataPath(): readonly string[] {\n return [\"final_result\"];\n }\n\n protected getEscapeTemplatePlaceholders(\n sapOptions: Record<string, unknown> | undefined,\n settings: OrchestrationModelSettings,\n ): boolean {\n return (\n (sapOptions?.escapeTemplatePlaceholders as boolean | undefined) ??\n settings.escapeTemplatePlaceholders ??\n true\n );\n }\n\n protected getParamMappings(): readonly ParamMapping[] {\n return ORCHESTRATION_PARAM_MAPPINGS;\n }\n\n protected override getPartProviderOptionsParser(): ParsePartProviderOptions | undefined {\n return parseSAPPartProviderOptions;\n }\n\n protected getUrl(): string {\n return \"sap-ai:orchestration\";\n }\n\n /**\n * Resolves orchestration-specific extra state: `configRef`, `promptTemplateRef`,\n * and `tools`. Pushes the masking-providers deprecation warning when masking\n * is locally configured (skipped under `configRef` because the server-side\n * configuration overrides it).\n * @param _config - Strategy configuration (unused).\n * @param settings - Model settings.\n * @param sapOptions - Parsed provider options.\n * @param options - AI SDK call options.\n * @param warnings - Shared warnings sink.\n * @returns Resolved orchestration state.\n * @internal\n */\n protected override resolveAdditionalState(\n _config: LanguageModelStrategyConfig,\n settings: OrchestrationModelSettings,\n sapOptions: Record<string, unknown> | undefined,\n options: LanguageModelV3CallOptions,\n warnings: SharedV3Warning[],\n ): OrchestrationResolvedState {\n const configRef = this.resolveConfigRef(sapOptions, settings, warnings);\n const promptTemplateRef = this.resolvePromptTemplateRef(sapOptions, settings);\n\n let responseFormat: SAPResponseFormat | undefined;\n if (configRef === undefined) {\n validateMaskingProvidersDeprecation(settings, warnings);\n const converted = convertResponseFormat(options.responseFormat, settings.responseFormat);\n responseFormat = converted.responseFormat;\n if (converted.warning) warnings.push(converted.warning);\n }\n\n const tools = this.resolveTools(settings, options, warnings);\n\n return { configRef, promptTemplateRef, responseFormat, tools };\n }\n\n /**\n * Builds request for orchestrationConfigRef mode.\n *\n * In configRef mode, the full configuration is managed server-side.\n * This request contains messages and placeholderValues; createClient separately\n * passes the reference, including overrideConfig, to the SAP SDK.\n * @param settings - Model settings.\n * @param options - Call options.\n * @param commonParts - Common build result.\n * @param warnings - Warnings array to populate.\n * @returns Request body and warnings.\n * @internal\n */\n private buildConfigRefRequest(\n settings: OrchestrationModelSettings,\n options: LanguageModelV3CallOptions,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n warnings: SharedV3Warning[],\n ): { readonly request: ChatCompletionRequest; readonly warnings: SharedV3Warning[] } {\n warnings.push(\n ...this.collectConfigRefIgnoredWarnings(settings, options, commonParts.sapOptions),\n );\n\n const placeholderValues = resolvePlaceholderValues(settings, commonParts.sapOptions);\n\n // In configRef mode, SDK uses messagesHistory (not messages)\n const request: ChatCompletionRequest = {\n messagesHistory: commonParts.messages,\n ...(placeholderValues ? { placeholderValues } : {}),\n };\n\n return { request, warnings };\n }\n\n /**\n * Builds inline template configuration.\n * @param tools - Optional tools.\n * @param responseFormat - Optional response format.\n * @returns Prompt configuration.\n * @internal\n */\n private buildInlineTemplateConfig(\n tools: ChatCompletionTool[] | undefined,\n responseFormat: unknown,\n ): Record<string, unknown> {\n return {\n template: [],\n ...(tools && tools.length > 0 ? { tools } : {}),\n ...(responseFormat ? { response_format: responseFormat } : {}),\n };\n }\n\n /**\n * Builds the orchestration module configuration.\n * @param config - Strategy configuration.\n * @param settings - Model settings.\n * @param params - Build parameters.\n * @param params.modelParams - LLM model parameters.\n * @param params.promptTemplateRef - Optional prompt template reference.\n * @param params.responseFormat - Optional response format specification.\n * @param params.toolChoice - Optional tool choice specification.\n * @param params.tools - Optional tools for function calling.\n * @returns Orchestration module configuration.\n * @internal\n */\n private buildOrchestrationModuleConfig(\n config: LanguageModelStrategyConfig,\n settings: OrchestrationModelSettings,\n params: {\n readonly modelParams: Record<string, unknown>;\n readonly promptTemplateRef?: PromptTemplateRef;\n readonly responseFormat?: unknown;\n readonly toolChoice?: SAPToolChoice;\n readonly tools?: ChatCompletionTool[];\n },\n ): OrchestrationModuleConfig {\n const { modelParams, promptTemplateRef, responseFormat, toolChoice, tools } = params;\n\n const promptConfig = promptTemplateRef\n ? this.buildTemplateRefPromptConfig(promptTemplateRef, tools, responseFormat)\n : this.buildInlineTemplateConfig(tools, responseFormat);\n\n // The SDK accepts model-specific options such as tool_choice only in model.params.\n const effectiveModelParams = toolChoice\n ? { ...modelParams, tool_choice: toolChoice }\n : modelParams;\n\n const moduleConfig: OrchestrationModuleConfig = {\n promptTemplating: {\n model: {\n name: config.modelId,\n params: effectiveModelParams,\n ...(settings.modelVersion ? { version: settings.modelVersion } : {}),\n },\n prompt: promptConfig,\n },\n };\n\n copyOrchestrationModules(\n moduleConfig as unknown as Record<string, unknown>,\n settings as unknown as Record<string, unknown>,\n );\n\n return moduleConfig;\n }\n\n /**\n * Builds SAP SDK stream options from user-facing stream options.\n * @param streamOptions - User-provided stream options.\n * @returns SDK-compatible stream options object.\n * @internal\n */\n private buildSdkStreamOptions(streamOptions: OrchestrationModelSettings[\"streamOptions\"]): {\n global?: { chunk_size?: number; delimiters?: string[] };\n outputFiltering?: { overlap: number };\n promptTemplating: { include_usage: boolean };\n } {\n const delimiters = streamOptions?.delimiters;\n const hasNonEmptyDelimiters = Array.isArray(delimiters) && delimiters.length > 0;\n const hasGlobalOptions = streamOptions?.chunkSize !== undefined || hasNonEmptyDelimiters;\n\n return {\n promptTemplating: { include_usage: true },\n ...(hasGlobalOptions && {\n global: {\n ...(streamOptions?.chunkSize !== undefined && { chunk_size: streamOptions.chunkSize }),\n ...(hasNonEmptyDelimiters && {\n delimiters: Array.from(delimiters),\n }),\n },\n }),\n ...(streamOptions?.outputFilteringOverlap !== undefined && {\n outputFiltering: { overlap: streamOptions.outputFilteringOverlap },\n }),\n };\n }\n\n /**\n * Builds request for standard (non-configRef) mode.\n * @param settings - Model settings.\n * @param commonParts - Common build result.\n * @param warnings - Warnings array to populate.\n * @returns Request body and warnings.\n * @internal\n */\n private buildStandardRequest(\n settings: OrchestrationModelSettings,\n commonParts: CommonBuildResult<ChatMessage[], SAPToolChoice | undefined>,\n warnings: SharedV3Warning[],\n ): { readonly request: ChatCompletionRequest; readonly warnings: SharedV3Warning[] } {\n const { promptTemplateRef } = commonParts.resolvedState as OrchestrationResolvedState;\n const placeholderValues = resolvePlaceholderValues(settings, commonParts.sapOptions);\n const request: ChatCompletionRequest = {\n ...(promptTemplateRef\n ? { messagesHistory: commonParts.messages }\n : { messages: commonParts.messages }),\n ...(placeholderValues ? { placeholderValues } : {}),\n };\n\n return { request, warnings };\n }\n\n /**\n * Builds prompt configuration for template reference with optional tools/response_format.\n * @param ref - Template reference.\n * @param tools - Optional tools.\n * @param responseFormat - Optional response format.\n * @returns Prompt configuration.\n * @internal\n */\n private buildTemplateRefPromptConfig(\n ref: PromptTemplateRef,\n tools?: ChatCompletionTool[],\n responseFormat?: unknown,\n ): Record<string, unknown> {\n return {\n template_ref: buildTemplateRefObject(ref),\n ...(tools && tools.length > 0 ? { tools } : {}),\n ...(responseFormat ? { response_format: responseFormat } : {}),\n };\n }\n\n /**\n * Collects warnings for settings that will be ignored when using orchestrationConfigRef.\n * @param settings - The orchestration model settings.\n * @param options - The call options (for tools and responseFormat).\n * @param sapOptions - Parsed provider options (for promptTemplateRef in providerOptions).\n * @returns Array of warnings for ignored settings.\n * @internal\n */\n private collectConfigRefIgnoredWarnings(\n settings: OrchestrationModelSettings,\n options: LanguageModelV3CallOptions,\n sapOptions: Record<string, unknown> | undefined,\n ): SharedV3Warning[] {\n const warnings: SharedV3Warning[] = [];\n const ignoredSettings: string[] = [];\n\n for (const key of CONFIG_REF_IGNORED_MODULES) {\n const value = settings[key as keyof OrchestrationModelSettings];\n if (value !== undefined) {\n if (typeof value === \"object\" && Object.keys(value).length === 0) {\n continue; // Skip empty objects\n }\n ignoredSettings.push(key);\n }\n }\n\n for (const key of CONFIG_REF_IGNORED_PROVIDER_OPTIONS) {\n if (sapOptions?.[key] && !settings[key as keyof OrchestrationModelSettings]) {\n ignoredSettings.push(`providerOptions.${key}`);\n }\n }\n\n const optionValues: Record<string, unknown> = options;\n for (const { optionKey } of this.getParamMappings()) {\n if (optionKey && optionValues[optionKey] !== undefined) {\n ignoredSettings.push(`options.${optionKey}`);\n }\n }\n if (options.stopSequences && options.stopSequences.length > 0) {\n ignoredSettings.push(\"options.stopSequences\");\n }\n\n if (options.tools && options.tools.length > 0) {\n ignoredSettings.push(\"options.tools\");\n }\n if (options.responseFormat) {\n ignoredSettings.push(\"options.responseFormat\");\n }\n if (options.toolChoice) {\n ignoredSettings.push(\"options.toolChoice\");\n }\n\n if (ignoredSettings.length > 0) {\n warnings.push({\n message: `orchestrationConfigRef is set; the following local settings are ignored: ${ignoredSettings.join(\", \")}. The full configuration is managed by the referenced config.`,\n type: \"other\",\n });\n }\n\n return warnings;\n }\n\n /**\n * Resolves the orchestrationConfigRef from provider options or settings.\n * Parsed provider options take priority over settings. An invalid settings reference\n * is ignored with a warning; invalid per-call references fail schema parsing earlier.\n * @param sapOptions - Parsed provider options from commonParts.\n * @param settings - The model settings.\n * @param warnings - Shared warnings sink for degradation signals.\n * @returns The resolved config reference or undefined.\n * @internal\n */\n private resolveConfigRef(\n sapOptions: Record<string, unknown> | undefined,\n settings: OrchestrationModelSettings,\n warnings: SharedV3Warning[],\n ): OrchestrationModelSettings[\"orchestrationConfigRef\"] {\n const configRefCandidate =\n sapOptions?.orchestrationConfigRef ?? settings.orchestrationConfigRef;\n\n if (!configRefCandidate) {\n return undefined;\n }\n\n if (isOrchestrationConfigRef(configRefCandidate)) {\n return configRefCandidate;\n }\n\n warnings.push({\n message:\n \"orchestrationConfigRef is invalid and was ignored; falling back to local module settings.\",\n type: \"other\",\n });\n return undefined;\n }\n\n /**\n * Resolves promptTemplateRef from provider options or settings.\n *\n * Provider options take priority over settings.\n * @param sapOptions - Parsed provider options from commonParts.\n * @param settings - The model settings.\n * @returns The resolved prompt template reference or undefined.\n * @internal\n */\n private resolvePromptTemplateRef(\n sapOptions: Record<string, unknown> | undefined,\n settings: OrchestrationModelSettings,\n ): PromptTemplateRef | undefined {\n const rawTemplateRef = sapOptions?.promptTemplateRef ?? settings.promptTemplateRef;\n\n if (\n rawTemplateRef &&\n typeof rawTemplateRef === \"object\" &&\n (\"id\" in rawTemplateRef || \"name\" in rawTemplateRef)\n ) {\n return rawTemplateRef as PromptTemplateRef;\n }\n\n return undefined;\n }\n\n /**\n * Resolves tools from settings or options with orchestration-specific priority.\n *\n * Orchestration allows tools to be defined in settings (unlike Foundation Models),\n * with options.tools taking priority.\n * @param settings - Model settings.\n * @param options - Call options.\n * @param warnings - Warnings array to populate.\n * @returns Resolved tools or undefined.\n * @internal\n */\n private resolveTools(\n settings: OrchestrationModelSettings,\n options: LanguageModelV3CallOptions,\n warnings: SharedV3Warning[],\n ): ChatCompletionTool[] | undefined {\n const settingsTools = settings.tools;\n const optionsTools = options.tools;\n\n if (settingsTools && settingsTools.length > 0 && optionsTools && optionsTools.length > 0) {\n warnings.push({\n message:\n \"Both settings.tools and call options.tools were provided; preferring call options.tools.\",\n type: \"other\",\n });\n }\n\n // Use settingsTools directly if available and no optionsTools\n // (settingsTools are already in SAP format)\n if (settingsTools && settingsTools.length > 0 && (!optionsTools || optionsTools.length === 0)) {\n return settingsTools;\n }\n\n if (optionsTools && optionsTools.length > 0) {\n const result = convertToolsToSAPFormat<ChatCompletionTool>(optionsTools, {\n parser: parseSAPPartProviderOptions,\n warnings,\n });\n warnings.push(...result.warnings);\n return result.tools;\n }\n\n return undefined;\n }\n}\n"],"mappings":"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","names":[]}