fix(grok): убрать неверное утверждение про «разные кошельки»

Владелец прислал анонс x.ai/news/grok-hermes: доступ к Grok даётся по
подписке SuperGrok через OAuth, покупать кредиты API не требуется. Моя
формулировка в интерфейсе утверждала обратное — что подписка кредиты не
пополняет и это отдельный кошелёк. Это неверно, и оно уже попадало
пользователю на экран.

Установлено проверками:
- cli-chat-proxy.grok.com/v1/models принимает наш OAuth-токен -> 200,
  отдаёт grok-4.6;
- тот же прокси /chat/completions -> 426, требует версию Grok CLI
  не ниже 0.1.202, и она читается не из заголовков, которые я перебрал;
- api.x.ai/v1/responses (путь из документации Hermes) -> 402
  personal-team-blocked:spending-limit.

При этом подключён ochenstarik@gmail.com, а подписка SuperGrok — на
victor.trushenko@gmail.com. То есть отказ объясняется аккаунтом, а не
природой подписки, и утверждать иное я не мог.

Сообщение переписано на проверяемое: у аккаунта нет ни баланса, ни
лимита трат, а доступ даёт подписка на ЭТОМ же аккаунте либо купленные
кредиты. Само чтение биллинга остаётся — оно работает и показывает
настоящие числа.

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

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hermes Team 2026-08-24 20:06:21 +07:00
parent 6ebea01386
commit 98b6e68617
2 changed files with 10 additions and 6 deletions

View file

@ -754,8 +754,11 @@ class AccountQuotaService:
биллинговым эндпоинтом grok.com. Именно оттуда берут данные и
Grok Build, и /usage.
Важно: подписка SuperGrok и кредиты API РАЗНЫЕ кошельки. Вызовы
через Hub списываются со второго, и именно его показывает этот ответ.
Что показывает ответ: предоплаченный баланс и лимит трат по мере
использования. Доступ к Grok даёт либо подписка SuperGrok на этом же
аккаунте (см. анонс x.ai/news/grok-hermes OAuth без покупки кредитов),
либо купленные кредиты. Нули в обоих полях означают, что ни того, ни
другого на аккаунте нет.
"""
now = _utc_now()
token = None
@ -831,9 +834,10 @@ class AccountQuotaService:
reason = None
if not prepaid and not cap:
reason = (
"Кредиты API исчерпаны: предоплаченный баланс и лимит по мере "
"использования равны нулю. Подписка SuperGrok их не пополняет — "
"это отдельный кошелёк."
"У этого аккаунта нет ни предоплаченного баланса, ни лимита по "
"мере использования. Доступ даёт либо подписка SuperGrok на ЭТОМ "
"же аккаунте, либо купленные кредиты — проверьте, что подключён "
"тот аккаунт, на котором оформлена подписка."
)
return QuotaSnapshot(

View file

@ -45,7 +45,7 @@ def test_exhausted_account_explains_two_wallets():
snap = AccountQuotaService()._collect_grok_quota("grok-orch", _auth())
assert snap.source == "provider_api"
assert "SuperGrok" in (snap.unavailable_reason or ""), "не объяснено, что это разные кошельки"
assert "SuperGrok" in (snap.unavailable_reason or ""), "не объяснено, откуда берётся доступ"
assert all(b.status == "exhausted" for b in snap.buckets)