Снимок: 2026-10-11. Секция хаба AI & Agents, тайл «API» / «API», подпись «Провайдеры API, ключи и каталоги моделей». Доступен всегда.
Экраны и навигация
Screen.ApiProviders→ProvidersScreen(470 строк) — список.Screen.AddEditProvider(providerId?, presetSlug?, startAtModels?)→ProviderFormScreen— форма добавления/правки;startAtModelsоткрывает её сразу на моделях (тап по полоске моделей в карточке).
Возможности (подробно)
Список провайдеров
- Карточка
ProviderCard(314 строк): статус (providerStatus+providerStatusReason), хост (providerHost), ключ маскирован (providerKeyLabel), число моделей, время последнего теста (lastTestEpochMillis/lastTestLabel). - Метрики расхода:
ProviderUsageRow,UsageMiniBar,ProviderQuotaRow— окна квот,quotaWindowLabel,quotaResetEpochMillis,formatQuotaRemaining,quotaHistoryPercents(спарклайн),UsageSparkline. - Баланс DeepSeek:
ProviderBalanceRowна карточке иProviderBalanceSheet(// balance) —providerIsDeepSeek,providerHasBalance,balanceStatusLabel,balanceTotalLabel;ApiQuotaBalanceDtoхранитcurrency/total/granted/toppedUpстроками. - Фильтр/поиск (
providerMatchesQuery), группировка секций (providerSections). - Управление:
toggle(вкл/выкл),delete,quickTest(быстрый тест из списка),testModel(тест конкретной модели),loadQuotas/refreshQuota. - Пустое состояние
EmptyProviders.
Форма провайдера (ProviderFormScreen, шаги)
- Connection (
ConnectionStep) — пресет (applyPreset), имя, slug, base URL, protocol, API-ключ; валидацияvalidateSetup. - Models (
ModelsStep) — обнаружение моделей (discover→/providers/{id}/discover), выбор, компактные строки с раскрываемым редактором контекста и флагов. - Test (
TestStep) —runTest(/providers/{id}/test), выбор тестовой модели.
buildRequestсобираетProviderSaveReq.- Save закреплён в нижней панели и доступен с любого шага; тест не обязателен.
Vision-модели
- Ручной флаг зрения живёт на экране Vision: пикер «+ модель» сохраняет
vision=trueчерез тот жеsave, а экран провайдера показывает флаг только бейджем.
Инсайты по моделям (ProviderInsights.kt)
modelFamily, modelVersion, compareModelVersions (сравнение версий), providerModelIdsSorted, providerModelsSorted, providerModelsPreview, formatContext (размер контекста).
Диалоги и листы
TestModelDialog,DiscoverModelsDialog(ProviderDialogs).ProviderActionsSheet— действия над провайдером.ProviderUsageSheet(199) — подробные окна расхода,UsageWindowCard.
Где в коде
| Файл | Строк | Роль |
|---|---|---|
ui/providers/ProviderFormScreen.kt | 700+ | Форма: подключение → модели → тест, липкий Save |
ui/providers/ProvidersScreen.kt | 470 | Список, поиск, быстрый тест |
ui/providers/ProvidersViewModel.kt | 270 | Состояние, CRUD, квоты, discover |
ui/providers/ProviderCard.kt | 314 | Карточка провайдера, расход, квоты |
ui/providers/ProviderUsageSheet.kt | 199 | Подробный расход |
ui/providers/ProviderFormat.kt | 192 | Форматирование статусов, квот, контекста |
ui/providers/ProviderDialogs.kt | 164 | Тест и discover-модели |
ui/providers/ProviderUsageParts.kt | 101 | Sparkline, метки сброса |
ui/providers/ProviderPresets.kt | 86 | Пресеты провайдеров |
ui/providers/ProviderInsights.kt | 85 | Инсайты моделей |
ui/providers/ProviderActionsSheet.kt | 101 | Лист действий |
Данные и API
Репозиторий: data/repo/ApiProvidersRepository.kt.
| Эндпоинт | Назначение |
|---|---|
GET /api/v1/providers | Список |
POST /api/v1/providers | Создать |
GET /api/v1/providers/{id} | Один |
PUT /api/v1/providers/{id} | Обновить |
PATCH /api/v1/providers/{id} | Только флаг enabled |
DELETE /api/v1/providers/{id} | Удалить |
POST /api/v1/providers/{id}/test | Тест подключения |
POST /api/v1/providers/{id}/discover | Обнаружить модели |
GET /api/v1/providers/{id}/quota | Квота/баланс провайдера (?force=1) |
GET /api/v1/providers/quota | Квоты/балансы всех (?force=1) |
POST /api/v1/providers/probe | Проба base URL |
POST /api/v1/providers/probe-test | Проба с тестом |
GET /api/v1/models | Каталог моделей |
GET /api/v1/plugins | Плагины/расширения |
GET /api/v1/stats | Статистика |
Плюс data/api/ApiProviderDtos.kt — DTO. Провайдер с промпт-триггером PROVIDERS_PROMPT = "y83@providers" (агент может открыть экран).
Агент
MCP-тулы
ai_status— провайдеры и аккаунты веб-ИИ, квоты, статистика (косвенно видит и API-провайдеров через роутер).ai_ask(model, provider)— спросить модель этого провайдера.image_generate(model)/image_edit(source_id|source_path|source_url)— генерация и правка картинок (не провайдер API, а отдельный сервис y83.media). Правка умеет PNG-маску (mask_path/mask_url), прямоугольники (mask_region), outpaint (anypaint_padding) и перенос стиля референсом (style_refs); рядом стоятimage_status/image_jobs/image_cancel/image_quota. Тот же путь доступен человеку в окне правки просмотрщика — полный контракт в../../tech/image-generation.md.
Как агент пользуется
- Экран настраивает провайдера (ключ, base URL, модели).
- Роутер (
internal/providers/router.go) выбирает провайдера для запроса. - Агент зовёт
ai_askсprovider:/model:— роутер идёт в нужный API.
Подводные камни
- Ключ хранится на backend. Приложение получает маскированный (
providerKeyLabel); полный ключ не покидает backend. discoverтребует рабочего ключа — без него список моделей пуст. Ошибка апстрима приходит с HTTP 200 иok:false(как уtest), поэтому экран показывает её, а не падает наApiException.- Vision-флаг ручной. Если модель умеет видеть, но не помечена — агент её не выберет (Vision опирается на этот флаг + автоопределение).
- Квоты приходят от провайдера. Не все API дают квоту — бывает
providerStatusReasonс объяснением. - Выключенный провайдер не участвует в роутере, но остаётся в списке.
probeиtest— разные вещи: probe запрашиваетGET /models, test — шлёт один реальный запрос к модели. Оба принимаютproviderId, чтобы черновик формы не терял сохранённый ключ, и отдают результат с HTTP 200 (ok:falseпри ошибке провайдера).
Как обновлять
- Каталог:
data/InstrumentCatalog.kt(idapi). - Маршрут:
ui/navigation/Screen.kt(Screen.ApiProviders,Screen.AddEditProvider). - Код:
ui/providers/*. - Репозиторий:
data/repo/ApiProvidersRepository.kt. - API:
data/api/BackendApiProviders.kt,ApiProviderDtos.kt, роуты —backend/internal/api/v1/routes.go. - Роутер моделей:
backend/internal/providers/router.go.