@mymediset/sap-ai-provider
Version:
SAP AI Core provider for AI SDK
1 lines • 46.1 kB
Source Map (JSON)
{"version":3,"sources":["../src/sap-ai-provider.ts","../src/sap-ai-chat-language-model.ts","../src/convert-to-sap-messages.ts","../src/sap-ai-error.ts","../src/types/completion-response.ts"],"sourcesContent":["import { ProviderV2 } from \"@ai-sdk/provider\";\nimport { loadApiKey, withoutTrailingSlash } from \"@ai-sdk/provider-utils\";\nimport { SAPAIChatLanguageModel } from \"./sap-ai-chat-language-model\";\nimport { SAPAIModelId, SAPAISettings } from \"./sap-ai-chat-settings\";\n\n// SAP AI Core Service Key interface (what users get from SAP BTP)\nexport interface SAPAIServiceKey {\n serviceurls: {\n AI_API_URL: string;\n };\n clientid: string;\n clientsecret: string;\n url: string;\n identityzone?: string;\n identityzoneid?: string;\n appname?: string;\n \"credential-type\"?: string;\n}\n\n// model factory function with additional methods and properties\nexport interface SAPAIProvider extends ProviderV2 {\n (modelId: SAPAIModelId, settings?: SAPAISettings): SAPAIChatLanguageModel;\n\n // explicit method for targeting chat models\n chat(modelId: SAPAIModelId, settings?: SAPAISettings): SAPAIChatLanguageModel;\n}\n\n// Simple settings for the provider\nexport interface SAPAIProviderSettings {\n /**\n * SAP AI Core service key (JSON string or parsed object).\n * This is what you get from SAP BTP - just copy/paste it here.\n * If provided, OAuth2 will be handled automatically.\n */\n serviceKey?: string | SAPAIServiceKey;\n\n /**\n * Alternative: provide token directly (for advanced users)\n */\n token?: string;\n\n /**\n * SAP AI Core deployment ID.\n * @default 'd65d81e7c077e583'\n */\n deploymentId?: string;\n\n /**\n * SAP AI Core resource group.\n * @default 'default'\n */\n resourceGroup?: string;\n\n /**\n * Custom base URL (optional)\n */\n baseURL?: string;\n\n /**\n * Custom headers (optional)\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation (optional)\n */\n fetch?: typeof fetch;\n}\n\n// OAuth2 helper function\nasync function getOAuthToken(\n serviceKey: SAPAIServiceKey,\n customFetch?: typeof fetch,\n): Promise<string> {\n const fetchFn = customFetch || fetch;\n const tokenUrl = `${serviceKey.url}/oauth/token`;\n const credentials = Buffer.from(\n `${serviceKey.clientid}:${serviceKey.clientsecret}`,\n ).toString(\"base64\");\n\n const response = await fetchFn(tokenUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Authorization: `Basic ${credentials}`,\n },\n body: \"grant_type=client_credentials\",\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to get OAuth access token: ${response.status} ${response.statusText}\\n${errorText}`,\n );\n }\n\n const tokenData = await response.json();\n return tokenData.access_token;\n}\n\n/**\n * Main SAP AI provider factory function.\n *\n * @example\n * // With service key (recommended)\n * const provider = await createSAPAIProvider({\n * serviceKey: '{\"serviceurls\":{\"AI_API_URL\":\"...\"},\"clientid\":\"...\",\"clientsecret\":\"...\",\"url\":\"...\"}'\n * });\n *\n * // With token (advanced)\n * const provider = createSAPAIProvider({\n * token: 'your-oauth-token'\n * });\n *\n * // Use with Vercel AI SDK\n * const model = provider('gpt-4o');\n */\nexport async function createSAPAIProvider(\n options: SAPAIProviderSettings = {},\n): Promise<SAPAIProvider> {\n let baseURL: string;\n let authToken: string;\n\n // Parse service key if provided\n let parsedServiceKey: SAPAIServiceKey | undefined;\n if (options.serviceKey) {\n if (typeof options.serviceKey === \"string\") {\n try {\n parsedServiceKey = JSON.parse(options.serviceKey);\n } catch (error) {\n throw new Error(\"Invalid service key JSON format\");\n }\n } else {\n parsedServiceKey = options.serviceKey;\n }\n }\n\n // Determine baseURL\n if (parsedServiceKey) {\n baseURL =\n withoutTrailingSlash(options.baseURL) ??\n `${parsedServiceKey.serviceurls.AI_API_URL}/v2`;\n } else {\n baseURL =\n withoutTrailingSlash(options.baseURL) ??\n \"https://api.ai.prod.eu-central-1.aws.ml.hana.ondemand.com/v2\";\n }\n\n // Determine authentication\n if (options.token) {\n authToken = options.token;\n } else if (parsedServiceKey) {\n // Get OAuth token automatically\n authToken = await getOAuthToken(parsedServiceKey, options.fetch);\n } else {\n // Try environment variable\n authToken = loadApiKey({\n apiKey: undefined,\n environmentVariableName: \"SAP_AI_TOKEN\",\n description: \"SAP AI Core\",\n });\n }\n\n const deploymentId = options.deploymentId ?? \"d65d81e7c077e583\";\n const resourceGroup = options.resourceGroup ?? \"default\";\n\n // Create the model factory function\n const createModel = (modelId: SAPAIModelId, settings: SAPAISettings = {}) => {\n return new SAPAIChatLanguageModel(modelId, settings, {\n provider: \"sap-ai\",\n baseURL: `${baseURL}/inference/deployments/${deploymentId}/completion`,\n headers: () => ({\n Authorization: `Bearer ${authToken}`,\n \"Content-Type\": \"application/json\",\n \"ai-resource-group\": resourceGroup,\n ...options.headers,\n }),\n fetch: options.fetch,\n });\n };\n\n // Create the provider function\n const provider = function (modelId: SAPAIModelId, settings?: SAPAISettings) {\n if (new.target) {\n throw new Error(\n \"The SAP AI provider function cannot be called with the new keyword.\",\n );\n }\n\n return createModel(modelId, settings);\n };\n\n provider.chat = createModel;\n\n return provider as SAPAIProvider;\n}\n\n/**\n * Synchronous version for when you already have a token.\n * Most users should use createSAPAIProvider() instead.\n */\nexport function createSAPAIProviderSync(\n options: Omit<SAPAIProviderSettings, \"serviceKey\"> & { token: string },\n): SAPAIProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ??\n \"https://api.ai.prod.eu-central-1.aws.ml.hana.ondemand.com/v2\";\n\n const deploymentId = options.deploymentId ?? \"d65d81e7c077e583\";\n const resourceGroup = options.resourceGroup ?? \"default\";\n\n const createModel = (modelId: SAPAIModelId, settings: SAPAISettings = {}) => {\n return new SAPAIChatLanguageModel(modelId, settings, {\n provider: \"sap-ai\",\n baseURL: `${baseURL}/inference/deployments/${deploymentId}/completion`,\n headers: () => ({\n Authorization: `Bearer ${options.token}`,\n \"Content-Type\": \"application/json\",\n \"ai-resource-group\": resourceGroup,\n ...options.headers,\n }),\n fetch: options.fetch,\n });\n };\n\n const provider = function (modelId: SAPAIModelId, settings?: SAPAISettings) {\n if (new.target) {\n throw new Error(\n \"The SAP AI provider function cannot be called with the new keyword.\",\n );\n }\n\n return createModel(modelId, settings);\n };\n\n provider.chat = createModel;\n\n return provider as SAPAIProvider;\n}\n\n/**\n * Default SAP AI provider instance (uses SAP_AI_TOKEN environment variable).\n * Will throw error only when actually used without the environment variable.\n */\nfunction createDefaultSAPAI(): SAPAIProvider {\n const createModel = (modelId: SAPAIModelId, settings?: SAPAISettings) => {\n const token = process.env.SAP_AI_TOKEN;\n if (!token) {\n throw new Error(\n \"SAP_AI_TOKEN environment variable is required for default instance. \" +\n 'Either set SAP_AI_TOKEN or use createSAPAIProvider({ serviceKey: \"...\" }) instead.',\n );\n }\n\n const provider = createSAPAIProviderSync({ token });\n return provider(modelId, settings);\n };\n\n const provider = function (modelId: SAPAIModelId, settings?: SAPAISettings) {\n return createModel(modelId, settings);\n };\n\n provider.chat = createModel;\n\n return provider as SAPAIProvider;\n}\n\nexport const sapai = createDefaultSAPAI();\n","import {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2CallWarning,\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2FunctionTool,\n LanguageModelV2ProviderDefinedTool,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n} from \"@ai-sdk/provider\";\nimport {\n FetchFunction,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n ParseResult,\n postJsonToApi,\n} from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\nimport { convertToSAPMessages } from \"./convert-to-sap-messages\";\nimport { SAPAIModelId, SAPAISettings } from \"./sap-ai-chat-settings\";\nimport { sapAIFailedResponseHandler } from \"./sap-ai-error\";\nimport {\n sapAIResponseSchema,\n sapAIStreamResponseSchema,\n} from \"./types/completion-response\";\n\ntype SAPAIConfig = {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n};\n\nexport class SAPAIChatLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = \"v2\";\n readonly defaultObjectGenerationMode = \"json\";\n readonly supportsImageUrls = true;\n readonly modelId: SAPAIModelId;\n readonly supportsStructuredOutputs = true;\n\n private readonly config: SAPAIConfig;\n private readonly settings: SAPAISettings;\n\n constructor(\n modelId: SAPAIModelId,\n settings: SAPAISettings,\n config: SAPAIConfig,\n ) {\n this.settings = settings;\n this.config = config;\n this.modelId = modelId;\n }\n\n supportsUrl(url: URL): boolean {\n return url.protocol === \"https:\";\n }\n\n get supportedUrls(): Record<string, RegExp[]> {\n return {\n \"image/*\": [\n /^https:\\/\\/.*\\.(?:png|jpg|jpeg|gif|webp)$/i,\n /^data:image\\/.*$/,\n ],\n };\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private getArgs(\n options: LanguageModelV2CallOptions,\n streaming: boolean = false,\n ) {\n const warnings: LanguageModelV2CallWarning[] = [];\n\n // Extract tools from mode if available (for tool calling)\n const availableTools = options.tools as\n | Array<LanguageModelV2FunctionTool | LanguageModelV2ProviderDefinedTool>\n | undefined;\n\n // Check if model supports structured outputs (OpenAI and Gemini models do, Anthropic doesn't)\n const supportsStructuredOutputs =\n !this.modelId.startsWith(\"anthropic--\") &&\n !this.modelId.startsWith(\"claude-\") &&\n !this.modelId.startsWith(\"amazon--\");\n\n const supportsN = !this.modelId.startsWith(\"amazon--\");\n\n const templatingConfig: any = {\n template: convertToSAPMessages(options.prompt),\n defaults: {},\n tools: availableTools\n ?.map((tool) => {\n if (tool.type === \"function\") {\n let parameters = tool.inputSchema;\n return {\n type: tool.type,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: parameters || {\n type: \"object\",\n properties: {},\n required: [],\n },\n },\n };\n } else {\n warnings.push({\n type: \"unsupported-tool\",\n tool: tool,\n });\n return null;\n }\n })\n .filter(Boolean),\n };\n\n // Only add response_format for models that support it AND when no tools are available\n // (tools require flexible response format for tool calls)\n if (supportsStructuredOutputs && !availableTools?.length) {\n templatingConfig.response_format = {\n type: \"json_schema\",\n json_schema: {\n name: \"chat_completion_response\",\n strict: true,\n schema: {\n type: \"object\",\n properties: {\n role: { type: \"string\", enum: [\"assistant\"] },\n content: { type: \"string\" },\n },\n required: [\"role\", \"content\"],\n additionalProperties: false,\n },\n },\n };\n }\n\n const args = {\n orchestration_config: {\n stream: streaming,\n module_configurations: {\n llm_module_config: {\n model_name: this.modelId,\n model_version: this.settings.modelVersion ?? \"latest\",\n model_params: {\n temperature: this.settings.modelParams?.temperature ?? 0.7,\n max_tokens: this.settings.modelParams?.maxTokens ?? 1000,\n top_p: this.settings.modelParams?.topP,\n frequency_penalty: this.settings.modelParams?.frequencyPenalty,\n presence_penalty: this.settings.modelParams?.presencePenalty,\n n: supportsN ? (this.settings.modelParams?.n ?? 1) : undefined,\n },\n },\n templating_module_config: templatingConfig,\n },\n },\n };\n\n return { args, warnings };\n }\n\n async doGenerate(options: LanguageModelV2CallOptions): Promise<{\n content: LanguageModelV2Content[];\n finishReason: LanguageModelV2FinishReason;\n usage: LanguageModelV2Usage;\n rawCall: { rawPrompt: unknown; rawSettings: Record<string, unknown> };\n warnings: LanguageModelV2CallWarning[];\n }> {\n const { args, warnings } = this.getArgs(options);\n const headers = combineHeaders(\n this.config.headers(),\n options.headers ?? {},\n );\n\n const { value: response } = await postJsonToApi<\n z.infer<typeof sapAIResponseSchema>\n >({\n url: this.config.baseURL,\n headers,\n body: args,\n failedResponseHandler: sapAIFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n sapAIResponseSchema as any,\n ),\n fetch: this.config.fetch,\n abortSignal: options.abortSignal,\n });\n\n const firstChoice = response.module_results.llm.choices[0];\n const usage = response.module_results.llm.usage;\n\n const content: LanguageModelV2Content[] = [];\n\n if (firstChoice.message.content) {\n let text: string;\n try {\n const parsed = JSON.parse(firstChoice.message.content);\n text = parsed.content || firstChoice.message.content;\n } catch {\n text = firstChoice.message.content;\n }\n\n if (text) {\n content.push({\n type: \"text\",\n text: text,\n });\n }\n }\n\n if (firstChoice.message.tool_calls) {\n for (const toolCall of firstChoice.message.tool_calls) {\n content.push({\n type: \"tool-call\",\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n input: toolCall.function.arguments,\n });\n }\n }\n\n return {\n content,\n finishReason: firstChoice.finish_reason as LanguageModelV2FinishReason,\n usage: {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n },\n rawCall: {\n rawPrompt: args,\n rawSettings: {},\n },\n warnings,\n };\n }\n\n async doStream(options: LanguageModelV2CallOptions): Promise<{\n stream: ReadableStream<LanguageModelV2StreamPart>;\n rawCall: { rawPrompt: unknown; rawSettings: Record<string, unknown> };\n }> {\n const { args, warnings } = this.getArgs(options, true);\n const body = args;\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.baseURL,\n headers: combineHeaders(this.config.headers(), options.headers),\n body,\n failedResponseHandler: sapAIFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n sapAIStreamResponseSchema as any,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n let finishReason: LanguageModelV2FinishReason = \"unknown\";\n const usage: LanguageModelV2Usage = {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n };\n\n let isFirstChunk = true;\n let activeText = false;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof sapAIStreamResponseSchema>>,\n LanguageModelV2StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: \"stream-start\", warnings });\n },\n\n transform(chunk, controller) {\n if (!chunk.success) {\n controller.enqueue({ type: \"error\", error: chunk.error });\n return;\n }\n\n const value = chunk.value;\n\n // Skip chunks that don't have LLM results (e.g., initial templating chunks)\n const llmResult = value.module_results.llm;\n if (!llmResult) {\n return;\n }\n\n if (isFirstChunk) {\n isFirstChunk = false;\n\n controller.enqueue({\n type: \"response-metadata\",\n id: llmResult.id ?? undefined,\n modelId: llmResult.model ?? undefined,\n timestamp: llmResult.created\n ? new Date(llmResult.created * 1000)\n : undefined,\n });\n }\n\n if (llmResult.usage != null) {\n usage.inputTokens = llmResult.usage.prompt_tokens;\n usage.outputTokens = llmResult.usage.completion_tokens;\n usage.totalTokens = llmResult.usage.total_tokens;\n }\n\n const choice = llmResult.choices[0];\n const delta = choice.delta;\n\n // Handle text content\n if (delta.content != null && delta.content.length > 0) {\n // Extract text from JSON response if needed\n let textContent: string;\n try {\n const parsed = JSON.parse(delta.content);\n textContent = parsed.content || delta.content;\n } catch {\n textContent = delta.content;\n }\n\n if (!activeText) {\n controller.enqueue({ type: \"text-start\", id: \"0\" });\n activeText = true;\n }\n\n controller.enqueue({\n type: \"text-delta\",\n id: \"0\",\n delta: textContent,\n });\n }\n\n // Handle tool calls\n if (delta.tool_calls != null) {\n for (const toolCall of delta.tool_calls) {\n const toolCallId = toolCall.id;\n const toolName = toolCall.function.name;\n const input = toolCall.function.arguments;\n\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallId,\n toolName,\n });\n\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCallId,\n delta: input,\n });\n\n controller.enqueue({\n type: \"tool-input-end\",\n id: toolCallId,\n });\n\n controller.enqueue({\n type: \"tool-call\",\n toolCallId,\n toolName,\n input,\n });\n }\n }\n\n if (choice.finish_reason != null) {\n finishReason =\n choice.finish_reason as LanguageModelV2FinishReason;\n }\n },\n\n flush(controller) {\n if (activeText) {\n controller.enqueue({ type: \"text-end\", id: \"0\" });\n }\n\n controller.enqueue({\n type: \"finish\",\n finishReason,\n usage,\n });\n },\n }),\n ),\n rawCall: { rawPrompt: body, rawSettings: {} },\n };\n }\n}\n","import {\n LanguageModelV2Prompt,\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\";\n\ntype SAPMessageContent =\n | string\n | Array<{\n type: \"text\" | \"image_url\";\n text?: string;\n image_url?: {\n url: string;\n };\n }>;\n\ntype SAPMessage = {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: SAPMessageContent | string;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n tool_call_id?: string;\n};\n\nexport function convertToSAPMessages(\n prompt: LanguageModelV2Prompt,\n): SAPMessage[] {\n const messages: SAPMessage[] = [];\n\n for (const message of prompt) {\n switch (message.role) {\n case \"system\": {\n messages.push({\n role: \"system\",\n content: message.content,\n });\n break;\n }\n\n case \"user\": {\n // Use SAP AI Core's structured content format for user messages\n const contentParts: Array<{\n type: \"text\" | \"image_url\";\n text?: string;\n image_url?: {\n url: string;\n };\n }> = [];\n\n for (const part of message.content) {\n switch (part.type) {\n case \"text\": {\n contentParts.push({\n type: \"text\",\n text: part.text,\n });\n break;\n }\n case \"file\": {\n // Convert image to base64 data URL or use URL directly, SAP AI Core only supports image files\n if (!part.mediaType.startsWith(\"image/\")) {\n throw new UnsupportedFunctionalityError({\n functionality: \"Only image files are supported\",\n });\n }\n\n const imageUrl =\n part.data instanceof URL\n ? part.data.toString()\n : `data:${part.mediaType};base64,${part.data}`;\n\n // Use SAP AI Core's exact format\n contentParts.push({\n type: \"image_url\",\n image_url: {\n url: imageUrl,\n },\n });\n break;\n }\n default: {\n throw new UnsupportedFunctionalityError({\n functionality: `Content type ${(part as any).type}`,\n });\n }\n }\n }\n\n // If only text content, use simple string format, otherwise use structured format\n if (contentParts.length === 1 && contentParts[0].type === \"text\") {\n messages.push({\n role: \"user\",\n content: contentParts[0].text!,\n });\n } else {\n messages.push({\n role: \"user\",\n content: contentParts,\n });\n }\n break;\n }\n\n case \"assistant\": {\n let text = \"\";\n const toolCalls: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }> = [];\n\n for (const part of message.content) {\n switch (part.type) {\n case \"text\": {\n text += part.text;\n break;\n }\n case \"tool-call\": {\n toolCalls.push({\n id: part.toolCallId,\n type: \"function\",\n function: {\n name: part.toolName,\n arguments: JSON.stringify(part.input),\n },\n });\n break;\n }\n }\n }\n\n messages.push({\n role: \"assistant\",\n content: text,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n });\n break;\n }\n\n case \"tool\": {\n // SAP AI Core expects tool responses to follow tool calls\n // Convert tool results to a format that SAP AI Core can understand\n for (const part of message.content) {\n if (part.type === \"tool-result\") {\n messages.push({\n role: \"tool\",\n tool_call_id: part.toolCallId,\n content: JSON.stringify(part.output),\n });\n }\n }\n break;\n }\n\n default: {\n const _exhaustiveCheck: never = message;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n\n return messages;\n}\n","import { createJsonErrorResponseHandler } from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod\";\n\n/**\n * Schema for SAP AI Core error responses.\n * This matches the error format returned by the SAP AI Core API.\n */\nconst sapAIErrorSchema = z\n .object({\n /** Unique identifier for tracking the request */\n request_id: z.string().optional(),\n\n /** HTTP status code or custom error code */\n code: z.number().optional(),\n\n /** Human-readable error message */\n message: z.string().optional(),\n\n /** Where the error occurred (e.g., endpoint, function) */\n location: z.string().optional(),\n\n /** Detailed error information */\n error: z\n .object({\n /** Specific error message */\n message: z.string().optional(),\n\n /** Error type code */\n code: z.string().optional(),\n\n /** Parameter that caused the error */\n param: z.string().optional(),\n\n /** Error category (e.g., 'validation', 'auth') */\n type: z.string().optional(),\n })\n .optional(),\n\n /** Additional error context or debugging information */\n details: z.string().optional(),\n })\n .optional();\n\nexport type SAPAIErrorData = z.infer<typeof sapAIErrorSchema>;\n\n/**\n * Custom error class for SAP AI Core errors.\n * Provides structured access to error details returned by the API.\n *\n * @example\n * ```typescript\n * try {\n * await model.generate();\n * } catch (error) {\n * if (error instanceof SAPAIError) {\n * console.error('Error Code:', error.code);\n * console.error('Request ID:', error.requestId);\n * console.error('Location:', error.location);\n * }\n * }\n * ```\n */\nexport class SAPAIError extends Error {\n /** HTTP status code or custom error code */\n public readonly code?: number;\n\n /** Where the error occurred (e.g., endpoint, function) */\n public readonly location?: string;\n\n /** Unique identifier for tracking the request */\n public readonly requestId?: string;\n\n /** Additional error context or debugging information */\n public readonly details?: string;\n\n constructor(\n message: string,\n /** Raw error data from the API response */\n public readonly data?: SAPAIErrorData,\n /** Original HTTP response object */\n public readonly response?: Response,\n ) {\n super(message);\n this.name = \"SAPAIError\";\n\n if (data) {\n this.code = data.code;\n this.location = data.location;\n this.requestId = data.request_id;\n this.details = data.details;\n }\n }\n}\n\n/**\n * Error response handler for SAP AI Core API calls.\n * Converts API error responses into SAPAIError instances.\n *\n * Features:\n * - Parses error responses into structured format\n * - Provides clear error messages\n * - Handles retryable errors (429, 5xx)\n */\nexport const sapAIFailedResponseHandler: any = createJsonErrorResponseHandler({\n errorSchema: sapAIErrorSchema as any,\n errorToMessage: (data: SAPAIErrorData) => {\n return (\n data?.error?.message ||\n data?.message ||\n \"An error occurred during the SAP AI Core request.\"\n );\n },\n isRetryable: (response: Response, error?: unknown) => {\n const status = response.status;\n return (\n status === 429 ||\n status === 500 ||\n status === 502 ||\n status === 503 ||\n status === 504\n );\n },\n});\n","import { z } from \"zod\";\n\nconst sapAIToolCallSchema = z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n});\n\n// Schema for structured content parts (used in templating)\nconst sapAIContentPartSchema = z.union([\n z.object({\n type: z.literal(\"text\"),\n text: z.string(),\n }),\n z.object({\n type: z.literal(\"image_url\"),\n image_url: z.object({\n url: z.string(),\n detail: z.string().optional(),\n }),\n }),\n]);\n\n// Schema for templating messages (can have structured content)\nconst sapAITemplatingMessageSchema = z.object({\n role: z.enum([\"assistant\", \"user\", \"system\", \"tool\"]),\n content: z.union([z.string(), z.array(sapAIContentPartSchema)]),\n tool_calls: z.array(sapAIToolCallSchema).optional(),\n tool_call_id: z.string().optional(),\n});\n\n// Schema for LLM result messages (content can be string or null for tool calls)\nconst sapAIMessageSchema = z.object({\n role: z.enum([\"assistant\", \"user\", \"system\", \"tool\"]),\n content: z.string().nullable(),\n tool_calls: z.array(sapAIToolCallSchema).optional(),\n tool_call_id: z.string().optional(),\n});\n\nconst sapAIChoiceSchema = z.object({\n message: sapAIMessageSchema,\n finish_reason: z.string(),\n});\n\nconst sapAIUsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n});\n\nconst sapAILLMResultSchema = z.object({\n choices: z.array(sapAIChoiceSchema),\n usage: sapAIUsageSchema,\n id: z.string().optional(),\n object: z.string().optional(),\n created: z.number().optional(),\n model: z.string().optional(),\n system_fingerprint: z.string().optional(),\n});\n\nconst sapAITemplatingResultSchema = z.array(sapAITemplatingMessageSchema);\n\nexport const sapAIResponseSchema = z.object({\n request_id: z.string(),\n module_results: z.object({\n llm: sapAILLMResultSchema,\n templating: sapAITemplatingResultSchema,\n }),\n orchestration_results: z\n .object({\n id: z.string().optional(),\n object: z.string().optional(),\n created: z.number().optional(),\n model: z.string().optional(),\n system_fingerprint: z.string().optional(),\n choices: z.array(sapAIChoiceSchema).optional(),\n usage: sapAIUsageSchema.optional(),\n })\n .optional(),\n});\n\n// Streaming schemas for SAP AI Core responses\nconst sapAIStreamChoiceSchema = z.object({\n delta: z.object({\n role: z.enum([\"assistant\"]).optional(),\n content: z.string().optional(),\n tool_calls: z.array(sapAIToolCallSchema).optional(),\n }),\n finish_reason: z.string().nullish(),\n index: z.number(),\n});\n\nconst sapAIStreamLLMResultSchema = z.object({\n choices: z.array(sapAIStreamChoiceSchema),\n usage: sapAIUsageSchema.nullish(),\n id: z.string().optional(),\n object: z.string().optional(),\n created: z.number().optional(),\n model: z.string().optional(),\n system_fingerprint: z.string().optional(),\n});\n\nexport const sapAIStreamResponseSchema = z.object({\n request_id: z.string(),\n module_results: z.object({\n llm: sapAIStreamLLMResultSchema.optional(),\n templating: z.array(sapAITemplatingMessageSchema).optional(),\n }),\n orchestration_result: z\n .object({\n id: z.string().optional(),\n object: z.string().optional(),\n created: z.number().optional(),\n model: z.string().optional(),\n system_fingerprint: z.string().optional(),\n choices: z.array(sapAIStreamChoiceSchema).optional(),\n usage: sapAIUsageSchema.optional(),\n })\n .optional(),\n});\n\nexport type SAPAIResponse = z.infer<typeof sapAIResponseSchema>;\nexport type SAPAIStreamResponse = z.infer<typeof sapAIStreamResponseSchema>;\n"],"mappings":";AACA,SAAS,YAAY,4BAA4B;;;ACUjD;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;;;AClBP;AAAA,EAEE;AAAA,OACK;AAuBA,SAAS,qBACd,QACc;AACd,QAAM,WAAyB,CAAC;AAEhC,aAAW,WAAW,QAAQ;AAC5B,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK,UAAU;AACb,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,QAAQ;AAAA,QACnB,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AAEX,cAAM,eAMD,CAAC;AAEN,mBAAW,QAAQ,QAAQ,SAAS;AAClC,kBAAQ,KAAK,MAAM;AAAA,YACjB,KAAK,QAAQ;AACX,2BAAa,KAAK;AAAA,gBAChB,MAAM;AAAA,gBACN,MAAM,KAAK;AAAA,cACb,CAAC;AACD;AAAA,YACF;AAAA,YACA,KAAK,QAAQ;AAEX,kBAAI,CAAC,KAAK,UAAU,WAAW,QAAQ,GAAG;AACxC,sBAAM,IAAI,8BAA8B;AAAA,kBACtC,eAAe;AAAA,gBACjB,CAAC;AAAA,cACH;AAEA,oBAAM,WACJ,KAAK,gBAAgB,MACjB,KAAK,KAAK,SAAS,IACnB,QAAQ,KAAK,SAAS,WAAW,KAAK,IAAI;AAGhD,2BAAa,KAAK;AAAA,gBAChB,MAAM;AAAA,gBACN,WAAW;AAAA,kBACT,KAAK;AAAA,gBACP;AAAA,cACF,CAAC;AACD;AAAA,YACF;AAAA,YACA,SAAS;AACP,oBAAM,IAAI,8BAA8B;AAAA,gBACtC,eAAe,gBAAiB,KAAa,IAAI;AAAA,cACnD,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAGA,YAAI,aAAa,WAAW,KAAK,aAAa,CAAC,EAAE,SAAS,QAAQ;AAChE,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS,aAAa,CAAC,EAAE;AAAA,UAC3B,CAAC;AAAA,QACH,OAAO;AACL,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,YAAI,OAAO;AACX,cAAM,YAID,CAAC;AAEN,mBAAW,QAAQ,QAAQ,SAAS;AAClC,kBAAQ,KAAK,MAAM;AAAA,YACjB,KAAK,QAAQ;AACX,sBAAQ,KAAK;AACb;AAAA,YACF;AAAA,YACA,KAAK,aAAa;AAChB,wBAAU,KAAK;AAAA,gBACb,IAAI,KAAK;AAAA,gBACT,MAAM;AAAA,gBACN,UAAU;AAAA,kBACR,MAAM,KAAK;AAAA,kBACX,WAAW,KAAK,UAAU,KAAK,KAAK;AAAA,gBACtC;AAAA,cACF,CAAC;AACD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,YAAY,UAAU,SAAS,IAAI,YAAY;AAAA,QACjD,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AAGX,mBAAW,QAAQ,QAAQ,SAAS;AAClC,cAAI,KAAK,SAAS,eAAe;AAC/B,qBAAS,KAAK;AAAA,cACZ,MAAM;AAAA,cACN,cAAc,KAAK;AAAA,cACnB,SAAS,KAAK,UAAU,KAAK,MAAM;AAAA,YACrC,CAAC;AAAA,UACH;AAAA,QACF;AACA;AAAA,MACF;AAAA,MAEA,SAAS;AACP,cAAM,mBAA0B;AAChC,cAAM,IAAI,MAAM,qBAAqB,gBAAgB,EAAE;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACpKA,SAAS,sCAAsC;AAC/C,SAAS,SAAS;AAMlB,IAAM,mBAAmB,EACtB,OAAO;AAAA;AAAA,EAEN,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAGhC,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAG1B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAG7B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAG9B,OAAO,EACJ,OAAO;AAAA;AAAA,IAEN,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAG7B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAG1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAG3B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC,EACA,SAAS;AAAA;AAAA,EAGZ,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC,EACA,SAAS;AAqBL,IAAM,aAAN,cAAyB,MAAM;AAAA,EAapC,YACE,SAEgB,MAEA,UAChB;AACA,UAAM,OAAO;AAJG;AAEA;AAGhB,SAAK,OAAO;AAEZ,QAAI,MAAM;AACR,WAAK,OAAO,KAAK;AACjB,WAAK,WAAW,KAAK;AACrB,WAAK,YAAY,KAAK;AACtB,WAAK,UAAU,KAAK;AAAA,IACtB;AAAA,EACF;AACF;AAWO,IAAM,6BAAkC,+BAA+B;AAAA,EAC5E,aAAa;AAAA,EACb,gBAAgB,CAAC,SAAyB;AACxC,WACE,MAAM,OAAO,WACb,MAAM,WACN;AAAA,EAEJ;AAAA,EACA,aAAa,CAAC,UAAoB,UAAoB;AACpD,UAAM,SAAS,SAAS;AACxB,WACE,WAAW,OACX,WAAW,OACX,WAAW,OACX,WAAW,OACX,WAAW;AAAA,EAEf;AACF,CAAC;;;AC1HD,SAAS,KAAAA,UAAS;AAElB,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EACnC,IAAIA,GAAE,OAAO;AAAA,EACb,MAAMA,GAAE,QAAQ,UAAU;AAAA,EAC1B,UAAUA,GAAE,OAAO;AAAA,IACjB,MAAMA,GAAE,OAAO;AAAA,IACf,WAAWA,GAAE,OAAO;AAAA,EACtB,CAAC;AACH,CAAC;AAGD,IAAM,yBAAyBA,GAAE,MAAM;AAAA,EACrCA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,MAAM;AAAA,IACtB,MAAMA,GAAE,OAAO;AAAA,EACjB,CAAC;AAAA,EACDA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,WAAW;AAAA,IAC3B,WAAWA,GAAE,OAAO;AAAA,MAClB,KAAKA,GAAE,OAAO;AAAA,MACd,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAGD,IAAM,+BAA+BA,GAAE,OAAO;AAAA,EAC5C,MAAMA,GAAE,KAAK,CAAC,aAAa,QAAQ,UAAU,MAAM,CAAC;AAAA,EACpD,SAASA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,MAAM,sBAAsB,CAAC,CAAC;AAAA,EAC9D,YAAYA,GAAE,MAAM,mBAAmB,EAAE,SAAS;AAAA,EAClD,cAAcA,GAAE,OAAO,EAAE,SAAS;AACpC,CAAC;AAGD,IAAM,qBAAqBA,GAAE,OAAO;AAAA,EAClC,MAAMA,GAAE,KAAK,CAAC,aAAa,QAAQ,UAAU,MAAM,CAAC;AAAA,EACpD,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAYA,GAAE,MAAM,mBAAmB,EAAE,SAAS;AAAA,EAClD,cAAcA,GAAE,OAAO,EAAE,SAAS;AACpC,CAAC;AAED,IAAM,oBAAoBA,GAAE,OAAO;AAAA,EACjC,SAAS;AAAA,EACT,eAAeA,GAAE,OAAO;AAC1B,CAAC;AAED,IAAM,mBAAmBA,GAAE,OAAO;AAAA,EAChC,eAAeA,GAAE,OAAO;AAAA,EACxB,mBAAmBA,GAAE,OAAO;AAAA,EAC5B,cAAcA,GAAE,OAAO;AACzB,CAAC;AAED,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACpC,SAASA,GAAE,MAAM,iBAAiB;AAAA,EAClC,OAAO;AAAA,EACP,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,EACxB,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,oBAAoBA,GAAE,OAAO,EAAE,SAAS;AAC1C,CAAC;AAED,IAAM,8BAA8BA,GAAE,MAAM,4BAA4B;AAEjE,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EAC1C,YAAYA,GAAE,OAAO;AAAA,EACrB,gBAAgBA,GAAE,OAAO;AAAA,IACvB,KAAK;AAAA,IACL,YAAY;AAAA,EACd,CAAC;AAAA,EACD,uBAAuBA,GACpB,OAAO;AAAA,IACN,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,IACxB,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,oBAAoBA,GAAE,OAAO,EAAE,SAAS;AAAA,IACxC,SAASA,GAAE,MAAM,iBAAiB,EAAE,SAAS;AAAA,IAC7C,OAAO,iBAAiB,SAAS;AAAA,EACnC,CAAC,EACA,SAAS;AACd,CAAC;AAGD,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EACvC,OAAOA,GAAE,OAAO;AAAA,IACd,MAAMA,GAAE,KAAK,CAAC,WAAW,CAAC,EAAE,SAAS;AAAA,IACrC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,YAAYA,GAAE,MAAM,mBAAmB,EAAE,SAAS;AAAA,EACpD,CAAC;AAAA,EACD,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAClC,OAAOA,GAAE,OAAO;AAClB,CAAC;AAED,IAAM,6BAA6BA,GAAE,OAAO;AAAA,EAC1C,SAASA,GAAE,MAAM,uBAAuB;AAAA,EACxC,OAAO,iBAAiB,QAAQ;AAAA,EAChC,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,EACxB,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,oBAAoBA,GAAE,OAAO,EAAE,SAAS;AAC1C,CAAC;AAEM,IAAM,4BAA4BA,GAAE,OAAO;AAAA,EAChD,YAAYA,GAAE,OAAO;AAAA,EACrB,gBAAgBA,GAAE,OAAO;AAAA,IACvB,KAAK,2BAA2B,SAAS;AAAA,IACzC,YAAYA,GAAE,MAAM,4BAA4B,EAAE,SAAS;AAAA,EAC7D,CAAC;AAAA,EACD,sBAAsBA,GACnB,OAAO;AAAA,IACN,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,IACxB,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,oBAAoBA,GAAE,OAAO,EAAE,SAAS;AAAA,IACxC,SAASA,GAAE,MAAM,uBAAuB,EAAE,SAAS;AAAA,IACnD,OAAO,iBAAiB,SAAS;AAAA,EACnC,CAAC,EACA,SAAS;AACd,CAAC;;;AHvFM,IAAM,yBAAN,MAAwD;AAAA,EAU7D,YACE,SACA,UACA,QACA;AAbF,SAAS,uBAAuB;AAChC,SAAS,8BAA8B;AACvC,SAAS,oBAAoB;AAE7B,SAAS,4BAA4B;AAUnC,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,YAAY,KAAmB;AAC7B,WAAO,IAAI,aAAa;AAAA,EAC1B;AAAA,EAEA,IAAI,gBAA0C;AAC5C,WAAO;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEQ,QACN,SACA,YAAqB,OACrB;AACA,UAAM,WAAyC,CAAC;AAGhD,UAAM,iBAAiB,QAAQ;AAK/B,UAAM,4BACJ,CAAC,KAAK,QAAQ,WAAW,aAAa,KACtC,CAAC,KAAK,QAAQ,WAAW,SAAS,KAClC,CAAC,KAAK,QAAQ,WAAW,UAAU;AAErC,UAAM,YAAY,CAAC,KAAK,QAAQ,WAAW,UAAU;AAErD,UAAM,mBAAwB;AAAA,MAC5B,UAAU,qBAAqB,QAAQ,MAAM;AAAA,MAC7C,UAAU,CAAC;AAAA,MACX,OAAO,gBACH,IAAI,CAAC,SAAS;AACd,YAAI,KAAK,SAAS,YAAY;AAC5B,cAAI,aAAa,KAAK;AACtB,iBAAO;AAAA,YACL,MAAM,KAAK;AAAA,YACX,UAAU;AAAA,cACR,MAAM,KAAK;AAAA,cACX,aAAa,KAAK;AAAA,cAClB,YAAY,cAAc;AAAA,gBACxB,MAAM;AAAA,gBACN,YAAY,CAAC;AAAA,gBACb,UAAU,CAAC;AAAA,cACb;AAAA,YACF;AAAA,UACF;AAAA,QACF,OAAO;AACL,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN;AAAA,UACF,CAAC;AACD,iBAAO;AAAA,QACT;AAAA,MACF,CAAC,EACA,OAAO,OAAO;AAAA,IACnB;AAIA,QAAI,6BAA6B,CAAC,gBAAgB,QAAQ;AACxD,uBAAiB,kBAAkB;AAAA,QACjC,MAAM;AAAA,QACN,aAAa;AAAA,UACX,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,WAAW,EAAE;AAAA,cAC5C,SAAS,EAAE,MAAM,SAAS;AAAA,YAC5B;AAAA,YACA,UAAU,CAAC,QAAQ,SAAS;AAAA,YAC5B,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO;AAAA,MACX,sBAAsB;AAAA,QACpB,QAAQ;AAAA,QACR,uBAAuB;AAAA,UACrB,mBAAmB;AAAA,YACjB,YAAY,KAAK;AAAA,YACjB,eAAe,KAAK,SAAS,gBAAgB;AAAA,YAC7C,cAAc;AAAA,cACZ,aAAa,KAAK,SAAS,aAAa,eAAe;AAAA,cACvD,YAAY,KAAK,SAAS,aAAa,aAAa;AAAA,cACpD,OAAO,KAAK,SAAS,aAAa;AAAA,cAClC,mBAAmB,KAAK,SAAS,aAAa;AAAA,cAC9C,kBAAkB,KAAK,SAAS,aAAa;AAAA,cAC7C,GAAG,YAAa,KAAK,SAAS,aAAa,KAAK,IAAK;AAAA,YACvD;AAAA,UACF;AAAA,UACA,0BAA0B;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AAAA,EAEA,MAAM,WAAW,SAMd;AACD,UAAM,EAAE,MAAM,SAAS,IAAI,KAAK,QAAQ,OAAO;AAC/C,UAAM,UAAU;AAAA,MACd,KAAK,OAAO,QAAQ;AAAA,MACpB,QAAQ,WAAW,CAAC;AAAA,IACtB;AAEA,UAAM,EAAE,OAAO,SAAS,IAAI,MAAM,cAEhC;AAAA,MACA,KAAK,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,MAAM;AAAA,MACN,uBAAuB;AAAA,MACvB,2BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,MACnB,aAAa,QAAQ;AAAA,IACvB,CAAC;AAED,UAAM,cAAc,SAAS,eAAe,IAAI,QAAQ,CAAC;AACzD,UAAM,QAAQ,SAAS,eAAe,IAAI;AAE1C,UAAM,UAAoC,CAAC;AAE3C,QAAI,YAAY,QAAQ,SAAS;AAC/B,UAAI;AACJ,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,YAAY,QAAQ,OAAO;AACrD,eAAO,OAAO,WAAW,YAAY,QAAQ;AAAA,MAC/C,QAAQ;AACN,eAAO,YAAY,QAAQ;AAAA,MAC7B;AAEA,UAAI,MAAM;AACR,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,YAAY,QAAQ,YAAY;AAClC,iBAAW,YAAY,YAAY,QAAQ,YAAY;AACrD,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,YAAY,SAAS;AAAA,UACrB,UAAU,SAAS,SAAS;AAAA,UAC5B,OAAO,SAAS,SAAS;AAAA,QAC3B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,cAAc,YAAY;AAAA,MAC1B,OAAO;AAAA,QACL,aAAa,MAAM;AAAA,QACnB,cAAc,MAAM;AAAA,QACpB,aAAa,MAAM;AAAA,MACrB;AAAA,MACA,SAAS;AAAA,QACP,WAAW;AAAA,QACX,aAAa,CAAC;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAGZ;AACD,UAAM,EAAE,MAAM,SAAS,IAAI,KAAK,QAAQ,SAAS,IAAI;AACrD,UAAM,OAAO;AAEb,UAAM,EAAE,iBAAiB,OAAO,SAAS,IAAI,MAAM,cAAc;AAAA,MAC/D,KAAK,KAAK,OAAO;AAAA,MACjB,SAAS,eAAe,KAAK,OAAO,QAAQ,GAAG,QAAQ,OAAO;AAAA,MAC9D;AAAA,MACA,uBAAuB;AAAA,MACvB,2BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,QAAI,eAA4C;AAChD,UAAM,QAA8B;AAAA,MAClC,aAAa;AAAA,MACb,cAAc;AAAA,MACd,aAAa;AAAA,IACf;AAEA,QAAI,eAAe;AACnB,QAAI,aAAa;AAEjB,WAAO;AAAA,MACL,QAAQ,SAAS;AAAA,QACf,IAAI,gBAGF;AAAA,UACA,MAAM,YAAY;AAChB,uBAAW,QAAQ,EAAE,MAAM,gBAAgB,SAAS,CAAC;AAAA,UACvD;AAAA,UAEA,UAAU,OAAO,YAAY;AAC3B,gBAAI,CAAC,MAAM,SAAS;AAClB,yBAAW,QAAQ,EAAE,MAAM,SAAS,OAAO,MAAM,MAAM,CAAC;AACxD;AAAA,YACF;AAEA,kBAAM,QAAQ,MAAM;AAGpB,kBAAM,YAAY,MAAM,eAAe;AACvC,gBAAI,CAAC,WAAW;AACd;AAAA,YACF;AAEA,gBAAI,cAAc;AAChB,6BAAe;AAEf,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI,UAAU,MAAM;AAAA,gBACpB,SAAS,UAAU,SAAS;AAAA,gBAC5B,WAAW,UAAU,UACjB,IAAI,KAAK,UAAU,UAAU,GAAI,IACjC;AAAA,cACN,CAAC;AAAA,YACH;AAEA,gBAAI,UAAU,SAAS,MAAM;AAC3B,oBAAM,cAAc,UAAU,MAAM;AACpC,oBAAM,eAAe,UAAU,MAAM;AACrC,oBAAM,cAAc,UAAU,MAAM;AAAA,YACtC;AAEA,kBAAM,SAAS,UAAU,QAAQ,CAAC;AAClC,kBAAM,QAAQ,OAAO;AAGrB,gBAAI,MAAM,WAAW,QAAQ,MAAM,QAAQ,SAAS,GAAG;AAErD,kBAAI;AACJ,kBAAI;AACF,sBAAM,SAAS,KAAK,MAAM,MAAM,OAAO;AACvC,8BAAc,OAAO,WAAW,MAAM;AAAA,cACxC,QAAQ;AACN,8BAAc,MAAM;AAAA,cACtB;AAEA,kBAAI,CAAC,YAAY;AACf,2BAAW,QAAQ,EAAE,MAAM,cAAc,IAAI,IAAI,CAAC;AAClD,6BAAa;AAAA,cACf;AAEA,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,OAAO;AAAA,cACT,CAAC;AAAA,YACH;AAGA,gBAAI,MAAM,cAAc,MAAM;AAC5B,yBAAW,YAAY,MAAM,YAAY;AACvC,sBAAM,aAAa,SAAS;AAC5B,sBAAM,WAAW,SAAS,SAAS;AACnC,sBAAM,QAAQ,SAAS,SAAS;AAEhC,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN,IAAI;AAAA,kBACJ;AAAA,gBACF,CAAC;AAED,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN,IAAI;AAAA,kBACJ,OAAO;AAAA,gBACT,CAAC;AAED,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN,IAAI;AAAA,gBACN,CAAC;AAED,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN;AAAA,kBACA;AAAA,kBACA;AAAA,gBACF,CAAC;AAAA,cACH;AAAA,YACF;AAEA,gBAAI,OAAO,iBAAiB,MAAM;AAChC,6BACE,OAAO;AAAA,YACX;AAAA,UACF;AAAA,UAEA,MAAM,YAAY;AAChB,gBAAI,YAAY;AACd,yBAAW,QAAQ,EAAE,MAAM,YAAY,IAAI,IAAI,CAAC;AAAA,YAClD;AAEA,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,SAAS,EAAE,WAAW,MAAM,aAAa,CAAC,EAAE;AAAA,IAC9C;AAAA,EACF;AACF;;;ADrUA,eAAe,cACb,YACA,aACiB;AACjB,QAAM,UAAU,eAAe;AAC/B,QAAM,WAAW,GAAG,WAAW,GAAG;AAClC,QAAM,cAAc,OAAO;AAAA,IACzB,GAAG,WAAW,QAAQ,IAAI,WAAW,YAAY;AAAA,EACnD,EAAE,SAAS,QAAQ;AAEnB,QAAM,WAAW,MAAM,QAAQ,UAAU;AAAA,IACvC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,SAAS,WAAW;AAAA,IACrC;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK;AACtC,UAAM,IAAI;AAAA,MACR,qCAAqC,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,EAAK,SAAS;AAAA,IAC3F;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,SAAS,KAAK;AACtC,SAAO,UAAU;AACnB;AAmBA,eAAsB,oBACpB,UAAiC,CAAC,GACV;AACxB,MAAI;AACJ,MAAI;AAGJ,MAAI;AACJ,MAAI,QAAQ,YAAY;AACtB,QAAI,OAAO,QAAQ,eAAe,UAAU;AAC1C,UAAI;AACF,2BAAmB,KAAK,MAAM,QAAQ,UAAU;AAAA,MAClD,SAAS,OAAO;AACd,cAAM,IAAI,MAAM,iCAAiC;AAAA,MACnD;AAAA,IACF,OAAO;AACL,yBAAmB,QAAQ;AAAA,IAC7B;AAAA,EACF;AAGA,MAAI,kBAAkB;AACpB,cACE,qBAAqB,QAAQ,OAAO,KACpC,GAAG,iBAAiB,YAAY,UAAU;AAAA,EAC9C,OAAO;AACL,cACE,qBAAqB,QAAQ,OAAO,KACpC;AAAA,EACJ;AAGA,MAAI,QAAQ,OAAO;AACjB,gBAAY,QAAQ;AAAA,EACtB,WAAW,kBAAkB;AAE3B,gBAAY,MAAM,cAAc,kBAAkB,QAAQ,KAAK;AAAA,EACjE,OAAO;AAEL,gBAAY,WAAW;AAAA,MACrB,QAAQ;AAAA,MACR,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,gBAAgB,QAAQ,iBAAiB;AAG/C,QAAM,cAAc,CAAC,SAAuB,WAA0B,CAAC,MAAM;AAC3E,WAAO,IAAI,uBAAuB,SAAS,UAAU;AAAA,MACnD,UAAU;AAAA,MACV,SAAS,GAAG,OAAO,0BAA0B,YAAY;AAAA,MACzD,SAAS,OAAO;AAAA,QACd,eAAe,UAAU,SAAS;AAAA,QAClC,gBAAgB;AAAA,QAChB,qBAAqB;AAAA,QACrB,GAAG,QAAQ;AAAA,MACb;AAAA,MACA,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH;AAGA,QAAM,WAAW,SAAU,SAAuB,UAA0B;AAC1E,QAAI,YAAY;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO,YAAY,SAAS,QAAQ;AAAA,EACtC;AAEA,WAAS,OAAO;AAEhB,SAAO;AACT;AAMO,SAAS,wBACd,SACe;AACf,QAAM,UACJ,qBAAqB,QAAQ,OAAO,KACpC;AAEF,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,gBAAgB,QAAQ,iBAAiB;AAE/C,QAAM,cAAc,CAAC,SAAuB,WAA0B,CAAC,MAAM;AAC3E,WAAO,IAAI,uBAAuB,SAAS,UAAU;AAAA,MACnD,UAAU;AAAA,MACV,SAAS,GAAG,OAAO,0BAA0B,YAAY;AAAA,MACzD,SAAS,OAAO;AAAA,QACd,eAAe,UAAU,QAAQ,KAAK;AAAA,QACtC,gBAAgB;AAAA,QAChB,qBAAqB;AAAA,QACrB,GAAG,QAAQ;AAAA,MACb;AAAA,MACA,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,SAAU,SAAuB,UAA0B;AAC1E,QAAI,YAAY;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO,YAAY,SAAS,QAAQ;AAAA,EACtC;AAEA,WAAS,OAAO;AAEhB,SAAO;AACT;AAMA,SAAS,qBAAoC;AAC3C,QAAM,cAAc,CAAC,SAAuB,aAA6B;AACvE,UAAM,QAAQ,QAAQ,IAAI;AAC1B,QAAI,CAAC,OAAO;AACV,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AAEA,UAAMC,YAAW,wBAAwB,EAAE,MAAM,CAAC;AAClD,WAAOA,UAAS,SAAS,QAAQ;AAAA,EACnC;AAEA,QAAM,WAAW,SAAU,SAAuB,UAA0B;AAC1E,WAAO,YAAY,SAAS,QAAQ;AAAA,EACtC;AAEA,WAAS,OAAO;AAEhB,SAAO;AACT;AAEO,IAAM,QAAQ,mBAAmB;","names":["z","provider"]}