import (
// ... существующие импорты ...
// Добавить:
"llm-mcp/planner/internal/cleanup"
"llm-mcp/planner/internal/sync"
)В функции main(), после создания pool, добавить:
// После строки: pool, err := pgxpool.New(ctx, dsn)
// Запуск planner фоновых процессов
// Автосинхронизация моделей OpenRouter
sync.StartOpenRouterSync(pool)
// Автоочистка старых jobs
cleanup.StartJobCleanup(pool)В функции handleBenchmarkRun, перед постановкой задачи добавить:
// После строки: kind := "benchmark.ollama." + task
// Проверка цены модели (защита от дорогих бенчмарков)
if provider == "ollama" && req.Model != "" {
allowed, reason, err := sync.CheckBenchmarkAllowed(ctx, s.db, req.Model, task)
if err != nil {
log.Printf("benchmark price check error: %v", err)
} else if !allowed {
writeJSON(w, http.StatusBadRequest, map[string]string{"error": "benchmark_blocked", "reason": reason})
return
}
}Выполнить миграцию:
cd /path/to/llm-mcp
docker compose exec llmdb psql -U llm -d llm_mcp -f /docker-entrypoint-initdb.d/02_v2_improvements.sqlИли скопировать db/migrations/02_v2_improvements.sql в db/init/ и пересоздать контейнер.
Добавить новые переменные в .env:
# Planner - автосинхронизация OpenRouter
OPENROUTER_SYNC_INTERVAL=24
OPENROUTER_TOP_N=100
OPENROUTER_MAX_PRICE_PER_1M=100.0
OPENROUTER_SYNC_ON_STARTUP=1
# Planner - очистка jobs
JOB_CLEANUP_INTERVAL=6
JOB_CLEANUP_RETENTION_DAYS=7
# Защита от дорогих бенчмарков
BENCHMARK_MAX_PRICE_PER_1M=10.0docker compose down
docker compose build llmcore
docker compose up -d- Проверить логи синхронизации:
docker compose logs -f llmcore | grep "planner/sync"Должно быть:
planner/sync: running initial OpenRouter sync
planner/sync: fetched 500 models from OpenRouter
planner/sync: filtered to 150 models (price <= 100.00)
planner/sync: selected top 100 models
planner/sync: synced 100/100 models
planner/sync: OpenRouter sync started (interval=24h)
- Проверить очистку jobs:
docker compose logs -f llmcore | grep "planner/cleanup"- Проверить offline handling:
docker compose logs -f llmcore | grep "offline"# Удалить новые таблицы
docker compose exec llmdb psql -U llm -d llm_mcp -c "DROP TABLE IF EXISTS llm_costs CASCADE;"
# Вернуться на предыдущую версию
git checkout <previous-commit>
docker compose down && docker compose build && docker compose up -d# Проверить количество моделей в БД
docker compose exec llmdb psql -U llm -d llm_mcp -c "SELECT provider, COUNT(*) FROM models GROUP BY provider;"Должно быть примерно:
provider | count
------------+-------
ollama | 15
openrouter | 100
# Попытка бенчмарка дорогой модели (должна заблокироваться)
curl -X POST http://127.0.0.1:8080/v1/benchmarks/run \
-H 'Content-Type: application/json' \
-d '{
"provider": "ollama",
"model": "openai/gpt-4",
"task_type": "generate",
"prompt": "test",
"runs": 1
}'Ожидаемый ответ:
{"error":"benchmark_blocked","reason":"model too expensive for benchmark..."}# Остановить одно устройство и запустить discovery
curl -X POST http://127.0.0.1:8080/v1/discovery/runПроверить логи:
docker compose logs llmcore | grep "offline"- Добавить Prometheus metrics для мониторинга planner
- Реализовать Web UI для просмотра статистики синхронизации
- Добавить rate limiting для защиты API
- Вынести planner в отдельный контейнер (в будущем)