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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +39 -32
  2. package/dist/{chunk-JRUSQTKB.js → chunk-3H5C5U22.js} +19 -11
  3. package/dist/chunk-3H5C5U22.js.map +1 -0
  4. package/dist/{chunk-AFZC2DH2.js → chunk-4JLNWASF.js} +59 -387
  5. package/dist/chunk-4JLNWASF.js.map +1 -0
  6. package/dist/{chunk-U23M3VYO.js → chunk-E76ZDPIW.js} +17 -7
  7. package/dist/chunk-E76ZDPIW.js.map +1 -0
  8. package/dist/chunk-NF355OFT.js +635 -0
  9. package/dist/chunk-NF355OFT.js.map +1 -0
  10. package/dist/chunk-UIBQ5AFS.js +778 -0
  11. package/dist/chunk-UIBQ5AFS.js.map +1 -0
  12. package/dist/{chunk-MF3VO3ER.js → chunk-YP3AADWD.js} +47 -40
  13. package/dist/chunk-YP3AADWD.js.map +1 -0
  14. package/dist/{foundation-models-embedding-model-strategy-2GUADNXT.js → foundation-models-embedding-model-strategy-SAVQFBF4.js} +8 -9
  15. package/dist/foundation-models-embedding-model-strategy-SAVQFBF4.js.map +1 -0
  16. package/dist/{foundation-models-language-model-strategy-5AYZ5KHA.js → foundation-models-language-model-strategy-ZDOWVYTA.js} +19 -22
  17. package/dist/foundation-models-language-model-strategy-ZDOWVYTA.js.map +1 -0
  18. package/dist/index.cjs +1317 -31652
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +17 -32
  21. package/dist/index.d.ts +17 -32
  22. package/dist/index.js +48 -194
  23. package/dist/index.js.map +1 -1
  24. package/dist/{orchestration-embedding-model-strategy-F7WHDLX7.js → orchestration-embedding-model-strategy-GT27AFII.js} +7 -11
  25. package/dist/orchestration-embedding-model-strategy-GT27AFII.js.map +1 -0
  26. package/dist/{orchestration-language-model-strategy-Z72AFW62.js → orchestration-language-model-strategy-7QTPQHCC.js} +32 -27
  27. package/dist/orchestration-language-model-strategy-7QTPQHCC.js.map +1 -0
  28. package/package.json +16 -13
  29. package/dist/chunk-2KOXKYVT.js +0 -31083
  30. package/dist/chunk-2KOXKYVT.js.map +0 -1
  31. package/dist/chunk-643USI3B.js +0 -251
  32. package/dist/chunk-643USI3B.js.map +0 -1
  33. package/dist/chunk-AFZC2DH2.js.map +0 -1
  34. package/dist/chunk-JRUSQTKB.js.map +0 -1
  35. package/dist/chunk-MF3VO3ER.js.map +0 -1
  36. package/dist/chunk-U23M3VYO.js.map +0 -1
  37. package/dist/foundation-models-embedding-model-strategy-2GUADNXT.js.map +0 -1
  38. package/dist/foundation-models-language-model-strategy-5AYZ5KHA.js.map +0 -1
  39. package/dist/orchestration-embedding-model-strategy-F7WHDLX7.js.map +0 -1
  40. package/dist/orchestration-language-model-strategy-Z72AFW62.js.map +0 -1
@@ -0,0 +1 @@
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"]}
@@ -14,6 +14,7 @@ var TYPED_ARRAY_LENGTH_DESCRIPTOR = Object.getOwnPropertyDescriptor(
14
14
  Object.getPrototypeOf(Uint8Array.prototype),
15
15
  "length"
16
16
  );
17
+ var SUPPORTED_IMAGE_FORMATS = ["image/png", "image/jpeg", "image/jpg", "image/gif", "image/webp"];
17
18
  var TYPED_ARRAY_TAG_DESCRIPTOR = Object.getOwnPropertyDescriptor(
18
19
  Object.getPrototypeOf(Uint8Array.prototype),
19
20
  Symbol.toStringTag
@@ -75,23 +76,44 @@ function isUint8Array(value) {
75
76
  }
76
77
  function safeJsonStringify(value) {
77
78
  try {
78
- return JSON.stringify(
79
+ const serialized = JSON.stringify(
79
80
  value,
80
81
  (_key, val) => typeof val === "bigint" ? val.toString() : val
81
82
  );
83
+ if (typeof serialized === "string") return serialized;
82
84
  } catch {
85
+ }
86
+ try {
83
87
  return String(value);
88
+ } catch {
89
+ throw new InvalidPromptError({ message: "Tool output cannot be serialized.", prompt: value });
84
90
  }
85
91
  }
92
+ function serializeToolCallInput(input) {
93
+ try {
94
+ if (typeof input === "string") {
95
+ JSON.parse(input);
96
+ return input;
97
+ }
98
+ const serialized = JSON.stringify(input);
99
+ if (typeof serialized === "string") return serialized;
100
+ } catch {
101
+ }
102
+ throw new InvalidPromptError({
103
+ message: "Tool call input must be JSON-serializable.",
104
+ prompt: input
105
+ });
106
+ }
86
107
  function wrapAsTextContent(text, cacheControl) {
87
108
  return cacheControl ? { cache_control: cacheControl, text, type: "text" } : { text, type: "text" };
88
109
  }
89
110
  var JINJA2_DELIMITERS_PATTERN = /\{(?=[{%#])/g;
90
- var JINJA2_DELIMITERS_ESCAPED_PATTERN = new RegExp(`\\{${ZERO_WIDTH_SPACE}([{%#])`, "g");
111
+ var JINJA2_DELIMITERS_ESCAPED_PATTERN = new RegExp(`\\{${ZERO_WIDTH_SPACE}(?=[{%#])`, "g");
91
112
  function base64FromBytes(bytes) {
92
113
  const CHUNK_SIZE = 32768;
93
114
  let byteLength;
94
115
  try {
116
+ Uint8Array.prototype.at.call(bytes, 0);
95
117
  byteLength = TYPED_ARRAY_LENGTH_DESCRIPTOR?.get?.call(bytes);
96
118
  } catch {
97
119
  throw new UnsupportedFunctionalityError({
@@ -138,7 +160,7 @@ function convertToSAPMessages(prompt, options = {}) {
138
160
  switch (message.role) {
139
161
  case "assistant": {
140
162
  let text = "";
141
- const textParts = [];
163
+ const textParts = parser ? [] : void 0;
142
164
  let anyCacheControl = false;
143
165
  const toolCalls = [];
144
166
  for (const part of message.content) {
@@ -152,40 +174,32 @@ function convertToSAPMessages(prompt, options = {}) {
152
174
  }
153
175
  case "reasoning": {
154
176
  if (includeReasoning && part.text) {
155
- const escaped = `<think>${maybeEscape(part.text)}</think>`;
156
- text += escaped;
157
- textParts.push({ text: escaped });
177
+ const reasoning = `<think>${part.text}</think>`;
178
+ text += reasoning;
179
+ textParts?.push({ text: reasoning });
158
180
  }
159
181
  break;
160
182
  }
161
183
  case "text": {
162
- const escaped = maybeEscape(part.text);
163
- if (!escaped) break;
184
+ if (!part.text) break;
164
185
  const partOpts = parsePart(part.providerOptions);
165
186
  const cacheControl = partOpts?.cacheControl;
166
- text += escaped;
167
- textParts.push(cacheControl ? { cacheControl, text: escaped } : { text: escaped });
187
+ text += part.text;
188
+ textParts?.push(
189
+ cacheControl ? { cacheControl, text: part.text } : { text: part.text }
190
+ );
168
191
  if (cacheControl) anyCacheControl = true;
169
192
  break;
170
193
  }
171
194
  case "tool-call": {
172
195
  const partOpts = parsePart(part.providerOptions);
173
- if (partOpts?.cacheControl && options.warnings) {
174
- const feature = "cacheControl on assistant tool-call";
175
- if (!options.warnings.some((w) => w.feature === feature)) {
176
- options.warnings.push({
177
- details: "SAP orchestration does not expose cache_control on the assistant tool-call envelope.",
178
- feature,
179
- type: "unsupported"
180
- });
181
- }
182
- }
183
- let argumentsJson;
184
- if (typeof part.input === "string") {
185
- argumentsJson = part.input;
186
- } else {
187
- argumentsJson = JSON.stringify(part.input);
196
+ if (partOpts?.cacheControl) {
197
+ pushWarningOnce(
198
+ "cacheControl on assistant tool-call",
199
+ "SAP orchestration does not expose cache_control on the assistant tool-call envelope."
200
+ );
188
201
  }
202
+ const argumentsJson = serializeToolCallInput(part.input);
189
203
  toolCalls.push({
190
204
  function: {
191
205
  arguments: maybeEscape(argumentsJson),
@@ -207,7 +221,7 @@ function convertToSAPMessages(prompt, options = {}) {
207
221
  }
208
222
  if (text || toolCalls.length > 0) {
209
223
  const assistantMessage = {
210
- content: anyCacheControl ? textParts.map((p) => wrapAsTextContent(p.text, p.cacheControl)) : text,
224
+ content: anyCacheControl && textParts ? textParts.map((p) => wrapAsTextContent(maybeEscape(p.text), p.cacheControl)) : maybeEscape(text),
211
225
  role: "assistant",
212
226
  tool_calls: toolCalls.length > 0 ? toolCalls : void 0
213
227
  };
@@ -231,8 +245,8 @@ function convertToSAPMessages(prompt, options = {}) {
231
245
  if (part.type === "tool-result") {
232
246
  const partOpts = parsePart(part.providerOptions);
233
247
  const cacheControl = partOpts?.cacheControl;
234
- const serializedOutput = safeJsonStringify(part.output);
235
- const escaped = maybeEscape(serializedOutput);
248
+ const outputText = part.output.type === "text" ? part.output.value : safeJsonStringify(part.output);
249
+ const escaped = maybeEscape(outputText);
236
250
  const toolMessage = {
237
251
  content: cacheControl ? [wrapAsTextContent(escaped, cacheControl)] : escaped,
238
252
  role: "tool",
@@ -256,17 +270,10 @@ function convertToSAPMessages(prompt, options = {}) {
256
270
  switch (part.type) {
257
271
  case "file": {
258
272
  const fileDataUrl = buildDataUrl(part);
259
- if (part.mediaType.startsWith("image/")) {
260
- const supportedFormats = [
261
- "image/png",
262
- "image/jpeg",
263
- "image/jpg",
264
- "image/gif",
265
- "image/webp"
266
- ];
267
- const normalizedMediaType = part.mediaType.toLowerCase();
273
+ const normalizedMediaType = part.mediaType.toLowerCase();
274
+ if (normalizedMediaType.startsWith("image/")) {
268
275
  const isWildcardImageUrl = getURLHref(part.data) !== void 0 && normalizedMediaType === "image/*";
269
- if (!isWildcardImageUrl && !supportedFormats.includes(normalizedMediaType)) {
276
+ if (!isWildcardImageUrl && !SUPPORTED_IMAGE_FORMATS.includes(normalizedMediaType)) {
270
277
  console.warn(
271
278
  `Image format ${part.mediaType} may not be supported by all models. Recommended formats: PNG, JPEG, GIF, WebP`
272
279
  );
@@ -333,7 +340,7 @@ function escapeOrchestrationPlaceholders(text) {
333
340
  }
334
341
  function unescapeOrchestrationPlaceholders(text) {
335
342
  if (!text) return text;
336
- return text.replaceAll(JINJA2_DELIMITERS_ESCAPED_PATTERN, "{$1");
343
+ return text.replaceAll(JINJA2_DELIMITERS_ESCAPED_PATTERN, "{");
337
344
  }
338
345
  function buildDataUrl(part) {
339
346
  const { data, mediaType } = part;
@@ -373,4 +380,4 @@ export {
373
380
  escapeOrchestrationPlaceholders,
374
381
  unescapeOrchestrationPlaceholders
375
382
  };
376
- //# sourceMappingURL=chunk-MF3VO3ER.js.map
383
+ //# sourceMappingURL=chunk-YP3AADWD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/convert-to-sap-messages.ts"],"sourcesContent":["import type {\n AssistantChatMessage,\n ChatMessage,\n SystemChatMessage,\n ToolChatMessage,\n UserChatMessage,\n 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,15 +1,14 @@
1
1
  import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
2
2
  import {
3
3
  BaseEmbeddingModelStrategy
4
- } from "./chunk-JRUSQTKB.js";
4
+ } from "./chunk-3H5C5U22.js";
5
5
  import {
6
6
  buildModelDeployment,
7
7
  extractResponseMetadata,
8
8
  hasKeys,
9
- mergeRequestConfig,
10
9
  normalizeEmbedding
11
- } from "./chunk-AFZC2DH2.js";
12
- import "./chunk-2KOXKYVT.js";
10
+ } from "./chunk-4JLNWASF.js";
11
+ import "./chunk-UIBQ5AFS.js";
13
12
 
14
13
  // src/foundation-models-embedding-model-strategy.ts
15
14
  var FoundationModelsEmbeddingModelStrategy = class extends BaseEmbeddingModelStrategy {
@@ -28,9 +27,9 @@ var FoundationModelsEmbeddingModelStrategy = class extends BaseEmbeddingModelStr
28
27
  mergedParams: hasKeys(mergedParams) ? mergedParams : void 0
29
28
  };
30
29
  }
31
- async executeCall(clientWithContext, values, _embeddingType, abortSignal, requestConfig) {
30
+ async executeCall(clientWithContext, values, _embeddingType, requestConfig) {
32
31
  const request = this.buildRequest(values, clientWithContext.mergedParams);
33
- return clientWithContext.client.run(request, mergeRequestConfig(requestConfig, abortSignal));
32
+ return clientWithContext.client.run(request, requestConfig);
34
33
  }
35
34
  extractEmbeddings(response) {
36
35
  const embeddingData = response._data.data;
@@ -48,12 +47,12 @@ var FoundationModelsEmbeddingModelStrategy = class extends BaseEmbeddingModelStr
48
47
  }
49
48
  buildRequest(values, mergedParams) {
50
49
  return {
51
- input: values,
52
- ...mergedParams ?? {}
50
+ ...mergedParams ?? {},
51
+ input: values
53
52
  };
54
53
  }
55
54
  };
56
55
  export {
57
56
  FoundationModelsEmbeddingModelStrategy
58
57
  };
59
- //# sourceMappingURL=foundation-models-embedding-model-strategy-2GUADNXT.js.map
58
+ //# sourceMappingURL=foundation-models-embedding-model-strategy-SAVQFBF4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/foundation-models-embedding-model-strategy.ts"],"sourcesContent":["/** Foundation Models embedding model strategy using `@sap-ai-sdk/foundation-models`. */\nimport type { EmbeddingModelV3Embedding } from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\nimport type {\n AzureOpenAiEmbeddingClient,\n AzureOpenAiEmbeddingParameters,\n AzureOpenAiEmbeddingResponse,\n} from \"@sap-ai-sdk/foundation-models\";\n\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\nimport type { EmbeddingModelStrategyConfig } from \"./sap-ai-strategy.js\";\nimport type { EmbeddingProviderOptions, ResponseMetadata } from \"./strategy-utils.js\";\n\nimport { BaseEmbeddingModelStrategy } from \"./base-embedding-model-strategy.js\";\nimport {\n buildModelDeployment,\n extractResponseMetadata,\n hasKeys,\n normalizeEmbedding,\n} from \"./strategy-utils.js\";\n\n/**\n * Client with pre-merged params for thread-safe concurrent requests.\n * @internal\n */\ninterface FMEmbeddingClientWithContext {\n client: AzureOpenAiEmbeddingClient;\n mergedParams: Record<string, unknown> | undefined;\n}\n\n/** @internal */\ntype FoundationModelsEmbeddingClientClass = typeof AzureOpenAiEmbeddingClient;\n\n/**\n * Embedding model strategy for the Foundation Models API.\n *\n * Provides direct access to Azure OpenAI embedding models.\n * @internal\n */\nexport class FoundationModelsEmbeddingModelStrategy extends BaseEmbeddingModelStrategy<\n FMEmbeddingClientWithContext,\n AzureOpenAiEmbeddingResponse\n> {\n private readonly ClientClass: FoundationModelsEmbeddingClientClass;\n\n constructor(ClientClass: FoundationModelsEmbeddingClientClass) {\n super();\n this.ClientClass = ClientClass;\n }\n\n protected createClient(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n embeddingOptions: EmbeddingProviderOptions | undefined,\n ): FMEmbeddingClientWithContext {\n const mergedParams = this.mergeModelParams(settings, embeddingOptions);\n\n return {\n client: new this.ClientClass(\n buildModelDeployment(config, settings.modelVersion),\n config.destination,\n ),\n mergedParams: hasKeys(mergedParams) ? mergedParams : undefined,\n };\n }\n\n protected async executeCall(\n clientWithContext: FMEmbeddingClientWithContext,\n values: string[],\n _embeddingType: unknown,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<AzureOpenAiEmbeddingResponse> {\n const request = this.buildRequest(values, clientWithContext.mergedParams);\n return clientWithContext.client.run(request, requestConfig);\n }\n\n protected extractEmbeddings(response: AzureOpenAiEmbeddingResponse): EmbeddingModelV3Embedding[] {\n // SDK types include `& Record<string, any>` which requires explicit extraction\n const embeddingData = response._data.data;\n const sortedEmbeddings = embeddingData.slice().sort((a, b) => a.index - b.index);\n return sortedEmbeddings.map((item) => normalizeEmbedding(item.embedding as number[]));\n }\n\n protected override extractResponseMetadata(\n response: AzureOpenAiEmbeddingResponse,\n ): ResponseMetadata {\n return extractResponseMetadata(response, \"rawResponse\");\n }\n\n protected extractTokenCount(response: AzureOpenAiEmbeddingResponse): number {\n return response._data.usage.total_tokens;\n }\n\n protected getUrl(): string {\n return \"sap-ai:foundation-models/embeddings\";\n }\n\n private buildRequest(\n values: string[],\n mergedParams: Record<string, unknown> | undefined,\n ): AzureOpenAiEmbeddingParameters {\n return {\n ...(mergedParams ?? {}),\n input: values,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAuCO,IAAM,yCAAN,cAAqD,2BAG1D;AAAA,EACiB;AAAA,EAEjB,YAAY,aAAmD;AAC7D,UAAM;AACN,SAAK,cAAc;AAAA,EACrB;AAAA,EAEU,aACR,QACA,UACA,kBAC8B;AAC9B,UAAM,eAAe,KAAK,iBAAiB,UAAU,gBAAgB;AAErE,WAAO;AAAA,MACL,QAAQ,IAAI,KAAK;AAAA,QACf,qBAAqB,QAAQ,SAAS,YAAY;AAAA,QAClD,OAAO;AAAA,MACT;AAAA,MACA,cAAc,QAAQ,YAAY,IAAI,eAAe;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAgB,YACd,mBACA,QACA,gBACA,eACuC;AACvC,UAAM,UAAU,KAAK,aAAa,QAAQ,kBAAkB,YAAY;AACxE,WAAO,kBAAkB,OAAO,IAAI,SAAS,aAAa;AAAA,EAC5D;AAAA,EAEU,kBAAkB,UAAqE;AAE/F,UAAM,gBAAgB,SAAS,MAAM;AACrC,UAAM,mBAAmB,cAAc,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC/E,WAAO,iBAAiB,IAAI,CAAC,SAAS,mBAAmB,KAAK,SAAqB,CAAC;AAAA,EACtF;AAAA,EAEmB,wBACjB,UACkB;AAClB,WAAO,wBAAwB,UAAU,aAAa;AAAA,EACxD;AAAA,EAEU,kBAAkB,UAAgD;AAC1E,WAAO,SAAS,MAAM,MAAM;AAAA,EAC9B;AAAA,EAEU,SAAiB;AACzB,WAAO;AAAA,EACT;AAAA,EAEQ,aACN,QACA,cACgC;AAChC,WAAO;AAAA,MACL,GAAI,gBAAgB,CAAC;AAAA,MACrB,OAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
@@ -1,15 +1,14 @@
1
1
  import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
2
2
  import {
3
3
  BaseLanguageModelStrategy
4
- } from "./chunk-643USI3B.js";
5
- import "./chunk-MF3VO3ER.js";
4
+ } from "./chunk-NF355OFT.js";
5
+ import "./chunk-YP3AADWD.js";
6
6
  import {
7
7
  buildModelDeployment,
8
8
  convertResponseFormat,
9
- convertToolsToSAPFormat,
10
- mergeRequestConfig
11
- } from "./chunk-AFZC2DH2.js";
12
- import "./chunk-2KOXKYVT.js";
9
+ convertToolsToSAPFormat
10
+ } from "./chunk-4JLNWASF.js";
11
+ import "./chunk-UIBQ5AFS.js";
13
12
 
14
13
  // src/foundation-models-language-model-strategy.ts
15
14
  var FOUNDATION_MODELS_PARAM_MAPPINGS = [
@@ -54,9 +53,9 @@ var FoundationModelsLanguageModelStrategy = class extends BaseLanguageModelStrat
54
53
  const modelDeployment = buildModelDeployment(config, settings.modelVersion);
55
54
  return new this.ClientClass(modelDeployment, config.destination);
56
55
  }
57
- async executeApiCall(client, request, abortSignal, requestConfig) {
58
- const response = await client.run(request, mergeRequestConfig(requestConfig, abortSignal));
59
- const { requestId, responseId } = this.extractMetadata(response);
56
+ async executeApiCall(client, request, requestConfig) {
57
+ const response = await client.run(request, requestConfig);
58
+ const { requestId, responseMetadata } = this.extractMetadata(response);
60
59
  return {
61
60
  getContent: () => response.getContent(),
62
61
  getFinishReason: () => response.getFinishReason(),
@@ -65,27 +64,25 @@ var FoundationModelsLanguageModelStrategy = class extends BaseLanguageModelStrat
65
64
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- SAP SDK types headers as any
66
65
  rawResponse: { headers: response.rawResponse.headers },
67
66
  requestId,
68
- responseId
67
+ responseMetadata
69
68
  };
70
69
  }
71
- async executeStreamCall(client, request, abortSignal, _settings, requestConfig) {
72
- const streamResponse = await client.stream(
73
- request,
74
- abortSignal,
75
- mergeRequestConfig(requestConfig, void 0)
76
- );
77
- const { requestId, responseHeaders, responseId } = this.extractMetadata(streamResponse);
70
+ async executeStreamCall(client, request, abortSignal, _settings, requestConfig, _commonParts) {
71
+ const streamResponse = await client.stream(request, abortSignal, requestConfig);
72
+ const { requestId, responseHeaders, responseMetadata } = this.extractMetadata(streamResponse);
78
73
  return {
74
+ cancel: () => {
75
+ streamResponse.stream.controller.abort();
76
+ },
79
77
  getFinishReason: () => streamResponse.getFinishReason(),
80
- getTokenUsage: () => streamResponse.getTokenUsage(),
81
78
  requestId,
82
79
  responseHeaders,
83
- responseId,
80
+ responseMetadata,
84
81
  stream: streamResponse.stream
85
82
  };
86
83
  }
87
- getCompletionIdPath() {
88
- return ["id"];
84
+ getCompletionDataPath() {
85
+ return [];
89
86
  }
90
87
  getParamMappings() {
91
88
  return FOUNDATION_MODELS_PARAM_MAPPINGS;
@@ -97,4 +94,4 @@ var FoundationModelsLanguageModelStrategy = class extends BaseLanguageModelStrat
97
94
  export {
98
95
  FoundationModelsLanguageModelStrategy
99
96
  };
100
- //# sourceMappingURL=foundation-models-language-model-strategy-5AYZ5KHA.js.map
97
+ //# sourceMappingURL=foundation-models-language-model-strategy-ZDOWVYTA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/foundation-models-language-model-strategy.ts"],"sourcesContent":["/** Foundation Models language model strategy using `@sap-ai-sdk/foundation-models`. */\nimport type { LanguageModelV3CallOptions, SharedV3Warning } from \"@ai-sdk/provider\";\nimport type { 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":[]}