{"version":3,"sources":["../src/logger/index.ts","../src/logger/transports/console.ts","../src/providers/anthropic/index.ts","../src/providers/google/index.ts","../src/providers/openai/index.ts","../src/index.ts"],"names":["ProviderLogger","prefix","severity","logLevel","message","transport","level","timestamp","consoleTransport","log","Anthropic","AnthropicProvider","opts","apiKey","result","stream","content","transformedResponse","toolUseBlocks","block","resultTextBlocks","tool_calls","choice","params","tools","systemMessages","messages","system","tool","response","finalChatCompletion","event","anthropicParams","messageStream","error","DynamicRetrievalMode","FunctionCallingMode","GoogleGenerativeAI","GoogleGenerativeAIError","GoogleAICacheManager","GoogleProvider","cacheName","contents","schema","additionalProperties","_additionalProperties","rest","acc","key","value","additionalProps","modelConfig","sessionId","generationConfig","history","generativeModel","cache","chatParams","functionDeclarations","toolChoice","chatSession","responseDataChunk","responseText","toolCalls","part","groundingMetadata","contentWithGrounding","sources","chunk","support","sourceTitles","index","avgConfidence","a","source","responseDataBase","lastMessage","transformedResult","err","OpenAI","OpenAIProvider","LLMClient","proxyHandler","target","prop","receiver","createLLMClient"],"mappings":"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","sourcesContent":["import type { LogLevel, LogTransport } from \"@/types\"\n\nexport default class ProviderLogger {\n  private _transports: LogTransport[] = []\n  private _prefix: string\n  private _severity: LogLevel\n\n  constructor(prefix?: string, severity: LogLevel = \"info\") {\n    this._prefix = prefix ?? \"\"\n    this._severity = severity\n  }\n\n  public log(logLevel: LogLevel, message: string | Error) {\n    switch (logLevel) {\n      case \"debug\":\n        if (this._severity === \"debug\") {\n          this._logToTransports(\"debug\", this._prefix, message)\n        }\n        break\n      case \"info\":\n        if (this._severity === \"debug\" || this._severity === \"info\") {\n          this._logToTransports(\"info\", this._prefix, message)\n        }\n        break\n      case \"warn\":\n        if (this._severity === \"debug\" || this._severity === \"info\" || this._severity === \"warn\") {\n          this._logToTransports(\"warn\", this._prefix, message)\n        }\n        break\n      case \"error\":\n        this._logToTransports(\"error\", this._prefix, message)\n        break\n    }\n  }\n\n  public debug(message: string) {\n    this._logToTransports(\"debug\", this._prefix, message)\n  }\n\n  public info(message: string) {\n    this._logToTransports(\"info\", this._prefix, message)\n  }\n\n  public warn(message: string) {\n    this._logToTransports(\"warn\", this._prefix, message)\n  }\n\n  public error(message: string | Error) {\n    this._logToTransports(\"error\", this._prefix, message)\n  }\n\n  public addTransport(transport: LogTransport) {\n    this._transports.push(transport)\n\n    return () => {\n      this._transports.splice(this._transports.indexOf(transport), 1)\n    }\n  }\n\n  private _logToTransports(level: LogLevel, prefix: string, message: string | Error) {\n    const timestamp = new Date().toTimeString().split(\" \")[0]\n\n    for (const transport of this._transports) {\n      transport(level, message, timestamp, prefix)\n    }\n  }\n}\n","import { LogTransport } from \"@/types\"\n\nexport const consoleTransport: LogTransport = (level, message, timestamp, prefix) => {\n  const log = {\n    [\"debug\"]: console.debug,\n    [\"info\"]: console.info,\n    [\"warn\"]: console.warn,\n    [\"error\"]: console.error\n  }[level]\n\n  log(`LLM-CLIENT--${prefix} ${timestamp}: ${message}`)\n}\n","import ProviderLogger from \"@/logger\"\nimport { consoleTransport } from \"@/logger/transports/console\"\nimport {\n  AnthropicChatCompletionParams,\n  AnthropicChatCompletionParamsNonStream,\n  AnthropicChatCompletionParamsStream,\n  ExtendedCompletionAnthropic,\n  ExtendedCompletionChunkAnthropic,\n  LogLevel,\n  OpenAILikeClient\n} from \"@/types\"\nimport Anthropic from \"@anthropic-ai/sdk\"\nimport OpenAI, { ClientOptions } from \"openai\"\n\n/**\n * AnthropicProvider is a class that provides an interface for interacting with the Anthropic API.\n * It implements the OpenAILikeClient interface and allows users to create chat completions using\n * the Anthropic API.\n */\nexport class AnthropicProvider extends Anthropic implements OpenAILikeClient<\"anthropic\"> {\n  public apiKey: string\n  public logLevel: LogLevel = (process.env?.[\"LOG_LEVEL\"] as LogLevel) ?? \"info\"\n  private logger: ProviderLogger\n\n  /**\n   * Constructs a new instance of the AnthropicProvider class.\n   * @param opts - An optional ClientOptions object containing the API key.\n   */\n  constructor(\n    opts?: ClientOptions & {\n      logLevel?: LogLevel\n    }\n  ) {\n    const apiKey = opts?.apiKey ?? process.env?.[\"ANTHROPIC_API_KEY\"] ?? null\n\n    if (!apiKey) {\n      throw new Error(\n        \"API key is required for AnthropicProvider - please provide it in the constructor or set it as an environment variable named ANTHROPIC_API_KEY.\"\n      )\n    }\n\n    super({ apiKey })\n\n    this.logLevel = opts?.logLevel ?? this.logLevel\n    this.apiKey = apiKey\n    this.logger = new ProviderLogger(\"GEMINI-CLIENT\")\n    this.logger.addTransport(consoleTransport)\n  }\n  [key: string]: unknown\n\n  /**\n   * Transforms the Anthropic API response into an ExtendedCompletionAnthropic or ExtendedCompletionChunkAnthropic object.\n   * @param result - The Anthropic API response.\n   * @param stream - An optional parameter indicating whether the response is a stream.\n   * @returns A Promise that resolves to an ExtendedCompletionAnthropic or ExtendedCompletionChunkAnthropic object.\n   */\n  private async transformResponse(\n    result: Anthropic.Messages.Message,\n    { stream }: { stream?: boolean } = {}\n  ): Promise<ExtendedCompletionAnthropic | ExtendedCompletionChunkAnthropic> {\n    if (!result.id) throw new Error(\"Response id is undefined\")\n    this.logger.log(\"debug\", `Response: ${result}`)\n\n    result.content.forEach(content => {\n      content.type === \"tool_use\"\n        ? this.logger.log(\"debug\", `JSON Summary: ${JSON.stringify(content.input, null, 2)}`)\n        : this.logger.log(\n            \"debug\",\n            `No JSON summary found in the response. \n            ${JSON.stringify(content, null, 2)}`\n          )\n    })\n\n    const transformedResponse = {\n      id: result.id,\n      originResponse: result,\n      model: result.model,\n      usage: {\n        prompt_tokens: result.usage.input_tokens,\n        completion_tokens: result.usage.output_tokens,\n        total_tokens: result.usage.input_tokens + result.usage.output_tokens\n      }\n    }\n\n    if (!stream) {\n      const toolUseBlocks = result.content.filter(\n        block => block.type === \"tool_use\"\n      ) as Anthropic.ToolUseBlock[]\n\n      const resultTextBlocks = result.content.filter(\n        block => block.type === \"text\"\n      ) as Anthropic.TextBlock[]\n\n      const tool_calls = toolUseBlocks.map(block => ({\n        id: block.id,\n        type: \"function\",\n        function: {\n          name: block.name,\n          arguments: JSON.stringify(block.input)\n        }\n      }))\n\n      const content = resultTextBlocks.map(choice => choice.text).join(\"\")\n\n      return {\n        ...transformedResponse,\n        object: \"chat.completion\",\n        choices: [\n          {\n            message: {\n              role: \"assistant\",\n              content,\n              ...(tool_calls?.length ? { tool_calls } : {})\n            },\n            finish_reason: tool_calls?.length ? \"tool_calls\" : \"stop\",\n            index: 0,\n            logprobs: null\n          } as OpenAI.ChatCompletion.Choice\n        ]\n      }\n    }\n\n    return transformedResponse\n  }\n\n  /**\n   * Transforms the OpenAI chat completion parameters into Anthropic chat completion parameters.\n   * @param params - The OpenAI chat completion parameters.\n   * @returns The transformed Anthropic chat completion parameters.\n   */\n  private transformParamsRegular(\n    params: AnthropicChatCompletionParams\n  ): Anthropic.Messages.MessageCreateParams {\n    let tools: Anthropic.Tool[] = []\n\n    const systemMessages = params.messages.filter(message => message.role === \"system\")\n\n    const messages = params.messages.filter(\n      message => message.role === \"user\" || message.role === \"assistant\"\n    ) as Anthropic.MessageParam[]\n\n    const system = systemMessages?.length\n      ? systemMessages.map(message => message.content).join(\"\\n\")\n      : \"\"\n\n    if (systemMessages.length) {\n      console.warn(\n        \"Anthropic does not support system messages - concatenating them all into a single 'system' property.\"\n      )\n    }\n\n    if (!params.max_tokens) {\n      throw new Error(\"max_tokens is required\")\n    }\n\n    if (\"tools\" in params && Array.isArray(params.tools) && params.tools.length > 0) {\n      tools = params.tools.map(tool => ({\n        name: tool.function.name ?? \"\",\n        description: tool.function.description ?? \"\",\n        input_schema: {\n          type: \"object\",\n          ...tool.function.parameters\n        }\n      }))\n    }\n\n    return {\n      model: params.model,\n      tools,\n      system: system?.length ? system : undefined,\n      messages,\n      max_tokens: params.max_tokens,\n      stop_sequences: params.stop\n        ? Array.isArray(params.stop)\n          ? params.stop\n          : [params.stop]\n        : undefined,\n      temperature: params.temperature ?? undefined,\n      top_p: params.top_p ?? undefined,\n      top_k: params.n ?? undefined,\n      stream: params?.stream ?? false,\n      tool_choice:\n        \"tool_choice\" in params &&\n        typeof params.tool_choice === \"object\" &&\n        \"function\" in params.tool_choice\n          ? {\n              type: \"tool\",\n              name: params.tool_choice.function.name\n            }\n          : undefined\n    }\n  }\n\n  /**\n   * Streams the chat completion response from the Anthropic API.\n   * @param response - The Response object from the Anthropic API.\n   * @returns An asynchronous iterable of ExtendedCompletionChunkAnthropic objects.\n   */\n  private async *streamChatCompletion(\n    response: AsyncIterable<Anthropic.MessageStreamEvent>\n  ): AsyncIterable<ExtendedCompletionChunkAnthropic> {\n    let finalChatCompletion: ExtendedCompletionChunkAnthropic | null = null\n\n    for await (const event of response) {\n      switch (event.type) {\n        case \"message_start\":\n          this.logger.log(\"debug\", `Message start: ${event}`)\n          finalChatCompletion = {\n            id: event.message.id,\n            object: \"chat.completion.chunk\",\n            created: Date.now(),\n            model: event.message.model,\n            choices: [\n              {\n                index: 0,\n                delta: { role: \"assistant\" },\n                finish_reason: null\n              }\n            ],\n            usage: {\n              prompt_tokens: event.message.usage.input_tokens,\n              completion_tokens: 0,\n              total_tokens: event.message.usage.input_tokens\n            },\n            originResponse: event.message\n          }\n\n          yield finalChatCompletion\n          break\n\n        case \"content_block_start\":\n          this.logger.log(\"debug\", `Content block start: ${event}`)\n          break\n\n        case \"content_block_delta\":\n          if (finalChatCompletion && finalChatCompletion.choices) {\n            if (event.delta.type === \"text_delta\") {\n              finalChatCompletion.choices[0].delta = {\n                content: event.delta.text,\n                role: \"assistant\"\n              }\n            } else if (event.delta.type === \"input_json_delta\") {\n              finalChatCompletion.choices[0].delta = {\n                content: event.delta.partial_json,\n                role: \"assistant\"\n              }\n            }\n\n            yield finalChatCompletion\n          }\n          break\n\n        case \"content_block_stop\":\n          this.logger.log(\"debug\", `Content block stop: ${event}`)\n          break\n\n        case \"message_delta\":\n          if (finalChatCompletion && finalChatCompletion.usage) {\n            finalChatCompletion.usage.completion_tokens = event.usage?.output_tokens || 0\n            finalChatCompletion.usage.total_tokens =\n              finalChatCompletion.usage.prompt_tokens + finalChatCompletion.usage.completion_tokens\n          }\n          break\n\n        case \"message_stop\":\n          this.logger.log(\"debug\", `Message stop: ${event}`)\n          if (finalChatCompletion && finalChatCompletion.choices) {\n            finalChatCompletion.choices[0].finish_reason = \"stop\"\n            finalChatCompletion.choices[0].delta = {\n              content: null,\n              role: \"assistant\"\n            }\n            yield finalChatCompletion\n          }\n          break\n\n        default:\n          this.logger.log(\"warn\", `Unknown event type: ${event}`)\n      }\n    }\n  }\n  /**\n   * Creates a chat completion using the Anthropic API.\n   * @param params - The chat completion parameters.\n   * @returns A Promise that resolves to an ExtendedCompletionAnthropic object or an asynchronous iterable of ExtendedCompletionChunkAnthropic objects if streaming is enabled.\n   */\n  public async create(\n    params: AnthropicChatCompletionParamsStream\n  ): Promise<AsyncIterable<ExtendedCompletionChunkAnthropic>>\n\n  public async create(\n    params: AnthropicChatCompletionParamsNonStream\n  ): Promise<ExtendedCompletionAnthropic>\n\n  public async create(\n    params: AnthropicChatCompletionParams\n  ): Promise<AsyncIterable<ExtendedCompletionChunkAnthropic> | ExtendedCompletionAnthropic> {\n    try {\n      const anthropicParams = this.transformParamsRegular(params)\n\n      if (params.stream) {\n        this.logger.log(\"debug\", \"Starting streaming completion response\")\n\n        const messageStream = await this.messages.stream({\n          ...anthropicParams\n        })\n\n        return this.streamChatCompletion(messageStream)\n      } else {\n        const result = await this.messages.create({\n          ...anthropicParams,\n          stream: false\n        })\n\n        const transformedResult = await this.transformResponse(result)\n\n        return transformedResult as ExtendedCompletionAnthropic\n      }\n    } catch (error) {\n      this.logger.error(new Error(\"Error in Anthropic API request:\", { cause: error }))\n      throw error\n    }\n  }\n\n  public chat = {\n    completions: {\n      create: this.create.bind(this)\n    }\n  }\n}\n","import ProviderLogger from \"@/logger\"\nimport { consoleTransport } from \"@/logger/transports/console\"\nimport {\n  ExtendedCompletionChunkGoogle,\n  ExtendedCompletionGoogle,\n  GoogleCacheCreateParams,\n  GoogleChatCompletionParams,\n  GoogleChatCompletionParamsNonStream,\n  GoogleChatCompletionParamsStream,\n  LogLevel,\n  OpenAILikeClient\n} from \"@/types\"\nimport {\n  ChatSession,\n  Content,\n  DynamicRetrievalMode,\n  EnhancedGenerateContentResponse,\n  FunctionCallingMode,\n  FunctionDeclaration,\n  GenerationConfig,\n  GoogleGenerativeAI,\n  GoogleGenerativeAIError,\n  GroundingMetadata,\n  SafetySetting,\n  StartChatParams,\n  Tool,\n  ToolConfig\n} from \"@google/generative-ai\"\nimport { CachedContentUpdateParams, GoogleAICacheManager } from \"@google/generative-ai/server\"\nimport { ClientOptions } from \"openai\"\n\ninterface ExtendedAdditionalProperties {\n  cacheName?: string\n  sessionId?: string\n  safetySettings?: SafetySetting[]\n  modelGenerationConfig?: GenerationConfig\n}\n\ninterface ModelConfig {\n  model: string\n  safetySettings?: SafetySetting[]\n  generationConfig?: GenerationConfig\n  tools?: Tool[]\n  systemInstruction?: string | Content | undefined\n}\ninterface GroundingMetadataExtended extends GroundingMetadata {\n  webSearchQueries: string[]\n  groundingChunks?: Array<{\n    web?: {\n      uri: string\n      title: string\n    }\n  }>\n  searchEntryPoint?: {\n    renderedContent: string\n  }\n  groundingSupports?: Array<{\n    segment: {\n      startIndex?: number\n      endIndex?: number\n      text: string\n    }\n    groundingChunkIndices: number[]\n    confidenceScores: number[]\n  }>\n}\n\ninterface ExtendedChoice {\n  index: number\n  message: {\n    role: string\n    content: string\n    tool_calls?: Array<{\n      index: number\n      id: string\n      function: {\n        name: string\n        arguments: string\n      }\n      type: string\n    }>\n  }\n  finish_reason: string | null\n  logprobs?: null\n  grounding_metadata?: {\n    search_queries: string[]\n    sources: Array<{\n      url: string\n      title: string\n    }>\n    search_suggestion_html: string | undefined\n  }\n}\n\nexport class GoogleProvider extends GoogleGenerativeAI implements OpenAILikeClient<\"google\"> {\n  public apiKey: string\n  public logLevel: LogLevel = (process.env?.[\"LOG_LEVEL\"] as LogLevel) ?? \"info\"\n  private googleCacheManager\n  private logger: ProviderLogger\n  private activeChatSessions: Map<string, ChatSession> = new Map()\n\n  constructor(\n    opts?: ClientOptions & {\n      logLevel?: LogLevel\n      groundingThreshold?: number\n    }\n  ) {\n    const apiKey = opts?.apiKey ?? process.env?.[\"GEMINI_API_KEY\"] ?? null\n\n    if (!apiKey) {\n      throw new Error(\n        \"API key is required for GeminiProvider - please provide it in the constructor or set it as an environment variable named GEMINI_API_KEY.\"\n      )\n    }\n\n    super(apiKey)\n\n    this.logLevel = opts?.logLevel ?? this.logLevel\n    this.apiKey = apiKey\n    this.googleCacheManager = new GoogleAICacheManager(apiKey)\n    this.logger = new ProviderLogger(\"GEMINI-CLIENT\")\n    this.logger.addTransport(consoleTransport)\n  }\n\n  private cleanSchema(schema: Record<string, unknown>): Record<string, unknown> {\n    const { additionalProperties, _additionalProperties, ...rest } = schema\n\n    this.logger.log(\n      this.logLevel,\n      `Removing unsupported 'additionalProperties' from schema - ${JSON.stringify(\n        additionalProperties ?? {}\n      )}`\n    )\n\n    if (rest[\"properties\"] && typeof rest[\"properties\"] === \"object\") {\n      rest[\"properties\"] = Object.entries(rest[\"properties\"]).reduce(\n        (acc, [key, value]) => {\n          acc[key] = typeof value === \"object\" && value !== null ? this.cleanSchema(value) : value\n          return acc\n        },\n        {} as Record<string, unknown>\n      )\n    }\n\n    if (rest[\"items\"] && typeof rest[\"items\"] === \"object\" && rest[\"items\"] !== null) {\n      rest[\"items\"] = this.cleanSchema(rest[\"items\"] as Record<string, unknown>)\n    }\n\n    return rest\n  }\n\n  /**\n   * Creates a generation config from the provided parameters\n   */\n  private createGenerationConfig(params: GoogleChatCompletionParams): GenerationConfig {\n    return {\n      temperature: params.temperature ?? undefined,\n      topP: params.top_p ?? undefined,\n      topK: params.n ?? undefined,\n      maxOutputTokens: params.max_tokens ?? undefined,\n      stopSequences: params.stop\n        ? Array.isArray(params.stop)\n          ? params.stop\n          : [params.stop]\n        : undefined,\n      candidateCount: params.n ?? undefined\n    }\n  }\n\n  /**\n   * Transforms messages into Google's chat history format\n   */\n  private transformHistory(messages: GoogleChatCompletionParams[\"messages\"]): Content[] {\n    return messages.map(message => ({\n      role: message.role === \"assistant\" ? \"model\" : \"user\",\n      parts: [{ text: message.content.toString() }]\n    }))\n  }\n\n  private getModelConfig(params: GoogleChatCompletionParams) {\n    const additionalProps = params.additionalProperties as ExtendedAdditionalProperties | undefined\n\n    const modelConfig: ModelConfig = {\n      model: params?.model,\n      safetySettings: additionalProps?.safetySettings,\n      generationConfig: additionalProps?.modelGenerationConfig\n    }\n\n    if (params.groundingThreshold !== undefined) {\n      modelConfig.tools = [\n        {\n          googleSearchRetrieval: {\n            dynamicRetrievalConfig: {\n              mode: DynamicRetrievalMode.MODE_DYNAMIC,\n              dynamicThreshold: params.groundingThreshold\n            }\n          }\n        }\n      ]\n    }\n\n    if (params.systemInstruction) {\n      modelConfig.systemInstruction = params.systemInstruction\n    }\n\n    return modelConfig\n  }\n\n  /**\n   * Gets or creates a chat session\n   */\n  private async getChatSession(params: GoogleChatCompletionParams): Promise<ChatSession> {\n    const additionalProps = params.additionalProperties as ExtendedAdditionalProperties | undefined\n    const sessionId = additionalProps?.sessionId\n\n    if (sessionId && this.activeChatSessions.has(sessionId)) {\n      return this.activeChatSessions.get(sessionId)!\n    }\n\n    const generationConfig = this.createGenerationConfig(params)\n    const history = this.transformHistory(params.messages)\n\n    let generativeModel\n\n    if (additionalProps?.cacheName) {\n      const cache = await this.googleCacheManager.get(additionalProps.cacheName)\n      generativeModel = this.getGenerativeModelFromCachedContent(cache)\n    } else {\n      generativeModel = this.getGenerativeModel(this.getModelConfig(params))\n    }\n\n    const chatParams: StartChatParams = {\n      generationConfig,\n      history\n    }\n\n    if (params.tools?.length) {\n      const functionDeclarations = params.tools.map(tool => ({\n        name: tool.function.name ?? \"\",\n        description: tool.function.description ?? \"\",\n        parameters: {\n          type: \"object\",\n          ...(tool.function.parameters ? this.cleanSchema(tool.function.parameters) : {})\n        }\n      })) as FunctionDeclaration[]\n\n      const toolChoice = params.tool_choice as\n        | { type: \"function\"; function: { name: string } }\n        | undefined\n\n      chatParams.tools = [\n        {\n          functionDeclarations\n        }\n      ] as Tool[]\n\n      if (toolChoice?.type === \"function\") {\n        chatParams.toolConfig = {\n          functionCallingConfig: {\n            mode: FunctionCallingMode.ANY,\n            allowedFunctionNames: [toolChoice.function.name]\n          }\n        } satisfies ToolConfig\n      }\n    }\n\n    const chatSession = generativeModel.startChat(chatParams)\n\n    if (sessionId) {\n      this.activeChatSessions.set(sessionId, chatSession)\n    }\n\n    return chatSession\n  }\n\n  /**\n   * Transforms the Google API response into an ExtendedCompletionGoogle or ExtendedCompletionChunkGoogle object.\n   */\n  private transformResponse(\n    responseDataChunk: EnhancedGenerateContentResponse,\n    params: GoogleChatCompletionParams\n  ): ExtendedCompletionGoogle | ExtendedCompletionChunkGoogle {\n    const responseText = responseDataChunk.text()\n    const toolCalls =\n      responseDataChunk.candidates?.[0]?.content?.parts?.flatMap(part =>\n        part.functionCall\n          ? [\n              {\n                index: 0,\n                id: `call_${Math.random().toString(36).slice(2)}`,\n                function: {\n                  name: part.functionCall.name,\n                  arguments: JSON.stringify(part.functionCall.args)\n                },\n                type: \"function\"\n              }\n            ]\n          : []\n      ) ?? []\n\n    const groundingMetadata = responseDataChunk.candidates?.[0]?.groundingMetadata as\n      | GroundingMetadataExtended\n      | undefined\n\n    let contentWithGrounding = responseText\n    let sources: Array<{ url: string; title: string }> = []\n\n    if (groundingMetadata) {\n      sources =\n        groundingMetadata.groundingChunks?.map(chunk => ({\n          url: chunk.web?.uri ?? \"\",\n          title: chunk.web?.title ?? \"\"\n        })) ?? []\n\n      if (groundingMetadata.groundingSupports?.length) {\n        contentWithGrounding += \"\\n\\n**Grounded Segments**\\n\"\n        groundingMetadata.groundingSupports.forEach(support => {\n          const sourceIndices = support.groundingChunkIndices\n          const sourceTitles = sourceIndices\n            .map(index => sources[index]?.title)\n            .filter(Boolean)\n            .join(\", \")\n          const avgConfidence =\n            support.confidenceScores.reduce((a, b) => a + b, 0) / support.confidenceScores.length\n          contentWithGrounding += `> \"${support.segment.text}\"\\n`\n          contentWithGrounding += `> Sources: ${sourceTitles} (Confidence: ${(avgConfidence * 100).toFixed(1)}%)\\n\\n`\n        })\n      }\n\n      if (sources.length > 0) {\n        contentWithGrounding += \"\\n**Grounding Sources**\\n\"\n        sources.forEach(source => {\n          contentWithGrounding += `- [${source.title}](${source.url})\\n`\n        })\n      }\n    }\n\n    const responseDataBase = {\n      id: `chatcmpl-${Math.random().toString(36).slice(2)}`,\n      object: params.stream ? \"chat.completion.chunk\" : \"chat.completion\",\n      created: Date.now(),\n      model: params.model,\n      system_fingerprint: undefined,\n      originResponse: responseDataChunk,\n      choices: [\n        {\n          index: 0,\n          message: {\n            role: \"assistant\",\n            content: toolCalls.length ? \"\" : contentWithGrounding,\n            ...(toolCalls.length ? { tool_calls: toolCalls } : {})\n          },\n          ...(groundingMetadata\n            ? {\n                grounding_metadata: {\n                  search_queries: groundingMetadata.webSearchQueries,\n                  sources: sources,\n                  search_suggestion_html: groundingMetadata.searchEntryPoint?.renderedContent,\n                  supports: groundingMetadata.groundingSupports?.map(support => ({\n                    text: support.segment.text,\n                    sources: support.groundingChunkIndices.map(index => sources[index]),\n                    confidence: support.confidenceScores\n                  }))\n                }\n              }\n            : {}),\n          finish_reason: responseDataChunk.candidates?.[0]?.finishReason?.toLowerCase() ?? null,\n          logprobs: null\n        } as ExtendedChoice\n      ]\n    }\n\n    if (params.stream) {\n      return {\n        ...responseDataBase,\n        choices: [\n          {\n            ...responseDataBase.choices[0],\n            delta: responseDataBase.choices[0].message\n          }\n        ]\n      } as ExtendedCompletionChunkGoogle\n    }\n\n    return responseDataBase as ExtendedCompletionGoogle\n  }\n\n  /**\n   * Streams the chat completion response from the Google API.\n   */\n  private async *streamChatCompletion(\n    stream: AsyncIterable<EnhancedGenerateContentResponse>,\n    params: GoogleChatCompletionParams\n  ): AsyncIterable<ExtendedCompletionChunkGoogle> {\n    for await (const chunk of stream) {\n      yield this.transformResponse(chunk, params) as ExtendedCompletionChunkGoogle\n    }\n  }\n\n  /**\n   * Creates a chat completion using the Google AI API.\n   */\n  public async create(\n    params: GoogleChatCompletionParamsStream\n  ): Promise<AsyncIterable<ExtendedCompletionChunkGoogle>>\n\n  public async create(\n    params: GoogleChatCompletionParamsNonStream\n  ): Promise<ExtendedCompletionGoogle>\n\n  public async create(\n    params: GoogleChatCompletionParams\n  ): Promise<ExtendedCompletionGoogle | AsyncIterable<ExtendedCompletionChunkGoogle>> {\n    try {\n      if (!params?.model || !params?.messages?.length) {\n        throw new Error(\"model and messages are required\")\n      }\n\n      const chatSession = await this.getChatSession(params)\n      const lastMessage = params.messages[params.messages.length - 1]\n\n      if (params?.stream) {\n        this.logger.log(this.logLevel, \"Starting streaming completion response\")\n        const result = await chatSession.sendMessageStream(lastMessage.content.toString())\n        return this.streamChatCompletion(result.stream, params)\n      } else {\n        const result = await chatSession.sendMessage(lastMessage.content.toString())\n        if (!result?.response) {\n          throw new Error(\"Chat response failed\")\n        }\n\n        const transformedResult = this.transformResponse(result.response, params)\n        transformedResult.model = params.model\n        return transformedResult as ExtendedCompletionGoogle\n      }\n    } catch (error) {\n      this.logger.log(this.logLevel, new Error(\"Error in Google API request:\", { cause: error }))\n      throw error\n    }\n  }\n\n  /**\n   * Add content to the Google AI cache manager\n   */\n  public async createCacheManager(params: GoogleCacheCreateParams) {\n    const contents = this.transformHistory(params.messages)\n\n    try {\n      return await this.googleCacheManager.create({\n        ttlSeconds: params.ttlSeconds,\n        model: params.model,\n        contents\n      })\n    } catch (err: unknown) {\n      let error = err as Error\n\n      if (err instanceof GoogleGenerativeAIError) {\n        error = new Error(\n          \"Failed to create Gemini cache manager, ensure your API key supports caching (i.e. pay-as-you-go)\"\n        )\n        error.stack = (err as Error).stack\n      }\n\n      this.logger.log(this.logLevel, error)\n\n      throw err\n    }\n  }\n\n  public chat = {\n    completions: {\n      create: this.create.bind(this)\n    }\n  }\n\n  /** Interface for Google AI Cache Manager */\n  public cacheManager = {\n    create: this.createCacheManager.bind(this),\n    get: async (cacheName: string) => {\n      return await this.googleCacheManager.get(cacheName)\n    },\n    list: async () => {\n      return await this.googleCacheManager.list()\n    },\n    update: async (cacheName: string, params: GoogleCacheCreateParams) => {\n      const contents = this.transformHistory(params.messages)\n      return await this.googleCacheManager.update(cacheName, {\n        cachedContent: {\n          contents\n        }\n      } as CachedContentUpdateParams)\n    },\n    delete: async (cacheName: string) => {\n      return await this.googleCacheManager.delete(cacheName)\n    }\n  }\n}\n","import { ClientOptions, OpenAI } from \"openai\"\n\nexport class OpenAIProvider extends OpenAI {\n  constructor(opts?: ClientOptions) {\n    super(opts)\n  }\n}\n","import { AnthropicProvider } from \"@/providers/anthropic\"\nimport { GoogleProvider } from \"@/providers/google\"\nimport { OpenAIProvider } from \"@/providers/openai\"\nimport { OpenAILikeClient, Providers } from \"@/types\"\nimport { ClientOptions } from \"openai\"\n\nexport class LLMClient<P extends Providers> {\n  private providerInstance: OpenAILikeClient<P>\n\n  constructor(\n    opts: ClientOptions & {\n      provider: P\n    }\n  ) {\n    switch (opts?.provider) {\n      case \"anthropic\":\n        this.providerInstance = new AnthropicProvider(opts) as unknown as OpenAILikeClient<P>\n        break\n      case \"google\":\n        this.providerInstance = new GoogleProvider(opts) as unknown as OpenAILikeClient<P>\n        break\n      case \"openai\":\n      default:\n        this.providerInstance = new OpenAIProvider(opts) as OpenAILikeClient<P>\n    }\n\n    const proxyHandler: ProxyHandler<OpenAILikeClient<P>> = {\n      get: (target, prop, receiver) => {\n        if (prop in target) {\n          return Reflect.get(target, prop, receiver)\n        }\n      }\n    }\n\n    this.providerInstance = new Proxy(this.providerInstance, proxyHandler) as OpenAILikeClient<P>\n  }\n\n  public getProviderInstance(): OpenAILikeClient<P> {\n    return this.providerInstance\n  }\n}\n\nexport function createLLMClient<P extends Providers>(\n  opts: ClientOptions & {\n    provider: P\n    logLevel?: string\n  } = { provider: \"openai\" as P }\n): OpenAILikeClient<P> {\n  const client = new LLMClient<P>(opts)\n  return client.getProviderInstance()\n}\n"]}