alvin-bot 5.7.0 → 5.8.1
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/CHANGELOG.md +25 -0
- package/README.md +25 -31
- package/dist/claude.js +1 -102
- package/dist/config.js +1 -96
- package/dist/engine.js +1 -90
- package/dist/find-claude-binary.js +1 -98
- package/dist/handlers/async-agent-chunk-handler.js +1 -50
- package/dist/handlers/background-bypass.js +1 -75
- package/dist/handlers/commands.js +1 -2336
- package/dist/handlers/cron-progress.js +1 -52
- package/dist/handlers/document.js +1 -194
- package/dist/handlers/message.js +1 -959
- package/dist/handlers/photo.js +1 -154
- package/dist/handlers/platform-message.js +1 -360
- package/dist/handlers/stuck-timer.js +1 -54
- package/dist/handlers/video.js +1 -237
- package/dist/handlers/voice.js +1 -148
- package/dist/i18n.js +1 -805
- package/dist/index.js +1 -697
- package/dist/init-data-dir.js +1 -98
- package/dist/middleware/auth.js +1 -233
- package/dist/migrate.js +1 -162
- package/dist/paths.js +1 -146
- package/dist/platforms/discord.js +1 -175
- package/dist/platforms/index.js +1 -130
- package/dist/platforms/signal.js +1 -205
- package/dist/platforms/slack-slash-parser.js +1 -32
- package/dist/platforms/slack.js +1 -501
- package/dist/platforms/telegram.js +1 -111
- package/dist/platforms/types.js +1 -8
- package/dist/platforms/whatsapp-auth-helpers.js +1 -53
- package/dist/platforms/whatsapp.js +1 -707
- package/dist/providers/claude-sdk-provider.js +1 -565
- package/dist/providers/codex-cli-provider.js +1 -134
- package/dist/providers/index.js +1 -7
- package/dist/providers/ollama-provider.js +1 -32
- package/dist/providers/openai-compatible.js +1 -406
- package/dist/providers/registry.js +1 -352
- package/dist/providers/runtime-header.js +1 -45
- package/dist/providers/tool-executor.js +1 -475
- package/dist/providers/types.js +1 -227
- package/dist/services/access.js +1 -144
- package/dist/services/allowed-users-gate.js +1 -56
- package/dist/services/alvin-dispatch.js +1 -174
- package/dist/services/alvin-mcp-tools.js +1 -104
- package/dist/services/asset-index.js +1 -224
- package/dist/services/async-agent-parser.js +1 -418
- package/dist/services/async-agent-watcher.js +1 -583
- package/dist/services/auto-diagnostic.js +1 -228
- package/dist/services/broadcast.js +1 -52
- package/dist/services/browser-manager.js +1 -562
- package/dist/services/browser-webfetch.js +1 -127
- package/dist/services/browser.js +1 -121
- package/dist/services/cdp-bootstrap.js +1 -357
- package/dist/services/compaction.js +1 -144
- package/dist/services/critical-notify.js +1 -203
- package/dist/services/cron-resolver.js +1 -58
- package/dist/services/cron-scheduling.js +1 -310
- package/dist/services/cron.js +1 -861
- package/dist/services/custom-tools.js +1 -317
- package/dist/services/delivery-queue.js +1 -173
- package/dist/services/delivery-registry.js +1 -21
- package/dist/services/disk-cleanup.js +1 -203
- package/dist/services/elevenlabs.js +1 -58
- package/dist/services/embeddings/auto-detect.js +1 -74
- package/dist/services/embeddings/fts5.js +1 -108
- package/dist/services/embeddings/gemini.js +1 -65
- package/dist/services/embeddings/index.js +1 -496
- package/dist/services/embeddings/ollama.js +1 -78
- package/dist/services/embeddings/openai.js +1 -49
- package/dist/services/embeddings/provider.js +1 -22
- package/dist/services/embeddings/vector-base.js +1 -113
- package/dist/services/embeddings-migration.js +1 -193
- package/dist/services/embeddings.js +1 -9
- package/dist/services/env-file.js +1 -50
- package/dist/services/exec-guard.js +1 -71
- package/dist/services/fallback-order.js +1 -154
- package/dist/services/file-permissions.js +1 -93
- package/dist/services/heartbeat-file.js +1 -65
- package/dist/services/heartbeat.js +1 -313
- package/dist/services/hooks.js +1 -44
- package/dist/services/imagegen.js +1 -72
- package/dist/services/language-detect.js +1 -154
- package/dist/services/markdown.js +1 -63
- package/dist/services/mcp.js +1 -263
- package/dist/services/memory-extractor.js +1 -178
- package/dist/services/memory-inject-mode.js +1 -43
- package/dist/services/memory-layers.js +1 -156
- package/dist/services/memory.js +1 -146
- package/dist/services/ollama-manager.js +1 -339
- package/dist/services/permissions-wizard.js +1 -291
- package/dist/services/personality.js +1 -376
- package/dist/services/plugins.js +1 -171
- package/dist/services/preflight.js +1 -292
- package/dist/services/process-manager.js +1 -291
- package/dist/services/release-highlights.js +1 -79
- package/dist/services/reminders.js +1 -97
- package/dist/services/restart.js +1 -48
- package/dist/services/security-audit.js +1 -74
- package/dist/services/self-diagnosis.js +1 -272
- package/dist/services/self-search.js +1 -129
- package/dist/services/session-persistence.js +1 -237
- package/dist/services/session.js +1 -282
- package/dist/services/skills.js +1 -290
- package/dist/services/ssrf-guard.js +1 -162
- package/dist/services/standing-orders.js +1 -29
- package/dist/services/steer-channel.js +1 -46
- package/dist/services/stop-controller.js +1 -52
- package/dist/services/subagent-dedup.js +1 -86
- package/dist/services/subagent-delivery.js +1 -452
- package/dist/services/subagent-stats.js +1 -123
- package/dist/services/subagents.js +1 -814
- package/dist/services/sudo.js +1 -329
- package/dist/services/telegram.js +1 -158
- package/dist/services/timing-safe-bearer.js +1 -51
- package/dist/services/tool-discovery.js +1 -214
- package/dist/services/trends.js +1 -580
- package/dist/services/updater.js +1 -291
- package/dist/services/usage-tracker.js +1 -144
- package/dist/services/users.js +1 -271
- package/dist/services/voice.js +1 -104
- package/dist/services/watchdog-brake.js +1 -154
- package/dist/services/watchdog.js +1 -311
- package/dist/services/workspaces.js +1 -276
- package/dist/tui/index.js +1 -667
- package/dist/util/console-formatter.js +1 -109
- package/dist/util/debounce.js +1 -24
- package/dist/util/telegram-error-filter.js +1 -62
- package/dist/version.js +1 -24
- package/dist/web/bind-strategy.js +1 -42
- package/dist/web/canvas.js +1 -30
- package/dist/web/doctor-api.js +1 -604
- package/dist/web/openai-compat.js +1 -252
- package/dist/web/server.js +1 -1902
- package/dist/web/setup-api.js +1 -1101
- package/package.json +5 -2
- package/dist/.metadata_never_index +0 -0
|
@@ -1,406 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenAI-Compatible Provider
|
|
3
|
-
*
|
|
4
|
-
* Works with: OpenAI, Groq, Gemini, NVIDIA NIM, Ollama, OpenRouter, LM Studio,
|
|
5
|
-
* and any other endpoint that implements the OpenAI Chat Completions API.
|
|
6
|
-
*
|
|
7
|
-
* Supports function calling (tool use) for providers that support it,
|
|
8
|
-
* giving non-Claude models full agent capabilities (shell, files, web).
|
|
9
|
-
*/
|
|
10
|
-
import { AGENT_TOOLS, executeTool } from "./tool-executor.js";
|
|
11
|
-
import { updateRateLimits } from "../services/usage-tracker.js";
|
|
12
|
-
import * as runtimeHeader from "./runtime-header.js";
|
|
13
|
-
// Max tool call rounds to prevent infinite loops
|
|
14
|
-
const MAX_TOOL_ROUNDS = 10;
|
|
15
|
-
// Providers known to support function calling
|
|
16
|
-
const TOOL_CAPABLE_PROVIDERS = [
|
|
17
|
-
"api.openai.com",
|
|
18
|
-
"api.groq.com",
|
|
19
|
-
"generativelanguage.googleapis.com",
|
|
20
|
-
"openrouter.ai",
|
|
21
|
-
"integrate.api.nvidia.com",
|
|
22
|
-
"api.mistral.ai",
|
|
23
|
-
"api.together.xyz",
|
|
24
|
-
"api.fireworks.ai",
|
|
25
|
-
];
|
|
26
|
-
export class OpenAICompatibleProvider {
|
|
27
|
-
config;
|
|
28
|
-
constructor(config) {
|
|
29
|
-
this.config = {
|
|
30
|
-
maxTokens: 4096,
|
|
31
|
-
temperature: 0.7,
|
|
32
|
-
supportsStreaming: true,
|
|
33
|
-
supportsVision: false,
|
|
34
|
-
supportsTools: false,
|
|
35
|
-
...config,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
/** Check if this provider's endpoint likely supports function calling */
|
|
39
|
-
supportsToolUse() {
|
|
40
|
-
if (this.config.supportsTools)
|
|
41
|
-
return true;
|
|
42
|
-
const url = this.config.baseUrl || "";
|
|
43
|
-
return TOOL_CAPABLE_PROVIDERS.some(p => url.includes(p));
|
|
44
|
-
}
|
|
45
|
-
async *query(options) {
|
|
46
|
-
const useTools = this.supportsToolUse();
|
|
47
|
-
if (useTools) {
|
|
48
|
-
// Tool-use loop: send messages, get response, execute tools, repeat
|
|
49
|
-
yield* this.queryWithTools(options);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
// Simple text-only query
|
|
53
|
-
yield* this.querySimple(options);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
// ── Tool-Use Query Loop ─────────────────────────────────────────────────
|
|
57
|
-
async *queryWithTools(options) {
|
|
58
|
-
const messages = this.buildMessages(options);
|
|
59
|
-
let accumulatedText = "";
|
|
60
|
-
let totalCost = 0;
|
|
61
|
-
let totalInputTokens = 0;
|
|
62
|
-
let totalOutputTokens = 0;
|
|
63
|
-
for (let round = 0; round < MAX_TOOL_ROUNDS; round++) {
|
|
64
|
-
// Non-streaming request for tool use (streaming + tools is complex)
|
|
65
|
-
const body = {
|
|
66
|
-
model: this.config.model,
|
|
67
|
-
messages,
|
|
68
|
-
max_tokens: this.config.maxTokens,
|
|
69
|
-
temperature: this.config.temperature,
|
|
70
|
-
tools: AGENT_TOOLS,
|
|
71
|
-
tool_choice: "auto",
|
|
72
|
-
};
|
|
73
|
-
const headers = this.buildHeaders();
|
|
74
|
-
const url = `${this.config.baseUrl}/chat/completions`;
|
|
75
|
-
let response;
|
|
76
|
-
try {
|
|
77
|
-
response = await fetch(url, {
|
|
78
|
-
method: "POST",
|
|
79
|
-
headers,
|
|
80
|
-
body: JSON.stringify(body),
|
|
81
|
-
signal: options.abortSignal,
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
catch (err) {
|
|
85
|
-
// If tool call fails, retry without tools
|
|
86
|
-
if (round === 0) {
|
|
87
|
-
yield* this.querySimple(options);
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
yield { type: "error", error: `Network error: ${err instanceof Error ? err.message : err}` };
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
if (!response.ok) {
|
|
94
|
-
const errorBody = await response.text().catch(() => "");
|
|
95
|
-
// If 400/422 (tools not supported), fall back to simple
|
|
96
|
-
if ((response.status === 400 || response.status === 422) && round === 0) {
|
|
97
|
-
yield* this.querySimple(options);
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
yield { type: "error", error: `${this.config.name} error (${response.status}): ${errorBody}` };
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
// Extract rate limits from response headers
|
|
104
|
-
const rlInfo = this.extractRateLimits(response);
|
|
105
|
-
const data = await response.json();
|
|
106
|
-
const choice = data.choices?.[0];
|
|
107
|
-
if (!choice) {
|
|
108
|
-
yield { type: "error", error: "No response from provider" };
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
const msg = choice.message;
|
|
112
|
-
totalCost += this.estimateCostFromUsage(data.usage);
|
|
113
|
-
if (data.usage) {
|
|
114
|
-
totalInputTokens += data.usage.prompt_tokens || 0;
|
|
115
|
-
totalOutputTokens += data.usage.completion_tokens || 0;
|
|
116
|
-
}
|
|
117
|
-
// Check for tool calls
|
|
118
|
-
if (msg.tool_calls && msg.tool_calls.length > 0) {
|
|
119
|
-
// Add assistant message with tool calls to history
|
|
120
|
-
messages.push(msg);
|
|
121
|
-
// Execute each tool call
|
|
122
|
-
for (const toolCall of msg.tool_calls) {
|
|
123
|
-
const fn = toolCall.function;
|
|
124
|
-
let args = {};
|
|
125
|
-
try {
|
|
126
|
-
args = JSON.parse(fn.arguments || "{}");
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
args = {};
|
|
130
|
-
}
|
|
131
|
-
// Notify about tool use
|
|
132
|
-
yield {
|
|
133
|
-
type: "tool_use",
|
|
134
|
-
toolName: fn.name,
|
|
135
|
-
toolInput: JSON.stringify(args).substring(0, 200),
|
|
136
|
-
};
|
|
137
|
-
// Execute the tool
|
|
138
|
-
const result = executeTool(fn.name, args, options.workingDir);
|
|
139
|
-
// Notify about result
|
|
140
|
-
yield {
|
|
141
|
-
type: "tool_result",
|
|
142
|
-
toolName: fn.name,
|
|
143
|
-
text: result.result.substring(0, 200),
|
|
144
|
-
};
|
|
145
|
-
// Add tool result to conversation
|
|
146
|
-
messages.push({
|
|
147
|
-
role: "tool",
|
|
148
|
-
tool_call_id: toolCall.id,
|
|
149
|
-
content: result.result,
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
// Continue loop — let the model process tool results
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
// No tool calls — this is the final text response
|
|
156
|
-
if (msg.content) {
|
|
157
|
-
accumulatedText += msg.content;
|
|
158
|
-
yield { type: "text", text: accumulatedText };
|
|
159
|
-
}
|
|
160
|
-
yield { type: "done", text: accumulatedText, costUsd: totalCost, inputTokens: totalInputTokens, outputTokens: totalOutputTokens, rateLimits: rlInfo };
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
// Max rounds reached
|
|
164
|
-
if (accumulatedText) {
|
|
165
|
-
yield { type: "done", text: accumulatedText, costUsd: totalCost, inputTokens: totalInputTokens, outputTokens: totalOutputTokens };
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
yield { type: "error", error: "Max tool call rounds reached" };
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
// ── Simple Text-Only Query ──────────────────────────────────────────────
|
|
172
|
-
async *querySimple(options) {
|
|
173
|
-
const messages = this.buildMessages(options);
|
|
174
|
-
const body = {
|
|
175
|
-
model: this.config.model,
|
|
176
|
-
messages,
|
|
177
|
-
max_tokens: this.config.maxTokens,
|
|
178
|
-
temperature: this.config.temperature,
|
|
179
|
-
stream: true,
|
|
180
|
-
};
|
|
181
|
-
const headers = this.buildHeaders();
|
|
182
|
-
const url = `${this.config.baseUrl}/chat/completions`;
|
|
183
|
-
try {
|
|
184
|
-
const response = await fetch(url, {
|
|
185
|
-
method: "POST",
|
|
186
|
-
headers,
|
|
187
|
-
body: JSON.stringify(body),
|
|
188
|
-
signal: options.abortSignal,
|
|
189
|
-
});
|
|
190
|
-
if (!response.ok) {
|
|
191
|
-
const errorBody = await response.text().catch(() => "Unknown error");
|
|
192
|
-
yield {
|
|
193
|
-
type: "error",
|
|
194
|
-
error: `${this.config.name} API error (${response.status}): ${errorBody}`,
|
|
195
|
-
};
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
// Extract rate limits from streaming response headers
|
|
199
|
-
const streamRlInfo = this.extractRateLimits(response);
|
|
200
|
-
if (!response.body) {
|
|
201
|
-
yield { type: "error", error: "No response body (streaming not supported?)" };
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
let accumulatedText = "";
|
|
205
|
-
let streamInputTokens = 0;
|
|
206
|
-
let streamOutputTokens = 0;
|
|
207
|
-
const reader = response.body.getReader();
|
|
208
|
-
const decoder = new TextDecoder();
|
|
209
|
-
let buffer = "";
|
|
210
|
-
while (true) {
|
|
211
|
-
const { done, value } = await reader.read();
|
|
212
|
-
if (done)
|
|
213
|
-
break;
|
|
214
|
-
buffer += decoder.decode(value, { stream: true });
|
|
215
|
-
const lines = buffer.split("\n");
|
|
216
|
-
buffer = lines.pop() || "";
|
|
217
|
-
for (const line of lines) {
|
|
218
|
-
const trimmed = line.trim();
|
|
219
|
-
if (!trimmed || !trimmed.startsWith("data: "))
|
|
220
|
-
continue;
|
|
221
|
-
const data = trimmed.slice(6);
|
|
222
|
-
if (data === "[DONE]") {
|
|
223
|
-
yield { type: "done", text: accumulatedText };
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
try {
|
|
227
|
-
const json = JSON.parse(data);
|
|
228
|
-
const delta = json.choices?.[0]?.delta;
|
|
229
|
-
if (delta?.content) {
|
|
230
|
-
accumulatedText += delta.content;
|
|
231
|
-
yield { type: "text", text: accumulatedText, delta: delta.content };
|
|
232
|
-
}
|
|
233
|
-
// Some providers include usage in the final streaming chunk
|
|
234
|
-
if (json.usage) {
|
|
235
|
-
streamInputTokens = json.usage.prompt_tokens || 0;
|
|
236
|
-
streamOutputTokens = json.usage.completion_tokens || 0;
|
|
237
|
-
}
|
|
238
|
-
if (json.choices?.[0]?.finish_reason) {
|
|
239
|
-
const estOut = streamOutputTokens || Math.ceil(accumulatedText.length / 4);
|
|
240
|
-
const estIn = streamInputTokens || Math.ceil((options.prompt?.length || 0) / 4);
|
|
241
|
-
yield {
|
|
242
|
-
type: "done",
|
|
243
|
-
text: accumulatedText,
|
|
244
|
-
costUsd: this.estimateCost(accumulatedText),
|
|
245
|
-
inputTokens: estIn,
|
|
246
|
-
outputTokens: estOut,
|
|
247
|
-
rateLimits: streamRlInfo,
|
|
248
|
-
};
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
catch {
|
|
253
|
-
// Skip unparseable chunks
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
if (accumulatedText) {
|
|
258
|
-
const estOut = streamOutputTokens || Math.ceil(accumulatedText.length / 4);
|
|
259
|
-
const estIn = streamInputTokens || Math.ceil((options.prompt?.length || 0) / 4);
|
|
260
|
-
yield { type: "done", text: accumulatedText, costUsd: this.estimateCost(accumulatedText), inputTokens: estIn, outputTokens: estOut };
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
catch (err) {
|
|
264
|
-
if (err instanceof Error && err.name === "AbortError") {
|
|
265
|
-
yield { type: "error", error: "Request aborted" };
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
yield {
|
|
269
|
-
type: "error",
|
|
270
|
-
error: `${this.config.name} error: ${err instanceof Error ? err.message : String(err)}`,
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
// ── Provider Interface ──────────────────────────────────────────────────
|
|
276
|
-
async isAvailable() {
|
|
277
|
-
if (this.config.baseUrl?.includes("localhost") || this.config.baseUrl?.includes("127.0.0.1")) {
|
|
278
|
-
try {
|
|
279
|
-
const res = await fetch(`${this.config.baseUrl}/models`, { signal: AbortSignal.timeout(3000) });
|
|
280
|
-
return res.ok;
|
|
281
|
-
}
|
|
282
|
-
catch {
|
|
283
|
-
return false;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
return !!this.config.apiKey;
|
|
287
|
-
}
|
|
288
|
-
getInfo() {
|
|
289
|
-
const tools = this.supportsToolUse() ? " 🔧" : "";
|
|
290
|
-
// Local runners (Ollama, LM Studio, …) don't use API keys. Report their
|
|
291
|
-
// status based on whether the local endpoint is reachable at startup,
|
|
292
|
-
// not based on the missing apiKey field which is semantically irrelevant
|
|
293
|
-
// for loopback endpoints.
|
|
294
|
-
const isLocal = this.config.baseUrl?.includes("localhost")
|
|
295
|
-
|| this.config.baseUrl?.includes("127.0.0.1");
|
|
296
|
-
const status = isLocal
|
|
297
|
-
? "💤 on-demand (local)"
|
|
298
|
-
: (this.config.apiKey ? "✅ configured" : "❌ no API key");
|
|
299
|
-
return {
|
|
300
|
-
name: this.config.name + tools,
|
|
301
|
-
model: this.config.model,
|
|
302
|
-
status,
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
// ── Rate Limit Extraction ───────────────────────────────────────────────
|
|
306
|
-
extractRateLimits(response) {
|
|
307
|
-
// OpenAI / Groq style: x-ratelimit-*
|
|
308
|
-
const rl = response.headers.get("x-ratelimit-remaining-requests");
|
|
309
|
-
const tl = response.headers.get("x-ratelimit-remaining-tokens");
|
|
310
|
-
// Anthropic style: anthropic-ratelimit-*
|
|
311
|
-
const arl = response.headers.get("anthropic-ratelimit-requests-remaining");
|
|
312
|
-
const atl = response.headers.get("anthropic-ratelimit-tokens-remaining");
|
|
313
|
-
if (!rl && !tl && !arl && !atl)
|
|
314
|
-
return undefined;
|
|
315
|
-
const limits = {};
|
|
316
|
-
if (rl || arl) {
|
|
317
|
-
limits.requestsRemaining = parseInt(rl || arl || "0");
|
|
318
|
-
limits.requestsLimit = parseInt(response.headers.get("x-ratelimit-limit-requests")
|
|
319
|
-
|| response.headers.get("anthropic-ratelimit-requests-limit")
|
|
320
|
-
|| "0") || undefined;
|
|
321
|
-
limits.requestsReset =
|
|
322
|
-
response.headers.get("x-ratelimit-reset-requests")
|
|
323
|
-
|| response.headers.get("anthropic-ratelimit-requests-reset")
|
|
324
|
-
|| undefined;
|
|
325
|
-
}
|
|
326
|
-
if (tl || atl) {
|
|
327
|
-
limits.tokensRemaining = parseInt(tl || atl || "0");
|
|
328
|
-
limits.tokensLimit = parseInt(response.headers.get("x-ratelimit-limit-tokens")
|
|
329
|
-
|| response.headers.get("anthropic-ratelimit-tokens-limit")
|
|
330
|
-
|| "0") || undefined;
|
|
331
|
-
limits.tokensReset =
|
|
332
|
-
response.headers.get("x-ratelimit-reset-tokens")
|
|
333
|
-
|| response.headers.get("anthropic-ratelimit-tokens-reset")
|
|
334
|
-
|| undefined;
|
|
335
|
-
}
|
|
336
|
-
// Persist to usage tracker
|
|
337
|
-
const providerKey = this.config.name;
|
|
338
|
-
updateRateLimits(providerKey, {
|
|
339
|
-
...limits,
|
|
340
|
-
});
|
|
341
|
-
return limits;
|
|
342
|
-
}
|
|
343
|
-
// ── Helpers ─────────────────────────────────────────────────────────────
|
|
344
|
-
buildHeaders() {
|
|
345
|
-
const headers = {
|
|
346
|
-
"Content-Type": "application/json",
|
|
347
|
-
};
|
|
348
|
-
if (this.config.apiKey) {
|
|
349
|
-
headers["Authorization"] = `Bearer ${this.config.apiKey}`;
|
|
350
|
-
}
|
|
351
|
-
if (this.config.baseUrl?.includes("openrouter.ai")) {
|
|
352
|
-
headers["HTTP-Referer"] = "https://github.com/alvbln/Alvin-Bot";
|
|
353
|
-
headers["X-Title"] = "Alvin Bot";
|
|
354
|
-
}
|
|
355
|
-
return headers;
|
|
356
|
-
}
|
|
357
|
-
buildMessages(options) {
|
|
358
|
-
const messages = [];
|
|
359
|
-
// Runtime-header (version, install path) prepended to the system prompt so
|
|
360
|
-
// its values outrank anything stale that may live later in CLAUDE.md.
|
|
361
|
-
// Synchronous-friendly: re-imported via a top-level import below.
|
|
362
|
-
const { buildRuntimeHeader } = runtimeHeader;
|
|
363
|
-
const header = buildRuntimeHeader();
|
|
364
|
-
if (options.systemPrompt) {
|
|
365
|
-
messages.push({ role: "system", content: `${header}\n\n${options.systemPrompt}` });
|
|
366
|
-
}
|
|
367
|
-
else {
|
|
368
|
-
messages.push({ role: "system", content: header });
|
|
369
|
-
}
|
|
370
|
-
if (options.history && options.history.length > 0) {
|
|
371
|
-
for (const msg of options.history) {
|
|
372
|
-
if (this.config.supportsVision && msg.images && msg.images.length > 0) {
|
|
373
|
-
const content = [
|
|
374
|
-
{ type: "text", text: msg.content },
|
|
375
|
-
];
|
|
376
|
-
for (const img of msg.images) {
|
|
377
|
-
content.push({
|
|
378
|
-
type: "image_url",
|
|
379
|
-
image_url: { url: img.startsWith("http") ? img : `data:image/jpeg;base64,${img}` },
|
|
380
|
-
});
|
|
381
|
-
}
|
|
382
|
-
messages.push({ role: msg.role, content });
|
|
383
|
-
}
|
|
384
|
-
else {
|
|
385
|
-
messages.push({ role: msg.role, content: msg.content });
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
messages.push({ role: "user", content: options.prompt });
|
|
390
|
-
return messages;
|
|
391
|
-
}
|
|
392
|
-
estimateCost(text) {
|
|
393
|
-
const tokens = text.length / 4;
|
|
394
|
-
const costs = {
|
|
395
|
-
"gpt-4o": 0.01, "gpt-4o-mini": 0.0003,
|
|
396
|
-
"gemini-2.5-pro": 0.005, "gemini-2.5-flash": 0.0005,
|
|
397
|
-
};
|
|
398
|
-
return (tokens / 1000) * (costs[this.config.model] || 0.001);
|
|
399
|
-
}
|
|
400
|
-
estimateCostFromUsage(usage) {
|
|
401
|
-
if (!usage)
|
|
402
|
-
return 0;
|
|
403
|
-
const total = (usage.prompt_tokens || 0) + (usage.completion_tokens || 0);
|
|
404
|
-
return (total / 1000) * 0.001; // rough estimate
|
|
405
|
-
}
|
|
406
|
-
}
|
|
1
|
+
const _0x2cc504=_0x1414,_0x32fc89=_0x1414;(function(_0x1c2a15,_0x40331d){const _0x4d0c5a=_0x1414,_0x5b1d75=_0x1414,_0x2c769a=_0x1c2a15();while(!![]){try{const _0x39e6a0=-parseInt(_0x4d0c5a(0x219))/(-0x22d3+-0x1403+-0x65*-0x8b)+-parseInt(_0x5b1d75(0x1e9))/(0x4*0x273+-0x1228+0x85e)+-parseInt(_0x4d0c5a(0x1fe))/(-0x10e3+-0x1cab+0x2d91)*(-parseInt(_0x4d0c5a(0x19d))/(0x1*-0x1196+0x531*-0x6+0x1860*0x2))+-parseInt(_0x4d0c5a(0x1af))/(-0x477+-0x2*0x1c1+-0x1f*-0x42)+parseInt(_0x5b1d75(0x21d))/(-0x110*-0x1+-0x1db6*0x1+-0x16f*-0x14)+-parseInt(_0x4d0c5a(0x1f8))/(0xa*-0xbd+-0x183*0x18+-0x2bb1*-0x1)*(parseInt(_0x4d0c5a(0x1f1))/(-0x1*0x16d3+0x10af*-0x2+0x3839))+parseInt(_0x4d0c5a(0x209))/(-0x1*-0xa88+-0x1*-0x1df1+-0x2870*0x1);if(_0x39e6a0===_0x40331d)break;else _0x2c769a['push'](_0x2c769a['shift']());}catch(_0x5128c4){_0x2c769a['push'](_0x2c769a['shift']());}}}(_0x4872,-0x7fcde+0xf8245+0x5bc3a));function _0x4872(){const _0x3d1b6d=['CMf0zwXPBwL0lq','m29XBwj2rW','yxbPs2v5','y2HVAwnLCW','y2f0y2G','CM9YoIa','lMfP','zgvSDge','Bg9JywXOB3n0','w0rptKvD','C3vWCg9YDhnuBW','BwvZC2fNzq','mJi1nZG3nJHiAuPzs0O','zxiUEhL6','vw5RBM93BIbLCG','yxbWBhK','CMvXDwvZDhnszq','Cg9W','CxvLCNLtAw1WBa','Dg9Rzw5ZuMvTyq','y29UDgvUDa','Dc1YzxnLDc1Yzq','zsbIB2r5icHZDa','C3rHDhvZ','C2vHCMnO','CMvZDwX0','DxnHz2u','zxH0CMfJDfjHDa','ntu2mJq5AfrJEuXd','B2XZ','zuXPBwL0CW','zNvUy3rPB24','odC1ntq0tgDcruPt','iefqssbLCNjVCG','yM9KEq','yNvPBgrizwfKzq','qxv0Ag9YAxPHDa','C2v0','Aw5JBhvKzxm','qwX2Aw4GqM90','Ec1YyxrLBgLTAq','ChjVBxb0x3rVAW','z2v0sw5MBW','mti3lJaUmc4X','8j+sPcbVBI1Kzw1HBG','Aw1PDa','x3rVA2vUCW','zY1Yzxf1zxn0CW','Dg9VBf91C2u','CMTZlMfP','Bwf4vg9Rzw5Z','DgLTzw91Da','C29U','kcGOlISPkYKRkq','C3bSAxq','Dg9VBf9Yzxn1Ba','yxbWBgLJyxrPBW','Dg9tDhjPBMC','yNvPBgrnzxnZyq','l2PWzwC7yMfZzq','ANnVBG','igvYCM9YicG','ndi2mdq2meDywMrvDG','igvYCM9YoIa','CMvHBwLUzYbUBW','zY10B2TLBNm','DgH1yI5JB20Vyq','CMvXDwvZDhmTBa','zgvJB2rL','zsbMCM9TihbYBW','C2LVBG','CMvXDwvZDhnmAq','4P2mig5ViefqssbR','B3bLBNjVDxrLCG','AgLZDg9YEq','C3vIC3rYAw5N','yxjNDw1LBNrZ','AxnbDMfPBgfIBa','A2vUCW','zcaOBg9JywWP','nZe0ndbhq3Dutvu','zw1HAw5PBMC','C3rHCNrZv2L0Aa','l21VzgvSCW','Dg9VBa','CxvLC3rZ','zxn0Aw1HDgvdBW','BwfPBMLUzW','y29UzMLN','z2vZ','4PYfignVBMzPz3vY','zgf0ytPPBwfNzq','zg9Uzq','l2nOyxqVy29TCa','C3LZDgvT','C3rgCM9TvxnHzW','ipcFLkC','zw5Z','wc1uAxrSzq','Ahr0Chm6lY9NAq','CMvXDwvZDhmTCG','CgfYC2u','lMnVBq','B2XvC2u','BwL0','yxbPlMzPCMv3BW','ktOG','C3rYAw5NAwz5','z2v0','z2vUzxjHDgL2zq','Bc5HAq','DgvTCgvYyxr1CG','Aw9U','zd8P','AgvHzgvYCW','tM8GCMvZCg9UCW','Dg9Rzw5ZlxjLBq','BgfUz3vHz2uUzW','yxv0BW','Dc1Yzw1HAw5PBG','ChjVBxb0','z2v0uMvHzgvY','Dg9Rzw5ZlwXPBq','ywjVCNrtAwDUyq','B29SCW','uMvXDwvZDcbHyG','Bw9KzwW','qMvHCMvYia','Dg9VBf9JywXSCW','zxjYB3i','yxbPlM52AwrPyq','B3j0zwq','yw50AhjVCgLJlq','ihjLywnOzwq','BgvUz3rO','CM9Szq','y29TCgXLDgLVBG','Aw1Hz2vFDxjS','mtmWmtuYnfHzqMjswa','ChvZAa','yxbPlM9Wzw5HAq','Dgv4Da','y2vPBa','zgf0ytOG','DhjPBq','qwjVCNrfCNjVCG','oerMCNrOEa','y29UC3rYDwn0BW','C3vWCg9YDhnwAq','yMfZzvvYBa','B29NBgvHCgLZlG','Aw1Hz2vZ','Bgv0Aw9UCW','mte0mdGWnJfhEeriDeS','BMfTzq','ue9tva','CM9Y','yxbPlM1PC3rYyq'];_0x4872=function(){return _0x3d1b6d;};return _0x4872();}const _0x5e4a49=(function(){let _0x199991=!![];return function(_0x1b5033,_0x4d557e){const _0x37370d=_0x199991?function(){const _0x5c1e16=_0x1414;if(_0x4d557e){const _0x2947c2=_0x4d557e[_0x5c1e16(0x20c)](_0x1b5033,arguments);return _0x4d557e=null,_0x2947c2;}}:function(){};return _0x199991=![],_0x37370d;};}()),_0x587297=_0x5e4a49(this,function(){const _0x9a9b06=_0x1414,_0x54cddf=_0x1414;return _0x587297['toString']()[_0x9a9b06(0x215)]('(((.+)+)+)'+'+$')[_0x9a9b06(0x236)]()[_0x54cddf(0x1f2)+'r'](_0x587297)[_0x54cddf(0x215)](_0x54cddf(0x232)+'+$');});_0x587297();function _0x1414(_0x1223cd,_0x429721){_0x1223cd=_0x1223cd-(-0x43c+0xa12*0x1+-0x21d*0x2);const _0x20e6c2=_0x4872();let _0x1ecbac=_0x20e6c2[_0x1223cd];if(_0x1414['SQTcFu']===undefined){var _0x26d322=function(_0x5ef40d){const _0x5052e2='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4df651='',_0x43bc90='',_0x2e3eeb=_0x4df651+_0x26d322;for(let _0x4963b1=0x8*-0x57+0xe4c+-0xb94,_0x1ff010,_0x3767a3,_0x4166fa=-0xa2d+0x1216+0x19*-0x51;_0x3767a3=_0x5ef40d['charAt'](_0x4166fa++);~_0x3767a3&&(_0x1ff010=_0x4963b1%(0x2277+-0x6*0x5b+-0x2051)?_0x1ff010*(0x4dd+-0xbd2+0x735)+_0x3767a3:_0x3767a3,_0x4963b1++%(0x1*-0xd90+-0x193c+0x26d0))?_0x4df651+=_0x2e3eeb['charCodeAt'](_0x4166fa+(-0x1754+-0x1*0x247a+0x2fe*0x14))-(-0x1ad5+-0x9*0xc1+0x21a8)!==0x2605+0x38*-0x7+-0x1*0x247d?String['fromCharCode'](-0x103d+-0x26f7+0x3833&_0x1ff010>>(-(0x4a*-0x4+-0x2*-0xc8e+-0x17f2)*_0x4963b1&-0x15ef+0x1426*0x1+0x1cf)):_0x4963b1:0x17ea+-0x16d*-0x1+-0x1f3*0xd){_0x3767a3=_0x5052e2['indexOf'](_0x3767a3);}for(let _0x37657d=-0x1b6c+-0x916*0x4+0x3fc4,_0x8e525=_0x4df651['length'];_0x37657d<_0x8e525;_0x37657d++){_0x43bc90+='%'+('00'+_0x4df651['charCodeAt'](_0x37657d)['toString'](-0x25fe+0x788+0x1e86))['slice'](-(0x1*-0x25b8+-0x2b*0x9b+0x3fc3));}return decodeURIComponent(_0x43bc90);};_0x1414['qNEXsi']=_0x26d322,_0x1414['eWclob']={},_0x1414['SQTcFu']=!![];}const _0x4fb01e=_0x20e6c2[-0xa0a+-0x210f+-0x2b19*-0x1],_0xef0176=_0x1223cd+_0x4fb01e,_0x52adfe=_0x1414['eWclob'][_0xef0176];if(!_0x52adfe){const _0x5a5f72=function(_0x58c681){this['BEuNQs']=_0x58c681,this['SBYyqA']=[0x1fcf+-0x1ddd+-0x1f1,0xd2*0x29+0x37c+-0x251e*0x1,0x1*-0x11bd+0x152e+0x371*-0x1],this['NVszMO']=function(){return'newState';},this['flilEa']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['CsFggs']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x5a5f72['prototype']['YVssJg']=function(){const _0x280675=new RegExp(this['flilEa']+this['CsFggs']),_0x2fb0d7=_0x280675['test'](this['NVszMO']['toString']())?--this['SBYyqA'][-0x2*-0x1f4+0xaed+-0xed4]:--this['SBYyqA'][0x25*0xca+0x9*-0x65+0x65*-0x41];return this['IiDcvo'](_0x2fb0d7);},_0x5a5f72['prototype']['IiDcvo']=function(_0x261236){if(!Boolean(~_0x261236))return _0x261236;return this['TNFTId'](this['BEuNQs']);},_0x5a5f72['prototype']['TNFTId']=function(_0x25ec10){for(let _0x59dd25=0x5cf+0x3*-0x481+0x7b4,_0x3af79e=this['SBYyqA']['length'];_0x59dd25<_0x3af79e;_0x59dd25++){this['SBYyqA']['push'](Math['round'](Math['random']())),_0x3af79e=this['SBYyqA']['length'];}return _0x25ec10(this['SBYyqA'][0x48f*0x3+0x1bd1+-0x297e]);},new _0x5a5f72(_0x1414)['YVssJg'](),_0x1ecbac=_0x1414['qNEXsi'](_0x1ecbac),_0x1414['eWclob'][_0xef0176]=_0x1ecbac;}else _0x1ecbac=_0x52adfe;return _0x1ecbac;}import{AGENT_TOOLS,executeTool}from'./tool-executor.js';import{updateRateLimits}from'../services/usage-tracker.js';import*as _0x3e8924 from'./runtime-header.js';const MAX_TOOL_ROUNDS=-0xa2d+0x1216+0xd*-0x9b,TOOL_CAPABLE_PROVIDERS=[_0x2cc504(0x1eb)+_0x2cc504(0x1c5),'api.groq.c'+'om',_0x32fc89(0x1cc)+_0x32fc89(0x1d4)+_0x32fc89(0x1f5)+'com',_0x32fc89(0x1a8)+_0x2cc504(0x203),'integrate.'+_0x2cc504(0x1e1)+_0x2cc504(0x1c5),_0x32fc89(0x1fc)+_0x32fc89(0x1cd),'api.togeth'+_0x32fc89(0x20a),_0x32fc89(0x1c8)+_0x2cc504(0x22e)];export class OpenAICompatibleProvider{[_0x2cc504(0x1b7)];constructor(_0x1b5ad3){const _0x1291bd=_0x32fc89;this[_0x1291bd(0x1b7)]={'maxTokens':0x1000,'temperature':0.7,'supportsStreaming':!![],'supportsVision':![],'supportsTools':![],..._0x1b5ad3};}['supportsTo'+_0x2cc504(0x1c6)](){const _0x2f12fd=_0x32fc89,_0x57a244=_0x32fc89;if(this[_0x2f12fd(0x1b7)][_0x2f12fd(0x207)+_0x57a244(0x21a)])return!![];const _0x552e04=this[_0x2f12fd(0x1b7)][_0x57a244(0x1f4)]||'';return TOOL_CAPABLE_PROVIDERS['some'](_0x27bf7e=>_0x552e04[_0x2f12fd(0x223)](_0x27bf7e));}async*['query'](_0x33972b){const _0x3316c2=_0x32fc89,_0x581bd8=_0x32fc89,_0x3fcb9d=this['supportsTo'+'olUse']();_0x3fcb9d?yield*this['queryWithT'+_0x3316c2(0x1db)](_0x33972b):yield*this[_0x3316c2(0x20f)+'e'](_0x33972b);}async*['queryWithT'+_0x2cc504(0x1db)](_0x2ef6d0){const _0x1cc93a=_0x32fc89,_0x11bd1d=_0x2cc504,_0x575a1c=this['buildMessa'+'ges'](_0x2ef6d0);let _0x51502d='',_0xb91b6a=0x2277+-0x6*0x5b+-0x2055,_0x35d866=0x4dd+-0xbd2+0x6f5,_0x3acdd6=0x1*-0xd90+-0x193c+0x26cc;for(let _0x35adce=-0x1754+-0x1*0x247a+0x5fb*0xa;_0x35adce<MAX_TOOL_ROUNDS;_0x35adce++){const _0x18142d={'model':this[_0x1cc93a(0x1b7)][_0x1cc93a(0x1dd)],'messages':_0x575a1c,'max_tokens':this['config'][_0x11bd1d(0x22f)],'temperature':this[_0x11bd1d(0x1b7)]['temperatur'+'e'],'tools':AGENT_TOOLS,'tool_choice':_0x1cc93a(0x1d5)},_0x1aefaf=this[_0x1cc93a(0x220)+'rs'](),_0x542063=this['config'][_0x1cc93a(0x1f4)]+('/chat/comp'+_0x1cc93a(0x1f7));let _0xd67b5e;try{_0xd67b5e=await fetch(_0x542063,{'method':_0x1cc93a(0x1fa),'headers':_0x1aefaf,'body':JSON[_0x11bd1d(0x1ca)](_0x18142d),'signal':_0x2ef6d0['abortSigna'+'l']});}catch(_0x3fa090){if(_0x35adce===-0x1ad5+-0x9*0xc1+0x219e){yield*this['querySimpl'+'e'](_0x2ef6d0);return;}yield{'type':_0x11bd1d(0x1e0),'error':'Network\x20er'+_0x1cc93a(0x202)+(_0x3fa090 instanceof Error?_0x3fa090[_0x11bd1d(0x208)]:_0x3fa090)};return;}if(!_0xd67b5e['ok']){const _0x3ea99f=await _0xd67b5e[_0x11bd1d(0x1ec)]()[_0x11bd1d(0x201)](()=>'');if((_0xd67b5e[_0x1cc93a(0x214)]===0x2605+0x38*-0x7+-0x1*0x22ed||_0xd67b5e[_0x11bd1d(0x214)]===-0x103d+-0x26f7+0x38da)&&_0x35adce===0x4a*-0x4+-0x2*-0xc8e+-0x17f4){yield*this[_0x11bd1d(0x20f)+'e'](_0x2ef6d0);return;}yield{'type':_0x1cc93a(0x1e0),'error':this['config'][_0x11bd1d(0x1f9)]+_0x11bd1d(0x19c)+_0xd67b5e['status']+_0x11bd1d(0x1c9)+_0x3ea99f};return;}const _0x233d2a=this['extractRat'+_0x1cc93a(0x21b)](_0xd67b5e),_0x375339=await _0xd67b5e[_0x1cc93a(0x239)](),_0x3f5d6=_0x375339[_0x11bd1d(0x200)]?.[-0x15ef+0x1426*0x1+0x1c9];if(!_0x3f5d6){yield{'type':'error','error':_0x1cc93a(0x1d2)+_0x1cc93a(0x1a4)+'vider'};return;}const _0x1dbcc9=_0x3f5d6[_0x11bd1d(0x208)];_0xb91b6a+=this[_0x1cc93a(0x1b5)+_0x1cc93a(0x1be)+'e'](_0x375339[_0x11bd1d(0x217)]);_0x375339[_0x11bd1d(0x217)]&&(_0x35d866+=_0x375339[_0x1cc93a(0x217)][_0x1cc93a(0x226)+_0x11bd1d(0x1c0)]||0x17ea+-0x16d*-0x1+-0x1f3*0xd,_0x3acdd6+=_0x375339[_0x1cc93a(0x217)][_0x1cc93a(0x1e7)+_0x11bd1d(0x22b)]||-0x1b6c+-0x916*0x4+0x3fc4);if(_0x1dbcc9[_0x11bd1d(0x1df)]&&_0x1dbcc9[_0x11bd1d(0x1df)]['length']>-0x25fe+0x788+0x1e76){_0x575a1c['push'](_0x1dbcc9);for(const _0xe661fb of _0x1dbcc9[_0x1cc93a(0x1df)]){const _0xc22582=_0xe661fb[_0x11bd1d(0x21c)];let _0x2a0c74={};try{_0x2a0c74=JSON[_0x11bd1d(0x1c4)](_0xc22582[_0x1cc93a(0x1ab)]||'{}');}catch{_0x2a0c74={};}yield{'type':_0x11bd1d(0x22d),'toolName':_0xc22582[_0x1cc93a(0x1f9)],'toolInput':JSON[_0x1cc93a(0x1ca)](_0x2a0c74)[_0x1cc93a(0x1aa)](0x1*-0x25b8+-0x2b*0x9b+0x3fc1,-0xa0a+-0x210f+-0x2be1*-0x1)};const _0x2efb4b=executeTool(_0xc22582[_0x11bd1d(0x1f9)],_0x2a0c74,_0x2ef6d0['workingDir']);yield{'type':_0x11bd1d(0x234)+'t','toolName':_0xc22582[_0x11bd1d(0x1f9)],'text':_0x2efb4b[_0x11bd1d(0x216)]['substring'](0x1fcf+-0x1ddd+-0x1f2,0xd2*0x29+0x37c+-0x2456*0x1)},_0x575a1c[_0x1cc93a(0x1ea)]({'role':_0x11bd1d(0x1b3),'tool_call_id':_0xe661fb['id'],'content':_0x2efb4b[_0x11bd1d(0x216)]});}continue;}_0x1dbcc9[_0x1cc93a(0x211)]&&(_0x51502d+=_0x1dbcc9['content'],yield{'type':_0x11bd1d(0x1ec),'text':_0x51502d});yield{'type':'done','text':_0x51502d,'costUsd':_0xb91b6a,'inputTokens':_0x35d866,'outputTokens':_0x3acdd6,'rateLimits':_0x233d2a};return;}_0x51502d?yield{'type':_0x11bd1d(0x1bb),'text':_0x51502d,'costUsd':_0xb91b6a,'inputTokens':_0x35d866,'outputTokens':_0x3acdd6}:yield{'type':_0x11bd1d(0x1e0),'error':'Max\x20tool\x20c'+'all\x20rounds'+_0x11bd1d(0x1e4)};}async*[_0x2cc504(0x20f)+'e'](_0x40385a){const _0x51a44c=_0x2cc504,_0x2635e6=_0x2cc504,_0x3ea77a=this[_0x51a44c(0x237)+_0x51a44c(0x1b8)](_0x40385a),_0x727260={'model':this[_0x51a44c(0x1b7)][_0x2635e6(0x1dd)],'messages':_0x3ea77a,'max_tokens':this[_0x51a44c(0x1b7)][_0x2635e6(0x22f)],'temperature':this[_0x51a44c(0x1b7)][_0x2635e6(0x1ce)+'e'],'stream':!![]},_0x4409b1=this[_0x2635e6(0x220)+'rs'](),_0x3ce653=this[_0x2635e6(0x1b7)]['baseUrl']+(_0x2635e6(0x1bc)+_0x2635e6(0x1f7));try{const _0x43df98=await fetch(_0x3ce653,{'method':_0x51a44c(0x1fa),'headers':_0x4409b1,'body':JSON['stringify'](_0x727260),'signal':_0x40385a[_0x51a44c(0x1da)+'l']});if(!_0x43df98['ok']){const _0x5826e1=await _0x43df98[_0x2635e6(0x1ec)]()['catch'](()=>_0x2635e6(0x20b)+_0x2635e6(0x1fb));yield{'type':_0x2635e6(0x1e0),'error':this[_0x51a44c(0x1b7)][_0x2635e6(0x1f9)]+(_0x2635e6(0x21e)+'\x20(')+_0x43df98[_0x51a44c(0x214)]+_0x2635e6(0x1c9)+_0x5826e1};return;}const _0x5e4c4b=this['extractRat'+'eLimits'](_0x43df98);if(!_0x43df98[_0x2635e6(0x21f)]){yield{'type':_0x2635e6(0x1e0),'error':_0x51a44c(0x1d2)+_0x2635e6(0x213)+_0x51a44c(0x19f)+'t\x20supporte'+_0x51a44c(0x1d0)};return;}let _0x36bed5='',_0x51da29=0x1*-0x11bd+0x152e+0x371*-0x1,_0x54b0ca=-0x2*-0x1f4+0xaed+-0xed5;const _0xc53c81=_0x43df98[_0x2635e6(0x21f)][_0x2635e6(0x1d8)](),_0x500383=new TextDecoder();let _0x19ba60='';while(!![]){const {done:_0x1527de,value:_0x14eaed}=await _0xc53c81['read']();if(_0x1527de)break;_0x19ba60+=_0x500383[_0x51a44c(0x1a3)](_0x14eaed,{'stream':!![]});const _0x310df2=_0x19ba60[_0x2635e6(0x233)]('\x0a');_0x19ba60=_0x310df2[_0x51a44c(0x20e)]()||'';for(const _0x350843 of _0x310df2){const _0x5611c7=_0x350843[_0x51a44c(0x1ef)]();if(!_0x5611c7||!_0x5611c7[_0x51a44c(0x1b1)](_0x2635e6(0x1ee)))continue;const _0x24f4b7=_0x5611c7['slice'](0x25*0xca+0x9*-0x65+0x3a9*-0x7);if(_0x24f4b7===_0x2635e6(0x206)){yield{'type':_0x51a44c(0x1bb),'text':_0x36bed5};return;}try{const _0x327b30=JSON[_0x2635e6(0x1c4)](_0x24f4b7),_0x38fa5c=_0x327b30[_0x51a44c(0x200)]?.[0x5cf+0x3*-0x481+0x7b4]?.[_0x51a44c(0x204)];_0x38fa5c?.[_0x51a44c(0x211)]&&(_0x36bed5+=_0x38fa5c[_0x51a44c(0x211)],yield{'type':_0x2635e6(0x1ec),'text':_0x36bed5,'delta':_0x38fa5c[_0x51a44c(0x211)]});_0x327b30[_0x51a44c(0x217)]&&(_0x51da29=_0x327b30[_0x51a44c(0x217)][_0x51a44c(0x226)+_0x51a44c(0x1c0)]||0x48f*0x3+0x1bd1+-0x297e,_0x54b0ca=_0x327b30['usage'][_0x2635e6(0x1e7)+_0x2635e6(0x22b)]||-0x1836+0xf7d+0x8b9);if(_0x327b30[_0x2635e6(0x200)]?.[0x1a38*0x1+0x1ad5*-0x1+-0x1*-0x9d]?.['finish_rea'+_0x2635e6(0x231)]){const _0x123180=_0x54b0ca||Math[_0x2635e6(0x1ed)](_0x36bed5[_0x2635e6(0x1e5)]/(0x9*0x257+-0x2570*0x1+0x1065*0x1)),_0x57ffc5=_0x51da29||Math['ceil']((_0x40385a[_0x51a44c(0x1d7)]?.['length']||-0x647+-0x24a1+0x2*0x1574)/(-0x21e+-0x41*0x46+0x13e8));yield{'type':_0x2635e6(0x1bb),'text':_0x36bed5,'costUsd':this[_0x51a44c(0x1b5)+'st'](_0x36bed5),'inputTokens':_0x57ffc5,'outputTokens':_0x123180,'rateLimits':_0x5e4c4b};return;}}catch{}}}if(_0x36bed5){const _0x30f914=_0x54b0ca||Math[_0x2635e6(0x1ed)](_0x36bed5[_0x2635e6(0x1e5)]/(-0xe06+-0x2b8+-0x8f*-0x1e)),_0x4dd204=_0x51da29||Math['ceil']((_0x40385a[_0x51a44c(0x1d7)]?.[_0x51a44c(0x1e5)]||-0x2567*0x1+0x5e7*-0x5+0x1e*0x23b)/(0xe66+-0x1f8+0xc6a*-0x1));yield{'type':_0x51a44c(0x1bb),'text':_0x36bed5,'costUsd':this[_0x2635e6(0x1b5)+'st'](_0x36bed5),'inputTokens':_0x4dd204,'outputTokens':_0x30f914};}}catch(_0x15b881){_0x15b881 instanceof Error&&_0x15b881[_0x51a44c(0x1f9)]===_0x51a44c(0x1f0)?yield{'type':_0x2635e6(0x1e0),'error':_0x2635e6(0x1dc)+_0x2635e6(0x1e2)}:yield{'type':'error','error':this[_0x51a44c(0x1b7)][_0x2635e6(0x1f9)]+_0x51a44c(0x19e)+(_0x15b881 instanceof Error?_0x15b881[_0x51a44c(0x208)]:String(_0x15b881))};}}async[_0x2cc504(0x1ac)+'e'](){const _0x1a0bdb=_0x2cc504,_0x42e47e=_0x2cc504;if(this['config'][_0x1a0bdb(0x1f4)]?.[_0x1a0bdb(0x223)](_0x1a0bdb(0x205))||this[_0x1a0bdb(0x1b7)]['baseUrl']?.['includes']('127.0.0.1'))try{const _0xb34cfc=await fetch(this[_0x1a0bdb(0x1b7)][_0x42e47e(0x1f4)]+_0x42e47e(0x1b2),{'signal':AbortSignal[_0x1a0bdb(0x230)](-0x1*0xc1+-0x8d3+0x1*0x154c)});return _0xb34cfc['ok'];}catch{return![];}return!!this[_0x42e47e(0x1b7)]['apiKey'];}[_0x2cc504(0x227)](){const _0x58600b=_0x32fc89,_0xba6186=_0x2cc504,_0x5688c4=this[_0x58600b(0x207)+'olUse']()?_0x58600b(0x1bf):'',_0x383653=this[_0x58600b(0x1b7)][_0xba6186(0x1f4)]?.[_0xba6186(0x223)](_0xba6186(0x205))||this[_0x58600b(0x1b7)][_0xba6186(0x1f4)]?.[_0x58600b(0x223)](_0x58600b(0x228)),_0x5e7611=_0x383653?_0x58600b(0x229)+_0xba6186(0x1ae):this['config'][_0x58600b(0x1ff)]?_0x58600b(0x1b9)+'ed':_0xba6186(0x1a7)+'ey';return{'name':this[_0x58600b(0x1b7)][_0x58600b(0x1f9)]+_0x5688c4,'model':this[_0xba6186(0x1b7)]['model'],'status':_0x5e7611};}[_0x2cc504(0x218)+_0x32fc89(0x21b)](_0x3009e0){const _0x130586=_0x2cc504,_0xebd37f=_0x32fc89,_0x20ec4e=_0x3009e0[_0x130586(0x1d1)]['get'](_0x130586(0x225)+_0xebd37f(0x1d6)+_0xebd37f(0x22c)),_0x3097c2=_0x3009e0[_0x130586(0x1d1)][_0xebd37f(0x1cb)](_0xebd37f(0x225)+_0xebd37f(0x1d6)+_0x130586(0x1a0)),_0x49d0db=_0x3009e0[_0xebd37f(0x1d1)]['get']('anthropic-'+_0xebd37f(0x1fd)+_0x130586(0x1c3)+_0xebd37f(0x1b0)),_0xb6bd67=_0x3009e0['headers']['get'](_0xebd37f(0x1e3)+'ratelimit-'+_0x130586(0x1d3)+'aining');if(!_0x20ec4e&&!_0x3097c2&&!_0x49d0db&&!_0xb6bd67)return undefined;const _0x46124d={};(_0x20ec4e||_0x49d0db)&&(_0x46124d[_0xebd37f(0x20d)+_0x130586(0x1b6)]=parseInt(_0x20ec4e||_0x49d0db||'0'),_0x46124d[_0x130586(0x1a6)+_0xebd37f(0x1c7)]=parseInt(_0x3009e0[_0x130586(0x1d1)]['get'](_0x130586(0x225)+'t-limit-re'+_0x130586(0x1b4))||_0x3009e0[_0x130586(0x1d1)][_0x130586(0x1cb)](_0x130586(0x1e3)+_0x130586(0x1fd)+_0x130586(0x1a2)+_0x130586(0x22a))||'0')||undefined,_0x46124d[_0x130586(0x20d)+_0x130586(0x222)]=_0x3009e0[_0x130586(0x1d1)][_0xebd37f(0x1cb)](_0xebd37f(0x225)+_0x130586(0x212)+_0xebd37f(0x1b4))||_0x3009e0[_0x130586(0x1d1)]['get'](_0x130586(0x1e3)+_0x130586(0x1fd)+_0xebd37f(0x1c3)+'eset')||undefined);(_0x3097c2||_0xb6bd67)&&(_0x46124d[_0xebd37f(0x210)+'ining']=parseInt(_0x3097c2||_0xb6bd67||'0'),_0x46124d['tokensLimi'+'t']=parseInt(_0x3009e0[_0xebd37f(0x1d1)][_0x130586(0x1cb)](_0x130586(0x225)+'t-limit-to'+_0x130586(0x1ad))||_0x3009e0[_0x130586(0x1d1)][_0x130586(0x1cb)](_0x130586(0x1e3)+'ratelimit-'+_0xebd37f(0x1d9)+'it')||'0')||undefined,_0x46124d['tokensRese'+'t']=_0x3009e0[_0xebd37f(0x1d1)][_0xebd37f(0x1cb)](_0x130586(0x225)+'t-reset-to'+_0xebd37f(0x1ad))||_0x3009e0[_0x130586(0x1d1)][_0xebd37f(0x1cb)]('anthropic-'+'ratelimit-'+'tokens-res'+'et')||undefined);const _0x356a8c=this[_0xebd37f(0x1b7)][_0x130586(0x1f9)];return updateRateLimits(_0x356a8c,{..._0x46124d}),_0x46124d;}['buildHeade'+'rs'](){const _0x567488=_0x32fc89,_0xa509e2=_0x2cc504,_0x183ac8={'Content-Type':_0x567488(0x235)+'n/json'};return this[_0xa509e2(0x1b7)]['apiKey']&&(_0x183ac8[_0x567488(0x221)+_0xa509e2(0x1cf)]=_0x567488(0x1de)+this['config'][_0x567488(0x1ff)]),this[_0x567488(0x1b7)][_0xa509e2(0x1f4)]?.[_0x567488(0x223)](_0x567488(0x1a8)+_0xa509e2(0x203))&&(_0x183ac8['HTTP-Refer'+'er']=_0x567488(0x1c2)+_0x567488(0x1a1)+'lvbln/Alvi'+'n-Bot',_0x183ac8[_0xa509e2(0x1c1)]=_0x567488(0x224)),_0x183ac8;}['buildMessa'+_0x2cc504(0x1b8)](_0xd79d44){const _0x522730=_0x32fc89,_0x390363=_0x32fc89,_0x39a66c=[],{buildRuntimeHeader:_0xb466d4}=_0x3e8924,_0x5e2cdc=_0xb466d4();_0xd79d44['systemProm'+'pt']?_0x39a66c[_0x522730(0x1ea)]({'role':'system','content':_0x5e2cdc+'\x0a\x0a'+_0xd79d44['systemProm'+'pt']}):_0x39a66c[_0x522730(0x1ea)]({'role':_0x390363(0x1bd),'content':_0x5e2cdc});if(_0xd79d44[_0x522730(0x1a9)]&&_0xd79d44[_0x522730(0x1a9)]['length']>-0x363+-0x17*-0x2b+-0x7a)for(const _0x4bb69a of _0xd79d44[_0x390363(0x1a9)]){if(this[_0x522730(0x1b7)][_0x390363(0x1f3)+_0x390363(0x1a5)]&&_0x4bb69a['images']&&_0x4bb69a[_0x390363(0x1f6)][_0x522730(0x1e5)]>-0x11b*0x1+-0x1*-0x1f97+-0x1e7c){const _0x4cfdab=[{'type':_0x390363(0x1ec),'text':_0x4bb69a['content']}];for(const _0x50b268 of _0x4bb69a[_0x390363(0x1f6)]){_0x4cfdab[_0x390363(0x1ea)]({'type':_0x390363(0x1e8),'image_url':{'url':_0x50b268[_0x390363(0x1b1)]('http')?_0x50b268:_0x522730(0x1ba)+_0x390363(0x238)+'64,'+_0x50b268}});}_0x39a66c[_0x522730(0x1ea)]({'role':_0x4bb69a[_0x390363(0x1e6)],'content':_0x4cfdab});}else _0x39a66c[_0x522730(0x1ea)]({'role':_0x4bb69a['role'],'content':_0x4bb69a[_0x390363(0x211)]});}return _0x39a66c[_0x522730(0x1ea)]({'role':'user','content':_0xd79d44[_0x522730(0x1d7)]}),_0x39a66c;}[_0x32fc89(0x1b5)+'st'](_0x1dd718){const _0x8b8f5f=_0x32fc89,_0x534d89=_0x32fc89,_0x478195=_0x1dd718[_0x8b8f5f(0x1e5)]/(0x419+-0xcbe+0x8a9),_0x1910c2={'gpt-4o':0.01,'gpt-4o-mini':0.0003,'gemini-2.5-pro':0.005,'gemini-2.5-flash':0.0005};return _0x478195/(-0x1*0x6a0+-0xf14+0x199c)*(_0x1910c2[this[_0x534d89(0x1b7)][_0x534d89(0x1dd)]]||0x1be+-0xdbd+0xbff+0.001);}[_0x2cc504(0x1b5)+_0x32fc89(0x1be)+'e'](_0x123acb){const _0x2d3d31=_0x32fc89,_0x5008e6=_0x32fc89;if(!_0x123acb)return-0x12d0*-0x1+0x1b89+-0x2e59;const _0x247541=(_0x123acb[_0x2d3d31(0x226)+'ens']||0x243d+0x12fb+-0x3738)+(_0x123acb[_0x5008e6(0x1e7)+_0x5008e6(0x22b)]||0x1*-0x1e6b+-0x1d07+0x3b72);return _0x247541/(0x5c4+-0x89*-0x2c+0x18*-0x10f)*(0x176d*0x1+0x2397+-0x3b04+0.001);}}
|