190proof 1.0.54 → 1.0.56

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.d.mts CHANGED
@@ -18,12 +18,17 @@ declare enum GPTModel {
18
18
  O3_MINI = "o3-mini"
19
19
  }
20
20
  declare enum GroqModel {
21
- LLAMA_3_70B_8192 = "llama3-70b-8192"
21
+ LLAMA_3_70B_8192 = "llama3-70b-8192",
22
+ DEEPSEEK_R1_DISTILL_LLAMA_70B = "deepseek-r1-distill-llama-70b"
22
23
  }
23
24
  declare enum GeminiModel {
24
25
  GEMINI_1_5_PRO = "gemini-1.5-pro-latest",
25
26
  GEMINI_EXP_1206 = "gemini-exp-1206",
26
- GEMINI_2_0_FLASH_THINKING_EXP = "gemini-2.0-flash-thinking-exp"
27
+ GEMINI_2_0_FLASH = "gemini-2.0-flash",
28
+ GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION = "gemini-2.0-flash-exp-image-generation",
29
+ GEMINI_2_0_FLASH_THINKING_EXP = "gemini-2.0-flash-thinking-exp",
30
+ GEMINI_2_0_FLASH_THINKING_EXP_01_21 = "gemini-2.0-flash-thinking-exp-01-21",
31
+ GEMINI_2_5_FLASH_PREVIEW_04_17 = "gemini-2.5-flash-preview-04-17"
27
32
  }
28
33
  interface GenericMessage {
29
34
  role: "user" | "assistant" | "system";
@@ -41,6 +46,7 @@ interface ParsedResponseMessage {
41
46
  role: "assistant";
42
47
  content: string | null;
43
48
  function_call: FunctionCall | null;
49
+ files: File[];
44
50
  }
45
51
  interface FunctionCall {
46
52
  name: string;
package/dist/index.d.ts CHANGED
@@ -18,12 +18,17 @@ declare enum GPTModel {
18
18
  O3_MINI = "o3-mini"
19
19
  }
20
20
  declare enum GroqModel {
21
- LLAMA_3_70B_8192 = "llama3-70b-8192"
21
+ LLAMA_3_70B_8192 = "llama3-70b-8192",
22
+ DEEPSEEK_R1_DISTILL_LLAMA_70B = "deepseek-r1-distill-llama-70b"
22
23
  }
23
24
  declare enum GeminiModel {
24
25
  GEMINI_1_5_PRO = "gemini-1.5-pro-latest",
25
26
  GEMINI_EXP_1206 = "gemini-exp-1206",
26
- GEMINI_2_0_FLASH_THINKING_EXP = "gemini-2.0-flash-thinking-exp"
27
+ GEMINI_2_0_FLASH = "gemini-2.0-flash",
28
+ GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION = "gemini-2.0-flash-exp-image-generation",
29
+ GEMINI_2_0_FLASH_THINKING_EXP = "gemini-2.0-flash-thinking-exp",
30
+ GEMINI_2_0_FLASH_THINKING_EXP_01_21 = "gemini-2.0-flash-thinking-exp-01-21",
31
+ GEMINI_2_5_FLASH_PREVIEW_04_17 = "gemini-2.5-flash-preview-04-17"
27
32
  }
28
33
  interface GenericMessage {
29
34
  role: "user" | "assistant" | "system";
@@ -41,6 +46,7 @@ interface ParsedResponseMessage {
41
46
  role: "assistant";
42
47
  content: string | null;
43
48
  function_call: FunctionCall | null;
49
+ files: File[];
44
50
  }
45
51
  interface FunctionCall {
46
52
  name: string;
package/dist/index.js CHANGED
@@ -62,12 +62,17 @@ var GPTModel = /* @__PURE__ */ ((GPTModel2) => {
62
62
  })(GPTModel || {});
63
63
  var GroqModel = /* @__PURE__ */ ((GroqModel2) => {
64
64
  GroqModel2["LLAMA_3_70B_8192"] = "llama3-70b-8192";
65
+ GroqModel2["DEEPSEEK_R1_DISTILL_LLAMA_70B"] = "deepseek-r1-distill-llama-70b";
65
66
  return GroqModel2;
66
67
  })(GroqModel || {});
67
68
  var GeminiModel = /* @__PURE__ */ ((GeminiModel2) => {
68
69
  GeminiModel2["GEMINI_1_5_PRO"] = "gemini-1.5-pro-latest";
69
70
  GeminiModel2["GEMINI_EXP_1206"] = "gemini-exp-1206";
71
+ GeminiModel2["GEMINI_2_0_FLASH"] = "gemini-2.0-flash";
72
+ GeminiModel2["GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION"] = "gemini-2.0-flash-exp-image-generation";
70
73
  GeminiModel2["GEMINI_2_0_FLASH_THINKING_EXP"] = "gemini-2.0-flash-thinking-exp";
74
+ GeminiModel2["GEMINI_2_0_FLASH_THINKING_EXP_01_21"] = "gemini-2.0-flash-thinking-exp-01-21";
75
+ GeminiModel2["GEMINI_2_5_FLASH_PREVIEW_04_17"] = "gemini-2.5-flash-preview-04-17";
71
76
  return GeminiModel2;
72
77
  })(GeminiModel || {});
73
78
 
@@ -86,6 +91,7 @@ function isHeicImage(name, mime) {
86
91
  }
87
92
 
88
93
  // index.ts
94
+ var import_genai = require("@google/genai");
89
95
  var { GoogleGenerativeAI } = require("@google/generative-ai");
90
96
  var sharp = require("sharp");
91
97
  var decode = require("heic-decode");
@@ -120,7 +126,8 @@ function parseStreamedResponse(identifier, paragraph, functionCallName, function
120
126
  return {
121
127
  role: "assistant",
122
128
  content: paragraph || null,
123
- function_call: functionCall
129
+ function_call: functionCall,
130
+ files: []
124
131
  };
125
132
  }
126
133
  async function callOpenAiWithRetries(identifier, openAiPayload, openAiConfig, retries = 5, chunkTimeoutMs = 15e3) {
@@ -490,7 +497,8 @@ async function callOpenAI(identifier, openAiPayload, openAiConfig) {
490
497
  return {
491
498
  role: "assistant",
492
499
  content: choice.message.content || null,
493
- function_call: functionCall
500
+ function_call: functionCall,
501
+ files: []
494
502
  };
495
503
  }
496
504
  function truncatePayload(payload) {
@@ -648,7 +656,8 @@ ${text}`;
648
656
  return {
649
657
  role: "assistant",
650
658
  content: textResponse,
651
- function_call: functionCalls[0]
659
+ function_call: functionCalls[0],
660
+ files: []
652
661
  };
653
662
  }
654
663
  function jigAnthropicMessages(messages) {
@@ -756,29 +765,54 @@ async function prepareGoogleAIPayload(payload) {
756
765
  return preparedPayload;
757
766
  }
758
767
  async function callGoogleAI(identifier, payload) {
768
+ var _a, _b, _c;
759
769
  console.log(identifier, "Calling Google AI API");
760
- const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
761
- const model = genAI.getGenerativeModel({
762
- model: payload.model,
763
- tools: payload.tools,
764
- systemInstruction: payload.systemInstruction
765
- });
766
770
  const history = payload.messages.slice(0, -1);
767
771
  const lastMessage = payload.messages.slice(-1)[0];
768
- const chat = model.startChat({
769
- history
772
+ const genAI = new import_genai.GoogleGenAI({
773
+ apiKey: process.env.GEMINI_API_KEY
774
+ });
775
+ console.log(identifier, "Google AI API payload:", history);
776
+ const chat = genAI.chats.create({
777
+ model: payload.model,
778
+ history,
779
+ config: {
780
+ // responseModalities: ["Text", "Image"],
781
+ tools: payload.tools ? [payload.tools] : void 0,
782
+ systemInstruction: payload.systemInstruction
783
+ }
784
+ });
785
+ const response = await chat.sendMessage({
786
+ message: lastMessage.parts
787
+ });
788
+ let text = "";
789
+ const files = [];
790
+ for (const part of ((_c = (_b = (_a = response.candidates) == null ? void 0 : _a[0]) == null ? void 0 : _b.content) == null ? void 0 : _c.parts) || []) {
791
+ if (part.text) {
792
+ text += part.text;
793
+ }
794
+ if (part.inlineData) {
795
+ const imageData = part.inlineData.data;
796
+ if (imageData) {
797
+ files.push({
798
+ mimeType: "image/png",
799
+ data: imageData
800
+ });
801
+ }
802
+ }
803
+ }
804
+ const functionCalls = response.functionCalls;
805
+ const parsedFunctionCalls = functionCalls == null ? void 0 : functionCalls.map((fc) => {
806
+ var _a2, _b2;
807
+ return {
808
+ name: (_a2 = fc.name) != null ? _a2 : "",
809
+ arguments: (_b2 = fc.args) != null ? _b2 : {}
810
+ };
770
811
  });
771
- const result = await chat.sendMessage(lastMessage.parts);
772
- const response = await result.response;
773
- const text = response.text();
774
- const functionCalls = response.functionCalls();
775
- const parsedFunctionCalls = functionCalls == null ? void 0 : functionCalls.map((fc) => ({
776
- name: fc.name,
777
- arguments: fc.args
778
- }));
779
812
  return {
780
813
  role: "assistant",
781
814
  content: text || null,
815
+ files,
782
816
  function_call: (parsedFunctionCalls == null ? void 0 : parsedFunctionCalls[0]) || null
783
817
  };
784
818
  }
@@ -994,7 +1028,8 @@ async function callGroq(identifier, payload) {
994
1028
  return {
995
1029
  role: "assistant",
996
1030
  content: textResponse,
997
- function_call: functionCall
1031
+ function_call: functionCall,
1032
+ files: []
998
1033
  };
999
1034
  }
1000
1035
  async function callGroqWithRetries(identifier, payload, retries = 5) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts","../interfaces.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} from \"./interfaces\";\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from \"@aws-sdk/client-bedrock-runtime\";\nimport axios from \"axios\";\nimport { isHeicImage, timeout } from \"./utils\";\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: string,\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 console.error(\"Error parsing functionCallArgs:\", functionCallArgs);\n throw error;\n }\n }\n\n if (!paragraph && !functionCall) {\n console.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 };\n}\n\nasync function callOpenAiWithRetries(\n identifier: string,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n console.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 console.error(error);\n console.error(\n identifier,\n `Retrying due to error: received bad response from OpenAI API [${\n openAiConfig?.service\n }-${openAiPayload.model}-${openAiConfig?.orgId}]: ${\n error.message\n } - ${JSON.stringify(error.response?.data)}`\n );\n\n const errorCode = error.data?.code;\n\n if (errorCode) {\n console.error(\n identifier,\n `Retry #${i} failed with API error: ${errorCode}`,\n JSON.stringify({\n data: error.data,\n })\n );\n }\n\n openAiPayload.temperature = 0.8; // Higher temperature\n\n // Usually due to image content, we get a policy violation error\n if (errorCode === \"content_policy_violation\") {\n console.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 console.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 console.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 console.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 console.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: string,\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 console.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 console.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 console.error(\n identifier,\n \"Stream error: Azure OpenAI JSON parsing error:\",\n JSON.stringify(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 console.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n console.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 console.log(\n identifier,\n `Stream error: aborted due to timeout after ${chunkTimeoutMs} ms.`,\n JSON.stringify({ paragraph })\n );\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 console.log(\n identifier,\n `Stream error: ended after ${\n chunkIndex + 1\n } chunks via reader done flag.`,\n rawStreamedBody\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 console.log(\n identifier,\n `Stream explicitly marked as done after ${chunkIndex + 1} chunks.`\n );\n try {\n return parseStreamedResponse(\n identifier,\n paragraph,\n functionCallName,\n functionCallArgs,\n functionNames\n );\n } catch (error) {\n console.error(\n identifier,\n \"Stream error: parsing response:\",\n rawStreamedBody\n );\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 console.error(\n identifier,\n \"Stream error: OpenAI error:\",\n json.error && JSON.stringify(json.error)\n );\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 console.error(\n identifier,\n \"Stream error: no choices in JSON:\",\n json\n ); // bad if it's not the first chunk\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: string,\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 console.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 console.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 console.error(\n identifier,\n \"OpenAI JSON parsing error:\",\n JSON.stringify(error)\n );\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 console.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n console.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 console.error(identifier, \"OpenAI API error:\", JSON.stringify(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 console.error(identifier, \"OpenAI error:\", JSON.stringify(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 };\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: string,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig,\n attempts = 5\n): Promise<ParsedResponseMessage> {\n console.log(identifier, \"Calling Anthropic API with retries\");\n let lastResponse;\n for (let i = 0; i < attempts; i++) {\n // if last attempt\n if (i === attempts - 1) {\n AiPayload.model = ClaudeModel.SONNET; // fallback to sonnet model\n }\n\n try {\n // return await callAnthropic(identifier, AiPayload);\n lastResponse = await callAnthropic(identifier, AiPayload, AiConfig);\n return lastResponse;\n } catch (e: any) {\n console.error(e);\n console.error(\n identifier,\n `Retrying due to error: received bad response from Anthropic API: ${e.message}`,\n JSON.stringify(e.response?.data)\n );\n\n if (e.response?.data?.error?.type === \"rate_limit_error\") {\n // upgrade to Sonnet\n AiPayload.model = ClaudeModel.SONNET;\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: string,\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 console.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 console.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 console.log(\"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 console.error(\n identifier,\n \"Missing text & fns in Anthropic API response:\",\n JSON.stringify(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 };\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\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 console.warn(\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 } 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: string,\n payload: GoogleAIPayload\n): Promise<ParsedResponseMessage> {\n console.log(identifier, \"Calling Google AI API\");\n\n const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);\n const model = genAI.getGenerativeModel({\n model: payload.model,\n tools: payload.tools,\n systemInstruction: payload.systemInstruction,\n });\n\n const history = payload.messages.slice(0, -1);\n const lastMessage = payload.messages.slice(-1)[0];\n const chat = model.startChat({\n history,\n });\n\n const result = await chat.sendMessage(lastMessage.parts);\n const response = await result.response;\n\n const text: string | undefined = response.text();\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 return {\n role: \"assistant\",\n content: text || null,\n function_call: parsedFunctionCalls?.[0] || null,\n };\n}\n\nexport async function callWithRetries(\n identifier: string,\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n // Determine which service to use based on the model type\n if (isAnthropicPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to Anthropic API\");\n\n return await callAnthropicWithRetries(\n identifier,\n await prepareAnthropicPayload(aiPayload),\n aiConfig as AnthropicAIConfig,\n retries\n );\n } else if (isOpenAiPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to OpenAI API\");\n return await callOpenAiWithRetries(\n identifier,\n await prepareOpenAIPayload(aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs\n );\n } else if (isGroqPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to Groq API\");\n return await callGroqWithRetries(\n identifier,\n await prepareGroqPayload(aiPayload)\n );\n } else if (isGoogleAIPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to Google AI API\");\n return await callGoogleAI(\n identifier,\n await prepareGoogleAIPayload(aiPayload)\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 console.warn(\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 temperature: payload.temperature,\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 for (const file of message.files || []) {\n if (file.mimeType?.startsWith(\"image\")) {\n if (file.url) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: file.url,\n },\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 console.warn(\n \"Skipping file. 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: string,\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 console.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 };\n}\n\nasync function callGroqWithRetries(\n identifier: string,\n payload: GroqPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n console.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 console.error(e);\n console.error(\n identifier,\n `Retrying due to error: received bad response from Groq API: ${e.message}`,\n JSON.stringify(e.response?.data)\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 console.log(\"Normalizing image\", url);\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 = \"claude-3-haiku-20240307\",\n SONNET = \"claude-3-sonnet-20240229\",\n OPUS = \"claude-3-opus-20240229\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\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}\n\nexport enum GroqModel {\n LLAMA_3_70B_8192 = \"llama3-70b-8192\",\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_THINKING_EXP = \"gemini-2.0-flash-thinking-exp\",\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}\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 temperature?: number;\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","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,WAAQ;AACR,EAAAA,aAAA,YAAS;AACT,EAAAA,aAAA,UAAO;AACP,EAAAA,aAAA,gBAAa;AAJH,SAAAA;AAAA,GAAA;AAOL,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;AAXA,SAAAA;AAAA,GAAA;AAcL,IAAK,YAAL,kBAAKC,eAAL;AACL,EAAAA,WAAA,sBAAmB;AADT,SAAAA;AAAA,GAAA;AAIL,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,oBAAiB;AACjB,EAAAA,aAAA,qBAAkB;AAClB,EAAAA,aAAA,mCAAgC;AAHtB,SAAAA;AAAA,GAAA;;;ADJZ,oCAGO;AACP,mBAAkB;;;AEzBX,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;;;AFeA,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,SAAS,OAAO;AACd,cAAQ,MAAM,mCAAmC,gBAAgB;AACjE,YAAM;AAAA,IACR;AAAA,EACF;AAEA,MAAI,CAAC,aAAa,CAAC,cAAc;AAC/B,YAAQ;AAAA,MACN;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,EACjB;AACF;AAEA,eAAe,sBACb,YACA,eACA,cACA,UAAkB,GAClB,iBAAyB,MACO;AA9FlC;AA+FE,UAAQ;AAAA,IACN;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,SAAS,OAAY;AACnB,cAAQ,MAAM,KAAK;AACnB,cAAQ;AAAA,QACN;AAAA,QACA,iEACE,6CAAc,OAChB,IAAI,cAAc,KAAK,IAAI,6CAAc,KAAK,MAC5C,MAAM,OACR,MAAM,KAAK,WAAU,WAAM,aAAN,mBAAgB,IAAI,CAAC;AAAA,MAC5C;AAEA,YAAM,aAAY,WAAM,SAAN,mBAAY;AAE9B,UAAI,WAAW;AACb,gBAAQ;AAAA,UACN;AAAA,UACA,UAAU,CAAC,2BAA2B,SAAS;AAAA,UAC/C,KAAK,UAAU;AAAA,YACb,MAAM,MAAM;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AAEA,oBAAc,cAAc;AAG5B,UAAI,cAAc,4BAA4B;AAC5C,gBAAQ;AAAA,UACN;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,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,QACF;AACA,qBAAa,UAAU;AAAA,MACzB;AAGA,UAAI,MAAM,GAAG;AACX,aAAI,6CAAc,aAAY,SAAS;AACrC,kBAAQ;AAAA,YACN;AAAA,YACA;AAAA,UACF;AACA,uBAAa,UAAU;AAAA,QACzB;AAAA,MACF;AAGA,UAAI,MAAM,GAAG;AAEX,YAAI,cAAc,OAAO;AACvB,kBAAQ;AAAA,YACN;AAAA,YACA;AAAA,UACF;AACA,wBAAc,cAAc;AAAA,QAC9B;AAAA,MACF;AAEA,YAAM,QAAQ,GAAG;AAAA,IACnB;AAAA,EACF;AAEA,UAAQ;AAAA,IACN;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;AA1NlC;AA2NE,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,YAAQ,IAAI,YAAY,8BAA8B,cAAc,KAAK;AACzE,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,YAAQ,IAAI,YAAY,kBAAkB,QAAQ;AAElD,QAAI;AACF,YAAM,qBAAqB,KAAK,UAAU;AAAA,QACxC,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,gBAAgB,KAAK,MAAM,kBAAkB;AAAA,IACrD,SAAS,OAAO;AACd,cAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA,KAAK,UAAU,KAAK;AAAA,MACtB;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,YAAQ,IAAI,YAAY,wBAAwB,cAAc,KAAK;AACnE,UAAM,WAAW;AACjB,QAAI,aAAa,OAAO;AACtB,cAAQ,IAAI,YAAY,eAAe,aAAa,KAAK;AAAA,IAC3D;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,gBAAQ;AAAA,UACN;AAAA,UACA,8CAA8C,cAAc;AAAA,UAC5D,KAAK,UAAU,EAAE,UAAU,CAAC;AAAA,QAC9B;AACA,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,gBAAQ;AAAA,UACN;AAAA,UACA,6BACE,aAAa,CACf;AAAA,UACA;AAAA,QACF;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,kBAAQ;AAAA,YACN;AAAA,YACA,0CAA0C,aAAa,CAAC;AAAA,UAC1D;AACA,cAAI;AACF,mBAAO;AAAA,cACL;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AACd,oBAAQ;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,kBAAM;AAAA,UACR;AAAA,QACF;AAEA,YAAI;AACJ,YAAI;AACF,iBAAO,KAAK,MAAM,WAAW,KAAK,CAAC;AAAA,QACrC,SAAS,OAAY;AACnB,yBAAe;AACf;AAAA,QACF;AAEA,YAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,QAAQ;AACzC,cAAI,KAAK,OAAO;AACd,oBAAQ;AAAA,cACN;AAAA,cACA;AAAA,cACA,KAAK,SAAS,KAAK,UAAU,KAAK,KAAK;AAAA,YACzC;AACA,kBAAM,QAAQ,IAAI,MAAM,4BAA4B;AACpD,kBAAM,OAAO,KAAK;AAClB,kBAAM,cAAc,gBAAgB,aAAa;AACjD,kBAAM;AAAA,UACR;AACA,cAAI,eAAe;AACjB,oBAAQ;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACF;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,YAAQ,IAAI,YAAY,8BAA8B,cAAc,KAAK;AACzE,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,YAAQ,IAAI,YAAY,kBAAkB,QAAQ;AAElD,QAAI;AACF,YAAM,qBAAqB,KAAK,UAAU;AAAA,QACxC,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,gBAAgB,KAAK,MAAM,kBAAkB;AAAA,IAErD,SAAS,OAAO;AACd,cAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA,KAAK,UAAU,KAAK;AAAA,MACtB;AACA,YAAM;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,YAAQ,IAAI,YAAY,wBAAwB,cAAc,KAAK;AACnE,UAAM,WAAW;AACjB,QAAI,aAAa,OAAO;AACtB,cAAQ,IAAI,YAAY,eAAe,aAAa,KAAK;AAAA,IAC3D;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,YAAQ,MAAM,YAAY,qBAAqB,KAAK,UAAU,SAAS,CAAC;AACxE,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,cAAQ,MAAM,YAAY,iBAAiB,KAAK,UAAU,KAAK,KAAK,CAAC;AACrE,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,EACjB;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;AA1kBlC;AA2kBE,UAAQ,IAAI,YAAY,oCAAoC;AAC5D,MAAI;AACJ,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AAEjC,QAAI,MAAM,WAAW,GAAG;AACtB,gBAAU;AAAA,IACZ;AAEA,QAAI;AAEF,qBAAe,MAAM,cAAc,YAAY,WAAW,QAAQ;AAClE,aAAO;AAAA,IACT,SAAS,GAAQ;AACf,cAAQ,MAAM,CAAC;AACf,cAAQ;AAAA,QACN;AAAA,QACA,oEAAoE,EAAE,OAAO;AAAA,QAC7E,KAAK,WAAU,OAAE,aAAF,mBAAY,IAAI;AAAA,MACjC;AAEA,YAAI,mBAAE,aAAF,mBAAY,SAAZ,mBAAkB,UAAlB,mBAAyB,UAAS,oBAAoB;AAExD,kBAAU;AAAA,MACZ;AAEA,YAAM,QAAQ,MAAM,CAAC;AAAA,IACvB;AAAA,EACF;AACA,QAAM,QAAQ,IAAI;AAAA,IAChB,sCAAsC,QAAQ;AAAA,EAChD;AACA,QAAM,WAAW;AACjB,QAAM;AACR;AAEA,eAAe,cACb,YACA,WACA,UACgC;AAlnBlC;AAmnBE,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,UAAMC,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,YAAQ,MAAM,YAAY,oCAAoC,IAAI;AAClE,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,MAAI,eAAe;AACnB,MAAI,gBAAuB,CAAC;AAC5B,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,MAAM;AAChB,cAAQ,MAAM,YAAY,yCAAyC,IAAI;AACvE,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,gBAAQ,IAAI,kDAAkD,IAAI;AAAA,MACpE;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,YAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA,KAAK,UAAU,IAAI;AAAA,IACrB;AACA,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,eAAe,cAAc,CAAC;AAAA,EAChC;AACF;AAEA,SAAS,qBACP,UACsB;AAnvBxB;AAuvBE,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,eAAe,uBACb,SAC0B;AAjzB5B;AAkzBE,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,gBAAQ;AAAA,UACN;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;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;AAChC,UAAQ,IAAI,YAAY,uBAAuB;AAE/C,QAAM,QAAQ,IAAI,mBAAmB,QAAQ,IAAI,cAAc;AAC/D,QAAM,QAAQ,MAAM,mBAAmB;AAAA,IACrC,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ;AAAA,IACf,mBAAmB,QAAQ;AAAA,EAC7B,CAAC;AAED,QAAM,UAAU,QAAQ,SAAS,MAAM,GAAG,EAAE;AAC5C,QAAM,cAAc,QAAQ,SAAS,MAAM,EAAE,EAAE,CAAC;AAChD,QAAM,OAAO,MAAM,UAAU;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,QAAM,SAAS,MAAM,KAAK,YAAY,YAAY,KAAK;AACvD,QAAM,WAAW,MAAM,OAAO;AAE9B,QAAM,OAA2B,SAAS,KAAK;AAC/C,QAAM,gBAKU,SAAS,cAAc;AAEvC,QAAM,sBAAsB,+CAAe,IAAI,CAAC,QAAQ;AAAA,IACtD,MAAM,GAAG;AAAA,IACT,WAAW,GAAG;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,gBAAe,2DAAsB,OAAM;AAAA,EAC7C;AACF;AAEA,eAAsB,gBACpB,YACA,WACA,UACA,UAAkB,GAClB,iBAAyB,MACO;AAEhC,MAAI,mBAAmB,SAAS,GAAG;AACjC,YAAQ,IAAI,YAAY,kCAAkC;AAE1D,WAAO,MAAM;AAAA,MACX;AAAA,MACA,MAAM,wBAAwB,SAAS;AAAA,MACvC;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,gBAAgB,SAAS,GAAG;AACrC,YAAQ,IAAI,YAAY,+BAA+B;AACvD,WAAO,MAAM;AAAA,MACX;AAAA,MACA,MAAM,qBAAqB,SAAS;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,cAAc,SAAS,GAAG;AACnC,YAAQ,IAAI,YAAY,6BAA6B;AACrD,WAAO,MAAM;AAAA,MACX;AAAA,MACA,MAAM,mBAAmB,SAAS;AAAA,IACpC;AAAA,EACF,WAAW,kBAAkB,SAAS,GAAG;AACvC,YAAQ,IAAI,YAAY,kCAAkC;AAC1D,WAAO,MAAM;AAAA,MACX;AAAA,MACA,MAAM,uBAAuB,SAAS;AAAA,IACxC;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;AAv9B/B;AAw9BE,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,gBAAQ;AAAA,UACN;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;AAniC1B;AAoiCE,QAAM,kBAAiC;AAAA,IACrC,OAAO,QAAQ;AAAA,IACf,aAAa,QAAQ;AAAA,IACrB,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,eAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACtC,WAAI,UAAK,aAAL,mBAAe,WAAW,UAAU;AACtC,YAAI,KAAK,KAAK;AACZ,8BAAoB,KAAK;AAAA,YACvB,MAAM;AAAA,YACN,WAAW;AAAA,cACT,KAAK,KAAK;AAAA,YACZ;AAAA,UACF,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,gBAAQ;AAAA,UACN;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;AAtnClE;AAunCE,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,aAAAC,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,YAAQ,MAAM,YAAY,+BAA+B,IAAI;AAC7D,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,EACjB;AACF;AAEA,eAAe,oBACb,YACA,SACA,UAAkB,GACc;AAvsClC;AAwsCE,UAAQ,IAAI,YAAY,+BAA+B;AAEvD,MAAI;AACJ,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,QAAI;AACF,qBAAe,MAAM,SAAS,YAAY,OAAO;AACjD,aAAO;AAAA,IACT,SAAS,GAAQ;AACf,cAAQ,MAAM,CAAC;AACf,cAAQ;AAAA,QACN;AAAA,QACA,+DAA+D,EAAE,OAAO;AAAA,QACxE,KAAK,WAAU,OAAE,aAAF,mBAAY,IAAI;AAAA,MACjC;AAEA,YAAM,QAAQ,MAAM,CAAC;AAAA,IACvB;AAAA,EACF;AACA,QAAM,QAAQ,IAAI;AAAA,IAChB,iCAAiC,OAAO;AAAA,EAC1C;AACA,QAAM,WAAW;AACjB,QAAM;AACR;AAEA,eAAe,uBACb,KACA,MACiB;AACjB,UAAQ,IAAI,qBAAqB,GAAG;AACpC,QAAM,WAAW,MAAM,aAAAA,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","abortTimeout","response","axios"]}
1
+ {"version":3,"sources":["../index.ts","../interfaces.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 {\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: string,\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 console.error(\"Error parsing functionCallArgs:\", functionCallArgs);\n throw error;\n }\n }\n\n if (!paragraph && !functionCall) {\n console.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: string,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n console.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 console.error(error);\n console.error(\n identifier,\n `Retrying due to error: received bad response from OpenAI API [${\n openAiConfig?.service\n }-${openAiPayload.model}-${openAiConfig?.orgId}]: ${\n error.message\n } - ${JSON.stringify(error.response?.data)}`\n );\n\n const errorCode = error.data?.code;\n\n if (errorCode) {\n console.error(\n identifier,\n `Retry #${i} failed with API error: ${errorCode}`,\n JSON.stringify({\n data: error.data,\n })\n );\n }\n\n openAiPayload.temperature = 0.8; // Higher temperature\n\n // Usually due to image content, we get a policy violation error\n if (errorCode === \"content_policy_violation\") {\n console.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 console.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 console.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 console.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 console.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: string,\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 console.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 console.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 console.error(\n identifier,\n \"Stream error: Azure OpenAI JSON parsing error:\",\n JSON.stringify(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 console.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n console.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 console.log(\n identifier,\n `Stream error: aborted due to timeout after ${chunkTimeoutMs} ms.`,\n JSON.stringify({ paragraph })\n );\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 console.log(\n identifier,\n `Stream error: ended after ${\n chunkIndex + 1\n } chunks via reader done flag.`,\n rawStreamedBody\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 console.log(\n identifier,\n `Stream explicitly marked as done after ${chunkIndex + 1} chunks.`\n );\n try {\n return parseStreamedResponse(\n identifier,\n paragraph,\n functionCallName,\n functionCallArgs,\n functionNames\n );\n } catch (error) {\n console.error(\n identifier,\n \"Stream error: parsing response:\",\n rawStreamedBody\n );\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 console.error(\n identifier,\n \"Stream error: OpenAI error:\",\n json.error && JSON.stringify(json.error)\n );\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 console.error(\n identifier,\n \"Stream error: no choices in JSON:\",\n json\n ); // bad if it's not the first chunk\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: string,\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 console.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 console.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 console.error(\n identifier,\n \"OpenAI JSON parsing error:\",\n JSON.stringify(error)\n );\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 console.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n console.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 console.error(identifier, \"OpenAI API error:\", JSON.stringify(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 console.error(identifier, \"OpenAI error:\", JSON.stringify(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: string,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig,\n attempts = 5\n): Promise<ParsedResponseMessage> {\n console.log(identifier, \"Calling Anthropic API with retries\");\n let lastResponse;\n for (let i = 0; i < attempts; i++) {\n // if last attempt\n if (i === attempts - 1) {\n AiPayload.model = ClaudeModel.SONNET; // fallback to sonnet model\n }\n\n try {\n // return await callAnthropic(identifier, AiPayload);\n lastResponse = await callAnthropic(identifier, AiPayload, AiConfig);\n return lastResponse;\n } catch (e: any) {\n console.error(e);\n console.error(\n identifier,\n `Retrying due to error: received bad response from Anthropic API: ${e.message}`,\n JSON.stringify(e.response?.data)\n );\n\n if (e.response?.data?.error?.type === \"rate_limit_error\") {\n // upgrade to Sonnet\n AiPayload.model = ClaudeModel.SONNET;\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: string,\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 console.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 console.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 console.log(\"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 console.error(\n identifier,\n \"Missing text & fns in Anthropic API response:\",\n JSON.stringify(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];\n\n // If first message is assistant, add empty user message before it\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 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 text content of messages with the same 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 assistant, 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 console.warn(\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 } 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: string,\n payload: GoogleAIPayload\n): Promise<ParsedResponseMessage> {\n console.log(identifier, \"Calling Google AI API\");\n\n const history = payload.messages.slice(0, -1);\n const lastMessage = payload.messages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({\n apiKey: process.env.GEMINI_API_KEY,\n });\n\n console.log(identifier, \"Google AI API payload:\", history);\n\n const chat = genAI.chats.create({\n model: payload.model,\n history,\n config: {\n // responseModalities: [\"Text\", \"Image\"],\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 return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: parsedFunctionCalls?.[0] || null,\n };\n}\n\nexport async function callWithRetries(\n identifier: string,\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n // Determine which service to use based on the model type\n if (isAnthropicPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to Anthropic API\");\n\n return await callAnthropicWithRetries(\n identifier,\n await prepareAnthropicPayload(aiPayload),\n aiConfig as AnthropicAIConfig,\n retries\n );\n } else if (isOpenAiPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to OpenAI API\");\n return await callOpenAiWithRetries(\n identifier,\n await prepareOpenAIPayload(aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs\n );\n } else if (isGroqPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to Groq API\");\n return await callGroqWithRetries(\n identifier,\n await prepareGroqPayload(aiPayload)\n );\n } else if (isGoogleAIPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to Google AI API\");\n return await callGoogleAI(\n identifier,\n await prepareGoogleAIPayload(aiPayload)\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 console.warn(\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 temperature: payload.temperature,\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 for (const file of message.files || []) {\n if (file.mimeType?.startsWith(\"image\")) {\n if (file.url) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: file.url,\n },\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 console.warn(\n \"Skipping file. 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: string,\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 console.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: string,\n payload: GroqPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n console.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 console.error(e);\n console.error(\n identifier,\n `Retrying due to error: received bad response from Groq API: ${e.message}`,\n JSON.stringify(e.response?.data)\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 console.log(\"Normalizing image\", url);\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 = \"claude-3-haiku-20240307\",\n SONNET = \"claude-3-sonnet-20240229\",\n OPUS = \"claude-3-opus-20240229\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\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}\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}\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 temperature?: number;\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","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","abortTimeout","response","axios","_a","_b","axios"]}
package/dist/index.mjs CHANGED
@@ -30,12 +30,17 @@ var GPTModel = /* @__PURE__ */ ((GPTModel2) => {
30
30
  })(GPTModel || {});
31
31
  var GroqModel = /* @__PURE__ */ ((GroqModel2) => {
32
32
  GroqModel2["LLAMA_3_70B_8192"] = "llama3-70b-8192";
33
+ GroqModel2["DEEPSEEK_R1_DISTILL_LLAMA_70B"] = "deepseek-r1-distill-llama-70b";
33
34
  return GroqModel2;
34
35
  })(GroqModel || {});
35
36
  var GeminiModel = /* @__PURE__ */ ((GeminiModel2) => {
36
37
  GeminiModel2["GEMINI_1_5_PRO"] = "gemini-1.5-pro-latest";
37
38
  GeminiModel2["GEMINI_EXP_1206"] = "gemini-exp-1206";
39
+ GeminiModel2["GEMINI_2_0_FLASH"] = "gemini-2.0-flash";
40
+ GeminiModel2["GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION"] = "gemini-2.0-flash-exp-image-generation";
38
41
  GeminiModel2["GEMINI_2_0_FLASH_THINKING_EXP"] = "gemini-2.0-flash-thinking-exp";
42
+ GeminiModel2["GEMINI_2_0_FLASH_THINKING_EXP_01_21"] = "gemini-2.0-flash-thinking-exp-01-21";
43
+ GeminiModel2["GEMINI_2_5_FLASH_PREVIEW_04_17"] = "gemini-2.5-flash-preview-04-17";
39
44
  return GeminiModel2;
40
45
  })(GeminiModel || {});
41
46
 
@@ -57,6 +62,7 @@ function isHeicImage(name, mime) {
57
62
  }
58
63
 
59
64
  // index.ts
65
+ import { GoogleGenAI } from "@google/genai";
60
66
  var { GoogleGenerativeAI } = __require("@google/generative-ai");
61
67
  var sharp = __require("sharp");
62
68
  var decode = __require("heic-decode");
@@ -91,7 +97,8 @@ function parseStreamedResponse(identifier, paragraph, functionCallName, function
91
97
  return {
92
98
  role: "assistant",
93
99
  content: paragraph || null,
94
- function_call: functionCall
100
+ function_call: functionCall,
101
+ files: []
95
102
  };
96
103
  }
97
104
  async function callOpenAiWithRetries(identifier, openAiPayload, openAiConfig, retries = 5, chunkTimeoutMs = 15e3) {
@@ -461,7 +468,8 @@ async function callOpenAI(identifier, openAiPayload, openAiConfig) {
461
468
  return {
462
469
  role: "assistant",
463
470
  content: choice.message.content || null,
464
- function_call: functionCall
471
+ function_call: functionCall,
472
+ files: []
465
473
  };
466
474
  }
467
475
  function truncatePayload(payload) {
@@ -619,7 +627,8 @@ ${text}`;
619
627
  return {
620
628
  role: "assistant",
621
629
  content: textResponse,
622
- function_call: functionCalls[0]
630
+ function_call: functionCalls[0],
631
+ files: []
623
632
  };
624
633
  }
625
634
  function jigAnthropicMessages(messages) {
@@ -727,29 +736,54 @@ async function prepareGoogleAIPayload(payload) {
727
736
  return preparedPayload;
728
737
  }
729
738
  async function callGoogleAI(identifier, payload) {
739
+ var _a, _b, _c;
730
740
  console.log(identifier, "Calling Google AI API");
731
- const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
732
- const model = genAI.getGenerativeModel({
733
- model: payload.model,
734
- tools: payload.tools,
735
- systemInstruction: payload.systemInstruction
736
- });
737
741
  const history = payload.messages.slice(0, -1);
738
742
  const lastMessage = payload.messages.slice(-1)[0];
739
- const chat = model.startChat({
740
- history
743
+ const genAI = new GoogleGenAI({
744
+ apiKey: process.env.GEMINI_API_KEY
745
+ });
746
+ console.log(identifier, "Google AI API payload:", history);
747
+ const chat = genAI.chats.create({
748
+ model: payload.model,
749
+ history,
750
+ config: {
751
+ // responseModalities: ["Text", "Image"],
752
+ tools: payload.tools ? [payload.tools] : void 0,
753
+ systemInstruction: payload.systemInstruction
754
+ }
755
+ });
756
+ const response = await chat.sendMessage({
757
+ message: lastMessage.parts
758
+ });
759
+ let text = "";
760
+ const files = [];
761
+ for (const part of ((_c = (_b = (_a = response.candidates) == null ? void 0 : _a[0]) == null ? void 0 : _b.content) == null ? void 0 : _c.parts) || []) {
762
+ if (part.text) {
763
+ text += part.text;
764
+ }
765
+ if (part.inlineData) {
766
+ const imageData = part.inlineData.data;
767
+ if (imageData) {
768
+ files.push({
769
+ mimeType: "image/png",
770
+ data: imageData
771
+ });
772
+ }
773
+ }
774
+ }
775
+ const functionCalls = response.functionCalls;
776
+ const parsedFunctionCalls = functionCalls == null ? void 0 : functionCalls.map((fc) => {
777
+ var _a2, _b2;
778
+ return {
779
+ name: (_a2 = fc.name) != null ? _a2 : "",
780
+ arguments: (_b2 = fc.args) != null ? _b2 : {}
781
+ };
741
782
  });
742
- const result = await chat.sendMessage(lastMessage.parts);
743
- const response = await result.response;
744
- const text = response.text();
745
- const functionCalls = response.functionCalls();
746
- const parsedFunctionCalls = functionCalls == null ? void 0 : functionCalls.map((fc) => ({
747
- name: fc.name,
748
- arguments: fc.args
749
- }));
750
783
  return {
751
784
  role: "assistant",
752
785
  content: text || null,
786
+ files,
753
787
  function_call: (parsedFunctionCalls == null ? void 0 : parsedFunctionCalls[0]) || null
754
788
  };
755
789
  }
@@ -965,7 +999,8 @@ async function callGroq(identifier, payload) {
965
999
  return {
966
1000
  role: "assistant",
967
1001
  content: textResponse,
968
- function_call: functionCall
1002
+ function_call: functionCall,
1003
+ files: []
969
1004
  };
970
1005
  }
971
1006
  async function callGroqWithRetries(identifier, payload, retries = 5) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../interfaces.ts","../index.ts","../utils.ts"],"sourcesContent":["export enum ClaudeModel {\n HAIKU = \"claude-3-haiku-20240307\",\n SONNET = \"claude-3-sonnet-20240229\",\n OPUS = \"claude-3-opus-20240229\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\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}\n\nexport enum GroqModel {\n LLAMA_3_70B_8192 = \"llama3-70b-8192\",\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_THINKING_EXP = \"gemini-2.0-flash-thinking-exp\",\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}\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 temperature?: number;\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","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} from \"./interfaces\";\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from \"@aws-sdk/client-bedrock-runtime\";\nimport axios from \"axios\";\nimport { isHeicImage, timeout } from \"./utils\";\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: string,\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 console.error(\"Error parsing functionCallArgs:\", functionCallArgs);\n throw error;\n }\n }\n\n if (!paragraph && !functionCall) {\n console.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 };\n}\n\nasync function callOpenAiWithRetries(\n identifier: string,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n console.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 console.error(error);\n console.error(\n identifier,\n `Retrying due to error: received bad response from OpenAI API [${\n openAiConfig?.service\n }-${openAiPayload.model}-${openAiConfig?.orgId}]: ${\n error.message\n } - ${JSON.stringify(error.response?.data)}`\n );\n\n const errorCode = error.data?.code;\n\n if (errorCode) {\n console.error(\n identifier,\n `Retry #${i} failed with API error: ${errorCode}`,\n JSON.stringify({\n data: error.data,\n })\n );\n }\n\n openAiPayload.temperature = 0.8; // Higher temperature\n\n // Usually due to image content, we get a policy violation error\n if (errorCode === \"content_policy_violation\") {\n console.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 console.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 console.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 console.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 console.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: string,\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 console.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 console.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 console.error(\n identifier,\n \"Stream error: Azure OpenAI JSON parsing error:\",\n JSON.stringify(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 console.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n console.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 console.log(\n identifier,\n `Stream error: aborted due to timeout after ${chunkTimeoutMs} ms.`,\n JSON.stringify({ paragraph })\n );\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 console.log(\n identifier,\n `Stream error: ended after ${\n chunkIndex + 1\n } chunks via reader done flag.`,\n rawStreamedBody\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 console.log(\n identifier,\n `Stream explicitly marked as done after ${chunkIndex + 1} chunks.`\n );\n try {\n return parseStreamedResponse(\n identifier,\n paragraph,\n functionCallName,\n functionCallArgs,\n functionNames\n );\n } catch (error) {\n console.error(\n identifier,\n \"Stream error: parsing response:\",\n rawStreamedBody\n );\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 console.error(\n identifier,\n \"Stream error: OpenAI error:\",\n json.error && JSON.stringify(json.error)\n );\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 console.error(\n identifier,\n \"Stream error: no choices in JSON:\",\n json\n ); // bad if it's not the first chunk\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: string,\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 console.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 console.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 console.error(\n identifier,\n \"OpenAI JSON parsing error:\",\n JSON.stringify(error)\n );\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 console.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n console.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 console.error(identifier, \"OpenAI API error:\", JSON.stringify(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 console.error(identifier, \"OpenAI error:\", JSON.stringify(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 };\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: string,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig,\n attempts = 5\n): Promise<ParsedResponseMessage> {\n console.log(identifier, \"Calling Anthropic API with retries\");\n let lastResponse;\n for (let i = 0; i < attempts; i++) {\n // if last attempt\n if (i === attempts - 1) {\n AiPayload.model = ClaudeModel.SONNET; // fallback to sonnet model\n }\n\n try {\n // return await callAnthropic(identifier, AiPayload);\n lastResponse = await callAnthropic(identifier, AiPayload, AiConfig);\n return lastResponse;\n } catch (e: any) {\n console.error(e);\n console.error(\n identifier,\n `Retrying due to error: received bad response from Anthropic API: ${e.message}`,\n JSON.stringify(e.response?.data)\n );\n\n if (e.response?.data?.error?.type === \"rate_limit_error\") {\n // upgrade to Sonnet\n AiPayload.model = ClaudeModel.SONNET;\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: string,\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 console.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 console.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 console.log(\"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 console.error(\n identifier,\n \"Missing text & fns in Anthropic API response:\",\n JSON.stringify(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 };\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\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 console.warn(\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 } 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: string,\n payload: GoogleAIPayload\n): Promise<ParsedResponseMessage> {\n console.log(identifier, \"Calling Google AI API\");\n\n const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);\n const model = genAI.getGenerativeModel({\n model: payload.model,\n tools: payload.tools,\n systemInstruction: payload.systemInstruction,\n });\n\n const history = payload.messages.slice(0, -1);\n const lastMessage = payload.messages.slice(-1)[0];\n const chat = model.startChat({\n history,\n });\n\n const result = await chat.sendMessage(lastMessage.parts);\n const response = await result.response;\n\n const text: string | undefined = response.text();\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 return {\n role: \"assistant\",\n content: text || null,\n function_call: parsedFunctionCalls?.[0] || null,\n };\n}\n\nexport async function callWithRetries(\n identifier: string,\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n // Determine which service to use based on the model type\n if (isAnthropicPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to Anthropic API\");\n\n return await callAnthropicWithRetries(\n identifier,\n await prepareAnthropicPayload(aiPayload),\n aiConfig as AnthropicAIConfig,\n retries\n );\n } else if (isOpenAiPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to OpenAI API\");\n return await callOpenAiWithRetries(\n identifier,\n await prepareOpenAIPayload(aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs\n );\n } else if (isGroqPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to Groq API\");\n return await callGroqWithRetries(\n identifier,\n await prepareGroqPayload(aiPayload)\n );\n } else if (isGoogleAIPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to Google AI API\");\n return await callGoogleAI(\n identifier,\n await prepareGoogleAIPayload(aiPayload)\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 console.warn(\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 temperature: payload.temperature,\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 for (const file of message.files || []) {\n if (file.mimeType?.startsWith(\"image\")) {\n if (file.url) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: file.url,\n },\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 console.warn(\n \"Skipping file. 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: string,\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 console.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 };\n}\n\nasync function callGroqWithRetries(\n identifier: string,\n payload: GroqPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n console.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 console.error(e);\n console.error(\n identifier,\n `Retrying due to error: received bad response from Groq API: ${e.message}`,\n JSON.stringify(e.response?.data)\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 console.log(\"Normalizing image\", url);\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","abortTimeout","response"]}
1
+ {"version":3,"sources":["../interfaces.ts","../index.ts","../utils.ts"],"sourcesContent":["export enum ClaudeModel {\n HAIKU = \"claude-3-haiku-20240307\",\n SONNET = \"claude-3-sonnet-20240229\",\n OPUS = \"claude-3-opus-20240229\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\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}\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}\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 temperature?: number;\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","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 {\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: string,\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 console.error(\"Error parsing functionCallArgs:\", functionCallArgs);\n throw error;\n }\n }\n\n if (!paragraph && !functionCall) {\n console.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: string,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n console.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 console.error(error);\n console.error(\n identifier,\n `Retrying due to error: received bad response from OpenAI API [${\n openAiConfig?.service\n }-${openAiPayload.model}-${openAiConfig?.orgId}]: ${\n error.message\n } - ${JSON.stringify(error.response?.data)}`\n );\n\n const errorCode = error.data?.code;\n\n if (errorCode) {\n console.error(\n identifier,\n `Retry #${i} failed with API error: ${errorCode}`,\n JSON.stringify({\n data: error.data,\n })\n );\n }\n\n openAiPayload.temperature = 0.8; // Higher temperature\n\n // Usually due to image content, we get a policy violation error\n if (errorCode === \"content_policy_violation\") {\n console.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 console.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 console.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 console.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 console.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: string,\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 console.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 console.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 console.error(\n identifier,\n \"Stream error: Azure OpenAI JSON parsing error:\",\n JSON.stringify(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 console.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n console.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 console.log(\n identifier,\n `Stream error: aborted due to timeout after ${chunkTimeoutMs} ms.`,\n JSON.stringify({ paragraph })\n );\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 console.log(\n identifier,\n `Stream error: ended after ${\n chunkIndex + 1\n } chunks via reader done flag.`,\n rawStreamedBody\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 console.log(\n identifier,\n `Stream explicitly marked as done after ${chunkIndex + 1} chunks.`\n );\n try {\n return parseStreamedResponse(\n identifier,\n paragraph,\n functionCallName,\n functionCallArgs,\n functionNames\n );\n } catch (error) {\n console.error(\n identifier,\n \"Stream error: parsing response:\",\n rawStreamedBody\n );\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 console.error(\n identifier,\n \"Stream error: OpenAI error:\",\n json.error && JSON.stringify(json.error)\n );\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 console.error(\n identifier,\n \"Stream error: no choices in JSON:\",\n json\n ); // bad if it's not the first chunk\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: string,\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 console.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 console.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 console.error(\n identifier,\n \"OpenAI JSON parsing error:\",\n JSON.stringify(error)\n );\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 console.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n console.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 console.error(identifier, \"OpenAI API error:\", JSON.stringify(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 console.error(identifier, \"OpenAI error:\", JSON.stringify(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: string,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig,\n attempts = 5\n): Promise<ParsedResponseMessage> {\n console.log(identifier, \"Calling Anthropic API with retries\");\n let lastResponse;\n for (let i = 0; i < attempts; i++) {\n // if last attempt\n if (i === attempts - 1) {\n AiPayload.model = ClaudeModel.SONNET; // fallback to sonnet model\n }\n\n try {\n // return await callAnthropic(identifier, AiPayload);\n lastResponse = await callAnthropic(identifier, AiPayload, AiConfig);\n return lastResponse;\n } catch (e: any) {\n console.error(e);\n console.error(\n identifier,\n `Retrying due to error: received bad response from Anthropic API: ${e.message}`,\n JSON.stringify(e.response?.data)\n );\n\n if (e.response?.data?.error?.type === \"rate_limit_error\") {\n // upgrade to Sonnet\n AiPayload.model = ClaudeModel.SONNET;\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: string,\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 console.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 console.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 console.log(\"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 console.error(\n identifier,\n \"Missing text & fns in Anthropic API response:\",\n JSON.stringify(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];\n\n // If first message is assistant, add empty user message before it\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 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 text content of messages with the same 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 assistant, 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 console.warn(\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 } 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: string,\n payload: GoogleAIPayload\n): Promise<ParsedResponseMessage> {\n console.log(identifier, \"Calling Google AI API\");\n\n const history = payload.messages.slice(0, -1);\n const lastMessage = payload.messages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({\n apiKey: process.env.GEMINI_API_KEY,\n });\n\n console.log(identifier, \"Google AI API payload:\", history);\n\n const chat = genAI.chats.create({\n model: payload.model,\n history,\n config: {\n // responseModalities: [\"Text\", \"Image\"],\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 return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: parsedFunctionCalls?.[0] || null,\n };\n}\n\nexport async function callWithRetries(\n identifier: string,\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n // Determine which service to use based on the model type\n if (isAnthropicPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to Anthropic API\");\n\n return await callAnthropicWithRetries(\n identifier,\n await prepareAnthropicPayload(aiPayload),\n aiConfig as AnthropicAIConfig,\n retries\n );\n } else if (isOpenAiPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to OpenAI API\");\n return await callOpenAiWithRetries(\n identifier,\n await prepareOpenAIPayload(aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs\n );\n } else if (isGroqPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to Groq API\");\n return await callGroqWithRetries(\n identifier,\n await prepareGroqPayload(aiPayload)\n );\n } else if (isGoogleAIPayload(aiPayload)) {\n console.log(identifier, \"Delegating call to Google AI API\");\n return await callGoogleAI(\n identifier,\n await prepareGoogleAIPayload(aiPayload)\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 console.warn(\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 temperature: payload.temperature,\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 for (const file of message.files || []) {\n if (file.mimeType?.startsWith(\"image\")) {\n if (file.url) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: file.url,\n },\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 console.warn(\n \"Skipping file. 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: string,\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 console.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: string,\n payload: GroqPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n console.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 console.error(e);\n console.error(\n identifier,\n `Retrying due to error: received bad response from Groq API: ${e.message}`,\n JSON.stringify(e.response?.data)\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 console.log(\"Normalizing image\", url);\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","abortTimeout","response","_a","_b"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "190proof",
3
- "version": "1.0.54",
3
+ "version": "1.0.56",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -24,6 +24,7 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@aws-sdk/client-bedrock-runtime": "^3.716.0",
27
+ "@google/genai": "^0.6.1",
27
28
  "@google/generative-ai": "^0.11.1",
28
29
  "axios": "^1.7.9",
29
30
  "heic-decode": "^2.0.0",