llm-polyglot
Version:
A universal LLM client - provides adapters for various LLM providers to adhere to a universal interface - the openai sdk - allows you to use providers like anthropic using the same openai interface and transforms the responses in the same way - this allow
1 lines • 43.9 kB
Source Map (JSON)
{"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"]}