freegate 0.6.27 → 0.6.29

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/lib/compactor.js CHANGED
@@ -19,8 +19,10 @@ const KEEP_RECENT_TOKENS = 12000; // tokens — recent messages kept untouched (
19
19
  // блок → на длинной сессии тонула и переставала вызывать
20
20
  // инструменты («замирала»). 12000 — стабильный баланс, как
21
21
  // в рабочем «раньше», но с небольшим запасом.
22
- const MAX_COMPACT_THRESHOLD = 100000; // est tokens — cap for window-aware thresholds (≈200k real,
23
- // sits safely inside even 512k/1M windows without compacting too early)
22
+ const MAX_COMPACT_THRESHOLD = 200000; // est tokens — cap для window-aware порогов. Большие окна
23
+ // (dots-3 512k, minimax 1M) держат ~100-200k живого диалога
24
+ // без компакции — не сжимаем раньше, чем реально нужно.
25
+ // Раньше cap 100k жал 150k-контексты, хотя модель годится.
24
26
  const SUMMARY_MAX_TOKENS = 2000; // tokens — summary length cap (detailed enough to not lose the work)
25
27
  const CHARS_PER_TOKEN = 3.5; // heuristic chars→tokens. Реальная плотность ~3.5-4 chars
26
28
  // на токен для кода/текста (был 3.6 изначально и работало).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "freegate",
3
- "version": "0.6.27",
3
+ "version": "0.6.29",
4
4
  "description": "Free multi-provider LLM gateway with automatic failover. One OpenAI-compatible endpoint routes to many free models (Groq, Mistral, Gemini, NIM, OpenRouter, ZAI, Cerebras, DeepSeek and more). Never pay for LLMs.",
5
5
  "license": "MIT",
6
6
  "bin": {
package/providers.json CHANGED
@@ -666,7 +666,7 @@
666
666
  "gemini-gemini-flash-lite-latest": {
667
667
  "endpoint": "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions",
668
668
  "model": "gemini-flash-lite-latest",
669
- "priority": 4,
669
+ "priority": 2,
670
670
  "dailyLimit": 1500,
671
671
  "keyHint": "gemini → Keys (автодобавлено, general)",
672
672
  "envVar": "PROVIDER_GEMINI_APIKEY",
@@ -696,7 +696,7 @@
696
696
  "gemini-gemini-3-5-flash-lite": {
697
697
  "endpoint": "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions",
698
698
  "model": "gemini-3.5-flash-lite",
699
- "priority": 2,
699
+ "priority": 4,
700
700
  "dailyLimit": 1500,
701
701
  "keyHint": "gemini → Keys (автодобавлено, general)",
702
702
  "envVar": "PROVIDER_GEMINI_APIKEY",
@@ -712,15 +712,5 @@
712
712
  "envVar": "PROVIDER_GEMINI_APIKEY",
713
713
  "free": true,
714
714
  "category": "general"
715
- },
716
- "hf-Qwen3-Coder-Next": {
717
- "endpoint": "https://router.huggingface.co/v1/chat/completions",
718
- "model": "Qwen/Qwen3-Coder-Next",
719
- "priority": 1,
720
- "dailyLimit": 200,
721
- "keyHint": "huggingface → Keys (автодобавлено, coding)",
722
- "envVar": "PROVIDER_HF_APIKEY",
723
- "free": true,
724
- "category": "coding"
725
715
  }
726
716
  }
package/server.js CHANGED
@@ -164,6 +164,10 @@ const autoUpdate = require('./lib/autoupdate');
164
164
  const AUTO_UPDATE = (config.autoUpdate && typeof config.autoUpdate === 'object') ? config.autoUpdate : {};
165
165
  const diagMonitor = require('./lib/diagmonitor');
166
166
  const DIAG_MONITOR = (config.diagMonitor && typeof config.diagMonitor === 'object') ? config.diagMonitor : { enabled: true, intervalMs: 30 * 60 * 1000 };
167
+ // Прокси-компакция по умолчанию ВЫКЛЮЧЕНА: её делает клиент (opencode/BigPickle),
168
+ // который знает структуру диалога. Прокси не переписывает контент — иначе агент
169
+ // теряет рабочий контекст и «не продолжает». Включить: {"compacter":{"enabled":true}}.
170
+ const COMPACTER_ENABLED = !!(config.compacter && config.compacter.enabled);
167
171
  const modelManager = new ModelManager({
168
172
  dbPath: path.join(__dirname, 'models-db.json'),
169
173
  catalogPath: path.join(__dirname, 'providers.json'),
@@ -430,7 +434,12 @@ async function handleChatCompletion(req, res, body) {
430
434
  // Runs AFTER the vision pipeline (images already converted to text above).
431
435
  // Skipped in window-upgrade mode — the big provider takes the raw context.
432
436
  if (Array.isArray(body.messages)) measure.origTokens = estimateTokens(body.messages);
433
- if (Array.isArray(body.messages) && body.messages.length > 0 && !windowUpgraded) {
437
+ // Прокси-компакция ОПЦИОНАЛЬНА (config.compacter.enabled, по умолчанию false).
438
+ // Компактит сам клиент (opencode auto-compaction / BigPickle) — он знает
439
+ // смысловую структуру диалога и сохраняет «что осталось сделать». Прокси лишь
440
+ // роутит и не должен переписывать контент — иначе агент теряет нить.
441
+ // Окно-роутинг (ниже) остаётся всегда: выбирает провайдера под размер запроса.
442
+ if (COMPACTER_ENABLED && !windowUpgraded) {
434
443
  body.messages = await prepareMessages(body.messages, { contextWindow: PROVIDERS[targetProviderKey]?.context_window || 0 });
435
444
  }
436
445
  // Контекстная телеметрия: токены после компакции + доля системного промпта.