190proof 1.0.85 → 1.0.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts","../interfaces.ts","../logger.ts","../utils.ts"],"sourcesContent":["import {\n ClaudeModel,\n GPTModel,\n OpenAIPayload,\n OpenAIMessage,\n OpenAIConfig,\n AnthropicAIPayload,\n AnthropicAIMessage,\n GenericMessage,\n AnthropicAIConfig,\n GenericPayload,\n GroqPayload,\n GroqModel,\n ParsedResponseMessage,\n FunctionCall,\n AnthropicContentBlock,\n OpenAIContentBlock,\n GoogleAIPayload,\n GeminiModel,\n GoogleAIPart,\n File,\n GoogleAIMessage,\n AnyModel,\n} from \"./interfaces\";\nimport logger, { Identifier } from \"./logger\";\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from \"@aws-sdk/client-bedrock-runtime\";\nimport axios from \"axios\";\nimport { isHeicImage, timeout } from \"./utils\";\nimport { GoogleGenAI } from \"@google/genai\";\n\nconst sharp = require(\"sharp\");\nconst decode = require(\"heic-decode\");\n\nexport {\n ClaudeModel,\n GPTModel,\n GroqModel,\n GeminiModel,\n OpenAIConfig,\n FunctionDefinition,\n GenericMessage,\n GenericPayload,\n AnyModel,\n} from \"./interfaces\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SHARED UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generic retry wrapper for API calls with exponential backoff.\n */\nasync function withRetries<T>(\n identifier: Identifier,\n apiName: string,\n fn: () => Promise<T>,\n options: {\n retries?: number;\n baseDelayMs?: number;\n onError?: (error: any, attempt: number) => void;\n } = {}\n): Promise<T> {\n const { retries = 5, baseDelayMs = 125, onError } = options;\n\n logger.log(identifier, `Calling ${apiName} API with retries`);\n\n let lastError: any;\n for (let attempt = 0; attempt < retries; attempt++) {\n try {\n return await fn();\n } catch (error: any) {\n lastError = error;\n\n if (onError) {\n onError(error, attempt);\n } else {\n logger.error(\n identifier,\n `Retry #${attempt} error: ${error.message}`,\n error.response?.data || error\n );\n }\n\n await timeout(baseDelayMs * attempt);\n }\n }\n\n const error = new Error(\n `Failed to call ${apiName} API after ${retries} attempts`\n ) as any;\n error.cause = lastError;\n throw error;\n}\n\nfunction parseStreamedResponse(\n identifier: Identifier,\n paragraph: string,\n toolCallAccumulators: { name: string; arguments: string }[],\n allowedFunctionNames: Set<string> | null\n): ParsedResponseMessage {\n const functionCalls: FunctionCall[] = [];\n\n for (const acc of toolCallAccumulators) {\n if (!acc.name || !acc.arguments) continue;\n\n if (allowedFunctionNames && !allowedFunctionNames.has(acc.name)) {\n throw new Error(\n `Stream error: received function call with unknown name: ${acc.name}`\n );\n }\n\n try {\n functionCalls.push({\n name: acc.name,\n arguments: JSON.parse(acc.arguments),\n });\n } catch (error) {\n logger.error(\n identifier,\n \"Error parsing function call arguments:\",\n acc.arguments\n );\n throw error;\n }\n }\n\n if (!paragraph && !functionCalls.length) {\n logger.error(\n identifier,\n \"Stream error: received message without content or function_call:\",\n JSON.stringify({ paragraph, toolCallAccumulators })\n );\n throw new Error(\n \"Stream error: received message without content or function_call\"\n );\n }\n\n return {\n role: \"assistant\",\n content: paragraph || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n };\n}\n\nfunction truncatePayload(payload: OpenAIPayload): string {\n return JSON.stringify(\n {\n ...payload,\n messages: payload.messages.map((message) => {\n const truncatedMessage = { ...message };\n if (typeof truncatedMessage.content === \"string\") {\n truncatedMessage.content = truncatedMessage.content.slice(0, 100);\n } else if (Array.isArray(truncatedMessage.content)) {\n truncatedMessage.content = truncatedMessage.content.map((block) => {\n if (block.type === \"image_url\") {\n return {\n ...block,\n image_url: { url: block.image_url.url.slice(0, 100) },\n };\n }\n return block;\n });\n }\n return truncatedMessage;\n }),\n },\n null,\n 2\n );\n}\n\nasync function getNormalizedBase64PNG(\n url: string,\n mime: string\n): Promise<string> {\n const response = await axios.get(url, { responseType: \"arraybuffer\" });\n\n let imageBuffer = Buffer.from(response.data);\n let sharpOptions = {};\n\n if (isHeicImage(url, mime)) {\n const imageData = await decode({ buffer: imageBuffer });\n imageBuffer = Buffer.from(imageData.data);\n sharpOptions = {\n raw: {\n width: imageData.width,\n height: imageData.height,\n channels: 4,\n },\n };\n }\n\n // Limits size of image to < 5MB Anthropic limit\n const resizedBuffer = await sharp(imageBuffer, sharpOptions)\n .withMetadata()\n .resize(1024, 1024, { fit: \"inside\", withoutEnlargement: true })\n .png()\n .toBuffer();\n\n return resizedBuffer.toString(\"base64\");\n}\n\nconst ALLOWED_IMAGE_MIME_TYPES = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// OPENAI\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface OpenAIRequestConfig {\n endpoint: string;\n headers: Record<string, string>;\n}\n\nfunction buildOpenAIRequestConfig(\n identifier: Identifier,\n model: string,\n config: OpenAIConfig | undefined\n): OpenAIRequestConfig {\n if (!config) {\n config = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n if (config.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service:\", model);\n\n if (!config.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = config.modelConfigMap[model as GPTModel];\n if (!azureConfig?.endpoint) {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n\n const endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n logger.log(identifier, \"Using endpoint:\", endpoint);\n\n return {\n endpoint,\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n };\n }\n\n // Default: OpenAI\n logger.log(identifier, \"Using OpenAI service:\", model);\n if (config.orgId) {\n logger.log(identifier, \"Using orgId:\", config.orgId);\n }\n\n return {\n endpoint: \"https://api.openai.com/v1/chat/completions\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.apiKey}`,\n ...(config.orgId ? { \"OpenAI-Organization\": config.orgId } : {}),\n },\n };\n}\n\nasync function prepareOpenAIPayload(\n identifier: Identifier,\n payload: GenericPayload\n): Promise<OpenAIPayload> {\n const preparedPayload: OpenAIPayload = {\n model: payload.model as GPTModel,\n messages: [],\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call\n : { type: \"function\", function: payload.function_call }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const contentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n contentBlocks.push({ type: \"text\", text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n contentBlocks.push({\n type: \"image_url\",\n image_url: { url: file.url },\n });\n contentBlocks.push({ type: \"text\", text: `Image (${file.url})` });\n } else if (file.data) {\n contentBlocks.push({\n type: \"image_url\",\n image_url: { url: `data:${file.mimeType};base64,${file.data}` },\n });\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n contentBlocks.push({\n type: \"text\",\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: contentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callOpenAIStream(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n chunkTimeoutMs: number\n): Promise<ParsedResponseMessage> {\n const functionNames: Set<string> | null = openAiPayload.tools\n ? new Set(openAiPayload.tools.map((fn) => fn.function.name as string))\n : null;\n\n const { endpoint, headers } = buildOpenAIRequestConfig(\n id,\n openAiPayload.model,\n openAiConfig\n );\n\n const controller = new AbortController();\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...openAiPayload, stream: true }),\n signal: controller.signal,\n });\n\n if (!response.body) {\n throw new Error(\"Stream error: no response body\");\n }\n\n let paragraph = \"\";\n const toolCallAccumulators: { name: string; arguments: string }[] = [];\n\n const reader = response.body.getReader();\n let partialChunk = \"\";\n let chunkIndex = -1;\n\n const createAbortTimeout = () =>\n setTimeout(() => {\n logger.error(id, `Stream timeout after ${chunkTimeoutMs}ms`);\n controller.abort();\n }, chunkTimeoutMs);\n\n while (true) {\n chunkIndex++;\n const abortTimeout = createAbortTimeout();\n const { done, value } = await reader.read();\n clearTimeout(abortTimeout);\n\n if (done) {\n logger.error(id, `Stream ended prematurely after ${chunkIndex + 1} chunks`);\n throw new Error(\"Stream error: ended prematurely\");\n }\n\n let chunk = new TextDecoder().decode(value);\n if (partialChunk) {\n chunk = partialChunk + chunk;\n partialChunk = \"\";\n }\n\n const jsonStrings = chunk.split(/^data: /gm);\n\n for (const jsonString of jsonStrings) {\n if (!jsonString) continue;\n\n if (jsonString.includes(\"[DONE]\")) {\n return parseStreamedResponse(\n id,\n paragraph,\n toolCallAccumulators,\n functionNames\n );\n }\n\n let json;\n try {\n json = JSON.parse(jsonString.trim());\n } catch {\n partialChunk = jsonString;\n continue;\n }\n\n if (!json.choices?.length) {\n if (json.error) {\n logger.error(id, \"Stream error from OpenAI:\", json.error);\n const error = new Error(\"Stream error: OpenAI error\") as any;\n error.data = json.error;\n error.requestBody = truncatePayload(openAiPayload);\n throw error;\n }\n if (chunkIndex !== 0) {\n logger.error(id, \"Stream error: no choices in JSON:\", json);\n }\n continue;\n }\n\n const toolCalls = json.choices[0]?.delta?.tool_calls;\n if (toolCalls) {\n for (const toolCall of toolCalls) {\n const idx = toolCall.index ?? 0;\n while (toolCallAccumulators.length <= idx) {\n toolCallAccumulators.push({ name: \"\", arguments: \"\" });\n }\n if (toolCall.function?.name) toolCallAccumulators[idx].name += toolCall.function.name;\n if (toolCall.function?.arguments) toolCallAccumulators[idx].arguments += toolCall.function.arguments;\n }\n }\n\n const text = json.choices[0]?.delta?.content;\n if (text) paragraph += text;\n }\n }\n}\n\nasync function callOpenAI(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined\n): Promise<ParsedResponseMessage> {\n const { endpoint, headers } = buildOpenAIRequestConfig(\n id,\n openAiPayload.model,\n openAiConfig\n );\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...openAiPayload, stream: false }),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n logger.error(id, \"OpenAI API error:\", errorData);\n throw new Error(`OpenAI API Error: ${errorData.error.message}`);\n }\n\n const data = await response.json();\n\n if (!data.choices?.length) {\n if (data.error) {\n logger.error(id, \"OpenAI error:\", data.error);\n throw new Error(`OpenAI error: ${data.error.message}`);\n }\n throw new Error(\"OpenAI error: No choices returned.\");\n }\n\n const choice = data.choices[0];\n\n // Check for tool_calls (modern API) first, fall back to function_call (legacy)\n const toolCalls = choice.message?.tool_calls;\n const functionCalls: FunctionCall[] = [];\n\n if (toolCalls?.length) {\n for (const tc of toolCalls) {\n functionCalls.push({\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n });\n }\n } else if (choice.function_call) {\n functionCalls.push({\n name: choice.function_call.name,\n arguments: JSON.parse(choice.function_call.arguments),\n });\n }\n\n return {\n role: \"assistant\",\n content: choice.message.content || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n };\n}\n\nasync function callOpenAiWithRetries(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n logger.log(\n id,\n \"Calling OpenAI API with retries:\",\n openAiConfig?.service,\n openAiPayload.model\n );\n\n const useStreaming =\n openAiPayload.model !== GPTModel.O1_MINI &&\n openAiPayload.model !== GPTModel.O1_PREVIEW;\n\n return withRetries(\n id,\n \"OpenAI\",\n async () => {\n if (useStreaming) {\n return callOpenAIStream(id, openAiPayload, openAiConfig, chunkTimeoutMs);\n } else {\n return callOpenAI(id, openAiPayload, openAiConfig);\n }\n },\n {\n retries,\n baseDelayMs: 250,\n onError: (error, attempt) => {\n logger.error(\n id,\n `Retry #${attempt} error: ${error.message}`,\n error.response?.data || error.data || error\n );\n\n // Remove images on content policy violation\n if (error.data?.code === \"content_policy_violation\") {\n logger.log(id, \"Removing images due to content policy violation\");\n openAiPayload.messages.forEach((message: OpenAIMessage) => {\n if (Array.isArray(message.content)) {\n message.content = message.content.filter(\n (content) => content.type === \"text\"\n );\n }\n });\n }\n },\n }\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ANTHROPIC\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction jigAnthropicMessages(\n messages: AnthropicAIMessage[]\n): AnthropicAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // Ensure first message is from user\n if (jiggedMessages[0]?.role !== \"user\") {\n jiggedMessages = [{ role: \"user\" as const, content: \"...\" }, ...jiggedMessages];\n }\n\n // Group consecutive messages with the same role\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) return [message];\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n const lastContent = Array.isArray(lastMessage.content)\n ? lastMessage.content\n : [{ type: \"text\" as const, text: lastMessage.content }];\n const newContent = Array.isArray(message.content)\n ? message.content\n : [{ type: \"text\" as const, text: message.content }];\n\n lastMessage.content = [\n ...lastContent,\n { type: \"text\", text: \"\\n\\n---\\n\\n\" },\n ...newContent,\n ];\n return acc;\n }\n\n // Convert string content to text content block\n if (typeof message.content === \"string\") {\n message.content = [{ type: \"text\", text: message.content }];\n }\n\n return [...acc, message];\n }, [] as AnthropicAIMessage[]);\n\n // Ensure last message is from user\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"assistant\") {\n jiggedMessages.push({ role: \"user\", content: \"...\" });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareAnthropicPayload(\n _identifier: Identifier,\n payload: GenericPayload\n): Promise<AnthropicAIPayload> {\n const preparedPayload: AnthropicAIPayload = {\n model: payload.model as ClaudeModel,\n messages: [],\n functions: payload.functions,\n temperature: payload.temperature,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n const contentBlocks: AnthropicContentBlock[] = [];\n\n if (message.content) {\n contentBlocks.push({ type: \"text\", text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n contentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n contentBlocks.push({ type: \"text\", text: `Image (${file.url})` });\n } else if (file.data) {\n contentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: file.mimeType as any,\n data: file.data,\n },\n });\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n contentBlocks.push({\n type: \"text\",\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: contentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callAnthropic(\n id: Identifier,\n payload: AnthropicAIPayload,\n config?: AnthropicAIConfig\n): Promise<ParsedResponseMessage> {\n const anthropicMessages = jigAnthropicMessages(payload.messages);\n const tools = payload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n }));\n\n let data;\n\n if (config?.service === \"bedrock\") {\n const AWS_REGION = \"us-east-1\";\n const MODEL_ID = \"anthropic.claude-3-haiku-20240307-v1:0\";\n\n const client = new BedrockRuntimeClient({ region: AWS_REGION });\n const bedrockPayload = {\n anthropic_version: \"bedrock-2023-05-31\",\n max_tokens: 4096,\n messages: anthropicMessages,\n tools,\n };\n\n const response = await client.send(\n new InvokeModelCommand({\n contentType: \"application/json\",\n body: JSON.stringify(bedrockPayload),\n modelId: MODEL_ID,\n })\n );\n\n const decodedResponseBody = new TextDecoder().decode(response.body);\n data = JSON.parse(decodedResponseBody);\n } else {\n // Default: Anthropic API\n const response = await axios.post(\n \"https://api.anthropic.com/v1/messages\",\n {\n model: payload.model,\n messages: anthropicMessages,\n tools,\n temperature: payload.temperature,\n system: payload.system,\n max_tokens: 4096,\n },\n {\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": process.env.ANTHROPIC_API_KEY as string,\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-beta\": \"tools-2024-04-04\",\n },\n timeout: 60000,\n }\n );\n data = response.data;\n }\n\n const answers = data.content;\n if (!answers?.[0]) {\n logger.error(id, \"Missing answer in Anthropic API response:\", data);\n throw new Error(\"Missing answer in Anthropic API\");\n }\n\n let textResponse = \"\";\n const functionCalls: FunctionCall[] = [];\n\n for (const answer of answers) {\n if (!answer.type) {\n logger.error(id, \"Missing answer type in Anthropic API response:\", data);\n throw new Error(\"Missing answer type in Anthropic API\");\n }\n\n if (answer.type === \"text\") {\n let text = answer.text\n .replace(/<thinking>.*?<\\/thinking>/gs, \"\")\n .replace(/<answer>|<\\/answer>/gs, \"\")\n .trim();\n\n if (!text) {\n text = answer.text.replace(\n /<thinking>|<\\/thinking>|<answer>|<\\/answer>/gs,\n \"\"\n );\n logger.log(id, \"No text in answer, returning text within tags:\", text);\n }\n\n textResponse = textResponse ? `${textResponse}\\n\\n${text}` : text;\n } else if (answer.type === \"tool_use\") {\n functionCalls.push({\n name: answer.name,\n arguments: answer.input,\n });\n }\n }\n\n if (!textResponse && !functionCalls.length) {\n logger.error(id, \"Missing text & functions in Anthropic API response:\", data);\n throw new Error(\"Missing text & functions in Anthropic API response\");\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n };\n}\n\nasync function callAnthropicWithRetries(\n id: Identifier,\n payload: AnthropicAIPayload,\n config?: AnthropicAIConfig,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n return withRetries(id, \"Anthropic\", () => callAnthropic(id, payload, config), {\n retries,\n });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// GOOGLE AI\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction jigGoogleMessages(messages: GoogleAIMessage[]): GoogleAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // Ensure first message is from user\n if (jiggedMessages[0]?.role === \"model\") {\n jiggedMessages = [{ role: \"user\" as const, parts: [{ text: \"...\" }] }, ...jiggedMessages];\n }\n\n // Group consecutive messages with the same role\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) return [message];\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n lastMessage.parts = [...lastMessage.parts, ...message.parts];\n return acc;\n }\n\n return [...acc, message];\n }, [] as GoogleAIMessage[]);\n\n // Ensure last message is from user\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"model\") {\n jiggedMessages.push({ role: \"user\", parts: [{ text: \"...\" }] });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareGoogleAIPayload(\n _identifier: Identifier,\n payload: GenericPayload\n): Promise<GoogleAIPayload> {\n const preparedPayload: GoogleAIPayload = {\n model: payload.model as GeminiModel,\n messages: [],\n tools: payload.functions\n ? {\n functionDeclarations: payload.functions.map((fn) => ({\n name: fn.name,\n parameters: {\n description: fn.description,\n ...fn.parameters,\n },\n })),\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.systemInstruction = message.content;\n continue;\n }\n\n const parts: GoogleAIPart[] = [];\n\n if (message.content) {\n parts.push({ text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n parts.push({\n fileData: {\n mimeType: file.mimeType,\n fileUri: file.url,\n },\n });\n parts.push({ text: `Image (${file.url})` });\n } else if (file.data) {\n parts.push({\n inlineData: {\n mimeType: file.mimeType,\n data: file.data,\n },\n });\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n parts.push({\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role === \"assistant\" ? \"model\" : message.role,\n parts,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callGoogleAI(\n id: Identifier,\n payload: GoogleAIPayload\n): Promise<ParsedResponseMessage> {\n const googleMessages = jigGoogleMessages(payload.messages);\n const history = googleMessages.slice(0, -1);\n const lastMessage = googleMessages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\n const chat = genAI.chats.create({\n model: payload.model,\n history,\n config: {\n responseModalities: [\"Text\"],\n tools: payload.tools ? [payload.tools] : undefined,\n systemInstruction: payload.systemInstruction,\n },\n });\n\n const response = await chat.sendMessage({ message: lastMessage.parts });\n\n let text = \"\";\n const files: File[] = [];\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.text) text += part.text;\n if (part.inlineData?.data) {\n files.push({ mimeType: \"image/png\", data: part.inlineData.data });\n }\n }\n\n const functionCalls = response.functionCalls?.map((fc) => ({\n name: fc.name ?? \"\",\n arguments: fc.args ?? {},\n }));\n\n if (!text && !functionCalls?.length && !files.length) {\n const candidate = response.candidates?.[0];\n const finishReason = candidate?.finishReason;\n\n logger.error(id, \"Missing text & functions in Google AI API response:\", {\n finishReason,\n safetyRatings: candidate?.safetyRatings,\n usageMetadata: response.usageMetadata,\n modelVersion: response.modelVersion,\n candidateContent: candidate?.content,\n promptFeedback: response.promptFeedback,\n });\n\n let errorMessage = \"Missing text & functions in Google AI API response\";\n if (finishReason) {\n const reasonDescriptions: Record<string, string> = {\n MALFORMED_FUNCTION_CALL: \"(Google could not generate valid function call arguments)\",\n SAFETY: \"(blocked by safety filters)\",\n RECITATION: \"(blocked due to recitation)\",\n MAX_TOKENS: \"(response truncated due to max tokens)\",\n };\n errorMessage += `: finishReason=${finishReason} ${reasonDescriptions[finishReason] || \"\"}`;\n }\n\n const error = new Error(errorMessage) as any;\n error.finishReason = finishReason;\n error.safetyRatings = candidate?.safetyRatings;\n error.usageMetadata = response.usageMetadata;\n error.promptFeedback = response.promptFeedback;\n throw error;\n }\n\n return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: functionCalls?.[0] || null,\n function_calls: functionCalls || [],\n };\n}\n\n/**\n * Content violation finish reasons that should trigger circuit breaker behavior.\n * These errors won't resolve with simple retries - the content itself is the problem.\n */\nconst CONTENT_VIOLATION_REASONS = new Set([\n \"PROHIBITED_CONTENT\",\n \"SAFETY\",\n]);\n\n/**\n * Removes inline image data from Google AI messages, preserving text content.\n * Used as a fallback when content violations are detected.\n */\nfunction removeImagesFromGooglePayload(payload: GoogleAIPayload): boolean {\n let removedImages = false;\n\n for (const message of payload.messages) {\n message.parts = message.parts.filter((part) => {\n if (\"inlineData\" in part || \"fileData\" in part) {\n removedImages = true;\n return false;\n }\n return true;\n });\n\n // Ensure message still has content after removing images\n if (message.parts.length === 0) {\n message.parts = [{ text: \"(image removed due to content policy)\" }];\n }\n }\n\n return removedImages;\n}\n\nasync function callGoogleAIWithRetries(\n id: Identifier,\n payload: GoogleAIPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n let hasTriedWithoutImages = false;\n\n return withRetries(id, \"Google AI\", () => callGoogleAI(id, payload), {\n retries,\n onError: (error, attempt) => {\n const errorDetails: Record<string, any> = {\n message: error.message,\n finishReason: error.finishReason,\n modelVersion: error.modelVersion,\n };\n\n if (error.safetyRatings) errorDetails.safetyRatings = error.safetyRatings;\n if (error.usageMetadata) errorDetails.usageMetadata = error.usageMetadata;\n if (error.promptFeedback) errorDetails.promptFeedback = error.promptFeedback;\n if (error.status) errorDetails.httpStatus = error.status;\n if (error.code) errorDetails.errorCode = error.code;\n if (error.details) errorDetails.errorDetails = error.details;\n\n logger.error(id, `Retry #${attempt} error: ${error.message}`, errorDetails);\n\n // Circuit breaker: detect content violations and try removing images\n // Check both finishReason (candidate-level) and promptFeedback.blockReason (prompt-level)\n const violationReason =\n (CONTENT_VIOLATION_REASONS.has(error.finishReason) && error.finishReason) ||\n (CONTENT_VIOLATION_REASONS.has(error.promptFeedback?.blockReason) && error.promptFeedback?.blockReason);\n\n if (violationReason) {\n if (!hasTriedWithoutImages) {\n const removedImages = removeImagesFromGooglePayload(payload);\n if (removedImages) {\n logger.log(\n id,\n `Circuit breaker triggered: removing images due to ${violationReason}`\n );\n hasTriedWithoutImages = true;\n return; // Continue to next retry with images removed\n }\n }\n\n // If we already tried without images or there were no images, fail fast\n logger.error(\n id,\n `Circuit breaker: failing fast due to ${violationReason} (no more fallbacks)`\n );\n const circuitBreakerError = new Error(\n `Google AI content violation: ${violationReason}. Request cannot succeed with current content.`\n ) as any;\n circuitBreakerError.finishReason = error.finishReason;\n circuitBreakerError.safetyRatings = error.safetyRatings;\n circuitBreakerError.usageMetadata = error.usageMetadata;\n circuitBreakerError.circuitBreaker = true;\n throw circuitBreakerError;\n }\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// GROQ\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction normalizeMessageContent(\n content: AnthropicAIMessage[\"content\"]\n): string {\n return Array.isArray(content)\n ? content\n .map((c) => (c.type === \"text\" ? c.text : `[${c.type}]`))\n .join(\"\\n\")\n : content;\n}\n\nfunction prepareGroqPayload(payload: GenericPayload): GroqPayload {\n return {\n model: payload.model as GroqModel,\n messages: payload.messages.map((message) => ({\n role: message.role,\n content: normalizeMessageContent(message.content),\n })),\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call\n : { type: \"function\", function: payload.function_call }\n : undefined,\n temperature: payload.temperature,\n };\n}\n\nasync function callGroq(\n id: Identifier,\n payload: GroqPayload\n): Promise<ParsedResponseMessage> {\n const response = await axios.post(\n \"https://api.groq.com/openai/v1/chat/completions\",\n payload,\n {\n headers: {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${process.env.GROQ_API_KEY}`,\n },\n }\n );\n\n const answer = response.data.choices[0]?.message;\n if (!answer) {\n logger.error(id, \"Missing answer in Groq API response:\", response.data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const functionCalls: FunctionCall[] = [];\n if (answer.tool_calls?.length) {\n for (const tc of answer.tool_calls) {\n functionCalls.push({\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n return {\n role: \"assistant\",\n content: answer.content || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n };\n}\n\nasync function callGroqWithRetries(\n id: Identifier,\n payload: GroqPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n return withRetries(id, \"Groq\", () => callGroq(id, payload), { retries });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MAIN ENTRY POINT\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction isAnthropicPayload(payload: GenericPayload): boolean {\n return Object.values(ClaudeModel).includes(payload.model as ClaudeModel);\n}\n\nfunction isOpenAiPayload(payload: GenericPayload): boolean {\n return Object.values(GPTModel).includes(payload.model as GPTModel);\n}\n\nfunction isGroqPayload(payload: GenericPayload): boolean {\n return Object.values(GroqModel).includes(payload.model as GroqModel);\n}\n\nfunction isGoogleAIPayload(payload: GenericPayload): boolean {\n return Object.values(GeminiModel).includes(payload.model as GeminiModel);\n}\n\nexport async function callWithRetries(\n id: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n try {\n if (isAnthropicPayload(aiPayload)) {\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(id, aiPayload),\n aiConfig as AnthropicAIConfig,\n retries\n );\n }\n\n if (isOpenAiPayload(aiPayload)) {\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(id, aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs\n );\n }\n\n if (isGroqPayload(aiPayload)) {\n return await callGroqWithRetries(id, prepareGroqPayload(aiPayload), retries);\n }\n\n if (isGoogleAIPayload(aiPayload)) {\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(id, aiPayload),\n retries\n );\n }\n\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n } catch (error) {\n if (aiPayload.fallbackModel) {\n logger.log(\n id,\n `Primary model ${aiPayload.model} failed, falling back to ${aiPayload.fallbackModel}`\n );\n return callWithRetries(\n id,\n { ...aiPayload, model: aiPayload.fallbackModel, fallbackModel: undefined },\n aiConfig,\n retries,\n chunkTimeoutMs\n );\n }\n throw error;\n }\n}\n","export enum ClaudeModel {\n HAIKU_3 = \"claude-3-haiku-20240307\",\n SONNET_3 = \"claude-3-sonnet-20240229\",\n OPUS_3 = \"claude-3-opus-20240229\",\n HAIKU_3_5 = \"claude-3-5-haiku-20241022\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\n OPUS_4_1 = \"claude-opus-4-1\",\n HAIKU_4_5 = \"claude-haiku-4-5\",\n SONNET_4_5 = \"claude-sonnet-4-5\",\n OPUS_4_5 = \"claude-opus-4-5\",\n}\n\nexport enum GPTModel {\n GPT35_0613 = \"gpt-3.5-turbo-0613\",\n GPT35_0613_16K = \"gpt-3.5-turbo-16k-0613\",\n GPT35_0125 = \"gpt-3.5-turbo-0125\",\n GPT4_1106_PREVIEW = \"gpt-4-1106-preview\",\n GPT4_0125_PREVIEW = \"gpt-4-0125-preview\",\n GPT4_0409 = \"gpt-4-turbo-2024-04-09\",\n GPT4O = \"gpt-4o\",\n GPT4O_MINI = \"gpt-4o-mini\",\n O1_PREVIEW = \"o1-preview\",\n O1_MINI = \"o1-mini\",\n O3_MINI = \"o3-mini\",\n GPT4_1 = \"gpt-4.1\",\n GPT4_1_MINI = \"gpt-4.1-mini\",\n GPT4_1_NANO = \"gpt-4.1-nano\",\n GPT5 = \"gpt-5\",\n GPT5_MINI = \"gpt-5-mini\",\n}\n\nexport enum GroqModel {\n LLAMA_3_70B_8192 = \"llama3-70b-8192\",\n DEEPSEEK_R1_DISTILL_LLAMA_70B = \"deepseek-r1-distill-llama-70b\",\n}\n\nexport enum GeminiModel {\n GEMINI_1_5_PRO = \"gemini-1.5-pro-latest\",\n GEMINI_EXP_1206 = \"gemini-exp-1206\",\n GEMINI_2_0_FLASH = \"gemini-2.0-flash\",\n GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION = \"gemini-2.0-flash-exp-image-generation\",\n GEMINI_2_0_FLASH_THINKING_EXP = \"gemini-2.0-flash-thinking-exp\",\n GEMINI_2_0_FLASH_THINKING_EXP_01_21 = \"gemini-2.0-flash-thinking-exp-01-21\",\n GEMINI_2_5_FLASH_PREVIEW_04_17 = \"gemini-2.5-flash-preview-04-17\",\n GEMINI_3_FLASH_PREVIEW = \"gemini-3-flash-preview\",\n GEMINI_3_1_FLASH_LITE_PREVIEW = \"gemini-3.1-flash-lite-preview\",\n}\n\nexport interface GenericError {\n message: string;\n}\n\nexport enum ContentType {\n TEXT = \"text\",\n ATTACHMENT = \"attachment\",\n}\n\nexport type AIChainResponse = {\n content: string | null;\n contentType?: ContentType;\n functionCalls: FunctionCall[];\n};\n\nexport interface GenericMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp?: string;\n files?: File[];\n functionCalls?: FunctionCall[];\n}\n\nexport interface File {\n mimeType: string;\n url?: string;\n data?: string;\n}\n\nexport interface OpenAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | OpenAIContentBlock[];\n}\n\nexport type OpenAIContentBlock =\n | OpenAITextContentBlock\n | OpenAIImageContentBlock\n | OpenAIAudioContentBlock;\n\nexport interface OpenAITextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface OpenAIImageContentBlock {\n type: \"image_url\";\n image_url: {\n url: string; // URL to the image, can also be a base64 string\n };\n}\n\nexport interface OpenAIAudioContentBlock {\n type: \"audio_url\";\n audio_url: {\n url: string; // URL to the audio, can also be a base64 string\n };\n}\n\nexport interface AnthropicAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | AnthropicContentBlock[];\n}\n\nexport type AnthropicContentBlock =\n | AnthropicTextContentBlock\n | AnthropicImageContentBlock;\n\nexport interface AnthropicTextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface AnthropicImageContentBlock {\n type: \"image\";\n source: {\n type: \"base64\";\n media_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n data: string; // Must be a base64 string\n };\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface ParsedResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: FunctionCall | null;\n function_calls: FunctionCall[];\n files: File[];\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIConfig {\n service: \"azure\" | \"openai\";\n apiKey: string;\n baseUrl: string;\n orgId?: string;\n modelConfigMap?: Record<\n GPTModel,\n {\n resource: string;\n deployment: string;\n apiVersion: string;\n apiKey: string;\n endpoint?: string;\n }\n >;\n}\n\nexport interface AnthropicAIConfig {\n service: \"anthropic\" | \"bedrock\";\n}\n\nexport interface FunctionDefinition {\n name: string;\n description?: string;\n parameters: Record<string, any>;\n}\n\ninterface FunctionWrapped {\n type: \"function\";\n function: FunctionDefinition;\n}\n\nexport interface GroqPayload {\n model: GroqModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n temperature?: number;\n\n functions?: any[]; // Deprecate this\n}\n\nexport interface OpenAIPayload {\n model: GPTModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n}\n\nexport interface AnthropicAIPayload {\n model: ClaudeModel;\n messages: AnthropicAIMessage[];\n functions?: any[]; // TODO type this JSON schema\n temperature?: number;\n system?: string;\n}\n\nexport interface GoogleAITextPart {\n text: string;\n}\n\nexport interface GoogleAIInlineDataPart {\n inlineData: {\n mimeType: string;\n data: string;\n };\n}\n\nexport interface GoogleAIFileDataPart {\n fileData: {\n mimeType: string;\n fileUri: string;\n };\n}\n\nexport type GoogleAIPart = GoogleAITextPart | GoogleAIInlineDataPart | GoogleAIFileDataPart;\nexport interface GoogleAIMessage {\n role: \"user\" | \"model\";\n parts: GoogleAIPart[];\n}\nexport interface GoogleAIPayload {\n model: GeminiModel;\n messages: GoogleAIMessage[];\n tools?: {\n functionDeclarations: FunctionDefinition[];\n };\n systemInstruction?: string;\n}\n\nexport type AnyModel = GPTModel | ClaudeModel | GroqModel | GeminiModel;\n\nexport interface GenericPayload {\n model: AnyModel;\n messages: GenericMessage[];\n functions?: FunctionDefinition[];\n function_call?: \"none\" | \"auto\" | { name: string };\n temperature?: number;\n fallbackModel?: AnyModel;\n}\n\nexport interface OpenAIBody {\n choices: {\n message: OpenAIResponseMessage;\n }[];\n error?: {\n code: string;\n };\n usage: {\n completion_tokens: number;\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n","type LogLevel = \"LOG\" | \"WARN\" | \"ERROR\";\nexport type Identifier = string | string[];\n\nfunction formatIdentifier(identifier: Identifier): string {\n if (Array.isArray(identifier)) {\n return identifier.map((id) => `[${id}]`).join(\" \");\n }\n return `[${identifier}]`;\n}\n\nfunction formatMessage(\n level: LogLevel,\n identifier: Identifier,\n message: string\n): string {\n return `[${level}] ${formatIdentifier(identifier)} ${message}`;\n}\n\nexport function log(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.log(formatMessage(\"LOG\", identifier, message), ...args);\n}\n\nexport function warn(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.warn(formatMessage(\"WARN\", identifier, message), ...args);\n}\n\nexport function error(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.error(formatMessage(\"ERROR\", identifier, message), ...args);\n}\n\nexport default {\n log,\n warn,\n error,\n};\n","export function timeout(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function isHeicImage(name: string, mime?: string): boolean {\n const extension = name.split(\".\").pop()?.toLowerCase() || \"\";\n return (\n [\"heic\", \"heif\", \"heics\"].includes(extension) ||\n !!(\n mime && [\"image/heic\", \"image/heif\", \"image/heic-sequence\"].includes(mime)\n )\n );\n}\n"],"mappings":"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","names":["ClaudeModel","GPTModel","GroqModel","GeminiModel","error","axios","_a","_b"]}
1
+ {"version":3,"sources":["../index.ts","../interfaces.ts","../logger.ts","../utils.ts"],"sourcesContent":["import {\n ClaudeModel,\n GPTModel,\n OpenAIPayload,\n OpenAIMessage,\n OpenAIConfig,\n AnthropicAIPayload,\n AnthropicAIMessage,\n GenericMessage,\n AnthropicAIConfig,\n GenericPayload,\n GroqPayload,\n GroqModel,\n ParsedResponseMessage,\n FunctionCall,\n AnthropicContentBlock,\n OpenAIContentBlock,\n GoogleAIPayload,\n GeminiModel,\n GoogleAIPart,\n File,\n GoogleAIMessage,\n AnyModel,\n} from \"./interfaces\";\nimport logger, { Identifier } from \"./logger\";\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from \"@aws-sdk/client-bedrock-runtime\";\nimport axios from \"axios\";\nimport { isHeicImage, timeout } from \"./utils\";\nimport { GoogleGenAI } from \"@google/genai\";\n\nconst sharp = require(\"sharp\");\nconst decode = require(\"heic-decode\");\n\nexport {\n ClaudeModel,\n GPTModel,\n GroqModel,\n GeminiModel,\n OpenAIConfig,\n FunctionDefinition,\n GenericMessage,\n GenericPayload,\n AnyModel,\n} from \"./interfaces\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SHARED UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generic retry wrapper for API calls with exponential backoff.\n */\nasync function withRetries<T>(\n identifier: Identifier,\n apiName: string,\n fn: () => Promise<T>,\n options: {\n retries?: number;\n baseDelayMs?: number;\n onError?: (error: any, attempt: number) => void;\n } = {},\n): Promise<T> {\n const { retries = 5, baseDelayMs = 125, onError } = options;\n\n logger.log(identifier, `Calling ${apiName} API with retries`);\n\n let lastError: any;\n for (let attempt = 0; attempt < retries; attempt++) {\n try {\n return await fn();\n } catch (error: any) {\n lastError = error;\n\n if (onError) {\n onError(error, attempt);\n } else {\n logger.error(\n identifier,\n `Retry #${attempt} error: ${error.message}`,\n error.response?.data || error,\n );\n }\n\n await timeout(baseDelayMs * attempt);\n }\n }\n\n const error = new Error(\n `Failed to call ${apiName} API after ${retries} attempts`,\n ) as any;\n error.cause = lastError;\n throw error;\n}\n\nfunction parseStreamedResponse(\n identifier: Identifier,\n paragraph: string,\n toolCallAccumulators: { name: string; arguments: string }[],\n allowedFunctionNames: Set<string> | null,\n): ParsedResponseMessage {\n const functionCalls: FunctionCall[] = [];\n\n for (const acc of toolCallAccumulators) {\n if (!acc.name || !acc.arguments) continue;\n\n if (allowedFunctionNames && !allowedFunctionNames.has(acc.name)) {\n throw new Error(\n `Stream error: received function call with unknown name: ${acc.name}`,\n );\n }\n\n try {\n functionCalls.push({\n name: acc.name,\n arguments: JSON.parse(acc.arguments),\n });\n } catch (error) {\n logger.error(\n identifier,\n \"Error parsing function call arguments:\",\n acc.arguments,\n );\n throw error;\n }\n }\n\n if (!paragraph && !functionCalls.length) {\n logger.error(\n identifier,\n \"Stream error: received message without content or function_call:\",\n JSON.stringify({ paragraph, toolCallAccumulators }),\n );\n throw new Error(\n \"Stream error: received message without content or function_call\",\n );\n }\n\n return {\n role: \"assistant\",\n content: paragraph || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n usage: null,\n };\n}\n\nfunction truncatePayload(payload: OpenAIPayload): string {\n return JSON.stringify(\n {\n ...payload,\n messages: payload.messages.map((message) => {\n const truncatedMessage = { ...message };\n if (typeof truncatedMessage.content === \"string\") {\n truncatedMessage.content = truncatedMessage.content.slice(0, 100);\n } else if (Array.isArray(truncatedMessage.content)) {\n truncatedMessage.content = truncatedMessage.content.map((block) => {\n if (block.type === \"image_url\") {\n return {\n ...block,\n image_url: { url: block.image_url.url.slice(0, 100) },\n };\n }\n return block;\n });\n }\n return truncatedMessage;\n }),\n },\n null,\n 2,\n );\n}\n\nasync function getNormalizedBase64PNG(\n url: string,\n mime: string,\n): Promise<string> {\n const response = await axios.get(url, { responseType: \"arraybuffer\" });\n\n let imageBuffer = Buffer.from(response.data);\n let sharpOptions = {};\n\n if (isHeicImage(url, mime)) {\n const imageData = await decode({ buffer: imageBuffer });\n imageBuffer = Buffer.from(imageData.data);\n sharpOptions = {\n raw: {\n width: imageData.width,\n height: imageData.height,\n channels: 4,\n },\n };\n }\n\n // Limits size of image to < 5MB Anthropic limit\n const resizedBuffer = await sharp(imageBuffer, sharpOptions)\n .withMetadata()\n .resize(1024, 1024, { fit: \"inside\", withoutEnlargement: true })\n .png()\n .toBuffer();\n\n return resizedBuffer.toString(\"base64\");\n}\n\nconst ALLOWED_IMAGE_MIME_TYPES = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// OPENAI\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface OpenAIRequestConfig {\n endpoint: string;\n headers: Record<string, string>;\n}\n\nfunction buildOpenAIRequestConfig(\n identifier: Identifier,\n model: string,\n config: OpenAIConfig | undefined,\n): OpenAIRequestConfig {\n if (!config) {\n config = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n if (config.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service:\", model);\n\n if (!config.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\",\n );\n }\n\n const azureConfig = config.modelConfigMap[model as GPTModel];\n if (!azureConfig?.endpoint) {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n\n const endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n logger.log(identifier, \"Using endpoint:\", endpoint);\n\n return {\n endpoint,\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n };\n }\n\n // Default: OpenAI\n logger.log(identifier, \"Using OpenAI service:\", model);\n if (config.orgId) {\n logger.log(identifier, \"Using orgId:\", config.orgId);\n }\n\n return {\n endpoint: \"https://api.openai.com/v1/chat/completions\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.apiKey}`,\n ...(config.orgId ? { \"OpenAI-Organization\": config.orgId } : {}),\n },\n };\n}\n\nasync function prepareOpenAIPayload(\n identifier: Identifier,\n payload: GenericPayload,\n): Promise<OpenAIPayload> {\n const preparedPayload: OpenAIPayload = {\n model: payload.model as GPTModel,\n messages: [],\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call\n : { type: \"function\", function: payload.function_call }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const contentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n contentBlocks.push({ type: \"text\", text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n contentBlocks.push({\n type: \"image_url\",\n image_url: { url: file.url },\n });\n contentBlocks.push({ type: \"text\", text: `Image (${file.url})` });\n } else if (file.data) {\n contentBlocks.push({\n type: \"image_url\",\n image_url: { url: `data:${file.mimeType};base64,${file.data}` },\n });\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n contentBlocks.push({\n type: \"text\",\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: contentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callOpenAIStream(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n chunkTimeoutMs: number,\n): Promise<ParsedResponseMessage> {\n const functionNames: Set<string> | null = openAiPayload.tools\n ? new Set(openAiPayload.tools.map((fn) => fn.function.name as string))\n : null;\n\n const { endpoint, headers } = buildOpenAIRequestConfig(\n id,\n openAiPayload.model,\n openAiConfig,\n );\n\n const controller = new AbortController();\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...openAiPayload, stream: true }),\n signal: controller.signal,\n });\n\n if (!response.body) {\n throw new Error(\"Stream error: no response body\");\n }\n\n let paragraph = \"\";\n const toolCallAccumulators: { name: string; arguments: string }[] = [];\n\n const reader = response.body.getReader();\n let partialChunk = \"\";\n let chunkIndex = -1;\n\n const createAbortTimeout = () =>\n setTimeout(() => {\n logger.error(id, `Stream timeout after ${chunkTimeoutMs}ms`);\n controller.abort();\n }, chunkTimeoutMs);\n\n while (true) {\n chunkIndex++;\n const abortTimeout = createAbortTimeout();\n const { done, value } = await reader.read();\n clearTimeout(abortTimeout);\n\n if (done) {\n logger.error(\n id,\n `Stream ended prematurely after ${chunkIndex + 1} chunks`,\n );\n throw new Error(\"Stream error: ended prematurely\");\n }\n\n let chunk = new TextDecoder().decode(value);\n if (partialChunk) {\n chunk = partialChunk + chunk;\n partialChunk = \"\";\n }\n\n const jsonStrings = chunk.split(/^data: /gm);\n\n for (const jsonString of jsonStrings) {\n if (!jsonString) continue;\n\n if (jsonString.includes(\"[DONE]\")) {\n return parseStreamedResponse(\n id,\n paragraph,\n toolCallAccumulators,\n functionNames,\n );\n }\n\n let json;\n try {\n json = JSON.parse(jsonString.trim());\n } catch {\n partialChunk = jsonString;\n continue;\n }\n\n if (!json.choices?.length) {\n if (json.error) {\n logger.error(id, \"Stream error from OpenAI:\", json.error);\n const error = new Error(\"Stream error: OpenAI error\") as any;\n error.data = json.error;\n error.requestBody = truncatePayload(openAiPayload);\n throw error;\n }\n if (chunkIndex !== 0) {\n logger.error(id, \"Stream error: no choices in JSON:\", json);\n }\n continue;\n }\n\n const toolCalls = json.choices[0]?.delta?.tool_calls;\n if (toolCalls) {\n for (const toolCall of toolCalls) {\n const idx = toolCall.index ?? 0;\n while (toolCallAccumulators.length <= idx) {\n toolCallAccumulators.push({ name: \"\", arguments: \"\" });\n }\n if (toolCall.function?.name)\n toolCallAccumulators[idx].name += toolCall.function.name;\n if (toolCall.function?.arguments)\n toolCallAccumulators[idx].arguments += toolCall.function.arguments;\n }\n }\n\n const text = json.choices[0]?.delta?.content;\n if (text) paragraph += text;\n }\n }\n}\n\nasync function callOpenAI(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n): Promise<ParsedResponseMessage> {\n const { endpoint, headers } = buildOpenAIRequestConfig(\n id,\n openAiPayload.model,\n openAiConfig,\n );\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...openAiPayload, stream: false }),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n logger.error(id, \"OpenAI API error:\", errorData);\n throw new Error(`OpenAI API Error: ${errorData.error.message}`);\n }\n\n const data = await response.json();\n\n if (!data.choices?.length) {\n if (data.error) {\n logger.error(id, \"OpenAI error:\", data.error);\n throw new Error(`OpenAI error: ${data.error.message}`);\n }\n throw new Error(\"OpenAI error: No choices returned.\");\n }\n\n const choice = data.choices[0];\n\n // Check for tool_calls (modern API) first, fall back to function_call (legacy)\n const toolCalls = choice.message?.tool_calls;\n const functionCalls: FunctionCall[] = [];\n\n if (toolCalls?.length) {\n for (const tc of toolCalls) {\n functionCalls.push({\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n });\n }\n } else if (choice.function_call) {\n functionCalls.push({\n name: choice.function_call.name,\n arguments: JSON.parse(choice.function_call.arguments),\n });\n }\n\n return {\n role: \"assistant\",\n content: choice.message.content || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n usage: data.usage\n ? {\n prompt_tokens: data.usage.prompt_tokens,\n completion_tokens: data.usage.completion_tokens,\n total_tokens: data.usage.total_tokens,\n }\n : null,\n };\n}\n\nasync function callOpenAiWithRetries(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000,\n): Promise<ParsedResponseMessage> {\n logger.log(\n id,\n \"Calling OpenAI API with retries:\",\n openAiConfig?.service,\n openAiPayload.model,\n );\n\n const useStreaming =\n openAiPayload.model !== GPTModel.O1_MINI &&\n openAiPayload.model !== GPTModel.O1_PREVIEW;\n\n return withRetries(\n id,\n \"OpenAI\",\n async () => {\n if (useStreaming) {\n return callOpenAIStream(\n id,\n openAiPayload,\n openAiConfig,\n chunkTimeoutMs,\n );\n } else {\n return callOpenAI(id, openAiPayload, openAiConfig);\n }\n },\n {\n retries,\n baseDelayMs: 250,\n onError: (error, attempt) => {\n logger.error(\n id,\n `Retry #${attempt} error: ${error.message}`,\n error.response?.data || error.data || error,\n );\n\n // Remove images on content policy violation\n if (error.data?.code === \"content_policy_violation\") {\n logger.log(id, \"Removing images due to content policy violation\");\n openAiPayload.messages.forEach((message: OpenAIMessage) => {\n if (Array.isArray(message.content)) {\n message.content = message.content.filter(\n (content) => content.type === \"text\",\n );\n }\n });\n }\n },\n },\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ANTHROPIC\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction jigAnthropicMessages(\n messages: AnthropicAIMessage[],\n): AnthropicAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // Ensure first message is from user\n if (jiggedMessages[0]?.role !== \"user\") {\n jiggedMessages = [\n { role: \"user\" as const, content: \"...\" },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) return [message];\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n const lastContent = Array.isArray(lastMessage.content)\n ? lastMessage.content\n : [{ type: \"text\" as const, text: lastMessage.content }];\n const newContent = Array.isArray(message.content)\n ? message.content\n : [{ type: \"text\" as const, text: message.content }];\n\n lastMessage.content = [\n ...lastContent,\n { type: \"text\", text: \"\\n\\n---\\n\\n\" },\n ...newContent,\n ];\n return acc;\n }\n\n // Convert string content to text content block\n if (typeof message.content === \"string\") {\n message.content = [{ type: \"text\", text: message.content }];\n }\n\n return [...acc, message];\n }, [] as AnthropicAIMessage[]);\n\n // Ensure last message is from user\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"assistant\") {\n jiggedMessages.push({ role: \"user\", content: \"...\" });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareAnthropicPayload(\n _identifier: Identifier,\n payload: GenericPayload,\n): Promise<AnthropicAIPayload> {\n const preparedPayload: AnthropicAIPayload = {\n model: payload.model as ClaudeModel,\n messages: [],\n functions: payload.functions,\n temperature: payload.temperature,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n const contentBlocks: AnthropicContentBlock[] = [];\n\n if (message.content) {\n contentBlocks.push({ type: \"text\", text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n if (message.role == \"user\") {\n // anthropic assistant turns can't have images\n contentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n }\n contentBlocks.push({ type: \"text\", text: `Image (${file.url})` });\n } else if (file.data) {\n if (message.role == \"user\") {\n // anthropic assistant turns can't have images\n contentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: file.mimeType as any,\n data: file.data,\n },\n });\n }\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n contentBlocks.push({\n type: \"text\",\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: contentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callAnthropic(\n id: Identifier,\n payload: AnthropicAIPayload,\n config?: AnthropicAIConfig,\n): Promise<ParsedResponseMessage> {\n const anthropicMessages = jigAnthropicMessages(payload.messages);\n const tools = payload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n }));\n\n let data;\n\n if (config?.service === \"bedrock\") {\n const AWS_REGION = \"us-east-1\";\n const MODEL_ID = \"anthropic.claude-3-haiku-20240307-v1:0\";\n\n const client = new BedrockRuntimeClient({ region: AWS_REGION });\n const bedrockPayload = {\n anthropic_version: \"bedrock-2023-05-31\",\n max_tokens: 4096,\n messages: anthropicMessages,\n tools,\n };\n\n const response = await client.send(\n new InvokeModelCommand({\n contentType: \"application/json\",\n body: JSON.stringify(bedrockPayload),\n modelId: MODEL_ID,\n }),\n );\n\n const decodedResponseBody = new TextDecoder().decode(response.body);\n data = JSON.parse(decodedResponseBody);\n } else {\n // Default: Anthropic API\n const response = await axios.post(\n \"https://api.anthropic.com/v1/messages\",\n {\n model: payload.model,\n messages: anthropicMessages,\n tools,\n temperature: payload.temperature,\n system: payload.system,\n max_tokens: 4096,\n },\n {\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": process.env.ANTHROPIC_API_KEY as string,\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-beta\": \"tools-2024-04-04\",\n },\n timeout: 60000,\n },\n );\n data = response.data;\n }\n\n const answers = data.content;\n if (!answers?.[0]) {\n logger.error(id, \"Missing answer in Anthropic API response:\", data);\n throw new Error(\"Missing answer in Anthropic API\");\n }\n\n let textResponse = \"\";\n const functionCalls: FunctionCall[] = [];\n\n for (const answer of answers) {\n if (!answer.type) {\n logger.error(id, \"Missing answer type in Anthropic API response:\", data);\n throw new Error(\"Missing answer type in Anthropic API\");\n }\n\n if (answer.type === \"text\") {\n let text = answer.text\n .replace(/<thinking>.*?<\\/thinking>/gs, \"\")\n .replace(/<answer>|<\\/answer>/gs, \"\")\n .trim();\n\n if (!text) {\n text = answer.text.replace(\n /<thinking>|<\\/thinking>|<answer>|<\\/answer>/gs,\n \"\",\n );\n logger.log(id, \"No text in answer, returning text within tags:\", text);\n }\n\n textResponse = textResponse ? `${textResponse}\\n\\n${text}` : text;\n } else if (answer.type === \"tool_use\") {\n functionCalls.push({\n name: answer.name,\n arguments: answer.input,\n });\n }\n }\n\n if (!textResponse && !functionCalls.length) {\n logger.error(\n id,\n \"Missing text & functions in Anthropic API response:\",\n data,\n );\n throw new Error(\"Missing text & functions in Anthropic API response\");\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n usage: data.usage\n ? {\n prompt_tokens: data.usage.input_tokens,\n completion_tokens: data.usage.output_tokens,\n total_tokens: data.usage.input_tokens + data.usage.output_tokens,\n }\n : null,\n };\n}\n\nasync function callAnthropicWithRetries(\n id: Identifier,\n payload: AnthropicAIPayload,\n config?: AnthropicAIConfig,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n return withRetries(\n id,\n \"Anthropic\",\n () => callAnthropic(id, payload, config),\n {\n retries,\n },\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// GOOGLE AI\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction jigGoogleMessages(messages: GoogleAIMessage[]): GoogleAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // Ensure first message is from user\n if (jiggedMessages[0]?.role === \"model\") {\n jiggedMessages = [\n { role: \"user\" as const, parts: [{ text: \"...\" }] },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) return [message];\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n lastMessage.parts = [...lastMessage.parts, ...message.parts];\n return acc;\n }\n\n return [...acc, message];\n }, [] as GoogleAIMessage[]);\n\n // Ensure last message is from user\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"model\") {\n jiggedMessages.push({ role: \"user\", parts: [{ text: \"...\" }] });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareGoogleAIPayload(\n _identifier: Identifier,\n payload: GenericPayload,\n): Promise<GoogleAIPayload> {\n const preparedPayload: GoogleAIPayload = {\n model: payload.model as GeminiModel,\n messages: [],\n tools: payload.functions\n ? {\n functionDeclarations: payload.functions.map((fn) => ({\n name: fn.name,\n parameters: {\n description: fn.description,\n ...fn.parameters,\n },\n })),\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.systemInstruction = message.content;\n continue;\n }\n\n const parts: GoogleAIPart[] = [];\n\n if (message.content) {\n parts.push({ text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n parts.push({\n fileData: {\n mimeType: file.mimeType,\n fileUri: file.url,\n },\n });\n parts.push({ text: `Image (${file.url})` });\n } else if (file.data) {\n parts.push({\n inlineData: {\n mimeType: file.mimeType,\n data: file.data,\n },\n });\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n parts.push({\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role === \"assistant\" ? \"model\" : message.role,\n parts,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callGoogleAI(\n id: Identifier,\n payload: GoogleAIPayload,\n): Promise<ParsedResponseMessage> {\n const googleMessages = jigGoogleMessages(payload.messages);\n const history = googleMessages.slice(0, -1);\n const lastMessage = googleMessages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\n const chat = genAI.chats.create({\n model: payload.model,\n history,\n config: {\n responseModalities: [\"Text\"],\n tools: payload.tools ? [payload.tools] : undefined,\n systemInstruction: payload.systemInstruction,\n },\n });\n\n const response = await chat.sendMessage({ message: lastMessage.parts });\n\n let text = \"\";\n const files: File[] = [];\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.text) text += part.text;\n if (part.inlineData?.data) {\n files.push({ mimeType: \"image/png\", data: part.inlineData.data });\n }\n }\n\n const functionCalls = response.functionCalls?.map((fc) => ({\n name: fc.name ?? \"\",\n arguments: fc.args ?? {},\n }));\n\n if (!text && !functionCalls?.length && !files.length) {\n const candidate = response.candidates?.[0];\n const finishReason = candidate?.finishReason;\n\n logger.error(id, \"Missing text & functions in Google AI API response:\", {\n finishReason,\n safetyRatings: candidate?.safetyRatings,\n usageMetadata: response.usageMetadata,\n modelVersion: response.modelVersion,\n candidateContent: candidate?.content,\n promptFeedback: response.promptFeedback,\n });\n\n let errorMessage = \"Missing text & functions in Google AI API response\";\n if (finishReason) {\n const reasonDescriptions: Record<string, string> = {\n MALFORMED_FUNCTION_CALL:\n \"(Google could not generate valid function call arguments)\",\n SAFETY: \"(blocked by safety filters)\",\n RECITATION: \"(blocked due to recitation)\",\n MAX_TOKENS: \"(response truncated due to max tokens)\",\n };\n errorMessage += `: finishReason=${finishReason} ${reasonDescriptions[finishReason] || \"\"}`;\n }\n\n const error = new Error(errorMessage) as any;\n error.finishReason = finishReason;\n error.safetyRatings = candidate?.safetyRatings;\n error.usageMetadata = response.usageMetadata;\n error.promptFeedback = response.promptFeedback;\n throw error;\n }\n\n return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: functionCalls?.[0] || null,\n function_calls: functionCalls || [],\n usage: response.usageMetadata\n ? {\n prompt_tokens: response.usageMetadata.promptTokenCount ?? 0,\n completion_tokens: response.usageMetadata.candidatesTokenCount ?? 0,\n total_tokens: response.usageMetadata.totalTokenCount ?? 0,\n }\n : null,\n };\n}\n\n/**\n * Content violation finish reasons that should trigger circuit breaker behavior.\n * These errors won't resolve with simple retries - the content itself is the problem.\n */\nconst CONTENT_VIOLATION_REASONS = new Set([\"PROHIBITED_CONTENT\", \"SAFETY\"]);\n\n/**\n * Removes inline image data from Google AI messages, preserving text content.\n * Used as a fallback when content violations are detected.\n */\nfunction removeImagesFromGooglePayload(payload: GoogleAIPayload): boolean {\n let removedImages = false;\n\n for (const message of payload.messages) {\n message.parts = message.parts.filter((part) => {\n if (\"inlineData\" in part || \"fileData\" in part) {\n removedImages = true;\n return false;\n }\n return true;\n });\n\n // Ensure message still has content after removing images\n if (message.parts.length === 0) {\n message.parts = [{ text: \"(image removed due to content policy)\" }];\n }\n }\n\n return removedImages;\n}\n\nasync function callGoogleAIWithRetries(\n id: Identifier,\n payload: GoogleAIPayload,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n let hasTriedWithoutImages = false;\n\n return withRetries(id, \"Google AI\", () => callGoogleAI(id, payload), {\n retries,\n onError: (error, attempt) => {\n const errorDetails: Record<string, any> = {\n message: error.message,\n finishReason: error.finishReason,\n modelVersion: error.modelVersion,\n };\n\n if (error.safetyRatings) errorDetails.safetyRatings = error.safetyRatings;\n if (error.usageMetadata) errorDetails.usageMetadata = error.usageMetadata;\n if (error.promptFeedback)\n errorDetails.promptFeedback = error.promptFeedback;\n if (error.status) errorDetails.httpStatus = error.status;\n if (error.code) errorDetails.errorCode = error.code;\n if (error.details) errorDetails.errorDetails = error.details;\n\n const fileUris = payload.messages\n .flatMap((m) => m.parts)\n .filter((p) => \"fileData\" in p)\n .map((p) => (p as any).fileData.fileUri);\n if (fileUris.length) errorDetails.fileUris = fileUris;\n\n logger.error(\n id,\n `Retry #${attempt} error: ${error.message}`,\n errorDetails,\n );\n\n // Circuit breaker: detect content violations and try removing images\n // Check both finishReason (candidate-level) and promptFeedback.blockReason (prompt-level)\n const violationReason =\n (CONTENT_VIOLATION_REASONS.has(error.finishReason) &&\n error.finishReason) ||\n (CONTENT_VIOLATION_REASONS.has(error.promptFeedback?.blockReason) &&\n error.promptFeedback?.blockReason);\n\n if (violationReason) {\n if (!hasTriedWithoutImages) {\n const removedImages = removeImagesFromGooglePayload(payload);\n if (removedImages) {\n logger.log(\n id,\n `Circuit breaker triggered: removing images due to ${violationReason}`,\n );\n hasTriedWithoutImages = true;\n return; // Continue to next retry with images removed\n }\n }\n\n // If we already tried without images or there were no images, fail fast\n logger.error(\n id,\n `Circuit breaker: failing fast due to ${violationReason} (no more fallbacks)`,\n );\n const circuitBreakerError = new Error(\n `Google AI content violation: ${violationReason}. Request cannot succeed with current content.`,\n ) as any;\n circuitBreakerError.finishReason = error.finishReason;\n circuitBreakerError.safetyRatings = error.safetyRatings;\n circuitBreakerError.usageMetadata = error.usageMetadata;\n circuitBreakerError.circuitBreaker = true;\n throw circuitBreakerError;\n }\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// GROQ\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction normalizeMessageContent(\n content: AnthropicAIMessage[\"content\"],\n): string {\n return Array.isArray(content)\n ? content\n .map((c) => (c.type === \"text\" ? c.text : `[${c.type}]`))\n .join(\"\\n\")\n : content;\n}\n\nfunction prepareGroqPayload(payload: GenericPayload): GroqPayload {\n return {\n model: payload.model as GroqModel,\n messages: payload.messages.map((message) => ({\n role: message.role,\n content: normalizeMessageContent(message.content),\n })),\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call\n : { type: \"function\", function: payload.function_call }\n : undefined,\n temperature: payload.temperature,\n };\n}\n\nasync function callGroq(\n id: Identifier,\n payload: GroqPayload,\n): Promise<ParsedResponseMessage> {\n const response = await axios.post(\n \"https://api.groq.com/openai/v1/chat/completions\",\n payload,\n {\n headers: {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${process.env.GROQ_API_KEY}`,\n },\n },\n );\n\n const answer = response.data.choices[0]?.message;\n if (!answer) {\n logger.error(id, \"Missing answer in Groq API response:\", response.data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const functionCalls: FunctionCall[] = [];\n if (answer.tool_calls?.length) {\n for (const tc of answer.tool_calls) {\n functionCalls.push({\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n return {\n role: \"assistant\",\n content: answer.content || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n usage: response.data.usage\n ? {\n prompt_tokens: response.data.usage.prompt_tokens,\n completion_tokens: response.data.usage.completion_tokens,\n total_tokens: response.data.usage.total_tokens,\n }\n : null,\n };\n}\n\nasync function callGroqWithRetries(\n id: Identifier,\n payload: GroqPayload,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n return withRetries(id, \"Groq\", () => callGroq(id, payload), { retries });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MAIN ENTRY POINT\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction isAnthropicPayload(payload: GenericPayload): boolean {\n return Object.values(ClaudeModel).includes(payload.model as ClaudeModel);\n}\n\nfunction isOpenAiPayload(payload: GenericPayload): boolean {\n return Object.values(GPTModel).includes(payload.model as GPTModel);\n}\n\nfunction isGroqPayload(payload: GenericPayload): boolean {\n return Object.values(GroqModel).includes(payload.model as GroqModel);\n}\n\nfunction isGoogleAIPayload(payload: GenericPayload): boolean {\n return Object.values(GeminiModel).includes(payload.model as GeminiModel);\n}\n\nexport async function callWithRetries(\n id: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000,\n): Promise<ParsedResponseMessage> {\n try {\n if (isAnthropicPayload(aiPayload)) {\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(id, aiPayload),\n aiConfig as AnthropicAIConfig,\n retries,\n );\n }\n\n if (isOpenAiPayload(aiPayload)) {\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(id, aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs,\n );\n }\n\n if (isGroqPayload(aiPayload)) {\n return await callGroqWithRetries(\n id,\n prepareGroqPayload(aiPayload),\n retries,\n );\n }\n\n if (isGoogleAIPayload(aiPayload)) {\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(id, aiPayload),\n retries,\n );\n }\n\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n } catch (error) {\n if (aiPayload.fallbackModel) {\n logger.error(\n id,\n `Primary model ${aiPayload.model} failed, falling back to ${aiPayload.fallbackModel}`,\n {\n error: error instanceof Error ? error.message : error,\n cause:\n error instanceof Error && (error as any).cause instanceof Error\n ? (error as any).cause.message\n : undefined,\n },\n );\n return callWithRetries(\n id,\n {\n ...aiPayload,\n model: aiPayload.fallbackModel,\n fallbackModel: undefined,\n },\n aiConfig,\n retries,\n chunkTimeoutMs,\n );\n }\n throw error;\n }\n}\n","export enum ClaudeModel {\n HAIKU_3 = \"claude-3-haiku-20240307\",\n SONNET_3 = \"claude-3-sonnet-20240229\",\n OPUS_3 = \"claude-3-opus-20240229\",\n HAIKU_3_5 = \"claude-3-5-haiku-20241022\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\n OPUS_4_1 = \"claude-opus-4-1\",\n HAIKU_4_5 = \"claude-haiku-4-5\",\n SONNET_4_5 = \"claude-sonnet-4-5\",\n OPUS_4_5 = \"claude-opus-4-5\",\n}\n\nexport enum GPTModel {\n GPT35_0613 = \"gpt-3.5-turbo-0613\",\n GPT35_0613_16K = \"gpt-3.5-turbo-16k-0613\",\n GPT35_0125 = \"gpt-3.5-turbo-0125\",\n GPT4_1106_PREVIEW = \"gpt-4-1106-preview\",\n GPT4_0125_PREVIEW = \"gpt-4-0125-preview\",\n GPT4_0409 = \"gpt-4-turbo-2024-04-09\",\n GPT4O = \"gpt-4o\",\n GPT4O_MINI = \"gpt-4o-mini\",\n O1_PREVIEW = \"o1-preview\",\n O1_MINI = \"o1-mini\",\n O3_MINI = \"o3-mini\",\n GPT4_1 = \"gpt-4.1\",\n GPT4_1_MINI = \"gpt-4.1-mini\",\n GPT4_1_NANO = \"gpt-4.1-nano\",\n GPT5 = \"gpt-5\",\n GPT5_MINI = \"gpt-5-mini\",\n}\n\nexport enum GroqModel {\n LLAMA_3_70B_8192 = \"llama3-70b-8192\",\n LLAMA_3_3_70B_VERSATILE = \"llama-3.3-70b-versatile\",\n QWEN3_32B = \"qwen/qwen3-32b\",\n DEEPSEEK_R1_DISTILL_LLAMA_70B = \"deepseek-r1-distill-llama-70b\",\n}\n\nexport enum GeminiModel {\n GEMINI_1_5_PRO = \"gemini-1.5-pro-latest\",\n GEMINI_EXP_1206 = \"gemini-exp-1206\",\n GEMINI_2_0_FLASH = \"gemini-2.0-flash\",\n GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION = \"gemini-2.0-flash-exp-image-generation\",\n GEMINI_2_0_FLASH_THINKING_EXP = \"gemini-2.0-flash-thinking-exp\",\n GEMINI_2_0_FLASH_THINKING_EXP_01_21 = \"gemini-2.0-flash-thinking-exp-01-21\",\n GEMINI_2_5_FLASH_PREVIEW_04_17 = \"gemini-2.5-flash-preview-04-17\",\n GEMINI_3_FLASH_PREVIEW = \"gemini-3-flash-preview\",\n GEMINI_3_1_FLASH_LITE_PREVIEW = \"gemini-3.1-flash-lite-preview\",\n}\n\nexport interface GenericError {\n message: string;\n}\n\nexport enum ContentType {\n TEXT = \"text\",\n ATTACHMENT = \"attachment\",\n}\n\nexport type AIChainResponse = {\n content: string | null;\n contentType?: ContentType;\n functionCalls: FunctionCall[];\n};\n\nexport interface GenericMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp?: string;\n files?: File[];\n functionCalls?: FunctionCall[];\n}\n\nexport interface File {\n mimeType: string;\n url?: string;\n data?: string;\n}\n\nexport interface OpenAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | OpenAIContentBlock[];\n}\n\nexport type OpenAIContentBlock =\n | OpenAITextContentBlock\n | OpenAIImageContentBlock\n | OpenAIAudioContentBlock;\n\nexport interface OpenAITextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface OpenAIImageContentBlock {\n type: \"image_url\";\n image_url: {\n url: string; // URL to the image, can also be a base64 string\n };\n}\n\nexport interface OpenAIAudioContentBlock {\n type: \"audio_url\";\n audio_url: {\n url: string; // URL to the audio, can also be a base64 string\n };\n}\n\nexport interface AnthropicAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | AnthropicContentBlock[];\n}\n\nexport type AnthropicContentBlock =\n | AnthropicTextContentBlock\n | AnthropicImageContentBlock;\n\nexport interface AnthropicTextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface AnthropicImageContentBlock {\n type: \"image\";\n source: {\n type: \"base64\";\n media_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n data: string; // Must be a base64 string\n };\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface ParsedResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: FunctionCall | null;\n function_calls: FunctionCall[];\n files: File[];\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n } | null;\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIConfig {\n service: \"azure\" | \"openai\";\n apiKey: string;\n baseUrl: string;\n orgId?: string;\n modelConfigMap?: Record<\n GPTModel,\n {\n resource: string;\n deployment: string;\n apiVersion: string;\n apiKey: string;\n endpoint?: string;\n }\n >;\n}\n\nexport interface AnthropicAIConfig {\n service: \"anthropic\" | \"bedrock\";\n}\n\nexport interface FunctionDefinition {\n name: string;\n description?: string;\n parameters: Record<string, any>;\n}\n\ninterface FunctionWrapped {\n type: \"function\";\n function: FunctionDefinition;\n}\n\nexport interface GroqPayload {\n model: GroqModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n temperature?: number;\n\n functions?: any[]; // Deprecate this\n}\n\nexport interface OpenAIPayload {\n model: GPTModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n}\n\nexport interface AnthropicAIPayload {\n model: ClaudeModel;\n messages: AnthropicAIMessage[];\n functions?: any[]; // TODO type this JSON schema\n temperature?: number;\n system?: string;\n}\n\nexport interface GoogleAITextPart {\n text: string;\n}\n\nexport interface GoogleAIInlineDataPart {\n inlineData: {\n mimeType: string;\n data: string;\n };\n}\n\nexport interface GoogleAIFileDataPart {\n fileData: {\n mimeType: string;\n fileUri: string;\n };\n}\n\nexport type GoogleAIPart = GoogleAITextPart | GoogleAIInlineDataPart | GoogleAIFileDataPart;\nexport interface GoogleAIMessage {\n role: \"user\" | \"model\";\n parts: GoogleAIPart[];\n}\nexport interface GoogleAIPayload {\n model: GeminiModel;\n messages: GoogleAIMessage[];\n tools?: {\n functionDeclarations: FunctionDefinition[];\n };\n systemInstruction?: string;\n}\n\nexport type AnyModel = GPTModel | ClaudeModel | GroqModel | GeminiModel;\n\nexport interface GenericPayload {\n model: AnyModel;\n messages: GenericMessage[];\n functions?: FunctionDefinition[];\n function_call?: \"none\" | \"auto\" | { name: string };\n temperature?: number;\n fallbackModel?: AnyModel;\n}\n\nexport interface OpenAIBody {\n choices: {\n message: OpenAIResponseMessage;\n }[];\n error?: {\n code: string;\n };\n usage: {\n completion_tokens: number;\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n","type LogLevel = \"LOG\" | \"WARN\" | \"ERROR\";\nexport type Identifier = string | string[];\n\nfunction formatIdentifier(identifier: Identifier): string {\n if (Array.isArray(identifier)) {\n return identifier.map((id) => `[${id}]`).join(\" \");\n }\n return `[${identifier}]`;\n}\n\nfunction formatMessage(\n level: LogLevel,\n identifier: Identifier,\n message: string\n): string {\n return `[${level}] ${formatIdentifier(identifier)} ${message}`;\n}\n\nexport function log(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.log(formatMessage(\"LOG\", identifier, message), ...args);\n}\n\nexport function warn(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.warn(formatMessage(\"WARN\", identifier, message), ...args);\n}\n\nexport function error(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.error(formatMessage(\"ERROR\", identifier, message), ...args);\n}\n\nexport default {\n log,\n warn,\n error,\n};\n","export function timeout(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function isHeicImage(name: string, mime?: string): boolean {\n const extension = name.split(\".\").pop()?.toLowerCase() || \"\";\n return (\n [\"heic\", \"heif\", \"heics\"].includes(extension) ||\n !!(\n mime && [\"image/heic\", \"image/heif\", \"image/heic-sequence\"].includes(mime)\n )\n );\n}\n"],"mappings":"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","names":["ClaudeModel","GPTModel","GroqModel","GeminiModel","error","axios","_a","_b"]}
package/dist/index.mjs CHANGED
@@ -42,6 +42,8 @@ var GPTModel = /* @__PURE__ */ ((GPTModel2) => {
42
42
  })(GPTModel || {});
43
43
  var GroqModel = /* @__PURE__ */ ((GroqModel2) => {
44
44
  GroqModel2["LLAMA_3_70B_8192"] = "llama3-70b-8192";
45
+ GroqModel2["LLAMA_3_3_70B_VERSATILE"] = "llama-3.3-70b-versatile";
46
+ GroqModel2["QWEN3_32B"] = "qwen/qwen3-32b";
45
47
  GroqModel2["DEEPSEEK_R1_DISTILL_LLAMA_70B"] = "deepseek-r1-distill-llama-70b";
46
48
  return GroqModel2;
47
49
  })(GroqModel || {});
@@ -171,7 +173,8 @@ function parseStreamedResponse(identifier, paragraph, toolCallAccumulators, allo
171
173
  content: paragraph || null,
172
174
  function_call: functionCalls[0] || null,
173
175
  function_calls: functionCalls,
174
- files: []
176
+ files: [],
177
+ usage: null
175
178
  };
176
179
  }
177
180
  function truncatePayload(payload) {
@@ -343,7 +346,10 @@ async function callOpenAIStream(id, openAiPayload, openAiConfig, chunkTimeoutMs)
343
346
  const { done, value } = await reader.read();
344
347
  clearTimeout(abortTimeout);
345
348
  if (done) {
346
- logger_default.error(id, `Stream ended prematurely after ${chunkIndex + 1} chunks`);
349
+ logger_default.error(
350
+ id,
351
+ `Stream ended prematurely after ${chunkIndex + 1} chunks`
352
+ );
347
353
  throw new Error("Stream error: ended prematurely");
348
354
  }
349
355
  let chunk = new TextDecoder().decode(value);
@@ -448,7 +454,12 @@ async function callOpenAI(id, openAiPayload, openAiConfig) {
448
454
  content: choice.message.content || null,
449
455
  function_call: functionCalls[0] || null,
450
456
  function_calls: functionCalls,
451
- files: []
457
+ files: [],
458
+ usage: data.usage ? {
459
+ prompt_tokens: data.usage.prompt_tokens,
460
+ completion_tokens: data.usage.completion_tokens,
461
+ total_tokens: data.usage.total_tokens
462
+ } : null
452
463
  };
453
464
  }
454
465
  async function callOpenAiWithRetries(id, openAiPayload, openAiConfig, retries = 5, chunkTimeoutMs = 15e3) {
@@ -464,7 +475,12 @@ async function callOpenAiWithRetries(id, openAiPayload, openAiConfig, retries =
464
475
  "OpenAI",
465
476
  async () => {
466
477
  if (useStreaming) {
467
- return callOpenAIStream(id, openAiPayload, openAiConfig, chunkTimeoutMs);
478
+ return callOpenAIStream(
479
+ id,
480
+ openAiPayload,
481
+ openAiConfig,
482
+ chunkTimeoutMs
483
+ );
468
484
  } else {
469
485
  return callOpenAI(id, openAiPayload, openAiConfig);
470
486
  }
@@ -497,7 +513,10 @@ function jigAnthropicMessages(messages) {
497
513
  var _a, _b;
498
514
  let jiggedMessages = messages.slice();
499
515
  if (((_a = jiggedMessages[0]) == null ? void 0 : _a.role) !== "user") {
500
- jiggedMessages = [{ role: "user", content: "..." }, ...jiggedMessages];
516
+ jiggedMessages = [
517
+ { role: "user", content: "..." },
518
+ ...jiggedMessages
519
+ ];
501
520
  }
502
521
  jiggedMessages = jiggedMessages.reduce((acc, message) => {
503
522
  if (acc.length === 0)
@@ -542,24 +561,28 @@ async function prepareAnthropicPayload(_identifier, payload) {
542
561
  for (const file of message.files || []) {
543
562
  if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {
544
563
  if (file.url) {
545
- contentBlocks.push({
546
- type: "image",
547
- source: {
548
- type: "base64",
549
- media_type: "image/png",
550
- data: await getNormalizedBase64PNG(file.url, file.mimeType)
551
- }
552
- });
564
+ if (message.role == "user") {
565
+ contentBlocks.push({
566
+ type: "image",
567
+ source: {
568
+ type: "base64",
569
+ media_type: "image/png",
570
+ data: await getNormalizedBase64PNG(file.url, file.mimeType)
571
+ }
572
+ });
573
+ }
553
574
  contentBlocks.push({ type: "text", text: `Image (${file.url})` });
554
575
  } else if (file.data) {
555
- contentBlocks.push({
556
- type: "image",
557
- source: {
558
- type: "base64",
559
- media_type: file.mimeType,
560
- data: file.data
561
- }
562
- });
576
+ if (message.role == "user") {
577
+ contentBlocks.push({
578
+ type: "image",
579
+ source: {
580
+ type: "base64",
581
+ media_type: file.mimeType,
582
+ data: file.data
583
+ }
584
+ });
585
+ }
563
586
  }
564
587
  } else if (file.url) {
565
588
  contentBlocks.push({
@@ -658,7 +681,11 @@ ${text}` : text;
658
681
  }
659
682
  }
660
683
  if (!textResponse && !functionCalls.length) {
661
- logger_default.error(id, "Missing text & functions in Anthropic API response:", data);
684
+ logger_default.error(
685
+ id,
686
+ "Missing text & functions in Anthropic API response:",
687
+ data
688
+ );
662
689
  throw new Error("Missing text & functions in Anthropic API response");
663
690
  }
664
691
  return {
@@ -666,19 +693,32 @@ ${text}` : text;
666
693
  content: textResponse,
667
694
  function_call: functionCalls[0] || null,
668
695
  function_calls: functionCalls,
669
- files: []
696
+ files: [],
697
+ usage: data.usage ? {
698
+ prompt_tokens: data.usage.input_tokens,
699
+ completion_tokens: data.usage.output_tokens,
700
+ total_tokens: data.usage.input_tokens + data.usage.output_tokens
701
+ } : null
670
702
  };
671
703
  }
672
704
  async function callAnthropicWithRetries(id, payload, config, retries = 5) {
673
- return withRetries(id, "Anthropic", () => callAnthropic(id, payload, config), {
674
- retries
675
- });
705
+ return withRetries(
706
+ id,
707
+ "Anthropic",
708
+ () => callAnthropic(id, payload, config),
709
+ {
710
+ retries
711
+ }
712
+ );
676
713
  }
677
714
  function jigGoogleMessages(messages) {
678
715
  var _a, _b;
679
716
  let jiggedMessages = messages.slice();
680
717
  if (((_a = jiggedMessages[0]) == null ? void 0 : _a.role) === "model") {
681
- jiggedMessages = [{ role: "user", parts: [{ text: "..." }] }, ...jiggedMessages];
718
+ jiggedMessages = [
719
+ { role: "user", parts: [{ text: "..." }] },
720
+ ...jiggedMessages
721
+ ];
682
722
  }
683
723
  jiggedMessages = jiggedMessages.reduce((acc, message) => {
684
724
  if (acc.length === 0)
@@ -750,7 +790,7 @@ async function prepareGoogleAIPayload(_identifier, payload) {
750
790
  return preparedPayload;
751
791
  }
752
792
  async function callGoogleAI(id, payload) {
753
- var _a, _b, _c, _d, _e, _f;
793
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
754
794
  const googleMessages = jigGoogleMessages(payload.messages);
755
795
  const history = googleMessages.slice(0, -1);
756
796
  const lastMessage = googleMessages.slice(-1)[0];
@@ -814,13 +854,15 @@ async function callGoogleAI(id, payload) {
814
854
  content: text || null,
815
855
  files,
816
856
  function_call: (functionCalls == null ? void 0 : functionCalls[0]) || null,
817
- function_calls: functionCalls || []
857
+ function_calls: functionCalls || [],
858
+ usage: response.usageMetadata ? {
859
+ prompt_tokens: (_g = response.usageMetadata.promptTokenCount) != null ? _g : 0,
860
+ completion_tokens: (_h = response.usageMetadata.candidatesTokenCount) != null ? _h : 0,
861
+ total_tokens: (_i = response.usageMetadata.totalTokenCount) != null ? _i : 0
862
+ } : null
818
863
  };
819
864
  }
820
- var CONTENT_VIOLATION_REASONS = /* @__PURE__ */ new Set([
821
- "PROHIBITED_CONTENT",
822
- "SAFETY"
823
- ]);
865
+ var CONTENT_VIOLATION_REASONS = /* @__PURE__ */ new Set(["PROHIBITED_CONTENT", "SAFETY"]);
824
866
  function removeImagesFromGooglePayload(payload) {
825
867
  let removedImages = false;
826
868
  for (const message of payload.messages) {
@@ -860,7 +902,14 @@ async function callGoogleAIWithRetries(id, payload, retries = 5) {
860
902
  errorDetails.errorCode = error2.code;
861
903
  if (error2.details)
862
904
  errorDetails.errorDetails = error2.details;
863
- logger_default.error(id, `Retry #${attempt} error: ${error2.message}`, errorDetails);
905
+ const fileUris = payload.messages.flatMap((m) => m.parts).filter((p) => "fileData" in p).map((p) => p.fileData.fileUri);
906
+ if (fileUris.length)
907
+ errorDetails.fileUris = fileUris;
908
+ logger_default.error(
909
+ id,
910
+ `Retry #${attempt} error: ${error2.message}`,
911
+ errorDetails
912
+ );
864
913
  const violationReason = CONTENT_VIOLATION_REASONS.has(error2.finishReason) && error2.finishReason || CONTENT_VIOLATION_REASONS.has((_a = error2.promptFeedback) == null ? void 0 : _a.blockReason) && ((_b = error2.promptFeedback) == null ? void 0 : _b.blockReason);
865
914
  if (violationReason) {
866
915
  if (!hasTriedWithoutImages) {
@@ -940,7 +989,12 @@ async function callGroq(id, payload) {
940
989
  content: answer.content || null,
941
990
  function_call: functionCalls[0] || null,
942
991
  function_calls: functionCalls,
943
- files: []
992
+ files: [],
993
+ usage: response.data.usage ? {
994
+ prompt_tokens: response.data.usage.prompt_tokens,
995
+ completion_tokens: response.data.usage.completion_tokens,
996
+ total_tokens: response.data.usage.total_tokens
997
+ } : null
944
998
  };
945
999
  }
946
1000
  async function callGroqWithRetries(id, payload, retries = 5) {
@@ -978,7 +1032,11 @@ async function callWithRetries(id, aiPayload, aiConfig, retries = 5, chunkTimeou
978
1032
  );
979
1033
  }
980
1034
  if (isGroqPayload(aiPayload)) {
981
- return await callGroqWithRetries(id, prepareGroqPayload(aiPayload), retries);
1035
+ return await callGroqWithRetries(
1036
+ id,
1037
+ prepareGroqPayload(aiPayload),
1038
+ retries
1039
+ );
982
1040
  }
983
1041
  if (isGoogleAIPayload(aiPayload)) {
984
1042
  return await callGoogleAIWithRetries(
@@ -990,13 +1048,21 @@ async function callWithRetries(id, aiPayload, aiConfig, retries = 5, chunkTimeou
990
1048
  throw new Error("Invalid AI payload: Unknown model type.");
991
1049
  } catch (error2) {
992
1050
  if (aiPayload.fallbackModel) {
993
- logger_default.log(
1051
+ logger_default.error(
994
1052
  id,
995
- `Primary model ${aiPayload.model} failed, falling back to ${aiPayload.fallbackModel}`
1053
+ `Primary model ${aiPayload.model} failed, falling back to ${aiPayload.fallbackModel}`,
1054
+ {
1055
+ error: error2 instanceof Error ? error2.message : error2,
1056
+ cause: error2 instanceof Error && error2.cause instanceof Error ? error2.cause.message : void 0
1057
+ }
996
1058
  );
997
1059
  return callWithRetries(
998
1060
  id,
999
- { ...aiPayload, model: aiPayload.fallbackModel, fallbackModel: void 0 },
1061
+ {
1062
+ ...aiPayload,
1063
+ model: aiPayload.fallbackModel,
1064
+ fallbackModel: void 0
1065
+ },
1000
1066
  aiConfig,
1001
1067
  retries,
1002
1068
  chunkTimeoutMs