German Hermes: handoff по 400 out-of-usage (cc/* OmniRoute) — корень=маршрутизация ключа на перегруженный аккаунт + burst-пики Max; фиксы (привязка к batlaew + retry-патч) и что осталось (Extra usage/разгрузка SwarmClaw)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
78
decisions/2026-06-20-german-hermes-out-of-usage.md
Normal file
78
decisions/2026-06-20-german-hermes-out-of-usage.md
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
---
|
||||||
|
date: 2026-06-20
|
||||||
|
type: decision
|
||||||
|
tags: [dttb, german, hermes, omniroute, cliproxy, max, out-of-usage, troubleshooting]
|
||||||
|
---
|
||||||
|
|
||||||
|
# German (Hermes LXC 141) — `400 out of extra usage` на cc/* через OmniRoute
|
||||||
|
|
||||||
|
> **Handoff-документ.** Проблема НЕ закрыта полностью на 2026-06-20. Сделаны два смягчающих фикса (привязка аккаунта + retry-патч), но остаточные пики `out of usage` остаются. Окончательное решение — за Олегом (Extra usage / разгрузка нагрузки). Ниже — всё, чтобы продолжить без повторного прохода по тупикам.
|
||||||
|
|
||||||
|
## Симптом
|
||||||
|
German-бот (@german_dttb_bot, Hermes Agent v0.16.0, LXC 141) периодически отвечает ошибкой вместо ответа:
|
||||||
|
```
|
||||||
|
400 - You're out of extra usage. Add more at claude.ai/settings/usage and keep going.
|
||||||
|
```
|
||||||
|
Интермиттентно: ~7-12% запросов cc/* падают, остальные 200. Бот «то работает, то нет».
|
||||||
|
|
||||||
|
## Что НЕ является причиной (проверено — НЕ тратить время заново)
|
||||||
|
1. **НЕ баг версии OmniRoute.** Обновил 3.8.29 → 3.8.30 (`npm install omniroute@latest` в `/root/.npm/_npx/cb5891f90ae65d14`, ExecStart уже `dist/server.js`). Ошибка осталась. (В 2026-06-09 похожая ошибка реально была багом 3.8.7 — но не в этот раз.)
|
||||||
|
2. **НЕ реальный лимит подписки Олега.** Скриншоты Claude Code Plan usage: 5h-limit 43→53%, Weekly 5-6%, Sonnet 0% — **свободно**. Олег прав: «лимитов нет».
|
||||||
|
3. **НЕ размер запроса.** Тест: контекст 357K симв (~90K токенов) → 200 на opus-4-7/opus-4-8/sonnet. Размер ни при чём.
|
||||||
|
|
||||||
|
## Архитектура (как cc/* доходит до Anthropic)
|
||||||
|
```
|
||||||
|
German (LXC 141) → OmniRoute (LXC 132, 10.0.0.179:20128) → cliproxy (/root/.cli-proxy-api:8319) → Anthropic Max OAuth
|
||||||
|
```
|
||||||
|
- В OmniRoute `provider_connections` (БД `/root/.omniroute/storage.sqlite`) — **два Claude-аккаунта**:
|
||||||
|
- `e8a70f39-564d-4529-a911-4b5d0a47e512` — priority 1, **перегружен**: SwarmClaw (8 агентов) + code-server жгут через него ~**13К `opus-4-8`/час** → сыпет 400/429/502/529.
|
||||||
|
- `883152e1-7160-4d5c-90eb-88822d50db31` = **`batlaew@gmail.com`** — рабочий аккаунт Олега (тот, что в скриншоте 53%), свободнее, почти всё 200.
|
||||||
|
- Ключи German/openclaw в OmniRoute `api_keys`: **`claw`** и **`test-key`** (оба `sk-225e902dc95ff…` — это и есть `OPENAI_API_KEY` в `/root/.hermes/.env` German). SwarmClaw-нагрузка (13К) идёт БЕЗ `api_key_name` (мастер-путь), отдельно от этих ключей.
|
||||||
|
|
||||||
|
## Главная диагностическая команда (с неё начинать в будущем)
|
||||||
|
```bash
|
||||||
|
# на LXC 132 (через pct exec 132 с Proxmox 10.0.0.250 root/1qaz!QAZ):
|
||||||
|
sqlite3 -column /root/.omniroute/storage.sqlite \
|
||||||
|
"SELECT model, account, status, COUNT(*) n FROM call_logs WHERE model LIKE '%opus%' GROUP BY model,account,status ORDER BY n DESC LIMIT 20"
|
||||||
|
```
|
||||||
|
Поля `account` + `status` сразу показывают, какой аккаунт сыпет 400 и какой 200. **Не гадать про версию/лимит — смотреть сюда.**
|
||||||
|
|
||||||
|
## Что СДЕЛАНО (два смягчающих фикса)
|
||||||
|
### 1. Привязка ключей German/openclaw к рабочему аккаунту
|
||||||
|
Ключи `claw`/`test-key` имели пустой `allowed_connections` → ротация кидала German на перегруженный `e8a70f39`. Привязал к `batlaew`:
|
||||||
|
```bash
|
||||||
|
# на LXC 132. Формат allowed_connections = JSON-массив id (JSON.parse, length>0 ограничивает)
|
||||||
|
sqlite3 /root/.omniroute/storage.sqlite \
|
||||||
|
"UPDATE api_keys SET allowed_connections='[\"883152e1-7160-4d5c-90eb-88822d50db31\"]' WHERE name IN ('claw','test-key')"
|
||||||
|
systemctl restart omniroute # сбросить кэш ключей
|
||||||
|
```
|
||||||
|
- Бэкап БД: `/root/.omniroute/storage.sqlite.bak-keybind`.
|
||||||
|
- Проверено: 10/10 запросов German-ключом → account=batlaew. SwarmClaw не затронут (другой путь).
|
||||||
|
- Откат: `UPDATE api_keys SET allowed_connections=NULL WHERE name IN ('claw','test-key')`.
|
||||||
|
|
||||||
|
### 2. Retry-патч Hermes (out-of-usage → retryable)
|
||||||
|
До патча Hermes считал `400 out of extra usage` фатальной (`Aborting`). Сделал retryable:
|
||||||
|
- Файл: `/usr/local/lib/hermes-agent/agent/error_classifier.py` — добавлен паттерн `status_code==400 and "out of extra usage" in error_msg → FailoverReason.rate_limit, retryable=True` (перед «── 2. HTTP status code classification»).
|
||||||
|
- `config.yaml`: `agent.api_max_retries` 3 → 5.
|
||||||
|
- Проверено вызовом `classify_api_error`: на этот текст RETRYABLE=True, обычные 400 остаются non-retryable.
|
||||||
|
- Бэкап: `error_classifier.py.bak-outofusage`. **Переналожатель: `/root/hermes-patch-outofusage.py`** — запустить ПОСЛЕ обновления Hermes (патч в коде слетает).
|
||||||
|
|
||||||
|
## Текущий статус (на 2026-06-20 ~16:00)
|
||||||
|
- German **отвечает, когда нет пика** (проверено в логах: 14:16 inbound `?` → ответ; и прямыми тестами все модели 200).
|
||||||
|
- В **длинные пики** (>~50с, ретраи 5×40с не хватает) German всё ещё возвращает ошибку «model provider failed after retries».
|
||||||
|
- **Пульсация `out of usage` остаётся на ОБОИХ аккаунтах** (e8a70f39 и batlaew) периодически — ДАЖЕ при свободном 5h (53%). Это похоже на burst/моментную механику Anthropic Max, из логов OmniRoute до конца НЕ объяснено.
|
||||||
|
|
||||||
|
## Что осталось — варианты окончательного решения (ВЫБОР ОЛЕГА)
|
||||||
|
1. **Extra usage on** — `claude.ai/settings/usage`, секция Extra usage (не Plan usage). Поднять spend limit → overflow в пик оплачивается, `out of usage` исчезает для ВСЕХ ботов. Самое прямое, платно, в биллинге Олега.
|
||||||
|
2. **Разгрузить главного пожирателя** — SwarmClaw (8 агентов) + code-server с `cc/claude-opus-4-8` (~13К/час) на Sonnet/меньше агентов → давление на Max-пул/burst падает.
|
||||||
|
3. **Восстановить не-Max тракт** для German (вывести из Max-пула). На 2026-06-20 ВСЕ мертвы: Kiro (`402`/нет кредов), Codex (`not supported`/таймаут), gemini-cli (`403` нет лицензии), GLM (`429` баланс 0).
|
||||||
|
4. Поднять retry-окно German ещё (api_max_retries + backoff) — пережидать и длинные пики, ценой задержки ответа на 1-2 мин (плохой UX).
|
||||||
|
|
||||||
|
## Связанные факты
|
||||||
|
- German модель: `config.yaml` `model.default: cc/claude-opus-4-7`, fallback `cc/claude-haiku → claude/claude-haiku` (всё Max-tract; при пике все падают — fallback бесполезен, ретрай важнее). **Рекомендация:** рассмотреть `cc/claude-opus-4-8` как primary (Олег его юзает в Claude Code; в тестах не хуже).
|
||||||
|
- Доступ: Proxmox `10.0.0.250` root/`1qaz!QAZ` → `pct exec 141` (German) / `pct exec 132` (OmniRoute+cliproxy).
|
||||||
|
- Память: [[../../.claude/projects/-Users-ai-knowledge-base/memory/feedback_omniroute_update]], [[../../.claude/projects/-Users-ai-knowledge-base/memory/project_german_hermes]].
|
||||||
|
- Деплой German: [[2026-06-18-german-hermes-agent-deploy]].
|
||||||
|
|
||||||
|
## Урок (мне на будущее)
|
||||||
|
Я трижды выдал неверный диагноз (баг версии → реальный лимит → перегрузка пула), прежде чем дошёл до `call_logs` по `account`. **При `out of usage` на cc/* — СНАЧАЛА `call_logs` GROUP BY account,status, потом гипотезы.** См. [[../../.claude/projects/-Users-ai-knowledge-base/memory/feedback_root_cause_recurring]].
|
||||||
Reference in New Issue
Block a user