{"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":"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","names":["z","provider"]}