190proof 1.0.73 → 1.0.75

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/README.md CHANGED
@@ -1,16 +1,17 @@
1
1
  # 190proof
2
2
 
3
- A unified interface for interacting with multiple AI providers including **OpenAI**, **Anthropic**, **Google**, and **Groq**. This package provides a consistent API for making requests to different LLM providers while handling retries, streaming, and multimodal inputs.
3
+ A unified interface for interacting with multiple AI providers including **OpenAI**, **Anthropic**, **Google**, **Groq**, and **AWS Bedrock**. This package provides a consistent API for making requests to different LLM providers while handling retries, streaming, and multimodal inputs.
4
4
 
5
5
  ## Features
6
6
 
7
7
  Fully-local unified interface across multiple AI providers that includes:
8
8
 
9
- - 🖼️ Image format & size normalization
10
- - 🛠️ Consistent function calling
9
+ - 🛠️ Consistent function/tool calling across all providers
11
10
  - 💬 Consistent message alternation & system instructions
11
+ - 🖼️ Image format & size normalization
12
12
  - 🔄 Automatic retries with configurable attempts
13
13
  - 📡 Streaming by default
14
+ - ☁️ Cloud service providers supported (Azure, AWS Bedrock)
14
15
 
15
16
  ## Installation
16
17
 
@@ -27,7 +28,7 @@ import { callWithRetries } from "190proof";
27
28
  import { GPTModel, GenericPayload } from "190proof/interfaces";
28
29
 
29
30
  const payload: GenericPayload = {
30
- model: GPTModel.O1_MINI,
31
+ model: GPTModel.GPT4O_MINI,
31
32
  messages: [
32
33
  {
33
34
  role: "user",
@@ -40,11 +41,43 @@ const response = await callWithRetries("my-request-id", payload);
40
41
  console.log(response.content);
41
42
  ```
42
43
 
44
+ ### Using Different Providers
45
+
46
+ ```typescript
47
+ import { callWithRetries } from "190proof";
48
+ import {
49
+ ClaudeModel,
50
+ GeminiModel,
51
+ GroqModel,
52
+ GenericPayload,
53
+ } from "190proof/interfaces";
54
+
55
+ // Anthropic
56
+ const claudePayload: GenericPayload = {
57
+ model: ClaudeModel.SONNET_4,
58
+ messages: [{ role: "user", content: "Hello!" }],
59
+ };
60
+
61
+ // Google
62
+ const geminiPayload: GenericPayload = {
63
+ model: GeminiModel.GEMINI_2_0_FLASH,
64
+ messages: [{ role: "user", content: "Hello!" }],
65
+ };
66
+
67
+ // Groq
68
+ const groqPayload: GenericPayload = {
69
+ model: GroqModel.LLAMA_3_70B_8192,
70
+ messages: [{ role: "user", content: "Hello!" }],
71
+ };
72
+
73
+ const response = await callWithRetries("request-id", claudePayload);
74
+ ```
75
+
43
76
  ### With Function Calling
44
77
 
45
78
  ```typescript
46
79
  const payload: GenericPayload = {
47
- model: GPTModel.O1_MINI,
80
+ model: GPTModel.GPT4O,
48
81
  messages: [
49
82
  {
50
83
  role: "user",
@@ -70,13 +103,14 @@ const payload: GenericPayload = {
70
103
  };
71
104
 
72
105
  const response = await callWithRetries("function-call-example", payload);
106
+ // response.function_call contains { name: string, arguments: Record<string, any> }
73
107
  ```
74
108
 
75
109
  ### With Images
76
110
 
77
111
  ```typescript
78
112
  const payload: GenericPayload = {
79
- model: GPTModel.O1_MINI,
113
+ model: ClaudeModel.SONNET_4,
80
114
  messages: [
81
115
  {
82
116
  role: "user",
@@ -98,7 +132,7 @@ const response = await callWithRetries("image-example", payload);
98
132
 
99
133
  ```typescript
100
134
  const payload: GenericPayload = {
101
- model: GPTModel.O1_MINI,
135
+ model: GeminiModel.GEMINI_2_0_FLASH,
102
136
  messages: [
103
137
  {
104
138
  role: "system",
@@ -128,35 +162,122 @@ const response = await callWithRetries("system-message-example", payload);
128
162
  - `gpt-4o-mini`
129
163
  - `o1-preview`
130
164
  - `o1-mini`
165
+ - `o3-mini`
166
+ - `gpt-4.1`
167
+ - `gpt-4.1-mini`
168
+ - `gpt-4.1-nano`
169
+ - `gpt-5`
170
+ - `gpt-5-mini`
131
171
 
132
172
  ### Anthropic Models
133
173
 
134
174
  - `claude-3-haiku-20240307`
135
175
  - `claude-3-sonnet-20240229`
136
176
  - `claude-3-opus-20240229`
177
+ - `claude-3-5-haiku-20241022`
137
178
  - `claude-3-5-sonnet-20241022`
179
+ - `claude-sonnet-4-20250514`
180
+ - `claude-opus-4-20250514`
181
+ - `claude-opus-4-1`
182
+ - `claude-haiku-4-5`
183
+ - `claude-sonnet-4-5`
184
+ - `claude-opus-4-5`
138
185
 
139
186
  ### Google Models
140
187
 
141
188
  - `gemini-1.5-pro-latest`
189
+ - `gemini-exp-1206`
190
+ - `gemini-2.0-flash`
191
+ - `gemini-2.0-flash-exp-image-generation`
192
+ - `gemini-2.0-flash-thinking-exp`
193
+ - `gemini-2.0-flash-thinking-exp-01-21`
194
+ - `gemini-2.5-flash-preview-04-17`
195
+ - `gemini-3-flash-preview`
142
196
 
143
197
  ### Groq Models
144
198
 
145
199
  - `llama3-70b-8192`
200
+ - `deepseek-r1-distill-llama-70b`
201
+
202
+ ## Environment Variables
203
+
204
+ Set the following environment variables for the providers you want to use:
205
+
206
+ ```bash
207
+ # OpenAI
208
+ OPENAI_API_KEY=your-openai-api-key
209
+
210
+ # Anthropic
211
+ ANTHROPIC_API_KEY=your-anthropic-api-key
212
+
213
+ # Google
214
+ GEMINI_API_KEY=your-gemini-api-key
215
+
216
+ # Groq
217
+ GROQ_API_KEY=your-groq-api-key
218
+
219
+ # AWS Bedrock (for Anthropic via Bedrock)
220
+ AWS_ACCESS_KEY_ID=your-aws-access-key
221
+ AWS_SECRET_ACCESS_KEY=your-aws-secret-key
222
+ ```
146
223
 
147
224
  ## API Reference
148
225
 
149
- ### `callWithRetries(identifier: string, payload: GenericPayload, config?: Config, retries?: number, chunkTimeoutMs?: number)`
226
+ ### `callWithRetries(identifier, payload, config?, retries?, chunkTimeoutMs?)`
150
227
 
151
228
  Main function to make requests to any supported AI provider.
152
229
 
153
230
  #### Parameters
154
231
 
155
- - `identifier`: Unique identifier for the request
156
- - `payload`: Request payload containing model, messages, and optional functions
157
- - `config`: Optional configuration for the specific provider
158
- - `retries`: Number of retry attempts (default: 5)
159
- - `chunkTimeoutMs`: Timeout for streaming chunks (default: 15000)
232
+ - `identifier`: `string | string[]` - Unique identifier for the request (used for logging)
233
+ - `payload`: `GenericPayload` - Request payload containing model, messages, and optional functions
234
+ - `config`: `OpenAIConfig | AnthropicAIConfig` - Optional configuration for the specific provider
235
+ - `retries`: `number` - Number of retry attempts (default: 5)
236
+ - `chunkTimeoutMs`: `number` - Timeout for streaming chunks in ms (default: 15000)
237
+
238
+ #### Returns
239
+
240
+ `Promise<ParsedResponseMessage>`:
241
+
242
+ ```typescript
243
+ interface ParsedResponseMessage {
244
+ role: "assistant";
245
+ content: string | null;
246
+ function_call: FunctionCall | null;
247
+ files: File[]; // For models that return files (e.g., image generation)
248
+ }
249
+ ```
250
+
251
+ ### Configuration Options
252
+
253
+ #### OpenAI Config
254
+
255
+ ```typescript
256
+ interface OpenAIConfig {
257
+ service: "azure" | "openai";
258
+ apiKey: string;
259
+ baseUrl: string;
260
+ orgId?: string;
261
+ modelConfigMap?: Record<
262
+ GPTModel,
263
+ {
264
+ resource: string;
265
+ deployment: string;
266
+ apiVersion: string;
267
+ apiKey: string;
268
+ endpoint?: string;
269
+ }
270
+ >;
271
+ }
272
+ ```
273
+
274
+ #### Anthropic Config
275
+
276
+ ```typescript
277
+ interface AnthropicAIConfig {
278
+ service: "anthropic" | "bedrock";
279
+ }
280
+ ```
160
281
 
161
282
  ## License
162
283
 
package/dist/index.d.mts CHANGED
@@ -2,9 +2,12 @@ declare enum ClaudeModel {
2
2
  HAIKU_3 = "claude-3-haiku-20240307",
3
3
  SONNET_3 = "claude-3-sonnet-20240229",
4
4
  OPUS_3 = "claude-3-opus-20240229",
5
+ HAIKU_3_5 = "claude-3-5-haiku-20241022",
5
6
  SONNET_3_5 = "claude-3-5-sonnet-20241022",
6
7
  SONNET_4 = "claude-sonnet-4-20250514",
7
8
  OPUS_4 = "claude-opus-4-20250514",
9
+ OPUS_4_1 = "claude-opus-4-1",
10
+ HAIKU_4_5 = "claude-haiku-4-5",
8
11
  SONNET_4_5 = "claude-sonnet-4-5",
9
12
  OPUS_4_5 = "claude-opus-4-5"
10
13
  }
package/dist/index.d.ts CHANGED
@@ -2,9 +2,12 @@ declare enum ClaudeModel {
2
2
  HAIKU_3 = "claude-3-haiku-20240307",
3
3
  SONNET_3 = "claude-3-sonnet-20240229",
4
4
  OPUS_3 = "claude-3-opus-20240229",
5
+ HAIKU_3_5 = "claude-3-5-haiku-20241022",
5
6
  SONNET_3_5 = "claude-3-5-sonnet-20241022",
6
7
  SONNET_4 = "claude-sonnet-4-20250514",
7
8
  OPUS_4 = "claude-opus-4-20250514",
9
+ OPUS_4_1 = "claude-opus-4-1",
10
+ HAIKU_4_5 = "claude-haiku-4-5",
8
11
  SONNET_4_5 = "claude-sonnet-4-5",
9
12
  OPUS_4_5 = "claude-opus-4-5"
10
13
  }
package/dist/index.js CHANGED
@@ -43,9 +43,12 @@ var ClaudeModel = /* @__PURE__ */ ((ClaudeModel2) => {
43
43
  ClaudeModel2["HAIKU_3"] = "claude-3-haiku-20240307";
44
44
  ClaudeModel2["SONNET_3"] = "claude-3-sonnet-20240229";
45
45
  ClaudeModel2["OPUS_3"] = "claude-3-opus-20240229";
46
+ ClaudeModel2["HAIKU_3_5"] = "claude-3-5-haiku-20241022";
46
47
  ClaudeModel2["SONNET_3_5"] = "claude-3-5-sonnet-20241022";
47
48
  ClaudeModel2["SONNET_4"] = "claude-sonnet-4-20250514";
48
49
  ClaudeModel2["OPUS_4"] = "claude-opus-4-20250514";
50
+ ClaudeModel2["OPUS_4_1"] = "claude-opus-4-1";
51
+ ClaudeModel2["HAIKU_4_5"] = "claude-haiku-4-5";
49
52
  ClaudeModel2["SONNET_4_5"] = "claude-sonnet-4-5";
50
53
  ClaudeModel2["OPUS_4_5"] = "claude-opus-4-5";
51
54
  return ClaudeModel2;
@@ -804,7 +807,7 @@ async function prepareGoogleAIPayload(payload) {
804
807
  return preparedPayload;
805
808
  }
806
809
  async function callGoogleAI(identifier, payload) {
807
- var _a, _b, _c;
810
+ var _a, _b, _c, _d;
808
811
  const googleMessages = jigGoogleMessages(payload.messages);
809
812
  const history = googleMessages.slice(0, -1);
810
813
  const lastMessage = googleMessages.slice(-1)[0];
@@ -848,12 +851,45 @@ async function callGoogleAI(identifier, payload) {
848
851
  };
849
852
  });
850
853
  if (!text && !(parsedFunctionCalls == null ? void 0 : parsedFunctionCalls.length) && !files.length) {
854
+ const candidate = (_d = response.candidates) == null ? void 0 : _d[0];
855
+ const finishReason = candidate == null ? void 0 : candidate.finishReason;
856
+ const safetyRatings = candidate == null ? void 0 : candidate.safetyRatings;
857
+ const usageMetadata = response.usageMetadata;
858
+ const modelVersion = response.modelVersion;
851
859
  logger_default.error(
852
860
  identifier,
853
861
  "Missing text & fns in Google AI API response:",
854
- response
862
+ {
863
+ finishReason,
864
+ safetyRatings,
865
+ usageMetadata,
866
+ modelVersion,
867
+ candidateContent: candidate == null ? void 0 : candidate.content,
868
+ promptFeedback: response.promptFeedback,
869
+ fullResponse: JSON.stringify(response)
870
+ }
855
871
  );
856
- throw new Error("Missing text & fns in Google AI API response");
872
+ let errorMessage = "Missing text & fns in Google AI API response";
873
+ if (finishReason) {
874
+ errorMessage += `: finishReason=${finishReason}`;
875
+ if (finishReason === "MALFORMED_FUNCTION_CALL") {
876
+ errorMessage += " (Google could not generate valid function call arguments)";
877
+ } else if (finishReason === "SAFETY") {
878
+ errorMessage += " (blocked by safety filters)";
879
+ } else if (finishReason === "RECITATION") {
880
+ errorMessage += " (blocked due to recitation)";
881
+ } else if (finishReason === "MAX_TOKENS") {
882
+ errorMessage += " (response truncated due to max tokens)";
883
+ }
884
+ }
885
+ const error2 = new Error(errorMessage);
886
+ error2.finishReason = finishReason;
887
+ error2.safetyRatings = safetyRatings;
888
+ error2.usageMetadata = usageMetadata;
889
+ error2.modelVersion = modelVersion;
890
+ error2.candidateContent = candidate == null ? void 0 : candidate.content;
891
+ error2.promptFeedback = response.promptFeedback;
892
+ throw error2;
857
893
  }
858
894
  return {
859
895
  role: "assistant",
@@ -870,7 +906,38 @@ async function callGoogleAIWithRetries(identifier, payload, retries = 5) {
870
906
  return await callGoogleAI(identifier, payload);
871
907
  } catch (e) {
872
908
  lastError = e;
873
- logger_default.error(identifier, `Retry #${i} error: ${e.message}`, e);
909
+ const errorDetails = {
910
+ message: e.message,
911
+ finishReason: e.finishReason,
912
+ modelVersion: e.modelVersion
913
+ };
914
+ if (e.safetyRatings) {
915
+ errorDetails.safetyRatings = e.safetyRatings;
916
+ }
917
+ if (e.usageMetadata) {
918
+ errorDetails.usageMetadata = e.usageMetadata;
919
+ }
920
+ if (e.promptFeedback) {
921
+ errorDetails.promptFeedback = e.promptFeedback;
922
+ }
923
+ if (e.status || e.statusText) {
924
+ errorDetails.httpStatus = e.status;
925
+ errorDetails.httpStatusText = e.statusText;
926
+ }
927
+ if (e.code) {
928
+ errorDetails.errorCode = e.code;
929
+ }
930
+ if (e.details) {
931
+ errorDetails.errorDetails = e.details;
932
+ }
933
+ logger_default.error(identifier, `Retry #${i} error: ${e.message}`, errorDetails);
934
+ if (e.finishReason === "MALFORMED_FUNCTION_CALL" && i >= 3) {
935
+ logger_default.log(
936
+ identifier,
937
+ "Removing tools due to persistent MALFORMED_FUNCTION_CALL errors"
938
+ );
939
+ payload.tools = void 0;
940
+ }
874
941
  await timeout(125 * i);
875
942
  }
876
943
  }
@@ -878,6 +945,9 @@ async function callGoogleAIWithRetries(identifier, payload, retries = 5) {
878
945
  `Failed to call Google AI API after ${retries} attempts`
879
946
  );
880
947
  error2.cause = lastError;
948
+ error2.finishReason = lastError == null ? void 0 : lastError.finishReason;
949
+ error2.usageMetadata = lastError == null ? void 0 : lastError.usageMetadata;
950
+ error2.safetyRatings = lastError == null ? void 0 : lastError.safetyRatings;
881
951
  throw error2;
882
952
  }
883
953
  async function callWithRetries(identifier, aiPayload, aiConfig, retries = 5, chunkTimeoutMs = 15e3) {
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(\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"]}
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 const candidate = response.candidates?.[0];\n const finishReason = candidate?.finishReason;\n const safetyRatings = candidate?.safetyRatings;\n const usageMetadata = response.usageMetadata;\n const modelVersion = response.modelVersion;\n\n logger.error(\n identifier,\n \"Missing text & fns in Google AI API response:\",\n {\n finishReason,\n safetyRatings,\n usageMetadata,\n modelVersion,\n candidateContent: candidate?.content,\n promptFeedback: response.promptFeedback,\n fullResponse: JSON.stringify(response),\n }\n );\n\n // Create a more descriptive error message based on the finish reason\n let errorMessage = \"Missing text & fns in Google AI API response\";\n if (finishReason) {\n errorMessage += `: finishReason=${finishReason}`;\n if (finishReason === \"MALFORMED_FUNCTION_CALL\") {\n errorMessage += \" (Google could not generate valid function call arguments)\";\n } else if (finishReason === \"SAFETY\") {\n errorMessage += \" (blocked by safety filters)\";\n } else if (finishReason === \"RECITATION\") {\n errorMessage += \" (blocked due to recitation)\";\n } else if (finishReason === \"MAX_TOKENS\") {\n errorMessage += \" (response truncated due to max tokens)\";\n }\n }\n\n const error = new Error(errorMessage) as any;\n error.finishReason = finishReason;\n error.safetyRatings = safetyRatings;\n error.usageMetadata = usageMetadata;\n error.modelVersion = modelVersion;\n error.candidateContent = candidate?.content;\n error.promptFeedback = response.promptFeedback;\n throw error;\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\n // Log structured error details from Google AI\n const errorDetails: Record<string, any> = {\n message: e.message,\n finishReason: e.finishReason,\n modelVersion: e.modelVersion,\n };\n\n // Include safety ratings if present\n if (e.safetyRatings) {\n errorDetails.safetyRatings = e.safetyRatings;\n }\n\n // Include usage metadata if present\n if (e.usageMetadata) {\n errorDetails.usageMetadata = e.usageMetadata;\n }\n\n // Include prompt feedback if present (useful for blocked prompts)\n if (e.promptFeedback) {\n errorDetails.promptFeedback = e.promptFeedback;\n }\n\n // Include HTTP error details if present (from SDK errors)\n if (e.status || e.statusText) {\n errorDetails.httpStatus = e.status;\n errorDetails.httpStatusText = e.statusText;\n }\n\n // Include error code/details from Google API errors\n if (e.code) {\n errorDetails.errorCode = e.code;\n }\n if (e.details) {\n errorDetails.errorDetails = e.details;\n }\n\n logger.error(identifier, `Retry #${i} error: ${e.message}`, errorDetails);\n\n // Handle specific Google AI errors\n if (e.finishReason === \"MALFORMED_FUNCTION_CALL\" && i >= 3) {\n // On 4th retry, try removing tools to get a text response instead\n logger.log(\n identifier,\n \"Removing tools due to persistent MALFORMED_FUNCTION_CALL errors\"\n );\n payload.tools = undefined;\n }\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 error.finishReason = lastError?.finishReason;\n error.usageMetadata = lastError?.usageMetadata;\n error.safetyRatings = lastError?.safetyRatings;\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 HAIKU_3_5 = \"claude-3-5-haiku-20241022\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\n OPUS_4_1 = \"claude-opus-4-1\",\n HAIKU_4_5 = \"claude-haiku-4-5\",\n SONNET_4_5 = \"claude-sonnet-4-5\",\n OPUS_4_5 = \"claude-opus-4-5\",\n}\n\nexport enum GPTModel {\n GPT35_0613 = \"gpt-3.5-turbo-0613\",\n GPT35_0613_16K = \"gpt-3.5-turbo-16k-0613\",\n GPT35_0125 = \"gpt-3.5-turbo-0125\",\n GPT4_1106_PREVIEW = \"gpt-4-1106-preview\",\n GPT4_0125_PREVIEW = \"gpt-4-0125-preview\",\n GPT4_0409 = \"gpt-4-turbo-2024-04-09\",\n GPT4O = \"gpt-4o\",\n GPT4O_MINI = \"gpt-4o-mini\",\n O1_PREVIEW = \"o1-preview\",\n O1_MINI = \"o1-mini\",\n O3_MINI = \"o3-mini\",\n GPT4_1 = \"gpt-4.1\",\n GPT4_1_MINI = \"gpt-4.1-mini\",\n GPT4_1_NANO = \"gpt-4.1-nano\",\n GPT5 = \"gpt-5\",\n GPT5_MINI = \"gpt-5-mini\",\n}\n\nexport enum GroqModel {\n LLAMA_3_70B_8192 = \"llama3-70b-8192\",\n DEEPSEEK_R1_DISTILL_LLAMA_70B = \"deepseek-r1-distill-llama-70b\",\n}\n\nexport enum GeminiModel {\n GEMINI_1_5_PRO = \"gemini-1.5-pro-latest\",\n GEMINI_EXP_1206 = \"gemini-exp-1206\",\n GEMINI_2_0_FLASH = \"gemini-2.0-flash\",\n GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION = \"gemini-2.0-flash-exp-image-generation\",\n GEMINI_2_0_FLASH_THINKING_EXP = \"gemini-2.0-flash-thinking-exp\",\n GEMINI_2_0_FLASH_THINKING_EXP_01_21 = \"gemini-2.0-flash-thinking-exp-01-21\",\n GEMINI_2_5_FLASH_PREVIEW_04_17 = \"gemini-2.5-flash-preview-04-17\",\n GEMINI_3_FLASH_PREVIEW = \"gemini-3-flash-preview\",\n}\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
@@ -11,9 +11,12 @@ var ClaudeModel = /* @__PURE__ */ ((ClaudeModel2) => {
11
11
  ClaudeModel2["HAIKU_3"] = "claude-3-haiku-20240307";
12
12
  ClaudeModel2["SONNET_3"] = "claude-3-sonnet-20240229";
13
13
  ClaudeModel2["OPUS_3"] = "claude-3-opus-20240229";
14
+ ClaudeModel2["HAIKU_3_5"] = "claude-3-5-haiku-20241022";
14
15
  ClaudeModel2["SONNET_3_5"] = "claude-3-5-sonnet-20241022";
15
16
  ClaudeModel2["SONNET_4"] = "claude-sonnet-4-20250514";
16
17
  ClaudeModel2["OPUS_4"] = "claude-opus-4-20250514";
18
+ ClaudeModel2["OPUS_4_1"] = "claude-opus-4-1";
19
+ ClaudeModel2["HAIKU_4_5"] = "claude-haiku-4-5";
17
20
  ClaudeModel2["SONNET_4_5"] = "claude-sonnet-4-5";
18
21
  ClaudeModel2["OPUS_4_5"] = "claude-opus-4-5";
19
22
  return ClaudeModel2;
@@ -775,7 +778,7 @@ async function prepareGoogleAIPayload(payload) {
775
778
  return preparedPayload;
776
779
  }
777
780
  async function callGoogleAI(identifier, payload) {
778
- var _a, _b, _c;
781
+ var _a, _b, _c, _d;
779
782
  const googleMessages = jigGoogleMessages(payload.messages);
780
783
  const history = googleMessages.slice(0, -1);
781
784
  const lastMessage = googleMessages.slice(-1)[0];
@@ -819,12 +822,45 @@ async function callGoogleAI(identifier, payload) {
819
822
  };
820
823
  });
821
824
  if (!text && !(parsedFunctionCalls == null ? void 0 : parsedFunctionCalls.length) && !files.length) {
825
+ const candidate = (_d = response.candidates) == null ? void 0 : _d[0];
826
+ const finishReason = candidate == null ? void 0 : candidate.finishReason;
827
+ const safetyRatings = candidate == null ? void 0 : candidate.safetyRatings;
828
+ const usageMetadata = response.usageMetadata;
829
+ const modelVersion = response.modelVersion;
822
830
  logger_default.error(
823
831
  identifier,
824
832
  "Missing text & fns in Google AI API response:",
825
- response
833
+ {
834
+ finishReason,
835
+ safetyRatings,
836
+ usageMetadata,
837
+ modelVersion,
838
+ candidateContent: candidate == null ? void 0 : candidate.content,
839
+ promptFeedback: response.promptFeedback,
840
+ fullResponse: JSON.stringify(response)
841
+ }
826
842
  );
827
- throw new Error("Missing text & fns in Google AI API response");
843
+ let errorMessage = "Missing text & fns in Google AI API response";
844
+ if (finishReason) {
845
+ errorMessage += `: finishReason=${finishReason}`;
846
+ if (finishReason === "MALFORMED_FUNCTION_CALL") {
847
+ errorMessage += " (Google could not generate valid function call arguments)";
848
+ } else if (finishReason === "SAFETY") {
849
+ errorMessage += " (blocked by safety filters)";
850
+ } else if (finishReason === "RECITATION") {
851
+ errorMessage += " (blocked due to recitation)";
852
+ } else if (finishReason === "MAX_TOKENS") {
853
+ errorMessage += " (response truncated due to max tokens)";
854
+ }
855
+ }
856
+ const error2 = new Error(errorMessage);
857
+ error2.finishReason = finishReason;
858
+ error2.safetyRatings = safetyRatings;
859
+ error2.usageMetadata = usageMetadata;
860
+ error2.modelVersion = modelVersion;
861
+ error2.candidateContent = candidate == null ? void 0 : candidate.content;
862
+ error2.promptFeedback = response.promptFeedback;
863
+ throw error2;
828
864
  }
829
865
  return {
830
866
  role: "assistant",
@@ -841,7 +877,38 @@ async function callGoogleAIWithRetries(identifier, payload, retries = 5) {
841
877
  return await callGoogleAI(identifier, payload);
842
878
  } catch (e) {
843
879
  lastError = e;
844
- logger_default.error(identifier, `Retry #${i} error: ${e.message}`, e);
880
+ const errorDetails = {
881
+ message: e.message,
882
+ finishReason: e.finishReason,
883
+ modelVersion: e.modelVersion
884
+ };
885
+ if (e.safetyRatings) {
886
+ errorDetails.safetyRatings = e.safetyRatings;
887
+ }
888
+ if (e.usageMetadata) {
889
+ errorDetails.usageMetadata = e.usageMetadata;
890
+ }
891
+ if (e.promptFeedback) {
892
+ errorDetails.promptFeedback = e.promptFeedback;
893
+ }
894
+ if (e.status || e.statusText) {
895
+ errorDetails.httpStatus = e.status;
896
+ errorDetails.httpStatusText = e.statusText;
897
+ }
898
+ if (e.code) {
899
+ errorDetails.errorCode = e.code;
900
+ }
901
+ if (e.details) {
902
+ errorDetails.errorDetails = e.details;
903
+ }
904
+ logger_default.error(identifier, `Retry #${i} error: ${e.message}`, errorDetails);
905
+ if (e.finishReason === "MALFORMED_FUNCTION_CALL" && i >= 3) {
906
+ logger_default.log(
907
+ identifier,
908
+ "Removing tools due to persistent MALFORMED_FUNCTION_CALL errors"
909
+ );
910
+ payload.tools = void 0;
911
+ }
845
912
  await timeout(125 * i);
846
913
  }
847
914
  }
@@ -849,6 +916,9 @@ async function callGoogleAIWithRetries(identifier, payload, retries = 5) {
849
916
  `Failed to call Google AI API after ${retries} attempts`
850
917
  );
851
918
  error2.cause = lastError;
919
+ error2.finishReason = lastError == null ? void 0 : lastError.finishReason;
920
+ error2.usageMetadata = lastError == null ? void 0 : lastError.usageMetadata;
921
+ error2.safetyRatings = lastError == null ? void 0 : lastError.safetyRatings;
852
922
  throw error2;
853
923
  }
854
924
  async function callWithRetries(identifier, aiPayload, aiConfig, retries = 5, chunkTimeoutMs = 15e3) {
@@ -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(\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":";;;;;;;;;AAAO,IAAK,cAAL,kBAAKA,iBAAL;AACL,EAAAA,aAAA,aAAU;AACV,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,YAAS;AACT,EAAAA,aAAA,gBAAa;AACb,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,YAAS;AACT,EAAAA,aAAA,gBAAa;AACb,EAAAA,aAAA,cAAW;AARD,SAAAA;AAAA,GAAA;AAWL,IAAK,WAAL,kBAAKC,cAAL;AACL,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,oBAAiB;AACjB,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,uBAAoB;AACpB,EAAAA,UAAA,uBAAoB;AACpB,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,iBAAc;AACd,EAAAA,UAAA,iBAAc;AACd,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,eAAY;AAhBF,SAAAA;AAAA,GAAA;AAmBL,IAAK,YAAL,kBAAKC,eAAL;AACL,EAAAA,WAAA,sBAAmB;AACnB,EAAAA,WAAA,mCAAgC;AAFtB,SAAAA;AAAA,GAAA;AAKL,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,oBAAiB;AACjB,EAAAA,aAAA,qBAAkB;AAClB,EAAAA,aAAA,sBAAmB;AACnB,EAAAA,aAAA,2CAAwC;AACxC,EAAAA,aAAA,mCAAgC;AAChC,EAAAA,aAAA,yCAAsC;AACtC,EAAAA,aAAA,oCAAiC;AACjC,EAAAA,aAAA,4BAAyB;AARf,SAAAA;AAAA,GAAA;;;AChCZ,SAAS,iBAAiB,YAAgC;AACxD,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,WAAO,WAAW,IAAI,CAAC,OAAO,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG;AAAA,EACnD;AACA,SAAO,IAAI,UAAU;AACvB;AAEA,SAAS,cACP,OACA,YACA,SACQ;AACR,SAAO,IAAI,KAAK,KAAK,iBAAiB,UAAU,CAAC,IAAI,OAAO;AAC9D;AAEO,SAAS,IACd,YACA,YACG,MACG;AACN,UAAQ,IAAI,cAAc,OAAO,YAAY,OAAO,GAAG,GAAG,IAAI;AAChE;AAEO,SAAS,KACd,YACA,YACG,MACG;AACN,UAAQ,KAAK,cAAc,QAAQ,YAAY,OAAO,GAAG,GAAG,IAAI;AAClE;AAEO,SAAS,MACd,YACA,YACG,MACG;AACN,UAAQ,MAAM,cAAc,SAAS,YAAY,OAAO,GAAG,GAAG,IAAI;AACpE;AAEA,IAAO,iBAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AACF;;;ACtBA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,OAAO,WAAW;;;AC5BX,SAAS,QAAQ,IAA2B;AACjD,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEO,SAAS,YAAY,MAAc,MAAwB;AAJlE;AAKE,QAAM,cAAY,UAAK,MAAM,GAAG,EAAE,IAAI,MAApB,mBAAuB,kBAAiB;AAC1D,SACE,CAAC,QAAQ,QAAQ,OAAO,EAAE,SAAS,SAAS,KAC5C,CAAC,EACC,QAAQ,CAAC,cAAc,cAAc,qBAAqB,EAAE,SAAS,IAAI;AAG/E;;;ADkBA,SAAS,mBAAmB;AAC5B,IAAM,EAAE,mBAAmB,IAAI,UAAQ,uBAAuB;AAE9D,IAAM,QAAQ,UAAQ,OAAO;AAC7B,IAAM,SAAS,UAAQ,aAAa;AAapC,SAAS,sBACP,YACA,WACA,kBACA,kBACA,sBACuB;AACvB,MAAI,eAAuD;AAC3D,MAAI,oBAAoB,kBAAkB;AACxC,QAAI,wBAAwB,CAAC,qBAAqB,IAAI,gBAAgB,GAAG;AACvE,YAAM,IAAI;AAAA,QACR,6DACE;AAAA,MACJ;AAAA,IACF;AAEA,QAAI;AACF,qBAAe;AAAA,QACb,MAAM;AAAA,QACN,WAAW,KAAK,MAAM,gBAAgB;AAAA,MACxC;AAAA,IACF,SAASC,QAAO;AACd,qBAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAMA;AAAA,IACR;AAAA,EACF;AAEA,MAAI,CAAC,aAAa,CAAC,cAAc;AAC/B,mBAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK,UAAU,EAAE,WAAW,kBAAkB,iBAAiB,CAAC;AAAA,IAClE;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,aAAa;AAAA,IACtB,eAAe;AAAA,IACf,OAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,sBACb,YACA,eACA,cACA,UAAkB,GAClB,iBAAyB,MACO;AAvGlC;AAwGE,iBAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,6CAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAEA,MAAI;AACJ,WAAS,IAAI,GAAG,KAAK,SAAS,KAAK;AACjC,QAAI;AACF,YAAM,UAAU,SAAS,UAAU,IAAI,KAAK,IAAI,CAAC,eAC/C,6CAAc,OAChB,IAAI,cAAc,KAAK,IAAI,6CAAc,KAAK;AAE9C,UACE,cAAc,qCACd,cAAc,yCACd;AACA,eAAO,MAAM,WAAW,YAAY,eAAe,YAAY;AAAA,MACjE,OAAO;AACL,eAAO,MAAM;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAASA,QAAY;AACnB,qBAAO;AAAA,QACL;AAAA,QACA,UAAU,CAAC,WAAWA,OAAM,OAAO;AAAA,UACnC,KAAAA,OAAM,aAAN,mBAAgB,SAAQA,OAAM,QAAQA;AAAA,MACxC;AAEA,YAAM,aAAY,KAAAA,OAAM,SAAN,mBAAY;AAG9B,UAAI,cAAc,4BAA4B;AAC5C,uBAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AACA,sBAAc,SAAS,QAAQ,CAAC,YAA2B;AACzD,cAAI,MAAM,QAAQ,QAAQ,OAAO,GAAG;AAClC,oBAAQ,UAAU,QAAQ,QAAQ;AAAA,cAChC,CAAC,YAAY,QAAQ,SAAS;AAAA,YAChC;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAIA,UACE,KAAK,MACL,6CAAc,aAAY,WAC1B,cAAc,kBACd;AACA,uBAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AACA,qBAAa,UAAU;AAAA,MACzB;AAGA,UAAI,MAAM,GAAG;AACX,aAAI,6CAAc,aAAY,SAAS;AACrC,yBAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AACA,uBAAa,UAAU;AAAA,QACzB;AAAA,MACF;AAGA,UAAI,MAAM,GAAG;AAEX,YAAI,cAAc,OAAO;AACvB,yBAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AACA,wBAAc,cAAc;AAAA,QAC9B;AAAA,MACF;AAEA,YAAM,QAAQ,GAAG;AAAA,IACnB;AAAA,EACF;AAEA,iBAAO;AAAA,IACL;AAAA,IACA,mCAAmC,OAAO;AAAA,IAC1C;AAAA,EACF;AACA,QAAM,IAAI;AAAA,IACR,GAAG,UAAU,qCAAqC,OAAO;AAAA,EAC3D;AACF;AAEA,eAAe,iBACb,YACA,eACA,cACA,gBACgC;AAnNlC;AAoNE,QAAM,gBAAoC,cAAc,QACpD,IAAI,IAAI,cAAc,MAAM,IAAI,CAAC,OAAO,GAAG,SAAS,IAAc,CAAC,IACnE;AAEJ,MAAI,CAAC,cAAc;AACjB,mBAAe;AAAA,MACb,SAAS;AAAA,MACT,QAAQ,QAAQ,IAAI;AAAA,MACpB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI;AACJ,QAAM,aAAa,IAAI,gBAAgB;AACvC,MAAI,aAAa,YAAY,SAAS;AACpC,mBAAO,IAAI,YAAY,8BAA8B,cAAc,KAAK;AACxE,UAAM,QAAQ,cAAc;AAE5B,QAAI,CAAC,aAAa,gBAAgB;AAChC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,aAAa,eAAe,KAAK;AACrD,QAAI;AACJ,QAAI,YAAY,UAAU;AACxB,iBAAW,GAAG,YAAY,QAAQ,uBAAuB,YAAY,UAAU,iCAAiC,YAAY,UAAU;AAAA,IACxI,OAAO;AACL,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,mBAAO,IAAI,YAAY,kBAAkB,QAAQ;AAEjD,QAAI;AACF,YAAM,qBAAqB,KAAK,UAAU;AAAA,QACxC,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,gBAAgB,KAAK,MAAM,kBAAkB;AAAA,IACrD,SAASA,QAAO;AACd,qBAAO;AAAA,QACL;AAAA,QACA;AAAA,QACAA;AAAA,MACF;AAAA,IACF;AAEA,eAAW,MAAM,MAAM,UAAU;AAAA,MAC/B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,WAAW,YAAY;AAAA,MACzB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AAAA,MACD,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH,OAAO;AAEL,mBAAO,IAAI,YAAY,wBAAwB,cAAc,KAAK;AAClE,UAAM,WAAW;AACjB,QAAI,aAAa,OAAO;AACtB,qBAAO,IAAI,YAAY,eAAe,aAAa,KAAK;AAAA,IAC1D;AAEA,eAAW,MAAM,MAAM,UAAU;AAAA,MAC/B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,aAAa,MAAM;AAAA,QAC5C,GAAI,aAAa,QACb,EAAE,uBAAuB,aAAa,MAAM,IAC5C,CAAC;AAAA,MACP;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AAAA,MACD,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,MAAM;AACjB,QAAI,kBAAkB;AACtB,QAAI,YAAY;AAChB,QAAI,mBAAmB;AACvB,QAAI,mBAAmB;AAEvB,UAAM,SAAS,SAAS,KAAK,UAAU;AAEvC,QAAI,eAAe;AACnB,QAAI,eAAsC;AAC1C,UAAM,oBAAoB,MAAM;AAC9B,sBAAgB,aAAa,YAAY;AACzC,aAAO,WAAW,MAAM;AACtB,uBAAO,MAAM,YAAY,wBAAwB,cAAc,IAAI;AACnE,mBAAW,MAAM;AAAA,MACnB,GAAG,cAAc;AAAA,IACnB;AAEA,QAAI,aAAa;AACjB,WAAO,MAAM;AACX;AACA,YAAMC,gBAAe,kBAAkB;AACvC,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,mBAAaA,aAAY;AAEzB,UAAI,MAAM;AACR,uBAAO;AAAA,UACL;AAAA,UACA,kCAAkC,aAAa,CAAC;AAAA,QAClD;AACA,cAAM,IAAI,MAAM,iCAAiC;AAAA,MACnD;AAEA,UAAI,QAAQ,IAAI,YAAY,EAAE,OAAO,KAAK;AAC1C,yBAAmB,QAAQ;AAC3B,UAAI,cAAc;AAChB,gBAAQ,eAAe;AACvB,uBAAe;AAAA,MACjB;AACA,UAAI,cAAc,MAAM,MAAM,WAAW;AAEzC,eAAS,cAAc,aAAa;AAClC,YAAI,CAAC,YAAY;AACf;AAAA,QACF;AAEA,YAAI,WAAW,SAAS,QAAQ,GAAG;AACjC,cAAI;AACF,mBAAO;AAAA,cACL;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF,SAASD,QAAO;AACd,2BAAO,MAAM,YAAY,gCAAgC;AACzD,kBAAMA;AAAA,UACR;AAAA,QACF;AAEA,YAAI;AACJ,YAAI;AACF,iBAAO,KAAK,MAAM,WAAW,KAAK,CAAC;AAAA,QACrC,SAASA,QAAY;AACnB,yBAAe;AACf;AAAA,QACF;AAEA,YAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,QAAQ;AACzC,cAAI,KAAK,OAAO;AACd,2BAAO,MAAM,YAAY,+BAA+B,KAAK,KAAK;AAClE,kBAAMA,SAAQ,IAAI,MAAM,4BAA4B;AACpD,YAAAA,OAAM,OAAO,KAAK;AAClB,YAAAA,OAAM,cAAc,gBAAgB,aAAa;AACjD,kBAAMA;AAAA,UACR;AACA,cAAI,eAAe,GAAG;AACpB,2BAAO,MAAM,YAAY,qCAAqC,IAAI;AAAA,UACpE;AACA;AAAA,QACF;AAEA,cAAM,aAQU,4BAAK,YAAL,mBAAe,OAAf,mBAAmB,UAAnB,mBAA0B,eAA1B,mBAAuC;AACvD,YAAI,WAAW;AACb,gBAAM,gBAAgB,UAAU,SAAS;AAEzC,cAAI,kBAAkB,GAAG;AACvB,kBAAM,MAAM,UAAU,YAAY,CAAC;AACnC,gBAAI,IAAI;AAAM,kCAAoB,IAAI;AACtC,gBAAI,IAAI;AAAW,kCAAoB,IAAI;AAAA,UAC7C;AAAA,QACF;AAEA,cAAM,QAAO,sBAAK,YAAL,mBAAe,OAAf,mBAAmB,UAAnB,mBAA0B;AACvC,YAAI,MAAM;AACR,uBAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AACF;AAEA,eAAe,WACb,YACA,eACA,cACgC;AAChC,QAAM,gBAAoC,cAAc,QACpD,IAAI,IAAI,cAAc,MAAM,IAAI,CAAC,OAAO,GAAG,SAAS,IAAc,CAAC,IACnE;AAEJ,MAAI,CAAC,cAAc;AACjB,mBAAe;AAAA,MACb,SAAS;AAAA,MACT,QAAQ,QAAQ,IAAI;AAAA,MACpB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,aAAa,YAAY,SAAS;AACpC,mBAAO,IAAI,YAAY,8BAA8B,cAAc,KAAK;AACxE,UAAM,QAAQ,cAAc;AAE5B,QAAI,CAAC,aAAa,gBAAgB;AAChC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,aAAa,eAAe,KAAK;AACrD,QAAI;AACJ,QAAI,YAAY,UAAU;AACxB,iBAAW,GAAG,YAAY,QAAQ,uBAAuB,YAAY,UAAU,iCAAiC,YAAY,UAAU;AAAA,IACxI,OAAO;AACL,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,mBAAO,IAAI,YAAY,kBAAkB,QAAQ;AAEjD,QAAI;AACF,YAAM,qBAAqB,KAAK,UAAU;AAAA,QACxC,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,gBAAgB,KAAK,MAAM,kBAAkB;AAAA,IAErD,SAASA,QAAO;AACd,qBAAO,MAAM,YAAY,8BAA8BA,MAAK;AAC5D,YAAMA;AAAA,IACR;AAEA,eAAW,MAAM,MAAM,UAAU;AAAA,MAC/B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,WAAW,YAAY;AAAA,MACzB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH,OAAO;AAEL,mBAAO,IAAI,YAAY,wBAAwB,cAAc,KAAK;AAClE,UAAM,WAAW;AACjB,QAAI,aAAa,OAAO;AACtB,qBAAO,IAAI,YAAY,eAAe,aAAa,KAAK;AAAA,IAC1D;AAEA,eAAW,MAAM,MAAM,UAAU;AAAA,MAC/B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,aAAa,MAAM;AAAA,QAC5C,GAAI,aAAa,QACb,EAAE,uBAAuB,aAAa,MAAM,IAC5C,CAAC;AAAA,MACP;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK;AACtC,mBAAO,MAAM,YAAY,qBAAqB,SAAS;AACvD,UAAM,IAAI,MAAM,qBAAqB,UAAU,MAAM,OAAO,EAAE;AAAA,EAChE;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,MAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,QAAQ;AACzC,QAAI,KAAK,OAAO;AACd,qBAAO,MAAM,YAAY,iBAAiB,KAAK,KAAK;AACpD,YAAM,IAAI,MAAM,mBAAmB,KAAK,MAAM,OAAO;AAAA,IACvD;AACA,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAEA,QAAM,SAAS,KAAK,QAAQ,CAAC;AAC7B,QAAM,eAAe,OAAO,gBACxB;AAAA,IACE,MAAM,OAAO,cAAc;AAAA,IAC3B,WAAW,KAAK,MAAM,OAAO,cAAc,SAAS;AAAA,EACtD,IACA;AAEJ,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,OAAO,QAAQ,WAAW;AAAA,IACnC,eAAe;AAAA,IACf,OAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,gBAAgB,SAAgC;AACvD,SAAO,KAAK;AAAA,IACV;AAAA,MACE,GAAG;AAAA,MACH,UAAU,QAAQ,SAAS,IAAI,CAAC,YAAY;AAC1C,YAAI,OAAO,QAAQ,YAAY,UAAU;AACvC,kBAAQ,UAAU,QAAQ,QAAQ,MAAM,GAAG,GAAG;AAAA,QAChD,WAAW,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACzC,kBAAQ,UAAU,QAAQ,QAAQ,IAAI,CAAC,UAAU;AAC/C,gBAAI,MAAM,SAAS,aAAa;AAC9B,oBAAM,UAAU,MAAM,MAAM,UAAU,IAAI,MAAM,GAAG,GAAG;AAAA,YACxD;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AAEA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,yBACb,YACA,WACA,UACA,WAAW,GACqB;AA1iBlC;AA2iBE,iBAAO,IAAI,YAAY,oCAAoC;AAC3D,MAAI;AACJ,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,QAAI;AACF,qBAAe,MAAM,cAAc,YAAY,WAAW,QAAQ;AAClE,aAAO;AAAA,IACT,SAAS,GAAQ;AACf,qBAAO;AAAA,QACL;AAAA,QACA,UAAU,CAAC,WAAW,EAAE,OAAO;AAAA,UAC/B,OAAE,aAAF,mBAAY,SAAQ;AAAA,MACtB;AAEA,YAAI,mBAAE,aAAF,mBAAY,SAAZ,mBAAkB,UAAlB,mBAAyB,UAAS,oBAAoB;AAAA,MAE1D;AAEA,YAAM,QAAQ,MAAM,CAAC;AAAA,IACvB;AAAA,EACF;AACA,QAAMA,SAAQ,IAAI;AAAA,IAChB,sCAAsC,QAAQ;AAAA,EAChD;AACA,EAAAA,OAAM,WAAW;AACjB,QAAMA;AACR;AAEA,eAAe,cACb,YACA,WACA,UACgC;AA1kBlC;AA2kBE,QAAM,oBAAoB,qBAAqB,UAAU,QAAQ;AAEjE,MAAI;AACJ,MAAI;AACJ,OAAI,qCAAU,aAAY,WAAW;AAEnC,UAAM,aAAa;AACnB,UAAM,WAAW;AAMjB,UAAM,SAAS,IAAI,qBAAqB,EAAE,QAAQ,WAAW,CAAC;AAC9D,UAAM,UAAU;AAAA,MACd,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,QAAO,eAAU,cAAV,mBAAqB,IAAI,CAAC,OAAO;AAAA,QACtC,GAAG;AAAA,QACH,cAAc,EAAE;AAAA,QAChB,YAAY;AAAA,MACd;AAAA,IACF;AAEA,UAAME,YAAW,MAAM,OAAO;AAAA,MAC5B,IAAI,mBAAmB;AAAA,QACrB,aAAa;AAAA,QACb,MAAM,KAAK,UAAU,OAAO;AAAA,QAC5B,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,sBAAsB,IAAI,YAAY,EAAE,OAAOA,UAAS,IAAI;AAClE,WAAO,KAAK,MAAM,mBAAmB;AAAA,EACvC,OAAO;AAEL,UAAMA,YAAW,MAAM,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,OAAO,UAAU;AAAA,QACjB,UAAU;AAAA,QACV,QAAO,eAAU,cAAV,mBAAqB,IAAI,CAAC,OAAO;AAAA,UACtC,GAAG;AAAA,UACH,cAAc,EAAE;AAAA,UAChB,YAAY;AAAA,QACd;AAAA,QACA,aAAa,UAAU;AAAA,QACvB,QAAQ,UAAU;AAAA,QAClB,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,aAAa,QAAQ,IAAI;AAAA,UACzB,qBAAqB;AAAA,UACrB,kBAAkB;AAAA,QACpB;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAOA,UAAS;AAAA,EAClB;AAEA,QAAM,UAAU,KAAK;AAErB,MAAI,CAAC,QAAQ,CAAC,GAAG;AACf,mBAAO,MAAM,YAAY,oCAAoC,IAAI;AACjE,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,MAAI,eAAe;AACnB,MAAI,gBAAuB,CAAC;AAC5B,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,MAAM;AAChB,qBAAO,MAAM,YAAY,yCAAyC,IAAI;AACtE,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAEA,QAAI,OAAO;AACX,QAAI,OAAO,SAAS,QAAQ;AAC1B,aAAO,OAAO,KACX,QAAQ,+BAA+B,EAAE,EACzC,QAAQ,yBAAyB,EAAE,EACnC,KAAK;AAER,UAAI,CAAC,MAAM;AAET,eAAO,OAAO,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,QACF;AACA,uBAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,wBAAgB;AAAA;AAAA,EAAO,IAAI;AAAA,MAC7B,OAAO;AACL,uBAAe;AAAA,MACjB;AAAA,IACF,WAAW,OAAO,SAAS,YAAY;AACrC,YAAM,OAAO;AAAA,QACX,MAAM,OAAO;AAAA,QACb,WAAW,OAAO;AAAA,MACpB;AACA,oBAAc,KAAK,IAAI;AAAA,IACzB;AAAA,EACF;AAEA,MAAI,CAAC,gBAAgB,CAAC,cAAc,QAAQ;AAC1C,mBAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,eAAe,cAAc,CAAC;AAAA,IAC9B,OAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,qBACP,UACsB;AAhtBxB;AAotBE,MAAI,iBAAiB,SAAS,MAAM;AAGpC,QAAI,oBAAe,CAAC,MAAhB,mBAAmB,UAAS,QAAQ;AACtC,qBAAiB;AAAA,MACf;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF;AAGA,mBAAiB,eAAe,OAAO,CAAC,KAAK,YAAY;AACvD,QAAI,IAAI,WAAW,GAAG;AACpB,aAAO,CAAC,OAAO;AAAA,IACjB;AAEA,UAAM,cAAc,IAAI,IAAI,SAAS,CAAC;AACtC,QAAI,YAAY,SAAS,QAAQ,MAAM;AAErC,YAAM,cAAc,MAAM,QAAQ,YAAY,OAAO,IACjD,YAAY,UACZ,CAAC,EAAE,MAAM,QAAiB,MAAM,YAAY,QAAQ,CAAC;AACzD,YAAM,aAAa,MAAM,QAAQ,QAAQ,OAAO,IAC5C,QAAQ,UACR,CAAC,EAAE,MAAM,QAAiB,MAAM,QAAQ,QAAQ,CAAC;AAErD,kBAAY,UAAU;AAAA,QACpB,GAAG;AAAA,QACH,EAAE,MAAM,QAAQ,MAAM,cAAc;AAAA,QACpC,GAAG;AAAA,MACL;AACA,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,QAAQ,YAAY,UAAU;AACvC,cAAQ,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAAA,IAC5D;AAEA,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB,GAAG,CAAC,CAAyB;AAG7B,QAAI,oBAAe,eAAe,SAAS,CAAC,MAAxC,mBAA2C,UAAS,aAAa;AACnE,mBAAe,KAAK;AAAA,MAClB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,UAAgD;AA5wB3E;AA6wBE,MAAI,iBAAiB,SAAS,MAAM;AAGpC,QAAI,oBAAe,CAAC,MAAhB,mBAAmB,UAAS,SAAS;AACvC,qBAAiB;AAAA,MACf;AAAA,QACE,MAAM;AAAA,QACN,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;AAAA,MACzB;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF;AAGA,mBAAiB,eAAe,OAAO,CAAC,KAAK,YAAY;AACvD,QAAI,IAAI,WAAW,GAAG;AACpB,aAAO,CAAC,OAAO;AAAA,IACjB;AAEA,UAAM,cAAc,IAAI,IAAI,SAAS,CAAC;AACtC,QAAI,YAAY,SAAS,QAAQ,MAAM;AACrC,kBAAY,QAAQ,CAAC,GAAG,YAAY,OAAO,GAAG,QAAQ,KAAK;AAC3D,aAAO;AAAA,IACT;AAEA,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB,GAAG,CAAC,CAAsB;AAG1B,QAAI,oBAAe,eAAe,SAAS,CAAC,MAAxC,mBAA2C,UAAS,SAAS;AAC/D,mBAAe,KAAK;AAAA,MAClB,MAAM;AAAA,MACN,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAe,uBACb,SAC0B;AAtzB5B;AAuzBE,QAAM,kBAAmC;AAAA,IACvC,OAAO,QAAQ;AAAA,IACf,UAAU,CAAC;AAAA,IACX,OAAO,QAAQ,YACX;AAAA,MACE,sBAAsB,QAAQ,UAAU,IAAI,CAAC,QAAQ;AAAA,QACnD,MAAM,GAAG;AAAA,QACT,YAAY;AAAA;AAAA,UAEV,aAAa,GAAG;AAAA,UAChB,GAAG,GAAG;AAAA,QACR;AAAA,MACF,EAAE;AAAA,IACJ,IACA;AAAA,EACN;AAEA,aAAW,WAAW,QAAQ,UAAU;AACtC,QAAI,QAAQ,SAAS,UAAU;AAC7B,sBAAgB,oBAAoB,QAAQ;AAC5C;AAAA,IACF;AAEA,UAAM,uBAAuC,CAAC;AAE9C,QAAI,QAAQ,SAAS;AACnB,2BAAqB,KAAK;AAAA,QACxB,MAAM,QAAQ;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,eAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACtC,UAAI,GAAC,UAAK,aAAL,mBAAe,WAAW,WAAU;AACvC,uBAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAI,KAAK,KAAK;AACZ,6BAAqB,KAAK;AAAA,UACxB,YAAY;AAAA,YACV,UAAU;AAAA,YACV,MAAM,MAAM,uBAAuB,KAAK,KAAK,KAAK,QAAQ;AAAA,UAC5D;AAAA,QACF,CAAC;AAED,6BAAqB,KAAK;AAAA,UACxB,MAAM,cAAc,KAAK,GAAG;AAAA,QAC9B,CAAC;AAAA,MACH,WAAW,KAAK,MAAM;AACpB,YACE,CAAC,CAAC,aAAa,cAAc,aAAa,YAAY,EAAE;AAAA,UACtD,KAAK;AAAA,QACP,GACA;AACA,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,6BAAqB,KAAK;AAAA,UACxB,YAAY;AAAA,YACV,UAAU,KAAK;AAAA,YACf,MAAM,KAAK;AAAA,UACb;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,oBAAgB,SAAS,KAAK;AAAA,MAC5B,MAAM,QAAQ,SAAS,cAAc,UAAU,QAAQ;AAAA,MACvD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAe,aACb,YACA,SACgC;AAz4BlC;AA04BE,QAAM,iBAAiB,kBAAkB,QAAQ,QAAQ;AAEzD,QAAM,UAAU,eAAe,MAAM,GAAG,EAAE;AAC1C,QAAM,cAAc,eAAe,MAAM,EAAE,EAAE,CAAC;AAE9C,QAAM,QAAQ,IAAI,YAAY;AAAA,IAC5B,QAAQ,QAAQ,IAAI;AAAA,EACtB,CAAC;AAED,QAAM,OAAO,MAAM,MAAM,OAAO;AAAA,IAC9B,OAAO,QAAQ;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,MACN,oBAAoB,CAAC,MAAM;AAAA,MAC3B,OAAO,QAAQ,QAAQ,CAAC,QAAQ,KAAK,IAAI;AAAA,MACzC,mBAAmB,QAAQ;AAAA,IAC7B;AAAA,EACF,CAAC;AAED,QAAM,WAAW,MAAM,KAAK,YAAY;AAAA,IACtC,SAAS,YAAY;AAAA,EACvB,CAAC;AAED,MAAI,OAAe;AACnB,QAAM,QAAgB,CAAC;AAEvB,aAAW,UAAQ,0BAAS,eAAT,mBAAsB,OAAtB,mBAA0B,YAA1B,mBAAmC,UAAS,CAAC,GAAG;AACjE,QAAI,KAAK,MAAM;AACb,cAAQ,KAAK;AAAA,IACf;AAEA,QAAI,KAAK,YAAY;AACnB,YAAM,YAAY,KAAK,WAAW;AAClC,UAAI,WAAW;AACb,cAAM,KAAK;AAAA,UACT,UAAU;AAAA,UACV,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAKU,SAAS;AAEzB,QAAM,sBAAsB,+CAAe,IAAI,CAAC,OAAI;AA37BtD,QAAAC,KAAAC;AA27B0D;AAAA,MACtD,OAAMD,MAAA,GAAG,SAAH,OAAAA,MAAW;AAAA,MACjB,YAAWC,MAAA,GAAG,SAAH,OAAAA,MAAW,CAAC;AAAA,IACzB;AAAA;AAEA,MAAI,CAAC,QAAQ,EAAC,2DAAqB,WAAU,CAAC,MAAM,QAAQ;AAC1D,mBAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA,gBAAe,2DAAsB,OAAM;AAAA,EAC7C;AACF;AAEA,eAAe,wBACb,YACA,SACA,UAAkB,GACc;AAChC,iBAAO,IAAI,YAAY,oCAAoC;AAE3D,MAAI;AACJ,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,QAAI;AACF,aAAO,MAAM,aAAa,YAAY,OAAO;AAAA,IAC/C,SAAS,GAAQ;AACf,kBAAY;AACZ,qBAAO,MAAM,YAAY,UAAU,CAAC,WAAW,EAAE,OAAO,IAAI,CAAC;AAK7D,YAAM,QAAQ,MAAM,CAAC;AAAA,IACvB;AAAA,EACF;AACA,QAAMJ,SAAQ,IAAI;AAAA,IAChB,sCAAsC,OAAO;AAAA,EAC/C;AACA,EAAAA,OAAM,QAAQ;AACd,QAAMA;AACR;AAEA,eAAsB,gBACpB,YACA,WACA,UACA,UAAkB,GAClB,iBAAyB,MACO;AAChC,QAAM,KAAK;AAEX,MAAI,mBAAmB,SAAS,GAAG;AACjC,WAAO,MAAM;AAAA,MACX;AAAA,MACA,MAAM,wBAAwB,SAAS;AAAA,MACvC;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,gBAAgB,SAAS,GAAG;AACrC,WAAO,MAAM;AAAA,MACX;AAAA,MACA,MAAM,qBAAqB,SAAS;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,cAAc,SAAS,GAAG;AACnC,WAAO,MAAM,oBAAoB,IAAI,MAAM,mBAAmB,SAAS,CAAC;AAAA,EAC1E,WAAW,kBAAkB,SAAS,GAAG;AACvC,WAAO,MAAM;AAAA,MACX;AAAA,MACA,MAAM,uBAAuB,SAAS;AAAA,MACtC;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AACF;AAEA,SAAS,mBAAmB,SAAuB;AACjD,SAAO,OAAO,OAAO,WAAW,EAAE,SAAS,QAAQ,KAAK;AAC1D;AAEA,eAAe,wBACb,SAC6B;AAxhC/B;AAyhCE,QAAM,kBAAsC;AAAA,IAC1C,OAAO,QAAQ;AAAA,IACf,UAAU,CAAC;AAAA,IACX,WAAW,QAAQ;AAAA,IACnB,aAAa,QAAQ;AAAA,EACvB;AAEA,aAAW,WAAW,QAAQ,UAAU;AACtC,UAAM,yBAAkD,CAAC;AAEzD,QAAI,QAAQ,SAAS,UAAU;AAC7B,sBAAgB,SAAS,QAAQ;AACjC;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS;AACnB,6BAAuB,KAAK;AAAA,QAC1B,MAAM;AAAA,QACN,MAAM,QAAQ;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,eAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACtC,UAAI,GAAC,UAAK,aAAL,mBAAe,WAAW,WAAU;AACvC,uBAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAI,KAAK,KAAK;AACZ,+BAAuB,KAAK;AAAA,UAC1B,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,MAAM,MAAM,uBAAuB,KAAK,KAAK,KAAK,QAAQ;AAAA,UAC5D;AAAA,QACF,CAAC;AAAA,MACH,WAAW,KAAK,MAAM;AACpB,YACE,CAAC,CAAC,aAAa,cAAc,aAAa,YAAY,EAAE;AAAA,UACtD,KAAK;AAAA,QACP,GACA;AACA,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,+BAAuB,KAAK;AAAA,UAC1B,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,YAAY,KAAK;AAAA,YACjB,MAAM,KAAK;AAAA,UACb;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,oBAAgB,SAAS,KAAK;AAAA,MAC5B,MAAM,QAAQ;AAAA,MACd,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAAuB;AAC9C,SAAO,OAAO,OAAO,QAAQ,EAAE,SAAS,QAAQ,KAAK;AACvD;AAEA,eAAe,qBACb,SACwB;AArmC1B;AAsmCE,QAAM,kBAAiC;AAAA,IACrC,OAAO,QAAQ;AAAA,IACf,UAAU,CAAC;AAAA,IACX,QAAO,aAAQ,cAAR,mBAAmB,IAAI,CAAC,QAAQ;AAAA,MACrC,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,aAAa,QAAQ,gBACjB,OAAO,QAAQ,kBAAkB,WAC/B,QAAQ,gBACR;AAAA,MACE,MAAM;AAAA,MACN,UAAU,QAAQ;AAAA,IACpB,IACF;AAAA,EACN;AAEA,aAAW,WAAW,QAAQ,UAAU;AACtC,UAAM,sBAA4C,CAAC;AAEnD,QAAI,QAAQ,SAAS;AACnB,0BAAoB,KAAK;AAAA,QACvB,MAAM;AAAA,QACN,MAAM,QAAQ;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,UAAM,uBAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACtC,UAAI,qBAAqB,SAAS,KAAK,QAAQ,GAAG;AAChD,YAAI,KAAK,KAAK;AACZ,8BAAoB,KAAK;AAAA,YACvB,MAAM;AAAA,YACN,WAAW;AAAA,cACT,KAAK,KAAK;AAAA,YACZ;AAAA,UACF,CAAC;AAED,8BAAoB,KAAK;AAAA,YACvB,MAAM;AAAA,YACN,MAAM,cAAc,KAAK,GAAG;AAAA,UAC9B,CAAC;AAAA,QACH,WAAW,KAAK,MAAM;AACpB,8BAAoB,KAAK;AAAA,YACvB,MAAM;AAAA,YACN,WAAW;AAAA,cACT,KAAK,QAAQ,KAAK,QAAQ,WAAW,KAAK,IAAI;AAAA,YAChD;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MAiBF,OAAO;AACL,uBAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,oBAAgB,SAAS,KAAK;AAAA,MAC5B,MAAM,QAAQ;AAAA,MACd,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,SAAuB;AAC5C,SAAO,OAAO,OAAO,SAAS,EAAE,SAAS,QAAQ,KAAK;AACxD;AAEA,SAAS,mBAAmB,SAAsC;AApsClE;AAqsCE,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,UAAU,QAAQ,SAAS,IAAI,CAAC,aAAa;AAAA,MAC3C,MAAM,QAAQ;AAAA,MACd,SAAS,wBAAwB,QAAQ,OAAO;AAAA,IAClD,EAAE;AAAA,IACF,QAAO,aAAQ,cAAR,mBAAmB,IAAI,CAAC,QAAQ;AAAA,MACrC,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,aAAa,QAAQ,gBACjB,OAAO,QAAQ,kBAAkB,WAC/B,QAAQ,gBACR;AAAA,MACE,MAAM;AAAA,MACN,UAAU,QAAQ;AAAA,IACpB,IACF;AAAA,IACJ,aAAa,QAAQ;AAAA,EACvB;AACF;AAEA,SAAS,wBACP,SACQ;AACR,SAAO,MAAM,QAAQ,OAAO,IACxB,QACG,IAAI,CAAC,MAAO,EAAE,SAAS,SAAS,EAAE,OAAO,IAAI,EAAE,IAAI,GAAI,EACvD,KAAK,IAAI,IACZ;AACN;AAEA,SAAS,kBAAkB,SAAuB;AAChD,SAAO,OAAO,OAAO,WAAW,EAAE,SAAS,QAAQ,KAAK;AAC1D;AAEA,eAAe,SACb,YACA,SACgC;AAChC,QAAM,WAAW,MAAM,MAAM;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,QAAQ,IAAI,YAAY;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,SAAS;AAEtB,QAAM,SAAS,KAAK,QAAQ,CAAC,EAAE;AAC/B,MAAI,CAAC,QAAQ;AACX,mBAAO,MAAM,YAAY,+BAA+B,IAAI;AAC5D,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,QAAM,eAAe,OAAO,WAAW;AACvC,MAAI,eAAoC;AACxC,MAAI,OAAO,cAAc,OAAO,WAAW,QAAQ;AACjD,UAAM,WAAW,OAAO,WAAW,CAAC;AACpC,mBAAe;AAAA,MACb,MAAM,SAAS,SAAS;AAAA,MACxB,WAAW,KAAK,MAAM,SAAS,SAAS,SAAS;AAAA,IACnD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,eAAe;AAAA,IACf,OAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,oBACb,YACA,SACA,UAAkB,GACc;AAtxClC;AAuxCE,iBAAO,IAAI,YAAY,+BAA+B;AAEtD,MAAI;AACJ,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,QAAI;AACF,qBAAe,MAAM,SAAS,YAAY,OAAO;AACjD,aAAO;AAAA,IACT,SAAS,GAAQ;AACf,qBAAO;AAAA,QACL;AAAA,QACA,UAAU,CAAC,WAAW,EAAE,OAAO;AAAA,UAC/B,OAAE,aAAF,mBAAY,SAAQ;AAAA,MACtB;AAEA,YAAM,QAAQ,MAAM,CAAC;AAAA,IACvB;AAAA,EACF;AACA,QAAMA,SAAQ,IAAI;AAAA,IAChB,iCAAiC,OAAO;AAAA,EAC1C;AACA,EAAAA,OAAM,WAAW;AACjB,QAAMA;AACR;AAEA,eAAe,uBACb,KACA,MACiB;AACjB,QAAM,WAAW,MAAM,MAAM,IAAI,KAAK,EAAE,cAAc,cAAc,CAAC;AAErE,MAAI,cAAc,OAAO,KAAK,SAAS,IAAI;AAC3C,MAAI,eAAe,CAAC;AACpB,MAAI,YAAY,KAAK,IAAI,GAAG;AAC1B,UAAM,YAAY,MAAM,OAAO,EAAE,QAAQ,YAAY,CAAC;AACtD,kBAAc,OAAO,KAAK,UAAU,IAAI;AACxC,mBAAe;AAAA,MACb,KAAK;AAAA,QACH,OAAO,UAAU;AAAA,QACjB,QAAQ,UAAU;AAAA,QAClB,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,MAAM,MAAM,aAAa,YAAY,EACxD,aAAa,EACb,OAAO,MAAM,MAAM,EAAE,KAAK,UAAU,oBAAoB,KAAK,CAAC,EAC9D,IAAI,EACJ,SAAS;AAEZ,SAAO,cAAc,SAAS,QAAQ;AACxC;","names":["ClaudeModel","GPTModel","GroqModel","GeminiModel","error","abortTimeout","response","_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 HAIKU_3_5 = \"claude-3-5-haiku-20241022\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\n OPUS_4_1 = \"claude-opus-4-1\",\n HAIKU_4_5 = \"claude-haiku-4-5\",\n SONNET_4_5 = \"claude-sonnet-4-5\",\n OPUS_4_5 = \"claude-opus-4-5\",\n}\n\nexport enum GPTModel {\n GPT35_0613 = \"gpt-3.5-turbo-0613\",\n GPT35_0613_16K = \"gpt-3.5-turbo-16k-0613\",\n GPT35_0125 = \"gpt-3.5-turbo-0125\",\n GPT4_1106_PREVIEW = \"gpt-4-1106-preview\",\n GPT4_0125_PREVIEW = \"gpt-4-0125-preview\",\n GPT4_0409 = \"gpt-4-turbo-2024-04-09\",\n GPT4O = \"gpt-4o\",\n GPT4O_MINI = \"gpt-4o-mini\",\n O1_PREVIEW = \"o1-preview\",\n O1_MINI = \"o1-mini\",\n O3_MINI = \"o3-mini\",\n GPT4_1 = \"gpt-4.1\",\n GPT4_1_MINI = \"gpt-4.1-mini\",\n GPT4_1_NANO = \"gpt-4.1-nano\",\n GPT5 = \"gpt-5\",\n GPT5_MINI = \"gpt-5-mini\",\n}\n\nexport enum GroqModel {\n LLAMA_3_70B_8192 = \"llama3-70b-8192\",\n DEEPSEEK_R1_DISTILL_LLAMA_70B = \"deepseek-r1-distill-llama-70b\",\n}\n\nexport enum GeminiModel {\n GEMINI_1_5_PRO = \"gemini-1.5-pro-latest\",\n GEMINI_EXP_1206 = \"gemini-exp-1206\",\n GEMINI_2_0_FLASH = \"gemini-2.0-flash\",\n GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION = \"gemini-2.0-flash-exp-image-generation\",\n GEMINI_2_0_FLASH_THINKING_EXP = \"gemini-2.0-flash-thinking-exp\",\n GEMINI_2_0_FLASH_THINKING_EXP_01_21 = \"gemini-2.0-flash-thinking-exp-01-21\",\n GEMINI_2_5_FLASH_PREVIEW_04_17 = \"gemini-2.5-flash-preview-04-17\",\n GEMINI_3_FLASH_PREVIEW = \"gemini-3-flash-preview\",\n}\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 const candidate = response.candidates?.[0];\n const finishReason = candidate?.finishReason;\n const safetyRatings = candidate?.safetyRatings;\n const usageMetadata = response.usageMetadata;\n const modelVersion = response.modelVersion;\n\n logger.error(\n identifier,\n \"Missing text & fns in Google AI API response:\",\n {\n finishReason,\n safetyRatings,\n usageMetadata,\n modelVersion,\n candidateContent: candidate?.content,\n promptFeedback: response.promptFeedback,\n fullResponse: JSON.stringify(response),\n }\n );\n\n // Create a more descriptive error message based on the finish reason\n let errorMessage = \"Missing text & fns in Google AI API response\";\n if (finishReason) {\n errorMessage += `: finishReason=${finishReason}`;\n if (finishReason === \"MALFORMED_FUNCTION_CALL\") {\n errorMessage += \" (Google could not generate valid function call arguments)\";\n } else if (finishReason === \"SAFETY\") {\n errorMessage += \" (blocked by safety filters)\";\n } else if (finishReason === \"RECITATION\") {\n errorMessage += \" (blocked due to recitation)\";\n } else if (finishReason === \"MAX_TOKENS\") {\n errorMessage += \" (response truncated due to max tokens)\";\n }\n }\n\n const error = new Error(errorMessage) as any;\n error.finishReason = finishReason;\n error.safetyRatings = safetyRatings;\n error.usageMetadata = usageMetadata;\n error.modelVersion = modelVersion;\n error.candidateContent = candidate?.content;\n error.promptFeedback = response.promptFeedback;\n throw error;\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\n // Log structured error details from Google AI\n const errorDetails: Record<string, any> = {\n message: e.message,\n finishReason: e.finishReason,\n modelVersion: e.modelVersion,\n };\n\n // Include safety ratings if present\n if (e.safetyRatings) {\n errorDetails.safetyRatings = e.safetyRatings;\n }\n\n // Include usage metadata if present\n if (e.usageMetadata) {\n errorDetails.usageMetadata = e.usageMetadata;\n }\n\n // Include prompt feedback if present (useful for blocked prompts)\n if (e.promptFeedback) {\n errorDetails.promptFeedback = e.promptFeedback;\n }\n\n // Include HTTP error details if present (from SDK errors)\n if (e.status || e.statusText) {\n errorDetails.httpStatus = e.status;\n errorDetails.httpStatusText = e.statusText;\n }\n\n // Include error code/details from Google API errors\n if (e.code) {\n errorDetails.errorCode = e.code;\n }\n if (e.details) {\n errorDetails.errorDetails = e.details;\n }\n\n logger.error(identifier, `Retry #${i} error: ${e.message}`, errorDetails);\n\n // Handle specific Google AI errors\n if (e.finishReason === \"MALFORMED_FUNCTION_CALL\" && i >= 3) {\n // On 4th retry, try removing tools to get a text response instead\n logger.log(\n identifier,\n \"Removing tools due to persistent MALFORMED_FUNCTION_CALL errors\"\n );\n payload.tools = undefined;\n }\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 error.finishReason = lastError?.finishReason;\n error.usageMetadata = lastError?.usageMetadata;\n error.safetyRatings = lastError?.safetyRatings;\n throw error;\n}\n\nexport async function callWithRetries(\n identifier: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000\n): Promise<ParsedResponseMessage> {\n const id = identifier;\n // Determine which service to use based on the model type\n if (isAnthropicPayload(aiPayload)) {\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(aiPayload),\n aiConfig as AnthropicAIConfig,\n retries\n );\n } else if (isOpenAiPayload(aiPayload)) {\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs\n );\n } else if (isGroqPayload(aiPayload)) {\n return await callGroqWithRetries(id, await prepareGroqPayload(aiPayload));\n } else if (isGoogleAIPayload(aiPayload)) {\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(aiPayload),\n retries\n );\n } else {\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n }\n}\n\nfunction isAnthropicPayload(payload: any): Boolean {\n return Object.values(ClaudeModel).includes(payload.model);\n}\n\nasync function prepareAnthropicPayload(\n payload: GenericPayload\n): Promise<AnthropicAIPayload> {\n const preparedPayload: AnthropicAIPayload = {\n model: payload.model as ClaudeModel,\n messages: [],\n functions: payload.functions,\n temperature: payload.temperature,\n };\n\n for (const message of payload.messages) {\n const anthropicContentBlocks: AnthropicContentBlock[] = [];\n\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n if (message.content) {\n anthropicContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n for (const file of message.files || []) {\n if (!file.mimeType?.startsWith(\"image\")) {\n logger.warn(\n \"payload\",\n \"Anthropic API does not support non-image file types. Skipping file.\"\n );\n continue;\n }\n\n if (file.url) {\n anthropicContentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n } else if (file.data) {\n if (\n ![\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"].includes(\n file.mimeType\n )\n ) {\n throw new Error(\n \"Invalid image mimeType. Supported types are: image/png, image/jpeg, image/gif, image/webp\"\n );\n }\n anthropicContentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: file.mimeType as any,\n data: file.data,\n },\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: anthropicContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isOpenAiPayload(payload: any): Boolean {\n return Object.values(GPTModel).includes(payload.model);\n}\n\nasync function prepareOpenAIPayload(\n payload: GenericPayload\n): Promise<OpenAIPayload> {\n const preparedPayload: OpenAIPayload = {\n model: payload.model as GPTModel,\n messages: [],\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const openAIContentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n openAIContentBlocks.push({\n type: \"text\",\n text: message.content,\n });\n }\n\n const allowedFileMimeTypes = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ];\n\n for (const file of message.files || []) {\n if (allowedFileMimeTypes.includes(file.mimeType)) {\n if (file.url) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: file.url,\n },\n });\n // Add the URL as a text part\n openAIContentBlocks.push({\n type: \"text\",\n text: `Image URL: ${file.url}`,\n });\n } else if (file.data) {\n openAIContentBlocks.push({\n type: \"image_url\",\n image_url: {\n url: `data:${file.mimeType};base64,${file.data}`,\n },\n });\n }\n // } else if (file.mimeType?.startsWith(\"audio\")) {\n // if (file.url) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: file.url,\n // },\n // });\n // } else if (file.data) {\n // openAIContentBlocks.push({\n // type: \"audio_url\",\n // audio_url: {\n // url: `data:${file.mimeType};base64,${file.data}`,\n // },\n // });\n // }\n } else {\n logger.warn(\n \"payload\",\n \"Skipping file in message. File or image type not supported by OpenAI API:\",\n file.mimeType\n );\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: openAIContentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nfunction isGroqPayload(payload: any): Boolean {\n return Object.values(GroqModel).includes(payload.model);\n}\n\nfunction prepareGroqPayload(payload: GenericPayload): GroqPayload {\n return {\n model: payload.model as GroqModel,\n messages: payload.messages.map((message) => ({\n role: message.role,\n content: normalizeMessageContent(message.content),\n })),\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call // \"none\" | \"auto\"\n : {\n type: \"function\",\n function: payload.function_call,\n }\n : undefined,\n temperature: payload.temperature,\n };\n}\n\nfunction normalizeMessageContent(\n content: AnthropicAIMessage[\"content\"]\n): string {\n return Array.isArray(content)\n ? content\n .map((c) => (c.type === \"text\" ? c.text : `[${c.type}]`))\n .join(\"\\n\")\n : content;\n}\n\nfunction isGoogleAIPayload(payload: any): Boolean {\n return Object.values(GeminiModel).includes(payload.model);\n}\n\nasync function callGroq(\n identifier: Identifier,\n payload: GroqPayload\n): Promise<ParsedResponseMessage> {\n const response = await axios.post(\n \"https://api.groq.com/openai/v1/chat/completions\",\n payload,\n {\n headers: {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${process.env.GROQ_API_KEY}`,\n },\n }\n );\n\n const data = response.data;\n\n const answer = data.choices[0].message;\n if (!answer) {\n logger.error(identifier, \"Missing answer in Groq API:\", data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const textResponse = answer.content || null;\n let functionCall: FunctionCall | null = null;\n if (answer.tool_calls && answer.tool_calls.length) {\n const toolCall = answer.tool_calls[0];\n functionCall = {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments),\n };\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCall,\n files: [],\n };\n}\n\nasync function callGroqWithRetries(\n identifier: Identifier,\n payload: GroqPayload,\n retries: number = 5\n): Promise<ParsedResponseMessage> {\n logger.log(identifier, \"Calling Groq API with retries\");\n\n let lastResponse;\n for (let i = 0; i < retries; i++) {\n try {\n lastResponse = await callGroq(identifier, payload);\n return lastResponse;\n } catch (e: any) {\n logger.error(\n identifier,\n `Retry #${i} error: ${e.message}`,\n e.response?.data || e\n );\n\n await timeout(125 * i);\n }\n }\n const error = new Error(\n `Failed to call Groq API after ${retries} attempts`\n ) as any;\n error.response = lastResponse;\n throw error;\n}\n\nasync function getNormalizedBase64PNG(\n url: string,\n mime: string\n): Promise<string> {\n const response = await axios.get(url, { responseType: \"arraybuffer\" });\n\n let imageBuffer = Buffer.from(response.data);\n let sharpOptions = {};\n if (isHeicImage(url, mime)) {\n const imageData = await decode({ buffer: imageBuffer });\n imageBuffer = Buffer.from(imageData.data);\n sharpOptions = {\n raw: {\n width: imageData.width,\n height: imageData.height,\n channels: 4,\n },\n };\n }\n\n // Limits size of image to < 5MB Anthropic limit\n const resizedBuffer = await sharp(imageBuffer, sharpOptions)\n .withMetadata()\n .resize(1024, 1024, { fit: \"inside\", withoutEnlargement: true })\n .png()\n .toBuffer();\n\n return resizedBuffer.toString(\"base64\");\n}\n\n// async function main() {\n// const payload: GenericPayload = {\n// model: GeminiModel.GEMINI_15_PRO,\n// messages: [\n// {\n// role: \"user\",\n// content: \"What is this logo?\",\n// files: [\n// {\n// mimeType: \"image/png\",\n// url: \"https://www.wikimedia.org/static/images/wmf-logo-2x.png\",\n// },\n// ],\n// },\n// ],\n// functions: [\n// {\n// name: \"answer_logo_question\",\n// description: \"Answer a question about a logo\",\n// parameters: {\n// type: \"object\",\n// properties: {\n// organization: {\n// type: \"string\",\n// },\n// },\n// },\n// },\n// ],\n// };\n\n// const answer = await callWithRetries(\"test\", payload);\n\n// console.log(answer);\n// }\n\n// main();\n","export function timeout(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function isHeicImage(name: string, mime?: string): boolean {\n const extension = name.split(\".\").pop()?.toLowerCase() || \"\";\n return (\n [\"heic\", \"heif\", \"heics\"].includes(extension) ||\n !!(\n mime && [\"image/heic\", \"image/heif\", \"image/heic-sequence\"].includes(mime)\n )\n );\n}\n"],"mappings":"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","names":["ClaudeModel","GPTModel","GroqModel","GeminiModel","error","abortTimeout","response","_a","_b"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "190proof",
3
- "version": "1.0.73",
3
+ "version": "1.0.75",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",