Обзор моделей
Ongrid не отгружается с запечённой моделью. Платформа — это multi-provider router: вы предоставляете API-ключи для одного или более upstream, manager выставляет сконфигурированный каталог per-message picker SPA, и каждый chat / RCA / translate вызов диспетчирует на правильный upstream в рантайме.
Семь providers поддерживаются из коробки:
| Provider | Дефолтная модель | Env key |
|---|---|---|
| Anthropic | claude-sonnet-4-6 | ONGRID_ANTHROPIC_API_KEY |
| OpenAI | gpt-5.4 | ONGRID_OPENAI_API_KEY |
| Zhipu (GLM) | glm-4.7 | ONGRID_ZHIPU_API_KEY |
| DeepSeek | deepseek-v4-flash | ONGRID_DEEPSEEK_API_KEY |
| Gemini | gemini-2.5-pro | ONGRID_GEMINI_API_KEY |
| Kimi | kimi-k2.6 | ONGRID_KIMI_API_KEY |
| Custom (OpenAI-совместимый) | — | ONGRID_CUSTOM_API_KEY + base URL |
Плюс:
- Routing layer — выбор provider per call, dynamic default.
- Budget gate — global per-UTC-day token cap.
Два пути конфигурации
Оба пути производят тот же []llm.ProviderConfig, который потребляет router; они различаются только тем, кто оперирует ручкой.
Env-seeded (boot)
cmd/ongrid/main.go читает cfg.LLM.* и seed'ит соответствующие строки в system_settings.llm.* через setting.Service.SetIfAbsent. Первый запуск свежей установки с ONGRID_ANTHROPIC_API_KEY=... заканчивается рабочей Anthropic-default установкой — SPA-логин не требуется.
SetIfAbsent — ключ — рестарты никогда не перезаписывают operator-правки в SPA.
Settings UI (runtime)
/settings/llm в SPA позволяет админу:
- Добавлять / ротировать per-provider API-ключ (хранится в
system_settings.llm.<provider>_api_keyс установленным secret-флагом). - Редактировать BaseURL (relays, regional endpoints, China-based mirrors).
- Поддерживать per-provider список моделей (closed-set, который показывает picker).
- Закреплять дефолтную модель per provider.
- Выбирать default provider — куда home-page chat fall back'ит, когда per-message pin не установлен.
6 vendor-карточек плюс 7-я «Custom» карточка рендерятся с их реальными provider-mark логотипами (sourced from simple-icons), так что админы их узнают без чтения labels.
Hot swap
Provider-правки вступают в силу в пределах 60с без рестарта manager. DB → router cache TTL — 60с resolver, плюс собственные 60с MultiClient — так что worst case 120с. Edge-агенты не затронуты; manager — единственный LLM-клиент.
Resolver
LLMSettingsResolver читает из system_settings.llm.* и собирает []llm.ProviderConfig. Fall back'ит на env-дефолты per field, так что полу-сконфигурированная установка (ключ установлен через env, BaseURL пустой) всё ещё работает.
// internal/manager/biz/setting/llm.go:133
func (r *LLMSettingsResolver) ResolveProviders(ctx context.Context) (
providers []llm.ProviderConfig, defaultProvider string, err error,
)Provider ID — стабильные строки: openai, anthropic, zhipu, gemini, deepseek, kimi, custom. Эти id показываются везде — chat-picker, audit-логи, ChatReq.Provider, опция WithProvider.
Catalog-эндпоинт
GET /v1/aiops/models возвращает каталог, который рендерит picker SPA:
{
"providers": [
{
"id": "anthropic",
"label": "Anthropic",
"default_model": "claude-sonnet-4-6",
"models": ["claude-opus-4-7", "claude-sonnet-4-6", "claude-haiku-4-5"]
},
{
"id": "zhipu", "label": "Zhipu (GLM)",
"default_model": "glm-4.7",
"models": ["glm-5.1", "glm-5", "glm-4.7", "glm-4.7-flash"]
}
],
"default": "anthropic"
}Providers без сконфигурированного API-ключа молча выпадают — так picker знает, что реально доступно. Сами API-ключи никогда не возвращаются этим эндпоинтом.
Per-call dispatch
ChatReq несёт поле Provider; когда установлено, MultiClient.Chat диспетчирует на соответствующий sub-клиент. Когда пусто, router использует сконфигурированный дефолт (DB > env > first sorted).
// internal/pkg/llm/router.go
func (m *MultiClient) Chat(ctx context.Context, req ChatReq) (*ChatResp, error)Для graph-kernel вызовов (ReAct-агент), эквивалент — llm.WithProvider(id) как опция eino-модели — см. Routing.
Что где
- Anthropic / OpenAI / Zhipu / DeepSeek / Gemini / Kimi / Custom — одна страница на provider с env-переменными, дефолтной моделью и любыми vendor-специфичными особенностями.
- Routing & default —
RoutingChatModel.pick, DefaultResolver, и как подключить не-дефолтного provider в коде. - Budget & limits —
ONGRID_LLM_DAILY_TOKEN_LIMIT,BudgetCallback, семантикаErrBudgetExceeded.
См. также
- Архитектура — где LLM-слой сидит в L3 intelligence слое.
- Переменные окружения — полная матрица
ONGRID_*_API_KEYONGRID_*_MODEL+ONGRID_*_BASE_URL.