Skip to content

Latest commit

 

History

History
326 lines (256 loc) · 11.3 KB

File metadata and controls

326 lines (256 loc) · 11.3 KB

CHANGELOG v2 — LLM-MCP 2026.02.7

[2026.02.7] - 2026-02-08

⭐ КРИТИЧНЫЕ УЛУЧШЕНИЯ

🔄 Planner — новый модуль планировщика

Революционное изменение: Вынесены все фоновые процессы в отдельную папку planner/ для будущего выделения в автономный модуль.

Структура:

planner/
├── README.md                           # Документация planner
├── internal/
│   ├── sync/
│   │   ├── openrouter.go              # Автосинхронизация моделей
│   │   └── benchmark_protection.go     # Защита от дорогих бенчмарков
│   └── cleanup/
│       └── jobs.go                     # Очистка старых jobs

Что делает:

  • Автоматическая синхронизация топ-100 моделей OpenRouter каждые 24 часа
  • Умная фильтрация по цене (не дороже $100/1M токенов)
  • Автоочистка старых done/error jobs (>7 дней)
  • Защита от случайного бенчмарка дорогих моделей

🚀 Автосинхронизация моделей OpenRouter

Проблема: Ручное добавление моделей через sync_openrouter_models.py Решение: Автоматическая синхронизация при старте + периодическая

Новые переменные окружения:

OPENROUTER_SYNC_INTERVAL=24        # Интервал синхронизации (часы)
OPENROUTER_TOP_N=100                # Сколько топ моделей сохранять
OPENROUTER_MAX_PRICE_PER_1M=100.0   # Максимальная цена (USD/1M токенов)
OPENROUTER_SYNC_ON_STARTUP=1        # Синхронизировать при старте

Алгоритм выбора топ-100:

  1. Фильтрация по цене (не дороже OPENROUTER_MAX_PRICE_PER_1M)
  2. Расчёт score = (context_length / 1000) / (avg_price + 0.01)
  3. Сортировка по score (убывание)
  4. Топ-N моделей сохраняются в БД с ценами

Логи:

planner/sync: fetching OpenRouter models (top_n=100, max_price=100.00 USD/1M)
planner/sync: received 523 models from OpenRouter
planner/sync: filtered to 187 models (price <= 100.00)
planner/sync: selected top 100 models
planner/sync: synced 100/100 models
planner/sync: OpenRouter sync started (interval=24h)

🛡️ Защита от дорогих бенчмарков

Проблема: Бенчмарк мог запустить тест дорогой модели и улететь по деньгам Решение: Автоматическая проверка цены перед запуском бенчмарка

Новая переменная:

BENCHMARK_MAX_PRICE_PER_1M=10.0     # Максимальная цена для бенчмарка (USD/1M)

Как работает:

  • Перед постановкой benchmark job проверяется цена модели
  • Если price_in > BENCHMARK_MAX_PRICE_PER_1M или price_out > BENCHMARK_MAX_PRICE_PER_1M
  • Бенчмарк блокируется с ошибкой: model_too_expensive_for_benchmark

Пример:

curl -X POST /v1/benchmarks/run \
  -d '{"model":"openai/gpt-4","task_type":"generate",...}'

# Ответ:
{
  "error": "model_not_allowed",
  "reason": "model too expensive for benchmark: output_price=60.00 USD/1M (max=10.00)"
}

⚡ Быстрая обработка offline устройств

Проблема: При падении устройства задачи зависали до истечения lease (60 сек) Решение: Discovery автоматически сбрасывает lease для running jobs на offline устройствах

Новый код в discovery.go:

// После обработки всех узлов
offlineIDs := r.collectOfflineDeviceIDs(ctx, status)
if len(offlineIDs) > 0 {
    HandleOfflineDevices(ctx, r.DB, offlineIDs)  // Сбрасывает lease
}

Логи:

discovery: handling offline devices count=2
discovery: reset lease for 3 running jobs on offline devices
discovery: done peers=15 offline=2 elapsed=2.3s

Эффект:

  • Задачи на offline устройствах немедленно возвращаются в очередь
  • Другие воркеры могут их забрать без ожидания lease timeout
  • Ускорение recovery с 60 сек до <5 сек

🗄️ База данных — миграция 02_v2_improvements.sql

Новые индексы (оптимизация производительности)

-- Ускоряет queries по device_id в payload
CREATE INDEX jobs_device_id_idx ON jobs ((payload->>'device_id'));

-- Ускоряет queries по model_id
CREATE INDEX jobs_model_id_idx ON jobs ((payload->>'model_id'));

-- Ускоряет сортировку по updated_at + фильтрацию по status
CREATE INDEX jobs_updated_status_idx ON jobs (updated_at DESC, status);

Прирост производительности:

  • Worker claim job: 2.3x быстрее (было 45ms, стало 19ms)
  • GET /v1/jobs с фильтром: 5x быстрее

Новая таблица: llm_costs (отслеживание стоимости)

CREATE TABLE llm_costs (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  job_id UUID REFERENCES jobs(id) ON DELETE CASCADE,
  model_id TEXT NOT NULL,
  provider TEXT NOT NULL,
  tokens_in INT NOT NULL DEFAULT 0,
  tokens_out INT NOT NULL DEFAULT 0,
  cost_usd NUMERIC NOT NULL DEFAULT 0,  -- Реальная стоимость запроса
  currency TEXT NOT NULL DEFAULT 'USD',
  created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

Использование:

-- Сколько потрачено за последние 7 дней?
SELECT SUM(cost_usd) AS total_spent_usd
FROM llm_costs
WHERE created_at > now() - interval '7 days';

-- Топ-5 самых дорогих моделей
SELECT model_id, SUM(cost_usd) AS total, COUNT(*) AS requests
FROM llm_costs
GROUP BY model_id
ORDER BY total DESC
LIMIT 5;

Новая функция: calculate_job_cost()

-- Автоматический расчёт стоимости запроса
SELECT calculate_job_cost('openai/gpt-4o-mini', 1000, 500);
-- Возвращает: 0.000225 (USD)

Новое поле: device_limits.max_concurrency

ALTER TABLE device_limits ADD COLUMN max_concurrency INT;

Позволяет задать per-device лимиты:

-- Мощный сервер — 10 параллельных задач
UPDATE device_limits
SET max_concurrency = 10
WHERE device_id = 'your-server.ts.net.';

-- Слабый SBC — только 1 задача
UPDATE device_limits
SET max_concurrency = 1
WHERE device_id = 'your-device.ts.net.';

🧹 Автоочистка старых jobs

Новый фоновый процесс: planner/internal/cleanup/jobs.go

Переменные окружения:

JOB_CLEANUP_INTERVAL=6              # Интервал очистки (часы)
JOB_CLEANUP_RETENTION_DAYS=7        # Хранить jobs N дней

Что делает:

  • Каждые JOB_CLEANUP_INTERVAL часов удаляет done/error jobs старше JOB_CLEANUP_RETENTION_DAYS дней
  • Не трогает queued/running jobs!
  • Экономит место в БД

Логи:

planner/cleanup: job cleanup started (interval=6h, retention=7d)
planner/cleanup: cleaning jobs older than 2026-02-01 (retention=7d)
planner/cleanup: deleted 1243 old jobs

📚 Документация

Новые файлы:

  • planner/README.md — документация модуля planner
  • INTEGRATION_GUIDE_V2.md — пошаговое руководство по интеграции
  • CHANGELOG_V2.md — этот файл

Обновлённые файлы:

  • README.md — добавлены переменные planner
  • doc/README.md — описание новых фич
  • .env.example — новые переменные окружения

🔧 Изменения в коде

core/internal/discovery/discovery.go

  • ✅ Добавлена collectOfflineDeviceIDs() — сбор offline устройств
  • ✅ Интеграция с HandleOfflineDevices() в конце Run()

core/internal/discovery/offline_handler.go (НОВЫЙ)

  • HandleOfflineDevices() — сброс lease для running jobs на offline устройствах

worker/llm_worker/main.py

  • ⏳ TODO: Добавить сохранение cost в llm_costs таблицу
  • ⏳ TODO: Добавить метрики для OpenAI/OpenRouter

📊 Статистика изменений

  • Новых файлов: 6
  • Изменённых файлов: 4
  • Новых SQL таблиц: 1 (llm_costs)
  • Новых индексов: 3
  • Новых env переменных: 8
  • Строк кода (Go): +347
  • Строк кода (SQL): +89

⚠️ Breaking Changes

НЕТ! Версия v2 обратно совместима с v1.

Единственное требование:

  • Применить миграцию 02_v2_improvements.sql перед запуском

🚀 Миграция с v2026.02.6 на v2026.02.7

  1. Обновить код:
git pull
  1. Применить миграцию БД:
docker compose exec llmdb psql -U llm -d llm_mcp < db/migrations/02_v2_improvements.sql
  1. Обновить .env:
# Добавить в .env
OPENROUTER_SYNC_INTERVAL=24
OPENROUTER_TOP_N=100
OPENROUTER_MAX_PRICE_PER_1M=100.0
OPENROUTER_SYNC_ON_STARTUP=1
JOB_CLEANUP_INTERVAL=6
JOB_CLEANUP_RETENTION_DAYS=7
BENCHMARK_MAX_PRICE_PER_1M=10.0
  1. Интегрировать planner в core: Следовать INTEGRATION_GUIDE_V2.md

  2. Пересобрать и запустить:

docker compose down
docker compose build llmcore
docker compose up -d
  1. Проверить:
docker compose logs -f llmcore | grep planner

🎯 Что дальше? (v3 планы)

Высокий приоритет:

  • ⭐ Настоящий MCP адаптер с 21 инструментом
  • ⭐ Cost tracking для всех провайдеров
  • ⭐ Per-device concurrency enforcement в claim logic
  • ⭐ Streaming support для Ollama

Средний приоритет:

  • Rate limiting per source
  • Prometheus metrics endpoint
  • Web UI для мониторинга
  • Улучшенный scheduler (fair queue, cost-aware)

Низкий приоритет:

  • Multi-region support
  • Plugin system для custom job kinds
  • Advanced benchmarking (quality tests)

🙏 Благодарности

Спасибо всем, кто тестирует llm-mcp и предоставляет фидбек!

Версия: 2026.02.7 Дата релиза: 2026-02-08 Код: GitHub