190proof 1.0.72 → 1.0.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +64 -23
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +64 -23
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -144,7 +144,11 @@ function parseStreamedResponse(identifier, paragraph, functionCallName, function
|
|
|
144
144
|
arguments: JSON.parse(functionCallArgs)
|
|
145
145
|
};
|
|
146
146
|
} catch (error2) {
|
|
147
|
-
logger_default.error(
|
|
147
|
+
logger_default.error(
|
|
148
|
+
identifier,
|
|
149
|
+
"Error parsing functionCallArgs:",
|
|
150
|
+
functionCallArgs
|
|
151
|
+
);
|
|
148
152
|
throw error2;
|
|
149
153
|
}
|
|
150
154
|
}
|
|
@@ -195,7 +199,10 @@ async function callOpenAiWithRetries(identifier, openAiPayload, openAiConfig, re
|
|
|
195
199
|
);
|
|
196
200
|
const errorCode = (_b = error2.data) == null ? void 0 : _b.code;
|
|
197
201
|
if (errorCode === "content_policy_violation") {
|
|
198
|
-
logger_default.log(
|
|
202
|
+
logger_default.log(
|
|
203
|
+
identifier,
|
|
204
|
+
"Removing images due to content policy violation error"
|
|
205
|
+
);
|
|
199
206
|
openAiPayload.messages.forEach((message) => {
|
|
200
207
|
if (Array.isArray(message.content)) {
|
|
201
208
|
message.content = message.content.filter(
|
|
@@ -205,18 +212,27 @@ async function callOpenAiWithRetries(identifier, openAiPayload, openAiConfig, re
|
|
|
205
212
|
});
|
|
206
213
|
}
|
|
207
214
|
if (i >= 2 && (openAiConfig == null ? void 0 : openAiConfig.service) === "azure" && errorCode === "content_filter") {
|
|
208
|
-
logger_default.log(
|
|
215
|
+
logger_default.log(
|
|
216
|
+
identifier,
|
|
217
|
+
"Switching to OpenAI service due to content filter error"
|
|
218
|
+
);
|
|
209
219
|
openAiConfig.service = "openai";
|
|
210
220
|
}
|
|
211
221
|
if (i === 3) {
|
|
212
222
|
if ((openAiConfig == null ? void 0 : openAiConfig.service) === "azure") {
|
|
213
|
-
logger_default.log(
|
|
223
|
+
logger_default.log(
|
|
224
|
+
identifier,
|
|
225
|
+
"Switching to OpenAI service due to Azure service error"
|
|
226
|
+
);
|
|
214
227
|
openAiConfig.service = "openai";
|
|
215
228
|
}
|
|
216
229
|
}
|
|
217
230
|
if (i === 4) {
|
|
218
231
|
if (openAiPayload.tools) {
|
|
219
|
-
logger_default.log(
|
|
232
|
+
logger_default.log(
|
|
233
|
+
identifier,
|
|
234
|
+
"Switching to no tool choice due to persistent error"
|
|
235
|
+
);
|
|
220
236
|
openAiPayload.tool_choice = "none";
|
|
221
237
|
}
|
|
222
238
|
}
|
|
@@ -267,7 +283,11 @@ async function callOpenAIStream(identifier, openAiPayload, openAiConfig, chunkTi
|
|
|
267
283
|
});
|
|
268
284
|
const parsedPayload = JSON.parse(stringifiedPayload);
|
|
269
285
|
} catch (error2) {
|
|
270
|
-
logger_default.error(
|
|
286
|
+
logger_default.error(
|
|
287
|
+
identifier,
|
|
288
|
+
"Stream error: Azure OpenAI JSON parsing error:",
|
|
289
|
+
error2
|
|
290
|
+
);
|
|
271
291
|
}
|
|
272
292
|
response = await fetch(endpoint, {
|
|
273
293
|
method: "POST",
|
|
@@ -323,7 +343,10 @@ async function callOpenAIStream(identifier, openAiPayload, openAiConfig, chunkTi
|
|
|
323
343
|
const { done, value } = await reader.read();
|
|
324
344
|
clearTimeout(abortTimeout2);
|
|
325
345
|
if (done) {
|
|
326
|
-
logger_default.error(
|
|
346
|
+
logger_default.error(
|
|
347
|
+
identifier,
|
|
348
|
+
`Stream ended prematurely after ${chunkIndex + 1} chunks`
|
|
349
|
+
);
|
|
327
350
|
throw new Error("Stream error: ended prematurely");
|
|
328
351
|
}
|
|
329
352
|
let chunk = new TextDecoder().decode(value);
|
|
@@ -605,7 +628,11 @@ async function callAnthropic(identifier, AiPayload, AiConfig) {
|
|
|
605
628
|
/<thinking>|<\/thinking>|<answer>|<\/answer>/gs,
|
|
606
629
|
""
|
|
607
630
|
);
|
|
608
|
-
logger_default.log(
|
|
631
|
+
logger_default.log(
|
|
632
|
+
identifier,
|
|
633
|
+
"No text in answer, returning text within tags:",
|
|
634
|
+
text
|
|
635
|
+
);
|
|
609
636
|
}
|
|
610
637
|
if (textResponse) {
|
|
611
638
|
textResponse += `
|
|
@@ -623,7 +650,11 @@ ${text}`;
|
|
|
623
650
|
}
|
|
624
651
|
}
|
|
625
652
|
if (!textResponse && !functionCalls.length) {
|
|
626
|
-
logger_default.error(
|
|
653
|
+
logger_default.error(
|
|
654
|
+
identifier,
|
|
655
|
+
"Missing text & fns in Anthropic API response:",
|
|
656
|
+
data
|
|
657
|
+
);
|
|
627
658
|
throw new Error("Missing text & fns in Anthropic API response");
|
|
628
659
|
}
|
|
629
660
|
return {
|
|
@@ -733,7 +764,10 @@ async function prepareGoogleAIPayload(payload) {
|
|
|
733
764
|
}
|
|
734
765
|
for (const file of message.files || []) {
|
|
735
766
|
if (!((_a = file.mimeType) == null ? void 0 : _a.startsWith("image"))) {
|
|
736
|
-
logger_default.warn(
|
|
767
|
+
logger_default.warn(
|
|
768
|
+
"payload",
|
|
769
|
+
"Google AI API does not support non-image file types. Skipping file."
|
|
770
|
+
);
|
|
737
771
|
continue;
|
|
738
772
|
}
|
|
739
773
|
if (file.url) {
|
|
@@ -771,7 +805,6 @@ async function prepareGoogleAIPayload(payload) {
|
|
|
771
805
|
}
|
|
772
806
|
async function callGoogleAI(identifier, payload) {
|
|
773
807
|
var _a, _b, _c;
|
|
774
|
-
logger_default.log(identifier, "Calling Google AI API");
|
|
775
808
|
const googleMessages = jigGoogleMessages(payload.messages);
|
|
776
809
|
const history = googleMessages.slice(0, -1);
|
|
777
810
|
const lastMessage = googleMessages.slice(-1)[0];
|
|
@@ -815,7 +848,11 @@ async function callGoogleAI(identifier, payload) {
|
|
|
815
848
|
};
|
|
816
849
|
});
|
|
817
850
|
if (!text && !(parsedFunctionCalls == null ? void 0 : parsedFunctionCalls.length) && !files.length) {
|
|
818
|
-
logger_default.error(
|
|
851
|
+
logger_default.error(
|
|
852
|
+
identifier,
|
|
853
|
+
"Missing text & fns in Google AI API response:",
|
|
854
|
+
response
|
|
855
|
+
);
|
|
819
856
|
throw new Error("Missing text & fns in Google AI API response");
|
|
820
857
|
}
|
|
821
858
|
return {
|
|
@@ -846,7 +883,6 @@ async function callGoogleAIWithRetries(identifier, payload, retries = 5) {
|
|
|
846
883
|
async function callWithRetries(identifier, aiPayload, aiConfig, retries = 5, chunkTimeoutMs = 15e3) {
|
|
847
884
|
const id = identifier;
|
|
848
885
|
if (isAnthropicPayload(aiPayload)) {
|
|
849
|
-
logger_default.log(id, "Delegating call to Anthropic API");
|
|
850
886
|
return await callAnthropicWithRetries(
|
|
851
887
|
id,
|
|
852
888
|
await prepareAnthropicPayload(aiPayload),
|
|
@@ -854,7 +890,6 @@ async function callWithRetries(identifier, aiPayload, aiConfig, retries = 5, chu
|
|
|
854
890
|
retries
|
|
855
891
|
);
|
|
856
892
|
} else if (isOpenAiPayload(aiPayload)) {
|
|
857
|
-
logger_default.log(id, "Delegating call to OpenAI API");
|
|
858
893
|
return await callOpenAiWithRetries(
|
|
859
894
|
id,
|
|
860
895
|
await prepareOpenAIPayload(aiPayload),
|
|
@@ -863,13 +898,8 @@ async function callWithRetries(identifier, aiPayload, aiConfig, retries = 5, chu
|
|
|
863
898
|
chunkTimeoutMs
|
|
864
899
|
);
|
|
865
900
|
} else if (isGroqPayload(aiPayload)) {
|
|
866
|
-
|
|
867
|
-
return await callGroqWithRetries(
|
|
868
|
-
id,
|
|
869
|
-
await prepareGroqPayload(aiPayload)
|
|
870
|
-
);
|
|
901
|
+
return await callGroqWithRetries(id, await prepareGroqPayload(aiPayload));
|
|
871
902
|
} else if (isGoogleAIPayload(aiPayload)) {
|
|
872
|
-
logger_default.log(id, "Delegating call to Google AI API");
|
|
873
903
|
return await callGoogleAIWithRetries(
|
|
874
904
|
id,
|
|
875
905
|
await prepareGoogleAIPayload(aiPayload),
|
|
@@ -904,7 +934,10 @@ async function prepareAnthropicPayload(payload) {
|
|
|
904
934
|
}
|
|
905
935
|
for (const file of message.files || []) {
|
|
906
936
|
if (!((_a = file.mimeType) == null ? void 0 : _a.startsWith("image"))) {
|
|
907
|
-
logger_default.warn(
|
|
937
|
+
logger_default.warn(
|
|
938
|
+
"payload",
|
|
939
|
+
"Anthropic API does not support non-image file types. Skipping file."
|
|
940
|
+
);
|
|
908
941
|
continue;
|
|
909
942
|
}
|
|
910
943
|
if (file.url) {
|
|
@@ -994,7 +1027,11 @@ async function prepareOpenAIPayload(payload) {
|
|
|
994
1027
|
});
|
|
995
1028
|
}
|
|
996
1029
|
} else {
|
|
997
|
-
logger_default.warn(
|
|
1030
|
+
logger_default.warn(
|
|
1031
|
+
"payload",
|
|
1032
|
+
"Skipping file in message. File or image type not supported by OpenAI API:",
|
|
1033
|
+
file.mimeType
|
|
1034
|
+
);
|
|
998
1035
|
}
|
|
999
1036
|
}
|
|
1000
1037
|
preparedPayload.messages.push({
|
|
@@ -1074,7 +1111,11 @@ async function callGroqWithRetries(identifier, payload, retries = 5) {
|
|
|
1074
1111
|
lastResponse = await callGroq(identifier, payload);
|
|
1075
1112
|
return lastResponse;
|
|
1076
1113
|
} catch (e) {
|
|
1077
|
-
logger_default.error(
|
|
1114
|
+
logger_default.error(
|
|
1115
|
+
identifier,
|
|
1116
|
+
`Retry #${i} error: ${e.message}`,
|
|
1117
|
+
((_a = e.response) == null ? void 0 : _a.data) || e
|
|
1118
|
+
);
|
|
1078
1119
|
await timeout(125 * i);
|
|
1079
1120
|
}
|
|
1080
1121
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts","../interfaces.ts","../logger.ts","../utils.ts"],"sourcesContent":["import {\n ClaudeModel,\n GPTModel,\n OpenAIPayload,\n OpenAIMessage,\n OpenAIConfig,\n AnthropicAIPayload,\n AnthropicAIMessage,\n GenericMessage,\n AnthropicAIConfig,\n GenericPayload,\n GroqPayload,\n GroqModel,\n ParsedResponseMessage,\n FunctionCall,\n AnthropicContentBlock,\n OpenAIContentBlock,\n GoogleAIPayload,\n GeminiModel,\n GoogleAIPart,\n File,\n GoogleAIMessage,\n} from \"./interfaces\";\nimport logger, { Identifier } from \"./logger\";\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from \"@aws-sdk/client-bedrock-runtime\";\nimport axios from \"axios\";\nimport { isHeicImage, timeout } from \"./utils\";\nimport { GoogleGenAI } from \"@google/genai\";\nconst { GoogleGenerativeAI } = require(\"@google/generative-ai\");\n\nconst sharp = require(\"sharp\");\nconst decode = require(\"heic-decode\");\n\nexport {\n ClaudeModel,\n GPTModel,\n GroqModel,\n GeminiModel,\n OpenAIConfig,\n FunctionDefinition,\n GenericMessage,\n GenericPayload,\n} from \"./interfaces\";\n\nfunction parseStreamedResponse(\n identifier: Identifier,\n paragraph: string,\n functionCallName: string,\n functionCallArgs: string,\n allowedFunctionNames: Set<string> | null\n): ParsedResponseMessage {\n let functionCall: ParsedResponseMessage[\"function_call\"] = null;\n if (functionCallName && functionCallArgs) {\n if (allowedFunctionNames && !allowedFunctionNames.has(functionCallName)) {\n throw new Error(\n \"Stream error: received function call with unknown name: \" +\n functionCallName\n );\n }\n\n try {\n functionCall = {\n name: functionCallName,\n arguments: JSON.parse(functionCallArgs),\n };\n } catch (error) {\n logger.error(identifier, \"Error parsing functionCallArgs:\", functionCallArgs);\n throw error;\n }\n }\n\n if (!paragraph && !functionCall) {\n logger.error(\n identifier,\n \"Stream error: received message without content or function_call, raw:\",\n JSON.stringify({ paragraph, functionCallName, functionCallArgs })\n );\n throw new Error(\n \"Stream error: received message without content or function_call\"\n );\n }\n\n return {\n role: \"assistant\",\n content: paragraph || null,\n function_call: functionCall,\n files: [],\n };\n}\n\nasync function callOpenAiWithRetries(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n logger.log(\n identifier,\n \"Calling OpenAI API with retries:\",\n openAiConfig?.service,\n openAiPayload.model\n );\n\n let errorObj: any;\n for (let i = 0; i <= retries; i++) {\n try {\n const timerId = `timer:${identifier}:${Date.now()}:callOpenAi:${\n openAiConfig?.service\n }-${openAiPayload.model}-${openAiConfig?.orgId}`;\n\n if (\n openAiPayload.model === GPTModel.O1_MINI ||\n openAiPayload.model === GPTModel.O1_PREVIEW\n ) {\n return await callOpenAI(identifier, openAiPayload, openAiConfig);\n } else {\n return await callOpenAIStream(\n identifier,\n openAiPayload,\n openAiConfig,\n chunkTimeoutMs\n );\n }\n } catch (error: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${error.message}`,\n error.response?.data || error.data || error\n );\n\n const errorCode = error.data?.code;\n\n // Usually due to image content, we get a policy violation error\n if (errorCode === \"content_policy_violation\") {\n logger.log(identifier, \"Removing images due to content policy violation error\");\n openAiPayload.messages.forEach((message: OpenAIMessage) => {\n if (Array.isArray(message.content)) {\n message.content = message.content.filter(\n (content) => content.type === \"text\"\n );\n }\n });\n }\n\n // on 2nd or more retries\n // if Azure content policy error is persistent\n if (\n i >= 2 &&\n openAiConfig?.service === \"azure\" &&\n errorCode === \"content_filter\"\n ) {\n logger.log(identifier, \"Switching to OpenAI service due to content filter error\");\n openAiConfig.service = \"openai\"; // Move to OpenAI, failed due to Azure content policy\n }\n\n // on 3rd retry\n if (i === 3) {\n if (openAiConfig?.service === \"azure\") {\n logger.log(identifier, \"Switching to OpenAI service due to Azure service error\");\n openAiConfig.service = \"openai\";\n }\n }\n\n // on 4th retry\n if (i === 4) {\n // abort function calling, e.g. stubborn `python` function call case\n if (openAiPayload.tools) {\n logger.log(identifier, \"Switching to no tool choice due to persistent error\");\n openAiPayload.tool_choice = \"none\";\n }\n }\n\n await timeout(250);\n }\n }\n\n logger.error(\n identifier,\n `Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`,\n errorObj\n );\n throw new Error(\n `${identifier}: Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`\n );\n}\n\nasync function callOpenAIStream(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n chunkTimeoutMs: number\n): Promise<ParsedResponseMessage> {\n const functionNames: Set<string> | null = openAiPayload.tools\n ? new Set(openAiPayload.tools.map((fn) => fn.function.name as string))\n : null;\n\n if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n const controller = new AbortController();\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: true,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n } catch (error) {\n logger.error(identifier, \"Stream error: Azure OpenAI JSON parsing error:\", error);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n }\n\n if (response.body) {\n let rawStreamedBody = \"\";\n let paragraph = \"\";\n let functionCallName = \"\";\n let functionCallArgs = \"\";\n\n const reader = response.body.getReader();\n\n let partialChunk = \"\";\n let abortTimeout: NodeJS.Timeout | null = null;\n const startAbortTimeout = () => {\n abortTimeout && clearTimeout(abortTimeout);\n return setTimeout(() => {\n logger.error(identifier, `Stream timeout after ${chunkTimeoutMs}ms`);\n controller.abort();\n }, chunkTimeoutMs);\n };\n\n let chunkIndex = -1;\n while (true) {\n chunkIndex++;\n const abortTimeout = startAbortTimeout();\n const { done, value } = await reader.read();\n clearTimeout(abortTimeout);\n\n if (done) {\n logger.error(identifier, `Stream ended prematurely after ${chunkIndex + 1} chunks`);\n throw new Error(\"Stream error: ended prematurely\");\n }\n\n let chunk = new TextDecoder().decode(value);\n rawStreamedBody += chunk + \"\\n\";\n if (partialChunk) {\n chunk = partialChunk + chunk;\n partialChunk = \"\";\n }\n let jsonStrings = chunk.split(/^data: /gm);\n\n for (let jsonString of jsonStrings) {\n if (!jsonString) {\n continue;\n }\n\n if (jsonString.includes(\"[DONE]\")) {\n try {\n return parseStreamedResponse(\n identifier,\n paragraph,\n functionCallName,\n functionCallArgs,\n functionNames\n );\n } catch (error) {\n logger.error(identifier, \"Stream error: parsing response\");\n throw error;\n }\n }\n\n let json;\n try {\n json = JSON.parse(jsonString.trim());\n } catch (error: any) {\n partialChunk = jsonString; // We're assuming any JSON parsing error means we got a non-terminated JSON for a chunk\n continue;\n }\n\n if (!json.choices || !json.choices.length) {\n if (json.error) {\n logger.error(identifier, \"Stream error: OpenAI error:\", json.error);\n const error = new Error(\"Stream error: OpenAI error\") as any;\n error.data = json.error;\n error.requestBody = truncatePayload(openAiPayload);\n throw error;\n }\n if (chunkIndex !== 0) {\n logger.error(identifier, \"Stream error: no choices in JSON:\", json);\n }\n continue;\n }\n\n const dToolCall:\n | {\n index?: number;\n function?: {\n name?: string;\n arguments?: string;\n };\n }\n | undefined = json.choices?.[0]?.delta?.tool_calls?.[0];\n if (dToolCall) {\n const toolCallIndex = dToolCall.index || 0;\n // TODO: handle multiple function calls in response\n if (toolCallIndex === 0) {\n const dFn = dToolCall.function || {};\n if (dFn.name) functionCallName += dFn.name;\n if (dFn.arguments) functionCallArgs += dFn.arguments;\n }\n }\n\n const text = json.choices?.[0]?.delta?.content;\n if (text) {\n paragraph += text;\n }\n }\n }\n } else {\n throw new Error(\"Stream error: no response body\");\n }\n}\n\nasync function callOpenAI(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined\n): Promise<ParsedResponseMessage> {\n const functionNames: Set<string> | null = openAiPayload.tools\n ? new Set(openAiPayload.tools.map((fn) => fn.function.name as string))\n : null;\n\n if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: false,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n // You can use parsedPayload if needed\n } catch (error) {\n logger.error(identifier, \"OpenAI JSON parsing error:\", error);\n throw error;\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n }\n\n if (!response.ok) {\n const errorData = await response.json();\n logger.error(identifier, \"OpenAI API error:\", errorData);\n throw new Error(`OpenAI API Error: ${errorData.error.message}`);\n }\n\n const data = await response.json();\n\n if (!data.choices || !data.choices.length) {\n if (data.error) {\n logger.error(identifier, \"OpenAI error:\", data.error);\n throw new Error(\"OpenAI error: \" + data.error.message);\n }\n throw new Error(\"OpenAI error: No choices returned.\");\n }\n\n const choice = data.choices[0];\n const functionCall = choice.function_call\n ? {\n name: choice.function_call.name,\n arguments: JSON.parse(choice.function_call.arguments),\n }\n : null;\n\n return {\n role: \"assistant\",\n content: choice.message.content || null,\n function_call: functionCall,\n files: [],\n };\n}\n\nfunction truncatePayload(payload: OpenAIPayload): string {\n return JSON.stringify(\n {\n ...payload,\n messages: payload.messages.map((message) => {\n if (typeof message.content === \"string\") {\n message.content = message.content.slice(0, 100);\n } else if (Array.isArray(message.content)) {\n message.content = message.content.map((block) => {\n if (block.type === \"image_url\") {\n block.image_url.url = block.image_url.url.slice(0, 100);\n }\n return block;\n });\n }\n\n return message;\n }),\n },\n null,\n 2\n );\n}\n\nasync function callAnthropicWithRetries(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig,\n attempts = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Anthropic API with retries\");\n let lastResponse;\n for (let i = 0; i < attempts; i++) {\n try {\n lastResponse = await callAnthropic(identifier, AiPayload, AiConfig);\n return lastResponse;\n } catch (e: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${e.message}`,\n e.response?.data || e\n );\n\n if (e.response?.data?.error?.type === \"rate_limit_error\") {\n // TODO: upgrade model or fallback to bedrock\n }\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Anthropic API after ${attempts} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\n}\n\nasync function callAnthropic(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig\n): Promise<ParsedResponseMessage> {\n const anthropicMessages = jigAnthropicMessages(AiPayload.messages);\n\n let data;\n let response;\n if (AiConfig?.service === \"bedrock\") {\n // DOES NOT SUPPORT TOOLS YET\n const AWS_REGION = \"us-east-1\";\n const MODEL_ID = \"anthropic.claude-3-haiku-20240307-v1:0\";\n\n // set in environment\n // process.env.AWS_ACCESS_KEY_ID = AWS_ACCESS_KEY_ID;\n // process.env.AWS_SECRET_ACCESS_KEY = AWS_SECRET_ACCESS_KEY;\n\n const client = new BedrockRuntimeClient({ region: AWS_REGION });\n const payload = {\n anthropic_version: \"bedrock-2023-05-31\",\n max_tokens: 4096,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n };\n\n const response = await client.send(\n new InvokeModelCommand({\n contentType: \"application/json\",\n body: JSON.stringify(payload),\n modelId: MODEL_ID,\n })\n );\n\n const decodedResponseBody = new TextDecoder().decode(response.body);\n data = JSON.parse(decodedResponseBody);\n } else {\n // default to anthropic\n const response = await axios.post(\n \"https://api.anthropic.com/v1/messages\",\n {\n model: AiPayload.model,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n temperature: AiPayload.temperature,\n system: AiPayload.system,\n max_tokens: 4096,\n },\n {\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": process.env.ANTHROPIC_API_KEY as string,\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-beta\": \"tools-2024-04-04\",\n },\n timeout: 60000,\n }\n );\n\n data = response.data;\n }\n\n const answers = data.content;\n\n if (!answers[0]) {\n logger.error(identifier, \"Missing answer in Anthropic API:\", data);\n throw new Error(\"Missing answer in Anthropic API\");\n }\n\n let textResponse = \"\";\n let functionCalls: any[] = [];\n for (const answer of answers) {\n if (!answer.type) {\n logger.error(identifier, \"Missing answer type in Anthropic API:\", data);\n throw new Error(\"Missing answer type in Anthropic API\");\n }\n\n let text = \"\";\n if (answer.type === \"text\") {\n text = answer.text\n .replace(/<thinking>.*?<\\/thinking>/gs, \"\")\n .replace(/<answer>|<\\/answer>/gs, \"\")\n .trim();\n\n if (!text) {\n // remove the tags and return the text within\n text = answer.text.replace(\n /<thinking>|<\\/thinking>|<answer>|<\\/answer>/gs,\n \"\"\n );\n logger.log(identifier, \"No text in answer, returning text within tags:\", text);\n }\n\n if (textResponse) {\n textResponse += `\\n\\n${text}`;\n } else {\n textResponse = text;\n }\n } else if (answer.type === \"tool_use\") {\n const call = {\n name: answer.name,\n arguments: answer.input,\n };\n functionCalls.push(call);\n }\n }\n\n if (!textResponse && !functionCalls.length) {\n logger.error(identifier, \"Missing text & fns in Anthropic API response:\", data);\n throw new Error(\"Missing text & fns in Anthropic API response\");\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCalls[0],\n files: [],\n };\n}\n\nfunction jigAnthropicMessages(\n messages: AnthropicAIMessage[]\n): AnthropicAIMessage[] {\n // Takes a list if messages each with a role and content\n // Assumes no system messages are present\n\n let jiggedMessages = messages.slice();\n\n // If the first message is not user, add an empty user message at the start\n if (jiggedMessages[0]?.role !== \"user\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n content: \"...\",\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their content\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n // Combine content of messages with the same role\n const lastContent = Array.isArray(lastMessage.content)\n ? lastMessage.content\n : [{ type: \"text\" as const, text: lastMessage.content }];\n const newContent = Array.isArray(message.content)\n ? message.content\n : [{ type: \"text\" as const, text: message.content }];\n\n lastMessage.content = [\n ...lastContent,\n { type: \"text\", text: \"\\n\\n---\\n\\n\" },\n ...newContent,\n ];\n return acc;\n }\n\n // Convert string content to text content block\n if (typeof message.content === \"string\") {\n message.content = [{ type: \"text\", text: message.content }];\n }\n\n return [...acc, message];\n }, [] as AnthropicAIMessage[]);\n\n // If last message in array is assistant, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"assistant\") {\n jiggedMessages.push({\n role: \"user\",\n content: \"...\",\n });\n }\n\n return jiggedMessages;\n}\n\nfunction jigGoogleMessages(messages: GoogleAIMessage[]): GoogleAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // If the first message is model, add an empty user message at the start\n if (jiggedMessages[0]?.role === \"model\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n parts: [{ text: \"...\" }],\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their parts\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n lastMessage.parts = [...lastMessage.parts, ...message.parts];\n return acc;\n }\n\n return [...acc, message];\n }, [] as GoogleAIMessage[]);\n\n // If last message in array is model, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"model\") {\n jiggedMessages.push({\n role: \"user\",\n parts: [{ text: \"...\" }],\n });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareGoogleAIPayload(\n payload: GenericPayload\n): Promise<GoogleAIPayload> {\n const preparedPayload: GoogleAIPayload = {\n model: payload.model as GeminiModel,\n messages: [],\n tools: payload.functions\n ? {\n functionDeclarations: payload.functions.map((fn) => ({\n name: fn.name,\n parameters: {\n // Google puts their description in the parameters object rather than in a top-level field\n description: fn.description,\n ...fn.parameters,\n },\n })),\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.systemInstruction = message.content;\n continue;\n }\n\n const googleAIContentParts: GoogleAIPart[] = [];\n\n if (message.content) {\n googleAIContentParts.push({\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\"payload\", \"Google AI API does not support non-image file types. Skipping file.\");\n continue;\n }\n\n if (file.url) {\n googleAIContentParts.push({\n inlineData: {\n mimeType: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n // Add the URL as a text part\n googleAIContentParts.push({\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n googleAIContentParts.push({\n inlineData: {\n mimeType: file.mimeType,\n data: file.data,\n },\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role === \"assistant\" ? \"model\" : message.role,\n parts: googleAIContentParts,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callGoogleAI(\n identifier: Identifier,\n payload: GoogleAIPayload\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Google AI API\");\n const googleMessages = jigGoogleMessages(payload.messages);\n\n const history = googleMessages.slice(0, -1);\n const lastMessage = googleMessages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({\n apiKey: process.env.GEMINI_API_KEY,\n });\n\n const chat = genAI.chats.create({\n model: payload.model,\n history,\n config: {\n responseModalities: [\"Text\"],\n tools: payload.tools ? [payload.tools] : undefined,\n systemInstruction: payload.systemInstruction,\n },\n });\n\n const response = await chat.sendMessage({\n message: lastMessage.parts,\n });\n\n let text: string = \"\";\n const files: File[] = [];\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.text) {\n text += part.text;\n }\n\n if (part.inlineData) {\n const imageData = part.inlineData.data;\n if (imageData) {\n files.push({\n mimeType: \"image/png\",\n data: imageData,\n });\n }\n }\n }\n\n const functionCalls:\n | {\n name?: string;\n args?: Record<string, any>;\n }[]\n | undefined = response.functionCalls;\n\n const parsedFunctionCalls = functionCalls?.map((fc) => ({\n name: fc.name ?? \"\",\n arguments: fc.args ?? {},\n }));\n\n if (!text && !parsedFunctionCalls?.length && !files.length) {\n logger.error(identifier, \"Missing text & fns in Google AI API response:\", response);\n throw new Error(\"Missing text & fns in Google AI API response\");\n }\n\n return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: parsedFunctionCalls?.[0] || null,\n };\n}\n\nasync function callGoogleAIWithRetries(\n identifier: Identifier,\n payload: GoogleAIPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Google AI API with retries\");\n\n let lastError: any;\n for (let i = 0; i < retries; i++) {\n try {\n return await callGoogleAI(identifier, payload);\n } catch (e: any) {\n lastError = e;\n logger.error(identifier, `Retry #${i} error: ${e.message}`, e);\n\n // Add any specific Google AI error handling or payload modifications here if needed\n // e.g., if (e.status === 429) { /* handle rate limit */ }\n\n await timeout(125 * i); // Exponential backoff\n }\n }\n const error = new Error(\n `Failed to call Google AI API after ${retries} attempts`\n ) as any;\n error.cause = lastError; // Attach the last caught error\n throw error;\n}\n\nexport async function callWithRetries(\n identifier: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n const id = identifier;\n // Determine which service to use based on the model type\n if (isAnthropicPayload(aiPayload)) {\n logger.log(id, \"Delegating call to Anthropic API\");\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(aiPayload),\n aiConfig as AnthropicAIConfig,\n retries\n );\n } else if (isOpenAiPayload(aiPayload)) {\n logger.log(id, \"Delegating call to OpenAI API\");\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs\n );\n } else if (isGroqPayload(aiPayload)) {\n logger.log(id, \"Delegating call to Groq API\");\n return await callGroqWithRetries(\n id,\n await prepareGroqPayload(aiPayload)\n );\n } else if (isGoogleAIPayload(aiPayload)) {\n logger.log(id, \"Delegating call to Google AI API\");\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(aiPayload),\n retries\n );\n } else {\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n }\n}\n\nfunction isAnthropicPayload(payload: any): Boolean {\n return Object.values(ClaudeModel).includes(payload.model);\n}\n\nasync function prepareAnthropicPayload(\n payload: GenericPayload\n): Promise<AnthropicAIPayload> {\n const preparedPayload: AnthropicAIPayload = {\n model: payload.model as ClaudeModel,\n messages: [],\n functions: payload.functions,\n temperature: payload.temperature,\n };\n\n for (const message of payload.messages) {\n const anthropicContentBlocks: AnthropicContentBlock[] = [];\n\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n if (message.content) {\n anthropicContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\"payload\", \"Anthropic API does not support non-image file types. Skipping file.\");\n continue;\n }\n\n if (file.url) {\n anthropicContentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n anthropicContentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: file.mimeType as any,\n data: file.data,\n },\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: anthropicContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isOpenAiPayload(payload: any): Boolean {\n return Object.values(GPTModel).includes(payload.model);\n}\n\nasync function prepareOpenAIPayload(\n payload: GenericPayload\n): Promise<OpenAIPayload> {\n const preparedPayload: OpenAIPayload = {\n model: payload.model as GPTModel,\n messages: [],\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const openAIContentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n openAIContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n const allowedFileMimeTypes = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ];\n\n for (const file of message.files || []) {\n if (allowedFileMimeTypes.includes(file.mimeType)) {\n if (file.url) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: file.url,\n },\n });\n // Add the URL as a text part\n openAIContentBlocks.push({\n type: \"text\",\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: `data:${file.mimeType};base64,${file.data}`,\n },\n });\n }\n // } else if (file.mimeType?.startsWith(\"audio\")) {\n // if (file.url) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: file.url,\n // },\n // });\n // } else if (file.data) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: `data:${file.mimeType};base64,${file.data}`,\n // },\n // });\n // }\n } else {\n logger.warn(\"payload\", \"Skipping file in message. File or image type not supported by OpenAI API:\", file.mimeType);\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: openAIContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isGroqPayload(payload: any): Boolean {\n return Object.values(GroqModel).includes(payload.model);\n}\n\nfunction prepareGroqPayload(payload: GenericPayload): GroqPayload {\n return {\n model: payload.model as GroqModel,\n messages: payload.messages.map((message) => ({\n role: message.role,\n content: normalizeMessageContent(message.content),\n })),\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n temperature: payload.temperature,\n };\n}\n\nfunction normalizeMessageContent(\n content: AnthropicAIMessage[\"content\"]\n): string {\n return Array.isArray(content)\n ? content\n .map((c) => (c.type === \"text\" ? c.text : `[${c.type}]`))\n .join(\"\\n\")\n : content;\n}\n\nfunction isGoogleAIPayload(payload: any): Boolean {\n return Object.values(GeminiModel).includes(payload.model);\n}\n\nasync function callGroq(\n identifier: Identifier,\n payload: GroqPayload\n): Promise<ParsedResponseMessage> {\n const response = await axios.post(\n \"https://api.groq.com/openai/v1/chat/completions\",\n payload,\n {\n headers: {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${process.env.GROQ_API_KEY}`,\n },\n }\n );\n\n const data = response.data;\n\n const answer = data.choices[0].message;\n if (!answer) {\n logger.error(identifier, \"Missing answer in Groq API:\", data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const textResponse = answer.content || null;\n let functionCall: FunctionCall | null = null;\n if (answer.tool_calls && answer.tool_calls.length) {\n const toolCall = answer.tool_calls[0];\n functionCall = {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments),\n };\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCall,\n files: [],\n };\n}\n\nasync function callGroqWithRetries(\n identifier: Identifier,\n payload: GroqPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Groq API with retries\");\n\n let lastResponse;\n for (let i = 0; i < retries; i++) {\n try {\n lastResponse = await callGroq(identifier, payload);\n return lastResponse;\n } catch (e: any) {\n logger.error(identifier, `Retry #${i} error: ${e.message}`, e.response?.data || e);\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Groq API after ${retries} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\n}\n\nasync function getNormalizedBase64PNG(\n url: string,\n mime: string\n): Promise<string> {\n const response = await axios.get(url, { responseType: \"arraybuffer\" });\n\n let imageBuffer = Buffer.from(response.data);\n let sharpOptions = {};\n if (isHeicImage(url, mime)) {\n const imageData = await decode({ buffer: imageBuffer });\n imageBuffer = Buffer.from(imageData.data);\n sharpOptions = {\n raw: {\n width: imageData.width,\n height: imageData.height,\n channels: 4,\n },\n };\n }\n\n // Limits size of image to < 5MB Anthropic limit\n const resizedBuffer = await sharp(imageBuffer, sharpOptions)\n .withMetadata()\n .resize(1024, 1024, { fit: \"inside\", withoutEnlargement: true })\n .png()\n .toBuffer();\n\n return resizedBuffer.toString(\"base64\");\n}\n\n// async function main() {\n// const payload: GenericPayload = {\n// model: GeminiModel.GEMINI_15_PRO,\n// messages: [\n// {\n// role: \"user\",\n// content: \"What is this logo?\",\n// files: [\n// {\n// mimeType: \"image/png\",\n// url: \"https://www.wikimedia.org/static/images/wmf-logo-2x.png\",\n// },\n// ],\n// },\n// ],\n// functions: [\n// {\n// name: \"answer_logo_question\",\n// description: \"Answer a question about a logo\",\n// parameters: {\n// type: \"object\",\n// properties: {\n// organization: {\n// type: \"string\",\n// },\n// },\n// },\n// },\n// ],\n// };\n\n// const answer = await callWithRetries(\"test\", payload);\n\n// console.log(answer);\n// }\n\n// main();\n","export enum ClaudeModel {\n HAIKU_3 = \"claude-3-haiku-20240307\",\n SONNET_3 = \"claude-3-sonnet-20240229\",\n OPUS_3 = \"claude-3-opus-20240229\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\n SONNET_4_5 = \"claude-sonnet-4-5\",\n OPUS_4_5 = \"claude-opus-4-5\",\n}\n\nexport enum GPTModel {\n GPT35_0613 = \"gpt-3.5-turbo-0613\",\n GPT35_0613_16K = \"gpt-3.5-turbo-16k-0613\",\n GPT35_0125 = \"gpt-3.5-turbo-0125\",\n GPT4_1106_PREVIEW = \"gpt-4-1106-preview\",\n GPT4_0125_PREVIEW = \"gpt-4-0125-preview\",\n GPT4_0409 = \"gpt-4-turbo-2024-04-09\",\n GPT4O = \"gpt-4o\",\n GPT4O_MINI = \"gpt-4o-mini\",\n O1_PREVIEW = \"o1-preview\",\n O1_MINI = \"o1-mini\",\n O3_MINI = \"o3-mini\",\n GPT4_1 = \"gpt-4.1\",\n GPT4_1_MINI = \"gpt-4.1-mini\",\n GPT4_1_NANO = \"gpt-4.1-nano\",\n GPT5 = \"gpt-5\",\n GPT5_MINI = \"gpt-5-mini\",\n}\n\nexport enum GroqModel {\n LLAMA_3_70B_8192 = \"llama3-70b-8192\",\n DEEPSEEK_R1_DISTILL_LLAMA_70B = \"deepseek-r1-distill-llama-70b\",\n}\n\nexport enum GeminiModel {\n GEMINI_1_5_PRO = \"gemini-1.5-pro-latest\",\n GEMINI_EXP_1206 = \"gemini-exp-1206\",\n GEMINI_2_0_FLASH = \"gemini-2.0-flash\",\n GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION = \"gemini-2.0-flash-exp-image-generation\",\n GEMINI_2_0_FLASH_THINKING_EXP = \"gemini-2.0-flash-thinking-exp\",\n GEMINI_2_0_FLASH_THINKING_EXP_01_21 = \"gemini-2.0-flash-thinking-exp-01-21\",\n GEMINI_2_5_FLASH_PREVIEW_04_17 = \"gemini-2.5-flash-preview-04-17\",\n GEMINI_3_FLASH_PREVIEW = \"gemini-3-flash-preview\",\n}\n\nexport interface GenericError {\n message: string;\n}\n\nexport enum ContentType {\n TEXT = \"text\",\n ATTACHMENT = \"attachment\",\n}\n\nexport type AIChainResponse = {\n content: string | null;\n contentType?: ContentType;\n functionCalls: FunctionCall[];\n};\n\nexport interface GenericMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp?: string;\n files?: File[];\n functionCalls?: FunctionCall[];\n}\n\nexport interface File {\n mimeType: string;\n url?: string;\n data?: string;\n}\n\nexport interface OpenAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | OpenAIContentBlock[];\n}\n\nexport type OpenAIContentBlock =\n | OpenAITextContentBlock\n | OpenAIImageContentBlock\n | OpenAIAudioContentBlock;\n\nexport interface OpenAITextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface OpenAIImageContentBlock {\n type: \"image_url\";\n image_url: {\n url: string; // URL to the image, can also be a base64 string\n };\n}\n\nexport interface OpenAIAudioContentBlock {\n type: \"audio_url\";\n audio_url: {\n url: string; // URL to the audio, can also be a base64 string\n };\n}\n\nexport interface AnthropicAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | AnthropicContentBlock[];\n}\n\nexport type AnthropicContentBlock =\n | AnthropicTextContentBlock\n | AnthropicImageContentBlock;\n\nexport interface AnthropicTextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface AnthropicImageContentBlock {\n type: \"image\";\n source: {\n type: \"base64\";\n media_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n data: string; // Must be a base64 string\n };\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface ParsedResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: FunctionCall | null;\n files: File[];\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIConfig {\n service: \"azure\" | \"openai\";\n apiKey: string;\n baseUrl: string;\n orgId?: string;\n modelConfigMap?: Record<\n GPTModel,\n {\n resource: string;\n deployment: string;\n apiVersion: string;\n apiKey: string;\n endpoint?: string;\n }\n >;\n}\n\nexport interface AnthropicAIConfig {\n service: \"anthropic\" | \"bedrock\";\n}\n\nexport interface FunctionDefinition {\n name: string;\n description?: string;\n parameters: Record<string, any>;\n}\n\ninterface FunctionWrapped {\n type: \"function\";\n function: FunctionDefinition;\n}\n\nexport interface GroqPayload {\n model: GroqModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n temperature?: number;\n\n functions?: any[]; // Deprecate this\n}\n\nexport interface OpenAIPayload {\n model: GPTModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n}\n\nexport interface AnthropicAIPayload {\n model: ClaudeModel;\n messages: AnthropicAIMessage[];\n functions?: any[]; // TODO type this JSON schema\n temperature?: number;\n system?: string;\n}\n\nexport interface GoogleAITextPart {\n text: string;\n}\n\nexport interface GoogleAIInlineDataPart {\n inlineData: {\n mimeType: string;\n data: string;\n };\n}\n\nexport type GoogleAIPart = GoogleAITextPart | GoogleAIInlineDataPart;\nexport interface GoogleAIMessage {\n role: \"user\" | \"model\";\n parts: GoogleAIPart[];\n}\nexport interface GoogleAIPayload {\n model: GeminiModel;\n messages: GoogleAIMessage[];\n tools?: {\n functionDeclarations: FunctionDefinition[];\n };\n systemInstruction?: string;\n}\n\nexport interface GenericPayload {\n model: GPTModel | ClaudeModel | GroqModel | GeminiModel;\n messages: GenericMessage[];\n functions?: FunctionDefinition[];\n function_call?: \"none\" | \"auto\" | { name: string };\n temperature?: number;\n}\n\nexport interface OpenAIBody {\n choices: {\n message: OpenAIResponseMessage;\n }[];\n error?: {\n code: string;\n };\n usage: {\n completion_tokens: number;\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n","type LogLevel = \"LOG\" | \"WARN\" | \"ERROR\";\nexport type Identifier = string | string[];\n\nfunction formatIdentifier(identifier: Identifier): string {\n if (Array.isArray(identifier)) {\n return identifier.map((id) => `[${id}]`).join(\" \");\n }\n return `[${identifier}]`;\n}\n\nfunction formatMessage(\n level: LogLevel,\n identifier: Identifier,\n message: string\n): string {\n return `[${level}] ${formatIdentifier(identifier)} ${message}`;\n}\n\nexport function log(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.log(formatMessage(\"LOG\", identifier, message), ...args);\n}\n\nexport function warn(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.warn(formatMessage(\"WARN\", identifier, message), ...args);\n}\n\nexport function error(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.error(formatMessage(\"ERROR\", identifier, message), ...args);\n}\n\nexport default {\n log,\n warn,\n error,\n};\n","export function timeout(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function isHeicImage(name: string, mime?: string): boolean {\n const extension = name.split(\".\").pop()?.toLowerCase() || \"\";\n return (\n [\"heic\", \"heif\", \"heics\"].includes(extension) ||\n !!(\n mime && [\"image/heic\", \"image/heif\", \"image/heic-sequence\"].includes(mime)\n )\n );\n}\n"],"mappings":"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","names":["ClaudeModel","GPTModel","GroqModel","GeminiModel","error","abortTimeout","response","axios","_a","_b"]}
|
|
1
|
+
{"version":3,"sources":["../index.ts","../interfaces.ts","../logger.ts","../utils.ts"],"sourcesContent":["import {\n ClaudeModel,\n GPTModel,\n OpenAIPayload,\n OpenAIMessage,\n OpenAIConfig,\n AnthropicAIPayload,\n AnthropicAIMessage,\n GenericMessage,\n AnthropicAIConfig,\n GenericPayload,\n GroqPayload,\n GroqModel,\n ParsedResponseMessage,\n FunctionCall,\n AnthropicContentBlock,\n OpenAIContentBlock,\n GoogleAIPayload,\n GeminiModel,\n GoogleAIPart,\n File,\n GoogleAIMessage,\n} from \"./interfaces\";\nimport logger, { Identifier } from \"./logger\";\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from \"@aws-sdk/client-bedrock-runtime\";\nimport axios from \"axios\";\nimport { isHeicImage, timeout } from \"./utils\";\nimport { GoogleGenAI } from \"@google/genai\";\nconst { GoogleGenerativeAI } = require(\"@google/generative-ai\");\n\nconst sharp = require(\"sharp\");\nconst decode = require(\"heic-decode\");\n\nexport {\n ClaudeModel,\n GPTModel,\n GroqModel,\n GeminiModel,\n OpenAIConfig,\n FunctionDefinition,\n GenericMessage,\n GenericPayload,\n} from \"./interfaces\";\n\nfunction parseStreamedResponse(\n identifier: Identifier,\n paragraph: string,\n functionCallName: string,\n functionCallArgs: string,\n allowedFunctionNames: Set<string> | null\n): ParsedResponseMessage {\n let functionCall: ParsedResponseMessage[\"function_call\"] = null;\n if (functionCallName && functionCallArgs) {\n if (allowedFunctionNames && !allowedFunctionNames.has(functionCallName)) {\n throw new Error(\n \"Stream error: received function call with unknown name: \" +\n functionCallName\n );\n }\n\n try {\n functionCall = {\n name: functionCallName,\n arguments: JSON.parse(functionCallArgs),\n };\n } catch (error) {\n logger.error(\n identifier,\n \"Error parsing functionCallArgs:\",\n functionCallArgs\n );\n throw error;\n }\n }\n\n if (!paragraph && !functionCall) {\n logger.error(\n identifier,\n \"Stream error: received message without content or function_call, raw:\",\n JSON.stringify({ paragraph, functionCallName, functionCallArgs })\n );\n throw new Error(\n \"Stream error: received message without content or function_call\"\n );\n }\n\n return {\n role: \"assistant\",\n content: paragraph || null,\n function_call: functionCall,\n files: [],\n };\n}\n\nasync function callOpenAiWithRetries(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n logger.log(\n identifier,\n \"Calling OpenAI API with retries:\",\n openAiConfig?.service,\n openAiPayload.model\n );\n\n let errorObj: any;\n for (let i = 0; i <= retries; i++) {\n try {\n const timerId = `timer:${identifier}:${Date.now()}:callOpenAi:${\n openAiConfig?.service\n }-${openAiPayload.model}-${openAiConfig?.orgId}`;\n\n if (\n openAiPayload.model === GPTModel.O1_MINI ||\n openAiPayload.model === GPTModel.O1_PREVIEW\n ) {\n return await callOpenAI(identifier, openAiPayload, openAiConfig);\n } else {\n return await callOpenAIStream(\n identifier,\n openAiPayload,\n openAiConfig,\n chunkTimeoutMs\n );\n }\n } catch (error: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${error.message}`,\n error.response?.data || error.data || error\n );\n\n const errorCode = error.data?.code;\n\n // Usually due to image content, we get a policy violation error\n if (errorCode === \"content_policy_violation\") {\n logger.log(\n identifier,\n \"Removing images due to content policy violation error\"\n );\n openAiPayload.messages.forEach((message: OpenAIMessage) => {\n if (Array.isArray(message.content)) {\n message.content = message.content.filter(\n (content) => content.type === \"text\"\n );\n }\n });\n }\n\n // on 2nd or more retries\n // if Azure content policy error is persistent\n if (\n i >= 2 &&\n openAiConfig?.service === \"azure\" &&\n errorCode === \"content_filter\"\n ) {\n logger.log(\n identifier,\n \"Switching to OpenAI service due to content filter error\"\n );\n openAiConfig.service = \"openai\"; // Move to OpenAI, failed due to Azure content policy\n }\n\n // on 3rd retry\n if (i === 3) {\n if (openAiConfig?.service === \"azure\") {\n logger.log(\n identifier,\n \"Switching to OpenAI service due to Azure service error\"\n );\n openAiConfig.service = \"openai\";\n }\n }\n\n // on 4th retry\n if (i === 4) {\n // abort function calling, e.g. stubborn `python` function call case\n if (openAiPayload.tools) {\n logger.log(\n identifier,\n \"Switching to no tool choice due to persistent error\"\n );\n openAiPayload.tool_choice = \"none\";\n }\n }\n\n await timeout(250);\n }\n }\n\n logger.error(\n identifier,\n `Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`,\n errorObj\n );\n throw new Error(\n `${identifier}: Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`\n );\n}\n\nasync function callOpenAIStream(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n chunkTimeoutMs: number\n): Promise<ParsedResponseMessage> {\n const functionNames: Set<string> | null = openAiPayload.tools\n ? new Set(openAiPayload.tools.map((fn) => fn.function.name as string))\n : null;\n\n if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n const controller = new AbortController();\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: true,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n } catch (error) {\n logger.error(\n identifier,\n \"Stream error: Azure OpenAI JSON parsing error:\",\n error\n );\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n }\n\n if (response.body) {\n let rawStreamedBody = \"\";\n let paragraph = \"\";\n let functionCallName = \"\";\n let functionCallArgs = \"\";\n\n const reader = response.body.getReader();\n\n let partialChunk = \"\";\n let abortTimeout: NodeJS.Timeout | null = null;\n const startAbortTimeout = () => {\n abortTimeout && clearTimeout(abortTimeout);\n return setTimeout(() => {\n logger.error(identifier, `Stream timeout after ${chunkTimeoutMs}ms`);\n controller.abort();\n }, chunkTimeoutMs);\n };\n\n let chunkIndex = -1;\n while (true) {\n chunkIndex++;\n const abortTimeout = startAbortTimeout();\n const { done, value } = await reader.read();\n clearTimeout(abortTimeout);\n\n if (done) {\n logger.error(\n identifier,\n `Stream ended prematurely after ${chunkIndex + 1} chunks`\n );\n throw new Error(\"Stream error: ended prematurely\");\n }\n\n let chunk = new TextDecoder().decode(value);\n rawStreamedBody += chunk + \"\\n\";\n if (partialChunk) {\n chunk = partialChunk + chunk;\n partialChunk = \"\";\n }\n let jsonStrings = chunk.split(/^data: /gm);\n\n for (let jsonString of jsonStrings) {\n if (!jsonString) {\n continue;\n }\n\n if (jsonString.includes(\"[DONE]\")) {\n try {\n return parseStreamedResponse(\n identifier,\n paragraph,\n functionCallName,\n functionCallArgs,\n functionNames\n );\n } catch (error) {\n logger.error(identifier, \"Stream error: parsing response\");\n throw error;\n }\n }\n\n let json;\n try {\n json = JSON.parse(jsonString.trim());\n } catch (error: any) {\n partialChunk = jsonString; // We're assuming any JSON parsing error means we got a non-terminated JSON for a chunk\n continue;\n }\n\n if (!json.choices || !json.choices.length) {\n if (json.error) {\n logger.error(identifier, \"Stream error: OpenAI error:\", json.error);\n const error = new Error(\"Stream error: OpenAI error\") as any;\n error.data = json.error;\n error.requestBody = truncatePayload(openAiPayload);\n throw error;\n }\n if (chunkIndex !== 0) {\n logger.error(identifier, \"Stream error: no choices in JSON:\", json);\n }\n continue;\n }\n\n const dToolCall:\n | {\n index?: number;\n function?: {\n name?: string;\n arguments?: string;\n };\n }\n | undefined = json.choices?.[0]?.delta?.tool_calls?.[0];\n if (dToolCall) {\n const toolCallIndex = dToolCall.index || 0;\n // TODO: handle multiple function calls in response\n if (toolCallIndex === 0) {\n const dFn = dToolCall.function || {};\n if (dFn.name) functionCallName += dFn.name;\n if (dFn.arguments) functionCallArgs += dFn.arguments;\n }\n }\n\n const text = json.choices?.[0]?.delta?.content;\n if (text) {\n paragraph += text;\n }\n }\n }\n } else {\n throw new Error(\"Stream error: no response body\");\n }\n}\n\nasync function callOpenAI(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined\n): Promise<ParsedResponseMessage> {\n const functionNames: Set<string> | null = openAiPayload.tools\n ? new Set(openAiPayload.tools.map((fn) => fn.function.name as string))\n : null;\n\n if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: false,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n // You can use parsedPayload if needed\n } catch (error) {\n logger.error(identifier, \"OpenAI JSON parsing error:\", error);\n throw error;\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n }\n\n if (!response.ok) {\n const errorData = await response.json();\n logger.error(identifier, \"OpenAI API error:\", errorData);\n throw new Error(`OpenAI API Error: ${errorData.error.message}`);\n }\n\n const data = await response.json();\n\n if (!data.choices || !data.choices.length) {\n if (data.error) {\n logger.error(identifier, \"OpenAI error:\", data.error);\n throw new Error(\"OpenAI error: \" + data.error.message);\n }\n throw new Error(\"OpenAI error: No choices returned.\");\n }\n\n const choice = data.choices[0];\n const functionCall = choice.function_call\n ? {\n name: choice.function_call.name,\n arguments: JSON.parse(choice.function_call.arguments),\n }\n : null;\n\n return {\n role: \"assistant\",\n content: choice.message.content || null,\n function_call: functionCall,\n files: [],\n };\n}\n\nfunction truncatePayload(payload: OpenAIPayload): string {\n return JSON.stringify(\n {\n ...payload,\n messages: payload.messages.map((message) => {\n if (typeof message.content === \"string\") {\n message.content = message.content.slice(0, 100);\n } else if (Array.isArray(message.content)) {\n message.content = message.content.map((block) => {\n if (block.type === \"image_url\") {\n block.image_url.url = block.image_url.url.slice(0, 100);\n }\n return block;\n });\n }\n\n return message;\n }),\n },\n null,\n 2\n );\n}\n\nasync function callAnthropicWithRetries(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig,\n attempts = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Anthropic API with retries\");\n let lastResponse;\n for (let i = 0; i < attempts; i++) {\n try {\n lastResponse = await callAnthropic(identifier, AiPayload, AiConfig);\n return lastResponse;\n } catch (e: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${e.message}`,\n e.response?.data || e\n );\n\n if (e.response?.data?.error?.type === \"rate_limit_error\") {\n // TODO: upgrade model or fallback to bedrock\n }\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Anthropic API after ${attempts} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\n}\n\nasync function callAnthropic(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig\n): Promise<ParsedResponseMessage> {\n const anthropicMessages = jigAnthropicMessages(AiPayload.messages);\n\n let data;\n let response;\n if (AiConfig?.service === \"bedrock\") {\n // DOES NOT SUPPORT TOOLS YET\n const AWS_REGION = \"us-east-1\";\n const MODEL_ID = \"anthropic.claude-3-haiku-20240307-v1:0\";\n\n // set in environment\n // process.env.AWS_ACCESS_KEY_ID = AWS_ACCESS_KEY_ID;\n // process.env.AWS_SECRET_ACCESS_KEY = AWS_SECRET_ACCESS_KEY;\n\n const client = new BedrockRuntimeClient({ region: AWS_REGION });\n const payload = {\n anthropic_version: \"bedrock-2023-05-31\",\n max_tokens: 4096,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n };\n\n const response = await client.send(\n new InvokeModelCommand({\n contentType: \"application/json\",\n body: JSON.stringify(payload),\n modelId: MODEL_ID,\n })\n );\n\n const decodedResponseBody = new TextDecoder().decode(response.body);\n data = JSON.parse(decodedResponseBody);\n } else {\n // default to anthropic\n const response = await axios.post(\n \"https://api.anthropic.com/v1/messages\",\n {\n model: AiPayload.model,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n temperature: AiPayload.temperature,\n system: AiPayload.system,\n max_tokens: 4096,\n },\n {\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": process.env.ANTHROPIC_API_KEY as string,\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-beta\": \"tools-2024-04-04\",\n },\n timeout: 60000,\n }\n );\n\n data = response.data;\n }\n\n const answers = data.content;\n\n if (!answers[0]) {\n logger.error(identifier, \"Missing answer in Anthropic API:\", data);\n throw new Error(\"Missing answer in Anthropic API\");\n }\n\n let textResponse = \"\";\n let functionCalls: any[] = [];\n for (const answer of answers) {\n if (!answer.type) {\n logger.error(identifier, \"Missing answer type in Anthropic API:\", data);\n throw new Error(\"Missing answer type in Anthropic API\");\n }\n\n let text = \"\";\n if (answer.type === \"text\") {\n text = answer.text\n .replace(/<thinking>.*?<\\/thinking>/gs, \"\")\n .replace(/<answer>|<\\/answer>/gs, \"\")\n .trim();\n\n if (!text) {\n // remove the tags and return the text within\n text = answer.text.replace(\n /<thinking>|<\\/thinking>|<answer>|<\\/answer>/gs,\n \"\"\n );\n logger.log(\n identifier,\n \"No text in answer, returning text within tags:\",\n text\n );\n }\n\n if (textResponse) {\n textResponse += `\\n\\n${text}`;\n } else {\n textResponse = text;\n }\n } else if (answer.type === \"tool_use\") {\n const call = {\n name: answer.name,\n arguments: answer.input,\n };\n functionCalls.push(call);\n }\n }\n\n if (!textResponse && !functionCalls.length) {\n logger.error(\n identifier,\n \"Missing text & fns in Anthropic API response:\",\n data\n );\n throw new Error(\"Missing text & fns in Anthropic API response\");\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCalls[0],\n files: [],\n };\n}\n\nfunction jigAnthropicMessages(\n messages: AnthropicAIMessage[]\n): AnthropicAIMessage[] {\n // Takes a list if messages each with a role and content\n // Assumes no system messages are present\n\n let jiggedMessages = messages.slice();\n\n // If the first message is not user, add an empty user message at the start\n if (jiggedMessages[0]?.role !== \"user\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n content: \"...\",\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their content\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n // Combine content of messages with the same role\n const lastContent = Array.isArray(lastMessage.content)\n ? lastMessage.content\n : [{ type: \"text\" as const, text: lastMessage.content }];\n const newContent = Array.isArray(message.content)\n ? message.content\n : [{ type: \"text\" as const, text: message.content }];\n\n lastMessage.content = [\n ...lastContent,\n { type: \"text\", text: \"\\n\\n---\\n\\n\" },\n ...newContent,\n ];\n return acc;\n }\n\n // Convert string content to text content block\n if (typeof message.content === \"string\") {\n message.content = [{ type: \"text\", text: message.content }];\n }\n\n return [...acc, message];\n }, [] as AnthropicAIMessage[]);\n\n // If last message in array is assistant, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"assistant\") {\n jiggedMessages.push({\n role: \"user\",\n content: \"...\",\n });\n }\n\n return jiggedMessages;\n}\n\nfunction jigGoogleMessages(messages: GoogleAIMessage[]): GoogleAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // If the first message is model, add an empty user message at the start\n if (jiggedMessages[0]?.role === \"model\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n parts: [{ text: \"...\" }],\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their parts\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n lastMessage.parts = [...lastMessage.parts, ...message.parts];\n return acc;\n }\n\n return [...acc, message];\n }, [] as GoogleAIMessage[]);\n\n // If last message in array is model, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"model\") {\n jiggedMessages.push({\n role: \"user\",\n parts: [{ text: \"...\" }],\n });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareGoogleAIPayload(\n payload: GenericPayload\n): Promise<GoogleAIPayload> {\n const preparedPayload: GoogleAIPayload = {\n model: payload.model as GeminiModel,\n messages: [],\n tools: payload.functions\n ? {\n functionDeclarations: payload.functions.map((fn) => ({\n name: fn.name,\n parameters: {\n // Google puts their description in the parameters object rather than in a top-level field\n description: fn.description,\n ...fn.parameters,\n },\n })),\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.systemInstruction = message.content;\n continue;\n }\n\n const googleAIContentParts: GoogleAIPart[] = [];\n\n if (message.content) {\n googleAIContentParts.push({\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\n \"payload\",\n \"Google AI API does not support non-image file types. Skipping file.\"\n );\n continue;\n }\n\n if (file.url) {\n googleAIContentParts.push({\n inlineData: {\n mimeType: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n // Add the URL as a text part\n googleAIContentParts.push({\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n googleAIContentParts.push({\n inlineData: {\n mimeType: file.mimeType,\n data: file.data,\n },\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role === \"assistant\" ? \"model\" : message.role,\n parts: googleAIContentParts,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callGoogleAI(\n identifier: Identifier,\n payload: GoogleAIPayload\n): Promise<ParsedResponseMessage> {\n const googleMessages = jigGoogleMessages(payload.messages);\n\n const history = googleMessages.slice(0, -1);\n const lastMessage = googleMessages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({\n apiKey: process.env.GEMINI_API_KEY,\n });\n\n const chat = genAI.chats.create({\n model: payload.model,\n history,\n config: {\n responseModalities: [\"Text\"],\n tools: payload.tools ? [payload.tools] : undefined,\n systemInstruction: payload.systemInstruction,\n },\n });\n\n const response = await chat.sendMessage({\n message: lastMessage.parts,\n });\n\n let text: string = \"\";\n const files: File[] = [];\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.text) {\n text += part.text;\n }\n\n if (part.inlineData) {\n const imageData = part.inlineData.data;\n if (imageData) {\n files.push({\n mimeType: \"image/png\",\n data: imageData,\n });\n }\n }\n }\n\n const functionCalls:\n | {\n name?: string;\n args?: Record<string, any>;\n }[]\n | undefined = response.functionCalls;\n\n const parsedFunctionCalls = functionCalls?.map((fc) => ({\n name: fc.name ?? \"\",\n arguments: fc.args ?? {},\n }));\n\n if (!text && !parsedFunctionCalls?.length && !files.length) {\n logger.error(\n identifier,\n \"Missing text & fns in Google AI API response:\",\n response\n );\n throw new Error(\"Missing text & fns in Google AI API response\");\n }\n\n return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: parsedFunctionCalls?.[0] || null,\n };\n}\n\nasync function callGoogleAIWithRetries(\n identifier: Identifier,\n payload: GoogleAIPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Google AI API with retries\");\n\n let lastError: any;\n for (let i = 0; i < retries; i++) {\n try {\n return await callGoogleAI(identifier, payload);\n } catch (e: any) {\n lastError = e;\n logger.error(identifier, `Retry #${i} error: ${e.message}`, e);\n\n // Add any specific Google AI error handling or payload modifications here if needed\n // e.g., if (e.status === 429) { /* handle rate limit */ }\n\n await timeout(125 * i); // Exponential backoff\n }\n }\n const error = new Error(\n `Failed to call Google AI API after ${retries} attempts`\n ) as any;\n error.cause = lastError; // Attach the last caught error\n throw error;\n}\n\nexport async function callWithRetries(\n identifier: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n const id = identifier;\n // Determine which service to use based on the model type\n if (isAnthropicPayload(aiPayload)) {\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(aiPayload),\n aiConfig as AnthropicAIConfig,\n retries\n );\n } else if (isOpenAiPayload(aiPayload)) {\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs\n );\n } else if (isGroqPayload(aiPayload)) {\n return await callGroqWithRetries(id, await prepareGroqPayload(aiPayload));\n } else if (isGoogleAIPayload(aiPayload)) {\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(aiPayload),\n retries\n );\n } else {\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n }\n}\n\nfunction isAnthropicPayload(payload: any): Boolean {\n return Object.values(ClaudeModel).includes(payload.model);\n}\n\nasync function prepareAnthropicPayload(\n payload: GenericPayload\n): Promise<AnthropicAIPayload> {\n const preparedPayload: AnthropicAIPayload = {\n model: payload.model as ClaudeModel,\n messages: [],\n functions: payload.functions,\n temperature: payload.temperature,\n };\n\n for (const message of payload.messages) {\n const anthropicContentBlocks: AnthropicContentBlock[] = [];\n\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n if (message.content) {\n anthropicContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\n \"payload\",\n \"Anthropic API does not support non-image file types. Skipping file.\"\n );\n continue;\n }\n\n if (file.url) {\n anthropicContentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n anthropicContentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: file.mimeType as any,\n data: file.data,\n },\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: anthropicContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isOpenAiPayload(payload: any): Boolean {\n return Object.values(GPTModel).includes(payload.model);\n}\n\nasync function prepareOpenAIPayload(\n payload: GenericPayload\n): Promise<OpenAIPayload> {\n const preparedPayload: OpenAIPayload = {\n model: payload.model as GPTModel,\n messages: [],\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const openAIContentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n openAIContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n const allowedFileMimeTypes = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ];\n\n for (const file of message.files || []) {\n if (allowedFileMimeTypes.includes(file.mimeType)) {\n if (file.url) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: file.url,\n },\n });\n // Add the URL as a text part\n openAIContentBlocks.push({\n type: \"text\",\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: `data:${file.mimeType};base64,${file.data}`,\n },\n });\n }\n // } else if (file.mimeType?.startsWith(\"audio\")) {\n // if (file.url) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: file.url,\n // },\n // });\n // } else if (file.data) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: `data:${file.mimeType};base64,${file.data}`,\n // },\n // });\n // }\n } else {\n logger.warn(\n \"payload\",\n \"Skipping file in message. File or image type not supported by OpenAI API:\",\n file.mimeType\n );\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: openAIContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isGroqPayload(payload: any): Boolean {\n return Object.values(GroqModel).includes(payload.model);\n}\n\nfunction prepareGroqPayload(payload: GenericPayload): GroqPayload {\n return {\n model: payload.model as GroqModel,\n messages: payload.messages.map((message) => ({\n role: message.role,\n content: normalizeMessageContent(message.content),\n })),\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n temperature: payload.temperature,\n };\n}\n\nfunction normalizeMessageContent(\n content: AnthropicAIMessage[\"content\"]\n): string {\n return Array.isArray(content)\n ? content\n .map((c) => (c.type === \"text\" ? c.text : `[${c.type}]`))\n .join(\"\\n\")\n : content;\n}\n\nfunction isGoogleAIPayload(payload: any): Boolean {\n return Object.values(GeminiModel).includes(payload.model);\n}\n\nasync function callGroq(\n identifier: Identifier,\n payload: GroqPayload\n): Promise<ParsedResponseMessage> {\n const response = await axios.post(\n \"https://api.groq.com/openai/v1/chat/completions\",\n payload,\n {\n headers: {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${process.env.GROQ_API_KEY}`,\n },\n }\n );\n\n const data = response.data;\n\n const answer = data.choices[0].message;\n if (!answer) {\n logger.error(identifier, \"Missing answer in Groq API:\", data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const textResponse = answer.content || null;\n let functionCall: FunctionCall | null = null;\n if (answer.tool_calls && answer.tool_calls.length) {\n const toolCall = answer.tool_calls[0];\n functionCall = {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments),\n };\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCall,\n files: [],\n };\n}\n\nasync function callGroqWithRetries(\n identifier: Identifier,\n payload: GroqPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Groq API with retries\");\n\n let lastResponse;\n for (let i = 0; i < retries; i++) {\n try {\n lastResponse = await callGroq(identifier, payload);\n return lastResponse;\n } catch (e: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${e.message}`,\n e.response?.data || e\n );\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Groq API after ${retries} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\n}\n\nasync function getNormalizedBase64PNG(\n url: string,\n mime: string\n): Promise<string> {\n const response = await axios.get(url, { responseType: \"arraybuffer\" });\n\n let imageBuffer = Buffer.from(response.data);\n let sharpOptions = {};\n if (isHeicImage(url, mime)) {\n const imageData = await decode({ buffer: imageBuffer });\n imageBuffer = Buffer.from(imageData.data);\n sharpOptions = {\n raw: {\n width: imageData.width,\n height: imageData.height,\n channels: 4,\n },\n };\n }\n\n // Limits size of image to < 5MB Anthropic limit\n const resizedBuffer = await sharp(imageBuffer, sharpOptions)\n .withMetadata()\n .resize(1024, 1024, { fit: \"inside\", withoutEnlargement: true })\n .png()\n .toBuffer();\n\n return resizedBuffer.toString(\"base64\");\n}\n\n// async function main() {\n// const payload: GenericPayload = {\n// model: GeminiModel.GEMINI_15_PRO,\n// messages: [\n// {\n// role: \"user\",\n// content: \"What is this logo?\",\n// files: [\n// {\n// mimeType: \"image/png\",\n// url: \"https://www.wikimedia.org/static/images/wmf-logo-2x.png\",\n// },\n// ],\n// },\n// ],\n// functions: [\n// {\n// name: \"answer_logo_question\",\n// description: \"Answer a question about a logo\",\n// parameters: {\n// type: \"object\",\n// properties: {\n// organization: {\n// type: \"string\",\n// },\n// },\n// },\n// },\n// ],\n// };\n\n// const answer = await callWithRetries(\"test\", payload);\n\n// console.log(answer);\n// }\n\n// main();\n","export enum ClaudeModel {\n HAIKU_3 = \"claude-3-haiku-20240307\",\n SONNET_3 = \"claude-3-sonnet-20240229\",\n OPUS_3 = \"claude-3-opus-20240229\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\n SONNET_4_5 = \"claude-sonnet-4-5\",\n OPUS_4_5 = \"claude-opus-4-5\",\n}\n\nexport enum GPTModel {\n GPT35_0613 = \"gpt-3.5-turbo-0613\",\n GPT35_0613_16K = \"gpt-3.5-turbo-16k-0613\",\n GPT35_0125 = \"gpt-3.5-turbo-0125\",\n GPT4_1106_PREVIEW = \"gpt-4-1106-preview\",\n GPT4_0125_PREVIEW = \"gpt-4-0125-preview\",\n GPT4_0409 = \"gpt-4-turbo-2024-04-09\",\n GPT4O = \"gpt-4o\",\n GPT4O_MINI = \"gpt-4o-mini\",\n O1_PREVIEW = \"o1-preview\",\n O1_MINI = \"o1-mini\",\n O3_MINI = \"o3-mini\",\n GPT4_1 = \"gpt-4.1\",\n GPT4_1_MINI = \"gpt-4.1-mini\",\n GPT4_1_NANO = \"gpt-4.1-nano\",\n GPT5 = \"gpt-5\",\n GPT5_MINI = \"gpt-5-mini\",\n}\n\nexport enum GroqModel {\n LLAMA_3_70B_8192 = \"llama3-70b-8192\",\n DEEPSEEK_R1_DISTILL_LLAMA_70B = \"deepseek-r1-distill-llama-70b\",\n}\n\nexport enum GeminiModel {\n GEMINI_1_5_PRO = \"gemini-1.5-pro-latest\",\n GEMINI_EXP_1206 = \"gemini-exp-1206\",\n GEMINI_2_0_FLASH = \"gemini-2.0-flash\",\n GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION = \"gemini-2.0-flash-exp-image-generation\",\n GEMINI_2_0_FLASH_THINKING_EXP = \"gemini-2.0-flash-thinking-exp\",\n GEMINI_2_0_FLASH_THINKING_EXP_01_21 = \"gemini-2.0-flash-thinking-exp-01-21\",\n GEMINI_2_5_FLASH_PREVIEW_04_17 = \"gemini-2.5-flash-preview-04-17\",\n GEMINI_3_FLASH_PREVIEW = \"gemini-3-flash-preview\",\n}\n\nexport interface GenericError {\n message: string;\n}\n\nexport enum ContentType {\n TEXT = \"text\",\n ATTACHMENT = \"attachment\",\n}\n\nexport type AIChainResponse = {\n content: string | null;\n contentType?: ContentType;\n functionCalls: FunctionCall[];\n};\n\nexport interface GenericMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp?: string;\n files?: File[];\n functionCalls?: FunctionCall[];\n}\n\nexport interface File {\n mimeType: string;\n url?: string;\n data?: string;\n}\n\nexport interface OpenAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | OpenAIContentBlock[];\n}\n\nexport type OpenAIContentBlock =\n | OpenAITextContentBlock\n | OpenAIImageContentBlock\n | OpenAIAudioContentBlock;\n\nexport interface OpenAITextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface OpenAIImageContentBlock {\n type: \"image_url\";\n image_url: {\n url: string; // URL to the image, can also be a base64 string\n };\n}\n\nexport interface OpenAIAudioContentBlock {\n type: \"audio_url\";\n audio_url: {\n url: string; // URL to the audio, can also be a base64 string\n };\n}\n\nexport interface AnthropicAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | AnthropicContentBlock[];\n}\n\nexport type AnthropicContentBlock =\n | AnthropicTextContentBlock\n | AnthropicImageContentBlock;\n\nexport interface AnthropicTextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface AnthropicImageContentBlock {\n type: \"image\";\n source: {\n type: \"base64\";\n media_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n data: string; // Must be a base64 string\n };\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface ParsedResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: FunctionCall | null;\n files: File[];\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIConfig {\n service: \"azure\" | \"openai\";\n apiKey: string;\n baseUrl: string;\n orgId?: string;\n modelConfigMap?: Record<\n GPTModel,\n {\n resource: string;\n deployment: string;\n apiVersion: string;\n apiKey: string;\n endpoint?: string;\n }\n >;\n}\n\nexport interface AnthropicAIConfig {\n service: \"anthropic\" | \"bedrock\";\n}\n\nexport interface FunctionDefinition {\n name: string;\n description?: string;\n parameters: Record<string, any>;\n}\n\ninterface FunctionWrapped {\n type: \"function\";\n function: FunctionDefinition;\n}\n\nexport interface GroqPayload {\n model: GroqModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n temperature?: number;\n\n functions?: any[]; // Deprecate this\n}\n\nexport interface OpenAIPayload {\n model: GPTModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n}\n\nexport interface AnthropicAIPayload {\n model: ClaudeModel;\n messages: AnthropicAIMessage[];\n functions?: any[]; // TODO type this JSON schema\n temperature?: number;\n system?: string;\n}\n\nexport interface GoogleAITextPart {\n text: string;\n}\n\nexport interface GoogleAIInlineDataPart {\n inlineData: {\n mimeType: string;\n data: string;\n };\n}\n\nexport type GoogleAIPart = GoogleAITextPart | GoogleAIInlineDataPart;\nexport interface GoogleAIMessage {\n role: \"user\" | \"model\";\n parts: GoogleAIPart[];\n}\nexport interface GoogleAIPayload {\n model: GeminiModel;\n messages: GoogleAIMessage[];\n tools?: {\n functionDeclarations: FunctionDefinition[];\n };\n systemInstruction?: string;\n}\n\nexport interface GenericPayload {\n model: GPTModel | ClaudeModel | GroqModel | GeminiModel;\n messages: GenericMessage[];\n functions?: FunctionDefinition[];\n function_call?: \"none\" | \"auto\" | { name: string };\n temperature?: number;\n}\n\nexport interface OpenAIBody {\n choices: {\n message: OpenAIResponseMessage;\n }[];\n error?: {\n code: string;\n };\n usage: {\n completion_tokens: number;\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n","type LogLevel = \"LOG\" | \"WARN\" | \"ERROR\";\nexport type Identifier = string | string[];\n\nfunction formatIdentifier(identifier: Identifier): string {\n if (Array.isArray(identifier)) {\n return identifier.map((id) => `[${id}]`).join(\" \");\n }\n return `[${identifier}]`;\n}\n\nfunction formatMessage(\n level: LogLevel,\n identifier: Identifier,\n message: string\n): string {\n return `[${level}] ${formatIdentifier(identifier)} ${message}`;\n}\n\nexport function log(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.log(formatMessage(\"LOG\", identifier, message), ...args);\n}\n\nexport function warn(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.warn(formatMessage(\"WARN\", identifier, message), ...args);\n}\n\nexport function error(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.error(formatMessage(\"ERROR\", identifier, message), ...args);\n}\n\nexport default {\n log,\n warn,\n error,\n};\n","export function timeout(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function isHeicImage(name: string, mime?: string): boolean {\n const extension = name.split(\".\").pop()?.toLowerCase() || \"\";\n return (\n [\"heic\", \"heif\", \"heics\"].includes(extension) ||\n !!(\n mime && [\"image/heic\", \"image/heif\", \"image/heic-sequence\"].includes(mime)\n )\n );\n}\n"],"mappings":"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","names":["ClaudeModel","GPTModel","GroqModel","GeminiModel","error","abortTimeout","response","axios","_a","_b"]}
|
package/dist/index.mjs
CHANGED
|
@@ -115,7 +115,11 @@ function parseStreamedResponse(identifier, paragraph, functionCallName, function
|
|
|
115
115
|
arguments: JSON.parse(functionCallArgs)
|
|
116
116
|
};
|
|
117
117
|
} catch (error2) {
|
|
118
|
-
logger_default.error(
|
|
118
|
+
logger_default.error(
|
|
119
|
+
identifier,
|
|
120
|
+
"Error parsing functionCallArgs:",
|
|
121
|
+
functionCallArgs
|
|
122
|
+
);
|
|
119
123
|
throw error2;
|
|
120
124
|
}
|
|
121
125
|
}
|
|
@@ -166,7 +170,10 @@ async function callOpenAiWithRetries(identifier, openAiPayload, openAiConfig, re
|
|
|
166
170
|
);
|
|
167
171
|
const errorCode = (_b = error2.data) == null ? void 0 : _b.code;
|
|
168
172
|
if (errorCode === "content_policy_violation") {
|
|
169
|
-
logger_default.log(
|
|
173
|
+
logger_default.log(
|
|
174
|
+
identifier,
|
|
175
|
+
"Removing images due to content policy violation error"
|
|
176
|
+
);
|
|
170
177
|
openAiPayload.messages.forEach((message) => {
|
|
171
178
|
if (Array.isArray(message.content)) {
|
|
172
179
|
message.content = message.content.filter(
|
|
@@ -176,18 +183,27 @@ async function callOpenAiWithRetries(identifier, openAiPayload, openAiConfig, re
|
|
|
176
183
|
});
|
|
177
184
|
}
|
|
178
185
|
if (i >= 2 && (openAiConfig == null ? void 0 : openAiConfig.service) === "azure" && errorCode === "content_filter") {
|
|
179
|
-
logger_default.log(
|
|
186
|
+
logger_default.log(
|
|
187
|
+
identifier,
|
|
188
|
+
"Switching to OpenAI service due to content filter error"
|
|
189
|
+
);
|
|
180
190
|
openAiConfig.service = "openai";
|
|
181
191
|
}
|
|
182
192
|
if (i === 3) {
|
|
183
193
|
if ((openAiConfig == null ? void 0 : openAiConfig.service) === "azure") {
|
|
184
|
-
logger_default.log(
|
|
194
|
+
logger_default.log(
|
|
195
|
+
identifier,
|
|
196
|
+
"Switching to OpenAI service due to Azure service error"
|
|
197
|
+
);
|
|
185
198
|
openAiConfig.service = "openai";
|
|
186
199
|
}
|
|
187
200
|
}
|
|
188
201
|
if (i === 4) {
|
|
189
202
|
if (openAiPayload.tools) {
|
|
190
|
-
logger_default.log(
|
|
203
|
+
logger_default.log(
|
|
204
|
+
identifier,
|
|
205
|
+
"Switching to no tool choice due to persistent error"
|
|
206
|
+
);
|
|
191
207
|
openAiPayload.tool_choice = "none";
|
|
192
208
|
}
|
|
193
209
|
}
|
|
@@ -238,7 +254,11 @@ async function callOpenAIStream(identifier, openAiPayload, openAiConfig, chunkTi
|
|
|
238
254
|
});
|
|
239
255
|
const parsedPayload = JSON.parse(stringifiedPayload);
|
|
240
256
|
} catch (error2) {
|
|
241
|
-
logger_default.error(
|
|
257
|
+
logger_default.error(
|
|
258
|
+
identifier,
|
|
259
|
+
"Stream error: Azure OpenAI JSON parsing error:",
|
|
260
|
+
error2
|
|
261
|
+
);
|
|
242
262
|
}
|
|
243
263
|
response = await fetch(endpoint, {
|
|
244
264
|
method: "POST",
|
|
@@ -294,7 +314,10 @@ async function callOpenAIStream(identifier, openAiPayload, openAiConfig, chunkTi
|
|
|
294
314
|
const { done, value } = await reader.read();
|
|
295
315
|
clearTimeout(abortTimeout2);
|
|
296
316
|
if (done) {
|
|
297
|
-
logger_default.error(
|
|
317
|
+
logger_default.error(
|
|
318
|
+
identifier,
|
|
319
|
+
`Stream ended prematurely after ${chunkIndex + 1} chunks`
|
|
320
|
+
);
|
|
298
321
|
throw new Error("Stream error: ended prematurely");
|
|
299
322
|
}
|
|
300
323
|
let chunk = new TextDecoder().decode(value);
|
|
@@ -576,7 +599,11 @@ async function callAnthropic(identifier, AiPayload, AiConfig) {
|
|
|
576
599
|
/<thinking>|<\/thinking>|<answer>|<\/answer>/gs,
|
|
577
600
|
""
|
|
578
601
|
);
|
|
579
|
-
logger_default.log(
|
|
602
|
+
logger_default.log(
|
|
603
|
+
identifier,
|
|
604
|
+
"No text in answer, returning text within tags:",
|
|
605
|
+
text
|
|
606
|
+
);
|
|
580
607
|
}
|
|
581
608
|
if (textResponse) {
|
|
582
609
|
textResponse += `
|
|
@@ -594,7 +621,11 @@ ${text}`;
|
|
|
594
621
|
}
|
|
595
622
|
}
|
|
596
623
|
if (!textResponse && !functionCalls.length) {
|
|
597
|
-
logger_default.error(
|
|
624
|
+
logger_default.error(
|
|
625
|
+
identifier,
|
|
626
|
+
"Missing text & fns in Anthropic API response:",
|
|
627
|
+
data
|
|
628
|
+
);
|
|
598
629
|
throw new Error("Missing text & fns in Anthropic API response");
|
|
599
630
|
}
|
|
600
631
|
return {
|
|
@@ -704,7 +735,10 @@ async function prepareGoogleAIPayload(payload) {
|
|
|
704
735
|
}
|
|
705
736
|
for (const file of message.files || []) {
|
|
706
737
|
if (!((_a = file.mimeType) == null ? void 0 : _a.startsWith("image"))) {
|
|
707
|
-
logger_default.warn(
|
|
738
|
+
logger_default.warn(
|
|
739
|
+
"payload",
|
|
740
|
+
"Google AI API does not support non-image file types. Skipping file."
|
|
741
|
+
);
|
|
708
742
|
continue;
|
|
709
743
|
}
|
|
710
744
|
if (file.url) {
|
|
@@ -742,7 +776,6 @@ async function prepareGoogleAIPayload(payload) {
|
|
|
742
776
|
}
|
|
743
777
|
async function callGoogleAI(identifier, payload) {
|
|
744
778
|
var _a, _b, _c;
|
|
745
|
-
logger_default.log(identifier, "Calling Google AI API");
|
|
746
779
|
const googleMessages = jigGoogleMessages(payload.messages);
|
|
747
780
|
const history = googleMessages.slice(0, -1);
|
|
748
781
|
const lastMessage = googleMessages.slice(-1)[0];
|
|
@@ -786,7 +819,11 @@ async function callGoogleAI(identifier, payload) {
|
|
|
786
819
|
};
|
|
787
820
|
});
|
|
788
821
|
if (!text && !(parsedFunctionCalls == null ? void 0 : parsedFunctionCalls.length) && !files.length) {
|
|
789
|
-
logger_default.error(
|
|
822
|
+
logger_default.error(
|
|
823
|
+
identifier,
|
|
824
|
+
"Missing text & fns in Google AI API response:",
|
|
825
|
+
response
|
|
826
|
+
);
|
|
790
827
|
throw new Error("Missing text & fns in Google AI API response");
|
|
791
828
|
}
|
|
792
829
|
return {
|
|
@@ -817,7 +854,6 @@ async function callGoogleAIWithRetries(identifier, payload, retries = 5) {
|
|
|
817
854
|
async function callWithRetries(identifier, aiPayload, aiConfig, retries = 5, chunkTimeoutMs = 15e3) {
|
|
818
855
|
const id = identifier;
|
|
819
856
|
if (isAnthropicPayload(aiPayload)) {
|
|
820
|
-
logger_default.log(id, "Delegating call to Anthropic API");
|
|
821
857
|
return await callAnthropicWithRetries(
|
|
822
858
|
id,
|
|
823
859
|
await prepareAnthropicPayload(aiPayload),
|
|
@@ -825,7 +861,6 @@ async function callWithRetries(identifier, aiPayload, aiConfig, retries = 5, chu
|
|
|
825
861
|
retries
|
|
826
862
|
);
|
|
827
863
|
} else if (isOpenAiPayload(aiPayload)) {
|
|
828
|
-
logger_default.log(id, "Delegating call to OpenAI API");
|
|
829
864
|
return await callOpenAiWithRetries(
|
|
830
865
|
id,
|
|
831
866
|
await prepareOpenAIPayload(aiPayload),
|
|
@@ -834,13 +869,8 @@ async function callWithRetries(identifier, aiPayload, aiConfig, retries = 5, chu
|
|
|
834
869
|
chunkTimeoutMs
|
|
835
870
|
);
|
|
836
871
|
} else if (isGroqPayload(aiPayload)) {
|
|
837
|
-
|
|
838
|
-
return await callGroqWithRetries(
|
|
839
|
-
id,
|
|
840
|
-
await prepareGroqPayload(aiPayload)
|
|
841
|
-
);
|
|
872
|
+
return await callGroqWithRetries(id, await prepareGroqPayload(aiPayload));
|
|
842
873
|
} else if (isGoogleAIPayload(aiPayload)) {
|
|
843
|
-
logger_default.log(id, "Delegating call to Google AI API");
|
|
844
874
|
return await callGoogleAIWithRetries(
|
|
845
875
|
id,
|
|
846
876
|
await prepareGoogleAIPayload(aiPayload),
|
|
@@ -875,7 +905,10 @@ async function prepareAnthropicPayload(payload) {
|
|
|
875
905
|
}
|
|
876
906
|
for (const file of message.files || []) {
|
|
877
907
|
if (!((_a = file.mimeType) == null ? void 0 : _a.startsWith("image"))) {
|
|
878
|
-
logger_default.warn(
|
|
908
|
+
logger_default.warn(
|
|
909
|
+
"payload",
|
|
910
|
+
"Anthropic API does not support non-image file types. Skipping file."
|
|
911
|
+
);
|
|
879
912
|
continue;
|
|
880
913
|
}
|
|
881
914
|
if (file.url) {
|
|
@@ -965,7 +998,11 @@ async function prepareOpenAIPayload(payload) {
|
|
|
965
998
|
});
|
|
966
999
|
}
|
|
967
1000
|
} else {
|
|
968
|
-
logger_default.warn(
|
|
1001
|
+
logger_default.warn(
|
|
1002
|
+
"payload",
|
|
1003
|
+
"Skipping file in message. File or image type not supported by OpenAI API:",
|
|
1004
|
+
file.mimeType
|
|
1005
|
+
);
|
|
969
1006
|
}
|
|
970
1007
|
}
|
|
971
1008
|
preparedPayload.messages.push({
|
|
@@ -1045,7 +1082,11 @@ async function callGroqWithRetries(identifier, payload, retries = 5) {
|
|
|
1045
1082
|
lastResponse = await callGroq(identifier, payload);
|
|
1046
1083
|
return lastResponse;
|
|
1047
1084
|
} catch (e) {
|
|
1048
|
-
logger_default.error(
|
|
1085
|
+
logger_default.error(
|
|
1086
|
+
identifier,
|
|
1087
|
+
`Retry #${i} error: ${e.message}`,
|
|
1088
|
+
((_a = e.response) == null ? void 0 : _a.data) || e
|
|
1089
|
+
);
|
|
1049
1090
|
await timeout(125 * i);
|
|
1050
1091
|
}
|
|
1051
1092
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../interfaces.ts","../logger.ts","../index.ts","../utils.ts"],"sourcesContent":["export enum ClaudeModel {\n HAIKU_3 = \"claude-3-haiku-20240307\",\n SONNET_3 = \"claude-3-sonnet-20240229\",\n OPUS_3 = \"claude-3-opus-20240229\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\n SONNET_4_5 = \"claude-sonnet-4-5\",\n OPUS_4_5 = \"claude-opus-4-5\",\n}\n\nexport enum GPTModel {\n GPT35_0613 = \"gpt-3.5-turbo-0613\",\n GPT35_0613_16K = \"gpt-3.5-turbo-16k-0613\",\n GPT35_0125 = \"gpt-3.5-turbo-0125\",\n GPT4_1106_PREVIEW = \"gpt-4-1106-preview\",\n GPT4_0125_PREVIEW = \"gpt-4-0125-preview\",\n GPT4_0409 = \"gpt-4-turbo-2024-04-09\",\n GPT4O = \"gpt-4o\",\n GPT4O_MINI = \"gpt-4o-mini\",\n O1_PREVIEW = \"o1-preview\",\n O1_MINI = \"o1-mini\",\n O3_MINI = \"o3-mini\",\n GPT4_1 = \"gpt-4.1\",\n GPT4_1_MINI = \"gpt-4.1-mini\",\n GPT4_1_NANO = \"gpt-4.1-nano\",\n GPT5 = \"gpt-5\",\n GPT5_MINI = \"gpt-5-mini\",\n}\n\nexport enum GroqModel {\n LLAMA_3_70B_8192 = \"llama3-70b-8192\",\n DEEPSEEK_R1_DISTILL_LLAMA_70B = \"deepseek-r1-distill-llama-70b\",\n}\n\nexport enum GeminiModel {\n GEMINI_1_5_PRO = \"gemini-1.5-pro-latest\",\n GEMINI_EXP_1206 = \"gemini-exp-1206\",\n GEMINI_2_0_FLASH = \"gemini-2.0-flash\",\n GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION = \"gemini-2.0-flash-exp-image-generation\",\n GEMINI_2_0_FLASH_THINKING_EXP = \"gemini-2.0-flash-thinking-exp\",\n GEMINI_2_0_FLASH_THINKING_EXP_01_21 = \"gemini-2.0-flash-thinking-exp-01-21\",\n GEMINI_2_5_FLASH_PREVIEW_04_17 = \"gemini-2.5-flash-preview-04-17\",\n GEMINI_3_FLASH_PREVIEW = \"gemini-3-flash-preview\",\n}\n\nexport interface GenericError {\n message: string;\n}\n\nexport enum ContentType {\n TEXT = \"text\",\n ATTACHMENT = \"attachment\",\n}\n\nexport type AIChainResponse = {\n content: string | null;\n contentType?: ContentType;\n functionCalls: FunctionCall[];\n};\n\nexport interface GenericMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp?: string;\n files?: File[];\n functionCalls?: FunctionCall[];\n}\n\nexport interface File {\n mimeType: string;\n url?: string;\n data?: string;\n}\n\nexport interface OpenAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | OpenAIContentBlock[];\n}\n\nexport type OpenAIContentBlock =\n | OpenAITextContentBlock\n | OpenAIImageContentBlock\n | OpenAIAudioContentBlock;\n\nexport interface OpenAITextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface OpenAIImageContentBlock {\n type: \"image_url\";\n image_url: {\n url: string; // URL to the image, can also be a base64 string\n };\n}\n\nexport interface OpenAIAudioContentBlock {\n type: \"audio_url\";\n audio_url: {\n url: string; // URL to the audio, can also be a base64 string\n };\n}\n\nexport interface AnthropicAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | AnthropicContentBlock[];\n}\n\nexport type AnthropicContentBlock =\n | AnthropicTextContentBlock\n | AnthropicImageContentBlock;\n\nexport interface AnthropicTextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface AnthropicImageContentBlock {\n type: \"image\";\n source: {\n type: \"base64\";\n media_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n data: string; // Must be a base64 string\n };\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface ParsedResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: FunctionCall | null;\n files: File[];\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIConfig {\n service: \"azure\" | \"openai\";\n apiKey: string;\n baseUrl: string;\n orgId?: string;\n modelConfigMap?: Record<\n GPTModel,\n {\n resource: string;\n deployment: string;\n apiVersion: string;\n apiKey: string;\n endpoint?: string;\n }\n >;\n}\n\nexport interface AnthropicAIConfig {\n service: \"anthropic\" | \"bedrock\";\n}\n\nexport interface FunctionDefinition {\n name: string;\n description?: string;\n parameters: Record<string, any>;\n}\n\ninterface FunctionWrapped {\n type: \"function\";\n function: FunctionDefinition;\n}\n\nexport interface GroqPayload {\n model: GroqModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n temperature?: number;\n\n functions?: any[]; // Deprecate this\n}\n\nexport interface OpenAIPayload {\n model: GPTModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n}\n\nexport interface AnthropicAIPayload {\n model: ClaudeModel;\n messages: AnthropicAIMessage[];\n functions?: any[]; // TODO type this JSON schema\n temperature?: number;\n system?: string;\n}\n\nexport interface GoogleAITextPart {\n text: string;\n}\n\nexport interface GoogleAIInlineDataPart {\n inlineData: {\n mimeType: string;\n data: string;\n };\n}\n\nexport type GoogleAIPart = GoogleAITextPart | GoogleAIInlineDataPart;\nexport interface GoogleAIMessage {\n role: \"user\" | \"model\";\n parts: GoogleAIPart[];\n}\nexport interface GoogleAIPayload {\n model: GeminiModel;\n messages: GoogleAIMessage[];\n tools?: {\n functionDeclarations: FunctionDefinition[];\n };\n systemInstruction?: string;\n}\n\nexport interface GenericPayload {\n model: GPTModel | ClaudeModel | GroqModel | GeminiModel;\n messages: GenericMessage[];\n functions?: FunctionDefinition[];\n function_call?: \"none\" | \"auto\" | { name: string };\n temperature?: number;\n}\n\nexport interface OpenAIBody {\n choices: {\n message: OpenAIResponseMessage;\n }[];\n error?: {\n code: string;\n };\n usage: {\n completion_tokens: number;\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n","type LogLevel = \"LOG\" | \"WARN\" | \"ERROR\";\nexport type Identifier = string | string[];\n\nfunction formatIdentifier(identifier: Identifier): string {\n if (Array.isArray(identifier)) {\n return identifier.map((id) => `[${id}]`).join(\" \");\n }\n return `[${identifier}]`;\n}\n\nfunction formatMessage(\n level: LogLevel,\n identifier: Identifier,\n message: string\n): string {\n return `[${level}] ${formatIdentifier(identifier)} ${message}`;\n}\n\nexport function log(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.log(formatMessage(\"LOG\", identifier, message), ...args);\n}\n\nexport function warn(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.warn(formatMessage(\"WARN\", identifier, message), ...args);\n}\n\nexport function error(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.error(formatMessage(\"ERROR\", identifier, message), ...args);\n}\n\nexport default {\n log,\n warn,\n error,\n};\n","import {\n ClaudeModel,\n GPTModel,\n OpenAIPayload,\n OpenAIMessage,\n OpenAIConfig,\n AnthropicAIPayload,\n AnthropicAIMessage,\n GenericMessage,\n AnthropicAIConfig,\n GenericPayload,\n GroqPayload,\n GroqModel,\n ParsedResponseMessage,\n FunctionCall,\n AnthropicContentBlock,\n OpenAIContentBlock,\n GoogleAIPayload,\n GeminiModel,\n GoogleAIPart,\n File,\n GoogleAIMessage,\n} from \"./interfaces\";\nimport logger, { Identifier } from \"./logger\";\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from \"@aws-sdk/client-bedrock-runtime\";\nimport axios from \"axios\";\nimport { isHeicImage, timeout } from \"./utils\";\nimport { GoogleGenAI } from \"@google/genai\";\nconst { GoogleGenerativeAI } = require(\"@google/generative-ai\");\n\nconst sharp = require(\"sharp\");\nconst decode = require(\"heic-decode\");\n\nexport {\n ClaudeModel,\n GPTModel,\n GroqModel,\n GeminiModel,\n OpenAIConfig,\n FunctionDefinition,\n GenericMessage,\n GenericPayload,\n} from \"./interfaces\";\n\nfunction parseStreamedResponse(\n identifier: Identifier,\n paragraph: string,\n functionCallName: string,\n functionCallArgs: string,\n allowedFunctionNames: Set<string> | null\n): ParsedResponseMessage {\n let functionCall: ParsedResponseMessage[\"function_call\"] = null;\n if (functionCallName && functionCallArgs) {\n if (allowedFunctionNames && !allowedFunctionNames.has(functionCallName)) {\n throw new Error(\n \"Stream error: received function call with unknown name: \" +\n functionCallName\n );\n }\n\n try {\n functionCall = {\n name: functionCallName,\n arguments: JSON.parse(functionCallArgs),\n };\n } catch (error) {\n logger.error(identifier, \"Error parsing functionCallArgs:\", functionCallArgs);\n throw error;\n }\n }\n\n if (!paragraph && !functionCall) {\n logger.error(\n identifier,\n \"Stream error: received message without content or function_call, raw:\",\n JSON.stringify({ paragraph, functionCallName, functionCallArgs })\n );\n throw new Error(\n \"Stream error: received message without content or function_call\"\n );\n }\n\n return {\n role: \"assistant\",\n content: paragraph || null,\n function_call: functionCall,\n files: [],\n };\n}\n\nasync function callOpenAiWithRetries(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n logger.log(\n identifier,\n \"Calling OpenAI API with retries:\",\n openAiConfig?.service,\n openAiPayload.model\n );\n\n let errorObj: any;\n for (let i = 0; i <= retries; i++) {\n try {\n const timerId = `timer:${identifier}:${Date.now()}:callOpenAi:${\n openAiConfig?.service\n }-${openAiPayload.model}-${openAiConfig?.orgId}`;\n\n if (\n openAiPayload.model === GPTModel.O1_MINI ||\n openAiPayload.model === GPTModel.O1_PREVIEW\n ) {\n return await callOpenAI(identifier, openAiPayload, openAiConfig);\n } else {\n return await callOpenAIStream(\n identifier,\n openAiPayload,\n openAiConfig,\n chunkTimeoutMs\n );\n }\n } catch (error: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${error.message}`,\n error.response?.data || error.data || error\n );\n\n const errorCode = error.data?.code;\n\n // Usually due to image content, we get a policy violation error\n if (errorCode === \"content_policy_violation\") {\n logger.log(identifier, \"Removing images due to content policy violation error\");\n openAiPayload.messages.forEach((message: OpenAIMessage) => {\n if (Array.isArray(message.content)) {\n message.content = message.content.filter(\n (content) => content.type === \"text\"\n );\n }\n });\n }\n\n // on 2nd or more retries\n // if Azure content policy error is persistent\n if (\n i >= 2 &&\n openAiConfig?.service === \"azure\" &&\n errorCode === \"content_filter\"\n ) {\n logger.log(identifier, \"Switching to OpenAI service due to content filter error\");\n openAiConfig.service = \"openai\"; // Move to OpenAI, failed due to Azure content policy\n }\n\n // on 3rd retry\n if (i === 3) {\n if (openAiConfig?.service === \"azure\") {\n logger.log(identifier, \"Switching to OpenAI service due to Azure service error\");\n openAiConfig.service = \"openai\";\n }\n }\n\n // on 4th retry\n if (i === 4) {\n // abort function calling, e.g. stubborn `python` function call case\n if (openAiPayload.tools) {\n logger.log(identifier, \"Switching to no tool choice due to persistent error\");\n openAiPayload.tool_choice = \"none\";\n }\n }\n\n await timeout(250);\n }\n }\n\n logger.error(\n identifier,\n `Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`,\n errorObj\n );\n throw new Error(\n `${identifier}: Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`\n );\n}\n\nasync function callOpenAIStream(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n chunkTimeoutMs: number\n): Promise<ParsedResponseMessage> {\n const functionNames: Set<string> | null = openAiPayload.tools\n ? new Set(openAiPayload.tools.map((fn) => fn.function.name as string))\n : null;\n\n if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n const controller = new AbortController();\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: true,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n } catch (error) {\n logger.error(identifier, \"Stream error: Azure OpenAI JSON parsing error:\", error);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n }\n\n if (response.body) {\n let rawStreamedBody = \"\";\n let paragraph = \"\";\n let functionCallName = \"\";\n let functionCallArgs = \"\";\n\n const reader = response.body.getReader();\n\n let partialChunk = \"\";\n let abortTimeout: NodeJS.Timeout | null = null;\n const startAbortTimeout = () => {\n abortTimeout && clearTimeout(abortTimeout);\n return setTimeout(() => {\n logger.error(identifier, `Stream timeout after ${chunkTimeoutMs}ms`);\n controller.abort();\n }, chunkTimeoutMs);\n };\n\n let chunkIndex = -1;\n while (true) {\n chunkIndex++;\n const abortTimeout = startAbortTimeout();\n const { done, value } = await reader.read();\n clearTimeout(abortTimeout);\n\n if (done) {\n logger.error(identifier, `Stream ended prematurely after ${chunkIndex + 1} chunks`);\n throw new Error(\"Stream error: ended prematurely\");\n }\n\n let chunk = new TextDecoder().decode(value);\n rawStreamedBody += chunk + \"\\n\";\n if (partialChunk) {\n chunk = partialChunk + chunk;\n partialChunk = \"\";\n }\n let jsonStrings = chunk.split(/^data: /gm);\n\n for (let jsonString of jsonStrings) {\n if (!jsonString) {\n continue;\n }\n\n if (jsonString.includes(\"[DONE]\")) {\n try {\n return parseStreamedResponse(\n identifier,\n paragraph,\n functionCallName,\n functionCallArgs,\n functionNames\n );\n } catch (error) {\n logger.error(identifier, \"Stream error: parsing response\");\n throw error;\n }\n }\n\n let json;\n try {\n json = JSON.parse(jsonString.trim());\n } catch (error: any) {\n partialChunk = jsonString; // We're assuming any JSON parsing error means we got a non-terminated JSON for a chunk\n continue;\n }\n\n if (!json.choices || !json.choices.length) {\n if (json.error) {\n logger.error(identifier, \"Stream error: OpenAI error:\", json.error);\n const error = new Error(\"Stream error: OpenAI error\") as any;\n error.data = json.error;\n error.requestBody = truncatePayload(openAiPayload);\n throw error;\n }\n if (chunkIndex !== 0) {\n logger.error(identifier, \"Stream error: no choices in JSON:\", json);\n }\n continue;\n }\n\n const dToolCall:\n | {\n index?: number;\n function?: {\n name?: string;\n arguments?: string;\n };\n }\n | undefined = json.choices?.[0]?.delta?.tool_calls?.[0];\n if (dToolCall) {\n const toolCallIndex = dToolCall.index || 0;\n // TODO: handle multiple function calls in response\n if (toolCallIndex === 0) {\n const dFn = dToolCall.function || {};\n if (dFn.name) functionCallName += dFn.name;\n if (dFn.arguments) functionCallArgs += dFn.arguments;\n }\n }\n\n const text = json.choices?.[0]?.delta?.content;\n if (text) {\n paragraph += text;\n }\n }\n }\n } else {\n throw new Error(\"Stream error: no response body\");\n }\n}\n\nasync function callOpenAI(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined\n): Promise<ParsedResponseMessage> {\n const functionNames: Set<string> | null = openAiPayload.tools\n ? new Set(openAiPayload.tools.map((fn) => fn.function.name as string))\n : null;\n\n if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: false,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n // You can use parsedPayload if needed\n } catch (error) {\n logger.error(identifier, \"OpenAI JSON parsing error:\", error);\n throw error;\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n }\n\n if (!response.ok) {\n const errorData = await response.json();\n logger.error(identifier, \"OpenAI API error:\", errorData);\n throw new Error(`OpenAI API Error: ${errorData.error.message}`);\n }\n\n const data = await response.json();\n\n if (!data.choices || !data.choices.length) {\n if (data.error) {\n logger.error(identifier, \"OpenAI error:\", data.error);\n throw new Error(\"OpenAI error: \" + data.error.message);\n }\n throw new Error(\"OpenAI error: No choices returned.\");\n }\n\n const choice = data.choices[0];\n const functionCall = choice.function_call\n ? {\n name: choice.function_call.name,\n arguments: JSON.parse(choice.function_call.arguments),\n }\n : null;\n\n return {\n role: \"assistant\",\n content: choice.message.content || null,\n function_call: functionCall,\n files: [],\n };\n}\n\nfunction truncatePayload(payload: OpenAIPayload): string {\n return JSON.stringify(\n {\n ...payload,\n messages: payload.messages.map((message) => {\n if (typeof message.content === \"string\") {\n message.content = message.content.slice(0, 100);\n } else if (Array.isArray(message.content)) {\n message.content = message.content.map((block) => {\n if (block.type === \"image_url\") {\n block.image_url.url = block.image_url.url.slice(0, 100);\n }\n return block;\n });\n }\n\n return message;\n }),\n },\n null,\n 2\n );\n}\n\nasync function callAnthropicWithRetries(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig,\n attempts = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Anthropic API with retries\");\n let lastResponse;\n for (let i = 0; i < attempts; i++) {\n try {\n lastResponse = await callAnthropic(identifier, AiPayload, AiConfig);\n return lastResponse;\n } catch (e: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${e.message}`,\n e.response?.data || e\n );\n\n if (e.response?.data?.error?.type === \"rate_limit_error\") {\n // TODO: upgrade model or fallback to bedrock\n }\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Anthropic API after ${attempts} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\n}\n\nasync function callAnthropic(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig\n): Promise<ParsedResponseMessage> {\n const anthropicMessages = jigAnthropicMessages(AiPayload.messages);\n\n let data;\n let response;\n if (AiConfig?.service === \"bedrock\") {\n // DOES NOT SUPPORT TOOLS YET\n const AWS_REGION = \"us-east-1\";\n const MODEL_ID = \"anthropic.claude-3-haiku-20240307-v1:0\";\n\n // set in environment\n // process.env.AWS_ACCESS_KEY_ID = AWS_ACCESS_KEY_ID;\n // process.env.AWS_SECRET_ACCESS_KEY = AWS_SECRET_ACCESS_KEY;\n\n const client = new BedrockRuntimeClient({ region: AWS_REGION });\n const payload = {\n anthropic_version: \"bedrock-2023-05-31\",\n max_tokens: 4096,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n };\n\n const response = await client.send(\n new InvokeModelCommand({\n contentType: \"application/json\",\n body: JSON.stringify(payload),\n modelId: MODEL_ID,\n })\n );\n\n const decodedResponseBody = new TextDecoder().decode(response.body);\n data = JSON.parse(decodedResponseBody);\n } else {\n // default to anthropic\n const response = await axios.post(\n \"https://api.anthropic.com/v1/messages\",\n {\n model: AiPayload.model,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n temperature: AiPayload.temperature,\n system: AiPayload.system,\n max_tokens: 4096,\n },\n {\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": process.env.ANTHROPIC_API_KEY as string,\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-beta\": \"tools-2024-04-04\",\n },\n timeout: 60000,\n }\n );\n\n data = response.data;\n }\n\n const answers = data.content;\n\n if (!answers[0]) {\n logger.error(identifier, \"Missing answer in Anthropic API:\", data);\n throw new Error(\"Missing answer in Anthropic API\");\n }\n\n let textResponse = \"\";\n let functionCalls: any[] = [];\n for (const answer of answers) {\n if (!answer.type) {\n logger.error(identifier, \"Missing answer type in Anthropic API:\", data);\n throw new Error(\"Missing answer type in Anthropic API\");\n }\n\n let text = \"\";\n if (answer.type === \"text\") {\n text = answer.text\n .replace(/<thinking>.*?<\\/thinking>/gs, \"\")\n .replace(/<answer>|<\\/answer>/gs, \"\")\n .trim();\n\n if (!text) {\n // remove the tags and return the text within\n text = answer.text.replace(\n /<thinking>|<\\/thinking>|<answer>|<\\/answer>/gs,\n \"\"\n );\n logger.log(identifier, \"No text in answer, returning text within tags:\", text);\n }\n\n if (textResponse) {\n textResponse += `\\n\\n${text}`;\n } else {\n textResponse = text;\n }\n } else if (answer.type === \"tool_use\") {\n const call = {\n name: answer.name,\n arguments: answer.input,\n };\n functionCalls.push(call);\n }\n }\n\n if (!textResponse && !functionCalls.length) {\n logger.error(identifier, \"Missing text & fns in Anthropic API response:\", data);\n throw new Error(\"Missing text & fns in Anthropic API response\");\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCalls[0],\n files: [],\n };\n}\n\nfunction jigAnthropicMessages(\n messages: AnthropicAIMessage[]\n): AnthropicAIMessage[] {\n // Takes a list if messages each with a role and content\n // Assumes no system messages are present\n\n let jiggedMessages = messages.slice();\n\n // If the first message is not user, add an empty user message at the start\n if (jiggedMessages[0]?.role !== \"user\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n content: \"...\",\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their content\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n // Combine content of messages with the same role\n const lastContent = Array.isArray(lastMessage.content)\n ? lastMessage.content\n : [{ type: \"text\" as const, text: lastMessage.content }];\n const newContent = Array.isArray(message.content)\n ? message.content\n : [{ type: \"text\" as const, text: message.content }];\n\n lastMessage.content = [\n ...lastContent,\n { type: \"text\", text: \"\\n\\n---\\n\\n\" },\n ...newContent,\n ];\n return acc;\n }\n\n // Convert string content to text content block\n if (typeof message.content === \"string\") {\n message.content = [{ type: \"text\", text: message.content }];\n }\n\n return [...acc, message];\n }, [] as AnthropicAIMessage[]);\n\n // If last message in array is assistant, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"assistant\") {\n jiggedMessages.push({\n role: \"user\",\n content: \"...\",\n });\n }\n\n return jiggedMessages;\n}\n\nfunction jigGoogleMessages(messages: GoogleAIMessage[]): GoogleAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // If the first message is model, add an empty user message at the start\n if (jiggedMessages[0]?.role === \"model\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n parts: [{ text: \"...\" }],\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their parts\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n lastMessage.parts = [...lastMessage.parts, ...message.parts];\n return acc;\n }\n\n return [...acc, message];\n }, [] as GoogleAIMessage[]);\n\n // If last message in array is model, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"model\") {\n jiggedMessages.push({\n role: \"user\",\n parts: [{ text: \"...\" }],\n });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareGoogleAIPayload(\n payload: GenericPayload\n): Promise<GoogleAIPayload> {\n const preparedPayload: GoogleAIPayload = {\n model: payload.model as GeminiModel,\n messages: [],\n tools: payload.functions\n ? {\n functionDeclarations: payload.functions.map((fn) => ({\n name: fn.name,\n parameters: {\n // Google puts their description in the parameters object rather than in a top-level field\n description: fn.description,\n ...fn.parameters,\n },\n })),\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.systemInstruction = message.content;\n continue;\n }\n\n const googleAIContentParts: GoogleAIPart[] = [];\n\n if (message.content) {\n googleAIContentParts.push({\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\"payload\", \"Google AI API does not support non-image file types. Skipping file.\");\n continue;\n }\n\n if (file.url) {\n googleAIContentParts.push({\n inlineData: {\n mimeType: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n // Add the URL as a text part\n googleAIContentParts.push({\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n googleAIContentParts.push({\n inlineData: {\n mimeType: file.mimeType,\n data: file.data,\n },\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role === \"assistant\" ? \"model\" : message.role,\n parts: googleAIContentParts,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callGoogleAI(\n identifier: Identifier,\n payload: GoogleAIPayload\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Google AI API\");\n const googleMessages = jigGoogleMessages(payload.messages);\n\n const history = googleMessages.slice(0, -1);\n const lastMessage = googleMessages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({\n apiKey: process.env.GEMINI_API_KEY,\n });\n\n const chat = genAI.chats.create({\n model: payload.model,\n history,\n config: {\n responseModalities: [\"Text\"],\n tools: payload.tools ? [payload.tools] : undefined,\n systemInstruction: payload.systemInstruction,\n },\n });\n\n const response = await chat.sendMessage({\n message: lastMessage.parts,\n });\n\n let text: string = \"\";\n const files: File[] = [];\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.text) {\n text += part.text;\n }\n\n if (part.inlineData) {\n const imageData = part.inlineData.data;\n if (imageData) {\n files.push({\n mimeType: \"image/png\",\n data: imageData,\n });\n }\n }\n }\n\n const functionCalls:\n | {\n name?: string;\n args?: Record<string, any>;\n }[]\n | undefined = response.functionCalls;\n\n const parsedFunctionCalls = functionCalls?.map((fc) => ({\n name: fc.name ?? \"\",\n arguments: fc.args ?? {},\n }));\n\n if (!text && !parsedFunctionCalls?.length && !files.length) {\n logger.error(identifier, \"Missing text & fns in Google AI API response:\", response);\n throw new Error(\"Missing text & fns in Google AI API response\");\n }\n\n return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: parsedFunctionCalls?.[0] || null,\n };\n}\n\nasync function callGoogleAIWithRetries(\n identifier: Identifier,\n payload: GoogleAIPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Google AI API with retries\");\n\n let lastError: any;\n for (let i = 0; i < retries; i++) {\n try {\n return await callGoogleAI(identifier, payload);\n } catch (e: any) {\n lastError = e;\n logger.error(identifier, `Retry #${i} error: ${e.message}`, e);\n\n // Add any specific Google AI error handling or payload modifications here if needed\n // e.g., if (e.status === 429) { /* handle rate limit */ }\n\n await timeout(125 * i); // Exponential backoff\n }\n }\n const error = new Error(\n `Failed to call Google AI API after ${retries} attempts`\n ) as any;\n error.cause = lastError; // Attach the last caught error\n throw error;\n}\n\nexport async function callWithRetries(\n identifier: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n const id = identifier;\n // Determine which service to use based on the model type\n if (isAnthropicPayload(aiPayload)) {\n logger.log(id, \"Delegating call to Anthropic API\");\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(aiPayload),\n aiConfig as AnthropicAIConfig,\n retries\n );\n } else if (isOpenAiPayload(aiPayload)) {\n logger.log(id, \"Delegating call to OpenAI API\");\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs\n );\n } else if (isGroqPayload(aiPayload)) {\n logger.log(id, \"Delegating call to Groq API\");\n return await callGroqWithRetries(\n id,\n await prepareGroqPayload(aiPayload)\n );\n } else if (isGoogleAIPayload(aiPayload)) {\n logger.log(id, \"Delegating call to Google AI API\");\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(aiPayload),\n retries\n );\n } else {\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n }\n}\n\nfunction isAnthropicPayload(payload: any): Boolean {\n return Object.values(ClaudeModel).includes(payload.model);\n}\n\nasync function prepareAnthropicPayload(\n payload: GenericPayload\n): Promise<AnthropicAIPayload> {\n const preparedPayload: AnthropicAIPayload = {\n model: payload.model as ClaudeModel,\n messages: [],\n functions: payload.functions,\n temperature: payload.temperature,\n };\n\n for (const message of payload.messages) {\n const anthropicContentBlocks: AnthropicContentBlock[] = [];\n\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n if (message.content) {\n anthropicContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\"payload\", \"Anthropic API does not support non-image file types. Skipping file.\");\n continue;\n }\n\n if (file.url) {\n anthropicContentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n anthropicContentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: file.mimeType as any,\n data: file.data,\n },\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: anthropicContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isOpenAiPayload(payload: any): Boolean {\n return Object.values(GPTModel).includes(payload.model);\n}\n\nasync function prepareOpenAIPayload(\n payload: GenericPayload\n): Promise<OpenAIPayload> {\n const preparedPayload: OpenAIPayload = {\n model: payload.model as GPTModel,\n messages: [],\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const openAIContentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n openAIContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n const allowedFileMimeTypes = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ];\n\n for (const file of message.files || []) {\n if (allowedFileMimeTypes.includes(file.mimeType)) {\n if (file.url) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: file.url,\n },\n });\n // Add the URL as a text part\n openAIContentBlocks.push({\n type: \"text\",\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: `data:${file.mimeType};base64,${file.data}`,\n },\n });\n }\n // } else if (file.mimeType?.startsWith(\"audio\")) {\n // if (file.url) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: file.url,\n // },\n // });\n // } else if (file.data) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: `data:${file.mimeType};base64,${file.data}`,\n // },\n // });\n // }\n } else {\n logger.warn(\"payload\", \"Skipping file in message. File or image type not supported by OpenAI API:\", file.mimeType);\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: openAIContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isGroqPayload(payload: any): Boolean {\n return Object.values(GroqModel).includes(payload.model);\n}\n\nfunction prepareGroqPayload(payload: GenericPayload): GroqPayload {\n return {\n model: payload.model as GroqModel,\n messages: payload.messages.map((message) => ({\n role: message.role,\n content: normalizeMessageContent(message.content),\n })),\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n temperature: payload.temperature,\n };\n}\n\nfunction normalizeMessageContent(\n content: AnthropicAIMessage[\"content\"]\n): string {\n return Array.isArray(content)\n ? content\n .map((c) => (c.type === \"text\" ? c.text : `[${c.type}]`))\n .join(\"\\n\")\n : content;\n}\n\nfunction isGoogleAIPayload(payload: any): Boolean {\n return Object.values(GeminiModel).includes(payload.model);\n}\n\nasync function callGroq(\n identifier: Identifier,\n payload: GroqPayload\n): Promise<ParsedResponseMessage> {\n const response = await axios.post(\n \"https://api.groq.com/openai/v1/chat/completions\",\n payload,\n {\n headers: {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${process.env.GROQ_API_KEY}`,\n },\n }\n );\n\n const data = response.data;\n\n const answer = data.choices[0].message;\n if (!answer) {\n logger.error(identifier, \"Missing answer in Groq API:\", data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const textResponse = answer.content || null;\n let functionCall: FunctionCall | null = null;\n if (answer.tool_calls && answer.tool_calls.length) {\n const toolCall = answer.tool_calls[0];\n functionCall = {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments),\n };\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCall,\n files: [],\n };\n}\n\nasync function callGroqWithRetries(\n identifier: Identifier,\n payload: GroqPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Groq API with retries\");\n\n let lastResponse;\n for (let i = 0; i < retries; i++) {\n try {\n lastResponse = await callGroq(identifier, payload);\n return lastResponse;\n } catch (e: any) {\n logger.error(identifier, `Retry #${i} error: ${e.message}`, e.response?.data || e);\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Groq API after ${retries} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\n}\n\nasync function getNormalizedBase64PNG(\n url: string,\n mime: string\n): Promise<string> {\n const response = await axios.get(url, { responseType: \"arraybuffer\" });\n\n let imageBuffer = Buffer.from(response.data);\n let sharpOptions = {};\n if (isHeicImage(url, mime)) {\n const imageData = await decode({ buffer: imageBuffer });\n imageBuffer = Buffer.from(imageData.data);\n sharpOptions = {\n raw: {\n width: imageData.width,\n height: imageData.height,\n channels: 4,\n },\n };\n }\n\n // Limits size of image to < 5MB Anthropic limit\n const resizedBuffer = await sharp(imageBuffer, sharpOptions)\n .withMetadata()\n .resize(1024, 1024, { fit: \"inside\", withoutEnlargement: true })\n .png()\n .toBuffer();\n\n return resizedBuffer.toString(\"base64\");\n}\n\n// async function main() {\n// const payload: GenericPayload = {\n// model: GeminiModel.GEMINI_15_PRO,\n// messages: [\n// {\n// role: \"user\",\n// content: \"What is this logo?\",\n// files: [\n// {\n// mimeType: \"image/png\",\n// url: \"https://www.wikimedia.org/static/images/wmf-logo-2x.png\",\n// },\n// ],\n// },\n// ],\n// functions: [\n// {\n// name: \"answer_logo_question\",\n// description: \"Answer a question about a logo\",\n// parameters: {\n// type: \"object\",\n// properties: {\n// organization: {\n// type: \"string\",\n// },\n// },\n// },\n// },\n// ],\n// };\n\n// const answer = await callWithRetries(\"test\", payload);\n\n// console.log(answer);\n// }\n\n// main();\n","export function timeout(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function isHeicImage(name: string, mime?: string): boolean {\n const extension = name.split(\".\").pop()?.toLowerCase() || \"\";\n return (\n [\"heic\", \"heif\", \"heics\"].includes(extension) ||\n !!(\n mime && [\"image/heic\", \"image/heif\", \"image/heic-sequence\"].includes(mime)\n )\n );\n}\n"],"mappings":"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","names":["ClaudeModel","GPTModel","GroqModel","GeminiModel","error","abortTimeout","response","_a","_b"]}
|
|
1
|
+
{"version":3,"sources":["../interfaces.ts","../logger.ts","../index.ts","../utils.ts"],"sourcesContent":["export enum ClaudeModel {\n HAIKU_3 = \"claude-3-haiku-20240307\",\n SONNET_3 = \"claude-3-sonnet-20240229\",\n OPUS_3 = \"claude-3-opus-20240229\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\n SONNET_4_5 = \"claude-sonnet-4-5\",\n OPUS_4_5 = \"claude-opus-4-5\",\n}\n\nexport enum GPTModel {\n GPT35_0613 = \"gpt-3.5-turbo-0613\",\n GPT35_0613_16K = \"gpt-3.5-turbo-16k-0613\",\n GPT35_0125 = \"gpt-3.5-turbo-0125\",\n GPT4_1106_PREVIEW = \"gpt-4-1106-preview\",\n GPT4_0125_PREVIEW = \"gpt-4-0125-preview\",\n GPT4_0409 = \"gpt-4-turbo-2024-04-09\",\n GPT4O = \"gpt-4o\",\n GPT4O_MINI = \"gpt-4o-mini\",\n O1_PREVIEW = \"o1-preview\",\n O1_MINI = \"o1-mini\",\n O3_MINI = \"o3-mini\",\n GPT4_1 = \"gpt-4.1\",\n GPT4_1_MINI = \"gpt-4.1-mini\",\n GPT4_1_NANO = \"gpt-4.1-nano\",\n GPT5 = \"gpt-5\",\n GPT5_MINI = \"gpt-5-mini\",\n}\n\nexport enum GroqModel {\n LLAMA_3_70B_8192 = \"llama3-70b-8192\",\n DEEPSEEK_R1_DISTILL_LLAMA_70B = \"deepseek-r1-distill-llama-70b\",\n}\n\nexport enum GeminiModel {\n GEMINI_1_5_PRO = \"gemini-1.5-pro-latest\",\n GEMINI_EXP_1206 = \"gemini-exp-1206\",\n GEMINI_2_0_FLASH = \"gemini-2.0-flash\",\n GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION = \"gemini-2.0-flash-exp-image-generation\",\n GEMINI_2_0_FLASH_THINKING_EXP = \"gemini-2.0-flash-thinking-exp\",\n GEMINI_2_0_FLASH_THINKING_EXP_01_21 = \"gemini-2.0-flash-thinking-exp-01-21\",\n GEMINI_2_5_FLASH_PREVIEW_04_17 = \"gemini-2.5-flash-preview-04-17\",\n GEMINI_3_FLASH_PREVIEW = \"gemini-3-flash-preview\",\n}\n\nexport interface GenericError {\n message: string;\n}\n\nexport enum ContentType {\n TEXT = \"text\",\n ATTACHMENT = \"attachment\",\n}\n\nexport type AIChainResponse = {\n content: string | null;\n contentType?: ContentType;\n functionCalls: FunctionCall[];\n};\n\nexport interface GenericMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp?: string;\n files?: File[];\n functionCalls?: FunctionCall[];\n}\n\nexport interface File {\n mimeType: string;\n url?: string;\n data?: string;\n}\n\nexport interface OpenAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | OpenAIContentBlock[];\n}\n\nexport type OpenAIContentBlock =\n | OpenAITextContentBlock\n | OpenAIImageContentBlock\n | OpenAIAudioContentBlock;\n\nexport interface OpenAITextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface OpenAIImageContentBlock {\n type: \"image_url\";\n image_url: {\n url: string; // URL to the image, can also be a base64 string\n };\n}\n\nexport interface OpenAIAudioContentBlock {\n type: \"audio_url\";\n audio_url: {\n url: string; // URL to the audio, can also be a base64 string\n };\n}\n\nexport interface AnthropicAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | AnthropicContentBlock[];\n}\n\nexport type AnthropicContentBlock =\n | AnthropicTextContentBlock\n | AnthropicImageContentBlock;\n\nexport interface AnthropicTextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface AnthropicImageContentBlock {\n type: \"image\";\n source: {\n type: \"base64\";\n media_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n data: string; // Must be a base64 string\n };\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface ParsedResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: FunctionCall | null;\n files: File[];\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIConfig {\n service: \"azure\" | \"openai\";\n apiKey: string;\n baseUrl: string;\n orgId?: string;\n modelConfigMap?: Record<\n GPTModel,\n {\n resource: string;\n deployment: string;\n apiVersion: string;\n apiKey: string;\n endpoint?: string;\n }\n >;\n}\n\nexport interface AnthropicAIConfig {\n service: \"anthropic\" | \"bedrock\";\n}\n\nexport interface FunctionDefinition {\n name: string;\n description?: string;\n parameters: Record<string, any>;\n}\n\ninterface FunctionWrapped {\n type: \"function\";\n function: FunctionDefinition;\n}\n\nexport interface GroqPayload {\n model: GroqModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n temperature?: number;\n\n functions?: any[]; // Deprecate this\n}\n\nexport interface OpenAIPayload {\n model: GPTModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n}\n\nexport interface AnthropicAIPayload {\n model: ClaudeModel;\n messages: AnthropicAIMessage[];\n functions?: any[]; // TODO type this JSON schema\n temperature?: number;\n system?: string;\n}\n\nexport interface GoogleAITextPart {\n text: string;\n}\n\nexport interface GoogleAIInlineDataPart {\n inlineData: {\n mimeType: string;\n data: string;\n };\n}\n\nexport type GoogleAIPart = GoogleAITextPart | GoogleAIInlineDataPart;\nexport interface GoogleAIMessage {\n role: \"user\" | \"model\";\n parts: GoogleAIPart[];\n}\nexport interface GoogleAIPayload {\n model: GeminiModel;\n messages: GoogleAIMessage[];\n tools?: {\n functionDeclarations: FunctionDefinition[];\n };\n systemInstruction?: string;\n}\n\nexport interface GenericPayload {\n model: GPTModel | ClaudeModel | GroqModel | GeminiModel;\n messages: GenericMessage[];\n functions?: FunctionDefinition[];\n function_call?: \"none\" | \"auto\" | { name: string };\n temperature?: number;\n}\n\nexport interface OpenAIBody {\n choices: {\n message: OpenAIResponseMessage;\n }[];\n error?: {\n code: string;\n };\n usage: {\n completion_tokens: number;\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n","type LogLevel = \"LOG\" | \"WARN\" | \"ERROR\";\nexport type Identifier = string | string[];\n\nfunction formatIdentifier(identifier: Identifier): string {\n if (Array.isArray(identifier)) {\n return identifier.map((id) => `[${id}]`).join(\" \");\n }\n return `[${identifier}]`;\n}\n\nfunction formatMessage(\n level: LogLevel,\n identifier: Identifier,\n message: string\n): string {\n return `[${level}] ${formatIdentifier(identifier)} ${message}`;\n}\n\nexport function log(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.log(formatMessage(\"LOG\", identifier, message), ...args);\n}\n\nexport function warn(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.warn(formatMessage(\"WARN\", identifier, message), ...args);\n}\n\nexport function error(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.error(formatMessage(\"ERROR\", identifier, message), ...args);\n}\n\nexport default {\n log,\n warn,\n error,\n};\n","import {\n ClaudeModel,\n GPTModel,\n OpenAIPayload,\n OpenAIMessage,\n OpenAIConfig,\n AnthropicAIPayload,\n AnthropicAIMessage,\n GenericMessage,\n AnthropicAIConfig,\n GenericPayload,\n GroqPayload,\n GroqModel,\n ParsedResponseMessage,\n FunctionCall,\n AnthropicContentBlock,\n OpenAIContentBlock,\n GoogleAIPayload,\n GeminiModel,\n GoogleAIPart,\n File,\n GoogleAIMessage,\n} from \"./interfaces\";\nimport logger, { Identifier } from \"./logger\";\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from \"@aws-sdk/client-bedrock-runtime\";\nimport axios from \"axios\";\nimport { isHeicImage, timeout } from \"./utils\";\nimport { GoogleGenAI } from \"@google/genai\";\nconst { GoogleGenerativeAI } = require(\"@google/generative-ai\");\n\nconst sharp = require(\"sharp\");\nconst decode = require(\"heic-decode\");\n\nexport {\n ClaudeModel,\n GPTModel,\n GroqModel,\n GeminiModel,\n OpenAIConfig,\n FunctionDefinition,\n GenericMessage,\n GenericPayload,\n} from \"./interfaces\";\n\nfunction parseStreamedResponse(\n identifier: Identifier,\n paragraph: string,\n functionCallName: string,\n functionCallArgs: string,\n allowedFunctionNames: Set<string> | null\n): ParsedResponseMessage {\n let functionCall: ParsedResponseMessage[\"function_call\"] = null;\n if (functionCallName && functionCallArgs) {\n if (allowedFunctionNames && !allowedFunctionNames.has(functionCallName)) {\n throw new Error(\n \"Stream error: received function call with unknown name: \" +\n functionCallName\n );\n }\n\n try {\n functionCall = {\n name: functionCallName,\n arguments: JSON.parse(functionCallArgs),\n };\n } catch (error) {\n logger.error(\n identifier,\n \"Error parsing functionCallArgs:\",\n functionCallArgs\n );\n throw error;\n }\n }\n\n if (!paragraph && !functionCall) {\n logger.error(\n identifier,\n \"Stream error: received message without content or function_call, raw:\",\n JSON.stringify({ paragraph, functionCallName, functionCallArgs })\n );\n throw new Error(\n \"Stream error: received message without content or function_call\"\n );\n }\n\n return {\n role: \"assistant\",\n content: paragraph || null,\n function_call: functionCall,\n files: [],\n };\n}\n\nasync function callOpenAiWithRetries(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n logger.log(\n identifier,\n \"Calling OpenAI API with retries:\",\n openAiConfig?.service,\n openAiPayload.model\n );\n\n let errorObj: any;\n for (let i = 0; i <= retries; i++) {\n try {\n const timerId = `timer:${identifier}:${Date.now()}:callOpenAi:${\n openAiConfig?.service\n }-${openAiPayload.model}-${openAiConfig?.orgId}`;\n\n if (\n openAiPayload.model === GPTModel.O1_MINI ||\n openAiPayload.model === GPTModel.O1_PREVIEW\n ) {\n return await callOpenAI(identifier, openAiPayload, openAiConfig);\n } else {\n return await callOpenAIStream(\n identifier,\n openAiPayload,\n openAiConfig,\n chunkTimeoutMs\n );\n }\n } catch (error: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${error.message}`,\n error.response?.data || error.data || error\n );\n\n const errorCode = error.data?.code;\n\n // Usually due to image content, we get a policy violation error\n if (errorCode === \"content_policy_violation\") {\n logger.log(\n identifier,\n \"Removing images due to content policy violation error\"\n );\n openAiPayload.messages.forEach((message: OpenAIMessage) => {\n if (Array.isArray(message.content)) {\n message.content = message.content.filter(\n (content) => content.type === \"text\"\n );\n }\n });\n }\n\n // on 2nd or more retries\n // if Azure content policy error is persistent\n if (\n i >= 2 &&\n openAiConfig?.service === \"azure\" &&\n errorCode === \"content_filter\"\n ) {\n logger.log(\n identifier,\n \"Switching to OpenAI service due to content filter error\"\n );\n openAiConfig.service = \"openai\"; // Move to OpenAI, failed due to Azure content policy\n }\n\n // on 3rd retry\n if (i === 3) {\n if (openAiConfig?.service === \"azure\") {\n logger.log(\n identifier,\n \"Switching to OpenAI service due to Azure service error\"\n );\n openAiConfig.service = \"openai\";\n }\n }\n\n // on 4th retry\n if (i === 4) {\n // abort function calling, e.g. stubborn `python` function call case\n if (openAiPayload.tools) {\n logger.log(\n identifier,\n \"Switching to no tool choice due to persistent error\"\n );\n openAiPayload.tool_choice = \"none\";\n }\n }\n\n await timeout(250);\n }\n }\n\n logger.error(\n identifier,\n `Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`,\n errorObj\n );\n throw new Error(\n `${identifier}: Failed to call OpenAI API after ${retries} attempts. Please lookup OpenAI status for active issues.`\n );\n}\n\nasync function callOpenAIStream(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n chunkTimeoutMs: number\n): Promise<ParsedResponseMessage> {\n const functionNames: Set<string> | null = openAiPayload.tools\n ? new Set(openAiPayload.tools.map((fn) => fn.function.name as string))\n : null;\n\n if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n const controller = new AbortController();\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: true,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n } catch (error) {\n logger.error(\n identifier,\n \"Stream error: Azure OpenAI JSON parsing error:\",\n error\n );\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: true,\n }),\n signal: controller.signal,\n });\n }\n\n if (response.body) {\n let rawStreamedBody = \"\";\n let paragraph = \"\";\n let functionCallName = \"\";\n let functionCallArgs = \"\";\n\n const reader = response.body.getReader();\n\n let partialChunk = \"\";\n let abortTimeout: NodeJS.Timeout | null = null;\n const startAbortTimeout = () => {\n abortTimeout && clearTimeout(abortTimeout);\n return setTimeout(() => {\n logger.error(identifier, `Stream timeout after ${chunkTimeoutMs}ms`);\n controller.abort();\n }, chunkTimeoutMs);\n };\n\n let chunkIndex = -1;\n while (true) {\n chunkIndex++;\n const abortTimeout = startAbortTimeout();\n const { done, value } = await reader.read();\n clearTimeout(abortTimeout);\n\n if (done) {\n logger.error(\n identifier,\n `Stream ended prematurely after ${chunkIndex + 1} chunks`\n );\n throw new Error(\"Stream error: ended prematurely\");\n }\n\n let chunk = new TextDecoder().decode(value);\n rawStreamedBody += chunk + \"\\n\";\n if (partialChunk) {\n chunk = partialChunk + chunk;\n partialChunk = \"\";\n }\n let jsonStrings = chunk.split(/^data: /gm);\n\n for (let jsonString of jsonStrings) {\n if (!jsonString) {\n continue;\n }\n\n if (jsonString.includes(\"[DONE]\")) {\n try {\n return parseStreamedResponse(\n identifier,\n paragraph,\n functionCallName,\n functionCallArgs,\n functionNames\n );\n } catch (error) {\n logger.error(identifier, \"Stream error: parsing response\");\n throw error;\n }\n }\n\n let json;\n try {\n json = JSON.parse(jsonString.trim());\n } catch (error: any) {\n partialChunk = jsonString; // We're assuming any JSON parsing error means we got a non-terminated JSON for a chunk\n continue;\n }\n\n if (!json.choices || !json.choices.length) {\n if (json.error) {\n logger.error(identifier, \"Stream error: OpenAI error:\", json.error);\n const error = new Error(\"Stream error: OpenAI error\") as any;\n error.data = json.error;\n error.requestBody = truncatePayload(openAiPayload);\n throw error;\n }\n if (chunkIndex !== 0) {\n logger.error(identifier, \"Stream error: no choices in JSON:\", json);\n }\n continue;\n }\n\n const dToolCall:\n | {\n index?: number;\n function?: {\n name?: string;\n arguments?: string;\n };\n }\n | undefined = json.choices?.[0]?.delta?.tool_calls?.[0];\n if (dToolCall) {\n const toolCallIndex = dToolCall.index || 0;\n // TODO: handle multiple function calls in response\n if (toolCallIndex === 0) {\n const dFn = dToolCall.function || {};\n if (dFn.name) functionCallName += dFn.name;\n if (dFn.arguments) functionCallArgs += dFn.arguments;\n }\n }\n\n const text = json.choices?.[0]?.delta?.content;\n if (text) {\n paragraph += text;\n }\n }\n }\n } else {\n throw new Error(\"Stream error: no response body\");\n }\n}\n\nasync function callOpenAI(\n identifier: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined\n): Promise<ParsedResponseMessage> {\n const functionNames: Set<string> | null = openAiPayload.tools\n ? new Set(openAiPayload.tools.map((fn) => fn.function.name as string))\n : null;\n\n if (!openAiConfig) {\n openAiConfig = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n let response;\n if (openAiConfig.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service\", openAiPayload.model);\n const model = openAiPayload.model;\n\n if (!openAiConfig.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\"\n );\n }\n\n const azureConfig = openAiConfig.modelConfigMap[model];\n let endpoint;\n if (azureConfig.endpoint) {\n endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n } else {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n logger.log(identifier, \"Using endpoint\", endpoint);\n\n try {\n const stringifiedPayload = JSON.stringify({\n ...openAiPayload,\n stream: false,\n });\n const parsedPayload = JSON.parse(stringifiedPayload);\n // You can use parsedPayload if needed\n } catch (error) {\n logger.error(identifier, \"OpenAI JSON parsing error:\", error);\n throw error;\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n } else {\n // openai by default\n logger.log(identifier, \"Using OpenAI service\", openAiPayload.model);\n const endpoint = `https://api.openai.com/v1/chat/completions`;\n if (openAiConfig.orgId) {\n logger.log(identifier, \"Using orgId\", openAiConfig.orgId);\n }\n\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${openAiConfig.apiKey}`,\n ...(openAiConfig.orgId\n ? { \"OpenAI-Organization\": openAiConfig.orgId }\n : {}),\n },\n body: JSON.stringify({\n ...openAiPayload,\n stream: false,\n }),\n });\n }\n\n if (!response.ok) {\n const errorData = await response.json();\n logger.error(identifier, \"OpenAI API error:\", errorData);\n throw new Error(`OpenAI API Error: ${errorData.error.message}`);\n }\n\n const data = await response.json();\n\n if (!data.choices || !data.choices.length) {\n if (data.error) {\n logger.error(identifier, \"OpenAI error:\", data.error);\n throw new Error(\"OpenAI error: \" + data.error.message);\n }\n throw new Error(\"OpenAI error: No choices returned.\");\n }\n\n const choice = data.choices[0];\n const functionCall = choice.function_call\n ? {\n name: choice.function_call.name,\n arguments: JSON.parse(choice.function_call.arguments),\n }\n : null;\n\n return {\n role: \"assistant\",\n content: choice.message.content || null,\n function_call: functionCall,\n files: [],\n };\n}\n\nfunction truncatePayload(payload: OpenAIPayload): string {\n return JSON.stringify(\n {\n ...payload,\n messages: payload.messages.map((message) => {\n if (typeof message.content === \"string\") {\n message.content = message.content.slice(0, 100);\n } else if (Array.isArray(message.content)) {\n message.content = message.content.map((block) => {\n if (block.type === \"image_url\") {\n block.image_url.url = block.image_url.url.slice(0, 100);\n }\n return block;\n });\n }\n\n return message;\n }),\n },\n null,\n 2\n );\n}\n\nasync function callAnthropicWithRetries(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig,\n attempts = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Anthropic API with retries\");\n let lastResponse;\n for (let i = 0; i < attempts; i++) {\n try {\n lastResponse = await callAnthropic(identifier, AiPayload, AiConfig);\n return lastResponse;\n } catch (e: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${e.message}`,\n e.response?.data || e\n );\n\n if (e.response?.data?.error?.type === \"rate_limit_error\") {\n // TODO: upgrade model or fallback to bedrock\n }\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Anthropic API after ${attempts} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\n}\n\nasync function callAnthropic(\n identifier: Identifier,\n AiPayload: AnthropicAIPayload,\n AiConfig?: AnthropicAIConfig\n): Promise<ParsedResponseMessage> {\n const anthropicMessages = jigAnthropicMessages(AiPayload.messages);\n\n let data;\n let response;\n if (AiConfig?.service === \"bedrock\") {\n // DOES NOT SUPPORT TOOLS YET\n const AWS_REGION = \"us-east-1\";\n const MODEL_ID = \"anthropic.claude-3-haiku-20240307-v1:0\";\n\n // set in environment\n // process.env.AWS_ACCESS_KEY_ID = AWS_ACCESS_KEY_ID;\n // process.env.AWS_SECRET_ACCESS_KEY = AWS_SECRET_ACCESS_KEY;\n\n const client = new BedrockRuntimeClient({ region: AWS_REGION });\n const payload = {\n anthropic_version: \"bedrock-2023-05-31\",\n max_tokens: 4096,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n };\n\n const response = await client.send(\n new InvokeModelCommand({\n contentType: \"application/json\",\n body: JSON.stringify(payload),\n modelId: MODEL_ID,\n })\n );\n\n const decodedResponseBody = new TextDecoder().decode(response.body);\n data = JSON.parse(decodedResponseBody);\n } else {\n // default to anthropic\n const response = await axios.post(\n \"https://api.anthropic.com/v1/messages\",\n {\n model: AiPayload.model,\n messages: anthropicMessages,\n tools: AiPayload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n })),\n temperature: AiPayload.temperature,\n system: AiPayload.system,\n max_tokens: 4096,\n },\n {\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": process.env.ANTHROPIC_API_KEY as string,\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-beta\": \"tools-2024-04-04\",\n },\n timeout: 60000,\n }\n );\n\n data = response.data;\n }\n\n const answers = data.content;\n\n if (!answers[0]) {\n logger.error(identifier, \"Missing answer in Anthropic API:\", data);\n throw new Error(\"Missing answer in Anthropic API\");\n }\n\n let textResponse = \"\";\n let functionCalls: any[] = [];\n for (const answer of answers) {\n if (!answer.type) {\n logger.error(identifier, \"Missing answer type in Anthropic API:\", data);\n throw new Error(\"Missing answer type in Anthropic API\");\n }\n\n let text = \"\";\n if (answer.type === \"text\") {\n text = answer.text\n .replace(/<thinking>.*?<\\/thinking>/gs, \"\")\n .replace(/<answer>|<\\/answer>/gs, \"\")\n .trim();\n\n if (!text) {\n // remove the tags and return the text within\n text = answer.text.replace(\n /<thinking>|<\\/thinking>|<answer>|<\\/answer>/gs,\n \"\"\n );\n logger.log(\n identifier,\n \"No text in answer, returning text within tags:\",\n text\n );\n }\n\n if (textResponse) {\n textResponse += `\\n\\n${text}`;\n } else {\n textResponse = text;\n }\n } else if (answer.type === \"tool_use\") {\n const call = {\n name: answer.name,\n arguments: answer.input,\n };\n functionCalls.push(call);\n }\n }\n\n if (!textResponse && !functionCalls.length) {\n logger.error(\n identifier,\n \"Missing text & fns in Anthropic API response:\",\n data\n );\n throw new Error(\"Missing text & fns in Anthropic API response\");\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCalls[0],\n files: [],\n };\n}\n\nfunction jigAnthropicMessages(\n messages: AnthropicAIMessage[]\n): AnthropicAIMessage[] {\n // Takes a list if messages each with a role and content\n // Assumes no system messages are present\n\n let jiggedMessages = messages.slice();\n\n // If the first message is not user, add an empty user message at the start\n if (jiggedMessages[0]?.role !== \"user\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n content: \"...\",\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their content\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n // Combine content of messages with the same role\n const lastContent = Array.isArray(lastMessage.content)\n ? lastMessage.content\n : [{ type: \"text\" as const, text: lastMessage.content }];\n const newContent = Array.isArray(message.content)\n ? message.content\n : [{ type: \"text\" as const, text: message.content }];\n\n lastMessage.content = [\n ...lastContent,\n { type: \"text\", text: \"\\n\\n---\\n\\n\" },\n ...newContent,\n ];\n return acc;\n }\n\n // Convert string content to text content block\n if (typeof message.content === \"string\") {\n message.content = [{ type: \"text\", text: message.content }];\n }\n\n return [...acc, message];\n }, [] as AnthropicAIMessage[]);\n\n // If last message in array is assistant, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"assistant\") {\n jiggedMessages.push({\n role: \"user\",\n content: \"...\",\n });\n }\n\n return jiggedMessages;\n}\n\nfunction jigGoogleMessages(messages: GoogleAIMessage[]): GoogleAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // If the first message is model, add an empty user message at the start\n if (jiggedMessages[0]?.role === \"model\") {\n jiggedMessages = [\n {\n role: \"user\" as const,\n parts: [{ text: \"...\" }],\n },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role, combining their parts\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) {\n return [message];\n }\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n lastMessage.parts = [...lastMessage.parts, ...message.parts];\n return acc;\n }\n\n return [...acc, message];\n }, [] as GoogleAIMessage[]);\n\n // If last message in array is model, then add an empty user message\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"model\") {\n jiggedMessages.push({\n role: \"user\",\n parts: [{ text: \"...\" }],\n });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareGoogleAIPayload(\n payload: GenericPayload\n): Promise<GoogleAIPayload> {\n const preparedPayload: GoogleAIPayload = {\n model: payload.model as GeminiModel,\n messages: [],\n tools: payload.functions\n ? {\n functionDeclarations: payload.functions.map((fn) => ({\n name: fn.name,\n parameters: {\n // Google puts their description in the parameters object rather than in a top-level field\n description: fn.description,\n ...fn.parameters,\n },\n })),\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.systemInstruction = message.content;\n continue;\n }\n\n const googleAIContentParts: GoogleAIPart[] = [];\n\n if (message.content) {\n googleAIContentParts.push({\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\n \"payload\",\n \"Google AI API does not support non-image file types. Skipping file.\"\n );\n continue;\n }\n\n if (file.url) {\n googleAIContentParts.push({\n inlineData: {\n mimeType: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n // Add the URL as a text part\n googleAIContentParts.push({\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n googleAIContentParts.push({\n inlineData: {\n mimeType: file.mimeType,\n data: file.data,\n },\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role === \"assistant\" ? \"model\" : message.role,\n parts: googleAIContentParts,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callGoogleAI(\n identifier: Identifier,\n payload: GoogleAIPayload\n): Promise<ParsedResponseMessage> {\n const googleMessages = jigGoogleMessages(payload.messages);\n\n const history = googleMessages.slice(0, -1);\n const lastMessage = googleMessages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({\n apiKey: process.env.GEMINI_API_KEY,\n });\n\n const chat = genAI.chats.create({\n model: payload.model,\n history,\n config: {\n responseModalities: [\"Text\"],\n tools: payload.tools ? [payload.tools] : undefined,\n systemInstruction: payload.systemInstruction,\n },\n });\n\n const response = await chat.sendMessage({\n message: lastMessage.parts,\n });\n\n let text: string = \"\";\n const files: File[] = [];\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.text) {\n text += part.text;\n }\n\n if (part.inlineData) {\n const imageData = part.inlineData.data;\n if (imageData) {\n files.push({\n mimeType: \"image/png\",\n data: imageData,\n });\n }\n }\n }\n\n const functionCalls:\n | {\n name?: string;\n args?: Record<string, any>;\n }[]\n | undefined = response.functionCalls;\n\n const parsedFunctionCalls = functionCalls?.map((fc) => ({\n name: fc.name ?? \"\",\n arguments: fc.args ?? {},\n }));\n\n if (!text && !parsedFunctionCalls?.length && !files.length) {\n logger.error(\n identifier,\n \"Missing text & fns in Google AI API response:\",\n response\n );\n throw new Error(\"Missing text & fns in Google AI API response\");\n }\n\n return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: parsedFunctionCalls?.[0] || null,\n };\n}\n\nasync function callGoogleAIWithRetries(\n identifier: Identifier,\n payload: GoogleAIPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Google AI API with retries\");\n\n let lastError: any;\n for (let i = 0; i < retries; i++) {\n try {\n return await callGoogleAI(identifier, payload);\n } catch (e: any) {\n lastError = e;\n logger.error(identifier, `Retry #${i} error: ${e.message}`, e);\n\n // Add any specific Google AI error handling or payload modifications here if needed\n // e.g., if (e.status === 429) { /* handle rate limit */ }\n\n await timeout(125 * i); // Exponential backoff\n }\n }\n const error = new Error(\n `Failed to call Google AI API after ${retries} attempts`\n ) as any;\n error.cause = lastError; // Attach the last caught error\n throw error;\n}\n\nexport async function callWithRetries(\n identifier: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n const id = identifier;\n // Determine which service to use based on the model type\n if (isAnthropicPayload(aiPayload)) {\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(aiPayload),\n aiConfig as AnthropicAIConfig,\n retries\n );\n } else if (isOpenAiPayload(aiPayload)) {\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs\n );\n } else if (isGroqPayload(aiPayload)) {\n return await callGroqWithRetries(id, await prepareGroqPayload(aiPayload));\n } else if (isGoogleAIPayload(aiPayload)) {\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(aiPayload),\n retries\n );\n } else {\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n }\n}\n\nfunction isAnthropicPayload(payload: any): Boolean {\n return Object.values(ClaudeModel).includes(payload.model);\n}\n\nasync function prepareAnthropicPayload(\n payload: GenericPayload\n): Promise<AnthropicAIPayload> {\n const preparedPayload: AnthropicAIPayload = {\n model: payload.model as ClaudeModel,\n messages: [],\n functions: payload.functions,\n temperature: payload.temperature,\n };\n\n for (const message of payload.messages) {\n const anthropicContentBlocks: AnthropicContentBlock[] = [];\n\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n if (message.content) {\n anthropicContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\n \"payload\",\n \"Anthropic API does not support non-image file types. Skipping file.\"\n );\n continue;\n }\n\n if (file.url) {\n anthropicContentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n anthropicContentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: file.mimeType as any,\n data: file.data,\n },\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: anthropicContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isOpenAiPayload(payload: any): Boolean {\n return Object.values(GPTModel).includes(payload.model);\n}\n\nasync function prepareOpenAIPayload(\n payload: GenericPayload\n): Promise<OpenAIPayload> {\n const preparedPayload: OpenAIPayload = {\n model: payload.model as GPTModel,\n messages: [],\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const openAIContentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n openAIContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n const allowedFileMimeTypes = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ];\n\n for (const file of message.files || []) {\n if (allowedFileMimeTypes.includes(file.mimeType)) {\n if (file.url) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: file.url,\n },\n });\n // Add the URL as a text part\n openAIContentBlocks.push({\n type: \"text\",\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: `data:${file.mimeType};base64,${file.data}`,\n },\n });\n }\n // } else if (file.mimeType?.startsWith(\"audio\")) {\n // if (file.url) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: file.url,\n // },\n // });\n // } else if (file.data) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: `data:${file.mimeType};base64,${file.data}`,\n // },\n // });\n // }\n } else {\n logger.warn(\n \"payload\",\n \"Skipping file in message. File or image type not supported by OpenAI API:\",\n file.mimeType\n );\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: openAIContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isGroqPayload(payload: any): Boolean {\n return Object.values(GroqModel).includes(payload.model);\n}\n\nfunction prepareGroqPayload(payload: GenericPayload): GroqPayload {\n return {\n model: payload.model as GroqModel,\n messages: payload.messages.map((message) => ({\n role: message.role,\n content: normalizeMessageContent(message.content),\n })),\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n temperature: payload.temperature,\n };\n}\n\nfunction normalizeMessageContent(\n content: AnthropicAIMessage[\"content\"]\n): string {\n return Array.isArray(content)\n ? content\n .map((c) => (c.type === \"text\" ? c.text : `[${c.type}]`))\n .join(\"\\n\")\n : content;\n}\n\nfunction isGoogleAIPayload(payload: any): Boolean {\n return Object.values(GeminiModel).includes(payload.model);\n}\n\nasync function callGroq(\n identifier: Identifier,\n payload: GroqPayload\n): Promise<ParsedResponseMessage> {\n const response = await axios.post(\n \"https://api.groq.com/openai/v1/chat/completions\",\n payload,\n {\n headers: {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${process.env.GROQ_API_KEY}`,\n },\n }\n );\n\n const data = response.data;\n\n const answer = data.choices[0].message;\n if (!answer) {\n logger.error(identifier, \"Missing answer in Groq API:\", data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const textResponse = answer.content || null;\n let functionCall: FunctionCall | null = null;\n if (answer.tool_calls && answer.tool_calls.length) {\n const toolCall = answer.tool_calls[0];\n functionCall = {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments),\n };\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCall,\n files: [],\n };\n}\n\nasync function callGroqWithRetries(\n identifier: Identifier,\n payload: GroqPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Groq API with retries\");\n\n let lastResponse;\n for (let i = 0; i < retries; i++) {\n try {\n lastResponse = await callGroq(identifier, payload);\n return lastResponse;\n } catch (e: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${e.message}`,\n e.response?.data || e\n );\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Groq API after ${retries} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\n}\n\nasync function getNormalizedBase64PNG(\n url: string,\n mime: string\n): Promise<string> {\n const response = await axios.get(url, { responseType: \"arraybuffer\" });\n\n let imageBuffer = Buffer.from(response.data);\n let sharpOptions = {};\n if (isHeicImage(url, mime)) {\n const imageData = await decode({ buffer: imageBuffer });\n imageBuffer = Buffer.from(imageData.data);\n sharpOptions = {\n raw: {\n width: imageData.width,\n height: imageData.height,\n channels: 4,\n },\n };\n }\n\n // Limits size of image to < 5MB Anthropic limit\n const resizedBuffer = await sharp(imageBuffer, sharpOptions)\n .withMetadata()\n .resize(1024, 1024, { fit: \"inside\", withoutEnlargement: true })\n .png()\n .toBuffer();\n\n return resizedBuffer.toString(\"base64\");\n}\n\n// async function main() {\n// const payload: GenericPayload = {\n// model: GeminiModel.GEMINI_15_PRO,\n// messages: [\n// {\n// role: \"user\",\n// content: \"What is this logo?\",\n// files: [\n// {\n// mimeType: \"image/png\",\n// url: \"https://www.wikimedia.org/static/images/wmf-logo-2x.png\",\n// },\n// ],\n// },\n// ],\n// functions: [\n// {\n// name: \"answer_logo_question\",\n// description: \"Answer a question about a logo\",\n// parameters: {\n// type: \"object\",\n// properties: {\n// organization: {\n// type: \"string\",\n// },\n// },\n// },\n// },\n// ],\n// };\n\n// const answer = await callWithRetries(\"test\", payload);\n\n// console.log(answer);\n// }\n\n// main();\n","export function timeout(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function isHeicImage(name: string, mime?: string): boolean {\n const extension = name.split(\".\").pop()?.toLowerCase() || \"\";\n return (\n [\"heic\", \"heif\", \"heics\"].includes(extension) ||\n !!(\n mime && [\"image/heic\", \"image/heif\", \"image/heic-sequence\"].includes(mime)\n )\n );\n}\n"],"mappings":"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","names":["ClaudeModel","GPTModel","GroqModel","GeminiModel","error","abortTimeout","response","_a","_b"]}
|