Skip to content

Обзор моделей

Ongrid не отгружается с запечённой моделью. Платформа — это multi-provider router: вы предоставляете API-ключи для одного или более upstream, manager выставляет сконфигурированный каталог per-message picker SPA, и каждый chat / RCA / translate вызов диспетчирует на правильный upstream в рантайме.

Семь providers поддерживаются из коробки:

ProviderДефолтная модельEnv key
Anthropicclaude-sonnet-4-6ONGRID_ANTHROPIC_API_KEY
OpenAIgpt-5.4ONGRID_OPENAI_API_KEY
Zhipu (GLM)glm-4.7ONGRID_ZHIPU_API_KEY
DeepSeekdeepseek-v4-flashONGRID_DEEPSEEK_API_KEY
Geminigemini-2.5-proONGRID_GEMINI_API_KEY
Kimikimi-k2.6ONGRID_KIMI_API_KEY
Custom (OpenAI-совместимый)ONGRID_CUSTOM_API_KEY + base URL

Плюс:

Два пути конфигурации

Оба пути производят тот же []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 пустой) всё ещё работает.

go
// 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:

json
{
  "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).

go
// 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 & defaultRoutingChatModel.pick, DefaultResolver, и как подключить не-дефолтного provider в коде.
  • Budget & limitsONGRID_LLM_DAILY_TOKEN_LIMIT, BudgetCallback, семантика ErrBudgetExceeded.

См. также