freegate 0.6.18 → 0.6.21
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/.env.example +13 -1
- package/README.md +9 -4
- package/README.ru.md +9 -3
- package/assets/dashboard-en.gif +0 -0
- package/assets/dashboard-en.png +0 -0
- package/assets/dashboard-models-en.png +0 -0
- package/assets/dashboard.gif +0 -0
- package/bin/freegate.js +107 -0
- package/config.example.json +33 -0
- package/lib/cache.js +19 -4
- package/lib/compress.js +85 -0
- package/lib/dashboard.js +156 -11
- package/lib/doctor.js +106 -0
- package/lib/health.js +48 -0
- package/lib/modelmanager.js +14 -0
- package/lib/modelscan.js +7 -2
- package/lib/onboarding.js +79 -0
- package/lib/setup.js +136 -0
- package/lib/strategy.js +57 -0
- package/lib/vetting.js +91 -0
- package/package.json +1 -1
- package/providers.json +335 -1
- package/server.js +120 -6
package/lib/setup.js
CHANGED
|
@@ -193,6 +193,135 @@ const KEY_GROUPS = {
|
|
|
193
193
|
'Paste it into the field below',
|
|
194
194
|
],
|
|
195
195
|
},
|
|
196
|
+
PROVIDER_SAMBANOVA_APIKEY: {
|
|
197
|
+
name: 'SambaNova',
|
|
198
|
+
name_en: 'SambaNova',
|
|
199
|
+
url: 'https://cloud.sambanova.ai/',
|
|
200
|
+
description: 'MiniMax-M2.7, DeepSeek-V3.2, gpt-oss-120b. Очень быстрый инференс, бесплатно.',
|
|
201
|
+
description_en: 'MiniMax-M2.7, DeepSeek-V3.2, gpt-oss-120b. Very fast inference, free.',
|
|
202
|
+
steps: [
|
|
203
|
+
'Зайди на cloud.sambanova.ai и зарегистрируйся',
|
|
204
|
+
'Перейди в Settings → API Keys',
|
|
205
|
+
'Создай ключ и скопируй',
|
|
206
|
+
'Вставь в поле ниже',
|
|
207
|
+
],
|
|
208
|
+
steps_en: [
|
|
209
|
+
'Go to cloud.sambanova.ai and register',
|
|
210
|
+
'Go to Settings → API Keys',
|
|
211
|
+
'Create a key and copy it',
|
|
212
|
+
'Paste it into the field below',
|
|
213
|
+
],
|
|
214
|
+
},
|
|
215
|
+
PROVIDER_SILICONFLOW_APIKEY: {
|
|
216
|
+
name: 'SiliconFlow',
|
|
217
|
+
name_en: 'SiliconFlow',
|
|
218
|
+
url: 'https://cloud.siliconflow.com/account/ak',
|
|
219
|
+
description: 'DeepSeek-R1, Qwen3-Coder, Kimi-K2.5, GLM-4.7. Крупный бесплатный каталог.',
|
|
220
|
+
description_en: 'DeepSeek-R1, Qwen3-Coder, Kimi-K2.5, GLM-4.7. Large free catalog.',
|
|
221
|
+
steps: [
|
|
222
|
+
'Зайди на cloud.siliconflow.com и зарегистрируйся',
|
|
223
|
+
'Перейди в API Keys',
|
|
224
|
+
'Создай ключ (sk-...)',
|
|
225
|
+
'Вставь в поле ниже',
|
|
226
|
+
],
|
|
227
|
+
steps_en: [
|
|
228
|
+
'Go to cloud.siliconflow.com and register',
|
|
229
|
+
'Go to API Keys',
|
|
230
|
+
'Create a key (sk-...)',
|
|
231
|
+
'Paste it into the field below',
|
|
232
|
+
],
|
|
233
|
+
},
|
|
234
|
+
PROVIDER_DEEPINFRA_APIKEY: {
|
|
235
|
+
name: 'DeepInfra',
|
|
236
|
+
name_en: 'DeepInfra',
|
|
237
|
+
url: 'https://deepinfra.com/dash/api_keys',
|
|
238
|
+
description: 'gpt-oss-120b/20b, Nemotron-Super-120B, Llama-4. Бесплатный инференс.',
|
|
239
|
+
description_en: 'gpt-oss-120b/20b, Nemotron-Super-120B, Llama-4. Free inference.',
|
|
240
|
+
steps: [
|
|
241
|
+
'Зайди на deepinfra.com и зарегистрируйся',
|
|
242
|
+
'Перейди в Dashboard → API Keys',
|
|
243
|
+
'Создай ключ и скопируй',
|
|
244
|
+
'Вставь в поле ниже',
|
|
245
|
+
],
|
|
246
|
+
steps_en: [
|
|
247
|
+
'Go to deepinfra.com and register',
|
|
248
|
+
'Go to Dashboard → API Keys',
|
|
249
|
+
'Create a key and copy it',
|
|
250
|
+
'Paste it into the field below',
|
|
251
|
+
],
|
|
252
|
+
},
|
|
253
|
+
PROVIDER_HYPERBOLIC_APIKEY: {
|
|
254
|
+
name: 'Hyperbolic',
|
|
255
|
+
name_en: 'Hyperbolic',
|
|
256
|
+
url: 'https://app.hyperbolic.xyz/',
|
|
257
|
+
description: 'DeepSeek-V3, Qwen-Coder, Llama-3.3-70B. Бесплатный старт с кредитом.',
|
|
258
|
+
description_en: 'DeepSeek-V3, Qwen-Coder, Llama-3.3-70B. Free start with credit.',
|
|
259
|
+
steps: [
|
|
260
|
+
'Зайди на app.hyperbolic.xyz и зарегистрируйся',
|
|
261
|
+
'Перейди в Settings → API Keys',
|
|
262
|
+
'Создай ключ и скопируй',
|
|
263
|
+
'Вставь в поле ниже',
|
|
264
|
+
],
|
|
265
|
+
steps_en: [
|
|
266
|
+
'Go to app.hyperbolic.xyz and register',
|
|
267
|
+
'Go to Settings → API Keys',
|
|
268
|
+
'Create a key and copy it',
|
|
269
|
+
'Paste it into the field below',
|
|
270
|
+
],
|
|
271
|
+
},
|
|
272
|
+
PROVIDER_COHERE_APIKEY: {
|
|
273
|
+
name: 'Cohere',
|
|
274
|
+
name_en: 'Cohere',
|
|
275
|
+
url: 'https://dashboard.cohere.com/',
|
|
276
|
+
description: 'Command A, Command R+. Бесплатный Trial-ключ.',
|
|
277
|
+
description_en: 'Command A, Command R+. Free trial key.',
|
|
278
|
+
steps: [
|
|
279
|
+
'Зайди на dashboard.cohere.com и зарегистрируйся',
|
|
280
|
+
'Перейди в API Keys',
|
|
281
|
+
'Создай Trial-ключ',
|
|
282
|
+
'Вставь в поле ниже',
|
|
283
|
+
],
|
|
284
|
+
steps_en: [
|
|
285
|
+
'Go to dashboard.cohere.com and register',
|
|
286
|
+
'Go to API Keys',
|
|
287
|
+
'Create a trial key',
|
|
288
|
+
'Paste it into the field below',
|
|
289
|
+
],
|
|
290
|
+
},
|
|
291
|
+
PROVIDER_LLM7_APIKEY: {
|
|
292
|
+
name: 'LLM7',
|
|
293
|
+
name_en: 'LLM7',
|
|
294
|
+
url: 'https://llm7.io/',
|
|
295
|
+
description: 'gpt-4o-mini, DeepSeek-R1, Qwen2.5-Coder. Бесплатный ключ при регистрации.',
|
|
296
|
+
description_en: 'gpt-4o-mini, DeepSeek-R1, Qwen2.5-Coder. Free key on signup.',
|
|
297
|
+
steps: [
|
|
298
|
+
'Зайди на llm7.io и зарегистрируйся',
|
|
299
|
+
'Получи бесплатный API-ключ',
|
|
300
|
+
'Вставь в поле ниже',
|
|
301
|
+
],
|
|
302
|
+
steps_en: [
|
|
303
|
+
'Go to llm7.io and register',
|
|
304
|
+
'Get the free API key',
|
|
305
|
+
'Paste it into the field below',
|
|
306
|
+
],
|
|
307
|
+
},
|
|
308
|
+
PROVIDER_NARA_APIKEY: {
|
|
309
|
+
name: 'Nara (bynara)',
|
|
310
|
+
name_en: 'Nara (bynara)',
|
|
311
|
+
url: 'https://nara.ai/',
|
|
312
|
+
description: 'Mistral Large/Medium, Tencent Hy3. Бесплатный ключ через их Telegram-канал.',
|
|
313
|
+
description_en: 'Mistral Large/Medium, Tencent Hy3. Free key via their Telegram channel.',
|
|
314
|
+
steps: [
|
|
315
|
+
'Зайди на nara.ai / вступи в их Telegram-канал',
|
|
316
|
+
'Получи бесплатный ключ',
|
|
317
|
+
'Вставь в поле ниже',
|
|
318
|
+
],
|
|
319
|
+
steps_en: [
|
|
320
|
+
'Go to nara.ai / join their Telegram channel',
|
|
321
|
+
'Get the free key',
|
|
322
|
+
'Paste it into the field below',
|
|
323
|
+
],
|
|
324
|
+
},
|
|
196
325
|
};
|
|
197
326
|
|
|
198
327
|
// --- .env file path resolution (mirrors lib/providers.js logic) ---
|
|
@@ -282,6 +411,13 @@ async function validateKey(envVar, apiKey) {
|
|
|
282
411
|
PROVIDER_CEREBRAS_APIKEY: 'https://api.cerebras.ai/v1/models',
|
|
283
412
|
PROVIDER_DEEPSEEK_APIKEY: 'https://api.deepseek.com/models',
|
|
284
413
|
PROVIDER_HF_APIKEY: 'https://router.huggingface.co/v1/models',
|
|
414
|
+
PROVIDER_SAMBANOVA_APIKEY: 'https://api.sambanova.ai/v1/models',
|
|
415
|
+
PROVIDER_SILICONFLOW_APIKEY: 'https://api.siliconflow.com/v1/models',
|
|
416
|
+
PROVIDER_DEEPINFRA_APIKEY: 'https://api.deepinfra.com/v1/openai/models',
|
|
417
|
+
PROVIDER_HYPERBOLIC_APIKEY: 'https://api.hyperbolic.xyz/v1/models',
|
|
418
|
+
PROVIDER_COHERE_APIKEY: 'https://api.cohere.com/compatibility/v1/models',
|
|
419
|
+
PROVIDER_LLM7_APIKEY: 'https://api.llm7.io/v1/models',
|
|
420
|
+
PROVIDER_NARA_APIKEY: 'https://router.bynara.id/v1/models',
|
|
285
421
|
};
|
|
286
422
|
|
|
287
423
|
const url = testEndpoints[envVar];
|
package/lib/strategy.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// lib/strategy.js — дополнительные стратегии роутинга (по мотивам OmniRoute).
|
|
2
|
+
// Базовый выбор в Freegate — weighted (скор/латентность + категория + лимиты).
|
|
3
|
+
// Здесь — опциональные модификаторы, которые НЕ заменяют основной скоринг, а
|
|
4
|
+
// подмешивают к нему равномерность использования (round-robin / least-used),
|
|
5
|
+
// чтобы не «прилипать» к одному провайдеру и ровнее расходовать free-лимиты.
|
|
6
|
+
//
|
|
7
|
+
// Управление: config.routing.strategy = 'weighted' | 'weighted-roundrobin' | 'weighted-least'.
|
|
8
|
+
// Всегда остаётся fallback на weighted (стратегия лишь меняет вес, не исключает).
|
|
9
|
+
|
|
10
|
+
const STRATEGIES = ['weighted', 'weighted-roundrobin', 'weighted-least'];
|
|
11
|
+
|
|
12
|
+
const ROUND_ROBIN_BOOST = 1.6; // во сколько раз поднимаем «следующего по кругу»
|
|
13
|
+
const LEAST_USED_BOOST = 1.5; // поднимаем провайдеров с наименьшим использованием
|
|
14
|
+
|
|
15
|
+
// Кольцевой счётчик round-robin по совокупности провайдеров.
|
|
16
|
+
let rrCursor = 0;
|
|
17
|
+
|
|
18
|
+
function normalizeStrategy(value) {
|
|
19
|
+
const s = String(value || 'weighted').toLowerCase();
|
|
20
|
+
return STRATEGIES.includes(s) ? s : 'weighted';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Вернуть функцию-модификатор веса для конкретного провайдера.
|
|
24
|
+
// ctx: { key, provider, usedTodayList } — usedTodayList: {key: count} за день.
|
|
25
|
+
function makeWeightModifier(strategy, ctx = {}) {
|
|
26
|
+
const s = normalizeStrategy(strategy);
|
|
27
|
+
if (s === 'weighted') {
|
|
28
|
+
return () => 1; // ничего не меняем
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const usedTodayList = ctx.usedTodayList || {};
|
|
32
|
+
|
|
33
|
+
if (s === 'weighted-roundrobin') {
|
|
34
|
+
// Поднимаем провайдера, который «следующий по кругу». Простейшая реализация:
|
|
35
|
+
// модуль хранит курсор; при выборе провайдера cursor == его позиции — буст.
|
|
36
|
+
const keys = ctx.keys || [];
|
|
37
|
+
const nextKey = keys.length > 0 ? keys[rrCursor % keys.length] : null;
|
|
38
|
+
rrCursor++;
|
|
39
|
+
return (key) => (key === nextKey ? ROUND_ROBIN_BOOST : 1);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (s === 'weighted-least') {
|
|
43
|
+
// Поднимаем тех, кто использован меньше среднего.
|
|
44
|
+
const counts = Object.values(usedTodayList);
|
|
45
|
+
const avg = counts.length > 0 ? counts.reduce((a, b) => a + b, 0) / counts.length : 0;
|
|
46
|
+
return (key) => {
|
|
47
|
+
const used = usedTodayList[key] || 0;
|
|
48
|
+
return used < avg ? LEAST_USED_BOOST : 1;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return () => 1;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function resetRoundRobin() { rrCursor = 0; }
|
|
56
|
+
|
|
57
|
+
module.exports = { STRATEGIES, normalizeStrategy, makeWeightModifier, resetRoundRobin, ROUND_ROBIN_BOOST, LEAST_USED_BOOST };
|
package/lib/vetting.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// lib/vetting.js — самопроверка ответа второй моделью.
|
|
2
|
+
// После получения ответа от free-модели (не-stream) отправляем краткий чек
|
|
3
|
+
// другой модели: выявить фактические/логические ошибки. Экономит free-лимиты:
|
|
4
|
+
// включается только по конфигу и только когда ответ достаточно содержательный.
|
|
5
|
+
const logger = require('./logger');
|
|
6
|
+
|
|
7
|
+
const VETTING_DEFAULTS = {
|
|
8
|
+
enabled: false, // выкл по умолчанию — жжёт 2-й лимит на каждый запрос
|
|
9
|
+
minAnswerLen: 120, // мельче — нечего проверять
|
|
10
|
+
maxChecksPerMin: 4, // троттлинг: не больше N проверок в минуту
|
|
11
|
+
complexityOnly: true, // только сложные/кодинг-задачи
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const SYSTEM = 'Ты — строгий проверяльщик. Перечитай ответ, который дал другой ИИ, и найди ФАКТИЧЕСКИЕ или ЛОГИЧЕСКИЕ ошибки. Отвечай ТОЛЬКО одним из: "OK" (если ошибок нет) или "Замечание: <кратко, 1 фраза>" (если есть реальная ошибка). Не выдумывай — проверяй только то, что очевидно неверно. Не хвали и не повторяй ответ.';
|
|
15
|
+
|
|
16
|
+
// Проверить, стоит ли вообще запускать проверку.
|
|
17
|
+
function shouldVet({ config = {}, complexity = 0, answerLen = 0, category = '' } = {}) {
|
|
18
|
+
const cfg = Object.assign({}, VETTING_DEFAULTS, config);
|
|
19
|
+
if (!cfg.enabled) return false;
|
|
20
|
+
if (answerLen < cfg.minAnswerLen) return false;
|
|
21
|
+
// complexityOnly: vetting только для coding/design/reasoning (сложных задач);
|
|
22
|
+
// поиск/чат не тратим лишний лимит.
|
|
23
|
+
if (cfg.complexityOnly) {
|
|
24
|
+
const complexCats = new Set(['coding', 'design', 'reasoning']);
|
|
25
|
+
if (complexCats.has(category)) return true;
|
|
26
|
+
if (complexity >= 0.5) return true;
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Разобрать ответ проверяльщика → { ok:boolean, note:string }
|
|
33
|
+
function parseVerdict(text) {
|
|
34
|
+
const s = String(text || '').trim();
|
|
35
|
+
if (!s) return { ok: true, note: '' };
|
|
36
|
+
if (/^\s*ok\b/i.test(s)) return { ok: true, note: '' };
|
|
37
|
+
const m = s.match(/замечание\s*[:\-]?\s*(.*)/i);
|
|
38
|
+
if (m && m[1] && m[1].trim()) return { ok: false, note: m[1].trim().slice(0, 200) };
|
|
39
|
+
// Иначе считаем OK (неопределённый ответ не блокируем).
|
|
40
|
+
return { ok: true, note: '' };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Троттлинг: кольцевой буфер времени последних проверок.
|
|
44
|
+
let lastChecks = [];
|
|
45
|
+
|
|
46
|
+
function allowCheck(now = Date.now(), maxPerMin = VETTING_DEFAULTS.maxChecksPerMin) {
|
|
47
|
+
if (!Array.isArray(lastChecks)) lastChecks = [];
|
|
48
|
+
const cutoff = now - 60000;
|
|
49
|
+
lastChecks = lastChecks.filter((t) => t > cutoff);
|
|
50
|
+
if (lastChecks.length >= maxPerMin) return false;
|
|
51
|
+
lastChecks.push(now);
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function resetThrottle() { lastChecks = []; }
|
|
56
|
+
|
|
57
|
+
// Запустить проверку: body = второй вызов к провайдеру (callProvider).
|
|
58
|
+
// Вернёт { checked:boolean, ok:boolean, note:string }.
|
|
59
|
+
async function vetAnswer({ answer, callProvider, picks = [], config = {}, now = Date.now() }) {
|
|
60
|
+
const cfg = Object.assign({}, VETTING_DEFAULTS, config);
|
|
61
|
+
if (!answer || typeof answer !== 'string') return { checked: false, ok: true, note: '' };
|
|
62
|
+
if (!picks || picks.length === 0) return { checked: false, ok: true, note: '' };
|
|
63
|
+
if (!allowCheck(now, cfg.maxChecksPerMin)) return { checked: false, ok: true, note: '' };
|
|
64
|
+
|
|
65
|
+
// Пробуем других провайдеров (не тот, что дал ответ), пока один не проверит.
|
|
66
|
+
for (const provider of picks) {
|
|
67
|
+
try {
|
|
68
|
+
const result = await callProvider(provider, {
|
|
69
|
+
model: provider.model,
|
|
70
|
+
messages: [
|
|
71
|
+
{ role: 'system', content: SYSTEM },
|
|
72
|
+
{ role: 'user', content: 'Проверь этот ответ на ошибки. Ответ:\n\n' + answer.slice(0, 4000) },
|
|
73
|
+
],
|
|
74
|
+
temperature: 0,
|
|
75
|
+
max_tokens: 120,
|
|
76
|
+
}, 20000, 1);
|
|
77
|
+
const text = result && result.data && result.data.choices && result.data.choices[0] &&
|
|
78
|
+
result.data.choices[0].message && result.data.choices[0].message.content;
|
|
79
|
+
if (text && text.trim()) {
|
|
80
|
+
const verdict = parseVerdict(text);
|
|
81
|
+
return { checked: true, ok: verdict.ok, note: verdict.note, by: provider.key || provider.model };
|
|
82
|
+
}
|
|
83
|
+
} catch (err) {
|
|
84
|
+
// пробуем следующего
|
|
85
|
+
logger.debug('vetting failed', { provider: provider.key, error: err.message });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { checked: false, ok: true, note: '' };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
module.exports = { shouldVet, parseVerdict, vetAnswer, allowCheck, resetThrottle, VETTING_DEFAULTS, SYSTEM };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "freegate",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.21",
|
|
4
4
|
"description": "Free multi-provider LLM gateway with automatic failover. One OpenAI-compatible endpoint routes to 25 free models (Groq, Mistral, Gemini, NIM, OpenRouter, ZAI, Cerebras, DeepSeek). Never pay for LLMs.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"bin": {
|
package/providers.json
CHANGED
|
@@ -370,5 +370,339 @@
|
|
|
370
370
|
"envVar": "PROVIDER_MISTRAL_APIKEY",
|
|
371
371
|
"free": true,
|
|
372
372
|
"category": "coding"
|
|
373
|
+
},
|
|
374
|
+
"sambanova-gpt-oss-120b": {
|
|
375
|
+
"endpoint": "https://api.sambanova.ai/v1/chat/completions",
|
|
376
|
+
"model": "gpt-oss-120b",
|
|
377
|
+
"priority": 12,
|
|
378
|
+
"dailyLimit": 100000,
|
|
379
|
+
"keyHint": "cloud.sambanova.ai → API Keys",
|
|
380
|
+
"envVar": "PROVIDER_SAMBANOVA_APIKEY",
|
|
381
|
+
"free": true,
|
|
382
|
+
"category": "general",
|
|
383
|
+
"context_window": 131072
|
|
384
|
+
},
|
|
385
|
+
"sambanova-minimax-m2": {
|
|
386
|
+
"endpoint": "https://api.sambanova.ai/v1/chat/completions",
|
|
387
|
+
"model": "MiniMax-M2.7",
|
|
388
|
+
"priority": 13,
|
|
389
|
+
"dailyLimit": 100000,
|
|
390
|
+
"keyHint": "cloud.sambanova.ai → API Keys",
|
|
391
|
+
"envVar": "PROVIDER_SAMBANOVA_APIKEY",
|
|
392
|
+
"free": true,
|
|
393
|
+
"category": "reasoning",
|
|
394
|
+
"context_window": 131072
|
|
395
|
+
},
|
|
396
|
+
"sambanova-deepseek-v3": {
|
|
397
|
+
"endpoint": "https://api.sambanova.ai/v1/chat/completions",
|
|
398
|
+
"model": "DeepSeek-V3.2",
|
|
399
|
+
"priority": 13,
|
|
400
|
+
"dailyLimit": 100000,
|
|
401
|
+
"keyHint": "cloud.sambanova.ai → API Keys",
|
|
402
|
+
"envVar": "PROVIDER_SAMBANOVA_APIKEY",
|
|
403
|
+
"free": true,
|
|
404
|
+
"category": "reasoning",
|
|
405
|
+
"context_window": 131072
|
|
406
|
+
},
|
|
407
|
+
"sambanova-llama4-maverick": {
|
|
408
|
+
"endpoint": "https://api.sambanova.ai/v1/chat/completions",
|
|
409
|
+
"model": "Llama-4-Maverick-17B-128E-Instruct",
|
|
410
|
+
"priority": 13,
|
|
411
|
+
"dailyLimit": 100000,
|
|
412
|
+
"keyHint": "cloud.sambanova.ai → API Keys",
|
|
413
|
+
"envVar": "PROVIDER_SAMBANOVA_APIKEY",
|
|
414
|
+
"free": true,
|
|
415
|
+
"category": "general",
|
|
416
|
+
"context_window": 1000000
|
|
417
|
+
},
|
|
418
|
+
"sambanova-llama3.3-70b": {
|
|
419
|
+
"endpoint": "https://api.sambanova.ai/v1/chat/completions",
|
|
420
|
+
"model": "Meta-Llama-3.3-70B-Instruct",
|
|
421
|
+
"priority": 14,
|
|
422
|
+
"dailyLimit": 100000,
|
|
423
|
+
"keyHint": "cloud.sambanova.ai → API Keys",
|
|
424
|
+
"envVar": "PROVIDER_SAMBANOVA_APIKEY",
|
|
425
|
+
"free": true,
|
|
426
|
+
"category": "general",
|
|
427
|
+
"context_window": 131072
|
|
428
|
+
},
|
|
429
|
+
"siliconflow-deepseek-r1": {
|
|
430
|
+
"endpoint": "https://api.siliconflow.com/v1/chat/completions",
|
|
431
|
+
"model": "deepseek-ai/DeepSeek-R1",
|
|
432
|
+
"priority": 12,
|
|
433
|
+
"dailyLimit": 100000,
|
|
434
|
+
"keyHint": "cloud.siliconflow.com → API Keys",
|
|
435
|
+
"envVar": "PROVIDER_SILICONFLOW_APIKEY",
|
|
436
|
+
"free": true,
|
|
437
|
+
"category": "reasoning",
|
|
438
|
+
"context_window": 131072
|
|
439
|
+
},
|
|
440
|
+
"siliconflow-qwen3-coder": {
|
|
441
|
+
"endpoint": "https://api.siliconflow.com/v1/chat/completions",
|
|
442
|
+
"model": "Qwen/Qwen3-Coder-480B-A35B-Instruct",
|
|
443
|
+
"priority": 12,
|
|
444
|
+
"dailyLimit": 100000,
|
|
445
|
+
"keyHint": "cloud.siliconflow.com → API Keys",
|
|
446
|
+
"envVar": "PROVIDER_SILICONFLOW_APIKEY",
|
|
447
|
+
"free": true,
|
|
448
|
+
"category": "coding",
|
|
449
|
+
"context_window": 131072
|
|
450
|
+
},
|
|
451
|
+
"siliconflow-qwen3-235b": {
|
|
452
|
+
"endpoint": "https://api.siliconflow.com/v1/chat/completions",
|
|
453
|
+
"model": "Qwen/Qwen3-235B-A22B-Instruct-2507",
|
|
454
|
+
"priority": 13,
|
|
455
|
+
"dailyLimit": 100000,
|
|
456
|
+
"keyHint": "cloud.siliconflow.com → API Keys",
|
|
457
|
+
"envVar": "PROVIDER_SILICONFLOW_APIKEY",
|
|
458
|
+
"free": true,
|
|
459
|
+
"category": "reasoning",
|
|
460
|
+
"context_window": 131072
|
|
461
|
+
},
|
|
462
|
+
"siliconflow-kimi-k2": {
|
|
463
|
+
"endpoint": "https://api.siliconflow.com/v1/chat/completions",
|
|
464
|
+
"model": "moonshotai/Kimi-K2.5",
|
|
465
|
+
"priority": 13,
|
|
466
|
+
"dailyLimit": 100000,
|
|
467
|
+
"keyHint": "cloud.siliconflow.com → API Keys",
|
|
468
|
+
"envVar": "PROVIDER_SILICONFLOW_APIKEY",
|
|
469
|
+
"free": true,
|
|
470
|
+
"category": "general",
|
|
471
|
+
"context_window": 131072
|
|
472
|
+
},
|
|
473
|
+
"siliconflow-glm": {
|
|
474
|
+
"endpoint": "https://api.siliconflow.com/v1/chat/completions",
|
|
475
|
+
"model": "zai-org/GLM-4.7",
|
|
476
|
+
"priority": 14,
|
|
477
|
+
"dailyLimit": 100000,
|
|
478
|
+
"keyHint": "cloud.siliconflow.com → API Keys",
|
|
479
|
+
"envVar": "PROVIDER_SILICONFLOW_APIKEY",
|
|
480
|
+
"free": true,
|
|
481
|
+
"category": "general",
|
|
482
|
+
"context_window": 131072
|
|
483
|
+
},
|
|
484
|
+
"deepinfra-gpt-oss-120b": {
|
|
485
|
+
"endpoint": "https://api.deepinfra.com/v1/openai/chat/completions",
|
|
486
|
+
"model": "openai/gpt-oss-120b",
|
|
487
|
+
"priority": 12,
|
|
488
|
+
"dailyLimit": 100000,
|
|
489
|
+
"keyHint": "deepinfra.com → API Keys",
|
|
490
|
+
"envVar": "PROVIDER_DEEPINFRA_APIKEY",
|
|
491
|
+
"free": true,
|
|
492
|
+
"category": "general",
|
|
493
|
+
"context_window": 131072
|
|
494
|
+
},
|
|
495
|
+
"deepinfra-gpt-oss-20b": {
|
|
496
|
+
"endpoint": "https://api.deepinfra.com/v1/openai/chat/completions",
|
|
497
|
+
"model": "openai/gpt-oss-20b",
|
|
498
|
+
"priority": 13,
|
|
499
|
+
"dailyLimit": 100000,
|
|
500
|
+
"keyHint": "deepinfra.com → API Keys",
|
|
501
|
+
"envVar": "PROVIDER_DEEPINFRA_APIKEY",
|
|
502
|
+
"free": true,
|
|
503
|
+
"category": "general",
|
|
504
|
+
"context_window": 131072
|
|
505
|
+
},
|
|
506
|
+
"deepinfra-nemotron-super-120b": {
|
|
507
|
+
"endpoint": "https://api.deepinfra.com/v1/openai/chat/completions",
|
|
508
|
+
"model": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B",
|
|
509
|
+
"priority": 12,
|
|
510
|
+
"dailyLimit": 100000,
|
|
511
|
+
"keyHint": "deepinfra.com → API Keys",
|
|
512
|
+
"envVar": "PROVIDER_DEEPINFRA_APIKEY",
|
|
513
|
+
"free": true,
|
|
514
|
+
"category": "reasoning",
|
|
515
|
+
"context_window": 131072
|
|
516
|
+
},
|
|
517
|
+
"deepinfra-llama-4-maverick": {
|
|
518
|
+
"endpoint": "https://api.deepinfra.com/v1/openai/chat/completions",
|
|
519
|
+
"model": "meta-llama/Llama-4-Maverick-17B-128E-Instruct",
|
|
520
|
+
"priority": 14,
|
|
521
|
+
"dailyLimit": 100000,
|
|
522
|
+
"keyHint": "deepinfra.com → API Keys",
|
|
523
|
+
"envVar": "PROVIDER_DEEPINFRA_APIKEY",
|
|
524
|
+
"free": true,
|
|
525
|
+
"category": "general",
|
|
526
|
+
"context_window": 1000000
|
|
527
|
+
},
|
|
528
|
+
"hyperbolic-deepseek-v3": {
|
|
529
|
+
"endpoint": "https://api.hyperbolic.xyz/v1/chat/completions",
|
|
530
|
+
"model": "deepseek-ai/DeepSeek-V3",
|
|
531
|
+
"priority": 14,
|
|
532
|
+
"dailyLimit": 100000,
|
|
533
|
+
"keyHint": "app.hyperbolic.xyz → API Keys",
|
|
534
|
+
"envVar": "PROVIDER_HYPERBOLIC_APIKEY",
|
|
535
|
+
"free": true,
|
|
536
|
+
"category": "reasoning",
|
|
537
|
+
"context_window": 131072
|
|
538
|
+
},
|
|
539
|
+
"hyperbolic-qwen3-coder": {
|
|
540
|
+
"endpoint": "https://api.hyperbolic.xyz/v1/chat/completions",
|
|
541
|
+
"model": "Qwen/Qwen2.5-Coder-32B-Instruct",
|
|
542
|
+
"priority": 14,
|
|
543
|
+
"dailyLimit": 100000,
|
|
544
|
+
"keyHint": "app.hyperbolic.xyz → API Keys",
|
|
545
|
+
"envVar": "PROVIDER_HYPERBOLIC_APIKEY",
|
|
546
|
+
"free": true,
|
|
547
|
+
"category": "coding",
|
|
548
|
+
"context_window": 131072
|
|
549
|
+
},
|
|
550
|
+
"hyperbolic-llama-70b": {
|
|
551
|
+
"endpoint": "https://api.hyperbolic.xyz/v1/chat/completions",
|
|
552
|
+
"model": "meta-llama/Llama-3.3-70B-Instruct",
|
|
553
|
+
"priority": 15,
|
|
554
|
+
"dailyLimit": 100000,
|
|
555
|
+
"keyHint": "app.hyperbolic.xyz → API Keys",
|
|
556
|
+
"envVar": "PROVIDER_HYPERBOLIC_APIKEY",
|
|
557
|
+
"free": true,
|
|
558
|
+
"category": "general",
|
|
559
|
+
"context_window": 131072
|
|
560
|
+
},
|
|
561
|
+
"cohere-command-a": {
|
|
562
|
+
"endpoint": "https://api.cohere.com/compatibility/v1/chat/completions",
|
|
563
|
+
"model": "command-a-03-2025",
|
|
564
|
+
"priority": 15,
|
|
565
|
+
"dailyLimit": 100000,
|
|
566
|
+
"keyHint": "dashboard.cohere.com → API Keys",
|
|
567
|
+
"envVar": "PROVIDER_COHERE_APIKEY",
|
|
568
|
+
"free": true,
|
|
569
|
+
"category": "reasoning",
|
|
570
|
+
"context_window": 131072
|
|
571
|
+
},
|
|
572
|
+
"cohere-command-r-plus": {
|
|
573
|
+
"endpoint": "https://api.cohere.com/compatibility/v1/chat/completions",
|
|
574
|
+
"model": "command-r-plus-08-2024",
|
|
575
|
+
"priority": 16,
|
|
576
|
+
"dailyLimit": 100000,
|
|
577
|
+
"keyHint": "dashboard.cohere.com → API Keys",
|
|
578
|
+
"envVar": "PROVIDER_COHERE_APIKEY",
|
|
579
|
+
"free": true,
|
|
580
|
+
"category": "general",
|
|
581
|
+
"context_window": 131072
|
|
582
|
+
},
|
|
583
|
+
"llm7-gpt4o-mini": {
|
|
584
|
+
"endpoint": "https://api.llm7.io/v1/chat/completions",
|
|
585
|
+
"model": "gpt-4o-mini-2024-07-18",
|
|
586
|
+
"priority": 13,
|
|
587
|
+
"dailyLimit": 100000,
|
|
588
|
+
"keyHint": "llm7.io (бесплатный ключ при регистрации)",
|
|
589
|
+
"envVar": "PROVIDER_LLM7_APIKEY",
|
|
590
|
+
"free": true,
|
|
591
|
+
"category": "general",
|
|
592
|
+
"context_window": 131072
|
|
593
|
+
},
|
|
594
|
+
"llm7-deepseek-r1": {
|
|
595
|
+
"endpoint": "https://api.llm7.io/v1/chat/completions",
|
|
596
|
+
"model": "deepseek-r1-0528",
|
|
597
|
+
"priority": 13,
|
|
598
|
+
"dailyLimit": 100000,
|
|
599
|
+
"keyHint": "llm7.io (бесплатный ключ при регистрации)",
|
|
600
|
+
"envVar": "PROVIDER_LLM7_APIKEY",
|
|
601
|
+
"free": true,
|
|
602
|
+
"category": "reasoning",
|
|
603
|
+
"context_window": 131072
|
|
604
|
+
},
|
|
605
|
+
"nara-mistral-large": {
|
|
606
|
+
"endpoint": "https://router.bynara.id/v1/chat/completions",
|
|
607
|
+
"model": "mistral-large",
|
|
608
|
+
"priority": 13,
|
|
609
|
+
"dailyLimit": 100000,
|
|
610
|
+
"keyHint": "nara — бесплатный ключ через Telegram-канал",
|
|
611
|
+
"envVar": "PROVIDER_NARA_APIKEY",
|
|
612
|
+
"free": true,
|
|
613
|
+
"category": "general",
|
|
614
|
+
"context_window": 252000
|
|
615
|
+
},
|
|
616
|
+
"nara-mistral-medium": {
|
|
617
|
+
"endpoint": "https://router.bynara.id/v1/chat/completions",
|
|
618
|
+
"model": "mistral-medium-3-5",
|
|
619
|
+
"priority": 14,
|
|
620
|
+
"dailyLimit": 100000,
|
|
621
|
+
"keyHint": "nara — бесплатный ключ через Telegram-канал",
|
|
622
|
+
"envVar": "PROVIDER_NARA_APIKEY",
|
|
623
|
+
"free": true,
|
|
624
|
+
"category": "general",
|
|
625
|
+
"context_window": 256000
|
|
626
|
+
},
|
|
627
|
+
"nara-tencent-hy3": {
|
|
628
|
+
"endpoint": "https://router.bynara.id/v1/chat/completions",
|
|
629
|
+
"model": "tencent-hy3",
|
|
630
|
+
"priority": 14,
|
|
631
|
+
"dailyLimit": 100000,
|
|
632
|
+
"keyHint": "nara — бесплатный ключ через Telegram-канал",
|
|
633
|
+
"envVar": "PROVIDER_NARA_APIKEY",
|
|
634
|
+
"free": true,
|
|
635
|
+
"category": "general",
|
|
636
|
+
"context_window": 1000000
|
|
637
|
+
},
|
|
638
|
+
"gemini-gemma-4-26b-a4b-it": {
|
|
639
|
+
"endpoint": "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions",
|
|
640
|
+
"model": "gemma-4-26b-a4b-it",
|
|
641
|
+
"priority": 1,
|
|
642
|
+
"dailyLimit": 1500,
|
|
643
|
+
"keyHint": "gemini → Keys (автодобавлено, general)",
|
|
644
|
+
"envVar": "PROVIDER_GEMINI_APIKEY",
|
|
645
|
+
"free": true,
|
|
646
|
+
"category": "general"
|
|
647
|
+
},
|
|
648
|
+
"gemini-gemma-4-31b-it": {
|
|
649
|
+
"endpoint": "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions",
|
|
650
|
+
"model": "gemma-4-31b-it",
|
|
651
|
+
"priority": 5,
|
|
652
|
+
"dailyLimit": 1500,
|
|
653
|
+
"keyHint": "gemini → Keys (автодобавлено, general)",
|
|
654
|
+
"envVar": "PROVIDER_GEMINI_APIKEY",
|
|
655
|
+
"free": true,
|
|
656
|
+
"category": "general"
|
|
657
|
+
},
|
|
658
|
+
"gemini-gemini-flash-lite-latest": {
|
|
659
|
+
"endpoint": "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions",
|
|
660
|
+
"model": "gemini-flash-lite-latest",
|
|
661
|
+
"priority": 2,
|
|
662
|
+
"dailyLimit": 1500,
|
|
663
|
+
"keyHint": "gemini → Keys (автодобавлено, general)",
|
|
664
|
+
"envVar": "PROVIDER_GEMINI_APIKEY",
|
|
665
|
+
"free": true,
|
|
666
|
+
"category": "general"
|
|
667
|
+
},
|
|
668
|
+
"gemini-gemini-3-1-flash-lite-preview": {
|
|
669
|
+
"endpoint": "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions",
|
|
670
|
+
"model": "gemini-3.1-flash-lite-preview",
|
|
671
|
+
"priority": 6,
|
|
672
|
+
"dailyLimit": 1500,
|
|
673
|
+
"keyHint": "gemini → Keys (автодобавлено, general)",
|
|
674
|
+
"envVar": "PROVIDER_GEMINI_APIKEY",
|
|
675
|
+
"free": true,
|
|
676
|
+
"category": "general"
|
|
677
|
+
},
|
|
678
|
+
"gemini-gemini-3-5-flash": {
|
|
679
|
+
"endpoint": "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions",
|
|
680
|
+
"model": "gemini-3.5-flash",
|
|
681
|
+
"priority": 4,
|
|
682
|
+
"dailyLimit": 1500,
|
|
683
|
+
"keyHint": "gemini → Keys (автодобавлено, general)",
|
|
684
|
+
"envVar": "PROVIDER_GEMINI_APIKEY",
|
|
685
|
+
"free": true,
|
|
686
|
+
"category": "general"
|
|
687
|
+
},
|
|
688
|
+
"gemini-gemini-3-5-flash-lite": {
|
|
689
|
+
"endpoint": "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions",
|
|
690
|
+
"model": "gemini-3.5-flash-lite",
|
|
691
|
+
"priority": 3,
|
|
692
|
+
"dailyLimit": 1500,
|
|
693
|
+
"keyHint": "gemini → Keys (автодобавлено, general)",
|
|
694
|
+
"envVar": "PROVIDER_GEMINI_APIKEY",
|
|
695
|
+
"free": true,
|
|
696
|
+
"category": "general"
|
|
697
|
+
},
|
|
698
|
+
"gemini-gemini-3-1-flash-lite": {
|
|
699
|
+
"endpoint": "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions",
|
|
700
|
+
"model": "gemini-3.1-flash-lite",
|
|
701
|
+
"priority": 7,
|
|
702
|
+
"dailyLimit": 1500,
|
|
703
|
+
"keyHint": "gemini → Keys (автодобавлено, general)",
|
|
704
|
+
"envVar": "PROVIDER_GEMINI_APIKEY",
|
|
705
|
+
"free": true,
|
|
706
|
+
"category": "general"
|
|
373
707
|
}
|
|
374
|
-
}
|
|
708
|
+
}
|