agent-control-center/docs/adapters/SUPERVISOR.md

6.5 KiB
Raw Blame History

Supervisor Agent — надзиратель провайдеров

Версия: 0.1.0-draft | Статус: Draft

Назначение

Supervisor Agent — специализированный агент-надзиратель, который:

  1. Мониторит здоровье всех провайдеров/моделей
  2. Обнаруживает исчерпание квот (429, 402, 403)
  3. Переключает worker-профили на fallback-модели
  4. Возвращает профили на основные модели после восстановления квот
  5. Ведёт лог всех инцидентов и переключений

Архитектура

Supervisor Agent (cron: каждые 5 мин)
  │
  ├─ check_provider(provider) → status
  │    ├─ HTTP health probe
  │    ├─ quota check (usage API)
  │    └─ latency check
  │
  ├─ detect_incident(status) → action
  │    ├─ 429 → switch to fallback
  │    ├─ 402 → switch to fallback
  │    ├─ timeout → mark degraded
  │    └─ recovery → switch back to primary
  │
  ├─ apply_action(profile, new_model)
  │    └─ hermes config set model.default <new_model> -p <profile>
  │
  └─ log_incident(incident)
       └─ supervisor.log + Telegram notification

Модель инцидента

incident:
  id: uuid
  timestamp: ISO8601
  provider: opencode-go|grok-cli|gemini|nvidia|ollama
  model: kimi-k2.7-code
  error_code: 429|402|403|timeout
  action: switch_to_fallback|switch_back|alert_only
  profile_affected: worker-code|worker-fast|worker-research|worker-review
  old_model: opencode-go/kimi-k2.7-code
  new_model: grok-cli/grok-4.5
  recovery_eta: "2026-07-21T00:00:00Z"
  status: active|resolved

Матрица переключений

Профиль Primary Fallback 1 Fallback 2 Last Resort
worker-code opencode-go/kimi grok-4.5 gemini-3-flash opencode-go (любая)
worker-fast grok-4.5 opencode-go/kimi gemini-3-flash opencode-go
worker-research gemini-3-flash opencode-go/kimi grok-4.5 opencode-go
worker-review nvidia/deepseek-v4 opencode-go/kimi gemini-3-flash opencode-go

Конфигурация supervisor

# supervisor.yaml (рядом с Hermes config)
supervisor:
  enabled: true
  check_interval: 300          # секунд (5 минут)
  health_timeout: 15           # секунд на health probe
  cooldown_minutes: 30         # не переключать чаще чем раз в 30 мин
  notify:
    telegram: true
    log: true
  providers:
    opencode-go:
      health_url: http://localhost:20127/v1/models
      quota_reset: "daily"     # когда сбрасывается квота
    grok-cli:
      health_url: http://localhost:20127/v1/models
      quota_reset: "monthly"
    gemini:
      health_url: http://localhost:20127/v1/models
      quota_reset: "daily"
    nvidia:
      health_url: http://localhost:20127/v1/models
      quota_reset: "daily"
  fallback_matrix:
    worker-code:
      primary: opencode-go/kimi-k2.7-code
      fallbacks:
        - grok-cli/grok-4.5
        - gemini/gemini-3-flash-preview
    worker-fast:
      primary: grok-cli/grok-4.5
      fallbacks:
        - opencode-go/kimi-k2.7-code
        - gemini/gemini-3-flash-preview
    worker-research:
      primary: gemini/gemini-3-flash-preview
      fallbacks:
        - opencode-go/kimi-k2.7-code
    worker-review:
      primary: nvidia/deepseek-ai/deepseek-v4-pro
      fallbacks:
        - opencode-go/kimi-k2.7-code

Алгоритм работы

1. КАЖДЫЕ check_interval секунд:
   a. Для каждого провайдера: POST health_url → статус
   b. Если 429/402/403 → INCIDENT
   c. Если timeout × 3 → DEGRADED

2. ПРИ ИНЦИДЕНТЕ:
   a. Проверить cooldown — если последнее переключение < 30 мин назад → alert_only
   b. Найти все профили с этим провайдером как primary
   c. Для каждого: переключить на первый доступный fallback
   d. Записать incident в лог
   e. Уведомить в Telegram

3. ПРИ ВОССТАНОВЛЕНИИ:
   a. Проверить primary провайдер 3 раза с интервалом 60с
   b. Если все 3 проверки OK → вернуть профили на primary
   c. Обновить incident.status = resolved

Реализация

Как cron-задача Hermes

hermes cron create "*/5 * * * *" \
  --name "supervisor-health-check" \
  --script scripts/supervisor.py \
  --no_agent  # script-only, не тратит токены LLM

supervisor.py (псевдокод)

def check_provider(health_url, api_key):
    r = requests.post(health_url, headers={"Authorization": f"Bearer {api_key}"},
                      json={"model": "test", "messages": [{"role":"user","content":"Hi"}], "max_tokens":1})
    if r.status_code == 429:
        return "quota_exceeded"
    if r.status_code == 402:
        return "payment_required"
    if r.status_code != 200:
        return "error"
    return "ok"

def switch_profile(profile, model):
    subprocess.run(["hermes", "config", "set", "model.default", model, "-p", profile])

def main():
    for provider in config["providers"]:
        status = check_provider(provider["health_url"], API_KEY)
        if status != "ok":
            # Найти затронутые профили и переключить
            for profile, fb in config["fallback_matrix"].items():
                if fb["primary"].startswith(provider):
                    for fallback_model in fb["fallbacks"]:
                        if check_provider(...) == "ok":
                            switch_profile(profile, fallback_model)
                            notify_telegram(f"{profile}: {fb['primary']}{fallback_model}")
                            break

Интеграция с Agent Control Center

Supervisor Agent — это Connector типа hermes-cron с адаптером supervisor. В терминах ACC:

  • Agent: supervisor (runtime: hermes-cron, model: none — script-only)
  • Capabilities: provider_health_check, profile_switch, incident_logging
  • Connector: локальный (встроен в Hermes)
  • Approvals: не требуются (переключение модели — низкий риск)