feat(terminal): версионированные модели вендоров + best-effort Pro/Max квоты#247
Closed
gently-whitesnow wants to merge 1 commit into
Closed
feat(terminal): версионированные модели вендоров + best-effort Pro/Max квоты#247gently-whitesnow wants to merge 1 commit into
gently-whitesnow wants to merge 1 commit into
Conversation
…ты Pro/Max Panel запуска теперь тянет модели Claude/Codex из версионированного `vendor-models.json` (загружается один раз как embedded resource) и опционально показывает 5ч/недельные квоты подписки. Rest — refresh-кнопка над панелью (invalidate query catalog) и одноразовый invalidate при монтировании панели. Решения: - Модели — статический JSON, а не live `/v1/models`. Полностью снимает риск нарушения Anthropic ToS Feb-2026 (OAuth токены — только под Claude Code / claude.ai), устраняет несуществующий у Codex `/v1/models` и оставляет apples-to-apples поведение (порядок = native-default-first). Обновление вендорного списка — PR-правка одной строки JSON, а не .cs. - Квоты — best-effort HTTP-адаптер поверх недокументированных `/api/oauth/usage` (Claude) и `/backend-api/wham/usage` (ChatGPT). Общий базовый класс кэширует ответ 60 сек (совпадает с частотой пуллинга CLI-Codex) и гарантированно превращает ЛЮБУЮ ошибку — отсутствие токена, 401, битую схему — в `null`. Каталог-мэппер видит `null` и прячет блок, Run НЕ блокируется по контракту ADR-0054 §2. - ISO 8601 UTC на wire как единый формат reset-таймстампов; Codex адаптер нормализует Unix seconds внутри, вендор-специфика не течёт в UI. - OpenAPI-контракт расширен опциональным `quota` полем на `TerminalVendorMetadataDto` + новыми `TerminalVendorQuotaDto` / `TerminalVendorQuotaWindowDto` — фронт получает готовые типы через openapi-typescript, ничего не мапит руками. Отброшено: - Живые `/v1/models` через OAuth Claude/Codex — Anthropic ToS + Codex не имеет эндпоинта, а даже у Claude `/v1/models` не фильтрует по подписке оператора (Pro/Max/Team), пришлось бы фильтровать вручную. - Shell-out в `claude models` / `codex models list` — таких команд не существует в текущих CLI. - Хранение catalog в БД + миграции — тяжело, для 2–3 моделей на вендора не окупается. Ограничения: - Claude Code хранит OAuth в macOS Keychain; файл `~/.claude/.credentials.json` появляется только у операторов, зашедших SSH-friendly-flow или явно выставивших `CLAUDE_CONFIG_DIR`. У большинства macOS-пользователей Claude-квота останется `null` (Refresh отработает, значений не будет). - `/wham/usage` и `/api/oauth/usage` — приватные эндпоинты; при их изменении квоты молча спрячутся до правки схемы адаптера. - Изменение `vendor-models.json` требует деплоя нового бинаря (это осознанный трейд-офф против live-пробы).
Owner
Author
|
Сложная таска пока отложим |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Цель
Убрать хардкод списка моделей Claude/Codex в
TerminalVendorDescriptors.csи опционально показывать оператору использование его Pro/Max подписки —
как минимум 5-часовое окно, где-то и weekly + credits — прямо в панели
запуска терминала.
Основные изменения
vendor-models.json(embedded resource) — единственныйисточник моделей для
claude/codex.TerminalVendorDescriptorsтеперьберёт
ModelsчерезVendorModelMetadata.For(vendor). Правка спискамоделей — коммит в один файл данных.
IVendorQuotaAdapter,общий базовый класс
HttpVendorQuotaAdapterBase(60с TTL кэш + гарант.проглатывание любой ошибки в
null) и два конкретных адаптера поверхнедокументированных
GET api.anthropic.com/api/oauth/usage(Claude) иGET chatgpt.com/backend-api/wham/usage(ChatGPT).TerminalVendorQuotaDtoиTerminalVendorQuotaWindowDto, опциональноеquotaполе наTerminalVendorMetadataDto. Регенерированы NSwag и openapi-typescript.(5ч/неделя/credits/reset) + кнопка «Обновить», invalidating catalog
query. При открытии панели каталог инвалидируется однократно, чтобы
подтянуть свежее состояние. Блок значений исчезает при
quota=null,оставляя только Refresh.
Решения
/v1/models. Причины:Anthropic Feb-2026 ToS запрещает OAuth-токены вне Claude Code/claude.ai,
а у Codex
/v1/modelsне существует./v1/modelsу Anthropic всё равноне фильтрует по подписке оператора — фильтровали бы вручную по allow-list.
Failure isolation: одна
try/catchна весь цикл в базовом классе,ошибочный адаптер →
null→ блок в UI скрыт, Run никогда не блокируется.Unix seconds уходит внутрь адаптера.
Отброшено
/v1/modelsчерез OAuth. Ломает ToS, не решает исходныйзапрос «фактические права оператора».
claude models/codex models list. Таких команд у CLI нет.контроль без лишних сетевых спам-запросов.
Ограничения
~/.claude/.credentials.jsonесть не у всех операторов — у большинстваClaude-квота останется
null(Refresh отработает, значений не будет).Это документировано в ADR-0054.
/wham/usageи/api/oauth/usage— приватные эндпоинты, их изменениевендором молча скроет блок до нашей правки схемы адаптера.
vendor-models.jsonтребует релиза нового бинаря — этоосознанный трейд-офф против live-пробы (см. ADR-0054 § Отброшено).
Как проверить
строка блока квоты. При наличии
~/.claude/.credentials.jsonилиактуального
~/.codex/auth.json— значения; иначе — только кнопка«Обновить», Run продолжит работать.
queryClient.invalidateQueries— сетьидёт заново, кнопка блокируется на время refetch.
Тесты
VendorModelMetadataTests(5 кейсов, embedded loading + parse),VendorQuotaAdapterTests(9 кейсов, Parse + credentials + cache/failure),расширены
TerminalVendorCatalogMapperTests(3 новых quota-кейса).VendorQuotaBlock.test.tsx(3 кейса).verify.sh backend+verify.sh frontendзелёные.Ссылка на ADR:
specs/ADR/0054-terminal-vendor-model-metadata-and-quotas.md.