hermes-hub/src/antigravity_provider
Hermes Team 9a2c341f15 Merge A24 (маршрутизация как центр управления) и A25 (локальная модель)
Обе работы приняты, проверено исполнением.

A24: ровно семь разделов, renderTeam и renderProviders удалены, кнопки
«Изменить цепочку» нет, перетаскивание блоков есть. Перестановка цепочки
проверена вживую: сохраняется в router_profiles.yaml и откатывается.

A25: провайдер local подключён к настоящему серверу владельца через
SSH-туннель к 127.0.0.1:8081. health_check проходит, /v1/models отдаёт
модель, реальный вызов возвращает «ОК» за 3.1 с. Профили local-1 и
local-2 добавлены. Квота отдаётся отдельным состоянием
(source=local_provider, «Без ограничений»), а не как отсутствие данных.
Адрес сервера нигде не зашит.

Разрешение конфликта в action_handler: A25 внёс edit_route и assign_role
в список «просто навигация», где они возвращают заглушку. В A24 это
работающие обработчики — сохранение цепочки и назначение роли. Приняв
версию A25 целиком, мы бы молча сломали перестановку блоков. Оставлены
оба: локальный провайдер в add_account и рабочие обработчики ниже.

Исправлено при слиянии:

1. Адаптер отдавал пустой ответ как успех. У сервера владельца
   --reasoning on --reasoning-budget 4096: при скромном max_tokens весь
   бюджет уходит на рассуждения, llama.cpp возвращает 200, заполняет
   reasoning_content и оставляет content пустым. Проверено на живой
   модели: max_tokens=40 — ответа нет, 200 — приходит «ОК». Роутер
   засчитал бы такой вызов, а пользователь не получил бы ничего.
   Теперь это явный отказ с объяснением, и срабатывает переключение.
   Проверка вынесена из блока перехвата: иначе оборачивалась в
   «Transport Error», хотя транспорт отработал штатно.

2. Заглушка в тесте A25 возвращала "choices": [] — такого настоящий
   сервер не отдаёт. Приведена к реальному виду.

Тесты: 404 passed, ruff чисто.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 14:33:16 +07:00
..
router Merge A24 (маршрутизация как центр управления) и A25 (локальная модель) 2026-08-24 14:33:16 +07:00
updater fix: update canonical installer with dependency resolution and close release blockers 2026-08-20 18:17:08 +07:00
__init__.py feat(state): harden snapshots quotas and routing 2026-08-21 00:03:50 +07:00
agy_subprocess.py fix(router): обработчик ошибок падал сам, уровень усилия не подставлялся 2026-08-24 08:51:01 +07:00
antigravity_client.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
cloudcode.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
credentials.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
errors.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
hermes_plugin.py feat(A11): интеграция с Hermes, токены Codex, честное обнаружение моделей 2026-08-23 15:27:28 +07:00
hermes_provider.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
models.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
oauth.py fix(oauth): preserve complete credentials and sync oauth_creds.json for Antigravity profiles (A20) 2026-08-23 23:09:58 +07:00
openai_compat.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
paths.py feat: multi-provider accounts, tariffs, quota buckets, Claude & Grok integration 2026-08-20 21:02:13 +07:00
runtime.py fix(router): correct spare assignment and error presentation 2026-08-20 17:21:30 +07:00
sanitizer.py feat(release): recovery stabilization, built-in updater, release gate, and v0.1.1 release pipeline 2026-08-20 16:29:35 +07:00
transform.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
version.py fix: close P0 release blockers 2026-08-20 16:25:11 +07:00