190proof 1.0.86 → 1.0.88
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 +21 -1
- package/dist/index.d.mts +12 -2
- package/dist/index.d.ts +12 -2
- package/dist/index.js +103 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +102 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 190proof
|
|
2
2
|
|
|
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.
|
|
3
|
+
A unified interface for interacting with multiple AI providers including **OpenAI**, **Anthropic**, **Google**, **Groq**, **OpenRouter**, 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
|
|
|
@@ -49,6 +49,7 @@ import {
|
|
|
49
49
|
ClaudeModel,
|
|
50
50
|
GeminiModel,
|
|
51
51
|
GroqModel,
|
|
52
|
+
OpenRouterModel,
|
|
52
53
|
GenericPayload,
|
|
53
54
|
} from "190proof/interfaces";
|
|
54
55
|
|
|
@@ -70,6 +71,12 @@ const groqPayload: GenericPayload = {
|
|
|
70
71
|
messages: [{ role: "user", content: "Hello!" }],
|
|
71
72
|
};
|
|
72
73
|
|
|
74
|
+
// OpenRouter
|
|
75
|
+
const openRouterPayload: GenericPayload = {
|
|
76
|
+
model: OpenRouterModel.QWEN3_6_PLUS_FREE,
|
|
77
|
+
messages: [{ role: "user", content: "Hello!" }],
|
|
78
|
+
};
|
|
79
|
+
|
|
73
80
|
const response = await callWithRetries("request-id", claudePayload);
|
|
74
81
|
```
|
|
75
82
|
|
|
@@ -200,6 +207,10 @@ const response = await callWithRetries("system-message-example", payload);
|
|
|
200
207
|
- `llama3-70b-8192`
|
|
201
208
|
- `deepseek-r1-distill-llama-70b`
|
|
202
209
|
|
|
210
|
+
### OpenRouter Models
|
|
211
|
+
|
|
212
|
+
- `qwen/qwen3.6-plus:free`
|
|
213
|
+
|
|
203
214
|
## Environment Variables
|
|
204
215
|
|
|
205
216
|
Set the following environment variables for the providers you want to use:
|
|
@@ -217,6 +228,9 @@ GEMINI_API_KEY=your-gemini-api-key
|
|
|
217
228
|
# Groq
|
|
218
229
|
GROQ_API_KEY=your-groq-api-key
|
|
219
230
|
|
|
231
|
+
# OpenRouter
|
|
232
|
+
OPENROUTER_API_KEY=your-openrouter-api-key
|
|
233
|
+
|
|
220
234
|
# AWS Bedrock (for Anthropic via Bedrock)
|
|
221
235
|
AWS_ACCESS_KEY_ID=your-aws-access-key
|
|
222
236
|
AWS_SECRET_ACCESS_KEY=your-aws-secret-key
|
|
@@ -245,7 +259,13 @@ interface ParsedResponseMessage {
|
|
|
245
259
|
role: "assistant";
|
|
246
260
|
content: string | null;
|
|
247
261
|
function_call: FunctionCall | null;
|
|
262
|
+
function_calls: FunctionCall[];
|
|
248
263
|
files: File[]; // For models that return files (e.g., image generation)
|
|
264
|
+
usage: {
|
|
265
|
+
prompt_tokens: number;
|
|
266
|
+
completion_tokens: number;
|
|
267
|
+
total_tokens: number;
|
|
268
|
+
} | null; // null when streaming
|
|
249
269
|
}
|
|
250
270
|
```
|
|
251
271
|
|
package/dist/index.d.mts
CHANGED
|
@@ -31,8 +31,13 @@ declare enum GPTModel {
|
|
|
31
31
|
}
|
|
32
32
|
declare enum GroqModel {
|
|
33
33
|
LLAMA_3_70B_8192 = "llama3-70b-8192",
|
|
34
|
+
LLAMA_3_3_70B_VERSATILE = "llama-3.3-70b-versatile",
|
|
35
|
+
QWEN3_32B = "qwen/qwen3-32b",
|
|
34
36
|
DEEPSEEK_R1_DISTILL_LLAMA_70B = "deepseek-r1-distill-llama-70b"
|
|
35
37
|
}
|
|
38
|
+
declare enum OpenRouterModel {
|
|
39
|
+
QWEN3_6_PLUS_FREE = "qwen/qwen3.6-plus:free"
|
|
40
|
+
}
|
|
36
41
|
declare enum GeminiModel {
|
|
37
42
|
GEMINI_1_5_PRO = "gemini-1.5-pro-latest",
|
|
38
43
|
GEMINI_EXP_1206 = "gemini-exp-1206",
|
|
@@ -62,6 +67,11 @@ interface ParsedResponseMessage {
|
|
|
62
67
|
function_call: FunctionCall | null;
|
|
63
68
|
function_calls: FunctionCall[];
|
|
64
69
|
files: File[];
|
|
70
|
+
usage: {
|
|
71
|
+
prompt_tokens: number;
|
|
72
|
+
completion_tokens: number;
|
|
73
|
+
total_tokens: number;
|
|
74
|
+
} | null;
|
|
65
75
|
}
|
|
66
76
|
interface FunctionCall {
|
|
67
77
|
name: string;
|
|
@@ -92,7 +102,7 @@ interface FunctionDefinition {
|
|
|
92
102
|
description?: string;
|
|
93
103
|
parameters: Record<string, any>;
|
|
94
104
|
}
|
|
95
|
-
type AnyModel = GPTModel | ClaudeModel | GroqModel | GeminiModel;
|
|
105
|
+
type AnyModel = GPTModel | ClaudeModel | GroqModel | GeminiModel | OpenRouterModel;
|
|
96
106
|
interface GenericPayload {
|
|
97
107
|
model: AnyModel;
|
|
98
108
|
messages: GenericMessage[];
|
|
@@ -106,4 +116,4 @@ interface GenericPayload {
|
|
|
106
116
|
|
|
107
117
|
declare function callWithRetries(id: string | string[], aiPayload: GenericPayload, aiConfig?: OpenAIConfig | AnthropicAIConfig, retries?: number, chunkTimeoutMs?: number): Promise<ParsedResponseMessage>;
|
|
108
118
|
|
|
109
|
-
export { type AnyModel, ClaudeModel, type FunctionDefinition, GPTModel, GeminiModel, type GenericMessage, type GenericPayload, GroqModel, type OpenAIConfig, callWithRetries };
|
|
119
|
+
export { type AnyModel, ClaudeModel, type FunctionDefinition, GPTModel, GeminiModel, type GenericMessage, type GenericPayload, GroqModel, type OpenAIConfig, OpenRouterModel, callWithRetries };
|
package/dist/index.d.ts
CHANGED
|
@@ -31,8 +31,13 @@ declare enum GPTModel {
|
|
|
31
31
|
}
|
|
32
32
|
declare enum GroqModel {
|
|
33
33
|
LLAMA_3_70B_8192 = "llama3-70b-8192",
|
|
34
|
+
LLAMA_3_3_70B_VERSATILE = "llama-3.3-70b-versatile",
|
|
35
|
+
QWEN3_32B = "qwen/qwen3-32b",
|
|
34
36
|
DEEPSEEK_R1_DISTILL_LLAMA_70B = "deepseek-r1-distill-llama-70b"
|
|
35
37
|
}
|
|
38
|
+
declare enum OpenRouterModel {
|
|
39
|
+
QWEN3_6_PLUS_FREE = "qwen/qwen3.6-plus:free"
|
|
40
|
+
}
|
|
36
41
|
declare enum GeminiModel {
|
|
37
42
|
GEMINI_1_5_PRO = "gemini-1.5-pro-latest",
|
|
38
43
|
GEMINI_EXP_1206 = "gemini-exp-1206",
|
|
@@ -62,6 +67,11 @@ interface ParsedResponseMessage {
|
|
|
62
67
|
function_call: FunctionCall | null;
|
|
63
68
|
function_calls: FunctionCall[];
|
|
64
69
|
files: File[];
|
|
70
|
+
usage: {
|
|
71
|
+
prompt_tokens: number;
|
|
72
|
+
completion_tokens: number;
|
|
73
|
+
total_tokens: number;
|
|
74
|
+
} | null;
|
|
65
75
|
}
|
|
66
76
|
interface FunctionCall {
|
|
67
77
|
name: string;
|
|
@@ -92,7 +102,7 @@ interface FunctionDefinition {
|
|
|
92
102
|
description?: string;
|
|
93
103
|
parameters: Record<string, any>;
|
|
94
104
|
}
|
|
95
|
-
type AnyModel = GPTModel | ClaudeModel | GroqModel | GeminiModel;
|
|
105
|
+
type AnyModel = GPTModel | ClaudeModel | GroqModel | GeminiModel | OpenRouterModel;
|
|
96
106
|
interface GenericPayload {
|
|
97
107
|
model: AnyModel;
|
|
98
108
|
messages: GenericMessage[];
|
|
@@ -106,4 +116,4 @@ interface GenericPayload {
|
|
|
106
116
|
|
|
107
117
|
declare function callWithRetries(id: string | string[], aiPayload: GenericPayload, aiConfig?: OpenAIConfig | AnthropicAIConfig, retries?: number, chunkTimeoutMs?: number): Promise<ParsedResponseMessage>;
|
|
108
118
|
|
|
109
|
-
export { type AnyModel, ClaudeModel, type FunctionDefinition, GPTModel, GeminiModel, type GenericMessage, type GenericPayload, GroqModel, type OpenAIConfig, callWithRetries };
|
|
119
|
+
export { type AnyModel, ClaudeModel, type FunctionDefinition, GPTModel, GeminiModel, type GenericMessage, type GenericPayload, GroqModel, type OpenAIConfig, OpenRouterModel, callWithRetries };
|
package/dist/index.js
CHANGED
|
@@ -34,6 +34,7 @@ __export(proof_exports, {
|
|
|
34
34
|
GPTModel: () => GPTModel,
|
|
35
35
|
GeminiModel: () => GeminiModel,
|
|
36
36
|
GroqModel: () => GroqModel,
|
|
37
|
+
OpenRouterModel: () => OpenRouterModel,
|
|
37
38
|
callWithRetries: () => callWithRetries
|
|
38
39
|
});
|
|
39
40
|
module.exports = __toCommonJS(proof_exports);
|
|
@@ -74,9 +75,15 @@ var GPTModel = /* @__PURE__ */ ((GPTModel2) => {
|
|
|
74
75
|
})(GPTModel || {});
|
|
75
76
|
var GroqModel = /* @__PURE__ */ ((GroqModel2) => {
|
|
76
77
|
GroqModel2["LLAMA_3_70B_8192"] = "llama3-70b-8192";
|
|
78
|
+
GroqModel2["LLAMA_3_3_70B_VERSATILE"] = "llama-3.3-70b-versatile";
|
|
79
|
+
GroqModel2["QWEN3_32B"] = "qwen/qwen3-32b";
|
|
77
80
|
GroqModel2["DEEPSEEK_R1_DISTILL_LLAMA_70B"] = "deepseek-r1-distill-llama-70b";
|
|
78
81
|
return GroqModel2;
|
|
79
82
|
})(GroqModel || {});
|
|
83
|
+
var OpenRouterModel = /* @__PURE__ */ ((OpenRouterModel2) => {
|
|
84
|
+
OpenRouterModel2["QWEN3_6_PLUS_FREE"] = "qwen/qwen3.6-plus:free";
|
|
85
|
+
return OpenRouterModel2;
|
|
86
|
+
})(OpenRouterModel || {});
|
|
80
87
|
var GeminiModel = /* @__PURE__ */ ((GeminiModel2) => {
|
|
81
88
|
GeminiModel2["GEMINI_1_5_PRO"] = "gemini-1.5-pro-latest";
|
|
82
89
|
GeminiModel2["GEMINI_EXP_1206"] = "gemini-exp-1206";
|
|
@@ -200,7 +207,8 @@ function parseStreamedResponse(identifier, paragraph, toolCallAccumulators, allo
|
|
|
200
207
|
content: paragraph || null,
|
|
201
208
|
function_call: functionCalls[0] || null,
|
|
202
209
|
function_calls: functionCalls,
|
|
203
|
-
files: []
|
|
210
|
+
files: [],
|
|
211
|
+
usage: null
|
|
204
212
|
};
|
|
205
213
|
}
|
|
206
214
|
function truncatePayload(payload) {
|
|
@@ -480,7 +488,12 @@ async function callOpenAI(id, openAiPayload, openAiConfig) {
|
|
|
480
488
|
content: choice.message.content || null,
|
|
481
489
|
function_call: functionCalls[0] || null,
|
|
482
490
|
function_calls: functionCalls,
|
|
483
|
-
files: []
|
|
491
|
+
files: [],
|
|
492
|
+
usage: data.usage ? {
|
|
493
|
+
prompt_tokens: data.usage.prompt_tokens,
|
|
494
|
+
completion_tokens: data.usage.completion_tokens,
|
|
495
|
+
total_tokens: data.usage.total_tokens
|
|
496
|
+
} : null
|
|
484
497
|
};
|
|
485
498
|
}
|
|
486
499
|
async function callOpenAiWithRetries(id, openAiPayload, openAiConfig, retries = 5, chunkTimeoutMs = 15e3) {
|
|
@@ -714,7 +727,12 @@ ${text}` : text;
|
|
|
714
727
|
content: textResponse,
|
|
715
728
|
function_call: functionCalls[0] || null,
|
|
716
729
|
function_calls: functionCalls,
|
|
717
|
-
files: []
|
|
730
|
+
files: [],
|
|
731
|
+
usage: data.usage ? {
|
|
732
|
+
prompt_tokens: data.usage.input_tokens,
|
|
733
|
+
completion_tokens: data.usage.output_tokens,
|
|
734
|
+
total_tokens: data.usage.input_tokens + data.usage.output_tokens
|
|
735
|
+
} : null
|
|
718
736
|
};
|
|
719
737
|
}
|
|
720
738
|
async function callAnthropicWithRetries(id, payload, config, retries = 5) {
|
|
@@ -806,7 +824,7 @@ async function prepareGoogleAIPayload(_identifier, payload) {
|
|
|
806
824
|
return preparedPayload;
|
|
807
825
|
}
|
|
808
826
|
async function callGoogleAI(id, payload) {
|
|
809
|
-
var _a, _b, _c, _d, _e, _f;
|
|
827
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
810
828
|
const googleMessages = jigGoogleMessages(payload.messages);
|
|
811
829
|
const history = googleMessages.slice(0, -1);
|
|
812
830
|
const lastMessage = googleMessages.slice(-1)[0];
|
|
@@ -870,7 +888,12 @@ async function callGoogleAI(id, payload) {
|
|
|
870
888
|
content: text || null,
|
|
871
889
|
files,
|
|
872
890
|
function_call: (functionCalls == null ? void 0 : functionCalls[0]) || null,
|
|
873
|
-
function_calls: functionCalls || []
|
|
891
|
+
function_calls: functionCalls || [],
|
|
892
|
+
usage: response.usageMetadata ? {
|
|
893
|
+
prompt_tokens: (_g = response.usageMetadata.promptTokenCount) != null ? _g : 0,
|
|
894
|
+
completion_tokens: (_h = response.usageMetadata.candidatesTokenCount) != null ? _h : 0,
|
|
895
|
+
total_tokens: (_i = response.usageMetadata.totalTokenCount) != null ? _i : 0
|
|
896
|
+
} : null
|
|
874
897
|
};
|
|
875
898
|
}
|
|
876
899
|
var CONTENT_VIOLATION_REASONS = /* @__PURE__ */ new Set(["PROHIBITED_CONTENT", "SAFETY"]);
|
|
@@ -1000,12 +1023,75 @@ async function callGroq(id, payload) {
|
|
|
1000
1023
|
content: answer.content || null,
|
|
1001
1024
|
function_call: functionCalls[0] || null,
|
|
1002
1025
|
function_calls: functionCalls,
|
|
1003
|
-
files: []
|
|
1026
|
+
files: [],
|
|
1027
|
+
usage: response.data.usage ? {
|
|
1028
|
+
prompt_tokens: response.data.usage.prompt_tokens,
|
|
1029
|
+
completion_tokens: response.data.usage.completion_tokens,
|
|
1030
|
+
total_tokens: response.data.usage.total_tokens
|
|
1031
|
+
} : null
|
|
1004
1032
|
};
|
|
1005
1033
|
}
|
|
1006
1034
|
async function callGroqWithRetries(id, payload, retries = 5) {
|
|
1007
1035
|
return withRetries(id, "Groq", () => callGroq(id, payload), { retries });
|
|
1008
1036
|
}
|
|
1037
|
+
function prepareOpenRouterPayload(payload) {
|
|
1038
|
+
var _a;
|
|
1039
|
+
return {
|
|
1040
|
+
model: payload.model,
|
|
1041
|
+
messages: payload.messages.map((message) => ({
|
|
1042
|
+
role: message.role,
|
|
1043
|
+
content: normalizeMessageContent(message.content)
|
|
1044
|
+
})),
|
|
1045
|
+
tools: (_a = payload.functions) == null ? void 0 : _a.map((fn) => ({
|
|
1046
|
+
type: "function",
|
|
1047
|
+
function: fn
|
|
1048
|
+
})),
|
|
1049
|
+
tool_choice: payload.function_call ? typeof payload.function_call === "string" ? payload.function_call : { type: "function", function: payload.function_call } : void 0,
|
|
1050
|
+
temperature: payload.temperature
|
|
1051
|
+
};
|
|
1052
|
+
}
|
|
1053
|
+
async function callOpenRouter(id, payload) {
|
|
1054
|
+
var _a, _b;
|
|
1055
|
+
const response = await import_axios.default.post(
|
|
1056
|
+
"https://openrouter.ai/api/v1/chat/completions",
|
|
1057
|
+
payload,
|
|
1058
|
+
{
|
|
1059
|
+
headers: {
|
|
1060
|
+
"content-type": "application/json",
|
|
1061
|
+
Authorization: `Bearer ${process.env.OPENROUTER_API_KEY}`
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1064
|
+
);
|
|
1065
|
+
const answer = (_a = response.data.choices[0]) == null ? void 0 : _a.message;
|
|
1066
|
+
if (!answer) {
|
|
1067
|
+
logger_default.error(id, "Missing answer in OpenRouter API response:", response.data);
|
|
1068
|
+
throw new Error("Missing answer in OpenRouter API");
|
|
1069
|
+
}
|
|
1070
|
+
const functionCalls = [];
|
|
1071
|
+
if ((_b = answer.tool_calls) == null ? void 0 : _b.length) {
|
|
1072
|
+
for (const tc of answer.tool_calls) {
|
|
1073
|
+
functionCalls.push({
|
|
1074
|
+
name: tc.function.name,
|
|
1075
|
+
arguments: JSON.parse(tc.function.arguments)
|
|
1076
|
+
});
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
return {
|
|
1080
|
+
role: "assistant",
|
|
1081
|
+
content: answer.content || null,
|
|
1082
|
+
function_call: functionCalls[0] || null,
|
|
1083
|
+
function_calls: functionCalls,
|
|
1084
|
+
files: [],
|
|
1085
|
+
usage: response.data.usage ? {
|
|
1086
|
+
prompt_tokens: response.data.usage.prompt_tokens,
|
|
1087
|
+
completion_tokens: response.data.usage.completion_tokens,
|
|
1088
|
+
total_tokens: response.data.usage.total_tokens
|
|
1089
|
+
} : null
|
|
1090
|
+
};
|
|
1091
|
+
}
|
|
1092
|
+
async function callOpenRouterWithRetries(id, payload, retries = 5) {
|
|
1093
|
+
return withRetries(id, "OpenRouter", () => callOpenRouter(id, payload), { retries });
|
|
1094
|
+
}
|
|
1009
1095
|
function isAnthropicPayload(payload) {
|
|
1010
1096
|
return Object.values(ClaudeModel).includes(payload.model);
|
|
1011
1097
|
}
|
|
@@ -1018,6 +1104,9 @@ function isGroqPayload(payload) {
|
|
|
1018
1104
|
function isGoogleAIPayload(payload) {
|
|
1019
1105
|
return Object.values(GeminiModel).includes(payload.model);
|
|
1020
1106
|
}
|
|
1107
|
+
function isOpenRouterPayload(payload) {
|
|
1108
|
+
return Object.values(OpenRouterModel).includes(payload.model);
|
|
1109
|
+
}
|
|
1021
1110
|
async function callWithRetries(id, aiPayload, aiConfig, retries = 5, chunkTimeoutMs = 15e3) {
|
|
1022
1111
|
try {
|
|
1023
1112
|
if (isAnthropicPayload(aiPayload)) {
|
|
@@ -1051,6 +1140,13 @@ async function callWithRetries(id, aiPayload, aiConfig, retries = 5, chunkTimeou
|
|
|
1051
1140
|
retries
|
|
1052
1141
|
);
|
|
1053
1142
|
}
|
|
1143
|
+
if (isOpenRouterPayload(aiPayload)) {
|
|
1144
|
+
return await callOpenRouterWithRetries(
|
|
1145
|
+
id,
|
|
1146
|
+
prepareOpenRouterPayload(aiPayload),
|
|
1147
|
+
retries
|
|
1148
|
+
);
|
|
1149
|
+
}
|
|
1054
1150
|
throw new Error("Invalid AI payload: Unknown model type.");
|
|
1055
1151
|
} catch (error2) {
|
|
1056
1152
|
if (aiPayload.fallbackModel) {
|
|
@@ -1083,6 +1179,7 @@ async function callWithRetries(id, aiPayload, aiConfig, retries = 5, chunkTimeou
|
|
|
1083
1179
|
GPTModel,
|
|
1084
1180
|
GeminiModel,
|
|
1085
1181
|
GroqModel,
|
|
1182
|
+
OpenRouterModel,
|
|
1086
1183
|
callWithRetries
|
|
1087
1184
|
});
|
|
1088
1185
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts","../interfaces.ts","../logger.ts","../utils.ts"],"sourcesContent":["import {\n ClaudeModel,\n GPTModel,\n OpenAIPayload,\n OpenAIMessage,\n OpenAIConfig,\n AnthropicAIPayload,\n AnthropicAIMessage,\n GenericMessage,\n AnthropicAIConfig,\n GenericPayload,\n GroqPayload,\n GroqModel,\n ParsedResponseMessage,\n FunctionCall,\n AnthropicContentBlock,\n OpenAIContentBlock,\n GoogleAIPayload,\n GeminiModel,\n GoogleAIPart,\n File,\n GoogleAIMessage,\n AnyModel,\n} from \"./interfaces\";\nimport logger, { Identifier } from \"./logger\";\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from \"@aws-sdk/client-bedrock-runtime\";\nimport axios from \"axios\";\nimport { isHeicImage, timeout } from \"./utils\";\nimport { GoogleGenAI } from \"@google/genai\";\n\nconst sharp = require(\"sharp\");\nconst decode = require(\"heic-decode\");\n\nexport {\n ClaudeModel,\n GPTModel,\n GroqModel,\n GeminiModel,\n OpenAIConfig,\n FunctionDefinition,\n GenericMessage,\n GenericPayload,\n AnyModel,\n} from \"./interfaces\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SHARED UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generic retry wrapper for API calls with exponential backoff.\n */\nasync function withRetries<T>(\n identifier: Identifier,\n apiName: string,\n fn: () => Promise<T>,\n options: {\n retries?: number;\n baseDelayMs?: number;\n onError?: (error: any, attempt: number) => void;\n } = {},\n): Promise<T> {\n const { retries = 5, baseDelayMs = 125, onError } = options;\n\n logger.log(identifier, `Calling ${apiName} API with retries`);\n\n let lastError: any;\n for (let attempt = 0; attempt < retries; attempt++) {\n try {\n return await fn();\n } catch (error: any) {\n lastError = error;\n\n if (onError) {\n onError(error, attempt);\n } else {\n logger.error(\n identifier,\n `Retry #${attempt} error: ${error.message}`,\n error.response?.data || error,\n );\n }\n\n await timeout(baseDelayMs * attempt);\n }\n }\n\n const error = new Error(\n `Failed to call ${apiName} API after ${retries} attempts`,\n ) as any;\n error.cause = lastError;\n throw error;\n}\n\nfunction parseStreamedResponse(\n identifier: Identifier,\n paragraph: string,\n toolCallAccumulators: { name: string; arguments: string }[],\n allowedFunctionNames: Set<string> | null,\n): ParsedResponseMessage {\n const functionCalls: FunctionCall[] = [];\n\n for (const acc of toolCallAccumulators) {\n if (!acc.name || !acc.arguments) continue;\n\n if (allowedFunctionNames && !allowedFunctionNames.has(acc.name)) {\n throw new Error(\n `Stream error: received function call with unknown name: ${acc.name}`,\n );\n }\n\n try {\n functionCalls.push({\n name: acc.name,\n arguments: JSON.parse(acc.arguments),\n });\n } catch (error) {\n logger.error(\n identifier,\n \"Error parsing function call arguments:\",\n acc.arguments,\n );\n throw error;\n }\n }\n\n if (!paragraph && !functionCalls.length) {\n logger.error(\n identifier,\n \"Stream error: received message without content or function_call:\",\n JSON.stringify({ paragraph, toolCallAccumulators }),\n );\n throw new Error(\n \"Stream error: received message without content or function_call\",\n );\n }\n\n return {\n role: \"assistant\",\n content: paragraph || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n };\n}\n\nfunction truncatePayload(payload: OpenAIPayload): string {\n return JSON.stringify(\n {\n ...payload,\n messages: payload.messages.map((message) => {\n const truncatedMessage = { ...message };\n if (typeof truncatedMessage.content === \"string\") {\n truncatedMessage.content = truncatedMessage.content.slice(0, 100);\n } else if (Array.isArray(truncatedMessage.content)) {\n truncatedMessage.content = truncatedMessage.content.map((block) => {\n if (block.type === \"image_url\") {\n return {\n ...block,\n image_url: { url: block.image_url.url.slice(0, 100) },\n };\n }\n return block;\n });\n }\n return truncatedMessage;\n }),\n },\n null,\n 2,\n );\n}\n\nasync function getNormalizedBase64PNG(\n url: string,\n mime: string,\n): Promise<string> {\n const response = await axios.get(url, { responseType: \"arraybuffer\" });\n\n let imageBuffer = Buffer.from(response.data);\n let sharpOptions = {};\n\n if (isHeicImage(url, mime)) {\n const imageData = await decode({ buffer: imageBuffer });\n imageBuffer = Buffer.from(imageData.data);\n sharpOptions = {\n raw: {\n width: imageData.width,\n height: imageData.height,\n channels: 4,\n },\n };\n }\n\n // Limits size of image to < 5MB Anthropic limit\n const resizedBuffer = await sharp(imageBuffer, sharpOptions)\n .withMetadata()\n .resize(1024, 1024, { fit: \"inside\", withoutEnlargement: true })\n .png()\n .toBuffer();\n\n return resizedBuffer.toString(\"base64\");\n}\n\nconst ALLOWED_IMAGE_MIME_TYPES = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// OPENAI\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface OpenAIRequestConfig {\n endpoint: string;\n headers: Record<string, string>;\n}\n\nfunction buildOpenAIRequestConfig(\n identifier: Identifier,\n model: string,\n config: OpenAIConfig | undefined,\n): OpenAIRequestConfig {\n if (!config) {\n config = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n if (config.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service:\", model);\n\n if (!config.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\",\n );\n }\n\n const azureConfig = config.modelConfigMap[model as GPTModel];\n if (!azureConfig?.endpoint) {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n\n const endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n logger.log(identifier, \"Using endpoint:\", endpoint);\n\n return {\n endpoint,\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n };\n }\n\n // Default: OpenAI\n logger.log(identifier, \"Using OpenAI service:\", model);\n if (config.orgId) {\n logger.log(identifier, \"Using orgId:\", config.orgId);\n }\n\n return {\n endpoint: \"https://api.openai.com/v1/chat/completions\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.apiKey}`,\n ...(config.orgId ? { \"OpenAI-Organization\": config.orgId } : {}),\n },\n };\n}\n\nasync function prepareOpenAIPayload(\n identifier: Identifier,\n payload: GenericPayload,\n): Promise<OpenAIPayload> {\n const preparedPayload: OpenAIPayload = {\n model: payload.model as GPTModel,\n messages: [],\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call\n : { type: \"function\", function: payload.function_call }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const contentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n contentBlocks.push({ type: \"text\", text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n contentBlocks.push({\n type: \"image_url\",\n image_url: { url: file.url },\n });\n contentBlocks.push({ type: \"text\", text: `Image (${file.url})` });\n } else if (file.data) {\n contentBlocks.push({\n type: \"image_url\",\n image_url: { url: `data:${file.mimeType};base64,${file.data}` },\n });\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n contentBlocks.push({\n type: \"text\",\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: contentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callOpenAIStream(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n chunkTimeoutMs: number,\n): Promise<ParsedResponseMessage> {\n const functionNames: Set<string> | null = openAiPayload.tools\n ? new Set(openAiPayload.tools.map((fn) => fn.function.name as string))\n : null;\n\n const { endpoint, headers } = buildOpenAIRequestConfig(\n id,\n openAiPayload.model,\n openAiConfig,\n );\n\n const controller = new AbortController();\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...openAiPayload, stream: true }),\n signal: controller.signal,\n });\n\n if (!response.body) {\n throw new Error(\"Stream error: no response body\");\n }\n\n let paragraph = \"\";\n const toolCallAccumulators: { name: string; arguments: string }[] = [];\n\n const reader = response.body.getReader();\n let partialChunk = \"\";\n let chunkIndex = -1;\n\n const createAbortTimeout = () =>\n setTimeout(() => {\n logger.error(id, `Stream timeout after ${chunkTimeoutMs}ms`);\n controller.abort();\n }, chunkTimeoutMs);\n\n while (true) {\n chunkIndex++;\n const abortTimeout = createAbortTimeout();\n const { done, value } = await reader.read();\n clearTimeout(abortTimeout);\n\n if (done) {\n logger.error(\n id,\n `Stream ended prematurely after ${chunkIndex + 1} chunks`,\n );\n throw new Error(\"Stream error: ended prematurely\");\n }\n\n let chunk = new TextDecoder().decode(value);\n if (partialChunk) {\n chunk = partialChunk + chunk;\n partialChunk = \"\";\n }\n\n const jsonStrings = chunk.split(/^data: /gm);\n\n for (const jsonString of jsonStrings) {\n if (!jsonString) continue;\n\n if (jsonString.includes(\"[DONE]\")) {\n return parseStreamedResponse(\n id,\n paragraph,\n toolCallAccumulators,\n functionNames,\n );\n }\n\n let json;\n try {\n json = JSON.parse(jsonString.trim());\n } catch {\n partialChunk = jsonString;\n continue;\n }\n\n if (!json.choices?.length) {\n if (json.error) {\n logger.error(id, \"Stream error from OpenAI:\", json.error);\n const error = new Error(\"Stream error: OpenAI error\") as any;\n error.data = json.error;\n error.requestBody = truncatePayload(openAiPayload);\n throw error;\n }\n if (chunkIndex !== 0) {\n logger.error(id, \"Stream error: no choices in JSON:\", json);\n }\n continue;\n }\n\n const toolCalls = json.choices[0]?.delta?.tool_calls;\n if (toolCalls) {\n for (const toolCall of toolCalls) {\n const idx = toolCall.index ?? 0;\n while (toolCallAccumulators.length <= idx) {\n toolCallAccumulators.push({ name: \"\", arguments: \"\" });\n }\n if (toolCall.function?.name)\n toolCallAccumulators[idx].name += toolCall.function.name;\n if (toolCall.function?.arguments)\n toolCallAccumulators[idx].arguments += toolCall.function.arguments;\n }\n }\n\n const text = json.choices[0]?.delta?.content;\n if (text) paragraph += text;\n }\n }\n}\n\nasync function callOpenAI(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n): Promise<ParsedResponseMessage> {\n const { endpoint, headers } = buildOpenAIRequestConfig(\n id,\n openAiPayload.model,\n openAiConfig,\n );\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...openAiPayload, stream: false }),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n logger.error(id, \"OpenAI API error:\", errorData);\n throw new Error(`OpenAI API Error: ${errorData.error.message}`);\n }\n\n const data = await response.json();\n\n if (!data.choices?.length) {\n if (data.error) {\n logger.error(id, \"OpenAI error:\", data.error);\n throw new Error(`OpenAI error: ${data.error.message}`);\n }\n throw new Error(\"OpenAI error: No choices returned.\");\n }\n\n const choice = data.choices[0];\n\n // Check for tool_calls (modern API) first, fall back to function_call (legacy)\n const toolCalls = choice.message?.tool_calls;\n const functionCalls: FunctionCall[] = [];\n\n if (toolCalls?.length) {\n for (const tc of toolCalls) {\n functionCalls.push({\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n });\n }\n } else if (choice.function_call) {\n functionCalls.push({\n name: choice.function_call.name,\n arguments: JSON.parse(choice.function_call.arguments),\n });\n }\n\n return {\n role: \"assistant\",\n content: choice.message.content || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n };\n}\n\nasync function callOpenAiWithRetries(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000,\n): Promise<ParsedResponseMessage> {\n logger.log(\n id,\n \"Calling OpenAI API with retries:\",\n openAiConfig?.service,\n openAiPayload.model,\n );\n\n const useStreaming =\n openAiPayload.model !== GPTModel.O1_MINI &&\n openAiPayload.model !== GPTModel.O1_PREVIEW;\n\n return withRetries(\n id,\n \"OpenAI\",\n async () => {\n if (useStreaming) {\n return callOpenAIStream(\n id,\n openAiPayload,\n openAiConfig,\n chunkTimeoutMs,\n );\n } else {\n return callOpenAI(id, openAiPayload, openAiConfig);\n }\n },\n {\n retries,\n baseDelayMs: 250,\n onError: (error, attempt) => {\n logger.error(\n id,\n `Retry #${attempt} error: ${error.message}`,\n error.response?.data || error.data || error,\n );\n\n // Remove images on content policy violation\n if (error.data?.code === \"content_policy_violation\") {\n logger.log(id, \"Removing images due to content policy violation\");\n openAiPayload.messages.forEach((message: OpenAIMessage) => {\n if (Array.isArray(message.content)) {\n message.content = message.content.filter(\n (content) => content.type === \"text\",\n );\n }\n });\n }\n },\n },\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ANTHROPIC\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction jigAnthropicMessages(\n messages: AnthropicAIMessage[],\n): AnthropicAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // Ensure first message is from user\n if (jiggedMessages[0]?.role !== \"user\") {\n jiggedMessages = [\n { role: \"user\" as const, content: \"...\" },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) return [message];\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n const lastContent = Array.isArray(lastMessage.content)\n ? lastMessage.content\n : [{ type: \"text\" as const, text: lastMessage.content }];\n const newContent = Array.isArray(message.content)\n ? message.content\n : [{ type: \"text\" as const, text: message.content }];\n\n lastMessage.content = [\n ...lastContent,\n { type: \"text\", text: \"\\n\\n---\\n\\n\" },\n ...newContent,\n ];\n return acc;\n }\n\n // Convert string content to text content block\n if (typeof message.content === \"string\") {\n message.content = [{ type: \"text\", text: message.content }];\n }\n\n return [...acc, message];\n }, [] as AnthropicAIMessage[]);\n\n // Ensure last message is from user\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"assistant\") {\n jiggedMessages.push({ role: \"user\", content: \"...\" });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareAnthropicPayload(\n _identifier: Identifier,\n payload: GenericPayload,\n): Promise<AnthropicAIPayload> {\n const preparedPayload: AnthropicAIPayload = {\n model: payload.model as ClaudeModel,\n messages: [],\n functions: payload.functions,\n temperature: payload.temperature,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n const contentBlocks: AnthropicContentBlock[] = [];\n\n if (message.content) {\n contentBlocks.push({ type: \"text\", text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n if (message.role == \"user\") {\n // anthropic assistant turns can't have images\n contentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n }\n contentBlocks.push({ type: \"text\", text: `Image (${file.url})` });\n } else if (file.data) {\n if (message.role == \"user\") {\n // anthropic assistant turns can't have images\n contentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: file.mimeType as any,\n data: file.data,\n },\n });\n }\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n contentBlocks.push({\n type: \"text\",\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: contentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callAnthropic(\n id: Identifier,\n payload: AnthropicAIPayload,\n config?: AnthropicAIConfig,\n): Promise<ParsedResponseMessage> {\n const anthropicMessages = jigAnthropicMessages(payload.messages);\n const tools = payload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n }));\n\n let data;\n\n if (config?.service === \"bedrock\") {\n const AWS_REGION = \"us-east-1\";\n const MODEL_ID = \"anthropic.claude-3-haiku-20240307-v1:0\";\n\n const client = new BedrockRuntimeClient({ region: AWS_REGION });\n const bedrockPayload = {\n anthropic_version: \"bedrock-2023-05-31\",\n max_tokens: 4096,\n messages: anthropicMessages,\n tools,\n };\n\n const response = await client.send(\n new InvokeModelCommand({\n contentType: \"application/json\",\n body: JSON.stringify(bedrockPayload),\n modelId: MODEL_ID,\n }),\n );\n\n const decodedResponseBody = new TextDecoder().decode(response.body);\n data = JSON.parse(decodedResponseBody);\n } else {\n // Default: Anthropic API\n const response = await axios.post(\n \"https://api.anthropic.com/v1/messages\",\n {\n model: payload.model,\n messages: anthropicMessages,\n tools,\n temperature: payload.temperature,\n system: payload.system,\n max_tokens: 4096,\n },\n {\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": process.env.ANTHROPIC_API_KEY as string,\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-beta\": \"tools-2024-04-04\",\n },\n timeout: 60000,\n },\n );\n data = response.data;\n }\n\n const answers = data.content;\n if (!answers?.[0]) {\n logger.error(id, \"Missing answer in Anthropic API response:\", data);\n throw new Error(\"Missing answer in Anthropic API\");\n }\n\n let textResponse = \"\";\n const functionCalls: FunctionCall[] = [];\n\n for (const answer of answers) {\n if (!answer.type) {\n logger.error(id, \"Missing answer type in Anthropic API response:\", data);\n throw new Error(\"Missing answer type in Anthropic API\");\n }\n\n if (answer.type === \"text\") {\n let text = answer.text\n .replace(/<thinking>.*?<\\/thinking>/gs, \"\")\n .replace(/<answer>|<\\/answer>/gs, \"\")\n .trim();\n\n if (!text) {\n text = answer.text.replace(\n /<thinking>|<\\/thinking>|<answer>|<\\/answer>/gs,\n \"\",\n );\n logger.log(id, \"No text in answer, returning text within tags:\", text);\n }\n\n textResponse = textResponse ? `${textResponse}\\n\\n${text}` : text;\n } else if (answer.type === \"tool_use\") {\n functionCalls.push({\n name: answer.name,\n arguments: answer.input,\n });\n }\n }\n\n if (!textResponse && !functionCalls.length) {\n logger.error(\n id,\n \"Missing text & functions in Anthropic API response:\",\n data,\n );\n throw new Error(\"Missing text & functions in Anthropic API response\");\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n };\n}\n\nasync function callAnthropicWithRetries(\n id: Identifier,\n payload: AnthropicAIPayload,\n config?: AnthropicAIConfig,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n return withRetries(\n id,\n \"Anthropic\",\n () => callAnthropic(id, payload, config),\n {\n retries,\n },\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// GOOGLE AI\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction jigGoogleMessages(messages: GoogleAIMessage[]): GoogleAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // Ensure first message is from user\n if (jiggedMessages[0]?.role === \"model\") {\n jiggedMessages = [\n { role: \"user\" as const, parts: [{ text: \"...\" }] },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) return [message];\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n lastMessage.parts = [...lastMessage.parts, ...message.parts];\n return acc;\n }\n\n return [...acc, message];\n }, [] as GoogleAIMessage[]);\n\n // Ensure last message is from user\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"model\") {\n jiggedMessages.push({ role: \"user\", parts: [{ text: \"...\" }] });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareGoogleAIPayload(\n _identifier: Identifier,\n payload: GenericPayload,\n): Promise<GoogleAIPayload> {\n const preparedPayload: GoogleAIPayload = {\n model: payload.model as GeminiModel,\n messages: [],\n tools: payload.functions\n ? {\n functionDeclarations: payload.functions.map((fn) => ({\n name: fn.name,\n parameters: {\n description: fn.description,\n ...fn.parameters,\n },\n })),\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.systemInstruction = message.content;\n continue;\n }\n\n const parts: GoogleAIPart[] = [];\n\n if (message.content) {\n parts.push({ text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n parts.push({\n fileData: {\n mimeType: file.mimeType,\n fileUri: file.url,\n },\n });\n parts.push({ text: `Image (${file.url})` });\n } else if (file.data) {\n parts.push({\n inlineData: {\n mimeType: file.mimeType,\n data: file.data,\n },\n });\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n parts.push({\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role === \"assistant\" ? \"model\" : message.role,\n parts,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callGoogleAI(\n id: Identifier,\n payload: GoogleAIPayload,\n): Promise<ParsedResponseMessage> {\n const googleMessages = jigGoogleMessages(payload.messages);\n const history = googleMessages.slice(0, -1);\n const lastMessage = googleMessages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\n const chat = genAI.chats.create({\n model: payload.model,\n history,\n config: {\n responseModalities: [\"Text\"],\n tools: payload.tools ? [payload.tools] : undefined,\n systemInstruction: payload.systemInstruction,\n },\n });\n\n const response = await chat.sendMessage({ message: lastMessage.parts });\n\n let text = \"\";\n const files: File[] = [];\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.text) text += part.text;\n if (part.inlineData?.data) {\n files.push({ mimeType: \"image/png\", data: part.inlineData.data });\n }\n }\n\n const functionCalls = response.functionCalls?.map((fc) => ({\n name: fc.name ?? \"\",\n arguments: fc.args ?? {},\n }));\n\n if (!text && !functionCalls?.length && !files.length) {\n const candidate = response.candidates?.[0];\n const finishReason = candidate?.finishReason;\n\n logger.error(id, \"Missing text & functions in Google AI API response:\", {\n finishReason,\n safetyRatings: candidate?.safetyRatings,\n usageMetadata: response.usageMetadata,\n modelVersion: response.modelVersion,\n candidateContent: candidate?.content,\n promptFeedback: response.promptFeedback,\n });\n\n let errorMessage = \"Missing text & functions in Google AI API response\";\n if (finishReason) {\n const reasonDescriptions: Record<string, string> = {\n MALFORMED_FUNCTION_CALL:\n \"(Google could not generate valid function call arguments)\",\n SAFETY: \"(blocked by safety filters)\",\n RECITATION: \"(blocked due to recitation)\",\n MAX_TOKENS: \"(response truncated due to max tokens)\",\n };\n errorMessage += `: finishReason=${finishReason} ${reasonDescriptions[finishReason] || \"\"}`;\n }\n\n const error = new Error(errorMessage) as any;\n error.finishReason = finishReason;\n error.safetyRatings = candidate?.safetyRatings;\n error.usageMetadata = response.usageMetadata;\n error.promptFeedback = response.promptFeedback;\n throw error;\n }\n\n return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: functionCalls?.[0] || null,\n function_calls: functionCalls || [],\n };\n}\n\n/**\n * Content violation finish reasons that should trigger circuit breaker behavior.\n * These errors won't resolve with simple retries - the content itself is the problem.\n */\nconst CONTENT_VIOLATION_REASONS = new Set([\"PROHIBITED_CONTENT\", \"SAFETY\"]);\n\n/**\n * Removes inline image data from Google AI messages, preserving text content.\n * Used as a fallback when content violations are detected.\n */\nfunction removeImagesFromGooglePayload(payload: GoogleAIPayload): boolean {\n let removedImages = false;\n\n for (const message of payload.messages) {\n message.parts = message.parts.filter((part) => {\n if (\"inlineData\" in part || \"fileData\" in part) {\n removedImages = true;\n return false;\n }\n return true;\n });\n\n // Ensure message still has content after removing images\n if (message.parts.length === 0) {\n message.parts = [{ text: \"(image removed due to content policy)\" }];\n }\n }\n\n return removedImages;\n}\n\nasync function callGoogleAIWithRetries(\n id: Identifier,\n payload: GoogleAIPayload,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n let hasTriedWithoutImages = false;\n\n return withRetries(id, \"Google AI\", () => callGoogleAI(id, payload), {\n retries,\n onError: (error, attempt) => {\n const errorDetails: Record<string, any> = {\n message: error.message,\n finishReason: error.finishReason,\n modelVersion: error.modelVersion,\n };\n\n if (error.safetyRatings) errorDetails.safetyRatings = error.safetyRatings;\n if (error.usageMetadata) errorDetails.usageMetadata = error.usageMetadata;\n if (error.promptFeedback)\n errorDetails.promptFeedback = error.promptFeedback;\n if (error.status) errorDetails.httpStatus = error.status;\n if (error.code) errorDetails.errorCode = error.code;\n if (error.details) errorDetails.errorDetails = error.details;\n\n const fileUris = payload.messages\n .flatMap((m) => m.parts)\n .filter((p) => \"fileData\" in p)\n .map((p) => (p as any).fileData.fileUri);\n if (fileUris.length) errorDetails.fileUris = fileUris;\n\n logger.error(\n id,\n `Retry #${attempt} error: ${error.message}`,\n errorDetails,\n );\n\n // Circuit breaker: detect content violations and try removing images\n // Check both finishReason (candidate-level) and promptFeedback.blockReason (prompt-level)\n const violationReason =\n (CONTENT_VIOLATION_REASONS.has(error.finishReason) &&\n error.finishReason) ||\n (CONTENT_VIOLATION_REASONS.has(error.promptFeedback?.blockReason) &&\n error.promptFeedback?.blockReason);\n\n if (violationReason) {\n if (!hasTriedWithoutImages) {\n const removedImages = removeImagesFromGooglePayload(payload);\n if (removedImages) {\n logger.log(\n id,\n `Circuit breaker triggered: removing images due to ${violationReason}`,\n );\n hasTriedWithoutImages = true;\n return; // Continue to next retry with images removed\n }\n }\n\n // If we already tried without images or there were no images, fail fast\n logger.error(\n id,\n `Circuit breaker: failing fast due to ${violationReason} (no more fallbacks)`,\n );\n const circuitBreakerError = new Error(\n `Google AI content violation: ${violationReason}. Request cannot succeed with current content.`,\n ) as any;\n circuitBreakerError.finishReason = error.finishReason;\n circuitBreakerError.safetyRatings = error.safetyRatings;\n circuitBreakerError.usageMetadata = error.usageMetadata;\n circuitBreakerError.circuitBreaker = true;\n throw circuitBreakerError;\n }\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// GROQ\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction normalizeMessageContent(\n content: AnthropicAIMessage[\"content\"],\n): string {\n return Array.isArray(content)\n ? content\n .map((c) => (c.type === \"text\" ? c.text : `[${c.type}]`))\n .join(\"\\n\")\n : content;\n}\n\nfunction prepareGroqPayload(payload: GenericPayload): GroqPayload {\n return {\n model: payload.model as GroqModel,\n messages: payload.messages.map((message) => ({\n role: message.role,\n content: normalizeMessageContent(message.content),\n })),\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call\n : { type: \"function\", function: payload.function_call }\n : undefined,\n temperature: payload.temperature,\n };\n}\n\nasync function callGroq(\n id: Identifier,\n payload: GroqPayload,\n): Promise<ParsedResponseMessage> {\n const response = await axios.post(\n \"https://api.groq.com/openai/v1/chat/completions\",\n payload,\n {\n headers: {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${process.env.GROQ_API_KEY}`,\n },\n },\n );\n\n const answer = response.data.choices[0]?.message;\n if (!answer) {\n logger.error(id, \"Missing answer in Groq API response:\", response.data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const functionCalls: FunctionCall[] = [];\n if (answer.tool_calls?.length) {\n for (const tc of answer.tool_calls) {\n functionCalls.push({\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n return {\n role: \"assistant\",\n content: answer.content || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n };\n}\n\nasync function callGroqWithRetries(\n id: Identifier,\n payload: GroqPayload,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n return withRetries(id, \"Groq\", () => callGroq(id, payload), { retries });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MAIN ENTRY POINT\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction isAnthropicPayload(payload: GenericPayload): boolean {\n return Object.values(ClaudeModel).includes(payload.model as ClaudeModel);\n}\n\nfunction isOpenAiPayload(payload: GenericPayload): boolean {\n return Object.values(GPTModel).includes(payload.model as GPTModel);\n}\n\nfunction isGroqPayload(payload: GenericPayload): boolean {\n return Object.values(GroqModel).includes(payload.model as GroqModel);\n}\n\nfunction isGoogleAIPayload(payload: GenericPayload): boolean {\n return Object.values(GeminiModel).includes(payload.model as GeminiModel);\n}\n\nexport async function callWithRetries(\n id: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000,\n): Promise<ParsedResponseMessage> {\n try {\n if (isAnthropicPayload(aiPayload)) {\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(id, aiPayload),\n aiConfig as AnthropicAIConfig,\n retries,\n );\n }\n\n if (isOpenAiPayload(aiPayload)) {\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(id, aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs,\n );\n }\n\n if (isGroqPayload(aiPayload)) {\n return await callGroqWithRetries(\n id,\n prepareGroqPayload(aiPayload),\n retries,\n );\n }\n\n if (isGoogleAIPayload(aiPayload)) {\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(id, aiPayload),\n retries,\n );\n }\n\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n } catch (error) {\n if (aiPayload.fallbackModel) {\n logger.error(\n id,\n `Primary model ${aiPayload.model} failed, falling back to ${aiPayload.fallbackModel}`,\n {\n error: error instanceof Error ? error.message : error,\n cause:\n error instanceof Error && (error as any).cause instanceof Error\n ? (error as any).cause.message\n : undefined,\n },\n );\n return callWithRetries(\n id,\n {\n ...aiPayload,\n model: aiPayload.fallbackModel,\n fallbackModel: undefined,\n },\n aiConfig,\n retries,\n chunkTimeoutMs,\n );\n }\n throw error;\n }\n}\n","export enum ClaudeModel {\n HAIKU_3 = \"claude-3-haiku-20240307\",\n SONNET_3 = \"claude-3-sonnet-20240229\",\n OPUS_3 = \"claude-3-opus-20240229\",\n HAIKU_3_5 = \"claude-3-5-haiku-20241022\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\n OPUS_4_1 = \"claude-opus-4-1\",\n HAIKU_4_5 = \"claude-haiku-4-5\",\n SONNET_4_5 = \"claude-sonnet-4-5\",\n OPUS_4_5 = \"claude-opus-4-5\",\n}\n\nexport enum GPTModel {\n GPT35_0613 = \"gpt-3.5-turbo-0613\",\n GPT35_0613_16K = \"gpt-3.5-turbo-16k-0613\",\n GPT35_0125 = \"gpt-3.5-turbo-0125\",\n GPT4_1106_PREVIEW = \"gpt-4-1106-preview\",\n GPT4_0125_PREVIEW = \"gpt-4-0125-preview\",\n GPT4_0409 = \"gpt-4-turbo-2024-04-09\",\n GPT4O = \"gpt-4o\",\n GPT4O_MINI = \"gpt-4o-mini\",\n O1_PREVIEW = \"o1-preview\",\n O1_MINI = \"o1-mini\",\n O3_MINI = \"o3-mini\",\n GPT4_1 = \"gpt-4.1\",\n GPT4_1_MINI = \"gpt-4.1-mini\",\n GPT4_1_NANO = \"gpt-4.1-nano\",\n GPT5 = \"gpt-5\",\n GPT5_MINI = \"gpt-5-mini\",\n}\n\nexport enum GroqModel {\n LLAMA_3_70B_8192 = \"llama3-70b-8192\",\n DEEPSEEK_R1_DISTILL_LLAMA_70B = \"deepseek-r1-distill-llama-70b\",\n}\n\nexport enum GeminiModel {\n GEMINI_1_5_PRO = \"gemini-1.5-pro-latest\",\n GEMINI_EXP_1206 = \"gemini-exp-1206\",\n GEMINI_2_0_FLASH = \"gemini-2.0-flash\",\n GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION = \"gemini-2.0-flash-exp-image-generation\",\n GEMINI_2_0_FLASH_THINKING_EXP = \"gemini-2.0-flash-thinking-exp\",\n GEMINI_2_0_FLASH_THINKING_EXP_01_21 = \"gemini-2.0-flash-thinking-exp-01-21\",\n GEMINI_2_5_FLASH_PREVIEW_04_17 = \"gemini-2.5-flash-preview-04-17\",\n GEMINI_3_FLASH_PREVIEW = \"gemini-3-flash-preview\",\n GEMINI_3_1_FLASH_LITE_PREVIEW = \"gemini-3.1-flash-lite-preview\",\n}\n\nexport interface GenericError {\n message: string;\n}\n\nexport enum ContentType {\n TEXT = \"text\",\n ATTACHMENT = \"attachment\",\n}\n\nexport type AIChainResponse = {\n content: string | null;\n contentType?: ContentType;\n functionCalls: FunctionCall[];\n};\n\nexport interface GenericMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp?: string;\n files?: File[];\n functionCalls?: FunctionCall[];\n}\n\nexport interface File {\n mimeType: string;\n url?: string;\n data?: string;\n}\n\nexport interface OpenAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | OpenAIContentBlock[];\n}\n\nexport type OpenAIContentBlock =\n | OpenAITextContentBlock\n | OpenAIImageContentBlock\n | OpenAIAudioContentBlock;\n\nexport interface OpenAITextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface OpenAIImageContentBlock {\n type: \"image_url\";\n image_url: {\n url: string; // URL to the image, can also be a base64 string\n };\n}\n\nexport interface OpenAIAudioContentBlock {\n type: \"audio_url\";\n audio_url: {\n url: string; // URL to the audio, can also be a base64 string\n };\n}\n\nexport interface AnthropicAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | AnthropicContentBlock[];\n}\n\nexport type AnthropicContentBlock =\n | AnthropicTextContentBlock\n | AnthropicImageContentBlock;\n\nexport interface AnthropicTextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface AnthropicImageContentBlock {\n type: \"image\";\n source: {\n type: \"base64\";\n media_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n data: string; // Must be a base64 string\n };\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface ParsedResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: FunctionCall | null;\n function_calls: FunctionCall[];\n files: File[];\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIConfig {\n service: \"azure\" | \"openai\";\n apiKey: string;\n baseUrl: string;\n orgId?: string;\n modelConfigMap?: Record<\n GPTModel,\n {\n resource: string;\n deployment: string;\n apiVersion: string;\n apiKey: string;\n endpoint?: string;\n }\n >;\n}\n\nexport interface AnthropicAIConfig {\n service: \"anthropic\" | \"bedrock\";\n}\n\nexport interface FunctionDefinition {\n name: string;\n description?: string;\n parameters: Record<string, any>;\n}\n\ninterface FunctionWrapped {\n type: \"function\";\n function: FunctionDefinition;\n}\n\nexport interface GroqPayload {\n model: GroqModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n temperature?: number;\n\n functions?: any[]; // Deprecate this\n}\n\nexport interface OpenAIPayload {\n model: GPTModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n}\n\nexport interface AnthropicAIPayload {\n model: ClaudeModel;\n messages: AnthropicAIMessage[];\n functions?: any[]; // TODO type this JSON schema\n temperature?: number;\n system?: string;\n}\n\nexport interface GoogleAITextPart {\n text: string;\n}\n\nexport interface GoogleAIInlineDataPart {\n inlineData: {\n mimeType: string;\n data: string;\n };\n}\n\nexport interface GoogleAIFileDataPart {\n fileData: {\n mimeType: string;\n fileUri: string;\n };\n}\n\nexport type GoogleAIPart = GoogleAITextPart | GoogleAIInlineDataPart | GoogleAIFileDataPart;\nexport interface GoogleAIMessage {\n role: \"user\" | \"model\";\n parts: GoogleAIPart[];\n}\nexport interface GoogleAIPayload {\n model: GeminiModel;\n messages: GoogleAIMessage[];\n tools?: {\n functionDeclarations: FunctionDefinition[];\n };\n systemInstruction?: string;\n}\n\nexport type AnyModel = GPTModel | ClaudeModel | GroqModel | GeminiModel;\n\nexport interface GenericPayload {\n model: AnyModel;\n messages: GenericMessage[];\n functions?: FunctionDefinition[];\n function_call?: \"none\" | \"auto\" | { name: string };\n temperature?: number;\n fallbackModel?: AnyModel;\n}\n\nexport interface OpenAIBody {\n choices: {\n message: OpenAIResponseMessage;\n }[];\n error?: {\n code: string;\n };\n usage: {\n completion_tokens: number;\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n","type LogLevel = \"LOG\" | \"WARN\" | \"ERROR\";\nexport type Identifier = string | string[];\n\nfunction formatIdentifier(identifier: Identifier): string {\n if (Array.isArray(identifier)) {\n return identifier.map((id) => `[${id}]`).join(\" \");\n }\n return `[${identifier}]`;\n}\n\nfunction formatMessage(\n level: LogLevel,\n identifier: Identifier,\n message: string\n): string {\n return `[${level}] ${formatIdentifier(identifier)} ${message}`;\n}\n\nexport function log(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.log(formatMessage(\"LOG\", identifier, message), ...args);\n}\n\nexport function warn(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.warn(formatMessage(\"WARN\", identifier, message), ...args);\n}\n\nexport function error(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.error(formatMessage(\"ERROR\", identifier, message), ...args);\n}\n\nexport default {\n log,\n warn,\n error,\n};\n","export function timeout(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function isHeicImage(name: string, mime?: string): boolean {\n const extension = name.split(\".\").pop()?.toLowerCase() || \"\";\n return (\n [\"heic\", \"heif\", \"heics\"].includes(extension) ||\n !!(\n mime && [\"image/heic\", \"image/heif\", \"image/heic-sequence\"].includes(mime)\n )\n );\n}\n"],"mappings":"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","names":["ClaudeModel","GPTModel","GroqModel","GeminiModel","error","axios","_a","_b"]}
|
|
1
|
+
{"version":3,"sources":["../index.ts","../interfaces.ts","../logger.ts","../utils.ts"],"sourcesContent":["import {\n ClaudeModel,\n GPTModel,\n OpenAIPayload,\n OpenAIMessage,\n OpenAIConfig,\n AnthropicAIPayload,\n AnthropicAIMessage,\n GenericMessage,\n AnthropicAIConfig,\n GenericPayload,\n GroqPayload,\n GroqModel,\n OpenRouterPayload,\n OpenRouterModel,\n ParsedResponseMessage,\n FunctionCall,\n AnthropicContentBlock,\n OpenAIContentBlock,\n GoogleAIPayload,\n GeminiModel,\n GoogleAIPart,\n File,\n GoogleAIMessage,\n AnyModel,\n} from \"./interfaces\";\nimport logger, { Identifier } from \"./logger\";\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from \"@aws-sdk/client-bedrock-runtime\";\nimport axios from \"axios\";\nimport { isHeicImage, timeout } from \"./utils\";\nimport { GoogleGenAI } from \"@google/genai\";\n\nconst sharp = require(\"sharp\");\nconst decode = require(\"heic-decode\");\n\nexport {\n ClaudeModel,\n GPTModel,\n GroqModel,\n GeminiModel,\n OpenRouterModel,\n OpenAIConfig,\n FunctionDefinition,\n GenericMessage,\n GenericPayload,\n AnyModel,\n} from \"./interfaces\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SHARED UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generic retry wrapper for API calls with exponential backoff.\n */\nasync function withRetries<T>(\n identifier: Identifier,\n apiName: string,\n fn: () => Promise<T>,\n options: {\n retries?: number;\n baseDelayMs?: number;\n onError?: (error: any, attempt: number) => void;\n } = {},\n): Promise<T> {\n const { retries = 5, baseDelayMs = 125, onError } = options;\n\n logger.log(identifier, `Calling ${apiName} API with retries`);\n\n let lastError: any;\n for (let attempt = 0; attempt < retries; attempt++) {\n try {\n return await fn();\n } catch (error: any) {\n lastError = error;\n\n if (onError) {\n onError(error, attempt);\n } else {\n logger.error(\n identifier,\n `Retry #${attempt} error: ${error.message}`,\n error.response?.data || error,\n );\n }\n\n await timeout(baseDelayMs * attempt);\n }\n }\n\n const error = new Error(\n `Failed to call ${apiName} API after ${retries} attempts`,\n ) as any;\n error.cause = lastError;\n throw error;\n}\n\nfunction parseStreamedResponse(\n identifier: Identifier,\n paragraph: string,\n toolCallAccumulators: { name: string; arguments: string }[],\n allowedFunctionNames: Set<string> | null,\n): ParsedResponseMessage {\n const functionCalls: FunctionCall[] = [];\n\n for (const acc of toolCallAccumulators) {\n if (!acc.name || !acc.arguments) continue;\n\n if (allowedFunctionNames && !allowedFunctionNames.has(acc.name)) {\n throw new Error(\n `Stream error: received function call with unknown name: ${acc.name}`,\n );\n }\n\n try {\n functionCalls.push({\n name: acc.name,\n arguments: JSON.parse(acc.arguments),\n });\n } catch (error) {\n logger.error(\n identifier,\n \"Error parsing function call arguments:\",\n acc.arguments,\n );\n throw error;\n }\n }\n\n if (!paragraph && !functionCalls.length) {\n logger.error(\n identifier,\n \"Stream error: received message without content or function_call:\",\n JSON.stringify({ paragraph, toolCallAccumulators }),\n );\n throw new Error(\n \"Stream error: received message without content or function_call\",\n );\n }\n\n return {\n role: \"assistant\",\n content: paragraph || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n usage: null,\n };\n}\n\nfunction truncatePayload(payload: OpenAIPayload): string {\n return JSON.stringify(\n {\n ...payload,\n messages: payload.messages.map((message) => {\n const truncatedMessage = { ...message };\n if (typeof truncatedMessage.content === \"string\") {\n truncatedMessage.content = truncatedMessage.content.slice(0, 100);\n } else if (Array.isArray(truncatedMessage.content)) {\n truncatedMessage.content = truncatedMessage.content.map((block) => {\n if (block.type === \"image_url\") {\n return {\n ...block,\n image_url: { url: block.image_url.url.slice(0, 100) },\n };\n }\n return block;\n });\n }\n return truncatedMessage;\n }),\n },\n null,\n 2,\n );\n}\n\nasync function getNormalizedBase64PNG(\n url: string,\n mime: string,\n): Promise<string> {\n const response = await axios.get(url, { responseType: \"arraybuffer\" });\n\n let imageBuffer = Buffer.from(response.data);\n let sharpOptions = {};\n\n if (isHeicImage(url, mime)) {\n const imageData = await decode({ buffer: imageBuffer });\n imageBuffer = Buffer.from(imageData.data);\n sharpOptions = {\n raw: {\n width: imageData.width,\n height: imageData.height,\n channels: 4,\n },\n };\n }\n\n // Limits size of image to < 5MB Anthropic limit\n const resizedBuffer = await sharp(imageBuffer, sharpOptions)\n .withMetadata()\n .resize(1024, 1024, { fit: \"inside\", withoutEnlargement: true })\n .png()\n .toBuffer();\n\n return resizedBuffer.toString(\"base64\");\n}\n\nconst ALLOWED_IMAGE_MIME_TYPES = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// OPENAI\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface OpenAIRequestConfig {\n endpoint: string;\n headers: Record<string, string>;\n}\n\nfunction buildOpenAIRequestConfig(\n identifier: Identifier,\n model: string,\n config: OpenAIConfig | undefined,\n): OpenAIRequestConfig {\n if (!config) {\n config = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n if (config.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service:\", model);\n\n if (!config.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\",\n );\n }\n\n const azureConfig = config.modelConfigMap[model as GPTModel];\n if (!azureConfig?.endpoint) {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n\n const endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n logger.log(identifier, \"Using endpoint:\", endpoint);\n\n return {\n endpoint,\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n };\n }\n\n // Default: OpenAI\n logger.log(identifier, \"Using OpenAI service:\", model);\n if (config.orgId) {\n logger.log(identifier, \"Using orgId:\", config.orgId);\n }\n\n return {\n endpoint: \"https://api.openai.com/v1/chat/completions\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.apiKey}`,\n ...(config.orgId ? { \"OpenAI-Organization\": config.orgId } : {}),\n },\n };\n}\n\nasync function prepareOpenAIPayload(\n identifier: Identifier,\n payload: GenericPayload,\n): Promise<OpenAIPayload> {\n const preparedPayload: OpenAIPayload = {\n model: payload.model as GPTModel,\n messages: [],\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call\n : { type: \"function\", function: payload.function_call }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const contentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n contentBlocks.push({ type: \"text\", text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n contentBlocks.push({\n type: \"image_url\",\n image_url: { url: file.url },\n });\n contentBlocks.push({ type: \"text\", text: `Image (${file.url})` });\n } else if (file.data) {\n contentBlocks.push({\n type: \"image_url\",\n image_url: { url: `data:${file.mimeType};base64,${file.data}` },\n });\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n contentBlocks.push({\n type: \"text\",\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: contentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callOpenAIStream(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n chunkTimeoutMs: number,\n): Promise<ParsedResponseMessage> {\n const functionNames: Set<string> | null = openAiPayload.tools\n ? new Set(openAiPayload.tools.map((fn) => fn.function.name as string))\n : null;\n\n const { endpoint, headers } = buildOpenAIRequestConfig(\n id,\n openAiPayload.model,\n openAiConfig,\n );\n\n const controller = new AbortController();\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...openAiPayload, stream: true }),\n signal: controller.signal,\n });\n\n if (!response.body) {\n throw new Error(\"Stream error: no response body\");\n }\n\n let paragraph = \"\";\n const toolCallAccumulators: { name: string; arguments: string }[] = [];\n\n const reader = response.body.getReader();\n let partialChunk = \"\";\n let chunkIndex = -1;\n\n const createAbortTimeout = () =>\n setTimeout(() => {\n logger.error(id, `Stream timeout after ${chunkTimeoutMs}ms`);\n controller.abort();\n }, chunkTimeoutMs);\n\n while (true) {\n chunkIndex++;\n const abortTimeout = createAbortTimeout();\n const { done, value } = await reader.read();\n clearTimeout(abortTimeout);\n\n if (done) {\n logger.error(\n id,\n `Stream ended prematurely after ${chunkIndex + 1} chunks`,\n );\n throw new Error(\"Stream error: ended prematurely\");\n }\n\n let chunk = new TextDecoder().decode(value);\n if (partialChunk) {\n chunk = partialChunk + chunk;\n partialChunk = \"\";\n }\n\n const jsonStrings = chunk.split(/^data: /gm);\n\n for (const jsonString of jsonStrings) {\n if (!jsonString) continue;\n\n if (jsonString.includes(\"[DONE]\")) {\n return parseStreamedResponse(\n id,\n paragraph,\n toolCallAccumulators,\n functionNames,\n );\n }\n\n let json;\n try {\n json = JSON.parse(jsonString.trim());\n } catch {\n partialChunk = jsonString;\n continue;\n }\n\n if (!json.choices?.length) {\n if (json.error) {\n logger.error(id, \"Stream error from OpenAI:\", json.error);\n const error = new Error(\"Stream error: OpenAI error\") as any;\n error.data = json.error;\n error.requestBody = truncatePayload(openAiPayload);\n throw error;\n }\n if (chunkIndex !== 0) {\n logger.error(id, \"Stream error: no choices in JSON:\", json);\n }\n continue;\n }\n\n const toolCalls = json.choices[0]?.delta?.tool_calls;\n if (toolCalls) {\n for (const toolCall of toolCalls) {\n const idx = toolCall.index ?? 0;\n while (toolCallAccumulators.length <= idx) {\n toolCallAccumulators.push({ name: \"\", arguments: \"\" });\n }\n if (toolCall.function?.name)\n toolCallAccumulators[idx].name += toolCall.function.name;\n if (toolCall.function?.arguments)\n toolCallAccumulators[idx].arguments += toolCall.function.arguments;\n }\n }\n\n const text = json.choices[0]?.delta?.content;\n if (text) paragraph += text;\n }\n }\n}\n\nasync function callOpenAI(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n): Promise<ParsedResponseMessage> {\n const { endpoint, headers } = buildOpenAIRequestConfig(\n id,\n openAiPayload.model,\n openAiConfig,\n );\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...openAiPayload, stream: false }),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n logger.error(id, \"OpenAI API error:\", errorData);\n throw new Error(`OpenAI API Error: ${errorData.error.message}`);\n }\n\n const data = await response.json();\n\n if (!data.choices?.length) {\n if (data.error) {\n logger.error(id, \"OpenAI error:\", data.error);\n throw new Error(`OpenAI error: ${data.error.message}`);\n }\n throw new Error(\"OpenAI error: No choices returned.\");\n }\n\n const choice = data.choices[0];\n\n // Check for tool_calls (modern API) first, fall back to function_call (legacy)\n const toolCalls = choice.message?.tool_calls;\n const functionCalls: FunctionCall[] = [];\n\n if (toolCalls?.length) {\n for (const tc of toolCalls) {\n functionCalls.push({\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n });\n }\n } else if (choice.function_call) {\n functionCalls.push({\n name: choice.function_call.name,\n arguments: JSON.parse(choice.function_call.arguments),\n });\n }\n\n return {\n role: \"assistant\",\n content: choice.message.content || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n usage: data.usage\n ? {\n prompt_tokens: data.usage.prompt_tokens,\n completion_tokens: data.usage.completion_tokens,\n total_tokens: data.usage.total_tokens,\n }\n : null,\n };\n}\n\nasync function callOpenAiWithRetries(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000,\n): Promise<ParsedResponseMessage> {\n logger.log(\n id,\n \"Calling OpenAI API with retries:\",\n openAiConfig?.service,\n openAiPayload.model,\n );\n\n const useStreaming =\n openAiPayload.model !== GPTModel.O1_MINI &&\n openAiPayload.model !== GPTModel.O1_PREVIEW;\n\n return withRetries(\n id,\n \"OpenAI\",\n async () => {\n if (useStreaming) {\n return callOpenAIStream(\n id,\n openAiPayload,\n openAiConfig,\n chunkTimeoutMs,\n );\n } else {\n return callOpenAI(id, openAiPayload, openAiConfig);\n }\n },\n {\n retries,\n baseDelayMs: 250,\n onError: (error, attempt) => {\n logger.error(\n id,\n `Retry #${attempt} error: ${error.message}`,\n error.response?.data || error.data || error,\n );\n\n // Remove images on content policy violation\n if (error.data?.code === \"content_policy_violation\") {\n logger.log(id, \"Removing images due to content policy violation\");\n openAiPayload.messages.forEach((message: OpenAIMessage) => {\n if (Array.isArray(message.content)) {\n message.content = message.content.filter(\n (content) => content.type === \"text\",\n );\n }\n });\n }\n },\n },\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ANTHROPIC\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction jigAnthropicMessages(\n messages: AnthropicAIMessage[],\n): AnthropicAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // Ensure first message is from user\n if (jiggedMessages[0]?.role !== \"user\") {\n jiggedMessages = [\n { role: \"user\" as const, content: \"...\" },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) return [message];\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n const lastContent = Array.isArray(lastMessage.content)\n ? lastMessage.content\n : [{ type: \"text\" as const, text: lastMessage.content }];\n const newContent = Array.isArray(message.content)\n ? message.content\n : [{ type: \"text\" as const, text: message.content }];\n\n lastMessage.content = [\n ...lastContent,\n { type: \"text\", text: \"\\n\\n---\\n\\n\" },\n ...newContent,\n ];\n return acc;\n }\n\n // Convert string content to text content block\n if (typeof message.content === \"string\") {\n message.content = [{ type: \"text\", text: message.content }];\n }\n\n return [...acc, message];\n }, [] as AnthropicAIMessage[]);\n\n // Ensure last message is from user\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"assistant\") {\n jiggedMessages.push({ role: \"user\", content: \"...\" });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareAnthropicPayload(\n _identifier: Identifier,\n payload: GenericPayload,\n): Promise<AnthropicAIPayload> {\n const preparedPayload: AnthropicAIPayload = {\n model: payload.model as ClaudeModel,\n messages: [],\n functions: payload.functions,\n temperature: payload.temperature,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n const contentBlocks: AnthropicContentBlock[] = [];\n\n if (message.content) {\n contentBlocks.push({ type: \"text\", text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n if (message.role == \"user\") {\n // anthropic assistant turns can't have images\n contentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n }\n contentBlocks.push({ type: \"text\", text: `Image (${file.url})` });\n } else if (file.data) {\n if (message.role == \"user\") {\n // anthropic assistant turns can't have images\n contentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: file.mimeType as any,\n data: file.data,\n },\n });\n }\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n contentBlocks.push({\n type: \"text\",\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: contentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callAnthropic(\n id: Identifier,\n payload: AnthropicAIPayload,\n config?: AnthropicAIConfig,\n): Promise<ParsedResponseMessage> {\n const anthropicMessages = jigAnthropicMessages(payload.messages);\n const tools = payload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n }));\n\n let data;\n\n if (config?.service === \"bedrock\") {\n const AWS_REGION = \"us-east-1\";\n const MODEL_ID = \"anthropic.claude-3-haiku-20240307-v1:0\";\n\n const client = new BedrockRuntimeClient({ region: AWS_REGION });\n const bedrockPayload = {\n anthropic_version: \"bedrock-2023-05-31\",\n max_tokens: 4096,\n messages: anthropicMessages,\n tools,\n };\n\n const response = await client.send(\n new InvokeModelCommand({\n contentType: \"application/json\",\n body: JSON.stringify(bedrockPayload),\n modelId: MODEL_ID,\n }),\n );\n\n const decodedResponseBody = new TextDecoder().decode(response.body);\n data = JSON.parse(decodedResponseBody);\n } else {\n // Default: Anthropic API\n const response = await axios.post(\n \"https://api.anthropic.com/v1/messages\",\n {\n model: payload.model,\n messages: anthropicMessages,\n tools,\n temperature: payload.temperature,\n system: payload.system,\n max_tokens: 4096,\n },\n {\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": process.env.ANTHROPIC_API_KEY as string,\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-beta\": \"tools-2024-04-04\",\n },\n timeout: 60000,\n },\n );\n data = response.data;\n }\n\n const answers = data.content;\n if (!answers?.[0]) {\n logger.error(id, \"Missing answer in Anthropic API response:\", data);\n throw new Error(\"Missing answer in Anthropic API\");\n }\n\n let textResponse = \"\";\n const functionCalls: FunctionCall[] = [];\n\n for (const answer of answers) {\n if (!answer.type) {\n logger.error(id, \"Missing answer type in Anthropic API response:\", data);\n throw new Error(\"Missing answer type in Anthropic API\");\n }\n\n if (answer.type === \"text\") {\n let text = answer.text\n .replace(/<thinking>.*?<\\/thinking>/gs, \"\")\n .replace(/<answer>|<\\/answer>/gs, \"\")\n .trim();\n\n if (!text) {\n text = answer.text.replace(\n /<thinking>|<\\/thinking>|<answer>|<\\/answer>/gs,\n \"\",\n );\n logger.log(id, \"No text in answer, returning text within tags:\", text);\n }\n\n textResponse = textResponse ? `${textResponse}\\n\\n${text}` : text;\n } else if (answer.type === \"tool_use\") {\n functionCalls.push({\n name: answer.name,\n arguments: answer.input,\n });\n }\n }\n\n if (!textResponse && !functionCalls.length) {\n logger.error(\n id,\n \"Missing text & functions in Anthropic API response:\",\n data,\n );\n throw new Error(\"Missing text & functions in Anthropic API response\");\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n usage: data.usage\n ? {\n prompt_tokens: data.usage.input_tokens,\n completion_tokens: data.usage.output_tokens,\n total_tokens: data.usage.input_tokens + data.usage.output_tokens,\n }\n : null,\n };\n}\n\nasync function callAnthropicWithRetries(\n id: Identifier,\n payload: AnthropicAIPayload,\n config?: AnthropicAIConfig,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n return withRetries(\n id,\n \"Anthropic\",\n () => callAnthropic(id, payload, config),\n {\n retries,\n },\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// GOOGLE AI\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction jigGoogleMessages(messages: GoogleAIMessage[]): GoogleAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // Ensure first message is from user\n if (jiggedMessages[0]?.role === \"model\") {\n jiggedMessages = [\n { role: \"user\" as const, parts: [{ text: \"...\" }] },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) return [message];\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n lastMessage.parts = [...lastMessage.parts, ...message.parts];\n return acc;\n }\n\n return [...acc, message];\n }, [] as GoogleAIMessage[]);\n\n // Ensure last message is from user\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"model\") {\n jiggedMessages.push({ role: \"user\", parts: [{ text: \"...\" }] });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareGoogleAIPayload(\n _identifier: Identifier,\n payload: GenericPayload,\n): Promise<GoogleAIPayload> {\n const preparedPayload: GoogleAIPayload = {\n model: payload.model as GeminiModel,\n messages: [],\n tools: payload.functions\n ? {\n functionDeclarations: payload.functions.map((fn) => ({\n name: fn.name,\n parameters: {\n description: fn.description,\n ...fn.parameters,\n },\n })),\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.systemInstruction = message.content;\n continue;\n }\n\n const parts: GoogleAIPart[] = [];\n\n if (message.content) {\n parts.push({ text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n parts.push({\n fileData: {\n mimeType: file.mimeType,\n fileUri: file.url,\n },\n });\n parts.push({ text: `Image (${file.url})` });\n } else if (file.data) {\n parts.push({\n inlineData: {\n mimeType: file.mimeType,\n data: file.data,\n },\n });\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n parts.push({\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role === \"assistant\" ? \"model\" : message.role,\n parts,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callGoogleAI(\n id: Identifier,\n payload: GoogleAIPayload,\n): Promise<ParsedResponseMessage> {\n const googleMessages = jigGoogleMessages(payload.messages);\n const history = googleMessages.slice(0, -1);\n const lastMessage = googleMessages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\n const chat = genAI.chats.create({\n model: payload.model,\n history,\n config: {\n responseModalities: [\"Text\"],\n tools: payload.tools ? [payload.tools] : undefined,\n systemInstruction: payload.systemInstruction,\n },\n });\n\n const response = await chat.sendMessage({ message: lastMessage.parts });\n\n let text = \"\";\n const files: File[] = [];\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.text) text += part.text;\n if (part.inlineData?.data) {\n files.push({ mimeType: \"image/png\", data: part.inlineData.data });\n }\n }\n\n const functionCalls = response.functionCalls?.map((fc) => ({\n name: fc.name ?? \"\",\n arguments: fc.args ?? {},\n }));\n\n if (!text && !functionCalls?.length && !files.length) {\n const candidate = response.candidates?.[0];\n const finishReason = candidate?.finishReason;\n\n logger.error(id, \"Missing text & functions in Google AI API response:\", {\n finishReason,\n safetyRatings: candidate?.safetyRatings,\n usageMetadata: response.usageMetadata,\n modelVersion: response.modelVersion,\n candidateContent: candidate?.content,\n promptFeedback: response.promptFeedback,\n });\n\n let errorMessage = \"Missing text & functions in Google AI API response\";\n if (finishReason) {\n const reasonDescriptions: Record<string, string> = {\n MALFORMED_FUNCTION_CALL:\n \"(Google could not generate valid function call arguments)\",\n SAFETY: \"(blocked by safety filters)\",\n RECITATION: \"(blocked due to recitation)\",\n MAX_TOKENS: \"(response truncated due to max tokens)\",\n };\n errorMessage += `: finishReason=${finishReason} ${reasonDescriptions[finishReason] || \"\"}`;\n }\n\n const error = new Error(errorMessage) as any;\n error.finishReason = finishReason;\n error.safetyRatings = candidate?.safetyRatings;\n error.usageMetadata = response.usageMetadata;\n error.promptFeedback = response.promptFeedback;\n throw error;\n }\n\n return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: functionCalls?.[0] || null,\n function_calls: functionCalls || [],\n usage: response.usageMetadata\n ? {\n prompt_tokens: response.usageMetadata.promptTokenCount ?? 0,\n completion_tokens: response.usageMetadata.candidatesTokenCount ?? 0,\n total_tokens: response.usageMetadata.totalTokenCount ?? 0,\n }\n : null,\n };\n}\n\n/**\n * Content violation finish reasons that should trigger circuit breaker behavior.\n * These errors won't resolve with simple retries - the content itself is the problem.\n */\nconst CONTENT_VIOLATION_REASONS = new Set([\"PROHIBITED_CONTENT\", \"SAFETY\"]);\n\n/**\n * Removes inline image data from Google AI messages, preserving text content.\n * Used as a fallback when content violations are detected.\n */\nfunction removeImagesFromGooglePayload(payload: GoogleAIPayload): boolean {\n let removedImages = false;\n\n for (const message of payload.messages) {\n message.parts = message.parts.filter((part) => {\n if (\"inlineData\" in part || \"fileData\" in part) {\n removedImages = true;\n return false;\n }\n return true;\n });\n\n // Ensure message still has content after removing images\n if (message.parts.length === 0) {\n message.parts = [{ text: \"(image removed due to content policy)\" }];\n }\n }\n\n return removedImages;\n}\n\nasync function callGoogleAIWithRetries(\n id: Identifier,\n payload: GoogleAIPayload,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n let hasTriedWithoutImages = false;\n\n return withRetries(id, \"Google AI\", () => callGoogleAI(id, payload), {\n retries,\n onError: (error, attempt) => {\n const errorDetails: Record<string, any> = {\n message: error.message,\n finishReason: error.finishReason,\n modelVersion: error.modelVersion,\n };\n\n if (error.safetyRatings) errorDetails.safetyRatings = error.safetyRatings;\n if (error.usageMetadata) errorDetails.usageMetadata = error.usageMetadata;\n if (error.promptFeedback)\n errorDetails.promptFeedback = error.promptFeedback;\n if (error.status) errorDetails.httpStatus = error.status;\n if (error.code) errorDetails.errorCode = error.code;\n if (error.details) errorDetails.errorDetails = error.details;\n\n const fileUris = payload.messages\n .flatMap((m) => m.parts)\n .filter((p) => \"fileData\" in p)\n .map((p) => (p as any).fileData.fileUri);\n if (fileUris.length) errorDetails.fileUris = fileUris;\n\n logger.error(\n id,\n `Retry #${attempt} error: ${error.message}`,\n errorDetails,\n );\n\n // Circuit breaker: detect content violations and try removing images\n // Check both finishReason (candidate-level) and promptFeedback.blockReason (prompt-level)\n const violationReason =\n (CONTENT_VIOLATION_REASONS.has(error.finishReason) &&\n error.finishReason) ||\n (CONTENT_VIOLATION_REASONS.has(error.promptFeedback?.blockReason) &&\n error.promptFeedback?.blockReason);\n\n if (violationReason) {\n if (!hasTriedWithoutImages) {\n const removedImages = removeImagesFromGooglePayload(payload);\n if (removedImages) {\n logger.log(\n id,\n `Circuit breaker triggered: removing images due to ${violationReason}`,\n );\n hasTriedWithoutImages = true;\n return; // Continue to next retry with images removed\n }\n }\n\n // If we already tried without images or there were no images, fail fast\n logger.error(\n id,\n `Circuit breaker: failing fast due to ${violationReason} (no more fallbacks)`,\n );\n const circuitBreakerError = new Error(\n `Google AI content violation: ${violationReason}. Request cannot succeed with current content.`,\n ) as any;\n circuitBreakerError.finishReason = error.finishReason;\n circuitBreakerError.safetyRatings = error.safetyRatings;\n circuitBreakerError.usageMetadata = error.usageMetadata;\n circuitBreakerError.circuitBreaker = true;\n throw circuitBreakerError;\n }\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// GROQ\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction normalizeMessageContent(\n content: AnthropicAIMessage[\"content\"],\n): string {\n return Array.isArray(content)\n ? content\n .map((c) => (c.type === \"text\" ? c.text : `[${c.type}]`))\n .join(\"\\n\")\n : content;\n}\n\nfunction prepareGroqPayload(payload: GenericPayload): GroqPayload {\n return {\n model: payload.model as GroqModel,\n messages: payload.messages.map((message) => ({\n role: message.role,\n content: normalizeMessageContent(message.content),\n })),\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call\n : { type: \"function\", function: payload.function_call }\n : undefined,\n temperature: payload.temperature,\n };\n}\n\nasync function callGroq(\n id: Identifier,\n payload: GroqPayload,\n): Promise<ParsedResponseMessage> {\n const response = await axios.post(\n \"https://api.groq.com/openai/v1/chat/completions\",\n payload,\n {\n headers: {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${process.env.GROQ_API_KEY}`,\n },\n },\n );\n\n const answer = response.data.choices[0]?.message;\n if (!answer) {\n logger.error(id, \"Missing answer in Groq API response:\", response.data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const functionCalls: FunctionCall[] = [];\n if (answer.tool_calls?.length) {\n for (const tc of answer.tool_calls) {\n functionCalls.push({\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n return {\n role: \"assistant\",\n content: answer.content || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n usage: response.data.usage\n ? {\n prompt_tokens: response.data.usage.prompt_tokens,\n completion_tokens: response.data.usage.completion_tokens,\n total_tokens: response.data.usage.total_tokens,\n }\n : null,\n };\n}\n\nasync function callGroqWithRetries(\n id: Identifier,\n payload: GroqPayload,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n return withRetries(id, \"Groq\", () => callGroq(id, payload), { retries });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// OPENROUTER\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction prepareOpenRouterPayload(payload: GenericPayload): OpenRouterPayload {\n return {\n model: payload.model as OpenRouterModel,\n messages: payload.messages.map((message) => ({\n role: message.role,\n content: normalizeMessageContent(message.content),\n })),\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call\n : { type: \"function\", function: payload.function_call }\n : undefined,\n temperature: payload.temperature,\n };\n}\n\nasync function callOpenRouter(\n id: Identifier,\n payload: OpenRouterPayload,\n): Promise<ParsedResponseMessage> {\n const response = await axios.post(\n \"https://openrouter.ai/api/v1/chat/completions\",\n payload,\n {\n headers: {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${process.env.OPENROUTER_API_KEY}`,\n },\n },\n );\n\n const answer = response.data.choices[0]?.message;\n if (!answer) {\n logger.error(id, \"Missing answer in OpenRouter API response:\", response.data);\n throw new Error(\"Missing answer in OpenRouter API\");\n }\n\n const functionCalls: FunctionCall[] = [];\n if (answer.tool_calls?.length) {\n for (const tc of answer.tool_calls) {\n functionCalls.push({\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n return {\n role: \"assistant\",\n content: answer.content || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n usage: response.data.usage\n ? {\n prompt_tokens: response.data.usage.prompt_tokens,\n completion_tokens: response.data.usage.completion_tokens,\n total_tokens: response.data.usage.total_tokens,\n }\n : null,\n };\n}\n\nasync function callOpenRouterWithRetries(\n id: Identifier,\n payload: OpenRouterPayload,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n return withRetries(id, \"OpenRouter\", () => callOpenRouter(id, payload), { retries });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MAIN ENTRY POINT\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction isAnthropicPayload(payload: GenericPayload): boolean {\n return Object.values(ClaudeModel).includes(payload.model as ClaudeModel);\n}\n\nfunction isOpenAiPayload(payload: GenericPayload): boolean {\n return Object.values(GPTModel).includes(payload.model as GPTModel);\n}\n\nfunction isGroqPayload(payload: GenericPayload): boolean {\n return Object.values(GroqModel).includes(payload.model as GroqModel);\n}\n\nfunction isGoogleAIPayload(payload: GenericPayload): boolean {\n return Object.values(GeminiModel).includes(payload.model as GeminiModel);\n}\n\nfunction isOpenRouterPayload(payload: GenericPayload): boolean {\n return Object.values(OpenRouterModel).includes(payload.model as OpenRouterModel);\n}\n\nexport async function callWithRetries(\n id: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000,\n): Promise<ParsedResponseMessage> {\n try {\n if (isAnthropicPayload(aiPayload)) {\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(id, aiPayload),\n aiConfig as AnthropicAIConfig,\n retries,\n );\n }\n\n if (isOpenAiPayload(aiPayload)) {\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(id, aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs,\n );\n }\n\n if (isGroqPayload(aiPayload)) {\n return await callGroqWithRetries(\n id,\n prepareGroqPayload(aiPayload),\n retries,\n );\n }\n\n if (isGoogleAIPayload(aiPayload)) {\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(id, aiPayload),\n retries,\n );\n }\n\n if (isOpenRouterPayload(aiPayload)) {\n return await callOpenRouterWithRetries(\n id,\n prepareOpenRouterPayload(aiPayload),\n retries,\n );\n }\n\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n } catch (error) {\n if (aiPayload.fallbackModel) {\n logger.error(\n id,\n `Primary model ${aiPayload.model} failed, falling back to ${aiPayload.fallbackModel}`,\n {\n error: error instanceof Error ? error.message : error,\n cause:\n error instanceof Error && (error as any).cause instanceof Error\n ? (error as any).cause.message\n : undefined,\n },\n );\n return callWithRetries(\n id,\n {\n ...aiPayload,\n model: aiPayload.fallbackModel,\n fallbackModel: undefined,\n },\n aiConfig,\n retries,\n chunkTimeoutMs,\n );\n }\n throw error;\n }\n}\n","export enum ClaudeModel {\n HAIKU_3 = \"claude-3-haiku-20240307\",\n SONNET_3 = \"claude-3-sonnet-20240229\",\n OPUS_3 = \"claude-3-opus-20240229\",\n HAIKU_3_5 = \"claude-3-5-haiku-20241022\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\n OPUS_4_1 = \"claude-opus-4-1\",\n HAIKU_4_5 = \"claude-haiku-4-5\",\n SONNET_4_5 = \"claude-sonnet-4-5\",\n OPUS_4_5 = \"claude-opus-4-5\",\n}\n\nexport enum GPTModel {\n GPT35_0613 = \"gpt-3.5-turbo-0613\",\n GPT35_0613_16K = \"gpt-3.5-turbo-16k-0613\",\n GPT35_0125 = \"gpt-3.5-turbo-0125\",\n GPT4_1106_PREVIEW = \"gpt-4-1106-preview\",\n GPT4_0125_PREVIEW = \"gpt-4-0125-preview\",\n GPT4_0409 = \"gpt-4-turbo-2024-04-09\",\n GPT4O = \"gpt-4o\",\n GPT4O_MINI = \"gpt-4o-mini\",\n O1_PREVIEW = \"o1-preview\",\n O1_MINI = \"o1-mini\",\n O3_MINI = \"o3-mini\",\n GPT4_1 = \"gpt-4.1\",\n GPT4_1_MINI = \"gpt-4.1-mini\",\n GPT4_1_NANO = \"gpt-4.1-nano\",\n GPT5 = \"gpt-5\",\n GPT5_MINI = \"gpt-5-mini\",\n}\n\nexport enum GroqModel {\n LLAMA_3_70B_8192 = \"llama3-70b-8192\",\n LLAMA_3_3_70B_VERSATILE = \"llama-3.3-70b-versatile\",\n QWEN3_32B = \"qwen/qwen3-32b\",\n DEEPSEEK_R1_DISTILL_LLAMA_70B = \"deepseek-r1-distill-llama-70b\",\n}\n\nexport enum OpenRouterModel {\n QWEN3_6_PLUS_FREE = \"qwen/qwen3.6-plus:free\",\n}\n\nexport enum GeminiModel {\n GEMINI_1_5_PRO = \"gemini-1.5-pro-latest\",\n GEMINI_EXP_1206 = \"gemini-exp-1206\",\n GEMINI_2_0_FLASH = \"gemini-2.0-flash\",\n GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION = \"gemini-2.0-flash-exp-image-generation\",\n GEMINI_2_0_FLASH_THINKING_EXP = \"gemini-2.0-flash-thinking-exp\",\n GEMINI_2_0_FLASH_THINKING_EXP_01_21 = \"gemini-2.0-flash-thinking-exp-01-21\",\n GEMINI_2_5_FLASH_PREVIEW_04_17 = \"gemini-2.5-flash-preview-04-17\",\n GEMINI_3_FLASH_PREVIEW = \"gemini-3-flash-preview\",\n GEMINI_3_1_FLASH_LITE_PREVIEW = \"gemini-3.1-flash-lite-preview\",\n}\n\nexport interface GenericError {\n message: string;\n}\n\nexport enum ContentType {\n TEXT = \"text\",\n ATTACHMENT = \"attachment\",\n}\n\nexport type AIChainResponse = {\n content: string | null;\n contentType?: ContentType;\n functionCalls: FunctionCall[];\n};\n\nexport interface GenericMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp?: string;\n files?: File[];\n functionCalls?: FunctionCall[];\n}\n\nexport interface File {\n mimeType: string;\n url?: string;\n data?: string;\n}\n\nexport interface OpenAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | OpenAIContentBlock[];\n}\n\nexport type OpenAIContentBlock =\n | OpenAITextContentBlock\n | OpenAIImageContentBlock\n | OpenAIAudioContentBlock;\n\nexport interface OpenAITextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface OpenAIImageContentBlock {\n type: \"image_url\";\n image_url: {\n url: string; // URL to the image, can also be a base64 string\n };\n}\n\nexport interface OpenAIAudioContentBlock {\n type: \"audio_url\";\n audio_url: {\n url: string; // URL to the audio, can also be a base64 string\n };\n}\n\nexport interface AnthropicAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | AnthropicContentBlock[];\n}\n\nexport type AnthropicContentBlock =\n | AnthropicTextContentBlock\n | AnthropicImageContentBlock;\n\nexport interface AnthropicTextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface AnthropicImageContentBlock {\n type: \"image\";\n source: {\n type: \"base64\";\n media_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n data: string; // Must be a base64 string\n };\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface ParsedResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: FunctionCall | null;\n function_calls: FunctionCall[];\n files: File[];\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n } | null;\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIConfig {\n service: \"azure\" | \"openai\";\n apiKey: string;\n baseUrl: string;\n orgId?: string;\n modelConfigMap?: Record<\n GPTModel,\n {\n resource: string;\n deployment: string;\n apiVersion: string;\n apiKey: string;\n endpoint?: string;\n }\n >;\n}\n\nexport interface AnthropicAIConfig {\n service: \"anthropic\" | \"bedrock\";\n}\n\nexport interface FunctionDefinition {\n name: string;\n description?: string;\n parameters: Record<string, any>;\n}\n\ninterface FunctionWrapped {\n type: \"function\";\n function: FunctionDefinition;\n}\n\nexport interface GroqPayload {\n model: GroqModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n temperature?: number;\n\n functions?: any[]; // Deprecate this\n}\n\nexport interface OpenRouterPayload {\n model: OpenRouterModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n temperature?: number;\n}\n\nexport interface OpenAIPayload {\n model: GPTModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n}\n\nexport interface AnthropicAIPayload {\n model: ClaudeModel;\n messages: AnthropicAIMessage[];\n functions?: any[]; // TODO type this JSON schema\n temperature?: number;\n system?: string;\n}\n\nexport interface GoogleAITextPart {\n text: string;\n}\n\nexport interface GoogleAIInlineDataPart {\n inlineData: {\n mimeType: string;\n data: string;\n };\n}\n\nexport interface GoogleAIFileDataPart {\n fileData: {\n mimeType: string;\n fileUri: string;\n };\n}\n\nexport type GoogleAIPart = GoogleAITextPart | GoogleAIInlineDataPart | GoogleAIFileDataPart;\nexport interface GoogleAIMessage {\n role: \"user\" | \"model\";\n parts: GoogleAIPart[];\n}\nexport interface GoogleAIPayload {\n model: GeminiModel;\n messages: GoogleAIMessage[];\n tools?: {\n functionDeclarations: FunctionDefinition[];\n };\n systemInstruction?: string;\n}\n\nexport type AnyModel = GPTModel | ClaudeModel | GroqModel | GeminiModel | OpenRouterModel;\n\nexport interface GenericPayload {\n model: AnyModel;\n messages: GenericMessage[];\n functions?: FunctionDefinition[];\n function_call?: \"none\" | \"auto\" | { name: string };\n temperature?: number;\n fallbackModel?: AnyModel;\n}\n\nexport interface OpenAIBody {\n choices: {\n message: OpenAIResponseMessage;\n }[];\n error?: {\n code: string;\n };\n usage: {\n completion_tokens: number;\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n","type LogLevel = \"LOG\" | \"WARN\" | \"ERROR\";\nexport type Identifier = string | string[];\n\nfunction formatIdentifier(identifier: Identifier): string {\n if (Array.isArray(identifier)) {\n return identifier.map((id) => `[${id}]`).join(\" \");\n }\n return `[${identifier}]`;\n}\n\nfunction formatMessage(\n level: LogLevel,\n identifier: Identifier,\n message: string\n): string {\n return `[${level}] ${formatIdentifier(identifier)} ${message}`;\n}\n\nexport function log(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.log(formatMessage(\"LOG\", identifier, message), ...args);\n}\n\nexport function warn(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.warn(formatMessage(\"WARN\", identifier, message), ...args);\n}\n\nexport function error(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.error(formatMessage(\"ERROR\", identifier, message), ...args);\n}\n\nexport default {\n log,\n warn,\n error,\n};\n","export function timeout(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function isHeicImage(name: string, mime?: string): boolean {\n const extension = name.split(\".\").pop()?.toLowerCase() || \"\";\n return (\n [\"heic\", \"heif\", \"heics\"].includes(extension) ||\n !!(\n mime && [\"image/heic\", \"image/heif\", \"image/heic-sequence\"].includes(mime)\n )\n );\n}\n"],"mappings":"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","names":["ClaudeModel","GPTModel","GroqModel","OpenRouterModel","GeminiModel","error","axios","_a","_b"]}
|
package/dist/index.mjs
CHANGED
|
@@ -42,9 +42,15 @@ var GPTModel = /* @__PURE__ */ ((GPTModel2) => {
|
|
|
42
42
|
})(GPTModel || {});
|
|
43
43
|
var GroqModel = /* @__PURE__ */ ((GroqModel2) => {
|
|
44
44
|
GroqModel2["LLAMA_3_70B_8192"] = "llama3-70b-8192";
|
|
45
|
+
GroqModel2["LLAMA_3_3_70B_VERSATILE"] = "llama-3.3-70b-versatile";
|
|
46
|
+
GroqModel2["QWEN3_32B"] = "qwen/qwen3-32b";
|
|
45
47
|
GroqModel2["DEEPSEEK_R1_DISTILL_LLAMA_70B"] = "deepseek-r1-distill-llama-70b";
|
|
46
48
|
return GroqModel2;
|
|
47
49
|
})(GroqModel || {});
|
|
50
|
+
var OpenRouterModel = /* @__PURE__ */ ((OpenRouterModel2) => {
|
|
51
|
+
OpenRouterModel2["QWEN3_6_PLUS_FREE"] = "qwen/qwen3.6-plus:free";
|
|
52
|
+
return OpenRouterModel2;
|
|
53
|
+
})(OpenRouterModel || {});
|
|
48
54
|
var GeminiModel = /* @__PURE__ */ ((GeminiModel2) => {
|
|
49
55
|
GeminiModel2["GEMINI_1_5_PRO"] = "gemini-1.5-pro-latest";
|
|
50
56
|
GeminiModel2["GEMINI_EXP_1206"] = "gemini-exp-1206";
|
|
@@ -171,7 +177,8 @@ function parseStreamedResponse(identifier, paragraph, toolCallAccumulators, allo
|
|
|
171
177
|
content: paragraph || null,
|
|
172
178
|
function_call: functionCalls[0] || null,
|
|
173
179
|
function_calls: functionCalls,
|
|
174
|
-
files: []
|
|
180
|
+
files: [],
|
|
181
|
+
usage: null
|
|
175
182
|
};
|
|
176
183
|
}
|
|
177
184
|
function truncatePayload(payload) {
|
|
@@ -451,7 +458,12 @@ async function callOpenAI(id, openAiPayload, openAiConfig) {
|
|
|
451
458
|
content: choice.message.content || null,
|
|
452
459
|
function_call: functionCalls[0] || null,
|
|
453
460
|
function_calls: functionCalls,
|
|
454
|
-
files: []
|
|
461
|
+
files: [],
|
|
462
|
+
usage: data.usage ? {
|
|
463
|
+
prompt_tokens: data.usage.prompt_tokens,
|
|
464
|
+
completion_tokens: data.usage.completion_tokens,
|
|
465
|
+
total_tokens: data.usage.total_tokens
|
|
466
|
+
} : null
|
|
455
467
|
};
|
|
456
468
|
}
|
|
457
469
|
async function callOpenAiWithRetries(id, openAiPayload, openAiConfig, retries = 5, chunkTimeoutMs = 15e3) {
|
|
@@ -685,7 +697,12 @@ ${text}` : text;
|
|
|
685
697
|
content: textResponse,
|
|
686
698
|
function_call: functionCalls[0] || null,
|
|
687
699
|
function_calls: functionCalls,
|
|
688
|
-
files: []
|
|
700
|
+
files: [],
|
|
701
|
+
usage: data.usage ? {
|
|
702
|
+
prompt_tokens: data.usage.input_tokens,
|
|
703
|
+
completion_tokens: data.usage.output_tokens,
|
|
704
|
+
total_tokens: data.usage.input_tokens + data.usage.output_tokens
|
|
705
|
+
} : null
|
|
689
706
|
};
|
|
690
707
|
}
|
|
691
708
|
async function callAnthropicWithRetries(id, payload, config, retries = 5) {
|
|
@@ -777,7 +794,7 @@ async function prepareGoogleAIPayload(_identifier, payload) {
|
|
|
777
794
|
return preparedPayload;
|
|
778
795
|
}
|
|
779
796
|
async function callGoogleAI(id, payload) {
|
|
780
|
-
var _a, _b, _c, _d, _e, _f;
|
|
797
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
781
798
|
const googleMessages = jigGoogleMessages(payload.messages);
|
|
782
799
|
const history = googleMessages.slice(0, -1);
|
|
783
800
|
const lastMessage = googleMessages.slice(-1)[0];
|
|
@@ -841,7 +858,12 @@ async function callGoogleAI(id, payload) {
|
|
|
841
858
|
content: text || null,
|
|
842
859
|
files,
|
|
843
860
|
function_call: (functionCalls == null ? void 0 : functionCalls[0]) || null,
|
|
844
|
-
function_calls: functionCalls || []
|
|
861
|
+
function_calls: functionCalls || [],
|
|
862
|
+
usage: response.usageMetadata ? {
|
|
863
|
+
prompt_tokens: (_g = response.usageMetadata.promptTokenCount) != null ? _g : 0,
|
|
864
|
+
completion_tokens: (_h = response.usageMetadata.candidatesTokenCount) != null ? _h : 0,
|
|
865
|
+
total_tokens: (_i = response.usageMetadata.totalTokenCount) != null ? _i : 0
|
|
866
|
+
} : null
|
|
845
867
|
};
|
|
846
868
|
}
|
|
847
869
|
var CONTENT_VIOLATION_REASONS = /* @__PURE__ */ new Set(["PROHIBITED_CONTENT", "SAFETY"]);
|
|
@@ -971,12 +993,75 @@ async function callGroq(id, payload) {
|
|
|
971
993
|
content: answer.content || null,
|
|
972
994
|
function_call: functionCalls[0] || null,
|
|
973
995
|
function_calls: functionCalls,
|
|
974
|
-
files: []
|
|
996
|
+
files: [],
|
|
997
|
+
usage: response.data.usage ? {
|
|
998
|
+
prompt_tokens: response.data.usage.prompt_tokens,
|
|
999
|
+
completion_tokens: response.data.usage.completion_tokens,
|
|
1000
|
+
total_tokens: response.data.usage.total_tokens
|
|
1001
|
+
} : null
|
|
975
1002
|
};
|
|
976
1003
|
}
|
|
977
1004
|
async function callGroqWithRetries(id, payload, retries = 5) {
|
|
978
1005
|
return withRetries(id, "Groq", () => callGroq(id, payload), { retries });
|
|
979
1006
|
}
|
|
1007
|
+
function prepareOpenRouterPayload(payload) {
|
|
1008
|
+
var _a;
|
|
1009
|
+
return {
|
|
1010
|
+
model: payload.model,
|
|
1011
|
+
messages: payload.messages.map((message) => ({
|
|
1012
|
+
role: message.role,
|
|
1013
|
+
content: normalizeMessageContent(message.content)
|
|
1014
|
+
})),
|
|
1015
|
+
tools: (_a = payload.functions) == null ? void 0 : _a.map((fn) => ({
|
|
1016
|
+
type: "function",
|
|
1017
|
+
function: fn
|
|
1018
|
+
})),
|
|
1019
|
+
tool_choice: payload.function_call ? typeof payload.function_call === "string" ? payload.function_call : { type: "function", function: payload.function_call } : void 0,
|
|
1020
|
+
temperature: payload.temperature
|
|
1021
|
+
};
|
|
1022
|
+
}
|
|
1023
|
+
async function callOpenRouter(id, payload) {
|
|
1024
|
+
var _a, _b;
|
|
1025
|
+
const response = await axios.post(
|
|
1026
|
+
"https://openrouter.ai/api/v1/chat/completions",
|
|
1027
|
+
payload,
|
|
1028
|
+
{
|
|
1029
|
+
headers: {
|
|
1030
|
+
"content-type": "application/json",
|
|
1031
|
+
Authorization: `Bearer ${process.env.OPENROUTER_API_KEY}`
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
);
|
|
1035
|
+
const answer = (_a = response.data.choices[0]) == null ? void 0 : _a.message;
|
|
1036
|
+
if (!answer) {
|
|
1037
|
+
logger_default.error(id, "Missing answer in OpenRouter API response:", response.data);
|
|
1038
|
+
throw new Error("Missing answer in OpenRouter API");
|
|
1039
|
+
}
|
|
1040
|
+
const functionCalls = [];
|
|
1041
|
+
if ((_b = answer.tool_calls) == null ? void 0 : _b.length) {
|
|
1042
|
+
for (const tc of answer.tool_calls) {
|
|
1043
|
+
functionCalls.push({
|
|
1044
|
+
name: tc.function.name,
|
|
1045
|
+
arguments: JSON.parse(tc.function.arguments)
|
|
1046
|
+
});
|
|
1047
|
+
}
|
|
1048
|
+
}
|
|
1049
|
+
return {
|
|
1050
|
+
role: "assistant",
|
|
1051
|
+
content: answer.content || null,
|
|
1052
|
+
function_call: functionCalls[0] || null,
|
|
1053
|
+
function_calls: functionCalls,
|
|
1054
|
+
files: [],
|
|
1055
|
+
usage: response.data.usage ? {
|
|
1056
|
+
prompt_tokens: response.data.usage.prompt_tokens,
|
|
1057
|
+
completion_tokens: response.data.usage.completion_tokens,
|
|
1058
|
+
total_tokens: response.data.usage.total_tokens
|
|
1059
|
+
} : null
|
|
1060
|
+
};
|
|
1061
|
+
}
|
|
1062
|
+
async function callOpenRouterWithRetries(id, payload, retries = 5) {
|
|
1063
|
+
return withRetries(id, "OpenRouter", () => callOpenRouter(id, payload), { retries });
|
|
1064
|
+
}
|
|
980
1065
|
function isAnthropicPayload(payload) {
|
|
981
1066
|
return Object.values(ClaudeModel).includes(payload.model);
|
|
982
1067
|
}
|
|
@@ -989,6 +1074,9 @@ function isGroqPayload(payload) {
|
|
|
989
1074
|
function isGoogleAIPayload(payload) {
|
|
990
1075
|
return Object.values(GeminiModel).includes(payload.model);
|
|
991
1076
|
}
|
|
1077
|
+
function isOpenRouterPayload(payload) {
|
|
1078
|
+
return Object.values(OpenRouterModel).includes(payload.model);
|
|
1079
|
+
}
|
|
992
1080
|
async function callWithRetries(id, aiPayload, aiConfig, retries = 5, chunkTimeoutMs = 15e3) {
|
|
993
1081
|
try {
|
|
994
1082
|
if (isAnthropicPayload(aiPayload)) {
|
|
@@ -1022,6 +1110,13 @@ async function callWithRetries(id, aiPayload, aiConfig, retries = 5, chunkTimeou
|
|
|
1022
1110
|
retries
|
|
1023
1111
|
);
|
|
1024
1112
|
}
|
|
1113
|
+
if (isOpenRouterPayload(aiPayload)) {
|
|
1114
|
+
return await callOpenRouterWithRetries(
|
|
1115
|
+
id,
|
|
1116
|
+
prepareOpenRouterPayload(aiPayload),
|
|
1117
|
+
retries
|
|
1118
|
+
);
|
|
1119
|
+
}
|
|
1025
1120
|
throw new Error("Invalid AI payload: Unknown model type.");
|
|
1026
1121
|
} catch (error2) {
|
|
1027
1122
|
if (aiPayload.fallbackModel) {
|
|
@@ -1053,6 +1148,7 @@ export {
|
|
|
1053
1148
|
GPTModel,
|
|
1054
1149
|
GeminiModel,
|
|
1055
1150
|
GroqModel,
|
|
1151
|
+
OpenRouterModel,
|
|
1056
1152
|
callWithRetries
|
|
1057
1153
|
};
|
|
1058
1154
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../interfaces.ts","../logger.ts","../index.ts","../utils.ts"],"sourcesContent":["export enum ClaudeModel {\n HAIKU_3 = \"claude-3-haiku-20240307\",\n SONNET_3 = \"claude-3-sonnet-20240229\",\n OPUS_3 = \"claude-3-opus-20240229\",\n HAIKU_3_5 = \"claude-3-5-haiku-20241022\",\n SONNET_3_5 = \"claude-3-5-sonnet-20241022\",\n SONNET_4 = \"claude-sonnet-4-20250514\",\n OPUS_4 = \"claude-opus-4-20250514\",\n OPUS_4_1 = \"claude-opus-4-1\",\n HAIKU_4_5 = \"claude-haiku-4-5\",\n SONNET_4_5 = \"claude-sonnet-4-5\",\n OPUS_4_5 = \"claude-opus-4-5\",\n}\n\nexport enum GPTModel {\n GPT35_0613 = \"gpt-3.5-turbo-0613\",\n GPT35_0613_16K = \"gpt-3.5-turbo-16k-0613\",\n GPT35_0125 = \"gpt-3.5-turbo-0125\",\n GPT4_1106_PREVIEW = \"gpt-4-1106-preview\",\n GPT4_0125_PREVIEW = \"gpt-4-0125-preview\",\n GPT4_0409 = \"gpt-4-turbo-2024-04-09\",\n GPT4O = \"gpt-4o\",\n GPT4O_MINI = \"gpt-4o-mini\",\n O1_PREVIEW = \"o1-preview\",\n O1_MINI = \"o1-mini\",\n O3_MINI = \"o3-mini\",\n GPT4_1 = \"gpt-4.1\",\n GPT4_1_MINI = \"gpt-4.1-mini\",\n GPT4_1_NANO = \"gpt-4.1-nano\",\n GPT5 = \"gpt-5\",\n GPT5_MINI = \"gpt-5-mini\",\n}\n\nexport enum GroqModel {\n LLAMA_3_70B_8192 = \"llama3-70b-8192\",\n DEEPSEEK_R1_DISTILL_LLAMA_70B = \"deepseek-r1-distill-llama-70b\",\n}\n\nexport enum GeminiModel {\n GEMINI_1_5_PRO = \"gemini-1.5-pro-latest\",\n GEMINI_EXP_1206 = \"gemini-exp-1206\",\n GEMINI_2_0_FLASH = \"gemini-2.0-flash\",\n GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION = \"gemini-2.0-flash-exp-image-generation\",\n GEMINI_2_0_FLASH_THINKING_EXP = \"gemini-2.0-flash-thinking-exp\",\n GEMINI_2_0_FLASH_THINKING_EXP_01_21 = \"gemini-2.0-flash-thinking-exp-01-21\",\n GEMINI_2_5_FLASH_PREVIEW_04_17 = \"gemini-2.5-flash-preview-04-17\",\n GEMINI_3_FLASH_PREVIEW = \"gemini-3-flash-preview\",\n GEMINI_3_1_FLASH_LITE_PREVIEW = \"gemini-3.1-flash-lite-preview\",\n}\n\nexport interface GenericError {\n message: string;\n}\n\nexport enum ContentType {\n TEXT = \"text\",\n ATTACHMENT = \"attachment\",\n}\n\nexport type AIChainResponse = {\n content: string | null;\n contentType?: ContentType;\n functionCalls: FunctionCall[];\n};\n\nexport interface GenericMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp?: string;\n files?: File[];\n functionCalls?: FunctionCall[];\n}\n\nexport interface File {\n mimeType: string;\n url?: string;\n data?: string;\n}\n\nexport interface OpenAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | OpenAIContentBlock[];\n}\n\nexport type OpenAIContentBlock =\n | OpenAITextContentBlock\n | OpenAIImageContentBlock\n | OpenAIAudioContentBlock;\n\nexport interface OpenAITextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface OpenAIImageContentBlock {\n type: \"image_url\";\n image_url: {\n url: string; // URL to the image, can also be a base64 string\n };\n}\n\nexport interface OpenAIAudioContentBlock {\n type: \"audio_url\";\n audio_url: {\n url: string; // URL to the audio, can also be a base64 string\n };\n}\n\nexport interface AnthropicAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | AnthropicContentBlock[];\n}\n\nexport type AnthropicContentBlock =\n | AnthropicTextContentBlock\n | AnthropicImageContentBlock;\n\nexport interface AnthropicTextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface AnthropicImageContentBlock {\n type: \"image\";\n source: {\n type: \"base64\";\n media_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n data: string; // Must be a base64 string\n };\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface ParsedResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: FunctionCall | null;\n function_calls: FunctionCall[];\n files: File[];\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIConfig {\n service: \"azure\" | \"openai\";\n apiKey: string;\n baseUrl: string;\n orgId?: string;\n modelConfigMap?: Record<\n GPTModel,\n {\n resource: string;\n deployment: string;\n apiVersion: string;\n apiKey: string;\n endpoint?: string;\n }\n >;\n}\n\nexport interface AnthropicAIConfig {\n service: \"anthropic\" | \"bedrock\";\n}\n\nexport interface FunctionDefinition {\n name: string;\n description?: string;\n parameters: Record<string, any>;\n}\n\ninterface FunctionWrapped {\n type: \"function\";\n function: FunctionDefinition;\n}\n\nexport interface GroqPayload {\n model: GroqModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n temperature?: number;\n\n functions?: any[]; // Deprecate this\n}\n\nexport interface OpenAIPayload {\n model: GPTModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n}\n\nexport interface AnthropicAIPayload {\n model: ClaudeModel;\n messages: AnthropicAIMessage[];\n functions?: any[]; // TODO type this JSON schema\n temperature?: number;\n system?: string;\n}\n\nexport interface GoogleAITextPart {\n text: string;\n}\n\nexport interface GoogleAIInlineDataPart {\n inlineData: {\n mimeType: string;\n data: string;\n };\n}\n\nexport interface GoogleAIFileDataPart {\n fileData: {\n mimeType: string;\n fileUri: string;\n };\n}\n\nexport type GoogleAIPart = GoogleAITextPart | GoogleAIInlineDataPart | GoogleAIFileDataPart;\nexport interface GoogleAIMessage {\n role: \"user\" | \"model\";\n parts: GoogleAIPart[];\n}\nexport interface GoogleAIPayload {\n model: GeminiModel;\n messages: GoogleAIMessage[];\n tools?: {\n functionDeclarations: FunctionDefinition[];\n };\n systemInstruction?: string;\n}\n\nexport type AnyModel = GPTModel | ClaudeModel | GroqModel | GeminiModel;\n\nexport interface GenericPayload {\n model: AnyModel;\n messages: GenericMessage[];\n functions?: FunctionDefinition[];\n function_call?: \"none\" | \"auto\" | { name: string };\n temperature?: number;\n fallbackModel?: AnyModel;\n}\n\nexport interface OpenAIBody {\n choices: {\n message: OpenAIResponseMessage;\n }[];\n error?: {\n code: string;\n };\n usage: {\n completion_tokens: number;\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n","type LogLevel = \"LOG\" | \"WARN\" | \"ERROR\";\nexport type Identifier = string | string[];\n\nfunction formatIdentifier(identifier: Identifier): string {\n if (Array.isArray(identifier)) {\n return identifier.map((id) => `[${id}]`).join(\" \");\n }\n return `[${identifier}]`;\n}\n\nfunction formatMessage(\n level: LogLevel,\n identifier: Identifier,\n message: string\n): string {\n return `[${level}] ${formatIdentifier(identifier)} ${message}`;\n}\n\nexport function log(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.log(formatMessage(\"LOG\", identifier, message), ...args);\n}\n\nexport function warn(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.warn(formatMessage(\"WARN\", identifier, message), ...args);\n}\n\nexport function error(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.error(formatMessage(\"ERROR\", identifier, message), ...args);\n}\n\nexport default {\n log,\n warn,\n error,\n};\n","import {\n ClaudeModel,\n GPTModel,\n OpenAIPayload,\n OpenAIMessage,\n OpenAIConfig,\n AnthropicAIPayload,\n AnthropicAIMessage,\n GenericMessage,\n AnthropicAIConfig,\n GenericPayload,\n GroqPayload,\n GroqModel,\n ParsedResponseMessage,\n FunctionCall,\n AnthropicContentBlock,\n OpenAIContentBlock,\n GoogleAIPayload,\n GeminiModel,\n GoogleAIPart,\n File,\n GoogleAIMessage,\n AnyModel,\n} from \"./interfaces\";\nimport logger, { Identifier } from \"./logger\";\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from \"@aws-sdk/client-bedrock-runtime\";\nimport axios from \"axios\";\nimport { isHeicImage, timeout } from \"./utils\";\nimport { GoogleGenAI } from \"@google/genai\";\n\nconst sharp = require(\"sharp\");\nconst decode = require(\"heic-decode\");\n\nexport {\n ClaudeModel,\n GPTModel,\n GroqModel,\n GeminiModel,\n OpenAIConfig,\n FunctionDefinition,\n GenericMessage,\n GenericPayload,\n AnyModel,\n} from \"./interfaces\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SHARED UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generic retry wrapper for API calls with exponential backoff.\n */\nasync function withRetries<T>(\n identifier: Identifier,\n apiName: string,\n fn: () => Promise<T>,\n options: {\n retries?: number;\n baseDelayMs?: number;\n onError?: (error: any, attempt: number) => void;\n } = {},\n): Promise<T> {\n const { retries = 5, baseDelayMs = 125, onError } = options;\n\n logger.log(identifier, `Calling ${apiName} API with retries`);\n\n let lastError: any;\n for (let attempt = 0; attempt < retries; attempt++) {\n try {\n return await fn();\n } catch (error: any) {\n lastError = error;\n\n if (onError) {\n onError(error, attempt);\n } else {\n logger.error(\n identifier,\n `Retry #${attempt} error: ${error.message}`,\n error.response?.data || error,\n );\n }\n\n await timeout(baseDelayMs * attempt);\n }\n }\n\n const error = new Error(\n `Failed to call ${apiName} API after ${retries} attempts`,\n ) as any;\n error.cause = lastError;\n throw error;\n}\n\nfunction parseStreamedResponse(\n identifier: Identifier,\n paragraph: string,\n toolCallAccumulators: { name: string; arguments: string }[],\n allowedFunctionNames: Set<string> | null,\n): ParsedResponseMessage {\n const functionCalls: FunctionCall[] = [];\n\n for (const acc of toolCallAccumulators) {\n if (!acc.name || !acc.arguments) continue;\n\n if (allowedFunctionNames && !allowedFunctionNames.has(acc.name)) {\n throw new Error(\n `Stream error: received function call with unknown name: ${acc.name}`,\n );\n }\n\n try {\n functionCalls.push({\n name: acc.name,\n arguments: JSON.parse(acc.arguments),\n });\n } catch (error) {\n logger.error(\n identifier,\n \"Error parsing function call arguments:\",\n acc.arguments,\n );\n throw error;\n }\n }\n\n if (!paragraph && !functionCalls.length) {\n logger.error(\n identifier,\n \"Stream error: received message without content or function_call:\",\n JSON.stringify({ paragraph, toolCallAccumulators }),\n );\n throw new Error(\n \"Stream error: received message without content or function_call\",\n );\n }\n\n return {\n role: \"assistant\",\n content: paragraph || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n };\n}\n\nfunction truncatePayload(payload: OpenAIPayload): string {\n return JSON.stringify(\n {\n ...payload,\n messages: payload.messages.map((message) => {\n const truncatedMessage = { ...message };\n if (typeof truncatedMessage.content === \"string\") {\n truncatedMessage.content = truncatedMessage.content.slice(0, 100);\n } else if (Array.isArray(truncatedMessage.content)) {\n truncatedMessage.content = truncatedMessage.content.map((block) => {\n if (block.type === \"image_url\") {\n return {\n ...block,\n image_url: { url: block.image_url.url.slice(0, 100) },\n };\n }\n return block;\n });\n }\n return truncatedMessage;\n }),\n },\n null,\n 2,\n );\n}\n\nasync function getNormalizedBase64PNG(\n url: string,\n mime: string,\n): Promise<string> {\n const response = await axios.get(url, { responseType: \"arraybuffer\" });\n\n let imageBuffer = Buffer.from(response.data);\n let sharpOptions = {};\n\n if (isHeicImage(url, mime)) {\n const imageData = await decode({ buffer: imageBuffer });\n imageBuffer = Buffer.from(imageData.data);\n sharpOptions = {\n raw: {\n width: imageData.width,\n height: imageData.height,\n channels: 4,\n },\n };\n }\n\n // Limits size of image to < 5MB Anthropic limit\n const resizedBuffer = await sharp(imageBuffer, sharpOptions)\n .withMetadata()\n .resize(1024, 1024, { fit: \"inside\", withoutEnlargement: true })\n .png()\n .toBuffer();\n\n return resizedBuffer.toString(\"base64\");\n}\n\nconst ALLOWED_IMAGE_MIME_TYPES = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// OPENAI\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface OpenAIRequestConfig {\n endpoint: string;\n headers: Record<string, string>;\n}\n\nfunction buildOpenAIRequestConfig(\n identifier: Identifier,\n model: string,\n config: OpenAIConfig | undefined,\n): OpenAIRequestConfig {\n if (!config) {\n config = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n if (config.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service:\", model);\n\n if (!config.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\",\n );\n }\n\n const azureConfig = config.modelConfigMap[model as GPTModel];\n if (!azureConfig?.endpoint) {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n\n const endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n logger.log(identifier, \"Using endpoint:\", endpoint);\n\n return {\n endpoint,\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n };\n }\n\n // Default: OpenAI\n logger.log(identifier, \"Using OpenAI service:\", model);\n if (config.orgId) {\n logger.log(identifier, \"Using orgId:\", config.orgId);\n }\n\n return {\n endpoint: \"https://api.openai.com/v1/chat/completions\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.apiKey}`,\n ...(config.orgId ? { \"OpenAI-Organization\": config.orgId } : {}),\n },\n };\n}\n\nasync function prepareOpenAIPayload(\n identifier: Identifier,\n payload: GenericPayload,\n): Promise<OpenAIPayload> {\n const preparedPayload: OpenAIPayload = {\n model: payload.model as GPTModel,\n messages: [],\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call\n : { type: \"function\", function: payload.function_call }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const contentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n contentBlocks.push({ type: \"text\", text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n contentBlocks.push({\n type: \"image_url\",\n image_url: { url: file.url },\n });\n contentBlocks.push({ type: \"text\", text: `Image (${file.url})` });\n } else if (file.data) {\n contentBlocks.push({\n type: \"image_url\",\n image_url: { url: `data:${file.mimeType};base64,${file.data}` },\n });\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n contentBlocks.push({\n type: \"text\",\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: contentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callOpenAIStream(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n chunkTimeoutMs: number,\n): Promise<ParsedResponseMessage> {\n const functionNames: Set<string> | null = openAiPayload.tools\n ? new Set(openAiPayload.tools.map((fn) => fn.function.name as string))\n : null;\n\n const { endpoint, headers } = buildOpenAIRequestConfig(\n id,\n openAiPayload.model,\n openAiConfig,\n );\n\n const controller = new AbortController();\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...openAiPayload, stream: true }),\n signal: controller.signal,\n });\n\n if (!response.body) {\n throw new Error(\"Stream error: no response body\");\n }\n\n let paragraph = \"\";\n const toolCallAccumulators: { name: string; arguments: string }[] = [];\n\n const reader = response.body.getReader();\n let partialChunk = \"\";\n let chunkIndex = -1;\n\n const createAbortTimeout = () =>\n setTimeout(() => {\n logger.error(id, `Stream timeout after ${chunkTimeoutMs}ms`);\n controller.abort();\n }, chunkTimeoutMs);\n\n while (true) {\n chunkIndex++;\n const abortTimeout = createAbortTimeout();\n const { done, value } = await reader.read();\n clearTimeout(abortTimeout);\n\n if (done) {\n logger.error(\n id,\n `Stream ended prematurely after ${chunkIndex + 1} chunks`,\n );\n throw new Error(\"Stream error: ended prematurely\");\n }\n\n let chunk = new TextDecoder().decode(value);\n if (partialChunk) {\n chunk = partialChunk + chunk;\n partialChunk = \"\";\n }\n\n const jsonStrings = chunk.split(/^data: /gm);\n\n for (const jsonString of jsonStrings) {\n if (!jsonString) continue;\n\n if (jsonString.includes(\"[DONE]\")) {\n return parseStreamedResponse(\n id,\n paragraph,\n toolCallAccumulators,\n functionNames,\n );\n }\n\n let json;\n try {\n json = JSON.parse(jsonString.trim());\n } catch {\n partialChunk = jsonString;\n continue;\n }\n\n if (!json.choices?.length) {\n if (json.error) {\n logger.error(id, \"Stream error from OpenAI:\", json.error);\n const error = new Error(\"Stream error: OpenAI error\") as any;\n error.data = json.error;\n error.requestBody = truncatePayload(openAiPayload);\n throw error;\n }\n if (chunkIndex !== 0) {\n logger.error(id, \"Stream error: no choices in JSON:\", json);\n }\n continue;\n }\n\n const toolCalls = json.choices[0]?.delta?.tool_calls;\n if (toolCalls) {\n for (const toolCall of toolCalls) {\n const idx = toolCall.index ?? 0;\n while (toolCallAccumulators.length <= idx) {\n toolCallAccumulators.push({ name: \"\", arguments: \"\" });\n }\n if (toolCall.function?.name)\n toolCallAccumulators[idx].name += toolCall.function.name;\n if (toolCall.function?.arguments)\n toolCallAccumulators[idx].arguments += toolCall.function.arguments;\n }\n }\n\n const text = json.choices[0]?.delta?.content;\n if (text) paragraph += text;\n }\n }\n}\n\nasync function callOpenAI(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n): Promise<ParsedResponseMessage> {\n const { endpoint, headers } = buildOpenAIRequestConfig(\n id,\n openAiPayload.model,\n openAiConfig,\n );\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...openAiPayload, stream: false }),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n logger.error(id, \"OpenAI API error:\", errorData);\n throw new Error(`OpenAI API Error: ${errorData.error.message}`);\n }\n\n const data = await response.json();\n\n if (!data.choices?.length) {\n if (data.error) {\n logger.error(id, \"OpenAI error:\", data.error);\n throw new Error(`OpenAI error: ${data.error.message}`);\n }\n throw new Error(\"OpenAI error: No choices returned.\");\n }\n\n const choice = data.choices[0];\n\n // Check for tool_calls (modern API) first, fall back to function_call (legacy)\n const toolCalls = choice.message?.tool_calls;\n const functionCalls: FunctionCall[] = [];\n\n if (toolCalls?.length) {\n for (const tc of toolCalls) {\n functionCalls.push({\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n });\n }\n } else if (choice.function_call) {\n functionCalls.push({\n name: choice.function_call.name,\n arguments: JSON.parse(choice.function_call.arguments),\n });\n }\n\n return {\n role: \"assistant\",\n content: choice.message.content || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n };\n}\n\nasync function callOpenAiWithRetries(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000,\n): Promise<ParsedResponseMessage> {\n logger.log(\n id,\n \"Calling OpenAI API with retries:\",\n openAiConfig?.service,\n openAiPayload.model,\n );\n\n const useStreaming =\n openAiPayload.model !== GPTModel.O1_MINI &&\n openAiPayload.model !== GPTModel.O1_PREVIEW;\n\n return withRetries(\n id,\n \"OpenAI\",\n async () => {\n if (useStreaming) {\n return callOpenAIStream(\n id,\n openAiPayload,\n openAiConfig,\n chunkTimeoutMs,\n );\n } else {\n return callOpenAI(id, openAiPayload, openAiConfig);\n }\n },\n {\n retries,\n baseDelayMs: 250,\n onError: (error, attempt) => {\n logger.error(\n id,\n `Retry #${attempt} error: ${error.message}`,\n error.response?.data || error.data || error,\n );\n\n // Remove images on content policy violation\n if (error.data?.code === \"content_policy_violation\") {\n logger.log(id, \"Removing images due to content policy violation\");\n openAiPayload.messages.forEach((message: OpenAIMessage) => {\n if (Array.isArray(message.content)) {\n message.content = message.content.filter(\n (content) => content.type === \"text\",\n );\n }\n });\n }\n },\n },\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ANTHROPIC\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction jigAnthropicMessages(\n messages: AnthropicAIMessage[],\n): AnthropicAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // Ensure first message is from user\n if (jiggedMessages[0]?.role !== \"user\") {\n jiggedMessages = [\n { role: \"user\" as const, content: \"...\" },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) return [message];\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n const lastContent = Array.isArray(lastMessage.content)\n ? lastMessage.content\n : [{ type: \"text\" as const, text: lastMessage.content }];\n const newContent = Array.isArray(message.content)\n ? message.content\n : [{ type: \"text\" as const, text: message.content }];\n\n lastMessage.content = [\n ...lastContent,\n { type: \"text\", text: \"\\n\\n---\\n\\n\" },\n ...newContent,\n ];\n return acc;\n }\n\n // Convert string content to text content block\n if (typeof message.content === \"string\") {\n message.content = [{ type: \"text\", text: message.content }];\n }\n\n return [...acc, message];\n }, [] as AnthropicAIMessage[]);\n\n // Ensure last message is from user\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"assistant\") {\n jiggedMessages.push({ role: \"user\", content: \"...\" });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareAnthropicPayload(\n _identifier: Identifier,\n payload: GenericPayload,\n): Promise<AnthropicAIPayload> {\n const preparedPayload: AnthropicAIPayload = {\n model: payload.model as ClaudeModel,\n messages: [],\n functions: payload.functions,\n temperature: payload.temperature,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n const contentBlocks: AnthropicContentBlock[] = [];\n\n if (message.content) {\n contentBlocks.push({ type: \"text\", text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n if (message.role == \"user\") {\n // anthropic assistant turns can't have images\n contentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n }\n contentBlocks.push({ type: \"text\", text: `Image (${file.url})` });\n } else if (file.data) {\n if (message.role == \"user\") {\n // anthropic assistant turns can't have images\n contentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: file.mimeType as any,\n data: file.data,\n },\n });\n }\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n contentBlocks.push({\n type: \"text\",\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: contentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callAnthropic(\n id: Identifier,\n payload: AnthropicAIPayload,\n config?: AnthropicAIConfig,\n): Promise<ParsedResponseMessage> {\n const anthropicMessages = jigAnthropicMessages(payload.messages);\n const tools = payload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n }));\n\n let data;\n\n if (config?.service === \"bedrock\") {\n const AWS_REGION = \"us-east-1\";\n const MODEL_ID = \"anthropic.claude-3-haiku-20240307-v1:0\";\n\n const client = new BedrockRuntimeClient({ region: AWS_REGION });\n const bedrockPayload = {\n anthropic_version: \"bedrock-2023-05-31\",\n max_tokens: 4096,\n messages: anthropicMessages,\n tools,\n };\n\n const response = await client.send(\n new InvokeModelCommand({\n contentType: \"application/json\",\n body: JSON.stringify(bedrockPayload),\n modelId: MODEL_ID,\n }),\n );\n\n const decodedResponseBody = new TextDecoder().decode(response.body);\n data = JSON.parse(decodedResponseBody);\n } else {\n // Default: Anthropic API\n const response = await axios.post(\n \"https://api.anthropic.com/v1/messages\",\n {\n model: payload.model,\n messages: anthropicMessages,\n tools,\n temperature: payload.temperature,\n system: payload.system,\n max_tokens: 4096,\n },\n {\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": process.env.ANTHROPIC_API_KEY as string,\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-beta\": \"tools-2024-04-04\",\n },\n timeout: 60000,\n },\n );\n data = response.data;\n }\n\n const answers = data.content;\n if (!answers?.[0]) {\n logger.error(id, \"Missing answer in Anthropic API response:\", data);\n throw new Error(\"Missing answer in Anthropic API\");\n }\n\n let textResponse = \"\";\n const functionCalls: FunctionCall[] = [];\n\n for (const answer of answers) {\n if (!answer.type) {\n logger.error(id, \"Missing answer type in Anthropic API response:\", data);\n throw new Error(\"Missing answer type in Anthropic API\");\n }\n\n if (answer.type === \"text\") {\n let text = answer.text\n .replace(/<thinking>.*?<\\/thinking>/gs, \"\")\n .replace(/<answer>|<\\/answer>/gs, \"\")\n .trim();\n\n if (!text) {\n text = answer.text.replace(\n /<thinking>|<\\/thinking>|<answer>|<\\/answer>/gs,\n \"\",\n );\n logger.log(id, \"No text in answer, returning text within tags:\", text);\n }\n\n textResponse = textResponse ? `${textResponse}\\n\\n${text}` : text;\n } else if (answer.type === \"tool_use\") {\n functionCalls.push({\n name: answer.name,\n arguments: answer.input,\n });\n }\n }\n\n if (!textResponse && !functionCalls.length) {\n logger.error(\n id,\n \"Missing text & functions in Anthropic API response:\",\n data,\n );\n throw new Error(\"Missing text & functions in Anthropic API response\");\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n };\n}\n\nasync function callAnthropicWithRetries(\n id: Identifier,\n payload: AnthropicAIPayload,\n config?: AnthropicAIConfig,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n return withRetries(\n id,\n \"Anthropic\",\n () => callAnthropic(id, payload, config),\n {\n retries,\n },\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// GOOGLE AI\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction jigGoogleMessages(messages: GoogleAIMessage[]): GoogleAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // Ensure first message is from user\n if (jiggedMessages[0]?.role === \"model\") {\n jiggedMessages = [\n { role: \"user\" as const, parts: [{ text: \"...\" }] },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) return [message];\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n lastMessage.parts = [...lastMessage.parts, ...message.parts];\n return acc;\n }\n\n return [...acc, message];\n }, [] as GoogleAIMessage[]);\n\n // Ensure last message is from user\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"model\") {\n jiggedMessages.push({ role: \"user\", parts: [{ text: \"...\" }] });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareGoogleAIPayload(\n _identifier: Identifier,\n payload: GenericPayload,\n): Promise<GoogleAIPayload> {\n const preparedPayload: GoogleAIPayload = {\n model: payload.model as GeminiModel,\n messages: [],\n tools: payload.functions\n ? {\n functionDeclarations: payload.functions.map((fn) => ({\n name: fn.name,\n parameters: {\n description: fn.description,\n ...fn.parameters,\n },\n })),\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.systemInstruction = message.content;\n continue;\n }\n\n const parts: GoogleAIPart[] = [];\n\n if (message.content) {\n parts.push({ text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n parts.push({\n fileData: {\n mimeType: file.mimeType,\n fileUri: file.url,\n },\n });\n parts.push({ text: `Image (${file.url})` });\n } else if (file.data) {\n parts.push({\n inlineData: {\n mimeType: file.mimeType,\n data: file.data,\n },\n });\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n parts.push({\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role === \"assistant\" ? \"model\" : message.role,\n parts,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callGoogleAI(\n id: Identifier,\n payload: GoogleAIPayload,\n): Promise<ParsedResponseMessage> {\n const googleMessages = jigGoogleMessages(payload.messages);\n const history = googleMessages.slice(0, -1);\n const lastMessage = googleMessages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\n const chat = genAI.chats.create({\n model: payload.model,\n history,\n config: {\n responseModalities: [\"Text\"],\n tools: payload.tools ? [payload.tools] : undefined,\n systemInstruction: payload.systemInstruction,\n },\n });\n\n const response = await chat.sendMessage({ message: lastMessage.parts });\n\n let text = \"\";\n const files: File[] = [];\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.text) text += part.text;\n if (part.inlineData?.data) {\n files.push({ mimeType: \"image/png\", data: part.inlineData.data });\n }\n }\n\n const functionCalls = response.functionCalls?.map((fc) => ({\n name: fc.name ?? \"\",\n arguments: fc.args ?? {},\n }));\n\n if (!text && !functionCalls?.length && !files.length) {\n const candidate = response.candidates?.[0];\n const finishReason = candidate?.finishReason;\n\n logger.error(id, \"Missing text & functions in Google AI API response:\", {\n finishReason,\n safetyRatings: candidate?.safetyRatings,\n usageMetadata: response.usageMetadata,\n modelVersion: response.modelVersion,\n candidateContent: candidate?.content,\n promptFeedback: response.promptFeedback,\n });\n\n let errorMessage = \"Missing text & functions in Google AI API response\";\n if (finishReason) {\n const reasonDescriptions: Record<string, string> = {\n MALFORMED_FUNCTION_CALL:\n \"(Google could not generate valid function call arguments)\",\n SAFETY: \"(blocked by safety filters)\",\n RECITATION: \"(blocked due to recitation)\",\n MAX_TOKENS: \"(response truncated due to max tokens)\",\n };\n errorMessage += `: finishReason=${finishReason} ${reasonDescriptions[finishReason] || \"\"}`;\n }\n\n const error = new Error(errorMessage) as any;\n error.finishReason = finishReason;\n error.safetyRatings = candidate?.safetyRatings;\n error.usageMetadata = response.usageMetadata;\n error.promptFeedback = response.promptFeedback;\n throw error;\n }\n\n return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: functionCalls?.[0] || null,\n function_calls: functionCalls || [],\n };\n}\n\n/**\n * Content violation finish reasons that should trigger circuit breaker behavior.\n * These errors won't resolve with simple retries - the content itself is the problem.\n */\nconst CONTENT_VIOLATION_REASONS = new Set([\"PROHIBITED_CONTENT\", \"SAFETY\"]);\n\n/**\n * Removes inline image data from Google AI messages, preserving text content.\n * Used as a fallback when content violations are detected.\n */\nfunction removeImagesFromGooglePayload(payload: GoogleAIPayload): boolean {\n let removedImages = false;\n\n for (const message of payload.messages) {\n message.parts = message.parts.filter((part) => {\n if (\"inlineData\" in part || \"fileData\" in part) {\n removedImages = true;\n return false;\n }\n return true;\n });\n\n // Ensure message still has content after removing images\n if (message.parts.length === 0) {\n message.parts = [{ text: \"(image removed due to content policy)\" }];\n }\n }\n\n return removedImages;\n}\n\nasync function callGoogleAIWithRetries(\n id: Identifier,\n payload: GoogleAIPayload,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n let hasTriedWithoutImages = false;\n\n return withRetries(id, \"Google AI\", () => callGoogleAI(id, payload), {\n retries,\n onError: (error, attempt) => {\n const errorDetails: Record<string, any> = {\n message: error.message,\n finishReason: error.finishReason,\n modelVersion: error.modelVersion,\n };\n\n if (error.safetyRatings) errorDetails.safetyRatings = error.safetyRatings;\n if (error.usageMetadata) errorDetails.usageMetadata = error.usageMetadata;\n if (error.promptFeedback)\n errorDetails.promptFeedback = error.promptFeedback;\n if (error.status) errorDetails.httpStatus = error.status;\n if (error.code) errorDetails.errorCode = error.code;\n if (error.details) errorDetails.errorDetails = error.details;\n\n const fileUris = payload.messages\n .flatMap((m) => m.parts)\n .filter((p) => \"fileData\" in p)\n .map((p) => (p as any).fileData.fileUri);\n if (fileUris.length) errorDetails.fileUris = fileUris;\n\n logger.error(\n id,\n `Retry #${attempt} error: ${error.message}`,\n errorDetails,\n );\n\n // Circuit breaker: detect content violations and try removing images\n // Check both finishReason (candidate-level) and promptFeedback.blockReason (prompt-level)\n const violationReason =\n (CONTENT_VIOLATION_REASONS.has(error.finishReason) &&\n error.finishReason) ||\n (CONTENT_VIOLATION_REASONS.has(error.promptFeedback?.blockReason) &&\n error.promptFeedback?.blockReason);\n\n if (violationReason) {\n if (!hasTriedWithoutImages) {\n const removedImages = removeImagesFromGooglePayload(payload);\n if (removedImages) {\n logger.log(\n id,\n `Circuit breaker triggered: removing images due to ${violationReason}`,\n );\n hasTriedWithoutImages = true;\n return; // Continue to next retry with images removed\n }\n }\n\n // If we already tried without images or there were no images, fail fast\n logger.error(\n id,\n `Circuit breaker: failing fast due to ${violationReason} (no more fallbacks)`,\n );\n const circuitBreakerError = new Error(\n `Google AI content violation: ${violationReason}. Request cannot succeed with current content.`,\n ) as any;\n circuitBreakerError.finishReason = error.finishReason;\n circuitBreakerError.safetyRatings = error.safetyRatings;\n circuitBreakerError.usageMetadata = error.usageMetadata;\n circuitBreakerError.circuitBreaker = true;\n throw circuitBreakerError;\n }\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// GROQ\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction normalizeMessageContent(\n content: AnthropicAIMessage[\"content\"],\n): string {\n return Array.isArray(content)\n ? content\n .map((c) => (c.type === \"text\" ? c.text : `[${c.type}]`))\n .join(\"\\n\")\n : content;\n}\n\nfunction prepareGroqPayload(payload: GenericPayload): GroqPayload {\n return {\n model: payload.model as GroqModel,\n messages: payload.messages.map((message) => ({\n role: message.role,\n content: normalizeMessageContent(message.content),\n })),\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call\n : { type: \"function\", function: payload.function_call }\n : undefined,\n temperature: payload.temperature,\n };\n}\n\nasync function callGroq(\n id: Identifier,\n payload: GroqPayload,\n): Promise<ParsedResponseMessage> {\n const response = await axios.post(\n \"https://api.groq.com/openai/v1/chat/completions\",\n payload,\n {\n headers: {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${process.env.GROQ_API_KEY}`,\n },\n },\n );\n\n const answer = response.data.choices[0]?.message;\n if (!answer) {\n logger.error(id, \"Missing answer in Groq API response:\", response.data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const functionCalls: FunctionCall[] = [];\n if (answer.tool_calls?.length) {\n for (const tc of answer.tool_calls) {\n functionCalls.push({\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n return {\n role: \"assistant\",\n content: answer.content || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n };\n}\n\nasync function callGroqWithRetries(\n id: Identifier,\n payload: GroqPayload,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n return withRetries(id, \"Groq\", () => callGroq(id, payload), { retries });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MAIN ENTRY POINT\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction isAnthropicPayload(payload: GenericPayload): boolean {\n return Object.values(ClaudeModel).includes(payload.model as ClaudeModel);\n}\n\nfunction isOpenAiPayload(payload: GenericPayload): boolean {\n return Object.values(GPTModel).includes(payload.model as GPTModel);\n}\n\nfunction isGroqPayload(payload: GenericPayload): boolean {\n return Object.values(GroqModel).includes(payload.model as GroqModel);\n}\n\nfunction isGoogleAIPayload(payload: GenericPayload): boolean {\n return Object.values(GeminiModel).includes(payload.model as GeminiModel);\n}\n\nexport async function callWithRetries(\n id: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000,\n): Promise<ParsedResponseMessage> {\n try {\n if (isAnthropicPayload(aiPayload)) {\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(id, aiPayload),\n aiConfig as AnthropicAIConfig,\n retries,\n );\n }\n\n if (isOpenAiPayload(aiPayload)) {\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(id, aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs,\n );\n }\n\n if (isGroqPayload(aiPayload)) {\n return await callGroqWithRetries(\n id,\n prepareGroqPayload(aiPayload),\n retries,\n );\n }\n\n if (isGoogleAIPayload(aiPayload)) {\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(id, aiPayload),\n retries,\n );\n }\n\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n } catch (error) {\n if (aiPayload.fallbackModel) {\n logger.error(\n id,\n `Primary model ${aiPayload.model} failed, falling back to ${aiPayload.fallbackModel}`,\n {\n error: error instanceof Error ? error.message : error,\n cause:\n error instanceof Error && (error as any).cause instanceof Error\n ? (error as any).cause.message\n : undefined,\n },\n );\n return callWithRetries(\n id,\n {\n ...aiPayload,\n model: aiPayload.fallbackModel,\n fallbackModel: undefined,\n },\n aiConfig,\n retries,\n chunkTimeoutMs,\n );\n }\n throw error;\n }\n}\n","export 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,eAAY;AACZ,EAAAA,aAAA,gBAAa;AACb,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,YAAS;AACT,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,eAAY;AACZ,EAAAA,aAAA,gBAAa;AACb,EAAAA,aAAA,cAAW;AAXD,SAAAA;AAAA,GAAA;AAcL,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;AACzB,EAAAA,aAAA,mCAAgC;AATtB,SAAAA;AAAA,GAAA;;;ACnCZ,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;;;ACrBA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,OAAO,WAAW;;;AC7BX,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;;;ADmBA,SAAS,mBAAmB;AAE5B,IAAM,QAAQ,UAAQ,OAAO;AAC7B,IAAM,SAAS,UAAQ,aAAa;AAqBpC,eAAe,YACb,YACA,SACA,IACA,UAII,CAAC,GACO;AAhEd;AAiEE,QAAM,EAAE,UAAU,GAAG,cAAc,KAAK,QAAQ,IAAI;AAEpD,iBAAO,IAAI,YAAY,WAAW,OAAO,mBAAmB;AAE5D,MAAI;AACJ,WAAS,UAAU,GAAG,UAAU,SAAS,WAAW;AAClD,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,SAASC,QAAY;AACnB,kBAAYA;AAEZ,UAAI,SAAS;AACX,gBAAQA,QAAO,OAAO;AAAA,MACxB,OAAO;AACL,uBAAO;AAAA,UACL;AAAA,UACA,UAAU,OAAO,WAAWA,OAAM,OAAO;AAAA,YACzC,KAAAA,OAAM,aAAN,mBAAgB,SAAQA;AAAA,QAC1B;AAAA,MACF;AAEA,YAAM,QAAQ,cAAc,OAAO;AAAA,IACrC;AAAA,EACF;AAEA,QAAMA,SAAQ,IAAI;AAAA,IAChB,kBAAkB,OAAO,cAAc,OAAO;AAAA,EAChD;AACA,EAAAA,OAAM,QAAQ;AACd,QAAMA;AACR;AAEA,SAAS,sBACP,YACA,WACA,sBACA,sBACuB;AACvB,QAAM,gBAAgC,CAAC;AAEvC,aAAW,OAAO,sBAAsB;AACtC,QAAI,CAAC,IAAI,QAAQ,CAAC,IAAI;AAAW;AAEjC,QAAI,wBAAwB,CAAC,qBAAqB,IAAI,IAAI,IAAI,GAAG;AAC/D,YAAM,IAAI;AAAA,QACR,2DAA2D,IAAI,IAAI;AAAA,MACrE;AAAA,IACF;AAEA,QAAI;AACF,oBAAc,KAAK;AAAA,QACjB,MAAM,IAAI;AAAA,QACV,WAAW,KAAK,MAAM,IAAI,SAAS;AAAA,MACrC,CAAC;AAAA,IACH,SAASA,QAAO;AACd,qBAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,IAAI;AAAA,MACN;AACA,YAAMA;AAAA,IACR;AAAA,EACF;AAEA,MAAI,CAAC,aAAa,CAAC,cAAc,QAAQ;AACvC,mBAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK,UAAU,EAAE,WAAW,qBAAqB,CAAC;AAAA,IACpD;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,aAAa;AAAA,IACtB,eAAe,cAAc,CAAC,KAAK;AAAA,IACnC,gBAAgB;AAAA,IAChB,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,cAAM,mBAAmB,EAAE,GAAG,QAAQ;AACtC,YAAI,OAAO,iBAAiB,YAAY,UAAU;AAChD,2BAAiB,UAAU,iBAAiB,QAAQ,MAAM,GAAG,GAAG;AAAA,QAClE,WAAW,MAAM,QAAQ,iBAAiB,OAAO,GAAG;AAClD,2BAAiB,UAAU,iBAAiB,QAAQ,IAAI,CAAC,UAAU;AACjE,gBAAI,MAAM,SAAS,aAAa;AAC9B,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,WAAW,EAAE,KAAK,MAAM,UAAU,IAAI,MAAM,GAAG,GAAG,EAAE;AAAA,cACtD;AAAA,YACF;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;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;AAEpB,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;AAEA,IAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAWA,SAAS,yBACP,YACA,OACA,QACqB;AACrB,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,MACP,SAAS;AAAA,MACT,QAAQ,QAAQ,IAAI;AAAA,MACpB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,SAAS;AAC9B,mBAAO,IAAI,YAAY,+BAA+B,KAAK;AAE3D,QAAI,CAAC,OAAO,gBAAgB;AAC1B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,OAAO,eAAe,KAAiB;AAC3D,QAAI,EAAC,2CAAa,WAAU;AAC1B,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAEA,UAAM,WAAW,GAAG,YAAY,QAAQ,uBAAuB,YAAY,UAAU,iCAAiC,YAAY,UAAU;AAC5I,mBAAO,IAAI,YAAY,mBAAmB,QAAQ;AAElD,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,WAAW,YAAY;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAGA,iBAAO,IAAI,YAAY,yBAAyB,KAAK;AACrD,MAAI,OAAO,OAAO;AAChB,mBAAO,IAAI,YAAY,gBAAgB,OAAO,KAAK;AAAA,EACrD;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,OAAO,MAAM;AAAA,MACtC,GAAI,OAAO,QAAQ,EAAE,uBAAuB,OAAO,MAAM,IAAI,CAAC;AAAA,IAChE;AAAA,EACF;AACF;AAEA,eAAe,qBACb,YACA,SACwB;AAzR1B;AA0RE,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,EAAE,MAAM,YAAY,UAAU,QAAQ,cAAc,IACtD;AAAA,EACN;AAEA,aAAW,WAAW,QAAQ,UAAU;AACtC,UAAM,gBAAsC,CAAC;AAE7C,QAAI,QAAQ,SAAS;AACnB,oBAAc,KAAK,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAAA,IAC5D;AAEA,eAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACtC,UAAI,yBAAyB,SAAS,KAAK,QAAQ,GAAG;AACpD,YAAI,KAAK,KAAK;AACZ,wBAAc,KAAK;AAAA,YACjB,MAAM;AAAA,YACN,WAAW,EAAE,KAAK,KAAK,IAAI;AAAA,UAC7B,CAAC;AACD,wBAAc,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,KAAK,GAAG,IAAI,CAAC;AAAA,QAClE,WAAW,KAAK,MAAM;AACpB,wBAAc,KAAK;AAAA,YACjB,MAAM;AAAA,YACN,WAAW,EAAE,KAAK,QAAQ,KAAK,QAAQ,WAAW,KAAK,IAAI,GAAG;AAAA,UAChE,CAAC;AAAA,QACH;AAAA,MACF,WAAW,KAAK,KAAK;AAEnB,sBAAc,KAAK;AAAA,UACjB,MAAM;AAAA,UACN,MAAM,SAAS,KAAK,GAAG;AAAA,QACzB,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,eAAe,iBACb,IACA,eACA,cACA,gBACgC;AApVlC;AAqVE,QAAM,gBAAoC,cAAc,QACpD,IAAI,IAAI,cAAc,MAAM,IAAI,CAAC,OAAO,GAAG,SAAS,IAAc,CAAC,IACnE;AAEJ,QAAM,EAAE,UAAU,QAAQ,IAAI;AAAA,IAC5B;AAAA,IACA,cAAc;AAAA,IACd;AAAA,EACF;AAEA,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,WAAW,MAAM,MAAM,UAAU;AAAA,IACrC,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,GAAG,eAAe,QAAQ,KAAK,CAAC;AAAA,IACvD,QAAQ,WAAW;AAAA,EACrB,CAAC;AAED,MAAI,CAAC,SAAS,MAAM;AAClB,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAEA,MAAI,YAAY;AAChB,QAAM,uBAA8D,CAAC;AAErE,QAAM,SAAS,SAAS,KAAK,UAAU;AACvC,MAAI,eAAe;AACnB,MAAI,aAAa;AAEjB,QAAM,qBAAqB,MACzB,WAAW,MAAM;AACf,mBAAO,MAAM,IAAI,wBAAwB,cAAc,IAAI;AAC3D,eAAW,MAAM;AAAA,EACnB,GAAG,cAAc;AAEnB,SAAO,MAAM;AACX;AACA,UAAM,eAAe,mBAAmB;AACxC,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,iBAAa,YAAY;AAEzB,QAAI,MAAM;AACR,qBAAO;AAAA,QACL;AAAA,QACA,kCAAkC,aAAa,CAAC;AAAA,MAClD;AACA,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAEA,QAAI,QAAQ,IAAI,YAAY,EAAE,OAAO,KAAK;AAC1C,QAAI,cAAc;AAChB,cAAQ,eAAe;AACvB,qBAAe;AAAA,IACjB;AAEA,UAAM,cAAc,MAAM,MAAM,WAAW;AAE3C,eAAW,cAAc,aAAa;AACpC,UAAI,CAAC;AAAY;AAEjB,UAAI,WAAW,SAAS,QAAQ,GAAG;AACjC,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACJ,UAAI;AACF,eAAO,KAAK,MAAM,WAAW,KAAK,CAAC;AAAA,MACrC,SAAQ;AACN,uBAAe;AACf;AAAA,MACF;AAEA,UAAI,GAAC,UAAK,YAAL,mBAAc,SAAQ;AACzB,YAAI,KAAK,OAAO;AACd,yBAAO,MAAM,IAAI,6BAA6B,KAAK,KAAK;AACxD,gBAAMA,SAAQ,IAAI,MAAM,4BAA4B;AACpD,UAAAA,OAAM,OAAO,KAAK;AAClB,UAAAA,OAAM,cAAc,gBAAgB,aAAa;AACjD,gBAAMA;AAAA,QACR;AACA,YAAI,eAAe,GAAG;AACpB,yBAAO,MAAM,IAAI,qCAAqC,IAAI;AAAA,QAC5D;AACA;AAAA,MACF;AAEA,YAAM,aAAY,gBAAK,QAAQ,CAAC,MAAd,mBAAiB,UAAjB,mBAAwB;AAC1C,UAAI,WAAW;AACb,mBAAW,YAAY,WAAW;AAChC,gBAAM,OAAM,cAAS,UAAT,YAAkB;AAC9B,iBAAO,qBAAqB,UAAU,KAAK;AACzC,iCAAqB,KAAK,EAAE,MAAM,IAAI,WAAW,GAAG,CAAC;AAAA,UACvD;AACA,eAAI,cAAS,aAAT,mBAAmB;AACrB,iCAAqB,GAAG,EAAE,QAAQ,SAAS,SAAS;AACtD,eAAI,cAAS,aAAT,mBAAmB;AACrB,iCAAqB,GAAG,EAAE,aAAa,SAAS,SAAS;AAAA,QAC7D;AAAA,MACF;AAEA,YAAM,QAAO,gBAAK,QAAQ,CAAC,MAAd,mBAAiB,UAAjB,mBAAwB;AACrC,UAAI;AAAM,qBAAa;AAAA,IACzB;AAAA,EACF;AACF;AAEA,eAAe,WACb,IACA,eACA,cACgC;AAxclC;AAycE,QAAM,EAAE,UAAU,QAAQ,IAAI;AAAA,IAC5B;AAAA,IACA,cAAc;AAAA,IACd;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,MAAM,UAAU;AAAA,IACrC,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,GAAG,eAAe,QAAQ,MAAM,CAAC;AAAA,EAC1D,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK;AACtC,mBAAO,MAAM,IAAI,qBAAqB,SAAS;AAC/C,UAAM,IAAI,MAAM,qBAAqB,UAAU,MAAM,OAAO,EAAE;AAAA,EAChE;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,MAAI,GAAC,UAAK,YAAL,mBAAc,SAAQ;AACzB,QAAI,KAAK,OAAO;AACd,qBAAO,MAAM,IAAI,iBAAiB,KAAK,KAAK;AAC5C,YAAM,IAAI,MAAM,iBAAiB,KAAK,MAAM,OAAO,EAAE;AAAA,IACvD;AACA,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAEA,QAAM,SAAS,KAAK,QAAQ,CAAC;AAG7B,QAAM,aAAY,YAAO,YAAP,mBAAgB;AAClC,QAAM,gBAAgC,CAAC;AAEvC,MAAI,uCAAW,QAAQ;AACrB,eAAW,MAAM,WAAW;AAC1B,oBAAc,KAAK;AAAA,QACjB,MAAM,GAAG,SAAS;AAAA,QAClB,WAAW,KAAK,MAAM,GAAG,SAAS,SAAS;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF,WAAW,OAAO,eAAe;AAC/B,kBAAc,KAAK;AAAA,MACjB,MAAM,OAAO,cAAc;AAAA,MAC3B,WAAW,KAAK,MAAM,OAAO,cAAc,SAAS;AAAA,IACtD,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,OAAO,QAAQ,WAAW;AAAA,IACnC,eAAe,cAAc,CAAC,KAAK;AAAA,IACnC,gBAAgB;AAAA,IAChB,OAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,sBACb,IACA,eACA,cACA,UAAkB,GAClB,iBAAyB,MACO;AAChC,iBAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,6CAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAEA,QAAM,eACJ,cAAc,qCACd,cAAc;AAEhB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY;AACV,UAAI,cAAc;AAChB,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AACL,eAAO,WAAW,IAAI,eAAe,YAAY;AAAA,MACnD;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA,aAAa;AAAA,MACb,SAAS,CAACA,QAAO,YAAY;AAtiBnC;AAuiBQ,uBAAO;AAAA,UACL;AAAA,UACA,UAAU,OAAO,WAAWA,OAAM,OAAO;AAAA,YACzC,KAAAA,OAAM,aAAN,mBAAgB,SAAQA,OAAM,QAAQA;AAAA,QACxC;AAGA,cAAI,KAAAA,OAAM,SAAN,mBAAY,UAAS,4BAA4B;AACnD,yBAAO,IAAI,IAAI,iDAAiD;AAChE,wBAAc,SAAS,QAAQ,CAAC,YAA2B;AACzD,gBAAI,MAAM,QAAQ,QAAQ,OAAO,GAAG;AAClC,sBAAQ,UAAU,QAAQ,QAAQ;AAAA,gBAChC,CAAC,YAAY,QAAQ,SAAS;AAAA,cAChC;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,qBACP,UACsB;AAnkBxB;AAokBE,MAAI,iBAAiB,SAAS,MAAM;AAGpC,QAAI,oBAAe,CAAC,MAAhB,mBAAmB,UAAS,QAAQ;AACtC,qBAAiB;AAAA,MACf,EAAE,MAAM,QAAiB,SAAS,MAAM;AAAA,MACxC,GAAG;AAAA,IACL;AAAA,EACF;AAGA,mBAAiB,eAAe,OAAO,CAAC,KAAK,YAAY;AACvD,QAAI,IAAI,WAAW;AAAG,aAAO,CAAC,OAAO;AAErC,UAAM,cAAc,IAAI,IAAI,SAAS,CAAC;AACtC,QAAI,YAAY,SAAS,QAAQ,MAAM;AACrC,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,EAAE,MAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,EACtD;AAEA,SAAO;AACT;AAEA,eAAe,wBACb,aACA,SAC6B;AAC7B,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,QAAI,QAAQ,SAAS,UAAU;AAC7B,sBAAgB,SAAS,QAAQ;AACjC;AAAA,IACF;AAEA,UAAM,gBAAyC,CAAC;AAEhD,QAAI,QAAQ,SAAS;AACnB,oBAAc,KAAK,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAAA,IAC5D;AAEA,eAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACtC,UAAI,yBAAyB,SAAS,KAAK,QAAQ,GAAG;AACpD,YAAI,KAAK,KAAK;AACZ,cAAI,QAAQ,QAAQ,QAAQ;AAE1B,0BAAc,KAAK;AAAA,cACjB,MAAM;AAAA,cACN,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,YAAY;AAAA,gBACZ,MAAM,MAAM,uBAAuB,KAAK,KAAK,KAAK,QAAQ;AAAA,cAC5D;AAAA,YACF,CAAC;AAAA,UACH;AACA,wBAAc,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,KAAK,GAAG,IAAI,CAAC;AAAA,QAClE,WAAW,KAAK,MAAM;AACpB,cAAI,QAAQ,QAAQ,QAAQ;AAE1B,0BAAc,KAAK;AAAA,cACjB,MAAM;AAAA,cACN,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,YAAY,KAAK;AAAA,gBACjB,MAAM,KAAK;AAAA,cACb;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,WAAW,KAAK,KAAK;AAEnB,sBAAc,KAAK;AAAA,UACjB,MAAM;AAAA,UACN,MAAM,SAAS,KAAK,GAAG;AAAA,QACzB,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,eAAe,cACb,IACA,SACA,QACgC;AA5rBlC;AA6rBE,QAAM,oBAAoB,qBAAqB,QAAQ,QAAQ;AAC/D,QAAM,SAAQ,aAAQ,cAAR,mBAAmB,IAAI,CAAC,OAAO;AAAA,IAC3C,GAAG;AAAA,IACH,cAAc,EAAE;AAAA,IAChB,YAAY;AAAA,EACd;AAEA,MAAI;AAEJ,OAAI,iCAAQ,aAAY,WAAW;AACjC,UAAM,aAAa;AACnB,UAAM,WAAW;AAEjB,UAAM,SAAS,IAAI,qBAAqB,EAAE,QAAQ,WAAW,CAAC;AAC9D,UAAM,iBAAiB;AAAA,MACrB,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,UAAU;AAAA,MACV;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,OAAO;AAAA,MAC5B,IAAI,mBAAmB;AAAA,QACrB,aAAa;AAAA,QACb,MAAM,KAAK,UAAU,cAAc;AAAA,QACnC,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,sBAAsB,IAAI,YAAY,EAAE,OAAO,SAAS,IAAI;AAClE,WAAO,KAAK,MAAM,mBAAmB;AAAA,EACvC,OAAO;AAEL,UAAM,WAAW,MAAM,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,OAAO,QAAQ;AAAA,QACf,UAAU;AAAA,QACV;AAAA,QACA,aAAa,QAAQ;AAAA,QACrB,QAAQ,QAAQ;AAAA,QAChB,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;AACA,WAAO,SAAS;AAAA,EAClB;AAEA,QAAM,UAAU,KAAK;AACrB,MAAI,EAAC,mCAAU,KAAI;AACjB,mBAAO,MAAM,IAAI,6CAA6C,IAAI;AAClE,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,MAAI,eAAe;AACnB,QAAM,gBAAgC,CAAC;AAEvC,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,MAAM;AAChB,qBAAO,MAAM,IAAI,kDAAkD,IAAI;AACvE,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAEA,QAAI,OAAO,SAAS,QAAQ;AAC1B,UAAI,OAAO,OAAO,KACf,QAAQ,+BAA+B,EAAE,EACzC,QAAQ,yBAAyB,EAAE,EACnC,KAAK;AAER,UAAI,CAAC,MAAM;AACT,eAAO,OAAO,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,QACF;AACA,uBAAO,IAAI,IAAI,kDAAkD,IAAI;AAAA,MACvE;AAEA,qBAAe,eAAe,GAAG,YAAY;AAAA;AAAA,EAAO,IAAI,KAAK;AAAA,IAC/D,WAAW,OAAO,SAAS,YAAY;AACrC,oBAAc,KAAK;AAAA,QACjB,MAAM,OAAO;AAAA,QACb,WAAW,OAAO;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,CAAC,gBAAgB,CAAC,cAAc,QAAQ;AAC1C,mBAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,eAAe,cAAc,CAAC,KAAK;AAAA,IACnC,gBAAgB;AAAA,IAChB,OAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,yBACb,IACA,SACA,QACA,UAAkB,GACc;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,cAAc,IAAI,SAAS,MAAM;AAAA,IACvC;AAAA,MACE;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,kBAAkB,UAAgD;AAj0B3E;AAk0BE,MAAI,iBAAiB,SAAS,MAAM;AAGpC,QAAI,oBAAe,CAAC,MAAhB,mBAAmB,UAAS,SAAS;AACvC,qBAAiB;AAAA,MACf,EAAE,MAAM,QAAiB,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC,EAAE;AAAA,MAClD,GAAG;AAAA,IACL;AAAA,EACF;AAGA,mBAAiB,eAAe,OAAO,CAAC,KAAK,YAAY;AACvD,QAAI,IAAI,WAAW;AAAG,aAAO,CAAC,OAAO;AAErC,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,EAAE,MAAM,QAAQ,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,EAChE;AAEA,SAAO;AACT;AAEA,eAAe,uBACb,aACA,SAC0B;AAC1B,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,UACV,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,QAAwB,CAAC;AAE/B,QAAI,QAAQ,SAAS;AACnB,YAAM,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,IACtC;AAEA,eAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACtC,UAAI,yBAAyB,SAAS,KAAK,QAAQ,GAAG;AACpD,YAAI,KAAK,KAAK;AACZ,gBAAM,KAAK;AAAA,YACT,UAAU;AAAA,cACR,UAAU,KAAK;AAAA,cACf,SAAS,KAAK;AAAA,YAChB;AAAA,UACF,CAAC;AACD,gBAAM,KAAK,EAAE,MAAM,UAAU,KAAK,GAAG,IAAI,CAAC;AAAA,QAC5C,WAAW,KAAK,MAAM;AACpB,gBAAM,KAAK;AAAA,YACT,YAAY;AAAA,cACV,UAAU,KAAK;AAAA,cACf,MAAM,KAAK;AAAA,YACb;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,WAAW,KAAK,KAAK;AAEnB,cAAM,KAAK;AAAA,UACT,MAAM,SAAS,KAAK,GAAG;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,oBAAgB,SAAS,KAAK;AAAA,MAC5B,MAAM,QAAQ,SAAS,cAAc,UAAU,QAAQ;AAAA,MACvD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAe,aACb,IACA,SACgC;AAv6BlC;AAw6BE,QAAM,iBAAiB,kBAAkB,QAAQ,QAAQ;AACzD,QAAM,UAAU,eAAe,MAAM,GAAG,EAAE;AAC1C,QAAM,cAAc,eAAe,MAAM,EAAE,EAAE,CAAC;AAE9C,QAAM,QAAQ,IAAI,YAAY,EAAE,QAAQ,QAAQ,IAAI,eAAe,CAAC;AAEpE,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,EAAE,SAAS,YAAY,MAAM,CAAC;AAEtE,MAAI,OAAO;AACX,QAAM,QAAgB,CAAC;AAEvB,aAAW,UAAQ,0BAAS,eAAT,mBAAsB,OAAtB,mBAA0B,YAA1B,mBAAmC,UAAS,CAAC,GAAG;AACjE,QAAI,KAAK;AAAM,cAAQ,KAAK;AAC5B,SAAI,UAAK,eAAL,mBAAiB,MAAM;AACzB,YAAM,KAAK,EAAE,UAAU,aAAa,MAAM,KAAK,WAAW,KAAK,CAAC;AAAA,IAClE;AAAA,EACF;AAEA,QAAM,iBAAgB,cAAS,kBAAT,mBAAwB,IAAI,CAAC,OAAI;AAp8BzD,QAAAC,KAAAC;AAo8B6D;AAAA,MACzD,OAAMD,MAAA,GAAG,SAAH,OAAAA,MAAW;AAAA,MACjB,YAAWC,MAAA,GAAG,SAAH,OAAAA,MAAW,CAAC;AAAA,IACzB;AAAA;AAEA,MAAI,CAAC,QAAQ,EAAC,+CAAe,WAAU,CAAC,MAAM,QAAQ;AACpD,UAAM,aAAY,cAAS,eAAT,mBAAsB;AACxC,UAAM,eAAe,uCAAW;AAEhC,mBAAO,MAAM,IAAI,uDAAuD;AAAA,MACtE;AAAA,MACA,eAAe,uCAAW;AAAA,MAC1B,eAAe,SAAS;AAAA,MACxB,cAAc,SAAS;AAAA,MACvB,kBAAkB,uCAAW;AAAA,MAC7B,gBAAgB,SAAS;AAAA,IAC3B,CAAC;AAED,QAAI,eAAe;AACnB,QAAI,cAAc;AAChB,YAAM,qBAA6C;AAAA,QACjD,yBACE;AAAA,QACF,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AACA,sBAAgB,kBAAkB,YAAY,IAAI,mBAAmB,YAAY,KAAK,EAAE;AAAA,IAC1F;AAEA,UAAMF,SAAQ,IAAI,MAAM,YAAY;AACpC,IAAAA,OAAM,eAAe;AACrB,IAAAA,OAAM,gBAAgB,uCAAW;AACjC,IAAAA,OAAM,gBAAgB,SAAS;AAC/B,IAAAA,OAAM,iBAAiB,SAAS;AAChC,UAAMA;AAAA,EACR;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA,gBAAe,+CAAgB,OAAM;AAAA,IACrC,gBAAgB,iBAAiB,CAAC;AAAA,EACpC;AACF;AAMA,IAAM,4BAA4B,oBAAI,IAAI,CAAC,sBAAsB,QAAQ,CAAC;AAM1E,SAAS,8BAA8B,SAAmC;AACxE,MAAI,gBAAgB;AAEpB,aAAW,WAAW,QAAQ,UAAU;AACtC,YAAQ,QAAQ,QAAQ,MAAM,OAAO,CAAC,SAAS;AAC7C,UAAI,gBAAgB,QAAQ,cAAc,MAAM;AAC9C,wBAAgB;AAChB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAGD,QAAI,QAAQ,MAAM,WAAW,GAAG;AAC9B,cAAQ,QAAQ,CAAC,EAAE,MAAM,wCAAwC,CAAC;AAAA,IACpE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,wBACb,IACA,SACA,UAAkB,GACc;AAChC,MAAI,wBAAwB;AAE5B,SAAO,YAAY,IAAI,aAAa,MAAM,aAAa,IAAI,OAAO,GAAG;AAAA,IACnE;AAAA,IACA,SAAS,CAACA,QAAO,YAAY;AA3hCjC;AA4hCM,YAAM,eAAoC;AAAA,QACxC,SAASA,OAAM;AAAA,QACf,cAAcA,OAAM;AAAA,QACpB,cAAcA,OAAM;AAAA,MACtB;AAEA,UAAIA,OAAM;AAAe,qBAAa,gBAAgBA,OAAM;AAC5D,UAAIA,OAAM;AAAe,qBAAa,gBAAgBA,OAAM;AAC5D,UAAIA,OAAM;AACR,qBAAa,iBAAiBA,OAAM;AACtC,UAAIA,OAAM;AAAQ,qBAAa,aAAaA,OAAM;AAClD,UAAIA,OAAM;AAAM,qBAAa,YAAYA,OAAM;AAC/C,UAAIA,OAAM;AAAS,qBAAa,eAAeA,OAAM;AAErD,YAAM,WAAW,QAAQ,SACtB,QAAQ,CAAC,MAAM,EAAE,KAAK,EACtB,OAAO,CAAC,MAAM,cAAc,CAAC,EAC7B,IAAI,CAAC,MAAO,EAAU,SAAS,OAAO;AACzC,UAAI,SAAS;AAAQ,qBAAa,WAAW;AAE7C,qBAAO;AAAA,QACL;AAAA,QACA,UAAU,OAAO,WAAWA,OAAM,OAAO;AAAA,QACzC;AAAA,MACF;AAIA,YAAM,kBACH,0BAA0B,IAAIA,OAAM,YAAY,KAC/CA,OAAM,gBACP,0BAA0B,KAAI,KAAAA,OAAM,mBAAN,mBAAsB,WAAW,OAC9D,KAAAA,OAAM,mBAAN,mBAAsB;AAE1B,UAAI,iBAAiB;AACnB,YAAI,CAAC,uBAAuB;AAC1B,gBAAM,gBAAgB,8BAA8B,OAAO;AAC3D,cAAI,eAAe;AACjB,2BAAO;AAAA,cACL;AAAA,cACA,qDAAqD,eAAe;AAAA,YACtE;AACA,oCAAwB;AACxB;AAAA,UACF;AAAA,QACF;AAGA,uBAAO;AAAA,UACL;AAAA,UACA,wCAAwC,eAAe;AAAA,QACzD;AACA,cAAM,sBAAsB,IAAI;AAAA,UAC9B,gCAAgC,eAAe;AAAA,QACjD;AACA,4BAAoB,eAAeA,OAAM;AACzC,4BAAoB,gBAAgBA,OAAM;AAC1C,4BAAoB,gBAAgBA,OAAM;AAC1C,4BAAoB,iBAAiB;AACrC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAMA,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,mBAAmB,SAAsC;AA3mClE;AA4mCE,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,EAAE,MAAM,YAAY,UAAU,QAAQ,cAAc,IACtD;AAAA,IACJ,aAAa,QAAQ;AAAA,EACvB;AACF;AAEA,eAAe,SACb,IACA,SACgC;AAloClC;AAmoCE,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,UAAS,cAAS,KAAK,QAAQ,CAAC,MAAvB,mBAA0B;AACzC,MAAI,CAAC,QAAQ;AACX,mBAAO,MAAM,IAAI,wCAAwC,SAAS,IAAI;AACtE,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,QAAM,gBAAgC,CAAC;AACvC,OAAI,YAAO,eAAP,mBAAmB,QAAQ;AAC7B,eAAW,MAAM,OAAO,YAAY;AAClC,oBAAc,KAAK;AAAA,QACjB,MAAM,GAAG,SAAS;AAAA,QAClB,WAAW,KAAK,MAAM,GAAG,SAAS,SAAS;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,OAAO,WAAW;AAAA,IAC3B,eAAe,cAAc,CAAC,KAAK;AAAA,IACnC,gBAAgB;AAAA,IAChB,OAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,oBACb,IACA,SACA,UAAkB,GACc;AAChC,SAAO,YAAY,IAAI,QAAQ,MAAM,SAAS,IAAI,OAAO,GAAG,EAAE,QAAQ,CAAC;AACzE;AAMA,SAAS,mBAAmB,SAAkC;AAC5D,SAAO,OAAO,OAAO,WAAW,EAAE,SAAS,QAAQ,KAAoB;AACzE;AAEA,SAAS,gBAAgB,SAAkC;AACzD,SAAO,OAAO,OAAO,QAAQ,EAAE,SAAS,QAAQ,KAAiB;AACnE;AAEA,SAAS,cAAc,SAAkC;AACvD,SAAO,OAAO,OAAO,SAAS,EAAE,SAAS,QAAQ,KAAkB;AACrE;AAEA,SAAS,kBAAkB,SAAkC;AAC3D,SAAO,OAAO,OAAO,WAAW,EAAE,SAAS,QAAQ,KAAoB;AACzE;AAEA,eAAsB,gBACpB,IACA,WACA,UACA,UAAkB,GAClB,iBAAyB,MACO;AAChC,MAAI;AACF,QAAI,mBAAmB,SAAS,GAAG;AACjC,aAAO,MAAM;AAAA,QACX;AAAA,QACA,MAAM,wBAAwB,IAAI,SAAS;AAAA,QAC3C;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,gBAAgB,SAAS,GAAG;AAC9B,aAAO,MAAM;AAAA,QACX;AAAA,QACA,MAAM,qBAAqB,IAAI,SAAS;AAAA,QACxC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,cAAc,SAAS,GAAG;AAC5B,aAAO,MAAM;AAAA,QACX;AAAA,QACA,mBAAmB,SAAS;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,kBAAkB,SAAS,GAAG;AAChC,aAAO,MAAM;AAAA,QACX;AAAA,QACA,MAAM,uBAAuB,IAAI,SAAS;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D,SAASA,QAAO;AACd,QAAI,UAAU,eAAe;AAC3B,qBAAO;AAAA,QACL;AAAA,QACA,iBAAiB,UAAU,KAAK,4BAA4B,UAAU,aAAa;AAAA,QACnF;AAAA,UACE,OAAOA,kBAAiB,QAAQA,OAAM,UAAUA;AAAA,UAChD,OACEA,kBAAiB,SAAUA,OAAc,iBAAiB,QACrDA,OAAc,MAAM,UACrB;AAAA,QACR;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,OAAO,UAAU;AAAA,UACjB,eAAe;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAMA;AAAA,EACR;AACF;","names":["ClaudeModel","GPTModel","GroqModel","GeminiModel","error","_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 LLAMA_3_3_70B_VERSATILE = \"llama-3.3-70b-versatile\",\n QWEN3_32B = \"qwen/qwen3-32b\",\n DEEPSEEK_R1_DISTILL_LLAMA_70B = \"deepseek-r1-distill-llama-70b\",\n}\n\nexport enum OpenRouterModel {\n QWEN3_6_PLUS_FREE = \"qwen/qwen3.6-plus:free\",\n}\n\nexport enum GeminiModel {\n GEMINI_1_5_PRO = \"gemini-1.5-pro-latest\",\n GEMINI_EXP_1206 = \"gemini-exp-1206\",\n GEMINI_2_0_FLASH = \"gemini-2.0-flash\",\n GEMINI_2_0_FLASH_EXP_IMAGE_GENERATION = \"gemini-2.0-flash-exp-image-generation\",\n GEMINI_2_0_FLASH_THINKING_EXP = \"gemini-2.0-flash-thinking-exp\",\n GEMINI_2_0_FLASH_THINKING_EXP_01_21 = \"gemini-2.0-flash-thinking-exp-01-21\",\n GEMINI_2_5_FLASH_PREVIEW_04_17 = \"gemini-2.5-flash-preview-04-17\",\n GEMINI_3_FLASH_PREVIEW = \"gemini-3-flash-preview\",\n GEMINI_3_1_FLASH_LITE_PREVIEW = \"gemini-3.1-flash-lite-preview\",\n}\n\nexport interface GenericError {\n message: string;\n}\n\nexport enum ContentType {\n TEXT = \"text\",\n ATTACHMENT = \"attachment\",\n}\n\nexport type AIChainResponse = {\n content: string | null;\n contentType?: ContentType;\n functionCalls: FunctionCall[];\n};\n\nexport interface GenericMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp?: string;\n files?: File[];\n functionCalls?: FunctionCall[];\n}\n\nexport interface File {\n mimeType: string;\n url?: string;\n data?: string;\n}\n\nexport interface OpenAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | OpenAIContentBlock[];\n}\n\nexport type OpenAIContentBlock =\n | OpenAITextContentBlock\n | OpenAIImageContentBlock\n | OpenAIAudioContentBlock;\n\nexport interface OpenAITextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface OpenAIImageContentBlock {\n type: \"image_url\";\n image_url: {\n url: string; // URL to the image, can also be a base64 string\n };\n}\n\nexport interface OpenAIAudioContentBlock {\n type: \"audio_url\";\n audio_url: {\n url: string; // URL to the audio, can also be a base64 string\n };\n}\n\nexport interface AnthropicAIMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | AnthropicContentBlock[];\n}\n\nexport type AnthropicContentBlock =\n | AnthropicTextContentBlock\n | AnthropicImageContentBlock;\n\nexport interface AnthropicTextContentBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface AnthropicImageContentBlock {\n type: \"image\";\n source: {\n type: \"base64\";\n media_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n data: string; // Must be a base64 string\n };\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface ParsedResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: FunctionCall | null;\n function_calls: FunctionCall[];\n files: File[];\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n } | null;\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIResponseMessage {\n role: \"assistant\";\n content: string | null;\n function_call: {\n name: string;\n arguments: string; // unparsed arguments object\n } | null;\n}\n\nexport interface FunctionCall {\n name: string;\n arguments: Record<string, any>;\n}\n\nexport interface OpenAIConfig {\n service: \"azure\" | \"openai\";\n apiKey: string;\n baseUrl: string;\n orgId?: string;\n modelConfigMap?: Record<\n GPTModel,\n {\n resource: string;\n deployment: string;\n apiVersion: string;\n apiKey: string;\n endpoint?: string;\n }\n >;\n}\n\nexport interface AnthropicAIConfig {\n service: \"anthropic\" | \"bedrock\";\n}\n\nexport interface FunctionDefinition {\n name: string;\n description?: string;\n parameters: Record<string, any>;\n}\n\ninterface FunctionWrapped {\n type: \"function\";\n function: FunctionDefinition;\n}\n\nexport interface GroqPayload {\n model: GroqModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n temperature?: number;\n\n functions?: any[]; // Deprecate this\n}\n\nexport interface OpenRouterPayload {\n model: OpenRouterModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n temperature?: number;\n}\n\nexport interface OpenAIPayload {\n model: GPTModel;\n messages: OpenAIMessage[];\n tools?: FunctionWrapped[];\n tool_choice?:\n | \"none\"\n | \"auto\"\n | { type: \"function\"; function: { name: string } };\n}\n\nexport interface AnthropicAIPayload {\n model: ClaudeModel;\n messages: AnthropicAIMessage[];\n functions?: any[]; // TODO type this JSON schema\n temperature?: number;\n system?: string;\n}\n\nexport interface GoogleAITextPart {\n text: string;\n}\n\nexport interface GoogleAIInlineDataPart {\n inlineData: {\n mimeType: string;\n data: string;\n };\n}\n\nexport interface GoogleAIFileDataPart {\n fileData: {\n mimeType: string;\n fileUri: string;\n };\n}\n\nexport type GoogleAIPart = GoogleAITextPart | GoogleAIInlineDataPart | GoogleAIFileDataPart;\nexport interface GoogleAIMessage {\n role: \"user\" | \"model\";\n parts: GoogleAIPart[];\n}\nexport interface GoogleAIPayload {\n model: GeminiModel;\n messages: GoogleAIMessage[];\n tools?: {\n functionDeclarations: FunctionDefinition[];\n };\n systemInstruction?: string;\n}\n\nexport type AnyModel = GPTModel | ClaudeModel | GroqModel | GeminiModel | OpenRouterModel;\n\nexport interface GenericPayload {\n model: AnyModel;\n messages: GenericMessage[];\n functions?: FunctionDefinition[];\n function_call?: \"none\" | \"auto\" | { name: string };\n temperature?: number;\n fallbackModel?: AnyModel;\n}\n\nexport interface OpenAIBody {\n choices: {\n message: OpenAIResponseMessage;\n }[];\n error?: {\n code: string;\n };\n usage: {\n completion_tokens: number;\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n","type LogLevel = \"LOG\" | \"WARN\" | \"ERROR\";\nexport type Identifier = string | string[];\n\nfunction formatIdentifier(identifier: Identifier): string {\n if (Array.isArray(identifier)) {\n return identifier.map((id) => `[${id}]`).join(\" \");\n }\n return `[${identifier}]`;\n}\n\nfunction formatMessage(\n level: LogLevel,\n identifier: Identifier,\n message: string\n): string {\n return `[${level}] ${formatIdentifier(identifier)} ${message}`;\n}\n\nexport function log(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.log(formatMessage(\"LOG\", identifier, message), ...args);\n}\n\nexport function warn(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.warn(formatMessage(\"WARN\", identifier, message), ...args);\n}\n\nexport function error(\n identifier: Identifier,\n message: string,\n ...args: any[]\n): void {\n console.error(formatMessage(\"ERROR\", identifier, message), ...args);\n}\n\nexport default {\n log,\n warn,\n error,\n};\n","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 OpenRouterPayload,\n OpenRouterModel,\n ParsedResponseMessage,\n FunctionCall,\n AnthropicContentBlock,\n OpenAIContentBlock,\n GoogleAIPayload,\n GeminiModel,\n GoogleAIPart,\n File,\n GoogleAIMessage,\n AnyModel,\n} from \"./interfaces\";\nimport logger, { Identifier } from \"./logger\";\nimport {\n BedrockRuntimeClient,\n InvokeModelCommand,\n} from \"@aws-sdk/client-bedrock-runtime\";\nimport axios from \"axios\";\nimport { isHeicImage, timeout } from \"./utils\";\nimport { GoogleGenAI } from \"@google/genai\";\n\nconst sharp = require(\"sharp\");\nconst decode = require(\"heic-decode\");\n\nexport {\n ClaudeModel,\n GPTModel,\n GroqModel,\n GeminiModel,\n OpenRouterModel,\n OpenAIConfig,\n FunctionDefinition,\n GenericMessage,\n GenericPayload,\n AnyModel,\n} from \"./interfaces\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SHARED UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generic retry wrapper for API calls with exponential backoff.\n */\nasync function withRetries<T>(\n identifier: Identifier,\n apiName: string,\n fn: () => Promise<T>,\n options: {\n retries?: number;\n baseDelayMs?: number;\n onError?: (error: any, attempt: number) => void;\n } = {},\n): Promise<T> {\n const { retries = 5, baseDelayMs = 125, onError } = options;\n\n logger.log(identifier, `Calling ${apiName} API with retries`);\n\n let lastError: any;\n for (let attempt = 0; attempt < retries; attempt++) {\n try {\n return await fn();\n } catch (error: any) {\n lastError = error;\n\n if (onError) {\n onError(error, attempt);\n } else {\n logger.error(\n identifier,\n `Retry #${attempt} error: ${error.message}`,\n error.response?.data || error,\n );\n }\n\n await timeout(baseDelayMs * attempt);\n }\n }\n\n const error = new Error(\n `Failed to call ${apiName} API after ${retries} attempts`,\n ) as any;\n error.cause = lastError;\n throw error;\n}\n\nfunction parseStreamedResponse(\n identifier: Identifier,\n paragraph: string,\n toolCallAccumulators: { name: string; arguments: string }[],\n allowedFunctionNames: Set<string> | null,\n): ParsedResponseMessage {\n const functionCalls: FunctionCall[] = [];\n\n for (const acc of toolCallAccumulators) {\n if (!acc.name || !acc.arguments) continue;\n\n if (allowedFunctionNames && !allowedFunctionNames.has(acc.name)) {\n throw new Error(\n `Stream error: received function call with unknown name: ${acc.name}`,\n );\n }\n\n try {\n functionCalls.push({\n name: acc.name,\n arguments: JSON.parse(acc.arguments),\n });\n } catch (error) {\n logger.error(\n identifier,\n \"Error parsing function call arguments:\",\n acc.arguments,\n );\n throw error;\n }\n }\n\n if (!paragraph && !functionCalls.length) {\n logger.error(\n identifier,\n \"Stream error: received message without content or function_call:\",\n JSON.stringify({ paragraph, toolCallAccumulators }),\n );\n throw new Error(\n \"Stream error: received message without content or function_call\",\n );\n }\n\n return {\n role: \"assistant\",\n content: paragraph || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n usage: null,\n };\n}\n\nfunction truncatePayload(payload: OpenAIPayload): string {\n return JSON.stringify(\n {\n ...payload,\n messages: payload.messages.map((message) => {\n const truncatedMessage = { ...message };\n if (typeof truncatedMessage.content === \"string\") {\n truncatedMessage.content = truncatedMessage.content.slice(0, 100);\n } else if (Array.isArray(truncatedMessage.content)) {\n truncatedMessage.content = truncatedMessage.content.map((block) => {\n if (block.type === \"image_url\") {\n return {\n ...block,\n image_url: { url: block.image_url.url.slice(0, 100) },\n };\n }\n return block;\n });\n }\n return truncatedMessage;\n }),\n },\n null,\n 2,\n );\n}\n\nasync function getNormalizedBase64PNG(\n url: string,\n mime: string,\n): Promise<string> {\n const response = await axios.get(url, { responseType: \"arraybuffer\" });\n\n let imageBuffer = Buffer.from(response.data);\n let sharpOptions = {};\n\n if (isHeicImage(url, mime)) {\n const imageData = await decode({ buffer: imageBuffer });\n imageBuffer = Buffer.from(imageData.data);\n sharpOptions = {\n raw: {\n width: imageData.width,\n height: imageData.height,\n channels: 4,\n },\n };\n }\n\n // Limits size of image to < 5MB Anthropic limit\n const resizedBuffer = await sharp(imageBuffer, sharpOptions)\n .withMetadata()\n .resize(1024, 1024, { fit: \"inside\", withoutEnlargement: true })\n .png()\n .toBuffer();\n\n return resizedBuffer.toString(\"base64\");\n}\n\nconst ALLOWED_IMAGE_MIME_TYPES = [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// OPENAI\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface OpenAIRequestConfig {\n endpoint: string;\n headers: Record<string, string>;\n}\n\nfunction buildOpenAIRequestConfig(\n identifier: Identifier,\n model: string,\n config: OpenAIConfig | undefined,\n): OpenAIRequestConfig {\n if (!config) {\n config = {\n service: \"openai\",\n apiKey: process.env.OPENAI_API_KEY as string,\n baseUrl: \"\",\n };\n }\n\n if (config.service === \"azure\") {\n logger.log(identifier, \"Using Azure OpenAI service:\", model);\n\n if (!config.modelConfigMap) {\n throw new Error(\n \"OpenAI config modelConfigMap is required when using Azure OpenAI service.\",\n );\n }\n\n const azureConfig = config.modelConfigMap[model as GPTModel];\n if (!azureConfig?.endpoint) {\n throw new Error(\"Azure OpenAI endpoint is required in modelConfigMap.\");\n }\n\n const endpoint = `${azureConfig.endpoint}/openai/deployments/${azureConfig.deployment}/chat/completions?api-version=${azureConfig.apiVersion}`;\n logger.log(identifier, \"Using endpoint:\", endpoint);\n\n return {\n endpoint,\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": azureConfig.apiKey,\n },\n };\n }\n\n // Default: OpenAI\n logger.log(identifier, \"Using OpenAI service:\", model);\n if (config.orgId) {\n logger.log(identifier, \"Using orgId:\", config.orgId);\n }\n\n return {\n endpoint: \"https://api.openai.com/v1/chat/completions\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.apiKey}`,\n ...(config.orgId ? { \"OpenAI-Organization\": config.orgId } : {}),\n },\n };\n}\n\nasync function prepareOpenAIPayload(\n identifier: Identifier,\n payload: GenericPayload,\n): Promise<OpenAIPayload> {\n const preparedPayload: OpenAIPayload = {\n model: payload.model as GPTModel,\n messages: [],\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call\n : { type: \"function\", function: payload.function_call }\n : undefined,\n };\n\n for (const message of payload.messages) {\n const contentBlocks: OpenAIContentBlock[] = [];\n\n if (message.content) {\n contentBlocks.push({ type: \"text\", text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n contentBlocks.push({\n type: \"image_url\",\n image_url: { url: file.url },\n });\n contentBlocks.push({ type: \"text\", text: `Image (${file.url})` });\n } else if (file.data) {\n contentBlocks.push({\n type: \"image_url\",\n image_url: { url: `data:${file.mimeType};base64,${file.data}` },\n });\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n contentBlocks.push({\n type: \"text\",\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: contentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callOpenAIStream(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n chunkTimeoutMs: number,\n): Promise<ParsedResponseMessage> {\n const functionNames: Set<string> | null = openAiPayload.tools\n ? new Set(openAiPayload.tools.map((fn) => fn.function.name as string))\n : null;\n\n const { endpoint, headers } = buildOpenAIRequestConfig(\n id,\n openAiPayload.model,\n openAiConfig,\n );\n\n const controller = new AbortController();\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...openAiPayload, stream: true }),\n signal: controller.signal,\n });\n\n if (!response.body) {\n throw new Error(\"Stream error: no response body\");\n }\n\n let paragraph = \"\";\n const toolCallAccumulators: { name: string; arguments: string }[] = [];\n\n const reader = response.body.getReader();\n let partialChunk = \"\";\n let chunkIndex = -1;\n\n const createAbortTimeout = () =>\n setTimeout(() => {\n logger.error(id, `Stream timeout after ${chunkTimeoutMs}ms`);\n controller.abort();\n }, chunkTimeoutMs);\n\n while (true) {\n chunkIndex++;\n const abortTimeout = createAbortTimeout();\n const { done, value } = await reader.read();\n clearTimeout(abortTimeout);\n\n if (done) {\n logger.error(\n id,\n `Stream ended prematurely after ${chunkIndex + 1} chunks`,\n );\n throw new Error(\"Stream error: ended prematurely\");\n }\n\n let chunk = new TextDecoder().decode(value);\n if (partialChunk) {\n chunk = partialChunk + chunk;\n partialChunk = \"\";\n }\n\n const jsonStrings = chunk.split(/^data: /gm);\n\n for (const jsonString of jsonStrings) {\n if (!jsonString) continue;\n\n if (jsonString.includes(\"[DONE]\")) {\n return parseStreamedResponse(\n id,\n paragraph,\n toolCallAccumulators,\n functionNames,\n );\n }\n\n let json;\n try {\n json = JSON.parse(jsonString.trim());\n } catch {\n partialChunk = jsonString;\n continue;\n }\n\n if (!json.choices?.length) {\n if (json.error) {\n logger.error(id, \"Stream error from OpenAI:\", json.error);\n const error = new Error(\"Stream error: OpenAI error\") as any;\n error.data = json.error;\n error.requestBody = truncatePayload(openAiPayload);\n throw error;\n }\n if (chunkIndex !== 0) {\n logger.error(id, \"Stream error: no choices in JSON:\", json);\n }\n continue;\n }\n\n const toolCalls = json.choices[0]?.delta?.tool_calls;\n if (toolCalls) {\n for (const toolCall of toolCalls) {\n const idx = toolCall.index ?? 0;\n while (toolCallAccumulators.length <= idx) {\n toolCallAccumulators.push({ name: \"\", arguments: \"\" });\n }\n if (toolCall.function?.name)\n toolCallAccumulators[idx].name += toolCall.function.name;\n if (toolCall.function?.arguments)\n toolCallAccumulators[idx].arguments += toolCall.function.arguments;\n }\n }\n\n const text = json.choices[0]?.delta?.content;\n if (text) paragraph += text;\n }\n }\n}\n\nasync function callOpenAI(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig: OpenAIConfig | undefined,\n): Promise<ParsedResponseMessage> {\n const { endpoint, headers } = buildOpenAIRequestConfig(\n id,\n openAiPayload.model,\n openAiConfig,\n );\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...openAiPayload, stream: false }),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n logger.error(id, \"OpenAI API error:\", errorData);\n throw new Error(`OpenAI API Error: ${errorData.error.message}`);\n }\n\n const data = await response.json();\n\n if (!data.choices?.length) {\n if (data.error) {\n logger.error(id, \"OpenAI error:\", data.error);\n throw new Error(`OpenAI error: ${data.error.message}`);\n }\n throw new Error(\"OpenAI error: No choices returned.\");\n }\n\n const choice = data.choices[0];\n\n // Check for tool_calls (modern API) first, fall back to function_call (legacy)\n const toolCalls = choice.message?.tool_calls;\n const functionCalls: FunctionCall[] = [];\n\n if (toolCalls?.length) {\n for (const tc of toolCalls) {\n functionCalls.push({\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n });\n }\n } else if (choice.function_call) {\n functionCalls.push({\n name: choice.function_call.name,\n arguments: JSON.parse(choice.function_call.arguments),\n });\n }\n\n return {\n role: \"assistant\",\n content: choice.message.content || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n usage: data.usage\n ? {\n prompt_tokens: data.usage.prompt_tokens,\n completion_tokens: data.usage.completion_tokens,\n total_tokens: data.usage.total_tokens,\n }\n : null,\n };\n}\n\nasync function callOpenAiWithRetries(\n id: Identifier,\n openAiPayload: OpenAIPayload,\n openAiConfig?: OpenAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000,\n): Promise<ParsedResponseMessage> {\n logger.log(\n id,\n \"Calling OpenAI API with retries:\",\n openAiConfig?.service,\n openAiPayload.model,\n );\n\n const useStreaming =\n openAiPayload.model !== GPTModel.O1_MINI &&\n openAiPayload.model !== GPTModel.O1_PREVIEW;\n\n return withRetries(\n id,\n \"OpenAI\",\n async () => {\n if (useStreaming) {\n return callOpenAIStream(\n id,\n openAiPayload,\n openAiConfig,\n chunkTimeoutMs,\n );\n } else {\n return callOpenAI(id, openAiPayload, openAiConfig);\n }\n },\n {\n retries,\n baseDelayMs: 250,\n onError: (error, attempt) => {\n logger.error(\n id,\n `Retry #${attempt} error: ${error.message}`,\n error.response?.data || error.data || error,\n );\n\n // Remove images on content policy violation\n if (error.data?.code === \"content_policy_violation\") {\n logger.log(id, \"Removing images due to content policy violation\");\n openAiPayload.messages.forEach((message: OpenAIMessage) => {\n if (Array.isArray(message.content)) {\n message.content = message.content.filter(\n (content) => content.type === \"text\",\n );\n }\n });\n }\n },\n },\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ANTHROPIC\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction jigAnthropicMessages(\n messages: AnthropicAIMessage[],\n): AnthropicAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // Ensure first message is from user\n if (jiggedMessages[0]?.role !== \"user\") {\n jiggedMessages = [\n { role: \"user\" as const, content: \"...\" },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) return [message];\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n const lastContent = Array.isArray(lastMessage.content)\n ? lastMessage.content\n : [{ type: \"text\" as const, text: lastMessage.content }];\n const newContent = Array.isArray(message.content)\n ? message.content\n : [{ type: \"text\" as const, text: message.content }];\n\n lastMessage.content = [\n ...lastContent,\n { type: \"text\", text: \"\\n\\n---\\n\\n\" },\n ...newContent,\n ];\n return acc;\n }\n\n // Convert string content to text content block\n if (typeof message.content === \"string\") {\n message.content = [{ type: \"text\", text: message.content }];\n }\n\n return [...acc, message];\n }, [] as AnthropicAIMessage[]);\n\n // Ensure last message is from user\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"assistant\") {\n jiggedMessages.push({ role: \"user\", content: \"...\" });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareAnthropicPayload(\n _identifier: Identifier,\n payload: GenericPayload,\n): Promise<AnthropicAIPayload> {\n const preparedPayload: AnthropicAIPayload = {\n model: payload.model as ClaudeModel,\n messages: [],\n functions: payload.functions,\n temperature: payload.temperature,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.system = message.content;\n continue;\n }\n\n const contentBlocks: AnthropicContentBlock[] = [];\n\n if (message.content) {\n contentBlocks.push({ type: \"text\", text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n if (message.role == \"user\") {\n // anthropic assistant turns can't have images\n contentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: await getNormalizedBase64PNG(file.url, file.mimeType),\n },\n });\n }\n contentBlocks.push({ type: \"text\", text: `Image (${file.url})` });\n } else if (file.data) {\n if (message.role == \"user\") {\n // anthropic assistant turns can't have images\n contentBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: file.mimeType as any,\n data: file.data,\n },\n });\n }\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n contentBlocks.push({\n type: \"text\",\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role,\n content: contentBlocks,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callAnthropic(\n id: Identifier,\n payload: AnthropicAIPayload,\n config?: AnthropicAIConfig,\n): Promise<ParsedResponseMessage> {\n const anthropicMessages = jigAnthropicMessages(payload.messages);\n const tools = payload.functions?.map((f) => ({\n ...f,\n input_schema: f.parameters,\n parameters: undefined,\n }));\n\n let data;\n\n if (config?.service === \"bedrock\") {\n const AWS_REGION = \"us-east-1\";\n const MODEL_ID = \"anthropic.claude-3-haiku-20240307-v1:0\";\n\n const client = new BedrockRuntimeClient({ region: AWS_REGION });\n const bedrockPayload = {\n anthropic_version: \"bedrock-2023-05-31\",\n max_tokens: 4096,\n messages: anthropicMessages,\n tools,\n };\n\n const response = await client.send(\n new InvokeModelCommand({\n contentType: \"application/json\",\n body: JSON.stringify(bedrockPayload),\n modelId: MODEL_ID,\n }),\n );\n\n const decodedResponseBody = new TextDecoder().decode(response.body);\n data = JSON.parse(decodedResponseBody);\n } else {\n // Default: Anthropic API\n const response = await axios.post(\n \"https://api.anthropic.com/v1/messages\",\n {\n model: payload.model,\n messages: anthropicMessages,\n tools,\n temperature: payload.temperature,\n system: payload.system,\n max_tokens: 4096,\n },\n {\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": process.env.ANTHROPIC_API_KEY as string,\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-beta\": \"tools-2024-04-04\",\n },\n timeout: 60000,\n },\n );\n data = response.data;\n }\n\n const answers = data.content;\n if (!answers?.[0]) {\n logger.error(id, \"Missing answer in Anthropic API response:\", data);\n throw new Error(\"Missing answer in Anthropic API\");\n }\n\n let textResponse = \"\";\n const functionCalls: FunctionCall[] = [];\n\n for (const answer of answers) {\n if (!answer.type) {\n logger.error(id, \"Missing answer type in Anthropic API response:\", data);\n throw new Error(\"Missing answer type in Anthropic API\");\n }\n\n if (answer.type === \"text\") {\n let text = answer.text\n .replace(/<thinking>.*?<\\/thinking>/gs, \"\")\n .replace(/<answer>|<\\/answer>/gs, \"\")\n .trim();\n\n if (!text) {\n text = answer.text.replace(\n /<thinking>|<\\/thinking>|<answer>|<\\/answer>/gs,\n \"\",\n );\n logger.log(id, \"No text in answer, returning text within tags:\", text);\n }\n\n textResponse = textResponse ? `${textResponse}\\n\\n${text}` : text;\n } else if (answer.type === \"tool_use\") {\n functionCalls.push({\n name: answer.name,\n arguments: answer.input,\n });\n }\n }\n\n if (!textResponse && !functionCalls.length) {\n logger.error(\n id,\n \"Missing text & functions in Anthropic API response:\",\n data,\n );\n throw new Error(\"Missing text & functions in Anthropic API response\");\n }\n\n return {\n role: \"assistant\",\n content: textResponse,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n usage: data.usage\n ? {\n prompt_tokens: data.usage.input_tokens,\n completion_tokens: data.usage.output_tokens,\n total_tokens: data.usage.input_tokens + data.usage.output_tokens,\n }\n : null,\n };\n}\n\nasync function callAnthropicWithRetries(\n id: Identifier,\n payload: AnthropicAIPayload,\n config?: AnthropicAIConfig,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n return withRetries(\n id,\n \"Anthropic\",\n () => callAnthropic(id, payload, config),\n {\n retries,\n },\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// GOOGLE AI\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction jigGoogleMessages(messages: GoogleAIMessage[]): GoogleAIMessage[] {\n let jiggedMessages = messages.slice();\n\n // Ensure first message is from user\n if (jiggedMessages[0]?.role === \"model\") {\n jiggedMessages = [\n { role: \"user\" as const, parts: [{ text: \"...\" }] },\n ...jiggedMessages,\n ];\n }\n\n // Group consecutive messages with the same role\n jiggedMessages = jiggedMessages.reduce((acc, message) => {\n if (acc.length === 0) return [message];\n\n const lastMessage = acc[acc.length - 1];\n if (lastMessage.role === message.role) {\n lastMessage.parts = [...lastMessage.parts, ...message.parts];\n return acc;\n }\n\n return [...acc, message];\n }, [] as GoogleAIMessage[]);\n\n // Ensure last message is from user\n if (jiggedMessages[jiggedMessages.length - 1]?.role === \"model\") {\n jiggedMessages.push({ role: \"user\", parts: [{ text: \"...\" }] });\n }\n\n return jiggedMessages;\n}\n\nasync function prepareGoogleAIPayload(\n _identifier: Identifier,\n payload: GenericPayload,\n): Promise<GoogleAIPayload> {\n const preparedPayload: GoogleAIPayload = {\n model: payload.model as GeminiModel,\n messages: [],\n tools: payload.functions\n ? {\n functionDeclarations: payload.functions.map((fn) => ({\n name: fn.name,\n parameters: {\n description: fn.description,\n ...fn.parameters,\n },\n })),\n }\n : undefined,\n };\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n preparedPayload.systemInstruction = message.content;\n continue;\n }\n\n const parts: GoogleAIPart[] = [];\n\n if (message.content) {\n parts.push({ text: message.content });\n }\n\n for (const file of message.files || []) {\n if (ALLOWED_IMAGE_MIME_TYPES.includes(file.mimeType)) {\n if (file.url) {\n parts.push({\n fileData: {\n mimeType: file.mimeType,\n fileUri: file.url,\n },\n });\n parts.push({ text: `Image (${file.url})` });\n } else if (file.data) {\n parts.push({\n inlineData: {\n mimeType: file.mimeType,\n data: file.data,\n },\n });\n }\n } else if (file.url) {\n // Non-image file with URL - add text reference\n parts.push({\n text: `File (${file.url})`,\n });\n }\n }\n\n preparedPayload.messages.push({\n role: message.role === \"assistant\" ? \"model\" : message.role,\n parts,\n });\n }\n\n return preparedPayload;\n}\n\nasync function callGoogleAI(\n id: Identifier,\n payload: GoogleAIPayload,\n): Promise<ParsedResponseMessage> {\n const googleMessages = jigGoogleMessages(payload.messages);\n const history = googleMessages.slice(0, -1);\n const lastMessage = googleMessages.slice(-1)[0];\n\n const genAI = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\n const chat = genAI.chats.create({\n model: payload.model,\n history,\n config: {\n responseModalities: [\"Text\"],\n tools: payload.tools ? [payload.tools] : undefined,\n systemInstruction: payload.systemInstruction,\n },\n });\n\n const response = await chat.sendMessage({ message: lastMessage.parts });\n\n let text = \"\";\n const files: File[] = [];\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.text) text += part.text;\n if (part.inlineData?.data) {\n files.push({ mimeType: \"image/png\", data: part.inlineData.data });\n }\n }\n\n const functionCalls = response.functionCalls?.map((fc) => ({\n name: fc.name ?? \"\",\n arguments: fc.args ?? {},\n }));\n\n if (!text && !functionCalls?.length && !files.length) {\n const candidate = response.candidates?.[0];\n const finishReason = candidate?.finishReason;\n\n logger.error(id, \"Missing text & functions in Google AI API response:\", {\n finishReason,\n safetyRatings: candidate?.safetyRatings,\n usageMetadata: response.usageMetadata,\n modelVersion: response.modelVersion,\n candidateContent: candidate?.content,\n promptFeedback: response.promptFeedback,\n });\n\n let errorMessage = \"Missing text & functions in Google AI API response\";\n if (finishReason) {\n const reasonDescriptions: Record<string, string> = {\n MALFORMED_FUNCTION_CALL:\n \"(Google could not generate valid function call arguments)\",\n SAFETY: \"(blocked by safety filters)\",\n RECITATION: \"(blocked due to recitation)\",\n MAX_TOKENS: \"(response truncated due to max tokens)\",\n };\n errorMessage += `: finishReason=${finishReason} ${reasonDescriptions[finishReason] || \"\"}`;\n }\n\n const error = new Error(errorMessage) as any;\n error.finishReason = finishReason;\n error.safetyRatings = candidate?.safetyRatings;\n error.usageMetadata = response.usageMetadata;\n error.promptFeedback = response.promptFeedback;\n throw error;\n }\n\n return {\n role: \"assistant\",\n content: text || null,\n files,\n function_call: functionCalls?.[0] || null,\n function_calls: functionCalls || [],\n usage: response.usageMetadata\n ? {\n prompt_tokens: response.usageMetadata.promptTokenCount ?? 0,\n completion_tokens: response.usageMetadata.candidatesTokenCount ?? 0,\n total_tokens: response.usageMetadata.totalTokenCount ?? 0,\n }\n : null,\n };\n}\n\n/**\n * Content violation finish reasons that should trigger circuit breaker behavior.\n * These errors won't resolve with simple retries - the content itself is the problem.\n */\nconst CONTENT_VIOLATION_REASONS = new Set([\"PROHIBITED_CONTENT\", \"SAFETY\"]);\n\n/**\n * Removes inline image data from Google AI messages, preserving text content.\n * Used as a fallback when content violations are detected.\n */\nfunction removeImagesFromGooglePayload(payload: GoogleAIPayload): boolean {\n let removedImages = false;\n\n for (const message of payload.messages) {\n message.parts = message.parts.filter((part) => {\n if (\"inlineData\" in part || \"fileData\" in part) {\n removedImages = true;\n return false;\n }\n return true;\n });\n\n // Ensure message still has content after removing images\n if (message.parts.length === 0) {\n message.parts = [{ text: \"(image removed due to content policy)\" }];\n }\n }\n\n return removedImages;\n}\n\nasync function callGoogleAIWithRetries(\n id: Identifier,\n payload: GoogleAIPayload,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n let hasTriedWithoutImages = false;\n\n return withRetries(id, \"Google AI\", () => callGoogleAI(id, payload), {\n retries,\n onError: (error, attempt) => {\n const errorDetails: Record<string, any> = {\n message: error.message,\n finishReason: error.finishReason,\n modelVersion: error.modelVersion,\n };\n\n if (error.safetyRatings) errorDetails.safetyRatings = error.safetyRatings;\n if (error.usageMetadata) errorDetails.usageMetadata = error.usageMetadata;\n if (error.promptFeedback)\n errorDetails.promptFeedback = error.promptFeedback;\n if (error.status) errorDetails.httpStatus = error.status;\n if (error.code) errorDetails.errorCode = error.code;\n if (error.details) errorDetails.errorDetails = error.details;\n\n const fileUris = payload.messages\n .flatMap((m) => m.parts)\n .filter((p) => \"fileData\" in p)\n .map((p) => (p as any).fileData.fileUri);\n if (fileUris.length) errorDetails.fileUris = fileUris;\n\n logger.error(\n id,\n `Retry #${attempt} error: ${error.message}`,\n errorDetails,\n );\n\n // Circuit breaker: detect content violations and try removing images\n // Check both finishReason (candidate-level) and promptFeedback.blockReason (prompt-level)\n const violationReason =\n (CONTENT_VIOLATION_REASONS.has(error.finishReason) &&\n error.finishReason) ||\n (CONTENT_VIOLATION_REASONS.has(error.promptFeedback?.blockReason) &&\n error.promptFeedback?.blockReason);\n\n if (violationReason) {\n if (!hasTriedWithoutImages) {\n const removedImages = removeImagesFromGooglePayload(payload);\n if (removedImages) {\n logger.log(\n id,\n `Circuit breaker triggered: removing images due to ${violationReason}`,\n );\n hasTriedWithoutImages = true;\n return; // Continue to next retry with images removed\n }\n }\n\n // If we already tried without images or there were no images, fail fast\n logger.error(\n id,\n `Circuit breaker: failing fast due to ${violationReason} (no more fallbacks)`,\n );\n const circuitBreakerError = new Error(\n `Google AI content violation: ${violationReason}. Request cannot succeed with current content.`,\n ) as any;\n circuitBreakerError.finishReason = error.finishReason;\n circuitBreakerError.safetyRatings = error.safetyRatings;\n circuitBreakerError.usageMetadata = error.usageMetadata;\n circuitBreakerError.circuitBreaker = true;\n throw circuitBreakerError;\n }\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// GROQ\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction normalizeMessageContent(\n content: AnthropicAIMessage[\"content\"],\n): string {\n return Array.isArray(content)\n ? content\n .map((c) => (c.type === \"text\" ? c.text : `[${c.type}]`))\n .join(\"\\n\")\n : content;\n}\n\nfunction prepareGroqPayload(payload: GenericPayload): GroqPayload {\n return {\n model: payload.model as GroqModel,\n messages: payload.messages.map((message) => ({\n role: message.role,\n content: normalizeMessageContent(message.content),\n })),\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call\n : { type: \"function\", function: payload.function_call }\n : undefined,\n temperature: payload.temperature,\n };\n}\n\nasync function callGroq(\n id: Identifier,\n payload: GroqPayload,\n): Promise<ParsedResponseMessage> {\n const response = await axios.post(\n \"https://api.groq.com/openai/v1/chat/completions\",\n payload,\n {\n headers: {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${process.env.GROQ_API_KEY}`,\n },\n },\n );\n\n const answer = response.data.choices[0]?.message;\n if (!answer) {\n logger.error(id, \"Missing answer in Groq API response:\", response.data);\n throw new Error(\"Missing answer in Groq API\");\n }\n\n const functionCalls: FunctionCall[] = [];\n if (answer.tool_calls?.length) {\n for (const tc of answer.tool_calls) {\n functionCalls.push({\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n return {\n role: \"assistant\",\n content: answer.content || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n usage: response.data.usage\n ? {\n prompt_tokens: response.data.usage.prompt_tokens,\n completion_tokens: response.data.usage.completion_tokens,\n total_tokens: response.data.usage.total_tokens,\n }\n : null,\n };\n}\n\nasync function callGroqWithRetries(\n id: Identifier,\n payload: GroqPayload,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n return withRetries(id, \"Groq\", () => callGroq(id, payload), { retries });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// OPENROUTER\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction prepareOpenRouterPayload(payload: GenericPayload): OpenRouterPayload {\n return {\n model: payload.model as OpenRouterModel,\n messages: payload.messages.map((message) => ({\n role: message.role,\n content: normalizeMessageContent(message.content),\n })),\n tools: payload.functions?.map((fn) => ({\n type: \"function\",\n function: fn,\n })),\n tool_choice: payload.function_call\n ? typeof payload.function_call === \"string\"\n ? payload.function_call\n : { type: \"function\", function: payload.function_call }\n : undefined,\n temperature: payload.temperature,\n };\n}\n\nasync function callOpenRouter(\n id: Identifier,\n payload: OpenRouterPayload,\n): Promise<ParsedResponseMessage> {\n const response = await axios.post(\n \"https://openrouter.ai/api/v1/chat/completions\",\n payload,\n {\n headers: {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${process.env.OPENROUTER_API_KEY}`,\n },\n },\n );\n\n const answer = response.data.choices[0]?.message;\n if (!answer) {\n logger.error(id, \"Missing answer in OpenRouter API response:\", response.data);\n throw new Error(\"Missing answer in OpenRouter API\");\n }\n\n const functionCalls: FunctionCall[] = [];\n if (answer.tool_calls?.length) {\n for (const tc of answer.tool_calls) {\n functionCalls.push({\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n return {\n role: \"assistant\",\n content: answer.content || null,\n function_call: functionCalls[0] || null,\n function_calls: functionCalls,\n files: [],\n usage: response.data.usage\n ? {\n prompt_tokens: response.data.usage.prompt_tokens,\n completion_tokens: response.data.usage.completion_tokens,\n total_tokens: response.data.usage.total_tokens,\n }\n : null,\n };\n}\n\nasync function callOpenRouterWithRetries(\n id: Identifier,\n payload: OpenRouterPayload,\n retries: number = 5,\n): Promise<ParsedResponseMessage> {\n return withRetries(id, \"OpenRouter\", () => callOpenRouter(id, payload), { retries });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MAIN ENTRY POINT\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction isAnthropicPayload(payload: GenericPayload): boolean {\n return Object.values(ClaudeModel).includes(payload.model as ClaudeModel);\n}\n\nfunction isOpenAiPayload(payload: GenericPayload): boolean {\n return Object.values(GPTModel).includes(payload.model as GPTModel);\n}\n\nfunction isGroqPayload(payload: GenericPayload): boolean {\n return Object.values(GroqModel).includes(payload.model as GroqModel);\n}\n\nfunction isGoogleAIPayload(payload: GenericPayload): boolean {\n return Object.values(GeminiModel).includes(payload.model as GeminiModel);\n}\n\nfunction isOpenRouterPayload(payload: GenericPayload): boolean {\n return Object.values(OpenRouterModel).includes(payload.model as OpenRouterModel);\n}\n\nexport async function callWithRetries(\n id: string | string[],\n aiPayload: GenericPayload,\n aiConfig?: OpenAIConfig | AnthropicAIConfig,\n retries: number = 5,\n chunkTimeoutMs: number = 15_000,\n): Promise<ParsedResponseMessage> {\n try {\n if (isAnthropicPayload(aiPayload)) {\n return await callAnthropicWithRetries(\n id,\n await prepareAnthropicPayload(id, aiPayload),\n aiConfig as AnthropicAIConfig,\n retries,\n );\n }\n\n if (isOpenAiPayload(aiPayload)) {\n return await callOpenAiWithRetries(\n id,\n await prepareOpenAIPayload(id, aiPayload),\n aiConfig as OpenAIConfig,\n retries,\n chunkTimeoutMs,\n );\n }\n\n if (isGroqPayload(aiPayload)) {\n return await callGroqWithRetries(\n id,\n prepareGroqPayload(aiPayload),\n retries,\n );\n }\n\n if (isGoogleAIPayload(aiPayload)) {\n return await callGoogleAIWithRetries(\n id,\n await prepareGoogleAIPayload(id, aiPayload),\n retries,\n );\n }\n\n if (isOpenRouterPayload(aiPayload)) {\n return await callOpenRouterWithRetries(\n id,\n prepareOpenRouterPayload(aiPayload),\n retries,\n );\n }\n\n throw new Error(\"Invalid AI payload: Unknown model type.\");\n } catch (error) {\n if (aiPayload.fallbackModel) {\n logger.error(\n id,\n `Primary model ${aiPayload.model} failed, falling back to ${aiPayload.fallbackModel}`,\n {\n error: error instanceof Error ? error.message : error,\n cause:\n error instanceof Error && (error as any).cause instanceof Error\n ? (error as any).cause.message\n : undefined,\n },\n );\n return callWithRetries(\n id,\n {\n ...aiPayload,\n model: aiPayload.fallbackModel,\n fallbackModel: undefined,\n },\n aiConfig,\n retries,\n chunkTimeoutMs,\n );\n }\n throw error;\n }\n}\n","export 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,eAAY;AACZ,EAAAA,aAAA,gBAAa;AACb,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,YAAS;AACT,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,eAAY;AACZ,EAAAA,aAAA,gBAAa;AACb,EAAAA,aAAA,cAAW;AAXD,SAAAA;AAAA,GAAA;AAcL,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,6BAA0B;AAC1B,EAAAA,WAAA,eAAY;AACZ,EAAAA,WAAA,mCAAgC;AAJtB,SAAAA;AAAA,GAAA;AAOL,IAAK,kBAAL,kBAAKC,qBAAL;AACL,EAAAA,iBAAA,uBAAoB;AADV,SAAAA;AAAA,GAAA;AAIL,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;AACzB,EAAAA,aAAA,mCAAgC;AATtB,SAAAA;AAAA,GAAA;;;ACzCZ,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;;;ACnBA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,OAAO,WAAW;;;AC/BX,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;;;ADqBA,SAAS,mBAAmB;AAE5B,IAAM,QAAQ,UAAQ,OAAO;AAC7B,IAAM,SAAS,UAAQ,aAAa;AAsBpC,eAAe,YACb,YACA,SACA,IACA,UAII,CAAC,GACO;AAnEd;AAoEE,QAAM,EAAE,UAAU,GAAG,cAAc,KAAK,QAAQ,IAAI;AAEpD,iBAAO,IAAI,YAAY,WAAW,OAAO,mBAAmB;AAE5D,MAAI;AACJ,WAAS,UAAU,GAAG,UAAU,SAAS,WAAW;AAClD,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,SAASC,QAAY;AACnB,kBAAYA;AAEZ,UAAI,SAAS;AACX,gBAAQA,QAAO,OAAO;AAAA,MACxB,OAAO;AACL,uBAAO;AAAA,UACL;AAAA,UACA,UAAU,OAAO,WAAWA,OAAM,OAAO;AAAA,YACzC,KAAAA,OAAM,aAAN,mBAAgB,SAAQA;AAAA,QAC1B;AAAA,MACF;AAEA,YAAM,QAAQ,cAAc,OAAO;AAAA,IACrC;AAAA,EACF;AAEA,QAAMA,SAAQ,IAAI;AAAA,IAChB,kBAAkB,OAAO,cAAc,OAAO;AAAA,EAChD;AACA,EAAAA,OAAM,QAAQ;AACd,QAAMA;AACR;AAEA,SAAS,sBACP,YACA,WACA,sBACA,sBACuB;AACvB,QAAM,gBAAgC,CAAC;AAEvC,aAAW,OAAO,sBAAsB;AACtC,QAAI,CAAC,IAAI,QAAQ,CAAC,IAAI;AAAW;AAEjC,QAAI,wBAAwB,CAAC,qBAAqB,IAAI,IAAI,IAAI,GAAG;AAC/D,YAAM,IAAI;AAAA,QACR,2DAA2D,IAAI,IAAI;AAAA,MACrE;AAAA,IACF;AAEA,QAAI;AACF,oBAAc,KAAK;AAAA,QACjB,MAAM,IAAI;AAAA,QACV,WAAW,KAAK,MAAM,IAAI,SAAS;AAAA,MACrC,CAAC;AAAA,IACH,SAASA,QAAO;AACd,qBAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,IAAI;AAAA,MACN;AACA,YAAMA;AAAA,IACR;AAAA,EACF;AAEA,MAAI,CAAC,aAAa,CAAC,cAAc,QAAQ;AACvC,mBAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK,UAAU,EAAE,WAAW,qBAAqB,CAAC;AAAA,IACpD;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,aAAa;AAAA,IACtB,eAAe,cAAc,CAAC,KAAK;AAAA,IACnC,gBAAgB;AAAA,IAChB,OAAO,CAAC;AAAA,IACR,OAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,SAAgC;AACvD,SAAO,KAAK;AAAA,IACV;AAAA,MACE,GAAG;AAAA,MACH,UAAU,QAAQ,SAAS,IAAI,CAAC,YAAY;AAC1C,cAAM,mBAAmB,EAAE,GAAG,QAAQ;AACtC,YAAI,OAAO,iBAAiB,YAAY,UAAU;AAChD,2BAAiB,UAAU,iBAAiB,QAAQ,MAAM,GAAG,GAAG;AAAA,QAClE,WAAW,MAAM,QAAQ,iBAAiB,OAAO,GAAG;AAClD,2BAAiB,UAAU,iBAAiB,QAAQ,IAAI,CAAC,UAAU;AACjE,gBAAI,MAAM,SAAS,aAAa;AAC9B,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,WAAW,EAAE,KAAK,MAAM,UAAU,IAAI,MAAM,GAAG,GAAG,EAAE;AAAA,cACtD;AAAA,YACF;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;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;AAEpB,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;AAEA,IAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAWA,SAAS,yBACP,YACA,OACA,QACqB;AACrB,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,MACP,SAAS;AAAA,MACT,QAAQ,QAAQ,IAAI;AAAA,MACpB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,SAAS;AAC9B,mBAAO,IAAI,YAAY,+BAA+B,KAAK;AAE3D,QAAI,CAAC,OAAO,gBAAgB;AAC1B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,OAAO,eAAe,KAAiB;AAC3D,QAAI,EAAC,2CAAa,WAAU;AAC1B,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAEA,UAAM,WAAW,GAAG,YAAY,QAAQ,uBAAuB,YAAY,UAAU,iCAAiC,YAAY,UAAU;AAC5I,mBAAO,IAAI,YAAY,mBAAmB,QAAQ;AAElD,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,WAAW,YAAY;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAGA,iBAAO,IAAI,YAAY,yBAAyB,KAAK;AACrD,MAAI,OAAO,OAAO;AAChB,mBAAO,IAAI,YAAY,gBAAgB,OAAO,KAAK;AAAA,EACrD;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,OAAO,MAAM;AAAA,MACtC,GAAI,OAAO,QAAQ,EAAE,uBAAuB,OAAO,MAAM,IAAI,CAAC;AAAA,IAChE;AAAA,EACF;AACF;AAEA,eAAe,qBACb,YACA,SACwB;AA7R1B;AA8RE,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,EAAE,MAAM,YAAY,UAAU,QAAQ,cAAc,IACtD;AAAA,EACN;AAEA,aAAW,WAAW,QAAQ,UAAU;AACtC,UAAM,gBAAsC,CAAC;AAE7C,QAAI,QAAQ,SAAS;AACnB,oBAAc,KAAK,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAAA,IAC5D;AAEA,eAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACtC,UAAI,yBAAyB,SAAS,KAAK,QAAQ,GAAG;AACpD,YAAI,KAAK,KAAK;AACZ,wBAAc,KAAK;AAAA,YACjB,MAAM;AAAA,YACN,WAAW,EAAE,KAAK,KAAK,IAAI;AAAA,UAC7B,CAAC;AACD,wBAAc,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,KAAK,GAAG,IAAI,CAAC;AAAA,QAClE,WAAW,KAAK,MAAM;AACpB,wBAAc,KAAK;AAAA,YACjB,MAAM;AAAA,YACN,WAAW,EAAE,KAAK,QAAQ,KAAK,QAAQ,WAAW,KAAK,IAAI,GAAG;AAAA,UAChE,CAAC;AAAA,QACH;AAAA,MACF,WAAW,KAAK,KAAK;AAEnB,sBAAc,KAAK;AAAA,UACjB,MAAM;AAAA,UACN,MAAM,SAAS,KAAK,GAAG;AAAA,QACzB,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,eAAe,iBACb,IACA,eACA,cACA,gBACgC;AAxVlC;AAyVE,QAAM,gBAAoC,cAAc,QACpD,IAAI,IAAI,cAAc,MAAM,IAAI,CAAC,OAAO,GAAG,SAAS,IAAc,CAAC,IACnE;AAEJ,QAAM,EAAE,UAAU,QAAQ,IAAI;AAAA,IAC5B;AAAA,IACA,cAAc;AAAA,IACd;AAAA,EACF;AAEA,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,WAAW,MAAM,MAAM,UAAU;AAAA,IACrC,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,GAAG,eAAe,QAAQ,KAAK,CAAC;AAAA,IACvD,QAAQ,WAAW;AAAA,EACrB,CAAC;AAED,MAAI,CAAC,SAAS,MAAM;AAClB,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAEA,MAAI,YAAY;AAChB,QAAM,uBAA8D,CAAC;AAErE,QAAM,SAAS,SAAS,KAAK,UAAU;AACvC,MAAI,eAAe;AACnB,MAAI,aAAa;AAEjB,QAAM,qBAAqB,MACzB,WAAW,MAAM;AACf,mBAAO,MAAM,IAAI,wBAAwB,cAAc,IAAI;AAC3D,eAAW,MAAM;AAAA,EACnB,GAAG,cAAc;AAEnB,SAAO,MAAM;AACX;AACA,UAAM,eAAe,mBAAmB;AACxC,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,iBAAa,YAAY;AAEzB,QAAI,MAAM;AACR,qBAAO;AAAA,QACL;AAAA,QACA,kCAAkC,aAAa,CAAC;AAAA,MAClD;AACA,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAEA,QAAI,QAAQ,IAAI,YAAY,EAAE,OAAO,KAAK;AAC1C,QAAI,cAAc;AAChB,cAAQ,eAAe;AACvB,qBAAe;AAAA,IACjB;AAEA,UAAM,cAAc,MAAM,MAAM,WAAW;AAE3C,eAAW,cAAc,aAAa;AACpC,UAAI,CAAC;AAAY;AAEjB,UAAI,WAAW,SAAS,QAAQ,GAAG;AACjC,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACJ,UAAI;AACF,eAAO,KAAK,MAAM,WAAW,KAAK,CAAC;AAAA,MACrC,SAAQ;AACN,uBAAe;AACf;AAAA,MACF;AAEA,UAAI,GAAC,UAAK,YAAL,mBAAc,SAAQ;AACzB,YAAI,KAAK,OAAO;AACd,yBAAO,MAAM,IAAI,6BAA6B,KAAK,KAAK;AACxD,gBAAMA,SAAQ,IAAI,MAAM,4BAA4B;AACpD,UAAAA,OAAM,OAAO,KAAK;AAClB,UAAAA,OAAM,cAAc,gBAAgB,aAAa;AACjD,gBAAMA;AAAA,QACR;AACA,YAAI,eAAe,GAAG;AACpB,yBAAO,MAAM,IAAI,qCAAqC,IAAI;AAAA,QAC5D;AACA;AAAA,MACF;AAEA,YAAM,aAAY,gBAAK,QAAQ,CAAC,MAAd,mBAAiB,UAAjB,mBAAwB;AAC1C,UAAI,WAAW;AACb,mBAAW,YAAY,WAAW;AAChC,gBAAM,OAAM,cAAS,UAAT,YAAkB;AAC9B,iBAAO,qBAAqB,UAAU,KAAK;AACzC,iCAAqB,KAAK,EAAE,MAAM,IAAI,WAAW,GAAG,CAAC;AAAA,UACvD;AACA,eAAI,cAAS,aAAT,mBAAmB;AACrB,iCAAqB,GAAG,EAAE,QAAQ,SAAS,SAAS;AACtD,eAAI,cAAS,aAAT,mBAAmB;AACrB,iCAAqB,GAAG,EAAE,aAAa,SAAS,SAAS;AAAA,QAC7D;AAAA,MACF;AAEA,YAAM,QAAO,gBAAK,QAAQ,CAAC,MAAd,mBAAiB,UAAjB,mBAAwB;AACrC,UAAI;AAAM,qBAAa;AAAA,IACzB;AAAA,EACF;AACF;AAEA,eAAe,WACb,IACA,eACA,cACgC;AA5clC;AA6cE,QAAM,EAAE,UAAU,QAAQ,IAAI;AAAA,IAC5B;AAAA,IACA,cAAc;AAAA,IACd;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,MAAM,UAAU;AAAA,IACrC,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,GAAG,eAAe,QAAQ,MAAM,CAAC;AAAA,EAC1D,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK;AACtC,mBAAO,MAAM,IAAI,qBAAqB,SAAS;AAC/C,UAAM,IAAI,MAAM,qBAAqB,UAAU,MAAM,OAAO,EAAE;AAAA,EAChE;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,MAAI,GAAC,UAAK,YAAL,mBAAc,SAAQ;AACzB,QAAI,KAAK,OAAO;AACd,qBAAO,MAAM,IAAI,iBAAiB,KAAK,KAAK;AAC5C,YAAM,IAAI,MAAM,iBAAiB,KAAK,MAAM,OAAO,EAAE;AAAA,IACvD;AACA,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAEA,QAAM,SAAS,KAAK,QAAQ,CAAC;AAG7B,QAAM,aAAY,YAAO,YAAP,mBAAgB;AAClC,QAAM,gBAAgC,CAAC;AAEvC,MAAI,uCAAW,QAAQ;AACrB,eAAW,MAAM,WAAW;AAC1B,oBAAc,KAAK;AAAA,QACjB,MAAM,GAAG,SAAS;AAAA,QAClB,WAAW,KAAK,MAAM,GAAG,SAAS,SAAS;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF,WAAW,OAAO,eAAe;AAC/B,kBAAc,KAAK;AAAA,MACjB,MAAM,OAAO,cAAc;AAAA,MAC3B,WAAW,KAAK,MAAM,OAAO,cAAc,SAAS;AAAA,IACtD,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,OAAO,QAAQ,WAAW;AAAA,IACnC,eAAe,cAAc,CAAC,KAAK;AAAA,IACnC,gBAAgB;AAAA,IAChB,OAAO,CAAC;AAAA,IACR,OAAO,KAAK,QACR;AAAA,MACE,eAAe,KAAK,MAAM;AAAA,MAC1B,mBAAmB,KAAK,MAAM;AAAA,MAC9B,cAAc,KAAK,MAAM;AAAA,IAC3B,IACA;AAAA,EACN;AACF;AAEA,eAAe,sBACb,IACA,eACA,cACA,UAAkB,GAClB,iBAAyB,MACO;AAChC,iBAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,6CAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAEA,QAAM,eACJ,cAAc,qCACd,cAAc;AAEhB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY;AACV,UAAI,cAAc;AAChB,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AACL,eAAO,WAAW,IAAI,eAAe,YAAY;AAAA,MACnD;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA,aAAa;AAAA,MACb,SAAS,CAACA,QAAO,YAAY;AAjjBnC;AAkjBQ,uBAAO;AAAA,UACL;AAAA,UACA,UAAU,OAAO,WAAWA,OAAM,OAAO;AAAA,YACzC,KAAAA,OAAM,aAAN,mBAAgB,SAAQA,OAAM,QAAQA;AAAA,QACxC;AAGA,cAAI,KAAAA,OAAM,SAAN,mBAAY,UAAS,4BAA4B;AACnD,yBAAO,IAAI,IAAI,iDAAiD;AAChE,wBAAc,SAAS,QAAQ,CAAC,YAA2B;AACzD,gBAAI,MAAM,QAAQ,QAAQ,OAAO,GAAG;AAClC,sBAAQ,UAAU,QAAQ,QAAQ;AAAA,gBAChC,CAAC,YAAY,QAAQ,SAAS;AAAA,cAChC;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,qBACP,UACsB;AA9kBxB;AA+kBE,MAAI,iBAAiB,SAAS,MAAM;AAGpC,QAAI,oBAAe,CAAC,MAAhB,mBAAmB,UAAS,QAAQ;AACtC,qBAAiB;AAAA,MACf,EAAE,MAAM,QAAiB,SAAS,MAAM;AAAA,MACxC,GAAG;AAAA,IACL;AAAA,EACF;AAGA,mBAAiB,eAAe,OAAO,CAAC,KAAK,YAAY;AACvD,QAAI,IAAI,WAAW;AAAG,aAAO,CAAC,OAAO;AAErC,UAAM,cAAc,IAAI,IAAI,SAAS,CAAC;AACtC,QAAI,YAAY,SAAS,QAAQ,MAAM;AACrC,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,EAAE,MAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,EACtD;AAEA,SAAO;AACT;AAEA,eAAe,wBACb,aACA,SAC6B;AAC7B,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,QAAI,QAAQ,SAAS,UAAU;AAC7B,sBAAgB,SAAS,QAAQ;AACjC;AAAA,IACF;AAEA,UAAM,gBAAyC,CAAC;AAEhD,QAAI,QAAQ,SAAS;AACnB,oBAAc,KAAK,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAAA,IAC5D;AAEA,eAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACtC,UAAI,yBAAyB,SAAS,KAAK,QAAQ,GAAG;AACpD,YAAI,KAAK,KAAK;AACZ,cAAI,QAAQ,QAAQ,QAAQ;AAE1B,0BAAc,KAAK;AAAA,cACjB,MAAM;AAAA,cACN,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,YAAY;AAAA,gBACZ,MAAM,MAAM,uBAAuB,KAAK,KAAK,KAAK,QAAQ;AAAA,cAC5D;AAAA,YACF,CAAC;AAAA,UACH;AACA,wBAAc,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,KAAK,GAAG,IAAI,CAAC;AAAA,QAClE,WAAW,KAAK,MAAM;AACpB,cAAI,QAAQ,QAAQ,QAAQ;AAE1B,0BAAc,KAAK;AAAA,cACjB,MAAM;AAAA,cACN,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,YAAY,KAAK;AAAA,gBACjB,MAAM,KAAK;AAAA,cACb;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,WAAW,KAAK,KAAK;AAEnB,sBAAc,KAAK;AAAA,UACjB,MAAM;AAAA,UACN,MAAM,SAAS,KAAK,GAAG;AAAA,QACzB,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,eAAe,cACb,IACA,SACA,QACgC;AAvsBlC;AAwsBE,QAAM,oBAAoB,qBAAqB,QAAQ,QAAQ;AAC/D,QAAM,SAAQ,aAAQ,cAAR,mBAAmB,IAAI,CAAC,OAAO;AAAA,IAC3C,GAAG;AAAA,IACH,cAAc,EAAE;AAAA,IAChB,YAAY;AAAA,EACd;AAEA,MAAI;AAEJ,OAAI,iCAAQ,aAAY,WAAW;AACjC,UAAM,aAAa;AACnB,UAAM,WAAW;AAEjB,UAAM,SAAS,IAAI,qBAAqB,EAAE,QAAQ,WAAW,CAAC;AAC9D,UAAM,iBAAiB;AAAA,MACrB,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,UAAU;AAAA,MACV;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,OAAO;AAAA,MAC5B,IAAI,mBAAmB;AAAA,QACrB,aAAa;AAAA,QACb,MAAM,KAAK,UAAU,cAAc;AAAA,QACnC,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,sBAAsB,IAAI,YAAY,EAAE,OAAO,SAAS,IAAI;AAClE,WAAO,KAAK,MAAM,mBAAmB;AAAA,EACvC,OAAO;AAEL,UAAM,WAAW,MAAM,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,OAAO,QAAQ;AAAA,QACf,UAAU;AAAA,QACV;AAAA,QACA,aAAa,QAAQ;AAAA,QACrB,QAAQ,QAAQ;AAAA,QAChB,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;AACA,WAAO,SAAS;AAAA,EAClB;AAEA,QAAM,UAAU,KAAK;AACrB,MAAI,EAAC,mCAAU,KAAI;AACjB,mBAAO,MAAM,IAAI,6CAA6C,IAAI;AAClE,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,MAAI,eAAe;AACnB,QAAM,gBAAgC,CAAC;AAEvC,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,MAAM;AAChB,qBAAO,MAAM,IAAI,kDAAkD,IAAI;AACvE,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAEA,QAAI,OAAO,SAAS,QAAQ;AAC1B,UAAI,OAAO,OAAO,KACf,QAAQ,+BAA+B,EAAE,EACzC,QAAQ,yBAAyB,EAAE,EACnC,KAAK;AAER,UAAI,CAAC,MAAM;AACT,eAAO,OAAO,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,QACF;AACA,uBAAO,IAAI,IAAI,kDAAkD,IAAI;AAAA,MACvE;AAEA,qBAAe,eAAe,GAAG,YAAY;AAAA;AAAA,EAAO,IAAI,KAAK;AAAA,IAC/D,WAAW,OAAO,SAAS,YAAY;AACrC,oBAAc,KAAK;AAAA,QACjB,MAAM,OAAO;AAAA,QACb,WAAW,OAAO;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,CAAC,gBAAgB,CAAC,cAAc,QAAQ;AAC1C,mBAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,eAAe,cAAc,CAAC,KAAK;AAAA,IACnC,gBAAgB;AAAA,IAChB,OAAO,CAAC;AAAA,IACR,OAAO,KAAK,QACR;AAAA,MACE,eAAe,KAAK,MAAM;AAAA,MAC1B,mBAAmB,KAAK,MAAM;AAAA,MAC9B,cAAc,KAAK,MAAM,eAAe,KAAK,MAAM;AAAA,IACrD,IACA;AAAA,EACN;AACF;AAEA,eAAe,yBACb,IACA,SACA,QACA,UAAkB,GACc;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,cAAc,IAAI,SAAS,MAAM;AAAA,IACvC;AAAA,MACE;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,kBAAkB,UAAgD;AAn1B3E;AAo1BE,MAAI,iBAAiB,SAAS,MAAM;AAGpC,QAAI,oBAAe,CAAC,MAAhB,mBAAmB,UAAS,SAAS;AACvC,qBAAiB;AAAA,MACf,EAAE,MAAM,QAAiB,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC,EAAE;AAAA,MAClD,GAAG;AAAA,IACL;AAAA,EACF;AAGA,mBAAiB,eAAe,OAAO,CAAC,KAAK,YAAY;AACvD,QAAI,IAAI,WAAW;AAAG,aAAO,CAAC,OAAO;AAErC,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,EAAE,MAAM,QAAQ,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,EAChE;AAEA,SAAO;AACT;AAEA,eAAe,uBACb,aACA,SAC0B;AAC1B,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,UACV,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,QAAwB,CAAC;AAE/B,QAAI,QAAQ,SAAS;AACnB,YAAM,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,IACtC;AAEA,eAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACtC,UAAI,yBAAyB,SAAS,KAAK,QAAQ,GAAG;AACpD,YAAI,KAAK,KAAK;AACZ,gBAAM,KAAK;AAAA,YACT,UAAU;AAAA,cACR,UAAU,KAAK;AAAA,cACf,SAAS,KAAK;AAAA,YAChB;AAAA,UACF,CAAC;AACD,gBAAM,KAAK,EAAE,MAAM,UAAU,KAAK,GAAG,IAAI,CAAC;AAAA,QAC5C,WAAW,KAAK,MAAM;AACpB,gBAAM,KAAK;AAAA,YACT,YAAY;AAAA,cACV,UAAU,KAAK;AAAA,cACf,MAAM,KAAK;AAAA,YACb;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,WAAW,KAAK,KAAK;AAEnB,cAAM,KAAK;AAAA,UACT,MAAM,SAAS,KAAK,GAAG;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,oBAAgB,SAAS,KAAK;AAAA,MAC5B,MAAM,QAAQ,SAAS,cAAc,UAAU,QAAQ;AAAA,MACvD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAe,aACb,IACA,SACgC;AAz7BlC;AA07BE,QAAM,iBAAiB,kBAAkB,QAAQ,QAAQ;AACzD,QAAM,UAAU,eAAe,MAAM,GAAG,EAAE;AAC1C,QAAM,cAAc,eAAe,MAAM,EAAE,EAAE,CAAC;AAE9C,QAAM,QAAQ,IAAI,YAAY,EAAE,QAAQ,QAAQ,IAAI,eAAe,CAAC;AAEpE,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,EAAE,SAAS,YAAY,MAAM,CAAC;AAEtE,MAAI,OAAO;AACX,QAAM,QAAgB,CAAC;AAEvB,aAAW,UAAQ,0BAAS,eAAT,mBAAsB,OAAtB,mBAA0B,YAA1B,mBAAmC,UAAS,CAAC,GAAG;AACjE,QAAI,KAAK;AAAM,cAAQ,KAAK;AAC5B,SAAI,UAAK,eAAL,mBAAiB,MAAM;AACzB,YAAM,KAAK,EAAE,UAAU,aAAa,MAAM,KAAK,WAAW,KAAK,CAAC;AAAA,IAClE;AAAA,EACF;AAEA,QAAM,iBAAgB,cAAS,kBAAT,mBAAwB,IAAI,CAAC,OAAI;AAt9BzD,QAAAC,KAAAC;AAs9B6D;AAAA,MACzD,OAAMD,MAAA,GAAG,SAAH,OAAAA,MAAW;AAAA,MACjB,YAAWC,MAAA,GAAG,SAAH,OAAAA,MAAW,CAAC;AAAA,IACzB;AAAA;AAEA,MAAI,CAAC,QAAQ,EAAC,+CAAe,WAAU,CAAC,MAAM,QAAQ;AACpD,UAAM,aAAY,cAAS,eAAT,mBAAsB;AACxC,UAAM,eAAe,uCAAW;AAEhC,mBAAO,MAAM,IAAI,uDAAuD;AAAA,MACtE;AAAA,MACA,eAAe,uCAAW;AAAA,MAC1B,eAAe,SAAS;AAAA,MACxB,cAAc,SAAS;AAAA,MACvB,kBAAkB,uCAAW;AAAA,MAC7B,gBAAgB,SAAS;AAAA,IAC3B,CAAC;AAED,QAAI,eAAe;AACnB,QAAI,cAAc;AAChB,YAAM,qBAA6C;AAAA,QACjD,yBACE;AAAA,QACF,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AACA,sBAAgB,kBAAkB,YAAY,IAAI,mBAAmB,YAAY,KAAK,EAAE;AAAA,IAC1F;AAEA,UAAMF,SAAQ,IAAI,MAAM,YAAY;AACpC,IAAAA,OAAM,eAAe;AACrB,IAAAA,OAAM,gBAAgB,uCAAW;AACjC,IAAAA,OAAM,gBAAgB,SAAS;AAC/B,IAAAA,OAAM,iBAAiB,SAAS;AAChC,UAAMA;AAAA,EACR;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA,gBAAe,+CAAgB,OAAM;AAAA,IACrC,gBAAgB,iBAAiB,CAAC;AAAA,IAClC,OAAO,SAAS,gBACZ;AAAA,MACE,gBAAe,cAAS,cAAc,qBAAvB,YAA2C;AAAA,MAC1D,oBAAmB,cAAS,cAAc,yBAAvB,YAA+C;AAAA,MAClE,eAAc,cAAS,cAAc,oBAAvB,YAA0C;AAAA,IAC1D,IACA;AAAA,EACN;AACF;AAMA,IAAM,4BAA4B,oBAAI,IAAI,CAAC,sBAAsB,QAAQ,CAAC;AAM1E,SAAS,8BAA8B,SAAmC;AACxE,MAAI,gBAAgB;AAEpB,aAAW,WAAW,QAAQ,UAAU;AACtC,YAAQ,QAAQ,QAAQ,MAAM,OAAO,CAAC,SAAS;AAC7C,UAAI,gBAAgB,QAAQ,cAAc,MAAM;AAC9C,wBAAgB;AAChB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAGD,QAAI,QAAQ,MAAM,WAAW,GAAG;AAC9B,cAAQ,QAAQ,CAAC,EAAE,MAAM,wCAAwC,CAAC;AAAA,IACpE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,wBACb,IACA,SACA,UAAkB,GACc;AAChC,MAAI,wBAAwB;AAE5B,SAAO,YAAY,IAAI,aAAa,MAAM,aAAa,IAAI,OAAO,GAAG;AAAA,IACnE;AAAA,IACA,SAAS,CAACA,QAAO,YAAY;AApjCjC;AAqjCM,YAAM,eAAoC;AAAA,QACxC,SAASA,OAAM;AAAA,QACf,cAAcA,OAAM;AAAA,QACpB,cAAcA,OAAM;AAAA,MACtB;AAEA,UAAIA,OAAM;AAAe,qBAAa,gBAAgBA,OAAM;AAC5D,UAAIA,OAAM;AAAe,qBAAa,gBAAgBA,OAAM;AAC5D,UAAIA,OAAM;AACR,qBAAa,iBAAiBA,OAAM;AACtC,UAAIA,OAAM;AAAQ,qBAAa,aAAaA,OAAM;AAClD,UAAIA,OAAM;AAAM,qBAAa,YAAYA,OAAM;AAC/C,UAAIA,OAAM;AAAS,qBAAa,eAAeA,OAAM;AAErD,YAAM,WAAW,QAAQ,SACtB,QAAQ,CAAC,MAAM,EAAE,KAAK,EACtB,OAAO,CAAC,MAAM,cAAc,CAAC,EAC7B,IAAI,CAAC,MAAO,EAAU,SAAS,OAAO;AACzC,UAAI,SAAS;AAAQ,qBAAa,WAAW;AAE7C,qBAAO;AAAA,QACL;AAAA,QACA,UAAU,OAAO,WAAWA,OAAM,OAAO;AAAA,QACzC;AAAA,MACF;AAIA,YAAM,kBACH,0BAA0B,IAAIA,OAAM,YAAY,KAC/CA,OAAM,gBACP,0BAA0B,KAAI,KAAAA,OAAM,mBAAN,mBAAsB,WAAW,OAC9D,KAAAA,OAAM,mBAAN,mBAAsB;AAE1B,UAAI,iBAAiB;AACnB,YAAI,CAAC,uBAAuB;AAC1B,gBAAM,gBAAgB,8BAA8B,OAAO;AAC3D,cAAI,eAAe;AACjB,2BAAO;AAAA,cACL;AAAA,cACA,qDAAqD,eAAe;AAAA,YACtE;AACA,oCAAwB;AACxB;AAAA,UACF;AAAA,QACF;AAGA,uBAAO;AAAA,UACL;AAAA,UACA,wCAAwC,eAAe;AAAA,QACzD;AACA,cAAM,sBAAsB,IAAI;AAAA,UAC9B,gCAAgC,eAAe;AAAA,QACjD;AACA,4BAAoB,eAAeA,OAAM;AACzC,4BAAoB,gBAAgBA,OAAM;AAC1C,4BAAoB,gBAAgBA,OAAM;AAC1C,4BAAoB,iBAAiB;AACrC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAMA,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,mBAAmB,SAAsC;AApoClE;AAqoCE,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,EAAE,MAAM,YAAY,UAAU,QAAQ,cAAc,IACtD;AAAA,IACJ,aAAa,QAAQ;AAAA,EACvB;AACF;AAEA,eAAe,SACb,IACA,SACgC;AA3pClC;AA4pCE,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,UAAS,cAAS,KAAK,QAAQ,CAAC,MAAvB,mBAA0B;AACzC,MAAI,CAAC,QAAQ;AACX,mBAAO,MAAM,IAAI,wCAAwC,SAAS,IAAI;AACtE,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,QAAM,gBAAgC,CAAC;AACvC,OAAI,YAAO,eAAP,mBAAmB,QAAQ;AAC7B,eAAW,MAAM,OAAO,YAAY;AAClC,oBAAc,KAAK;AAAA,QACjB,MAAM,GAAG,SAAS;AAAA,QAClB,WAAW,KAAK,MAAM,GAAG,SAAS,SAAS;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,OAAO,WAAW;AAAA,IAC3B,eAAe,cAAc,CAAC,KAAK;AAAA,IACnC,gBAAgB;AAAA,IAChB,OAAO,CAAC;AAAA,IACR,OAAO,SAAS,KAAK,QACjB;AAAA,MACE,eAAe,SAAS,KAAK,MAAM;AAAA,MACnC,mBAAmB,SAAS,KAAK,MAAM;AAAA,MACvC,cAAc,SAAS,KAAK,MAAM;AAAA,IACpC,IACA;AAAA,EACN;AACF;AAEA,eAAe,oBACb,IACA,SACA,UAAkB,GACc;AAChC,SAAO,YAAY,IAAI,QAAQ,MAAM,SAAS,IAAI,OAAO,GAAG,EAAE,QAAQ,CAAC;AACzE;AAMA,SAAS,yBAAyB,SAA4C;AAntC9E;AAotCE,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,EAAE,MAAM,YAAY,UAAU,QAAQ,cAAc,IACtD;AAAA,IACJ,aAAa,QAAQ;AAAA,EACvB;AACF;AAEA,eAAe,eACb,IACA,SACgC;AA1uClC;AA2uCE,QAAM,WAAW,MAAM,MAAM;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,QAAQ,IAAI,kBAAkB;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAS,cAAS,KAAK,QAAQ,CAAC,MAAvB,mBAA0B;AACzC,MAAI,CAAC,QAAQ;AACX,mBAAO,MAAM,IAAI,8CAA8C,SAAS,IAAI;AAC5E,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAEA,QAAM,gBAAgC,CAAC;AACvC,OAAI,YAAO,eAAP,mBAAmB,QAAQ;AAC7B,eAAW,MAAM,OAAO,YAAY;AAClC,oBAAc,KAAK;AAAA,QACjB,MAAM,GAAG,SAAS;AAAA,QAClB,WAAW,KAAK,MAAM,GAAG,SAAS,SAAS;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,OAAO,WAAW;AAAA,IAC3B,eAAe,cAAc,CAAC,KAAK;AAAA,IACnC,gBAAgB;AAAA,IAChB,OAAO,CAAC;AAAA,IACR,OAAO,SAAS,KAAK,QACjB;AAAA,MACE,eAAe,SAAS,KAAK,MAAM;AAAA,MACnC,mBAAmB,SAAS,KAAK,MAAM;AAAA,MACvC,cAAc,SAAS,KAAK,MAAM;AAAA,IACpC,IACA;AAAA,EACN;AACF;AAEA,eAAe,0BACb,IACA,SACA,UAAkB,GACc;AAChC,SAAO,YAAY,IAAI,cAAc,MAAM,eAAe,IAAI,OAAO,GAAG,EAAE,QAAQ,CAAC;AACrF;AAMA,SAAS,mBAAmB,SAAkC;AAC5D,SAAO,OAAO,OAAO,WAAW,EAAE,SAAS,QAAQ,KAAoB;AACzE;AAEA,SAAS,gBAAgB,SAAkC;AACzD,SAAO,OAAO,OAAO,QAAQ,EAAE,SAAS,QAAQ,KAAiB;AACnE;AAEA,SAAS,cAAc,SAAkC;AACvD,SAAO,OAAO,OAAO,SAAS,EAAE,SAAS,QAAQ,KAAkB;AACrE;AAEA,SAAS,kBAAkB,SAAkC;AAC3D,SAAO,OAAO,OAAO,WAAW,EAAE,SAAS,QAAQ,KAAoB;AACzE;AAEA,SAAS,oBAAoB,SAAkC;AAC7D,SAAO,OAAO,OAAO,eAAe,EAAE,SAAS,QAAQ,KAAwB;AACjF;AAEA,eAAsB,gBACpB,IACA,WACA,UACA,UAAkB,GAClB,iBAAyB,MACO;AAChC,MAAI;AACF,QAAI,mBAAmB,SAAS,GAAG;AACjC,aAAO,MAAM;AAAA,QACX;AAAA,QACA,MAAM,wBAAwB,IAAI,SAAS;AAAA,QAC3C;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,gBAAgB,SAAS,GAAG;AAC9B,aAAO,MAAM;AAAA,QACX;AAAA,QACA,MAAM,qBAAqB,IAAI,SAAS;AAAA,QACxC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,cAAc,SAAS,GAAG;AAC5B,aAAO,MAAM;AAAA,QACX;AAAA,QACA,mBAAmB,SAAS;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,kBAAkB,SAAS,GAAG;AAChC,aAAO,MAAM;AAAA,QACX;AAAA,QACA,MAAM,uBAAuB,IAAI,SAAS;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,QAAI,oBAAoB,SAAS,GAAG;AAClC,aAAO,MAAM;AAAA,QACX;AAAA,QACA,yBAAyB,SAAS;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D,SAASA,QAAO;AACd,QAAI,UAAU,eAAe;AAC3B,qBAAO;AAAA,QACL;AAAA,QACA,iBAAiB,UAAU,KAAK,4BAA4B,UAAU,aAAa;AAAA,QACnF;AAAA,UACE,OAAOA,kBAAiB,QAAQA,OAAM,UAAUA;AAAA,UAChD,OACEA,kBAAiB,SAAUA,OAAc,iBAAiB,QACrDA,OAAc,MAAM,UACrB;AAAA,QACR;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,OAAO,UAAU;AAAA,UACjB,eAAe;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAMA;AAAA,EACR;AACF;","names":["ClaudeModel","GPTModel","GroqModel","OpenRouterModel","GeminiModel","error","_a","_b"]}
|