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:
parent
6ebea01386
commit
98b6e68617
2 changed files with 10 additions and 6 deletions
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue