6.5 KiB
6.5 KiB
Supervisor Agent — надзиратель провайдеров
Версия: 0.1.0-draft | Статус: Draft
Назначение
Supervisor Agent — специализированный агент-надзиратель, который:
- Мониторит здоровье всех провайдеров/моделей
- Обнаруживает исчерпание квот (429, 402, 403)
- Переключает worker-профили на fallback-модели
- Возвращает профили на основные модели после восстановления квот
- Ведёт лог всех инцидентов и переключений
Архитектура
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: не требуются (переключение модели — низкий риск)