alvin-bot 5.6.2 → 5.8.0
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 +29 -0
- package/README.md +1 -1
- 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 -130
- 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 -443
- 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 -0
- 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 -1831
- 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 _0xde3957=_0x5e0e,_0x4c113e=_0x5e0e;(function(_0x5030b4,_0x53ecd2){const _0x589e6a=_0x5e0e,_0x4470f8=_0x5e0e,_0x28ccde=_0x5030b4();while(!![]){try{const _0x3c4286=parseInt(_0x589e6a(0x122))/(0x10d6+-0x1f*-0x80+0x1*-0x2055)+-parseInt(_0x589e6a(0x14d))/(0x1a2b+-0x3*0x873+-0xd0)+-parseInt(_0x4470f8(0x157))/(0x11*0x7d+-0x1*-0x2561+-0x2dab)*(-parseInt(_0x589e6a(0x155))/(0x3*-0x571+0x6e*-0x35+0x271d))+-parseInt(_0x589e6a(0xfb))/(-0xb*0x2a2+-0x1*0x7b5+-0x1*-0x24b0)*(parseInt(_0x589e6a(0x131))/(-0x3f6*-0x4+0x109*-0x1a+0x47*0x28))+parseInt(_0x4470f8(0x116))/(-0xe73+0x1c77+-0xdfd)*(parseInt(_0x589e6a(0xc1))/(-0x26ea+0x57b+-0xd*-0x293))+parseInt(_0x589e6a(0x161))/(0x1*0xb2f+-0x19*-0xb1+-0x1c6f)+parseInt(_0x4470f8(0x15c))/(-0x21f8+0x14*0x3b+0x1d66)*(-parseInt(_0x589e6a(0xc3))/(-0x1*-0x2082+-0x197f+-0x6f8));if(_0x3c4286===_0x53ecd2)break;else _0x28ccde['push'](_0x28ccde['shift']());}catch(_0x1a6430){_0x28ccde['push'](_0x28ccde['shift']());}}}(_0x3b4d,0x38*0x32e+0x45853+-0x1d26c));function _0x5e0e(_0x30e736,_0x2b76d9){_0x30e736=_0x30e736-(-0x2*0xfb7+0x111f+0xf0b*0x1);const _0x594918=_0x3b4d();let _0x2918a8=_0x594918[_0x30e736];if(_0x5e0e['afnXoC']===undefined){var _0x502456=function(_0x158651){const _0x4c6d31='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x99ec64='',_0x3effa1='',_0x4e879d=_0x99ec64+_0x502456;for(let _0x3f5c26=0x1e1e+-0x7*0x3c1+-0x3d7,_0x311114,_0x1ef186,_0xaaac1a=-0x1e2*-0x1+0x187e+-0x698*0x4;_0x1ef186=_0x158651['charAt'](_0xaaac1a++);~_0x1ef186&&(_0x311114=_0x3f5c26%(-0x13f6+-0x1889+0x5*0x8e7)?_0x311114*(0x1fd9+0x22e2+0x9*-0x763)+_0x1ef186:_0x1ef186,_0x3f5c26++%(-0x1c8b+0x9f4+0x129b*0x1))?_0x99ec64+=_0x4e879d['charCodeAt'](_0xaaac1a+(0x7ec+-0xf54+0x772))-(0x7*-0x3d7+-0xe2+-0x1*-0x1bcd)!==0x21e4+-0x17fc+0x4f4*-0x2?String['fromCharCode'](-0x3d*0xd+0x6e5+0x1*-0x2cd&_0x311114>>(-(-0x63e+0x14c+0x4f4)*_0x3f5c26&0x1*-0x2417+-0x1d76+0x4193)):_0x3f5c26:-0x1129+0x16*0x76+0x705){_0x1ef186=_0x4c6d31['indexOf'](_0x1ef186);}for(let _0x2ce943=-0x11f0+0xbe1+0x60f,_0x540e2d=_0x99ec64['length'];_0x2ce943<_0x540e2d;_0x2ce943++){_0x3effa1+='%'+('00'+_0x99ec64['charCodeAt'](_0x2ce943)['toString'](-0x523+-0x1643+0x1b76))['slice'](-(-0x1e3d+-0x1*0x18f3+-0x2d*-0x13a));}return decodeURIComponent(_0x3effa1);};_0x5e0e['PTBHzn']=_0x502456,_0x5e0e['SiQTSc']={},_0x5e0e['afnXoC']=!![];}const _0x2d3f3a=_0x594918[-0x1cdb*0x1+0x4f*-0x6c+0x1*0x3e2f],_0x3aa05f=_0x30e736+_0x2d3f3a,_0x3a7631=_0x5e0e['SiQTSc'][_0x3aa05f];if(!_0x3a7631){const _0x10a417=function(_0x5b7ee3){this['QpIoZB']=_0x5b7ee3,this['lZoWeH']=[-0x250+0x2f*-0x44+0xecd*0x1,0x223a+0x18e+-0x23c8,-0xddd+-0x2*0xdb1+0x1*0x293f],this['qfyxfo']=function(){return'newState';},this['VWNwNg']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['UFVHDP']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x10a417['prototype']['igHkvw']=function(){const _0xabbca9=new RegExp(this['VWNwNg']+this['UFVHDP']),_0x5b9c7f=_0xabbca9['test'](this['qfyxfo']['toString']())?--this['lZoWeH'][-0x26*0xdf+-0x1*0x4f4+0x260f]:--this['lZoWeH'][0x61*0xd+-0x24fb*-0x1+-0x29e8];return this['VxSKDT'](_0x5b9c7f);},_0x10a417['prototype']['VxSKDT']=function(_0x35cae1){if(!Boolean(~_0x35cae1))return _0x35cae1;return this['jewLXj'](this['QpIoZB']);},_0x10a417['prototype']['jewLXj']=function(_0x50a9e1){for(let _0x46db5f=0x3*-0xb87+-0x78+0x230d,_0x4b9002=this['lZoWeH']['length'];_0x46db5f<_0x4b9002;_0x46db5f++){this['lZoWeH']['push'](Math['round'](Math['random']())),_0x4b9002=this['lZoWeH']['length'];}return _0x50a9e1(this['lZoWeH'][0x120c+0x1fc8+-0x31d4]);},new _0x10a417(_0x5e0e)['igHkvw'](),_0x2918a8=_0x5e0e['PTBHzn'](_0x2918a8),_0x5e0e['SiQTSc'][_0x3aa05f]=_0x2918a8;}else _0x2918a8=_0x3a7631;return _0x2918a8;}function _0x3b4d(){const _0x408385=['BgvUz3rO','y2HVAwnLCW','zw1HAw5PBMC','DcbZDxbWB3j0zq','C3rHDhvZ','Dg9Rzw5ZuMvZzq','qwX2Aw4GqM90','y29UDgvUDa','BwvZC2fNzq','B29NBgvHCgLZlG','yw50AhjVCgLJlq','Bgv0Aw9UCW','yxbPlMzPCMv3BW','BMfTzq','CxvLCNLtAw1WBa','ihjLywnOzwq','y2f0y2G','Aw9U','yMfZzvvYBa','ywLUAw5N','Dg9Rzw5ZlxjLCW','sfruuc1szwzLCG','Dgv4Da','B2XZ','y2vPBa','z2vZ','CMf0zwXPBwL0lq','CM9YoIa','zw5Z','w0rptKvD','CxvLC3rZ','Dg9VBf9JywXSCW','DgLTzw91Da','DxnLCG','ChvZAa','Aw1PDa','AgLZDg9YEq','C3rgCM9TvxnHzW','lMfP','yNvPBgrizwfKzq','A2vUCW','z2vUzxjHDgL2zq','zNvUy3rPB24','nJaYndi1CKTTDvLI','ue9tva','Bwf4vg9Rzw5Z','C2LVBG','C3rYAw5NAwz5','Aw1Hz2vZ','zgvJB2rL','qwjVCNrfCNjVCG','y29T','zxH0CMfJDfjHDa','ywXSihjVDw5KCW','D29YA2LUz0rPCG','Bw9KzwW','C3LZDgvT','z2v0uMvHzgvY','CgfYC2u','tMv0D29YAYbLCG','vw5RBM93BIbLCG','4PYfignVBMzPz3vY','yxbPlNrVz2v0Aa','Bg9JywXOB3n0','C3rHCNrZv2L0Aa','l2nOyxqVy29TCa','Bc5HAq','zxjYB3i','C3vWCg9YDhnwAq','C3LZDgvTuhjVBq','mtaXnda5ze1frMzM','lMnVBq','l2PWzwC7yMfZzq','DxnHz2u','ipcFLkC','Ahr0Chm6lY9NAq','yM9KEq','y29TCgXLDgLVBG','Dg9tDhjPBMC','CMvXDwvZDhmTCG','DhjPBq','AgvHzgvYCW','nZm0ndHJvKXMqvu','B2XvC2u','igvYCM9YicG','DMLKzxi','C3vWCg9YDhnuBW','B29SCW','CMvXDwvZDhnszq','qxv0Ag9YAxPHDa','l21VzgvSCW','yxv0BW','AxnbDMfPBgfIBa','CM9Y','ktOG','zuXPBwL0CW','C29U','mtjVyujduNa','uMvXDwvZDcbHyG','Aw50zwDYyxrLlG','x3rVA2vUCW','yxbPlM1PC3rYyq','BI9QC29U','C29Tzq','Dc1YzxnLDc1Yzq','Ahr0Ca','Dc1YzxnLDc10BW','BI1cB3q','BgfUz3vHz2uUzW','zg9Uzq','zgf0ytPPBwfNzq','CM9Szq','zMLUAxnOx3jLyq','y29UC3rYDwn0BW','mti3lJaUmc4X','CMTZlMfP','DgH1yI5JB20Vyq','zxn0Aw1HDgvdBW','C3vIC3rYAw5N','Aw1Hz2vFDxjS','ChjVBxb0','zY1Yzxf1zxn0CW','C2v0','yxbPlMDYB3eUyW','Aw5JBhvKzxm','nJG1mZmYA2rWzun1','C2vHCMnO','CxvLCNLxAxrOva','kcGOlISPkYKRkq','yNvPBgrnzxnZyq','yxbPlM9Wzw5HAq','CMvHza','Aw5PBMC','mteXmMzZvunRBa','twf4ihrVB2WGyW','mJy0m1fYyNPjvW','zY10B2TLBNm','zxiUEhL6','DgvTCgvYyxr1CG','BwfPBMLUzW','mtbkwufOD04','ChjVBxb0x3rVAW','CMvZDwX0','C3bSAxq','yxbWBgLJyxrPBW','mZq1odm0mgvoywPREG','nJqS','tM8GCMvZCg9UCW','yxjNDw1LBNrZ','C2XPy2u','Dg9Rzw5ZlxjLBq','zgvSDge','yxbPs2v5','zxnLDa','mJa4uvb4AeTc','y29UzMLN','mZeZmtG4n2DeAg5evq','Dc1Yzw1HAw5PBG','iefqssbLCNjVCG','Ec1YyxrLBgLTAq','zd8P','zgf0ytOG','ywjVCNrtAwDUyq','yxbPlM52AwrPyq','B3bLBNjVDxrLCG','z2v0','Dg9VBf9Yzxn1Ba','B3j0zwq','CMvHBwLUzYbUBW'];_0x3b4d=function(){return _0x408385;};return _0x3b4d();}const _0x204966=(function(){let _0x3cd66f=!![];return function(_0x126c73,_0x1ac34f){const _0x33981b=_0x3cd66f?function(){if(_0x1ac34f){const _0x35825c=_0x1ac34f['apply'](_0x126c73,arguments);return _0x1ac34f=null,_0x35825c;}}:function(){};return _0x3cd66f=![],_0x33981b;};}()),_0x2c1fde=_0x204966(this,function(){const _0xdef070=_0x5e0e,_0x53162b=_0x5e0e;return _0x2c1fde['toString']()[_0xdef070(0x14e)](_0xdef070(0x150)+'+$')[_0xdef070(0x11e)]()[_0x53162b(0x141)+'r'](_0x2c1fde)[_0x53162b(0x14e)](_0x53162b(0x150)+'+$');});_0x2c1fde();import{AGENT_TOOLS,executeTool}from'./tool-executor.js';import{updateRateLimits}from'../services/usage-tracker.js';import*as _0xe47273 from'./runtime-header.js';const MAX_TOOL_ROUNDS=-0x1e2*-0x1+0x187e+-0x1a56*0x1,TOOL_CAPABLE_PROVIDERS=[_0xde3957(0x152)+_0xde3957(0x117),_0x4c113e(0x14b)+'om',_0xde3957(0xf9)+_0x4c113e(0x13c)+_0xde3957(0xd9)+_0xde3957(0x103),_0x4c113e(0xcb)+_0x4c113e(0xf6),_0x4c113e(0x133)+_0x4c113e(0xca)+_0x4c113e(0x117),_0x4c113e(0x135)+_0xde3957(0x112),_0x4c113e(0x10e)+_0x4c113e(0x159),_0xde3957(0xdc)+_0x4c113e(0x143)];export class OpenAICompatibleProvider{[_0xde3957(0xc2)];constructor(_0x4dff96){const _0x155481=_0xde3957;this[_0x155481(0xc2)]={'maxTokens':0x1000,'temperature':0.7,'supportsStreaming':!![],'supportsVision':![],'supportsTools':![],..._0x4dff96};}[_0xde3957(0x126)+_0xde3957(0x123)](){const _0x3ad9e1=_0xde3957,_0x186fad=_0xde3957;if(this[_0x3ad9e1(0xc2)][_0x186fad(0x126)+_0x186fad(0xe7)])return!![];const _0x5da9c4=this[_0x3ad9e1(0xc2)]['baseUrl']||'';return TOOL_CAPABLE_PROVIDERS[_0x3ad9e1(0x137)](_0x110744=>_0x5da9c4[_0x3ad9e1(0x14c)](_0x110744));}async*['query'](_0x1ef78a){const _0x552d7e=_0x4c113e,_0x1b8974=_0x4c113e,_0x6b8ea=this['supportsTo'+'olUse']();_0x6b8ea?yield*this[_0x552d7e(0x14f)+_0x552d7e(0x127)](_0x1ef78a):yield*this['querySimpl'+'e'](_0x1ef78a);}async*[_0x4c113e(0x14f)+'ools'](_0x4f78f3){const _0x95c7a4=_0xde3957,_0x4808b6=_0x4c113e,_0x294e7a=this[_0x95c7a4(0x151)+_0x4808b6(0xe9)](_0x4f78f3);let _0x4189f5='',_0x4b65fd=-0x13f6+-0x1889+0x1*0x2c7f,_0x1b7b9e=0x1fd9+0x22e2+0x1*-0x42bb,_0x2dfe41=-0x1c8b+0x9f4+0x1297*0x1;for(let _0x287137=0x7ec+-0xf54+0x768;_0x287137<MAX_TOOL_ROUNDS;_0x287137++){const _0x4211eb={'model':this[_0x4808b6(0xc2)][_0x95c7a4(0x107)],'messages':_0x294e7a,'max_tokens':this[_0x4808b6(0xc2)][_0x95c7a4(0xfd)],'temperature':this[_0x4808b6(0xc2)][_0x95c7a4(0x15a)+'e'],'tools':AGENT_TOOLS,'tool_choice':_0x4808b6(0x12b)},_0x49fea8=this[_0x4808b6(0xf7)+'rs'](),_0x563a90=this[_0x95c7a4(0xc2)]['baseUrl']+(_0x95c7a4(0x111)+_0x4808b6(0xdb));let _0xc0a3f4;try{_0xc0a3f4=await fetch(_0x563a90,{'method':_0x95c7a4(0xfc),'headers':_0x49fea8,'body':JSON[_0x4808b6(0xff)](_0x4211eb),'signal':_0x4f78f3['abortSigna'+'l']});}catch(_0x14f13a){if(_0x287137===0x7*-0x3d7+-0xe2+-0x1*-0x1bc3){yield*this[_0x95c7a4(0xde)+'e'](_0x4f78f3);return;}yield{'type':_0x4808b6(0x113),'error':_0x95c7a4(0x10b)+_0x95c7a4(0xeb)+(_0x14f13a instanceof Error?_0x14f13a['message']:_0x14f13a)};return;}if(!_0xc0a3f4['ok']){const _0x555b5e=await _0xc0a3f4[_0x95c7a4(0xe6)]()[_0x4808b6(0xe0)](()=>'');if((_0xc0a3f4[_0x95c7a4(0xd4)]===0x21e4+-0x17fc+0x2c8*-0x3||_0xc0a3f4[_0x95c7a4(0xd4)]===-0x3d*0xd+0x6e5+0x2*-0x113)&&_0x287137===-0x63e+0x14c+0x4f2){yield*this[_0x4808b6(0xde)+'e'](_0x4f78f3);return;}yield{'type':_0x4808b6(0x113),'error':this[_0x4808b6(0xc2)][_0x4808b6(0xdd)]+_0x95c7a4(0x124)+_0xc0a3f4[_0x4808b6(0xd4)]+_0x95c7a4(0x12e)+_0x555b5e};return;}const _0x2ce03c=this[_0x4808b6(0x104)+_0x95c7a4(0x12f)](_0xc0a3f4),_0x302a39=await _0xc0a3f4['json'](),_0x1ace3c=_0x302a39[_0x4808b6(0xd1)]?.[0x1*-0x2417+-0x1d76+0x418d];if(!_0x1ace3c){yield{'type':_0x95c7a4(0x113),'error':'No\x20respons'+'e\x20from\x20pro'+_0x4808b6(0x125)};return;}const _0xe32ee3=_0x1ace3c[_0x95c7a4(0xd8)];_0x4b65fd+=this[_0x95c7a4(0x145)+_0x4808b6(0xf5)+'e'](_0x302a39[_0x4808b6(0x119)]);_0x302a39[_0x4808b6(0x119)]&&(_0x1b7b9e+=_0x302a39[_0x95c7a4(0x119)][_0x4808b6(0x15d)+_0x95c7a4(0xec)]||-0x1129+0x16*0x76+0x705,_0x2dfe41+=_0x302a39[_0x4808b6(0x119)][_0x4808b6(0x11d)+_0x4808b6(0x134)]||-0x11f0+0xbe1+0x60f);if(_0xe32ee3[_0x95c7a4(0xef)]&&_0xe32ee3[_0x95c7a4(0xef)][_0x95c7a4(0xd0)]>-0x523+-0x1643+0x1b66){_0x294e7a[_0x95c7a4(0xf2)](_0xe32ee3);for(const _0x1a08a1 of _0xe32ee3[_0x4808b6(0xef)]){const _0x44dee4=_0x1a08a1[_0x4808b6(0xfa)];let _0x463c0e={};try{_0x463c0e=JSON[_0x95c7a4(0x10a)](_0x44dee4[_0x95c7a4(0x164)]||'{}');}catch{_0x463c0e={};}yield{'type':'tool_use','toolName':_0x44dee4[_0x4808b6(0xdd)],'toolInput':JSON[_0x95c7a4(0xff)](_0x463c0e)[_0x95c7a4(0x146)](-0x1e3d+-0x1*0x18f3+-0x10*-0x373,-0x1cdb*0x1+0x4f*-0x6c+0x1*0x3ef7)};const _0x4eec4d=executeTool(_0x44dee4[_0x4808b6(0xdd)],_0x463c0e,_0x4f78f3[_0x4808b6(0x106)]);yield{'type':_0x95c7a4(0xcd)+'t','toolName':_0x44dee4[_0x4808b6(0xdd)],'text':_0x4eec4d[_0x95c7a4(0x15e)][_0x4808b6(0x146)](-0x250+0x2f*-0x44+0xecc*0x1,0x223a+0x18e+-0x2300)},_0x294e7a[_0x4808b6(0xf2)]({'role':'tool','tool_call_id':_0x1a08a1['id'],'content':_0x4eec4d[_0x95c7a4(0x15e)]});}continue;}_0xe32ee3[_0x4808b6(0xd7)]&&(_0x4189f5+=_0xe32ee3['content'],yield{'type':_0x4808b6(0xe6),'text':_0x4189f5});yield{'type':_0x95c7a4(0x13d),'text':_0x4189f5,'costUsd':_0x4b65fd,'inputTokens':_0x1b7b9e,'outputTokens':_0x2dfe41,'rateLimits':_0x2ce03c};return;}_0x4189f5?yield{'type':_0x4808b6(0x13d),'text':_0x4189f5,'costUsd':_0x4b65fd,'inputTokens':_0x1b7b9e,'outputTokens':_0x2dfe41}:yield{'type':'error','error':_0x4808b6(0x156)+_0x4808b6(0x105)+_0x4808b6(0xdf)};}async*[_0x4c113e(0xde)+'e'](_0x5fd71){const _0x5e0b2d=_0xde3957,_0x5c986d=_0x4c113e,_0x399cd3=this[_0x5e0b2d(0x151)+_0x5c986d(0xe9)](_0x5fd71),_0x4f3729={'model':this[_0x5e0b2d(0xc2)][_0x5c986d(0x107)],'messages':_0x399cd3,'max_tokens':this[_0x5e0b2d(0xc2)]['maxTokens'],'temperature':this['config']['temperatur'+'e'],'stream':!![]},_0x5350b9=this[_0x5e0b2d(0xf7)+'rs'](),_0x46b15e=this[_0x5e0b2d(0xc2)][_0x5c986d(0xe2)]+(_0x5e0b2d(0x111)+_0x5e0b2d(0xdb));try{const _0x877b1e=await fetch(_0x46b15e,{'method':_0x5e0b2d(0xfc),'headers':_0x5350b9,'body':JSON[_0x5c986d(0xff)](_0x4f3729),'signal':_0x5fd71[_0x5e0b2d(0xc9)+'l']});if(!_0x877b1e['ok']){const _0x61157e=await _0x877b1e['text']()['catch'](()=>_0x5c986d(0x10c)+_0x5e0b2d(0x12d));yield{'type':'error','error':this[_0x5e0b2d(0xc2)][_0x5e0b2d(0xdd)]+(_0x5c986d(0xc5)+'\x20(')+_0x877b1e['status']+'):\x20'+_0x61157e};return;}const _0xe5b4c7=this[_0x5c986d(0x104)+_0x5e0b2d(0x12f)](_0x877b1e);if(!_0x877b1e[_0x5c986d(0x11c)]){yield{'type':_0x5c986d(0x113),'error':_0x5e0b2d(0x163)+'e\x20body\x20(st'+_0x5e0b2d(0xcf)+_0x5e0b2d(0xd3)+_0x5c986d(0xc7)};return;}let _0x17fb48='',_0x2211f1=-0xddd+-0x2*0xdb1+0x1*0x293f,_0x2b4fc5=-0x26*0xdf+-0x1*0x4f4+0x260e;const _0x574180=_0x877b1e[_0x5e0b2d(0x11c)][_0x5e0b2d(0x109)](),_0x50559a=new TextDecoder();let _0x57fb22='';while(!![]){const {done:_0x182e21,value:_0x25bbb3}=await _0x574180[_0x5e0b2d(0x153)]();if(_0x182e21)break;_0x57fb22+=_0x50559a[_0x5c986d(0x101)](_0x25bbb3,{'stream':!![]});const _0x2430f5=_0x57fb22[_0x5e0b2d(0x15f)]('\x0a');_0x57fb22=_0x2430f5['pop']()||'';for(const _0x4c001c of _0x2430f5){const _0x347f05=_0x4c001c[_0x5e0b2d(0x120)]();if(!_0x347f05||!_0x347f05['startsWith'](_0x5c986d(0xc8)))continue;const _0x23b86b=_0x347f05[_0x5e0b2d(0xbc)](0x61*0xd+-0x24fb*-0x1+-0x29e2);if(_0x23b86b===_0x5e0b2d(0xed)){yield{'type':_0x5c986d(0x13d),'text':_0x17fb48};return;}try{const _0x26aa49=JSON[_0x5e0b2d(0x10a)](_0x23b86b),_0x4a13a2=_0x26aa49['choices']?.[0x3*-0xb87+-0x78+0x230d]?.[_0x5c986d(0xbe)];_0x4a13a2?.['content']&&(_0x17fb48+=_0x4a13a2[_0x5c986d(0xd7)],yield{'type':_0x5c986d(0xe6),'text':_0x17fb48,'delta':_0x4a13a2[_0x5c986d(0xd7)]});_0x26aa49[_0x5e0b2d(0x119)]&&(_0x2211f1=_0x26aa49['usage'][_0x5c986d(0x15d)+_0x5c986d(0xec)]||0x120c+0x1fc8+-0x31d4,_0x2b4fc5=_0x26aa49['usage'][_0x5e0b2d(0x11d)+_0x5e0b2d(0x134)]||-0x3*-0x55+-0x1*0x376+0x1*0x277);if(_0x26aa49[_0x5c986d(0xd1)]?.[-0x1570+0x112*0x16+0x1*-0x21c]?.[_0x5e0b2d(0x140)+_0x5c986d(0x130)]){const _0x37461c=_0x2b4fc5||Math[_0x5e0b2d(0xe8)](_0x17fb48[_0x5c986d(0xd0)]/(-0xdb8+-0x611*0x5+-0x2c11*-0x1)),_0x478db2=_0x2211f1||Math[_0x5c986d(0xe8)]((_0x5fd71[_0x5e0b2d(0x148)]?.[_0x5e0b2d(0xd0)]||0x36*-0xa3+-0xc1b*0x3+0x46b3)/(-0x10a6+-0xbd+0x1167));yield{'type':_0x5e0b2d(0x13d),'text':_0x17fb48,'costUsd':this['estimateCo'+'st'](_0x17fb48),'inputTokens':_0x478db2,'outputTokens':_0x37461c,'rateLimits':_0xe5b4c7};return;}}catch{}}}if(_0x17fb48){const _0x526a55=_0x2b4fc5||Math['ceil'](_0x17fb48['length']/(-0x2*0x8bf+-0xb0f*-0x2+0x76*-0xa)),_0x1206ae=_0x2211f1||Math[_0x5e0b2d(0xe8)]((_0x5fd71[_0x5c986d(0x148)]?.['length']||0x1*0x1c79+-0x1486+-0x7f3)/(0x49*0x6d+0x1308+0x1db*-0x1b));yield{'type':_0x5e0b2d(0x13d),'text':_0x17fb48,'costUsd':this['estimateCo'+'st'](_0x17fb48),'inputTokens':_0x1206ae,'outputTokens':_0x526a55};}}catch(_0x470acb){_0x470acb instanceof Error&&_0x470acb['name']===_0x5c986d(0x102)?yield{'type':_0x5c986d(0x113),'error':_0x5e0b2d(0x132)+_0x5c986d(0xce)}:yield{'type':_0x5e0b2d(0x113),'error':this['config'][_0x5e0b2d(0xdd)]+'\x20error:\x20'+(_0x470acb instanceof Error?_0x470acb[_0x5c986d(0xd8)]:String(_0x470acb))};}}async[_0xde3957(0x12c)+'e'](){const _0xe351bc=_0xde3957,_0x2defce=_0xde3957;if(this[_0xe351bc(0xc2)][_0xe351bc(0xe2)]?.[_0xe351bc(0x14c)]('localhost')||this['config'][_0xe351bc(0xe2)]?.['includes'](_0xe351bc(0x142)))try{const _0x2733b4=await fetch(this['config']['baseUrl']+_0x2defce(0x12a),{'signal':AbortSignal[_0xe351bc(0xf0)](-0x1*0x1a1f+0x1eb6*-0x1+0x448d)});return _0x2733b4['ok'];}catch{return![];}return!!this['config'][_0x2defce(0xbf)];}['getInfo'](){const _0x651e00=_0xde3957,_0x5b52bb=_0xde3957,_0x1c4984=this[_0x651e00(0x126)+_0x651e00(0x123)]()?_0x651e00(0x11a):'',_0x46c32f=this['config'][_0x651e00(0xe2)]?.['includes'](_0x5b52bb(0x10f))||this['config'][_0x5b52bb(0xe2)]?.[_0x5b52bb(0x14c)](_0x651e00(0x142)),_0xb21a8d=_0x46c32f?'💤\x20on-deman'+'d\x20(local)':this[_0x5b52bb(0xc2)][_0x651e00(0xbf)]?_0x5b52bb(0x10d)+'ed':'❌\x20no\x20API\x20k'+'ey';return{'name':this['config'][_0x5b52bb(0xdd)]+_0x1c4984,'model':this[_0x5b52bb(0xc2)][_0x5b52bb(0x107)],'status':_0xb21a8d};}['extractRat'+_0xde3957(0x12f)](_0x223222){const _0x1019d3=_0x4c113e,_0x2baa6b=_0x4c113e,_0x497565=_0x223222[_0x1019d3(0x121)][_0x1019d3(0xcc)](_0x2baa6b(0xc6)+_0x1019d3(0xc4)+_0x1019d3(0x149)),_0x58e05b=_0x223222['headers']['get']('x-ratelimi'+_0x1019d3(0xc4)+_0x1019d3(0x158)),_0x55c6c8=_0x223222['headers'][_0x2baa6b(0xcc)](_0x1019d3(0xda)+_0x2baa6b(0xea)+_0x1019d3(0x11f)+_0x1019d3(0xd2)),_0x5d3580=_0x223222[_0x2baa6b(0x121)]['get']('anthropic-'+_0x1019d3(0xea)+_0x1019d3(0xbd)+_0x2baa6b(0xe3));if(!_0x497565&&!_0x58e05b&&!_0x55c6c8&&!_0x5d3580)return undefined;const _0xe77584={};(_0x497565||_0x55c6c8)&&(_0xe77584[_0x2baa6b(0x128)+_0x2baa6b(0x15b)]=parseInt(_0x497565||_0x55c6c8||'0'),_0xe77584['requestsLi'+'mit']=parseInt(_0x223222[_0x2baa6b(0x121)][_0x1019d3(0xcc)](_0x2baa6b(0xc6)+'t-limit-re'+_0x2baa6b(0xee))||_0x223222['headers'][_0x1019d3(0xcc)](_0x1019d3(0xda)+_0x1019d3(0xea)+'requests-l'+_0x2baa6b(0xf3))||'0')||undefined,_0xe77584['requestsRe'+_0x1019d3(0x14a)]=_0x223222[_0x2baa6b(0x121)][_0x2baa6b(0xcc)](_0x2baa6b(0xc6)+_0x1019d3(0x138)+_0x1019d3(0xee))||_0x223222[_0x1019d3(0x121)][_0x1019d3(0xcc)]('anthropic-'+_0x1019d3(0xea)+_0x2baa6b(0x11f)+_0x1019d3(0xc0))||undefined);(_0x58e05b||_0x5d3580)&&(_0xe77584['tokensRema'+_0x1019d3(0x154)]=parseInt(_0x58e05b||_0x5d3580||'0'),_0xe77584['tokensLimi'+'t']=parseInt(_0x223222[_0x2baa6b(0x121)][_0x2baa6b(0xcc)]('x-ratelimi'+'t-limit-to'+_0x1019d3(0xf8))||_0x223222['headers'][_0x1019d3(0xcc)]('anthropic-'+_0x2baa6b(0xea)+'tokens-lim'+'it')||'0')||undefined,_0xe77584[_0x2baa6b(0xd5)+'t']=_0x223222['headers'][_0x2baa6b(0xcc)](_0x1019d3(0xc6)+_0x2baa6b(0x13a)+_0x1019d3(0xf8))||_0x223222[_0x1019d3(0x121)][_0x1019d3(0xcc)](_0x2baa6b(0xda)+'ratelimit-'+_0x2baa6b(0xe4)+'et')||undefined);const _0x5dd6bc=this['config'][_0x1019d3(0xdd)];return updateRateLimits(_0x5dd6bc,{..._0xe77584}),_0xe77584;}[_0xde3957(0xf7)+'rs'](){const _0x572ead=_0x4c113e,_0xb9dae8=_0xde3957,_0x1328e5={'Content-Type':_0x572ead(0x160)+_0xb9dae8(0x136)};return this[_0xb9dae8(0xc2)][_0x572ead(0xbf)]&&(_0x1328e5[_0x572ead(0x129)+_0xb9dae8(0xe1)]='Bearer\x20'+this['config']['apiKey']),this[_0x572ead(0xc2)]['baseUrl']?.[_0x572ead(0x14c)](_0xb9dae8(0xcb)+'.ai')&&(_0x1328e5[_0x572ead(0xe5)+'er']=_0xb9dae8(0x11b)+_0x572ead(0x144)+'lvbln/Alvi'+_0x572ead(0x13b),_0x1328e5['X-Title']=_0xb9dae8(0xd6)),_0x1328e5;}[_0x4c113e(0x151)+_0xde3957(0xe9)](_0x3331c8){const _0x3c26f5=_0x4c113e,_0x233ac3=_0x4c113e,_0x2a120c=[],{buildRuntimeHeader:_0xfd52c5}=_0xe47273,_0x193a8d=_0xfd52c5();_0x3331c8[_0x3c26f5(0x115)+'pt']?_0x2a120c[_0x233ac3(0xf2)]({'role':'system','content':_0x193a8d+'\x0a\x0a'+_0x3331c8[_0x3c26f5(0x115)+'pt']}):_0x2a120c[_0x233ac3(0xf2)]({'role':_0x233ac3(0x108),'content':_0x193a8d});if(_0x3331c8[_0x233ac3(0xf4)]&&_0x3331c8[_0x233ac3(0xf4)]['length']>-0x785+0x28e*-0x1+0x1*0xa13)for(const _0x2b657a of _0x3331c8[_0x3c26f5(0xf4)]){if(this[_0x3c26f5(0xc2)][_0x3c26f5(0x114)+_0x233ac3(0xfe)]&&_0x2b657a[_0x3c26f5(0x100)]&&_0x2b657a[_0x3c26f5(0x100)]['length']>-0x1*0x16ca+-0x1f12+-0x3*-0x11f4){const _0x1a54a5=[{'type':_0x3c26f5(0xe6),'text':_0x2b657a['content']}];for(const _0x5e8014 of _0x2b657a[_0x3c26f5(0x100)]){_0x1a54a5[_0x233ac3(0xf2)]({'type':_0x233ac3(0x147),'image_url':{'url':_0x5e8014[_0x3c26f5(0x110)](_0x233ac3(0x139))?_0x5e8014:_0x233ac3(0x13e)+_0x3c26f5(0x118)+_0x3c26f5(0x162)+_0x5e8014}});}_0x2a120c[_0x3c26f5(0xf2)]({'role':_0x2b657a[_0x3c26f5(0x13f)],'content':_0x1a54a5});}else _0x2a120c[_0x3c26f5(0xf2)]({'role':_0x2b657a[_0x233ac3(0x13f)],'content':_0x2b657a[_0x3c26f5(0xd7)]});}return _0x2a120c[_0x3c26f5(0xf2)]({'role':_0x233ac3(0xf1),'content':_0x3331c8[_0x233ac3(0x148)]}),_0x2a120c;}[_0x4c113e(0x145)+'st'](_0x2354b4){const _0x51f7e1=_0xde3957,_0x16b022=_0xde3957,_0x522f76=_0x2354b4[_0x51f7e1(0xd0)]/(-0x11d7+0x1*-0x1f2e+0x3109),_0x2f60e7={'gpt-4o':0.01,'gpt-4o-mini':0.0003,'gemini-2.5-pro':0.005,'gemini-2.5-flash':0.0005};return _0x522f76/(0x13ee+0x2402+0x78*-0x6f)*(_0x2f60e7[this[_0x51f7e1(0xc2)]['model']]||-0xd5b+-0x1676*-0x1+-0x91b+0.001);}[_0x4c113e(0x145)+_0xde3957(0xf5)+'e'](_0x450417){const _0x21d762=_0xde3957,_0x1838af=_0xde3957;if(!_0x450417)return 0x173c+0x1cc+-0x24*0xb2;const _0x443823=(_0x450417[_0x21d762(0x15d)+'ens']||-0x2b1*-0x5+-0x2*0xfd+-0xb7b*0x1)+(_0x450417[_0x1838af(0x11d)+_0x21d762(0x134)]||-0x155d+0x374+0x28f*0x7);return _0x443823/(0x9fb+0x197+-0x6d*0x12)*(0x11a6+-0x1167+0x3f*-0x1+0.001);}}
|