190proof 1.0.72 → 1.0.73

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 CHANGED
@@ -144,7 +144,11 @@ function parseStreamedResponse(identifier, paragraph, functionCallName, function
144
144
  arguments: JSON.parse(functionCallArgs)
145
145
  };
146
146
  } catch (error2) {
147
- logger_default.error(identifier, "Error parsing functionCallArgs:", functionCallArgs);
147
+ logger_default.error(
148
+ identifier,
149
+ "Error parsing functionCallArgs:",
150
+ functionCallArgs
151
+ );
148
152
  throw error2;
149
153
  }
150
154
  }
@@ -195,7 +199,10 @@ async function callOpenAiWithRetries(identifier, openAiPayload, openAiConfig, re
195
199
  );
196
200
  const errorCode = (_b = error2.data) == null ? void 0 : _b.code;
197
201
  if (errorCode === "content_policy_violation") {
198
- logger_default.log(identifier, "Removing images due to content policy violation error");
202
+ logger_default.log(
203
+ identifier,
204
+ "Removing images due to content policy violation error"
205
+ );
199
206
  openAiPayload.messages.forEach((message) => {
200
207
  if (Array.isArray(message.content)) {
201
208
  message.content = message.content.filter(
@@ -205,18 +212,27 @@ async function callOpenAiWithRetries(identifier, openAiPayload, openAiConfig, re
205
212
  });
206
213
  }
207
214
  if (i >= 2 && (openAiConfig == null ? void 0 : openAiConfig.service) === "azure" && errorCode === "content_filter") {
208
- logger_default.log(identifier, "Switching to OpenAI service due to content filter error");
215
+ logger_default.log(
216
+ identifier,
217
+ "Switching to OpenAI service due to content filter error"
218
+ );
209
219
  openAiConfig.service = "openai";
210
220
  }
211
221
  if (i === 3) {
212
222
  if ((openAiConfig == null ? void 0 : openAiConfig.service) === "azure") {
213
- logger_default.log(identifier, "Switching to OpenAI service due to Azure service error");
223
+ logger_default.log(
224
+ identifier,
225
+ "Switching to OpenAI service due to Azure service error"
226
+ );
214
227
  openAiConfig.service = "openai";
215
228
  }
216
229
  }
217
230
  if (i === 4) {
218
231
  if (openAiPayload.tools) {
219
- logger_default.log(identifier, "Switching to no tool choice due to persistent error");
232
+ logger_default.log(
233
+ identifier,
234
+ "Switching to no tool choice due to persistent error"
235
+ );
220
236
  openAiPayload.tool_choice = "none";
221
237
  }
222
238
  }
@@ -267,7 +283,11 @@ async function callOpenAIStream(identifier, openAiPayload, openAiConfig, chunkTi
267
283
  });
268
284
  const parsedPayload = JSON.parse(stringifiedPayload);
269
285
  } catch (error2) {
270
- logger_default.error(identifier, "Stream error: Azure OpenAI JSON parsing error:", error2);
286
+ logger_default.error(
287
+ identifier,
288
+ "Stream error: Azure OpenAI JSON parsing error:",
289
+ error2
290
+ );
271
291
  }
272
292
  response = await fetch(endpoint, {
273
293
  method: "POST",
@@ -323,7 +343,10 @@ async function callOpenAIStream(identifier, openAiPayload, openAiConfig, chunkTi
323
343
  const { done, value } = await reader.read();
324
344
  clearTimeout(abortTimeout2);
325
345
  if (done) {
326
- logger_default.error(identifier, `Stream ended prematurely after ${chunkIndex + 1} chunks`);
346
+ logger_default.error(
347
+ identifier,
348
+ `Stream ended prematurely after ${chunkIndex + 1} chunks`
349
+ );
327
350
  throw new Error("Stream error: ended prematurely");
328
351
  }
329
352
  let chunk = new TextDecoder().decode(value);
@@ -605,7 +628,11 @@ async function callAnthropic(identifier, AiPayload, AiConfig) {
605
628
  /<thinking>|<\/thinking>|<answer>|<\/answer>/gs,
606
629
  ""
607
630
  );
608
- logger_default.log(identifier, "No text in answer, returning text within tags:", text);
631
+ logger_default.log(
632
+ identifier,
633
+ "No text in answer, returning text within tags:",
634
+ text
635
+ );
609
636
  }
610
637
  if (textResponse) {
611
638
  textResponse += `
@@ -623,7 +650,11 @@ ${text}`;
623
650
  }
624
651
  }
625
652
  if (!textResponse && !functionCalls.length) {
626
- logger_default.error(identifier, "Missing text & fns in Anthropic API response:", data);
653
+ logger_default.error(
654
+ identifier,
655
+ "Missing text & fns in Anthropic API response:",
656
+ data
657
+ );
627
658
  throw new Error("Missing text & fns in Anthropic API response");
628
659
  }
629
660
  return {
@@ -733,7 +764,10 @@ async function prepareGoogleAIPayload(payload) {
733
764
  }
734
765
  for (const file of message.files || []) {
735
766
  if (!((_a = file.mimeType) == null ? void 0 : _a.startsWith("image"))) {
736
- logger_default.warn("payload", "Google AI API does not support non-image file types. Skipping file.");
767
+ logger_default.warn(
768
+ "payload",
769
+ "Google AI API does not support non-image file types. Skipping file."
770
+ );
737
771
  continue;
738
772
  }
739
773
  if (file.url) {
@@ -771,7 +805,6 @@ async function prepareGoogleAIPayload(payload) {
771
805
  }
772
806
  async function callGoogleAI(identifier, payload) {
773
807
  var _a, _b, _c;
774
- logger_default.log(identifier, "Calling Google AI API");
775
808
  const googleMessages = jigGoogleMessages(payload.messages);
776
809
  const history = googleMessages.slice(0, -1);
777
810
  const lastMessage = googleMessages.slice(-1)[0];
@@ -815,7 +848,11 @@ async function callGoogleAI(identifier, payload) {
815
848
  };
816
849
  });
817
850
  if (!text && !(parsedFunctionCalls == null ? void 0 : parsedFunctionCalls.length) && !files.length) {
818
- logger_default.error(identifier, "Missing text & fns in Google AI API response:", response);
851
+ logger_default.error(
852
+ identifier,
853
+ "Missing text & fns in Google AI API response:",
854
+ response
855
+ );
819
856
  throw new Error("Missing text & fns in Google AI API response");
820
857
  }
821
858
  return {
@@ -846,7 +883,6 @@ async function callGoogleAIWithRetries(identifier, payload, retries = 5) {
846
883
  async function callWithRetries(identifier, aiPayload, aiConfig, retries = 5, chunkTimeoutMs = 15e3) {
847
884
  const id = identifier;
848
885
  if (isAnthropicPayload(aiPayload)) {
849
- logger_default.log(id, "Delegating call to Anthropic API");
850
886
  return await callAnthropicWithRetries(
851
887
  id,
852
888
  await prepareAnthropicPayload(aiPayload),
@@ -854,7 +890,6 @@ async function callWithRetries(identifier, aiPayload, aiConfig, retries = 5, chu
854
890
  retries
855
891
  );
856
892
  } else if (isOpenAiPayload(aiPayload)) {
857
- logger_default.log(id, "Delegating call to OpenAI API");
858
893
  return await callOpenAiWithRetries(
859
894
  id,
860
895
  await prepareOpenAIPayload(aiPayload),
@@ -863,13 +898,8 @@ async function callWithRetries(identifier, aiPayload, aiConfig, retries = 5, chu
863
898
  chunkTimeoutMs
864
899
  );
865
900
  } else if (isGroqPayload(aiPayload)) {
866
- logger_default.log(id, "Delegating call to Groq API");
867
- return await callGroqWithRetries(
868
- id,
869
- await prepareGroqPayload(aiPayload)
870
- );
901
+ return await callGroqWithRetries(id, await prepareGroqPayload(aiPayload));
871
902
  } else if (isGoogleAIPayload(aiPayload)) {
872
- logger_default.log(id, "Delegating call to Google AI API");
873
903
  return await callGoogleAIWithRetries(
874
904
  id,
875
905
  await prepareGoogleAIPayload(aiPayload),
@@ -904,7 +934,10 @@ async function prepareAnthropicPayload(payload) {
904
934
  }
905
935
  for (const file of message.files || []) {
906
936
  if (!((_a = file.mimeType) == null ? void 0 : _a.startsWith("image"))) {
907
- logger_default.warn("payload", "Anthropic API does not support non-image file types. Skipping file.");
937
+ logger_default.warn(
938
+ "payload",
939
+ "Anthropic API does not support non-image file types. Skipping file."
940
+ );
908
941
  continue;
909
942
  }
910
943
  if (file.url) {
@@ -994,7 +1027,11 @@ async function prepareOpenAIPayload(payload) {
994
1027
  });
995
1028
  }
996
1029
  } else {
997
- logger_default.warn("payload", "Skipping file in message. File or image type not supported by OpenAI API:", file.mimeType);
1030
+ logger_default.warn(
1031
+ "payload",
1032
+ "Skipping file in message. File or image type not supported by OpenAI API:",
1033
+ file.mimeType
1034
+ );
998
1035
  }
999
1036
  }
1000
1037
  preparedPayload.messages.push({
@@ -1074,7 +1111,11 @@ async function callGroqWithRetries(identifier, payload, retries = 5) {
1074
1111
  lastResponse = await callGroq(identifier, payload);
1075
1112
  return lastResponse;
1076
1113
  } catch (e) {
1077
- logger_default.error(identifier, `Retry #${i} error: ${e.message}`, ((_a = e.response) == null ? void 0 : _a.data) || e);
1114
+ logger_default.error(
1115
+ identifier,
1116
+ `Retry #${i} error: ${e.message}`,
1117
+ ((_a = e.response) == null ? void 0 : _a.data) || e
1118
+ );
1078
1119
  await timeout(125 * i);
1079
1120
  }
1080
1121
  }
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} 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\";\nconst { GoogleGenerativeAI } = require(\"@google/generative-ai\");\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} from \"./interfaces\";\n\nfunction parseStreamedResponse(\n identifier: Identifier,\n paragraph: string,\n functionCallName: string,\n functionCallArgs: string,\n allowedFunctionNames: Set<string> | null\n): ParsedResponseMessage {\n let functionCall: ParsedResponseMessage[\"function_call\"] = null;\n if (functionCallName && functionCallArgs) {\n if (allowedFunctionNames && !allowedFunctionNames.has(functionCallName)) {\n throw new Error(\n \"Stream error: received function call with unknown name: \" +\n functionCallName\n );\n }\n\n try {\n functionCall = {\n name: functionCallName,\n arguments: JSON.parse(functionCallArgs),\n };\n } catch (error) {\n logger.error(identifier, \"Error parsing functionCallArgs:\", functionCallArgs);\n throw error;\n }\n }\n\n if (!paragraph && !functionCall) {\n logger.error(\n identifier,\n \"Stream error: received message without content or function_call, raw:\",\n JSON.stringify({ paragraph, functionCallName, functionCallArgs })\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: functionCall,\n files: [],\n };\n}\n\nasync function callOpenAiWithRetries(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n logger.log(\n identifier,\n \"Calling OpenAI API with retries:\",\n openAiConfig?.service,\n openAiPayload.model\n );\n\n let errorObj: any;\n for (let i = 0; i <= retries; i++) {\n try {\n const timerId = `timer:${identifier}:${Date.now()}:callOpenAi:${\n openAiConfig?.service\n }-${openAiPayload.model}-${openAiConfig?.orgId}`;\n\n if (\n openAiPayload.model === GPTModel.O1_MINI ||\n openAiPayload.model === GPTModel.O1_PREVIEW\n ) {\n return await callOpenAI(identifier, openAiPayload, openAiConfig);\n } else {\n return await callOpenAIStream(\n identifier,\n openAiPayload,\n openAiConfig,\n chunkTimeoutMs\n );\n }\n } catch (error: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${error.message}`,\n error.response?.data || error.data || error\n );\n\n const errorCode = error.data?.code;\n\n // Usually due to image content, we get a policy violation error\n if (errorCode === \"content_policy_violation\") {\n logger.log(identifier, \"Removing images due to content policy violation error\");\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 // on 2nd or more retries\n // if Azure content policy error is persistent\n if (\n i >= 2 &&\n openAiConfig?.service === \"azure\" &&\n errorCode === \"content_filter\"\n ) {\n logger.log(identifier, \"Switching to OpenAI service due to content filter error\");\n openAiConfig.service = \"openai\"; // Move to OpenAI, failed due to Azure content policy\n }\n\n // on 3rd retry\n if (i === 3) {\n if (openAiConfig?.service === \"azure\") {\n logger.log(identifier, \"Switching to OpenAI service due to Azure service error\");\n openAiConfig.service = \"openai\";\n }\n }\n\n // on 4th retry\n if (i === 4) {\n // abort function calling, e.g. stubborn `python` function call case\n if (openAiPayload.tools) {\n logger.log(identifier, \"Switching to no tool choice due to persistent error\");\n openAiPayload.tool_choice = \"none\";\n }\n }\n\n await timeout(250);\n }\n }\n\n logger.error(\n identifier,\n `Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`,\n errorObj\n );\n throw new Error(\n `${identifier}: Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`\n );\n}\n\nasync function callOpenAIStream(\n identifier: 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 if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n const controller = new AbortController();\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: true,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n } catch (error) {\n logger.error(identifier, \"Stream error: Azure OpenAI JSON parsing error:\", error);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n }\n\n if (response.body) {\n let rawStreamedBody = \"\";\n let paragraph = \"\";\n let functionCallName = \"\";\n let functionCallArgs = \"\";\n\n const reader = response.body.getReader();\n\n let partialChunk = \"\";\n let abortTimeout: NodeJS.Timeout | null = null;\n const startAbortTimeout = () => {\n abortTimeout && clearTimeout(abortTimeout);\n return setTimeout(() => {\n logger.error(identifier, `Stream timeout after ${chunkTimeoutMs}ms`);\n controller.abort();\n }, chunkTimeoutMs);\n };\n\n let chunkIndex = -1;\n while (true) {\n chunkIndex++;\n const abortTimeout = startAbortTimeout();\n const { done, value } = await reader.read();\n clearTimeout(abortTimeout);\n\n if (done) {\n logger.error(identifier, `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 rawStreamedBody += chunk + \"\\n\";\n if (partialChunk) {\n chunk = partialChunk + chunk;\n partialChunk = \"\";\n }\n let jsonStrings = chunk.split(/^data: /gm);\n\n for (let jsonString of jsonStrings) {\n if (!jsonString) {\n continue;\n }\n\n if (jsonString.includes(\"[DONE]\")) {\n try {\n return parseStreamedResponse(\n identifier,\n paragraph,\n functionCallName,\n functionCallArgs,\n functionNames\n );\n } catch (error) {\n logger.error(identifier, \"Stream error: parsing response\");\n throw error;\n }\n }\n\n let json;\n try {\n json = JSON.parse(jsonString.trim());\n } catch (error: any) {\n partialChunk = jsonString; // We're assuming any JSON parsing error means we got a non-terminated JSON for a chunk\n continue;\n }\n\n if (!json.choices || !json.choices.length) {\n if (json.error) {\n logger.error(identifier, \"Stream error: OpenAI error:\", 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(identifier, \"Stream error: no choices in JSON:\", json);\n }\n continue;\n }\n\n const dToolCall:\n | {\n index?: number;\n function?: {\n name?: string;\n arguments?: string;\n };\n }\n | undefined = json.choices?.[0]?.delta?.tool_calls?.[0];\n if (dToolCall) {\n const toolCallIndex = dToolCall.index || 0;\n // TODO: handle multiple function calls in response\n if (toolCallIndex === 0) {\n const dFn = dToolCall.function || {};\n if (dFn.name) functionCallName += dFn.name;\n if (dFn.arguments) functionCallArgs += dFn.arguments;\n }\n }\n\n const text = json.choices?.[0]?.delta?.content;\n if (text) {\n paragraph += text;\n }\n }\n }\n } else {\n throw new Error(\"Stream error: no response body\");\n }\n}\n\nasync function callOpenAI(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined\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 if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: false,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n // You can use parsedPayload if needed\n } catch (error) {\n logger.error(identifier, \"OpenAI JSON parsing error:\", error);\n throw error;\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n }\n\n if (!response.ok) {\n const errorData = await response.json();\n logger.error(identifier, \"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 || !data.choices.length) {\n if (data.error) {\n logger.error(identifier, \"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 const functionCall = choice.function_call\n ? {\n name: choice.function_call.name,\n arguments: JSON.parse(choice.function_call.arguments),\n }\n : null;\n\n return {\n role: \"assistant\",\n content: choice.message.content || null,\n function_call: functionCall,\n files: [],\n };\n}\n\nfunction truncatePayload(payload: OpenAIPayload): string {\n return JSON.stringify(\n {\n ...payload,\n messages: payload.messages.map((message) => {\n if (typeof message.content === \"string\") {\n message.content = message.content.slice(0, 100);\n } else if (Array.isArray(message.content)) {\n message.content = message.content.map((block) => {\n if (block.type === \"image_url\") {\n block.image_url.url = block.image_url.url.slice(0, 100);\n }\n return block;\n });\n }\n\n return message;\n }),\n },\n null,\n 2\n );\n}\n\nasync function callAnthropicWithRetries(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig,\n attempts = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Anthropic API with retries\");\n let lastResponse;\n for (let i = 0; i < attempts; i++) {\n try {\n lastResponse = await callAnthropic(identifier, AiPayload, AiConfig);\n return lastResponse;\n } catch (e: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${e.message}`,\n e.response?.data || e\n );\n\n if (e.response?.data?.error?.type === \"rate_limit_error\") {\n // TODO: upgrade model or fallback to bedrock\n }\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Anthropic API after ${attempts} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\n}\n\nasync function callAnthropic(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig\n): Promise<ParsedResponseMessage> {\n const anthropicMessages = jigAnthropicMessages(AiPayload.messages);\n\n let data;\n let response;\n if (AiConfig?.service === \"bedrock\") {\n // DOES NOT SUPPORT TOOLS YET\n const AWS_REGION = \"us-east-1\";\n const MODEL_ID = \"anthropic.claude-3-haiku-20240307-v1:0\";\n\n // set in environment\n // process.env.AWS_ACCESS_KEY_ID = AWS_ACCESS_KEY_ID;\n // process.env.AWS_SECRET_ACCESS_KEY = AWS_SECRET_ACCESS_KEY;\n\n const client = new BedrockRuntimeClient({ region: AWS_REGION });\n const payload = {\n anthropic_version: \"bedrock-2023-05-31\",\n max_tokens: 4096,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n };\n\n const response = await client.send(\n new InvokeModelCommand({\n contentType: \"application/json\",\n body: JSON.stringify(payload),\n modelId: MODEL_ID,\n })\n );\n\n const decodedResponseBody = new TextDecoder().decode(response.body);\n data = JSON.parse(decodedResponseBody);\n } else {\n // default to anthropic\n const response = await axios.post(\n \"https://api.anthropic.com/v1/messages\",\n {\n model: AiPayload.model,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n temperature: AiPayload.temperature,\n system: AiPayload.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\n data = response.data;\n }\n\n const answers = data.content;\n\n if (!answers[0]) {\n logger.error(identifier, \"Missing answer in Anthropic API:\", data);\n throw new Error(\"Missing answer in Anthropic API\");\n }\n\n let textResponse = \"\";\n let functionCalls: any[] = [];\n for (const answer of answers) {\n if (!answer.type) {\n logger.error(identifier, \"Missing answer type in Anthropic API:\", data);\n throw new Error(\"Missing answer type in Anthropic API\");\n }\n\n let text = \"\";\n if (answer.type === \"text\") {\n text = answer.text\n .replace(/<thinking>.*?<\\/thinking>/gs, \"\")\n .replace(/<answer>|<\\/answer>/gs, \"\")\n .trim();\n\n if (!text) {\n // remove the tags and return the text within\n text = answer.text.replace(\n /<thinking>|<\\/thinking>|<answer>|<\\/answer>/gs,\n \"\"\n );\n logger.log(identifier, \"No text in answer, returning text within tags:\", text);\n }\n\n if (textResponse) {\n textResponse += `\\n\\n${text}`;\n } else {\n textResponse = text;\n }\n } else if (answer.type === \"tool_use\") {\n const call = {\n name: answer.name,\n arguments: answer.input,\n };\n functionCalls.push(call);\n }\n }\n\n if (!textResponse && !functionCalls.length) {\n logger.error(identifier, \"Missing text & fns in Anthropic API response:\", data);\n throw new Error(\"Missing text & fns in Anthropic API response\");\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCalls[0],\n files: [],\n };\n}\n\nfunction jigAnthropicMessages(\n messages: AnthropicAIMessage[]\n): AnthropicAIMessage[] {\n // Takes a list if messages each with a role and content\n // Assumes no system messages are present\n\n let jiggedMessages = messages.slice();\n\n // If the first message is not user, add an empty user message at the start\n if (jiggedMessages[0]?.role !== \"user\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n content: \"...\",\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their content\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n // Combine content of messages with the same 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 // If last message in array is assistant, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"assistant\") {\n jiggedMessages.push({\n role: \"user\",\n content: \"...\",\n });\n }\n\n return jiggedMessages;\n}\n\nfunction jigGoogleMessages(messages: GoogleAIMessage[]): GoogleAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // If the first message is model, add an empty user message at the start\n if (jiggedMessages[0]?.role === \"model\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n parts: [{ text: \"...\" }],\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their parts\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\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 // If last message in array is model, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"model\") {\n jiggedMessages.push({\n role: \"user\",\n parts: [{ text: \"...\" }],\n });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareGoogleAIPayload(\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 // Google puts their description in the parameters object rather than in a top-level field\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 googleAIContentParts: GoogleAIPart[] = [];\n\n if (message.content) {\n googleAIContentParts.push({\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\"payload\", \"Google AI API does not support non-image file types. Skipping file.\");\n continue;\n }\n\n if (file.url) {\n googleAIContentParts.push({\n inlineData: {\n mimeType: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n // Add the URL as a text part\n googleAIContentParts.push({\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n googleAIContentParts.push({\n inlineData: {\n mimeType: file.mimeType,\n data: file.data,\n },\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role === \"assistant\" ? \"model\" : message.role,\n parts: googleAIContentParts,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callGoogleAI(\n identifier: Identifier,\n payload: GoogleAIPayload\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Google AI API\");\n const googleMessages = jigGoogleMessages(payload.messages);\n\n const history = googleMessages.slice(0, -1);\n const lastMessage = googleMessages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({\n apiKey: process.env.GEMINI_API_KEY,\n });\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({\n message: lastMessage.parts,\n });\n\n let text: string = \"\";\n const files: File[] = [];\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.text) {\n text += part.text;\n }\n\n if (part.inlineData) {\n const imageData = part.inlineData.data;\n if (imageData) {\n files.push({\n mimeType: \"image/png\",\n data: imageData,\n });\n }\n }\n }\n\n const functionCalls:\n | {\n name?: string;\n args?: Record<string, any>;\n }[]\n | undefined = response.functionCalls;\n\n const parsedFunctionCalls = functionCalls?.map((fc) => ({\n name: fc.name ?? \"\",\n arguments: fc.args ?? {},\n }));\n\n if (!text && !parsedFunctionCalls?.length && !files.length) {\n logger.error(identifier, \"Missing text & fns in Google AI API response:\", response);\n throw new Error(\"Missing text & fns in Google AI API response\");\n }\n\n return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: parsedFunctionCalls?.[0] || null,\n };\n}\n\nasync function callGoogleAIWithRetries(\n identifier: Identifier,\n payload: GoogleAIPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Google AI API with retries\");\n\n let lastError: any;\n for (let i = 0; i < retries; i++) {\n try {\n return await callGoogleAI(identifier, payload);\n } catch (e: any) {\n lastError = e;\n logger.error(identifier, `Retry #${i} error: ${e.message}`, e);\n\n // Add any specific Google AI error handling or payload modifications here if needed\n // e.g., if (e.status === 429) { /* handle rate limit */ }\n\n await timeout(125 * i); // Exponential backoff\n }\n }\n const error = new Error(\n `Failed to call Google AI API after ${retries} attempts`\n ) as any;\n error.cause = lastError; // Attach the last caught error\n throw error;\n}\n\nexport async function callWithRetries(\n identifier: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n const id = identifier;\n // Determine which service to use based on the model type\n if (isAnthropicPayload(aiPayload)) {\n logger.log(id, \"Delegating call to Anthropic API\");\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(aiPayload),\n aiConfig as AnthropicAIConfig,\n retries\n );\n } else if (isOpenAiPayload(aiPayload)) {\n logger.log(id, \"Delegating call to OpenAI API\");\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs\n );\n } else if (isGroqPayload(aiPayload)) {\n logger.log(id, \"Delegating call to Groq API\");\n return await callGroqWithRetries(\n id,\n await prepareGroqPayload(aiPayload)\n );\n } else if (isGoogleAIPayload(aiPayload)) {\n logger.log(id, \"Delegating call to Google AI API\");\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(aiPayload),\n retries\n );\n } else {\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n }\n}\n\nfunction isAnthropicPayload(payload: any): Boolean {\n return Object.values(ClaudeModel).includes(payload.model);\n}\n\nasync function prepareAnthropicPayload(\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 const anthropicContentBlocks: AnthropicContentBlock[] = [];\n\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n if (message.content) {\n anthropicContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\"payload\", \"Anthropic API does not support non-image file types. Skipping file.\");\n continue;\n }\n\n if (file.url) {\n anthropicContentBlocks.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 } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n anthropicContentBlocks.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\n preparedPayload.messages.push({\n role: message.role,\n content: anthropicContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isOpenAiPayload(payload: any): Boolean {\n return Object.values(GPTModel).includes(payload.model);\n}\n\nasync function prepareOpenAIPayload(\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 // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const openAIContentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n openAIContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n const allowedFileMimeTypes = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ];\n\n for (const file of message.files || []) {\n if (allowedFileMimeTypes.includes(file.mimeType)) {\n if (file.url) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: file.url,\n },\n });\n // Add the URL as a text part\n openAIContentBlocks.push({\n type: \"text\",\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: `data:${file.mimeType};base64,${file.data}`,\n },\n });\n }\n // } else if (file.mimeType?.startsWith(\"audio\")) {\n // if (file.url) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: file.url,\n // },\n // });\n // } else if (file.data) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: `data:${file.mimeType};base64,${file.data}`,\n // },\n // });\n // }\n } else {\n logger.warn(\"payload\", \"Skipping file in message. File or image type not supported by OpenAI API:\", file.mimeType);\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: openAIContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isGroqPayload(payload: any): Boolean {\n return Object.values(GroqModel).includes(payload.model);\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 // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n temperature: payload.temperature,\n };\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 isGoogleAIPayload(payload: any): Boolean {\n return Object.values(GeminiModel).includes(payload.model);\n}\n\nasync function callGroq(\n identifier: 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 data = response.data;\n\n const answer = data.choices[0].message;\n if (!answer) {\n logger.error(identifier, \"Missing answer in Groq API:\", data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const textResponse = answer.content || null;\n let functionCall: FunctionCall | null = null;\n if (answer.tool_calls && answer.tool_calls.length) {\n const toolCall = answer.tool_calls[0];\n functionCall = {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments),\n };\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCall,\n files: [],\n };\n}\n\nasync function callGroqWithRetries(\n identifier: Identifier,\n payload: GroqPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Groq API with retries\");\n\n let lastResponse;\n for (let i = 0; i < retries; i++) {\n try {\n lastResponse = await callGroq(identifier, payload);\n return lastResponse;\n } catch (e: any) {\n logger.error(identifier, `Retry #${i} error: ${e.message}`, e.response?.data || e);\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Groq API after ${retries} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\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 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\n// async function main() {\n// const payload: GenericPayload = {\n// model: GeminiModel.GEMINI_15_PRO,\n// messages: [\n// {\n// role: \"user\",\n// content: \"What is this logo?\",\n// files: [\n// {\n// mimeType: \"image/png\",\n// url: \"https://www.wikimedia.org/static/images/wmf-logo-2x.png\",\n// },\n// ],\n// },\n// ],\n// functions: [\n// {\n// name: \"answer_logo_question\",\n// description: \"Answer a question about a logo\",\n// parameters: {\n// type: \"object\",\n// properties: {\n// organization: {\n// type: \"string\",\n// },\n// },\n// },\n// },\n// ],\n// };\n\n// const answer = await callWithRetries(\"test\", payload);\n\n// console.log(answer);\n// }\n\n// main();\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 SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\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}\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 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 type GoogleAIPart = GoogleAITextPart | GoogleAIInlineDataPart;\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 interface GenericPayload {\n model: GPTModel | ClaudeModel | GroqModel | GeminiModel;\n messages: GenericMessage[];\n functions?: FunctionDefinition[];\n function_call?: \"none\" | \"auto\" | { name: string };\n temperature?: number;\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","abortTimeout","response","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} 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\";\nconst { GoogleGenerativeAI } = require(\"@google/generative-ai\");\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} from \"./interfaces\";\n\nfunction parseStreamedResponse(\n identifier: Identifier,\n paragraph: string,\n functionCallName: string,\n functionCallArgs: string,\n allowedFunctionNames: Set<string> | null\n): ParsedResponseMessage {\n let functionCall: ParsedResponseMessage[\"function_call\"] = null;\n if (functionCallName && functionCallArgs) {\n if (allowedFunctionNames && !allowedFunctionNames.has(functionCallName)) {\n throw new Error(\n \"Stream error: received function call with unknown name: \" +\n functionCallName\n );\n }\n\n try {\n functionCall = {\n name: functionCallName,\n arguments: JSON.parse(functionCallArgs),\n };\n } catch (error) {\n logger.error(\n identifier,\n \"Error parsing functionCallArgs:\",\n functionCallArgs\n );\n throw error;\n }\n }\n\n if (!paragraph && !functionCall) {\n logger.error(\n identifier,\n \"Stream error: received message without content or function_call, raw:\",\n JSON.stringify({ paragraph, functionCallName, functionCallArgs })\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: functionCall,\n files: [],\n };\n}\n\nasync function callOpenAiWithRetries(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n logger.log(\n identifier,\n \"Calling OpenAI API with retries:\",\n openAiConfig?.service,\n openAiPayload.model\n );\n\n let errorObj: any;\n for (let i = 0; i <= retries; i++) {\n try {\n const timerId = `timer:${identifier}:${Date.now()}:callOpenAi:${\n openAiConfig?.service\n }-${openAiPayload.model}-${openAiConfig?.orgId}`;\n\n if (\n openAiPayload.model === GPTModel.O1_MINI ||\n openAiPayload.model === GPTModel.O1_PREVIEW\n ) {\n return await callOpenAI(identifier, openAiPayload, openAiConfig);\n } else {\n return await callOpenAIStream(\n identifier,\n openAiPayload,\n openAiConfig,\n chunkTimeoutMs\n );\n }\n } catch (error: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${error.message}`,\n error.response?.data || error.data || error\n );\n\n const errorCode = error.data?.code;\n\n // Usually due to image content, we get a policy violation error\n if (errorCode === \"content_policy_violation\") {\n logger.log(\n identifier,\n \"Removing images due to content policy violation error\"\n );\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 // on 2nd or more retries\n // if Azure content policy error is persistent\n if (\n i >= 2 &&\n openAiConfig?.service === \"azure\" &&\n errorCode === \"content_filter\"\n ) {\n logger.log(\n identifier,\n \"Switching to OpenAI service due to content filter error\"\n );\n openAiConfig.service = \"openai\"; // Move to OpenAI, failed due to Azure content policy\n }\n\n // on 3rd retry\n if (i === 3) {\n if (openAiConfig?.service === \"azure\") {\n logger.log(\n identifier,\n \"Switching to OpenAI service due to Azure service error\"\n );\n openAiConfig.service = \"openai\";\n }\n }\n\n // on 4th retry\n if (i === 4) {\n // abort function calling, e.g. stubborn `python` function call case\n if (openAiPayload.tools) {\n logger.log(\n identifier,\n \"Switching to no tool choice due to persistent error\"\n );\n openAiPayload.tool_choice = \"none\";\n }\n }\n\n await timeout(250);\n }\n }\n\n logger.error(\n identifier,\n `Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`,\n errorObj\n );\n throw new Error(\n `${identifier}: Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`\n );\n}\n\nasync function callOpenAIStream(\n identifier: 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 if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n const controller = new AbortController();\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: true,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n } catch (error) {\n logger.error(\n identifier,\n \"Stream error: Azure OpenAI JSON parsing error:\",\n error\n );\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n }\n\n if (response.body) {\n let rawStreamedBody = \"\";\n let paragraph = \"\";\n let functionCallName = \"\";\n let functionCallArgs = \"\";\n\n const reader = response.body.getReader();\n\n let partialChunk = \"\";\n let abortTimeout: NodeJS.Timeout | null = null;\n const startAbortTimeout = () => {\n abortTimeout && clearTimeout(abortTimeout);\n return setTimeout(() => {\n logger.error(identifier, `Stream timeout after ${chunkTimeoutMs}ms`);\n controller.abort();\n }, chunkTimeoutMs);\n };\n\n let chunkIndex = -1;\n while (true) {\n chunkIndex++;\n const abortTimeout = startAbortTimeout();\n const { done, value } = await reader.read();\n clearTimeout(abortTimeout);\n\n if (done) {\n logger.error(\n identifier,\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 rawStreamedBody += chunk + \"\\n\";\n if (partialChunk) {\n chunk = partialChunk + chunk;\n partialChunk = \"\";\n }\n let jsonStrings = chunk.split(/^data: /gm);\n\n for (let jsonString of jsonStrings) {\n if (!jsonString) {\n continue;\n }\n\n if (jsonString.includes(\"[DONE]\")) {\n try {\n return parseStreamedResponse(\n identifier,\n paragraph,\n functionCallName,\n functionCallArgs,\n functionNames\n );\n } catch (error) {\n logger.error(identifier, \"Stream error: parsing response\");\n throw error;\n }\n }\n\n let json;\n try {\n json = JSON.parse(jsonString.trim());\n } catch (error: any) {\n partialChunk = jsonString; // We're assuming any JSON parsing error means we got a non-terminated JSON for a chunk\n continue;\n }\n\n if (!json.choices || !json.choices.length) {\n if (json.error) {\n logger.error(identifier, \"Stream error: OpenAI error:\", 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(identifier, \"Stream error: no choices in JSON:\", json);\n }\n continue;\n }\n\n const dToolCall:\n | {\n index?: number;\n function?: {\n name?: string;\n arguments?: string;\n };\n }\n | undefined = json.choices?.[0]?.delta?.tool_calls?.[0];\n if (dToolCall) {\n const toolCallIndex = dToolCall.index || 0;\n // TODO: handle multiple function calls in response\n if (toolCallIndex === 0) {\n const dFn = dToolCall.function || {};\n if (dFn.name) functionCallName += dFn.name;\n if (dFn.arguments) functionCallArgs += dFn.arguments;\n }\n }\n\n const text = json.choices?.[0]?.delta?.content;\n if (text) {\n paragraph += text;\n }\n }\n }\n } else {\n throw new Error(\"Stream error: no response body\");\n }\n}\n\nasync function callOpenAI(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined\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 if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: false,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n // You can use parsedPayload if needed\n } catch (error) {\n logger.error(identifier, \"OpenAI JSON parsing error:\", error);\n throw error;\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n }\n\n if (!response.ok) {\n const errorData = await response.json();\n logger.error(identifier, \"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 || !data.choices.length) {\n if (data.error) {\n logger.error(identifier, \"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 const functionCall = choice.function_call\n ? {\n name: choice.function_call.name,\n arguments: JSON.parse(choice.function_call.arguments),\n }\n : null;\n\n return {\n role: \"assistant\",\n content: choice.message.content || null,\n function_call: functionCall,\n files: [],\n };\n}\n\nfunction truncatePayload(payload: OpenAIPayload): string {\n return JSON.stringify(\n {\n ...payload,\n messages: payload.messages.map((message) => {\n if (typeof message.content === \"string\") {\n message.content = message.content.slice(0, 100);\n } else if (Array.isArray(message.content)) {\n message.content = message.content.map((block) => {\n if (block.type === \"image_url\") {\n block.image_url.url = block.image_url.url.slice(0, 100);\n }\n return block;\n });\n }\n\n return message;\n }),\n },\n null,\n 2\n );\n}\n\nasync function callAnthropicWithRetries(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig,\n attempts = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Anthropic API with retries\");\n let lastResponse;\n for (let i = 0; i < attempts; i++) {\n try {\n lastResponse = await callAnthropic(identifier, AiPayload, AiConfig);\n return lastResponse;\n } catch (e: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${e.message}`,\n e.response?.data || e\n );\n\n if (e.response?.data?.error?.type === \"rate_limit_error\") {\n // TODO: upgrade model or fallback to bedrock\n }\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Anthropic API after ${attempts} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\n}\n\nasync function callAnthropic(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig\n): Promise<ParsedResponseMessage> {\n const anthropicMessages = jigAnthropicMessages(AiPayload.messages);\n\n let data;\n let response;\n if (AiConfig?.service === \"bedrock\") {\n // DOES NOT SUPPORT TOOLS YET\n const AWS_REGION = \"us-east-1\";\n const MODEL_ID = \"anthropic.claude-3-haiku-20240307-v1:0\";\n\n // set in environment\n // process.env.AWS_ACCESS_KEY_ID = AWS_ACCESS_KEY_ID;\n // process.env.AWS_SECRET_ACCESS_KEY = AWS_SECRET_ACCESS_KEY;\n\n const client = new BedrockRuntimeClient({ region: AWS_REGION });\n const payload = {\n anthropic_version: \"bedrock-2023-05-31\",\n max_tokens: 4096,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n };\n\n const response = await client.send(\n new InvokeModelCommand({\n contentType: \"application/json\",\n body: JSON.stringify(payload),\n modelId: MODEL_ID,\n })\n );\n\n const decodedResponseBody = new TextDecoder().decode(response.body);\n data = JSON.parse(decodedResponseBody);\n } else {\n // default to anthropic\n const response = await axios.post(\n \"https://api.anthropic.com/v1/messages\",\n {\n model: AiPayload.model,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n temperature: AiPayload.temperature,\n system: AiPayload.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\n data = response.data;\n }\n\n const answers = data.content;\n\n if (!answers[0]) {\n logger.error(identifier, \"Missing answer in Anthropic API:\", data);\n throw new Error(\"Missing answer in Anthropic API\");\n }\n\n let textResponse = \"\";\n let functionCalls: any[] = [];\n for (const answer of answers) {\n if (!answer.type) {\n logger.error(identifier, \"Missing answer type in Anthropic API:\", data);\n throw new Error(\"Missing answer type in Anthropic API\");\n }\n\n let text = \"\";\n if (answer.type === \"text\") {\n text = answer.text\n .replace(/<thinking>.*?<\\/thinking>/gs, \"\")\n .replace(/<answer>|<\\/answer>/gs, \"\")\n .trim();\n\n if (!text) {\n // remove the tags and return the text within\n text = answer.text.replace(\n /<thinking>|<\\/thinking>|<answer>|<\\/answer>/gs,\n \"\"\n );\n logger.log(\n identifier,\n \"No text in answer, returning text within tags:\",\n text\n );\n }\n\n if (textResponse) {\n textResponse += `\\n\\n${text}`;\n } else {\n textResponse = text;\n }\n } else if (answer.type === \"tool_use\") {\n const call = {\n name: answer.name,\n arguments: answer.input,\n };\n functionCalls.push(call);\n }\n }\n\n if (!textResponse && !functionCalls.length) {\n logger.error(\n identifier,\n \"Missing text & fns in Anthropic API response:\",\n data\n );\n throw new Error(\"Missing text & fns in Anthropic API response\");\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCalls[0],\n files: [],\n };\n}\n\nfunction jigAnthropicMessages(\n messages: AnthropicAIMessage[]\n): AnthropicAIMessage[] {\n // Takes a list if messages each with a role and content\n // Assumes no system messages are present\n\n let jiggedMessages = messages.slice();\n\n // If the first message is not user, add an empty user message at the start\n if (jiggedMessages[0]?.role !== \"user\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n content: \"...\",\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their content\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n // Combine content of messages with the same 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 // If last message in array is assistant, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"assistant\") {\n jiggedMessages.push({\n role: \"user\",\n content: \"...\",\n });\n }\n\n return jiggedMessages;\n}\n\nfunction jigGoogleMessages(messages: GoogleAIMessage[]): GoogleAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // If the first message is model, add an empty user message at the start\n if (jiggedMessages[0]?.role === \"model\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n parts: [{ text: \"...\" }],\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their parts\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\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 // If last message in array is model, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"model\") {\n jiggedMessages.push({\n role: \"user\",\n parts: [{ text: \"...\" }],\n });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareGoogleAIPayload(\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 // Google puts their description in the parameters object rather than in a top-level field\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 googleAIContentParts: GoogleAIPart[] = [];\n\n if (message.content) {\n googleAIContentParts.push({\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\n \"payload\",\n \"Google AI API does not support non-image file types. Skipping file.\"\n );\n continue;\n }\n\n if (file.url) {\n googleAIContentParts.push({\n inlineData: {\n mimeType: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n // Add the URL as a text part\n googleAIContentParts.push({\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n googleAIContentParts.push({\n inlineData: {\n mimeType: file.mimeType,\n data: file.data,\n },\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role === \"assistant\" ? \"model\" : message.role,\n parts: googleAIContentParts,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callGoogleAI(\n identifier: Identifier,\n payload: GoogleAIPayload\n): Promise<ParsedResponseMessage> {\n const googleMessages = jigGoogleMessages(payload.messages);\n\n const history = googleMessages.slice(0, -1);\n const lastMessage = googleMessages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({\n apiKey: process.env.GEMINI_API_KEY,\n });\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({\n message: lastMessage.parts,\n });\n\n let text: string = \"\";\n const files: File[] = [];\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.text) {\n text += part.text;\n }\n\n if (part.inlineData) {\n const imageData = part.inlineData.data;\n if (imageData) {\n files.push({\n mimeType: \"image/png\",\n data: imageData,\n });\n }\n }\n }\n\n const functionCalls:\n | {\n name?: string;\n args?: Record<string, any>;\n }[]\n | undefined = response.functionCalls;\n\n const parsedFunctionCalls = functionCalls?.map((fc) => ({\n name: fc.name ?? \"\",\n arguments: fc.args ?? {},\n }));\n\n if (!text && !parsedFunctionCalls?.length && !files.length) {\n logger.error(\n identifier,\n \"Missing text & fns in Google AI API response:\",\n response\n );\n throw new Error(\"Missing text & fns in Google AI API response\");\n }\n\n return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: parsedFunctionCalls?.[0] || null,\n };\n}\n\nasync function callGoogleAIWithRetries(\n identifier: Identifier,\n payload: GoogleAIPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Google AI API with retries\");\n\n let lastError: any;\n for (let i = 0; i < retries; i++) {\n try {\n return await callGoogleAI(identifier, payload);\n } catch (e: any) {\n lastError = e;\n logger.error(identifier, `Retry #${i} error: ${e.message}`, e);\n\n // Add any specific Google AI error handling or payload modifications here if needed\n // e.g., if (e.status === 429) { /* handle rate limit */ }\n\n await timeout(125 * i); // Exponential backoff\n }\n }\n const error = new Error(\n `Failed to call Google AI API after ${retries} attempts`\n ) as any;\n error.cause = lastError; // Attach the last caught error\n throw error;\n}\n\nexport async function callWithRetries(\n identifier: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n const id = identifier;\n // Determine which service to use based on the model type\n if (isAnthropicPayload(aiPayload)) {\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(aiPayload),\n aiConfig as AnthropicAIConfig,\n retries\n );\n } else if (isOpenAiPayload(aiPayload)) {\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs\n );\n } else if (isGroqPayload(aiPayload)) {\n return await callGroqWithRetries(id, await prepareGroqPayload(aiPayload));\n } else if (isGoogleAIPayload(aiPayload)) {\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(aiPayload),\n retries\n );\n } else {\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n }\n}\n\nfunction isAnthropicPayload(payload: any): Boolean {\n return Object.values(ClaudeModel).includes(payload.model);\n}\n\nasync function prepareAnthropicPayload(\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 const anthropicContentBlocks: AnthropicContentBlock[] = [];\n\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n if (message.content) {\n anthropicContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\n \"payload\",\n \"Anthropic API does not support non-image file types. Skipping file.\"\n );\n continue;\n }\n\n if (file.url) {\n anthropicContentBlocks.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 } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n anthropicContentBlocks.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\n preparedPayload.messages.push({\n role: message.role,\n content: anthropicContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isOpenAiPayload(payload: any): Boolean {\n return Object.values(GPTModel).includes(payload.model);\n}\n\nasync function prepareOpenAIPayload(\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 // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const openAIContentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n openAIContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n const allowedFileMimeTypes = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ];\n\n for (const file of message.files || []) {\n if (allowedFileMimeTypes.includes(file.mimeType)) {\n if (file.url) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: file.url,\n },\n });\n // Add the URL as a text part\n openAIContentBlocks.push({\n type: \"text\",\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: `data:${file.mimeType};base64,${file.data}`,\n },\n });\n }\n // } else if (file.mimeType?.startsWith(\"audio\")) {\n // if (file.url) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: file.url,\n // },\n // });\n // } else if (file.data) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: `data:${file.mimeType};base64,${file.data}`,\n // },\n // });\n // }\n } else {\n logger.warn(\n \"payload\",\n \"Skipping file in message. File or image type not supported by OpenAI API:\",\n file.mimeType\n );\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: openAIContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isGroqPayload(payload: any): Boolean {\n return Object.values(GroqModel).includes(payload.model);\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 // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n temperature: payload.temperature,\n };\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 isGoogleAIPayload(payload: any): Boolean {\n return Object.values(GeminiModel).includes(payload.model);\n}\n\nasync function callGroq(\n identifier: 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 data = response.data;\n\n const answer = data.choices[0].message;\n if (!answer) {\n logger.error(identifier, \"Missing answer in Groq API:\", data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const textResponse = answer.content || null;\n let functionCall: FunctionCall | null = null;\n if (answer.tool_calls && answer.tool_calls.length) {\n const toolCall = answer.tool_calls[0];\n functionCall = {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments),\n };\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCall,\n files: [],\n };\n}\n\nasync function callGroqWithRetries(\n identifier: Identifier,\n payload: GroqPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Groq API with retries\");\n\n let lastResponse;\n for (let i = 0; i < retries; i++) {\n try {\n lastResponse = await callGroq(identifier, payload);\n return lastResponse;\n } catch (e: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${e.message}`,\n e.response?.data || e\n );\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Groq API after ${retries} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\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 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\n// async function main() {\n// const payload: GenericPayload = {\n// model: GeminiModel.GEMINI_15_PRO,\n// messages: [\n// {\n// role: \"user\",\n// content: \"What is this logo?\",\n// files: [\n// {\n// mimeType: \"image/png\",\n// url: \"https://www.wikimedia.org/static/images/wmf-logo-2x.png\",\n// },\n// ],\n// },\n// ],\n// functions: [\n// {\n// name: \"answer_logo_question\",\n// description: \"Answer a question about a logo\",\n// parameters: {\n// type: \"object\",\n// properties: {\n// organization: {\n// type: \"string\",\n// },\n// },\n// },\n// },\n// ],\n// };\n\n// const answer = await callWithRetries(\"test\", payload);\n\n// console.log(answer);\n// }\n\n// main();\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 SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\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}\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 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 type GoogleAIPart = GoogleAITextPart | GoogleAIInlineDataPart;\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 interface GenericPayload {\n model: GPTModel | ClaudeModel | GroqModel | GeminiModel;\n messages: GenericMessage[];\n functions?: FunctionDefinition[];\n function_call?: \"none\" | \"auto\" | { name: string };\n temperature?: number;\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAK,cAAL,kBAAKA,iBAAL;AACL,EAAAA,aAAA,aAAU;AACV,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,YAAS;AACT,EAAAA,aAAA,gBAAa;AACb,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,YAAS;AACT,EAAAA,aAAA,gBAAa;AACb,EAAAA,aAAA,cAAW;AARD,SAAAA;AAAA,GAAA;AAWL,IAAK,WAAL,kBAAKC,cAAL;AACL,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,oBAAiB;AACjB,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,uBAAoB;AACpB,EAAAA,UAAA,uBAAoB;AACpB,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,iBAAc;AACd,EAAAA,UAAA,iBAAc;AACd,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,eAAY;AAhBF,SAAAA;AAAA,GAAA;AAmBL,IAAK,YAAL,kBAAKC,eAAL;AACL,EAAAA,WAAA,sBAAmB;AACnB,EAAAA,WAAA,mCAAgC;AAFtB,SAAAA;AAAA,GAAA;AAKL,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,oBAAiB;AACjB,EAAAA,aAAA,qBAAkB;AAClB,EAAAA,aAAA,sBAAmB;AACnB,EAAAA,aAAA,2CAAwC;AACxC,EAAAA,aAAA,mCAAgC;AAChC,EAAAA,aAAA,yCAAsC;AACtC,EAAAA,aAAA,oCAAiC;AACjC,EAAAA,aAAA,4BAAyB;AARf,SAAAA;AAAA,GAAA;;;AChCZ,SAAS,iBAAiB,YAAgC;AACxD,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,WAAO,WAAW,IAAI,CAAC,OAAO,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG;AAAA,EACnD;AACA,SAAO,IAAI,UAAU;AACvB;AAEA,SAAS,cACP,OACA,YACA,SACQ;AACR,SAAO,IAAI,KAAK,KAAK,iBAAiB,UAAU,CAAC,IAAI,OAAO;AAC9D;AAEO,SAAS,IACd,YACA,YACG,MACG;AACN,UAAQ,IAAI,cAAc,OAAO,YAAY,OAAO,GAAG,GAAG,IAAI;AAChE;AAEO,SAAS,KACd,YACA,YACG,MACG;AACN,UAAQ,KAAK,cAAc,QAAQ,YAAY,OAAO,GAAG,GAAG,IAAI;AAClE;AAEO,SAAS,MACd,YACA,YACG,MACG;AACN,UAAQ,MAAM,cAAc,SAAS,YAAY,OAAO,GAAG,GAAG,IAAI;AACpE;AAEA,IAAO,iBAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AACF;;;AFtBA,oCAGO;AACP,mBAAkB;;;AG5BX,SAAS,QAAQ,IAA2B;AACjD,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEO,SAAS,YAAY,MAAc,MAAwB;AAJlE;AAKE,QAAM,cAAY,UAAK,MAAM,GAAG,EAAE,IAAI,MAApB,mBAAuB,kBAAiB;AAC1D,SACE,CAAC,QAAQ,QAAQ,OAAO,EAAE,SAAS,SAAS,KAC5C,CAAC,EACC,QAAQ,CAAC,cAAc,cAAc,qBAAqB,EAAE,SAAS,IAAI;AAG/E;;;AHkBA,mBAA4B;AAC5B,IAAM,EAAE,mBAAmB,IAAI,QAAQ,uBAAuB;AAE9D,IAAM,QAAQ,QAAQ,OAAO;AAC7B,IAAM,SAAS,QAAQ,aAAa;AAapC,SAAS,sBACP,YACA,WACA,kBACA,kBACA,sBACuB;AACvB,MAAI,eAAuD;AAC3D,MAAI,oBAAoB,kBAAkB;AACxC,QAAI,wBAAwB,CAAC,qBAAqB,IAAI,gBAAgB,GAAG;AACvE,YAAM,IAAI;AAAA,QACR,6DACE;AAAA,MACJ;AAAA,IACF;AAEA,QAAI;AACF,qBAAe;AAAA,QACb,MAAM;AAAA,QACN,WAAW,KAAK,MAAM,gBAAgB;AAAA,MACxC;AAAA,IACF,SAASC,QAAO;AACd,qBAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAMA;AAAA,IACR;AAAA,EACF;AAEA,MAAI,CAAC,aAAa,CAAC,cAAc;AAC/B,mBAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK,UAAU,EAAE,WAAW,kBAAkB,iBAAiB,CAAC;AAAA,IAClE;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,aAAa;AAAA,IACtB,eAAe;AAAA,IACf,OAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,sBACb,YACA,eACA,cACA,UAAkB,GAClB,iBAAyB,MACO;AAvGlC;AAwGE,iBAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,6CAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAEA,MAAI;AACJ,WAAS,IAAI,GAAG,KAAK,SAAS,KAAK;AACjC,QAAI;AACF,YAAM,UAAU,SAAS,UAAU,IAAI,KAAK,IAAI,CAAC,eAC/C,6CAAc,OAChB,IAAI,cAAc,KAAK,IAAI,6CAAc,KAAK;AAE9C,UACE,cAAc,qCACd,cAAc,yCACd;AACA,eAAO,MAAM,WAAW,YAAY,eAAe,YAAY;AAAA,MACjE,OAAO;AACL,eAAO,MAAM;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAASA,QAAY;AACnB,qBAAO;AAAA,QACL;AAAA,QACA,UAAU,CAAC,WAAWA,OAAM,OAAO;AAAA,UACnC,KAAAA,OAAM,aAAN,mBAAgB,SAAQA,OAAM,QAAQA;AAAA,MACxC;AAEA,YAAM,aAAY,KAAAA,OAAM,SAAN,mBAAY;AAG9B,UAAI,cAAc,4BAA4B;AAC5C,uBAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AACA,sBAAc,SAAS,QAAQ,CAAC,YAA2B;AACzD,cAAI,MAAM,QAAQ,QAAQ,OAAO,GAAG;AAClC,oBAAQ,UAAU,QAAQ,QAAQ;AAAA,cAChC,CAAC,YAAY,QAAQ,SAAS;AAAA,YAChC;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAIA,UACE,KAAK,MACL,6CAAc,aAAY,WAC1B,cAAc,kBACd;AACA,uBAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AACA,qBAAa,UAAU;AAAA,MACzB;AAGA,UAAI,MAAM,GAAG;AACX,aAAI,6CAAc,aAAY,SAAS;AACrC,yBAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AACA,uBAAa,UAAU;AAAA,QACzB;AAAA,MACF;AAGA,UAAI,MAAM,GAAG;AAEX,YAAI,cAAc,OAAO;AACvB,yBAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AACA,wBAAc,cAAc;AAAA,QAC9B;AAAA,MACF;AAEA,YAAM,QAAQ,GAAG;AAAA,IACnB;AAAA,EACF;AAEA,iBAAO;AAAA,IACL;AAAA,IACA,mCAAmC,OAAO;AAAA,IAC1C;AAAA,EACF;AACA,QAAM,IAAI;AAAA,IACR,GAAG,UAAU,qCAAqC,OAAO;AAAA,EAC3D;AACF;AAEA,eAAe,iBACb,YACA,eACA,cACA,gBACgC;AAnNlC;AAoNE,QAAM,gBAAoC,cAAc,QACpD,IAAI,IAAI,cAAc,MAAM,IAAI,CAAC,OAAO,GAAG,SAAS,IAAc,CAAC,IACnE;AAEJ,MAAI,CAAC,cAAc;AACjB,mBAAe;AAAA,MACb,SAAS;AAAA,MACT,QAAQ,QAAQ,IAAI;AAAA,MACpB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI;AACJ,QAAM,aAAa,IAAI,gBAAgB;AACvC,MAAI,aAAa,YAAY,SAAS;AACpC,mBAAO,IAAI,YAAY,8BAA8B,cAAc,KAAK;AACxE,UAAM,QAAQ,cAAc;AAE5B,QAAI,CAAC,aAAa,gBAAgB;AAChC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,aAAa,eAAe,KAAK;AACrD,QAAI;AACJ,QAAI,YAAY,UAAU;AACxB,iBAAW,GAAG,YAAY,QAAQ,uBAAuB,YAAY,UAAU,iCAAiC,YAAY,UAAU;AAAA,IACxI,OAAO;AACL,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,mBAAO,IAAI,YAAY,kBAAkB,QAAQ;AAEjD,QAAI;AACF,YAAM,qBAAqB,KAAK,UAAU;AAAA,QACxC,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,gBAAgB,KAAK,MAAM,kBAAkB;AAAA,IACrD,SAASA,QAAO;AACd,qBAAO;AAAA,QACL;AAAA,QACA;AAAA,QACAA;AAAA,MACF;AAAA,IACF;AAEA,eAAW,MAAM,MAAM,UAAU;AAAA,MAC/B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,WAAW,YAAY;AAAA,MACzB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AAAA,MACD,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH,OAAO;AAEL,mBAAO,IAAI,YAAY,wBAAwB,cAAc,KAAK;AAClE,UAAM,WAAW;AACjB,QAAI,aAAa,OAAO;AACtB,qBAAO,IAAI,YAAY,eAAe,aAAa,KAAK;AAAA,IAC1D;AAEA,eAAW,MAAM,MAAM,UAAU;AAAA,MAC/B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,aAAa,MAAM;AAAA,QAC5C,GAAI,aAAa,QACb,EAAE,uBAAuB,aAAa,MAAM,IAC5C,CAAC;AAAA,MACP;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AAAA,MACD,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,MAAM;AACjB,QAAI,kBAAkB;AACtB,QAAI,YAAY;AAChB,QAAI,mBAAmB;AACvB,QAAI,mBAAmB;AAEvB,UAAM,SAAS,SAAS,KAAK,UAAU;AAEvC,QAAI,eAAe;AACnB,QAAI,eAAsC;AAC1C,UAAM,oBAAoB,MAAM;AAC9B,sBAAgB,aAAa,YAAY;AACzC,aAAO,WAAW,MAAM;AACtB,uBAAO,MAAM,YAAY,wBAAwB,cAAc,IAAI;AACnE,mBAAW,MAAM;AAAA,MACnB,GAAG,cAAc;AAAA,IACnB;AAEA,QAAI,aAAa;AACjB,WAAO,MAAM;AACX;AACA,YAAMC,gBAAe,kBAAkB;AACvC,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,mBAAaA,aAAY;AAEzB,UAAI,MAAM;AACR,uBAAO;AAAA,UACL;AAAA,UACA,kCAAkC,aAAa,CAAC;AAAA,QAClD;AACA,cAAM,IAAI,MAAM,iCAAiC;AAAA,MACnD;AAEA,UAAI,QAAQ,IAAI,YAAY,EAAE,OAAO,KAAK;AAC1C,yBAAmB,QAAQ;AAC3B,UAAI,cAAc;AAChB,gBAAQ,eAAe;AACvB,uBAAe;AAAA,MACjB;AACA,UAAI,cAAc,MAAM,MAAM,WAAW;AAEzC,eAAS,cAAc,aAAa;AAClC,YAAI,CAAC,YAAY;AACf;AAAA,QACF;AAEA,YAAI,WAAW,SAAS,QAAQ,GAAG;AACjC,cAAI;AACF,mBAAO;AAAA,cACL;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF,SAASD,QAAO;AACd,2BAAO,MAAM,YAAY,gCAAgC;AACzD,kBAAMA;AAAA,UACR;AAAA,QACF;AAEA,YAAI;AACJ,YAAI;AACF,iBAAO,KAAK,MAAM,WAAW,KAAK,CAAC;AAAA,QACrC,SAASA,QAAY;AACnB,yBAAe;AACf;AAAA,QACF;AAEA,YAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,QAAQ;AACzC,cAAI,KAAK,OAAO;AACd,2BAAO,MAAM,YAAY,+BAA+B,KAAK,KAAK;AAClE,kBAAMA,SAAQ,IAAI,MAAM,4BAA4B;AACpD,YAAAA,OAAM,OAAO,KAAK;AAClB,YAAAA,OAAM,cAAc,gBAAgB,aAAa;AACjD,kBAAMA;AAAA,UACR;AACA,cAAI,eAAe,GAAG;AACpB,2BAAO,MAAM,YAAY,qCAAqC,IAAI;AAAA,UACpE;AACA;AAAA,QACF;AAEA,cAAM,aAQU,4BAAK,YAAL,mBAAe,OAAf,mBAAmB,UAAnB,mBAA0B,eAA1B,mBAAuC;AACvD,YAAI,WAAW;AACb,gBAAM,gBAAgB,UAAU,SAAS;AAEzC,cAAI,kBAAkB,GAAG;AACvB,kBAAM,MAAM,UAAU,YAAY,CAAC;AACnC,gBAAI,IAAI;AAAM,kCAAoB,IAAI;AACtC,gBAAI,IAAI;AAAW,kCAAoB,IAAI;AAAA,UAC7C;AAAA,QACF;AAEA,cAAM,QAAO,sBAAK,YAAL,mBAAe,OAAf,mBAAmB,UAAnB,mBAA0B;AACvC,YAAI,MAAM;AACR,uBAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AACF;AAEA,eAAe,WACb,YACA,eACA,cACgC;AAChC,QAAM,gBAAoC,cAAc,QACpD,IAAI,IAAI,cAAc,MAAM,IAAI,CAAC,OAAO,GAAG,SAAS,IAAc,CAAC,IACnE;AAEJ,MAAI,CAAC,cAAc;AACjB,mBAAe;AAAA,MACb,SAAS;AAAA,MACT,QAAQ,QAAQ,IAAI;AAAA,MACpB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,aAAa,YAAY,SAAS;AACpC,mBAAO,IAAI,YAAY,8BAA8B,cAAc,KAAK;AACxE,UAAM,QAAQ,cAAc;AAE5B,QAAI,CAAC,aAAa,gBAAgB;AAChC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,aAAa,eAAe,KAAK;AACrD,QAAI;AACJ,QAAI,YAAY,UAAU;AACxB,iBAAW,GAAG,YAAY,QAAQ,uBAAuB,YAAY,UAAU,iCAAiC,YAAY,UAAU;AAAA,IACxI,OAAO;AACL,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,mBAAO,IAAI,YAAY,kBAAkB,QAAQ;AAEjD,QAAI;AACF,YAAM,qBAAqB,KAAK,UAAU;AAAA,QACxC,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,gBAAgB,KAAK,MAAM,kBAAkB;AAAA,IAErD,SAASA,QAAO;AACd,qBAAO,MAAM,YAAY,8BAA8BA,MAAK;AAC5D,YAAMA;AAAA,IACR;AAEA,eAAW,MAAM,MAAM,UAAU;AAAA,MAC/B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,WAAW,YAAY;AAAA,MACzB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH,OAAO;AAEL,mBAAO,IAAI,YAAY,wBAAwB,cAAc,KAAK;AAClE,UAAM,WAAW;AACjB,QAAI,aAAa,OAAO;AACtB,qBAAO,IAAI,YAAY,eAAe,aAAa,KAAK;AAAA,IAC1D;AAEA,eAAW,MAAM,MAAM,UAAU;AAAA,MAC/B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,aAAa,MAAM;AAAA,QAC5C,GAAI,aAAa,QACb,EAAE,uBAAuB,aAAa,MAAM,IAC5C,CAAC;AAAA,MACP;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK;AACtC,mBAAO,MAAM,YAAY,qBAAqB,SAAS;AACvD,UAAM,IAAI,MAAM,qBAAqB,UAAU,MAAM,OAAO,EAAE;AAAA,EAChE;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,MAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,QAAQ;AACzC,QAAI,KAAK,OAAO;AACd,qBAAO,MAAM,YAAY,iBAAiB,KAAK,KAAK;AACpD,YAAM,IAAI,MAAM,mBAAmB,KAAK,MAAM,OAAO;AAAA,IACvD;AACA,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAEA,QAAM,SAAS,KAAK,QAAQ,CAAC;AAC7B,QAAM,eAAe,OAAO,gBACxB;AAAA,IACE,MAAM,OAAO,cAAc;AAAA,IAC3B,WAAW,KAAK,MAAM,OAAO,cAAc,SAAS;AAAA,EACtD,IACA;AAEJ,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,OAAO,QAAQ,WAAW;AAAA,IACnC,eAAe;AAAA,IACf,OAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,gBAAgB,SAAgC;AACvD,SAAO,KAAK;AAAA,IACV;AAAA,MACE,GAAG;AAAA,MACH,UAAU,QAAQ,SAAS,IAAI,CAAC,YAAY;AAC1C,YAAI,OAAO,QAAQ,YAAY,UAAU;AACvC,kBAAQ,UAAU,QAAQ,QAAQ,MAAM,GAAG,GAAG;AAAA,QAChD,WAAW,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACzC,kBAAQ,UAAU,QAAQ,QAAQ,IAAI,CAAC,UAAU;AAC/C,gBAAI,MAAM,SAAS,aAAa;AAC9B,oBAAM,UAAU,MAAM,MAAM,UAAU,IAAI,MAAM,GAAG,GAAG;AAAA,YACxD;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AAEA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,yBACb,YACA,WACA,UACA,WAAW,GACqB;AA1iBlC;AA2iBE,iBAAO,IAAI,YAAY,oCAAoC;AAC3D,MAAI;AACJ,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,QAAI;AACF,qBAAe,MAAM,cAAc,YAAY,WAAW,QAAQ;AAClE,aAAO;AAAA,IACT,SAAS,GAAQ;AACf,qBAAO;AAAA,QACL;AAAA,QACA,UAAU,CAAC,WAAW,EAAE,OAAO;AAAA,UAC/B,OAAE,aAAF,mBAAY,SAAQ;AAAA,MACtB;AAEA,YAAI,mBAAE,aAAF,mBAAY,SAAZ,mBAAkB,UAAlB,mBAAyB,UAAS,oBAAoB;AAAA,MAE1D;AAEA,YAAM,QAAQ,MAAM,CAAC;AAAA,IACvB;AAAA,EACF;AACA,QAAMA,SAAQ,IAAI;AAAA,IAChB,sCAAsC,QAAQ;AAAA,EAChD;AACA,EAAAA,OAAM,WAAW;AACjB,QAAMA;AACR;AAEA,eAAe,cACb,YACA,WACA,UACgC;AA1kBlC;AA2kBE,QAAM,oBAAoB,qBAAqB,UAAU,QAAQ;AAEjE,MAAI;AACJ,MAAI;AACJ,OAAI,qCAAU,aAAY,WAAW;AAEnC,UAAM,aAAa;AACnB,UAAM,WAAW;AAMjB,UAAM,SAAS,IAAI,mDAAqB,EAAE,QAAQ,WAAW,CAAC;AAC9D,UAAM,UAAU;AAAA,MACd,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,QAAO,eAAU,cAAV,mBAAqB,IAAI,CAAC,OAAO;AAAA,QACtC,GAAG;AAAA,QACH,cAAc,EAAE;AAAA,QAChB,YAAY;AAAA,MACd;AAAA,IACF;AAEA,UAAME,YAAW,MAAM,OAAO;AAAA,MAC5B,IAAI,iDAAmB;AAAA,QACrB,aAAa;AAAA,QACb,MAAM,KAAK,UAAU,OAAO;AAAA,QAC5B,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,sBAAsB,IAAI,YAAY,EAAE,OAAOA,UAAS,IAAI;AAClE,WAAO,KAAK,MAAM,mBAAmB;AAAA,EACvC,OAAO;AAEL,UAAMA,YAAW,MAAM,aAAAC,QAAM;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,OAAO,UAAU;AAAA,QACjB,UAAU;AAAA,QACV,QAAO,eAAU,cAAV,mBAAqB,IAAI,CAAC,OAAO;AAAA,UACtC,GAAG;AAAA,UACH,cAAc,EAAE;AAAA,UAChB,YAAY;AAAA,QACd;AAAA,QACA,aAAa,UAAU;AAAA,QACvB,QAAQ,UAAU;AAAA,QAClB,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,aAAa,QAAQ,IAAI;AAAA,UACzB,qBAAqB;AAAA,UACrB,kBAAkB;AAAA,QACpB;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAOD,UAAS;AAAA,EAClB;AAEA,QAAM,UAAU,KAAK;AAErB,MAAI,CAAC,QAAQ,CAAC,GAAG;AACf,mBAAO,MAAM,YAAY,oCAAoC,IAAI;AACjE,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,MAAI,eAAe;AACnB,MAAI,gBAAuB,CAAC;AAC5B,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,MAAM;AAChB,qBAAO,MAAM,YAAY,yCAAyC,IAAI;AACtE,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAEA,QAAI,OAAO;AACX,QAAI,OAAO,SAAS,QAAQ;AAC1B,aAAO,OAAO,KACX,QAAQ,+BAA+B,EAAE,EACzC,QAAQ,yBAAyB,EAAE,EACnC,KAAK;AAER,UAAI,CAAC,MAAM;AAET,eAAO,OAAO,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,QACF;AACA,uBAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,wBAAgB;AAAA;AAAA,EAAO,IAAI;AAAA,MAC7B,OAAO;AACL,uBAAe;AAAA,MACjB;AAAA,IACF,WAAW,OAAO,SAAS,YAAY;AACrC,YAAM,OAAO;AAAA,QACX,MAAM,OAAO;AAAA,QACb,WAAW,OAAO;AAAA,MACpB;AACA,oBAAc,KAAK,IAAI;AAAA,IACzB;AAAA,EACF;AAEA,MAAI,CAAC,gBAAgB,CAAC,cAAc,QAAQ;AAC1C,mBAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,eAAe,cAAc,CAAC;AAAA,IAC9B,OAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,qBACP,UACsB;AAhtBxB;AAotBE,MAAI,iBAAiB,SAAS,MAAM;AAGpC,QAAI,oBAAe,CAAC,MAAhB,mBAAmB,UAAS,QAAQ;AACtC,qBAAiB;AAAA,MACf;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF;AAGA,mBAAiB,eAAe,OAAO,CAAC,KAAK,YAAY;AACvD,QAAI,IAAI,WAAW,GAAG;AACpB,aAAO,CAAC,OAAO;AAAA,IACjB;AAEA,UAAM,cAAc,IAAI,IAAI,SAAS,CAAC;AACtC,QAAI,YAAY,SAAS,QAAQ,MAAM;AAErC,YAAM,cAAc,MAAM,QAAQ,YAAY,OAAO,IACjD,YAAY,UACZ,CAAC,EAAE,MAAM,QAAiB,MAAM,YAAY,QAAQ,CAAC;AACzD,YAAM,aAAa,MAAM,QAAQ,QAAQ,OAAO,IAC5C,QAAQ,UACR,CAAC,EAAE,MAAM,QAAiB,MAAM,QAAQ,QAAQ,CAAC;AAErD,kBAAY,UAAU;AAAA,QACpB,GAAG;AAAA,QACH,EAAE,MAAM,QAAQ,MAAM,cAAc;AAAA,QACpC,GAAG;AAAA,MACL;AACA,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,QAAQ,YAAY,UAAU;AACvC,cAAQ,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAAA,IAC5D;AAEA,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB,GAAG,CAAC,CAAyB;AAG7B,QAAI,oBAAe,eAAe,SAAS,CAAC,MAAxC,mBAA2C,UAAS,aAAa;AACnE,mBAAe,KAAK;AAAA,MAClB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,UAAgD;AA5wB3E;AA6wBE,MAAI,iBAAiB,SAAS,MAAM;AAGpC,QAAI,oBAAe,CAAC,MAAhB,mBAAmB,UAAS,SAAS;AACvC,qBAAiB;AAAA,MACf;AAAA,QACE,MAAM;AAAA,QACN,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;AAAA,MACzB;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF;AAGA,mBAAiB,eAAe,OAAO,CAAC,KAAK,YAAY;AACvD,QAAI,IAAI,WAAW,GAAG;AACpB,aAAO,CAAC,OAAO;AAAA,IACjB;AAEA,UAAM,cAAc,IAAI,IAAI,SAAS,CAAC;AACtC,QAAI,YAAY,SAAS,QAAQ,MAAM;AACrC,kBAAY,QAAQ,CAAC,GAAG,YAAY,OAAO,GAAG,QAAQ,KAAK;AAC3D,aAAO;AAAA,IACT;AAEA,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB,GAAG,CAAC,CAAsB;AAG1B,QAAI,oBAAe,eAAe,SAAS,CAAC,MAAxC,mBAA2C,UAAS,SAAS;AAC/D,mBAAe,KAAK;AAAA,MAClB,MAAM;AAAA,MACN,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAe,uBACb,SAC0B;AAtzB5B;AAuzBE,QAAM,kBAAmC;AAAA,IACvC,OAAO,QAAQ;AAAA,IACf,UAAU,CAAC;AAAA,IACX,OAAO,QAAQ,YACX;AAAA,MACE,sBAAsB,QAAQ,UAAU,IAAI,CAAC,QAAQ;AAAA,QACnD,MAAM,GAAG;AAAA,QACT,YAAY;AAAA;AAAA,UAEV,aAAa,GAAG;AAAA,UAChB,GAAG,GAAG;AAAA,QACR;AAAA,MACF,EAAE;AAAA,IACJ,IACA;AAAA,EACN;AAEA,aAAW,WAAW,QAAQ,UAAU;AACtC,QAAI,QAAQ,SAAS,UAAU;AAC7B,sBAAgB,oBAAoB,QAAQ;AAC5C;AAAA,IACF;AAEA,UAAM,uBAAuC,CAAC;AAE9C,QAAI,QAAQ,SAAS;AACnB,2BAAqB,KAAK;AAAA,QACxB,MAAM,QAAQ;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,eAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACtC,UAAI,GAAC,UAAK,aAAL,mBAAe,WAAW,WAAU;AACvC,uBAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAI,KAAK,KAAK;AACZ,6BAAqB,KAAK;AAAA,UACxB,YAAY;AAAA,YACV,UAAU;AAAA,YACV,MAAM,MAAM,uBAAuB,KAAK,KAAK,KAAK,QAAQ;AAAA,UAC5D;AAAA,QACF,CAAC;AAED,6BAAqB,KAAK;AAAA,UACxB,MAAM,cAAc,KAAK,GAAG;AAAA,QAC9B,CAAC;AAAA,MACH,WAAW,KAAK,MAAM;AACpB,YACE,CAAC,CAAC,aAAa,cAAc,aAAa,YAAY,EAAE;AAAA,UACtD,KAAK;AAAA,QACP,GACA;AACA,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,6BAAqB,KAAK;AAAA,UACxB,YAAY;AAAA,YACV,UAAU,KAAK;AAAA,YACf,MAAM,KAAK;AAAA,UACb;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,oBAAgB,SAAS,KAAK;AAAA,MAC5B,MAAM,QAAQ,SAAS,cAAc,UAAU,QAAQ;AAAA,MACvD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAe,aACb,YACA,SACgC;AAz4BlC;AA04BE,QAAM,iBAAiB,kBAAkB,QAAQ,QAAQ;AAEzD,QAAM,UAAU,eAAe,MAAM,GAAG,EAAE;AAC1C,QAAM,cAAc,eAAe,MAAM,EAAE,EAAE,CAAC;AAE9C,QAAM,QAAQ,IAAI,yBAAY;AAAA,IAC5B,QAAQ,QAAQ,IAAI;AAAA,EACtB,CAAC;AAED,QAAM,OAAO,MAAM,MAAM,OAAO;AAAA,IAC9B,OAAO,QAAQ;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,MACN,oBAAoB,CAAC,MAAM;AAAA,MAC3B,OAAO,QAAQ,QAAQ,CAAC,QAAQ,KAAK,IAAI;AAAA,MACzC,mBAAmB,QAAQ;AAAA,IAC7B;AAAA,EACF,CAAC;AAED,QAAM,WAAW,MAAM,KAAK,YAAY;AAAA,IACtC,SAAS,YAAY;AAAA,EACvB,CAAC;AAED,MAAI,OAAe;AACnB,QAAM,QAAgB,CAAC;AAEvB,aAAW,UAAQ,0BAAS,eAAT,mBAAsB,OAAtB,mBAA0B,YAA1B,mBAAmC,UAAS,CAAC,GAAG;AACjE,QAAI,KAAK,MAAM;AACb,cAAQ,KAAK;AAAA,IACf;AAEA,QAAI,KAAK,YAAY;AACnB,YAAM,YAAY,KAAK,WAAW;AAClC,UAAI,WAAW;AACb,cAAM,KAAK;AAAA,UACT,UAAU;AAAA,UACV,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAKU,SAAS;AAEzB,QAAM,sBAAsB,+CAAe,IAAI,CAAC,OAAI;AA37BtD,QAAAE,KAAAC;AA27B0D;AAAA,MACtD,OAAMD,MAAA,GAAG,SAAH,OAAAA,MAAW;AAAA,MACjB,YAAWC,MAAA,GAAG,SAAH,OAAAA,MAAW,CAAC;AAAA,IACzB;AAAA;AAEA,MAAI,CAAC,QAAQ,EAAC,2DAAqB,WAAU,CAAC,MAAM,QAAQ;AAC1D,mBAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA,gBAAe,2DAAsB,OAAM;AAAA,EAC7C;AACF;AAEA,eAAe,wBACb,YACA,SACA,UAAkB,GACc;AAChC,iBAAO,IAAI,YAAY,oCAAoC;AAE3D,MAAI;AACJ,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,QAAI;AACF,aAAO,MAAM,aAAa,YAAY,OAAO;AAAA,IAC/C,SAAS,GAAQ;AACf,kBAAY;AACZ,qBAAO,MAAM,YAAY,UAAU,CAAC,WAAW,EAAE,OAAO,IAAI,CAAC;AAK7D,YAAM,QAAQ,MAAM,CAAC;AAAA,IACvB;AAAA,EACF;AACA,QAAML,SAAQ,IAAI;AAAA,IAChB,sCAAsC,OAAO;AAAA,EAC/C;AACA,EAAAA,OAAM,QAAQ;AACd,QAAMA;AACR;AAEA,eAAsB,gBACpB,YACA,WACA,UACA,UAAkB,GAClB,iBAAyB,MACO;AAChC,QAAM,KAAK;AAEX,MAAI,mBAAmB,SAAS,GAAG;AACjC,WAAO,MAAM;AAAA,MACX;AAAA,MACA,MAAM,wBAAwB,SAAS;AAAA,MACvC;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,gBAAgB,SAAS,GAAG;AACrC,WAAO,MAAM;AAAA,MACX;AAAA,MACA,MAAM,qBAAqB,SAAS;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,cAAc,SAAS,GAAG;AACnC,WAAO,MAAM,oBAAoB,IAAI,MAAM,mBAAmB,SAAS,CAAC;AAAA,EAC1E,WAAW,kBAAkB,SAAS,GAAG;AACvC,WAAO,MAAM;AAAA,MACX;AAAA,MACA,MAAM,uBAAuB,SAAS;AAAA,MACtC;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AACF;AAEA,SAAS,mBAAmB,SAAuB;AACjD,SAAO,OAAO,OAAO,WAAW,EAAE,SAAS,QAAQ,KAAK;AAC1D;AAEA,eAAe,wBACb,SAC6B;AAxhC/B;AAyhCE,QAAM,kBAAsC;AAAA,IAC1C,OAAO,QAAQ;AAAA,IACf,UAAU,CAAC;AAAA,IACX,WAAW,QAAQ;AAAA,IACnB,aAAa,QAAQ;AAAA,EACvB;AAEA,aAAW,WAAW,QAAQ,UAAU;AACtC,UAAM,yBAAkD,CAAC;AAEzD,QAAI,QAAQ,SAAS,UAAU;AAC7B,sBAAgB,SAAS,QAAQ;AACjC;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS;AACnB,6BAAuB,KAAK;AAAA,QAC1B,MAAM;AAAA,QACN,MAAM,QAAQ;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,eAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACtC,UAAI,GAAC,UAAK,aAAL,mBAAe,WAAW,WAAU;AACvC,uBAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAI,KAAK,KAAK;AACZ,+BAAuB,KAAK;AAAA,UAC1B,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,MAAM,MAAM,uBAAuB,KAAK,KAAK,KAAK,QAAQ;AAAA,UAC5D;AAAA,QACF,CAAC;AAAA,MACH,WAAW,KAAK,MAAM;AACpB,YACE,CAAC,CAAC,aAAa,cAAc,aAAa,YAAY,EAAE;AAAA,UACtD,KAAK;AAAA,QACP,GACA;AACA,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,+BAAuB,KAAK;AAAA,UAC1B,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,YAAY,KAAK;AAAA,YACjB,MAAM,KAAK;AAAA,UACb;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,oBAAgB,SAAS,KAAK;AAAA,MAC5B,MAAM,QAAQ;AAAA,MACd,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAAuB;AAC9C,SAAO,OAAO,OAAO,QAAQ,EAAE,SAAS,QAAQ,KAAK;AACvD;AAEA,eAAe,qBACb,SACwB;AArmC1B;AAsmCE,QAAM,kBAAiC;AAAA,IACrC,OAAO,QAAQ;AAAA,IACf,UAAU,CAAC;AAAA,IACX,QAAO,aAAQ,cAAR,mBAAmB,IAAI,CAAC,QAAQ;AAAA,MACrC,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,aAAa,QAAQ,gBACjB,OAAO,QAAQ,kBAAkB,WAC/B,QAAQ,gBACR;AAAA,MACE,MAAM;AAAA,MACN,UAAU,QAAQ;AAAA,IACpB,IACF;AAAA,EACN;AAEA,aAAW,WAAW,QAAQ,UAAU;AACtC,UAAM,sBAA4C,CAAC;AAEnD,QAAI,QAAQ,SAAS;AACnB,0BAAoB,KAAK;AAAA,QACvB,MAAM;AAAA,QACN,MAAM,QAAQ;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,UAAM,uBAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACtC,UAAI,qBAAqB,SAAS,KAAK,QAAQ,GAAG;AAChD,YAAI,KAAK,KAAK;AACZ,8BAAoB,KAAK;AAAA,YACvB,MAAM;AAAA,YACN,WAAW;AAAA,cACT,KAAK,KAAK;AAAA,YACZ;AAAA,UACF,CAAC;AAED,8BAAoB,KAAK;AAAA,YACvB,MAAM;AAAA,YACN,MAAM,cAAc,KAAK,GAAG;AAAA,UAC9B,CAAC;AAAA,QACH,WAAW,KAAK,MAAM;AACpB,8BAAoB,KAAK;AAAA,YACvB,MAAM;AAAA,YACN,WAAW;AAAA,cACT,KAAK,QAAQ,KAAK,QAAQ,WAAW,KAAK,IAAI;AAAA,YAChD;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MAiBF,OAAO;AACL,uBAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,oBAAgB,SAAS,KAAK;AAAA,MAC5B,MAAM,QAAQ;AAAA,MACd,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,SAAuB;AAC5C,SAAO,OAAO,OAAO,SAAS,EAAE,SAAS,QAAQ,KAAK;AACxD;AAEA,SAAS,mBAAmB,SAAsC;AApsClE;AAqsCE,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,UAAU,QAAQ,SAAS,IAAI,CAAC,aAAa;AAAA,MAC3C,MAAM,QAAQ;AAAA,MACd,SAAS,wBAAwB,QAAQ,OAAO;AAAA,IAClD,EAAE;AAAA,IACF,QAAO,aAAQ,cAAR,mBAAmB,IAAI,CAAC,QAAQ;AAAA,MACrC,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,aAAa,QAAQ,gBACjB,OAAO,QAAQ,kBAAkB,WAC/B,QAAQ,gBACR;AAAA,MACE,MAAM;AAAA,MACN,UAAU,QAAQ;AAAA,IACpB,IACF;AAAA,IACJ,aAAa,QAAQ;AAAA,EACvB;AACF;AAEA,SAAS,wBACP,SACQ;AACR,SAAO,MAAM,QAAQ,OAAO,IACxB,QACG,IAAI,CAAC,MAAO,EAAE,SAAS,SAAS,EAAE,OAAO,IAAI,EAAE,IAAI,GAAI,EACvD,KAAK,IAAI,IACZ;AACN;AAEA,SAAS,kBAAkB,SAAuB;AAChD,SAAO,OAAO,OAAO,WAAW,EAAE,SAAS,QAAQ,KAAK;AAC1D;AAEA,eAAe,SACb,YACA,SACgC;AAChC,QAAM,WAAW,MAAM,aAAAG,QAAM;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,QAAQ,IAAI,YAAY;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,SAAS;AAEtB,QAAM,SAAS,KAAK,QAAQ,CAAC,EAAE;AAC/B,MAAI,CAAC,QAAQ;AACX,mBAAO,MAAM,YAAY,+BAA+B,IAAI;AAC5D,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,QAAM,eAAe,OAAO,WAAW;AACvC,MAAI,eAAoC;AACxC,MAAI,OAAO,cAAc,OAAO,WAAW,QAAQ;AACjD,UAAM,WAAW,OAAO,WAAW,CAAC;AACpC,mBAAe;AAAA,MACb,MAAM,SAAS,SAAS;AAAA,MACxB,WAAW,KAAK,MAAM,SAAS,SAAS,SAAS;AAAA,IACnD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,eAAe;AAAA,IACf,OAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,oBACb,YACA,SACA,UAAkB,GACc;AAtxClC;AAuxCE,iBAAO,IAAI,YAAY,+BAA+B;AAEtD,MAAI;AACJ,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,QAAI;AACF,qBAAe,MAAM,SAAS,YAAY,OAAO;AACjD,aAAO;AAAA,IACT,SAAS,GAAQ;AACf,qBAAO;AAAA,QACL;AAAA,QACA,UAAU,CAAC,WAAW,EAAE,OAAO;AAAA,UAC/B,OAAE,aAAF,mBAAY,SAAQ;AAAA,MACtB;AAEA,YAAM,QAAQ,MAAM,CAAC;AAAA,IACvB;AAAA,EACF;AACA,QAAMH,SAAQ,IAAI;AAAA,IAChB,iCAAiC,OAAO;AAAA,EAC1C;AACA,EAAAA,OAAM,WAAW;AACjB,QAAMA;AACR;AAEA,eAAe,uBACb,KACA,MACiB;AACjB,QAAM,WAAW,MAAM,aAAAG,QAAM,IAAI,KAAK,EAAE,cAAc,cAAc,CAAC;AAErE,MAAI,cAAc,OAAO,KAAK,SAAS,IAAI;AAC3C,MAAI,eAAe,CAAC;AACpB,MAAI,YAAY,KAAK,IAAI,GAAG;AAC1B,UAAM,YAAY,MAAM,OAAO,EAAE,QAAQ,YAAY,CAAC;AACtD,kBAAc,OAAO,KAAK,UAAU,IAAI;AACxC,mBAAe;AAAA,MACb,KAAK;AAAA,QACH,OAAO,UAAU;AAAA,QACjB,QAAQ,UAAU;AAAA,QAClB,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,MAAM,MAAM,aAAa,YAAY,EACxD,aAAa,EACb,OAAO,MAAM,MAAM,EAAE,KAAK,UAAU,oBAAoB,KAAK,CAAC,EAC9D,IAAI,EACJ,SAAS;AAEZ,SAAO,cAAc,SAAS,QAAQ;AACxC;","names":["ClaudeModel","GPTModel","GroqModel","GeminiModel","error","abortTimeout","response","axios","_a","_b"]}
package/dist/index.mjs CHANGED
@@ -115,7 +115,11 @@ function parseStreamedResponse(identifier, paragraph, functionCallName, function
115
115
  arguments: JSON.parse(functionCallArgs)
116
116
  };
117
117
  } catch (error2) {
118
- logger_default.error(identifier, "Error parsing functionCallArgs:", functionCallArgs);
118
+ logger_default.error(
119
+ identifier,
120
+ "Error parsing functionCallArgs:",
121
+ functionCallArgs
122
+ );
119
123
  throw error2;
120
124
  }
121
125
  }
@@ -166,7 +170,10 @@ async function callOpenAiWithRetries(identifier, openAiPayload, openAiConfig, re
166
170
  );
167
171
  const errorCode = (_b = error2.data) == null ? void 0 : _b.code;
168
172
  if (errorCode === "content_policy_violation") {
169
- logger_default.log(identifier, "Removing images due to content policy violation error");
173
+ logger_default.log(
174
+ identifier,
175
+ "Removing images due to content policy violation error"
176
+ );
170
177
  openAiPayload.messages.forEach((message) => {
171
178
  if (Array.isArray(message.content)) {
172
179
  message.content = message.content.filter(
@@ -176,18 +183,27 @@ async function callOpenAiWithRetries(identifier, openAiPayload, openAiConfig, re
176
183
  });
177
184
  }
178
185
  if (i >= 2 && (openAiConfig == null ? void 0 : openAiConfig.service) === "azure" && errorCode === "content_filter") {
179
- logger_default.log(identifier, "Switching to OpenAI service due to content filter error");
186
+ logger_default.log(
187
+ identifier,
188
+ "Switching to OpenAI service due to content filter error"
189
+ );
180
190
  openAiConfig.service = "openai";
181
191
  }
182
192
  if (i === 3) {
183
193
  if ((openAiConfig == null ? void 0 : openAiConfig.service) === "azure") {
184
- logger_default.log(identifier, "Switching to OpenAI service due to Azure service error");
194
+ logger_default.log(
195
+ identifier,
196
+ "Switching to OpenAI service due to Azure service error"
197
+ );
185
198
  openAiConfig.service = "openai";
186
199
  }
187
200
  }
188
201
  if (i === 4) {
189
202
  if (openAiPayload.tools) {
190
- logger_default.log(identifier, "Switching to no tool choice due to persistent error");
203
+ logger_default.log(
204
+ identifier,
205
+ "Switching to no tool choice due to persistent error"
206
+ );
191
207
  openAiPayload.tool_choice = "none";
192
208
  }
193
209
  }
@@ -238,7 +254,11 @@ async function callOpenAIStream(identifier, openAiPayload, openAiConfig, chunkTi
238
254
  });
239
255
  const parsedPayload = JSON.parse(stringifiedPayload);
240
256
  } catch (error2) {
241
- logger_default.error(identifier, "Stream error: Azure OpenAI JSON parsing error:", error2);
257
+ logger_default.error(
258
+ identifier,
259
+ "Stream error: Azure OpenAI JSON parsing error:",
260
+ error2
261
+ );
242
262
  }
243
263
  response = await fetch(endpoint, {
244
264
  method: "POST",
@@ -294,7 +314,10 @@ async function callOpenAIStream(identifier, openAiPayload, openAiConfig, chunkTi
294
314
  const { done, value } = await reader.read();
295
315
  clearTimeout(abortTimeout2);
296
316
  if (done) {
297
- logger_default.error(identifier, `Stream ended prematurely after ${chunkIndex + 1} chunks`);
317
+ logger_default.error(
318
+ identifier,
319
+ `Stream ended prematurely after ${chunkIndex + 1} chunks`
320
+ );
298
321
  throw new Error("Stream error: ended prematurely");
299
322
  }
300
323
  let chunk = new TextDecoder().decode(value);
@@ -576,7 +599,11 @@ async function callAnthropic(identifier, AiPayload, AiConfig) {
576
599
  /<thinking>|<\/thinking>|<answer>|<\/answer>/gs,
577
600
  ""
578
601
  );
579
- logger_default.log(identifier, "No text in answer, returning text within tags:", text);
602
+ logger_default.log(
603
+ identifier,
604
+ "No text in answer, returning text within tags:",
605
+ text
606
+ );
580
607
  }
581
608
  if (textResponse) {
582
609
  textResponse += `
@@ -594,7 +621,11 @@ ${text}`;
594
621
  }
595
622
  }
596
623
  if (!textResponse && !functionCalls.length) {
597
- logger_default.error(identifier, "Missing text & fns in Anthropic API response:", data);
624
+ logger_default.error(
625
+ identifier,
626
+ "Missing text & fns in Anthropic API response:",
627
+ data
628
+ );
598
629
  throw new Error("Missing text & fns in Anthropic API response");
599
630
  }
600
631
  return {
@@ -704,7 +735,10 @@ async function prepareGoogleAIPayload(payload) {
704
735
  }
705
736
  for (const file of message.files || []) {
706
737
  if (!((_a = file.mimeType) == null ? void 0 : _a.startsWith("image"))) {
707
- logger_default.warn("payload", "Google AI API does not support non-image file types. Skipping file.");
738
+ logger_default.warn(
739
+ "payload",
740
+ "Google AI API does not support non-image file types. Skipping file."
741
+ );
708
742
  continue;
709
743
  }
710
744
  if (file.url) {
@@ -742,7 +776,6 @@ async function prepareGoogleAIPayload(payload) {
742
776
  }
743
777
  async function callGoogleAI(identifier, payload) {
744
778
  var _a, _b, _c;
745
- logger_default.log(identifier, "Calling Google AI API");
746
779
  const googleMessages = jigGoogleMessages(payload.messages);
747
780
  const history = googleMessages.slice(0, -1);
748
781
  const lastMessage = googleMessages.slice(-1)[0];
@@ -786,7 +819,11 @@ async function callGoogleAI(identifier, payload) {
786
819
  };
787
820
  });
788
821
  if (!text && !(parsedFunctionCalls == null ? void 0 : parsedFunctionCalls.length) && !files.length) {
789
- logger_default.error(identifier, "Missing text & fns in Google AI API response:", response);
822
+ logger_default.error(
823
+ identifier,
824
+ "Missing text & fns in Google AI API response:",
825
+ response
826
+ );
790
827
  throw new Error("Missing text & fns in Google AI API response");
791
828
  }
792
829
  return {
@@ -817,7 +854,6 @@ async function callGoogleAIWithRetries(identifier, payload, retries = 5) {
817
854
  async function callWithRetries(identifier, aiPayload, aiConfig, retries = 5, chunkTimeoutMs = 15e3) {
818
855
  const id = identifier;
819
856
  if (isAnthropicPayload(aiPayload)) {
820
- logger_default.log(id, "Delegating call to Anthropic API");
821
857
  return await callAnthropicWithRetries(
822
858
  id,
823
859
  await prepareAnthropicPayload(aiPayload),
@@ -825,7 +861,6 @@ async function callWithRetries(identifier, aiPayload, aiConfig, retries = 5, chu
825
861
  retries
826
862
  );
827
863
  } else if (isOpenAiPayload(aiPayload)) {
828
- logger_default.log(id, "Delegating call to OpenAI API");
829
864
  return await callOpenAiWithRetries(
830
865
  id,
831
866
  await prepareOpenAIPayload(aiPayload),
@@ -834,13 +869,8 @@ async function callWithRetries(identifier, aiPayload, aiConfig, retries = 5, chu
834
869
  chunkTimeoutMs
835
870
  );
836
871
  } else if (isGroqPayload(aiPayload)) {
837
- logger_default.log(id, "Delegating call to Groq API");
838
- return await callGroqWithRetries(
839
- id,
840
- await prepareGroqPayload(aiPayload)
841
- );
872
+ return await callGroqWithRetries(id, await prepareGroqPayload(aiPayload));
842
873
  } else if (isGoogleAIPayload(aiPayload)) {
843
- logger_default.log(id, "Delegating call to Google AI API");
844
874
  return await callGoogleAIWithRetries(
845
875
  id,
846
876
  await prepareGoogleAIPayload(aiPayload),
@@ -875,7 +905,10 @@ async function prepareAnthropicPayload(payload) {
875
905
  }
876
906
  for (const file of message.files || []) {
877
907
  if (!((_a = file.mimeType) == null ? void 0 : _a.startsWith("image"))) {
878
- logger_default.warn("payload", "Anthropic API does not support non-image file types. Skipping file.");
908
+ logger_default.warn(
909
+ "payload",
910
+ "Anthropic API does not support non-image file types. Skipping file."
911
+ );
879
912
  continue;
880
913
  }
881
914
  if (file.url) {
@@ -965,7 +998,11 @@ async function prepareOpenAIPayload(payload) {
965
998
  });
966
999
  }
967
1000
  } else {
968
- logger_default.warn("payload", "Skipping file in message. File or image type not supported by OpenAI API:", file.mimeType);
1001
+ logger_default.warn(
1002
+ "payload",
1003
+ "Skipping file in message. File or image type not supported by OpenAI API:",
1004
+ file.mimeType
1005
+ );
969
1006
  }
970
1007
  }
971
1008
  preparedPayload.messages.push({
@@ -1045,7 +1082,11 @@ async function callGroqWithRetries(identifier, payload, retries = 5) {
1045
1082
  lastResponse = await callGroq(identifier, payload);
1046
1083
  return lastResponse;
1047
1084
  } catch (e) {
1048
- logger_default.error(identifier, `Retry #${i} error: ${e.message}`, ((_a = e.response) == null ? void 0 : _a.data) || e);
1085
+ logger_default.error(
1086
+ identifier,
1087
+ `Retry #${i} error: ${e.message}`,
1088
+ ((_a = e.response) == null ? void 0 : _a.data) || e
1089
+ );
1049
1090
  await timeout(125 * i);
1050
1091
  }
1051
1092
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../interfaces.ts","../logger.ts","../index.ts","../utils.ts"],"sourcesContent":["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 SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\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}\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 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 type GoogleAIPart = GoogleAITextPart | GoogleAIInlineDataPart;\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 interface GenericPayload {\n model: GPTModel | ClaudeModel | GroqModel | GeminiModel;\n messages: GenericMessage[];\n functions?: FunctionDefinition[];\n function_call?: \"none\" | \"auto\" | { name: string };\n temperature?: number;\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","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} 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\";\nconst { GoogleGenerativeAI } = require(\"@google/generative-ai\");\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} from \"./interfaces\";\n\nfunction parseStreamedResponse(\n identifier: Identifier,\n paragraph: string,\n functionCallName: string,\n functionCallArgs: string,\n allowedFunctionNames: Set<string> | null\n): ParsedResponseMessage {\n let functionCall: ParsedResponseMessage[\"function_call\"] = null;\n if (functionCallName && functionCallArgs) {\n if (allowedFunctionNames && !allowedFunctionNames.has(functionCallName)) {\n throw new Error(\n \"Stream error: received function call with unknown name: \" +\n functionCallName\n );\n }\n\n try {\n functionCall = {\n name: functionCallName,\n arguments: JSON.parse(functionCallArgs),\n };\n } catch (error) {\n logger.error(identifier, \"Error parsing functionCallArgs:\", functionCallArgs);\n throw error;\n }\n }\n\n if (!paragraph && !functionCall) {\n logger.error(\n identifier,\n \"Stream error: received message without content or function_call, raw:\",\n JSON.stringify({ paragraph, functionCallName, functionCallArgs })\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: functionCall,\n files: [],\n };\n}\n\nasync function callOpenAiWithRetries(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n logger.log(\n identifier,\n \"Calling OpenAI API with retries:\",\n openAiConfig?.service,\n openAiPayload.model\n );\n\n let errorObj: any;\n for (let i = 0; i <= retries; i++) {\n try {\n const timerId = `timer:${identifier}:${Date.now()}:callOpenAi:${\n openAiConfig?.service\n }-${openAiPayload.model}-${openAiConfig?.orgId}`;\n\n if (\n openAiPayload.model === GPTModel.O1_MINI ||\n openAiPayload.model === GPTModel.O1_PREVIEW\n ) {\n return await callOpenAI(identifier, openAiPayload, openAiConfig);\n } else {\n return await callOpenAIStream(\n identifier,\n openAiPayload,\n openAiConfig,\n chunkTimeoutMs\n );\n }\n } catch (error: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${error.message}`,\n error.response?.data || error.data || error\n );\n\n const errorCode = error.data?.code;\n\n // Usually due to image content, we get a policy violation error\n if (errorCode === \"content_policy_violation\") {\n logger.log(identifier, \"Removing images due to content policy violation error\");\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 // on 2nd or more retries\n // if Azure content policy error is persistent\n if (\n i >= 2 &&\n openAiConfig?.service === \"azure\" &&\n errorCode === \"content_filter\"\n ) {\n logger.log(identifier, \"Switching to OpenAI service due to content filter error\");\n openAiConfig.service = \"openai\"; // Move to OpenAI, failed due to Azure content policy\n }\n\n // on 3rd retry\n if (i === 3) {\n if (openAiConfig?.service === \"azure\") {\n logger.log(identifier, \"Switching to OpenAI service due to Azure service error\");\n openAiConfig.service = \"openai\";\n }\n }\n\n // on 4th retry\n if (i === 4) {\n // abort function calling, e.g. stubborn `python` function call case\n if (openAiPayload.tools) {\n logger.log(identifier, \"Switching to no tool choice due to persistent error\");\n openAiPayload.tool_choice = \"none\";\n }\n }\n\n await timeout(250);\n }\n }\n\n logger.error(\n identifier,\n `Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`,\n errorObj\n );\n throw new Error(\n `${identifier}: Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`\n );\n}\n\nasync function callOpenAIStream(\n identifier: 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 if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n const controller = new AbortController();\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: true,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n } catch (error) {\n logger.error(identifier, \"Stream error: Azure OpenAI JSON parsing error:\", error);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n }\n\n if (response.body) {\n let rawStreamedBody = \"\";\n let paragraph = \"\";\n let functionCallName = \"\";\n let functionCallArgs = \"\";\n\n const reader = response.body.getReader();\n\n let partialChunk = \"\";\n let abortTimeout: NodeJS.Timeout | null = null;\n const startAbortTimeout = () => {\n abortTimeout && clearTimeout(abortTimeout);\n return setTimeout(() => {\n logger.error(identifier, `Stream timeout after ${chunkTimeoutMs}ms`);\n controller.abort();\n }, chunkTimeoutMs);\n };\n\n let chunkIndex = -1;\n while (true) {\n chunkIndex++;\n const abortTimeout = startAbortTimeout();\n const { done, value } = await reader.read();\n clearTimeout(abortTimeout);\n\n if (done) {\n logger.error(identifier, `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 rawStreamedBody += chunk + \"\\n\";\n if (partialChunk) {\n chunk = partialChunk + chunk;\n partialChunk = \"\";\n }\n let jsonStrings = chunk.split(/^data: /gm);\n\n for (let jsonString of jsonStrings) {\n if (!jsonString) {\n continue;\n }\n\n if (jsonString.includes(\"[DONE]\")) {\n try {\n return parseStreamedResponse(\n identifier,\n paragraph,\n functionCallName,\n functionCallArgs,\n functionNames\n );\n } catch (error) {\n logger.error(identifier, \"Stream error: parsing response\");\n throw error;\n }\n }\n\n let json;\n try {\n json = JSON.parse(jsonString.trim());\n } catch (error: any) {\n partialChunk = jsonString; // We're assuming any JSON parsing error means we got a non-terminated JSON for a chunk\n continue;\n }\n\n if (!json.choices || !json.choices.length) {\n if (json.error) {\n logger.error(identifier, \"Stream error: OpenAI error:\", 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(identifier, \"Stream error: no choices in JSON:\", json);\n }\n continue;\n }\n\n const dToolCall:\n | {\n index?: number;\n function?: {\n name?: string;\n arguments?: string;\n };\n }\n | undefined = json.choices?.[0]?.delta?.tool_calls?.[0];\n if (dToolCall) {\n const toolCallIndex = dToolCall.index || 0;\n // TODO: handle multiple function calls in response\n if (toolCallIndex === 0) {\n const dFn = dToolCall.function || {};\n if (dFn.name) functionCallName += dFn.name;\n if (dFn.arguments) functionCallArgs += dFn.arguments;\n }\n }\n\n const text = json.choices?.[0]?.delta?.content;\n if (text) {\n paragraph += text;\n }\n }\n }\n } else {\n throw new Error(\"Stream error: no response body\");\n }\n}\n\nasync function callOpenAI(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined\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 if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: false,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n // You can use parsedPayload if needed\n } catch (error) {\n logger.error(identifier, \"OpenAI JSON parsing error:\", error);\n throw error;\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n }\n\n if (!response.ok) {\n const errorData = await response.json();\n logger.error(identifier, \"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 || !data.choices.length) {\n if (data.error) {\n logger.error(identifier, \"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 const functionCall = choice.function_call\n ? {\n name: choice.function_call.name,\n arguments: JSON.parse(choice.function_call.arguments),\n }\n : null;\n\n return {\n role: \"assistant\",\n content: choice.message.content || null,\n function_call: functionCall,\n files: [],\n };\n}\n\nfunction truncatePayload(payload: OpenAIPayload): string {\n return JSON.stringify(\n {\n ...payload,\n messages: payload.messages.map((message) => {\n if (typeof message.content === \"string\") {\n message.content = message.content.slice(0, 100);\n } else if (Array.isArray(message.content)) {\n message.content = message.content.map((block) => {\n if (block.type === \"image_url\") {\n block.image_url.url = block.image_url.url.slice(0, 100);\n }\n return block;\n });\n }\n\n return message;\n }),\n },\n null,\n 2\n );\n}\n\nasync function callAnthropicWithRetries(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig,\n attempts = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Anthropic API with retries\");\n let lastResponse;\n for (let i = 0; i < attempts; i++) {\n try {\n lastResponse = await callAnthropic(identifier, AiPayload, AiConfig);\n return lastResponse;\n } catch (e: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${e.message}`,\n e.response?.data || e\n );\n\n if (e.response?.data?.error?.type === \"rate_limit_error\") {\n // TODO: upgrade model or fallback to bedrock\n }\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Anthropic API after ${attempts} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\n}\n\nasync function callAnthropic(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig\n): Promise<ParsedResponseMessage> {\n const anthropicMessages = jigAnthropicMessages(AiPayload.messages);\n\n let data;\n let response;\n if (AiConfig?.service === \"bedrock\") {\n // DOES NOT SUPPORT TOOLS YET\n const AWS_REGION = \"us-east-1\";\n const MODEL_ID = \"anthropic.claude-3-haiku-20240307-v1:0\";\n\n // set in environment\n // process.env.AWS_ACCESS_KEY_ID = AWS_ACCESS_KEY_ID;\n // process.env.AWS_SECRET_ACCESS_KEY = AWS_SECRET_ACCESS_KEY;\n\n const client = new BedrockRuntimeClient({ region: AWS_REGION });\n const payload = {\n anthropic_version: \"bedrock-2023-05-31\",\n max_tokens: 4096,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n };\n\n const response = await client.send(\n new InvokeModelCommand({\n contentType: \"application/json\",\n body: JSON.stringify(payload),\n modelId: MODEL_ID,\n })\n );\n\n const decodedResponseBody = new TextDecoder().decode(response.body);\n data = JSON.parse(decodedResponseBody);\n } else {\n // default to anthropic\n const response = await axios.post(\n \"https://api.anthropic.com/v1/messages\",\n {\n model: AiPayload.model,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n temperature: AiPayload.temperature,\n system: AiPayload.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\n data = response.data;\n }\n\n const answers = data.content;\n\n if (!answers[0]) {\n logger.error(identifier, \"Missing answer in Anthropic API:\", data);\n throw new Error(\"Missing answer in Anthropic API\");\n }\n\n let textResponse = \"\";\n let functionCalls: any[] = [];\n for (const answer of answers) {\n if (!answer.type) {\n logger.error(identifier, \"Missing answer type in Anthropic API:\", data);\n throw new Error(\"Missing answer type in Anthropic API\");\n }\n\n let text = \"\";\n if (answer.type === \"text\") {\n text = answer.text\n .replace(/<thinking>.*?<\\/thinking>/gs, \"\")\n .replace(/<answer>|<\\/answer>/gs, \"\")\n .trim();\n\n if (!text) {\n // remove the tags and return the text within\n text = answer.text.replace(\n /<thinking>|<\\/thinking>|<answer>|<\\/answer>/gs,\n \"\"\n );\n logger.log(identifier, \"No text in answer, returning text within tags:\", text);\n }\n\n if (textResponse) {\n textResponse += `\\n\\n${text}`;\n } else {\n textResponse = text;\n }\n } else if (answer.type === \"tool_use\") {\n const call = {\n name: answer.name,\n arguments: answer.input,\n };\n functionCalls.push(call);\n }\n }\n\n if (!textResponse && !functionCalls.length) {\n logger.error(identifier, \"Missing text & fns in Anthropic API response:\", data);\n throw new Error(\"Missing text & fns in Anthropic API response\");\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCalls[0],\n files: [],\n };\n}\n\nfunction jigAnthropicMessages(\n messages: AnthropicAIMessage[]\n): AnthropicAIMessage[] {\n // Takes a list if messages each with a role and content\n // Assumes no system messages are present\n\n let jiggedMessages = messages.slice();\n\n // If the first message is not user, add an empty user message at the start\n if (jiggedMessages[0]?.role !== \"user\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n content: \"...\",\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their content\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n // Combine content of messages with the same 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 // If last message in array is assistant, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"assistant\") {\n jiggedMessages.push({\n role: \"user\",\n content: \"...\",\n });\n }\n\n return jiggedMessages;\n}\n\nfunction jigGoogleMessages(messages: GoogleAIMessage[]): GoogleAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // If the first message is model, add an empty user message at the start\n if (jiggedMessages[0]?.role === \"model\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n parts: [{ text: \"...\" }],\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their parts\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\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 // If last message in array is model, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"model\") {\n jiggedMessages.push({\n role: \"user\",\n parts: [{ text: \"...\" }],\n });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareGoogleAIPayload(\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 // Google puts their description in the parameters object rather than in a top-level field\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 googleAIContentParts: GoogleAIPart[] = [];\n\n if (message.content) {\n googleAIContentParts.push({\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\"payload\", \"Google AI API does not support non-image file types. Skipping file.\");\n continue;\n }\n\n if (file.url) {\n googleAIContentParts.push({\n inlineData: {\n mimeType: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n // Add the URL as a text part\n googleAIContentParts.push({\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n googleAIContentParts.push({\n inlineData: {\n mimeType: file.mimeType,\n data: file.data,\n },\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role === \"assistant\" ? \"model\" : message.role,\n parts: googleAIContentParts,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callGoogleAI(\n identifier: Identifier,\n payload: GoogleAIPayload\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Google AI API\");\n const googleMessages = jigGoogleMessages(payload.messages);\n\n const history = googleMessages.slice(0, -1);\n const lastMessage = googleMessages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({\n apiKey: process.env.GEMINI_API_KEY,\n });\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({\n message: lastMessage.parts,\n });\n\n let text: string = \"\";\n const files: File[] = [];\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.text) {\n text += part.text;\n }\n\n if (part.inlineData) {\n const imageData = part.inlineData.data;\n if (imageData) {\n files.push({\n mimeType: \"image/png\",\n data: imageData,\n });\n }\n }\n }\n\n const functionCalls:\n | {\n name?: string;\n args?: Record<string, any>;\n }[]\n | undefined = response.functionCalls;\n\n const parsedFunctionCalls = functionCalls?.map((fc) => ({\n name: fc.name ?? \"\",\n arguments: fc.args ?? {},\n }));\n\n if (!text && !parsedFunctionCalls?.length && !files.length) {\n logger.error(identifier, \"Missing text & fns in Google AI API response:\", response);\n throw new Error(\"Missing text & fns in Google AI API response\");\n }\n\n return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: parsedFunctionCalls?.[0] || null,\n };\n}\n\nasync function callGoogleAIWithRetries(\n identifier: Identifier,\n payload: GoogleAIPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Google AI API with retries\");\n\n let lastError: any;\n for (let i = 0; i < retries; i++) {\n try {\n return await callGoogleAI(identifier, payload);\n } catch (e: any) {\n lastError = e;\n logger.error(identifier, `Retry #${i} error: ${e.message}`, e);\n\n // Add any specific Google AI error handling or payload modifications here if needed\n // e.g., if (e.status === 429) { /* handle rate limit */ }\n\n await timeout(125 * i); // Exponential backoff\n }\n }\n const error = new Error(\n `Failed to call Google AI API after ${retries} attempts`\n ) as any;\n error.cause = lastError; // Attach the last caught error\n throw error;\n}\n\nexport async function callWithRetries(\n identifier: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n const id = identifier;\n // Determine which service to use based on the model type\n if (isAnthropicPayload(aiPayload)) {\n logger.log(id, \"Delegating call to Anthropic API\");\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(aiPayload),\n aiConfig as AnthropicAIConfig,\n retries\n );\n } else if (isOpenAiPayload(aiPayload)) {\n logger.log(id, \"Delegating call to OpenAI API\");\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs\n );\n } else if (isGroqPayload(aiPayload)) {\n logger.log(id, \"Delegating call to Groq API\");\n return await callGroqWithRetries(\n id,\n await prepareGroqPayload(aiPayload)\n );\n } else if (isGoogleAIPayload(aiPayload)) {\n logger.log(id, \"Delegating call to Google AI API\");\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(aiPayload),\n retries\n );\n } else {\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n }\n}\n\nfunction isAnthropicPayload(payload: any): Boolean {\n return Object.values(ClaudeModel).includes(payload.model);\n}\n\nasync function prepareAnthropicPayload(\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 const anthropicContentBlocks: AnthropicContentBlock[] = [];\n\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n if (message.content) {\n anthropicContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\"payload\", \"Anthropic API does not support non-image file types. Skipping file.\");\n continue;\n }\n\n if (file.url) {\n anthropicContentBlocks.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 } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n anthropicContentBlocks.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\n preparedPayload.messages.push({\n role: message.role,\n content: anthropicContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isOpenAiPayload(payload: any): Boolean {\n return Object.values(GPTModel).includes(payload.model);\n}\n\nasync function prepareOpenAIPayload(\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 // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const openAIContentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n openAIContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n const allowedFileMimeTypes = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ];\n\n for (const file of message.files || []) {\n if (allowedFileMimeTypes.includes(file.mimeType)) {\n if (file.url) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: file.url,\n },\n });\n // Add the URL as a text part\n openAIContentBlocks.push({\n type: \"text\",\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: `data:${file.mimeType};base64,${file.data}`,\n },\n });\n }\n // } else if (file.mimeType?.startsWith(\"audio\")) {\n // if (file.url) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: file.url,\n // },\n // });\n // } else if (file.data) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: `data:${file.mimeType};base64,${file.data}`,\n // },\n // });\n // }\n } else {\n logger.warn(\"payload\", \"Skipping file in message. File or image type not supported by OpenAI API:\", file.mimeType);\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: openAIContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isGroqPayload(payload: any): Boolean {\n return Object.values(GroqModel).includes(payload.model);\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 // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n temperature: payload.temperature,\n };\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 isGoogleAIPayload(payload: any): Boolean {\n return Object.values(GeminiModel).includes(payload.model);\n}\n\nasync function callGroq(\n identifier: 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 data = response.data;\n\n const answer = data.choices[0].message;\n if (!answer) {\n logger.error(identifier, \"Missing answer in Groq API:\", data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const textResponse = answer.content || null;\n let functionCall: FunctionCall | null = null;\n if (answer.tool_calls && answer.tool_calls.length) {\n const toolCall = answer.tool_calls[0];\n functionCall = {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments),\n };\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCall,\n files: [],\n };\n}\n\nasync function callGroqWithRetries(\n identifier: Identifier,\n payload: GroqPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Groq API with retries\");\n\n let lastResponse;\n for (let i = 0; i < retries; i++) {\n try {\n lastResponse = await callGroq(identifier, payload);\n return lastResponse;\n } catch (e: any) {\n logger.error(identifier, `Retry #${i} error: ${e.message}`, e.response?.data || e);\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Groq API after ${retries} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\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 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\n// async function main() {\n// const payload: GenericPayload = {\n// model: GeminiModel.GEMINI_15_PRO,\n// messages: [\n// {\n// role: \"user\",\n// content: \"What is this logo?\",\n// files: [\n// {\n// mimeType: \"image/png\",\n// url: \"https://www.wikimedia.org/static/images/wmf-logo-2x.png\",\n// },\n// ],\n// },\n// ],\n// functions: [\n// {\n// name: \"answer_logo_question\",\n// description: \"Answer a question about a logo\",\n// parameters: {\n// type: \"object\",\n// properties: {\n// organization: {\n// type: \"string\",\n// },\n// },\n// },\n// },\n// ],\n// };\n\n// const answer = await callWithRetries(\"test\", payload);\n\n// console.log(answer);\n// }\n\n// main();\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","abortTimeout","response","_a","_b"]}
1
+ {"version":3,"sources":["../interfaces.ts","../logger.ts","../index.ts","../utils.ts"],"sourcesContent":["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 SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\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}\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 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 type GoogleAIPart = GoogleAITextPart | GoogleAIInlineDataPart;\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 interface GenericPayload {\n model: GPTModel | ClaudeModel | GroqModel | GeminiModel;\n messages: GenericMessage[];\n functions?: FunctionDefinition[];\n function_call?: \"none\" | \"auto\" | { name: string };\n temperature?: number;\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","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} 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\";\nconst { GoogleGenerativeAI } = require(\"@google/generative-ai\");\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} from \"./interfaces\";\n\nfunction parseStreamedResponse(\n identifier: Identifier,\n paragraph: string,\n functionCallName: string,\n functionCallArgs: string,\n allowedFunctionNames: Set<string> | null\n): ParsedResponseMessage {\n let functionCall: ParsedResponseMessage[\"function_call\"] = null;\n if (functionCallName && functionCallArgs) {\n if (allowedFunctionNames && !allowedFunctionNames.has(functionCallName)) {\n throw new Error(\n \"Stream error: received function call with unknown name: \" +\n functionCallName\n );\n }\n\n try {\n functionCall = {\n name: functionCallName,\n arguments: JSON.parse(functionCallArgs),\n };\n } catch (error) {\n logger.error(\n identifier,\n \"Error parsing functionCallArgs:\",\n functionCallArgs\n );\n throw error;\n }\n }\n\n if (!paragraph && !functionCall) {\n logger.error(\n identifier,\n \"Stream error: received message without content or function_call, raw:\",\n JSON.stringify({ paragraph, functionCallName, functionCallArgs })\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: functionCall,\n files: [],\n };\n}\n\nasync function callOpenAiWithRetries(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n logger.log(\n identifier,\n \"Calling OpenAI API with retries:\",\n openAiConfig?.service,\n openAiPayload.model\n );\n\n let errorObj: any;\n for (let i = 0; i <= retries; i++) {\n try {\n const timerId = `timer:${identifier}:${Date.now()}:callOpenAi:${\n openAiConfig?.service\n }-${openAiPayload.model}-${openAiConfig?.orgId}`;\n\n if (\n openAiPayload.model === GPTModel.O1_MINI ||\n openAiPayload.model === GPTModel.O1_PREVIEW\n ) {\n return await callOpenAI(identifier, openAiPayload, openAiConfig);\n } else {\n return await callOpenAIStream(\n identifier,\n openAiPayload,\n openAiConfig,\n chunkTimeoutMs\n );\n }\n } catch (error: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${error.message}`,\n error.response?.data || error.data || error\n );\n\n const errorCode = error.data?.code;\n\n // Usually due to image content, we get a policy violation error\n if (errorCode === \"content_policy_violation\") {\n logger.log(\n identifier,\n \"Removing images due to content policy violation error\"\n );\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 // on 2nd or more retries\n // if Azure content policy error is persistent\n if (\n i >= 2 &&\n openAiConfig?.service === \"azure\" &&\n errorCode === \"content_filter\"\n ) {\n logger.log(\n identifier,\n \"Switching to OpenAI service due to content filter error\"\n );\n openAiConfig.service = \"openai\"; // Move to OpenAI, failed due to Azure content policy\n }\n\n // on 3rd retry\n if (i === 3) {\n if (openAiConfig?.service === \"azure\") {\n logger.log(\n identifier,\n \"Switching to OpenAI service due to Azure service error\"\n );\n openAiConfig.service = \"openai\";\n }\n }\n\n // on 4th retry\n if (i === 4) {\n // abort function calling, e.g. stubborn `python` function call case\n if (openAiPayload.tools) {\n logger.log(\n identifier,\n \"Switching to no tool choice due to persistent error\"\n );\n openAiPayload.tool_choice = \"none\";\n }\n }\n\n await timeout(250);\n }\n }\n\n logger.error(\n identifier,\n `Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`,\n errorObj\n );\n throw new Error(\n `${identifier}: Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`\n );\n}\n\nasync function callOpenAIStream(\n identifier: 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 if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n const controller = new AbortController();\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: true,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n } catch (error) {\n logger.error(\n identifier,\n \"Stream error: Azure OpenAI JSON parsing error:\",\n error\n );\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n }\n\n if (response.body) {\n let rawStreamedBody = \"\";\n let paragraph = \"\";\n let functionCallName = \"\";\n let functionCallArgs = \"\";\n\n const reader = response.body.getReader();\n\n let partialChunk = \"\";\n let abortTimeout: NodeJS.Timeout | null = null;\n const startAbortTimeout = () => {\n abortTimeout && clearTimeout(abortTimeout);\n return setTimeout(() => {\n logger.error(identifier, `Stream timeout after ${chunkTimeoutMs}ms`);\n controller.abort();\n }, chunkTimeoutMs);\n };\n\n let chunkIndex = -1;\n while (true) {\n chunkIndex++;\n const abortTimeout = startAbortTimeout();\n const { done, value } = await reader.read();\n clearTimeout(abortTimeout);\n\n if (done) {\n logger.error(\n identifier,\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 rawStreamedBody += chunk + \"\\n\";\n if (partialChunk) {\n chunk = partialChunk + chunk;\n partialChunk = \"\";\n }\n let jsonStrings = chunk.split(/^data: /gm);\n\n for (let jsonString of jsonStrings) {\n if (!jsonString) {\n continue;\n }\n\n if (jsonString.includes(\"[DONE]\")) {\n try {\n return parseStreamedResponse(\n identifier,\n paragraph,\n functionCallName,\n functionCallArgs,\n functionNames\n );\n } catch (error) {\n logger.error(identifier, \"Stream error: parsing response\");\n throw error;\n }\n }\n\n let json;\n try {\n json = JSON.parse(jsonString.trim());\n } catch (error: any) {\n partialChunk = jsonString; // We're assuming any JSON parsing error means we got a non-terminated JSON for a chunk\n continue;\n }\n\n if (!json.choices || !json.choices.length) {\n if (json.error) {\n logger.error(identifier, \"Stream error: OpenAI error:\", 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(identifier, \"Stream error: no choices in JSON:\", json);\n }\n continue;\n }\n\n const dToolCall:\n | {\n index?: number;\n function?: {\n name?: string;\n arguments?: string;\n };\n }\n | undefined = json.choices?.[0]?.delta?.tool_calls?.[0];\n if (dToolCall) {\n const toolCallIndex = dToolCall.index || 0;\n // TODO: handle multiple function calls in response\n if (toolCallIndex === 0) {\n const dFn = dToolCall.function || {};\n if (dFn.name) functionCallName += dFn.name;\n if (dFn.arguments) functionCallArgs += dFn.arguments;\n }\n }\n\n const text = json.choices?.[0]?.delta?.content;\n if (text) {\n paragraph += text;\n }\n }\n }\n } else {\n throw new Error(\"Stream error: no response body\");\n }\n}\n\nasync function callOpenAI(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined\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 if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: false,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n // You can use parsedPayload if needed\n } catch (error) {\n logger.error(identifier, \"OpenAI JSON parsing error:\", error);\n throw error;\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n }\n\n if (!response.ok) {\n const errorData = await response.json();\n logger.error(identifier, \"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 || !data.choices.length) {\n if (data.error) {\n logger.error(identifier, \"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 const functionCall = choice.function_call\n ? {\n name: choice.function_call.name,\n arguments: JSON.parse(choice.function_call.arguments),\n }\n : null;\n\n return {\n role: \"assistant\",\n content: choice.message.content || null,\n function_call: functionCall,\n files: [],\n };\n}\n\nfunction truncatePayload(payload: OpenAIPayload): string {\n return JSON.stringify(\n {\n ...payload,\n messages: payload.messages.map((message) => {\n if (typeof message.content === \"string\") {\n message.content = message.content.slice(0, 100);\n } else if (Array.isArray(message.content)) {\n message.content = message.content.map((block) => {\n if (block.type === \"image_url\") {\n block.image_url.url = block.image_url.url.slice(0, 100);\n }\n return block;\n });\n }\n\n return message;\n }),\n },\n null,\n 2\n );\n}\n\nasync function callAnthropicWithRetries(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig,\n attempts = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Anthropic API with retries\");\n let lastResponse;\n for (let i = 0; i < attempts; i++) {\n try {\n lastResponse = await callAnthropic(identifier, AiPayload, AiConfig);\n return lastResponse;\n } catch (e: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${e.message}`,\n e.response?.data || e\n );\n\n if (e.response?.data?.error?.type === \"rate_limit_error\") {\n // TODO: upgrade model or fallback to bedrock\n }\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Anthropic API after ${attempts} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\n}\n\nasync function callAnthropic(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig\n): Promise<ParsedResponseMessage> {\n const anthropicMessages = jigAnthropicMessages(AiPayload.messages);\n\n let data;\n let response;\n if (AiConfig?.service === \"bedrock\") {\n // DOES NOT SUPPORT TOOLS YET\n const AWS_REGION = \"us-east-1\";\n const MODEL_ID = \"anthropic.claude-3-haiku-20240307-v1:0\";\n\n // set in environment\n // process.env.AWS_ACCESS_KEY_ID = AWS_ACCESS_KEY_ID;\n // process.env.AWS_SECRET_ACCESS_KEY = AWS_SECRET_ACCESS_KEY;\n\n const client = new BedrockRuntimeClient({ region: AWS_REGION });\n const payload = {\n anthropic_version: \"bedrock-2023-05-31\",\n max_tokens: 4096,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n };\n\n const response = await client.send(\n new InvokeModelCommand({\n contentType: \"application/json\",\n body: JSON.stringify(payload),\n modelId: MODEL_ID,\n })\n );\n\n const decodedResponseBody = new TextDecoder().decode(response.body);\n data = JSON.parse(decodedResponseBody);\n } else {\n // default to anthropic\n const response = await axios.post(\n \"https://api.anthropic.com/v1/messages\",\n {\n model: AiPayload.model,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n temperature: AiPayload.temperature,\n system: AiPayload.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\n data = response.data;\n }\n\n const answers = data.content;\n\n if (!answers[0]) {\n logger.error(identifier, \"Missing answer in Anthropic API:\", data);\n throw new Error(\"Missing answer in Anthropic API\");\n }\n\n let textResponse = \"\";\n let functionCalls: any[] = [];\n for (const answer of answers) {\n if (!answer.type) {\n logger.error(identifier, \"Missing answer type in Anthropic API:\", data);\n throw new Error(\"Missing answer type in Anthropic API\");\n }\n\n let text = \"\";\n if (answer.type === \"text\") {\n text = answer.text\n .replace(/<thinking>.*?<\\/thinking>/gs, \"\")\n .replace(/<answer>|<\\/answer>/gs, \"\")\n .trim();\n\n if (!text) {\n // remove the tags and return the text within\n text = answer.text.replace(\n /<thinking>|<\\/thinking>|<answer>|<\\/answer>/gs,\n \"\"\n );\n logger.log(\n identifier,\n \"No text in answer, returning text within tags:\",\n text\n );\n }\n\n if (textResponse) {\n textResponse += `\\n\\n${text}`;\n } else {\n textResponse = text;\n }\n } else if (answer.type === \"tool_use\") {\n const call = {\n name: answer.name,\n arguments: answer.input,\n };\n functionCalls.push(call);\n }\n }\n\n if (!textResponse && !functionCalls.length) {\n logger.error(\n identifier,\n \"Missing text & fns in Anthropic API response:\",\n data\n );\n throw new Error(\"Missing text & fns in Anthropic API response\");\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCalls[0],\n files: [],\n };\n}\n\nfunction jigAnthropicMessages(\n messages: AnthropicAIMessage[]\n): AnthropicAIMessage[] {\n // Takes a list if messages each with a role and content\n // Assumes no system messages are present\n\n let jiggedMessages = messages.slice();\n\n // If the first message is not user, add an empty user message at the start\n if (jiggedMessages[0]?.role !== \"user\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n content: \"...\",\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their content\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n // Combine content of messages with the same 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 // If last message in array is assistant, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"assistant\") {\n jiggedMessages.push({\n role: \"user\",\n content: \"...\",\n });\n }\n\n return jiggedMessages;\n}\n\nfunction jigGoogleMessages(messages: GoogleAIMessage[]): GoogleAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // If the first message is model, add an empty user message at the start\n if (jiggedMessages[0]?.role === \"model\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n parts: [{ text: \"...\" }],\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their parts\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\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 // If last message in array is model, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"model\") {\n jiggedMessages.push({\n role: \"user\",\n parts: [{ text: \"...\" }],\n });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareGoogleAIPayload(\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 // Google puts their description in the parameters object rather than in a top-level field\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 googleAIContentParts: GoogleAIPart[] = [];\n\n if (message.content) {\n googleAIContentParts.push({\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\n \"payload\",\n \"Google AI API does not support non-image file types. Skipping file.\"\n );\n continue;\n }\n\n if (file.url) {\n googleAIContentParts.push({\n inlineData: {\n mimeType: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n // Add the URL as a text part\n googleAIContentParts.push({\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n googleAIContentParts.push({\n inlineData: {\n mimeType: file.mimeType,\n data: file.data,\n },\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role === \"assistant\" ? \"model\" : message.role,\n parts: googleAIContentParts,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callGoogleAI(\n identifier: Identifier,\n payload: GoogleAIPayload\n): Promise<ParsedResponseMessage> {\n const googleMessages = jigGoogleMessages(payload.messages);\n\n const history = googleMessages.slice(0, -1);\n const lastMessage = googleMessages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({\n apiKey: process.env.GEMINI_API_KEY,\n });\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({\n message: lastMessage.parts,\n });\n\n let text: string = \"\";\n const files: File[] = [];\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.text) {\n text += part.text;\n }\n\n if (part.inlineData) {\n const imageData = part.inlineData.data;\n if (imageData) {\n files.push({\n mimeType: \"image/png\",\n data: imageData,\n });\n }\n }\n }\n\n const functionCalls:\n | {\n name?: string;\n args?: Record<string, any>;\n }[]\n | undefined = response.functionCalls;\n\n const parsedFunctionCalls = functionCalls?.map((fc) => ({\n name: fc.name ?? \"\",\n arguments: fc.args ?? {},\n }));\n\n if (!text && !parsedFunctionCalls?.length && !files.length) {\n logger.error(\n identifier,\n \"Missing text & fns in Google AI API response:\",\n response\n );\n throw new Error(\"Missing text & fns in Google AI API response\");\n }\n\n return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: parsedFunctionCalls?.[0] || null,\n };\n}\n\nasync function callGoogleAIWithRetries(\n identifier: Identifier,\n payload: GoogleAIPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Google AI API with retries\");\n\n let lastError: any;\n for (let i = 0; i < retries; i++) {\n try {\n return await callGoogleAI(identifier, payload);\n } catch (e: any) {\n lastError = e;\n logger.error(identifier, `Retry #${i} error: ${e.message}`, e);\n\n // Add any specific Google AI error handling or payload modifications here if needed\n // e.g., if (e.status === 429) { /* handle rate limit */ }\n\n await timeout(125 * i); // Exponential backoff\n }\n }\n const error = new Error(\n `Failed to call Google AI API after ${retries} attempts`\n ) as any;\n error.cause = lastError; // Attach the last caught error\n throw error;\n}\n\nexport async function callWithRetries(\n identifier: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n const id = identifier;\n // Determine which service to use based on the model type\n if (isAnthropicPayload(aiPayload)) {\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(aiPayload),\n aiConfig as AnthropicAIConfig,\n retries\n );\n } else if (isOpenAiPayload(aiPayload)) {\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs\n );\n } else if (isGroqPayload(aiPayload)) {\n return await callGroqWithRetries(id, await prepareGroqPayload(aiPayload));\n } else if (isGoogleAIPayload(aiPayload)) {\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(aiPayload),\n retries\n );\n } else {\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n }\n}\n\nfunction isAnthropicPayload(payload: any): Boolean {\n return Object.values(ClaudeModel).includes(payload.model);\n}\n\nasync function prepareAnthropicPayload(\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 const anthropicContentBlocks: AnthropicContentBlock[] = [];\n\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n if (message.content) {\n anthropicContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\n \"payload\",\n \"Anthropic API does not support non-image file types. Skipping file.\"\n );\n continue;\n }\n\n if (file.url) {\n anthropicContentBlocks.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 } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n anthropicContentBlocks.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\n preparedPayload.messages.push({\n role: message.role,\n content: anthropicContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isOpenAiPayload(payload: any): Boolean {\n return Object.values(GPTModel).includes(payload.model);\n}\n\nasync function prepareOpenAIPayload(\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 // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const openAIContentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n openAIContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n const allowedFileMimeTypes = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ];\n\n for (const file of message.files || []) {\n if (allowedFileMimeTypes.includes(file.mimeType)) {\n if (file.url) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: file.url,\n },\n });\n // Add the URL as a text part\n openAIContentBlocks.push({\n type: \"text\",\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: `data:${file.mimeType};base64,${file.data}`,\n },\n });\n }\n // } else if (file.mimeType?.startsWith(\"audio\")) {\n // if (file.url) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: file.url,\n // },\n // });\n // } else if (file.data) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: `data:${file.mimeType};base64,${file.data}`,\n // },\n // });\n // }\n } else {\n logger.warn(\n \"payload\",\n \"Skipping file in message. File or image type not supported by OpenAI API:\",\n file.mimeType\n );\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: openAIContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isGroqPayload(payload: any): Boolean {\n return Object.values(GroqModel).includes(payload.model);\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 // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n temperature: payload.temperature,\n };\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 isGoogleAIPayload(payload: any): Boolean {\n return Object.values(GeminiModel).includes(payload.model);\n}\n\nasync function callGroq(\n identifier: 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 data = response.data;\n\n const answer = data.choices[0].message;\n if (!answer) {\n logger.error(identifier, \"Missing answer in Groq API:\", data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const textResponse = answer.content || null;\n let functionCall: FunctionCall | null = null;\n if (answer.tool_calls && answer.tool_calls.length) {\n const toolCall = answer.tool_calls[0];\n functionCall = {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments),\n };\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCall,\n files: [],\n };\n}\n\nasync function callGroqWithRetries(\n identifier: Identifier,\n payload: GroqPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Groq API with retries\");\n\n let lastResponse;\n for (let i = 0; i < retries; i++) {\n try {\n lastResponse = await callGroq(identifier, payload);\n return lastResponse;\n } catch (e: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${e.message}`,\n e.response?.data || e\n );\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Groq API after ${retries} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\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 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\n// async function main() {\n// const payload: GenericPayload = {\n// model: GeminiModel.GEMINI_15_PRO,\n// messages: [\n// {\n// role: \"user\",\n// content: \"What is this logo?\",\n// files: [\n// {\n// mimeType: \"image/png\",\n// url: \"https://www.wikimedia.org/static/images/wmf-logo-2x.png\",\n// },\n// ],\n// },\n// ],\n// functions: [\n// {\n// name: \"answer_logo_question\",\n// description: \"Answer a question about a logo\",\n// parameters: {\n// type: \"object\",\n// properties: {\n// organization: {\n// type: \"string\",\n// },\n// },\n// },\n// },\n// ],\n// };\n\n// const answer = await callWithRetries(\"test\", payload);\n\n// console.log(answer);\n// }\n\n// main();\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","abortTimeout","response","_a","_b"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "190proof",
3
- "version": "1.0.72",
3
+ "version": "1.0.73",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",