Skip to content

Custom (OpenAI-совместимый)

TL;DR

bash
ONGRID_CUSTOM_API_KEY=...
ONGRID_CUSTOM_BASE_URL=https://your-relay/v1     # REQUIRED — no upstream default
ONGRID_CUSTOM_MODEL=your-default-model

Provider id: custom. SDK adapter: eino-openai (любой OpenAI Chat Completions–совместимый эндпоинт).

Custom slot — 7-я provider-карточка в Settings UI. Она существует для всего, что OpenAI-совместимо на wire-уровне, но не один из шести запечённых providers:

  • Self-hosted vLLM / TGI / llama.cpp.
  • OpenRouter, Together, Fireworks, Anyscale, Groq, Mistral.
  • Внутренние корпоративные model-шлюзы.
  • Новые providers, которые отгружаются до того, как Ongrid добавит им dedicated slot.

Guard на base-URL

Custom slot требует явный base URL. Без него underlying SDK молча fall back'нул бы на дефолт OpenAI (https://api.openai.com/v1), отправляя operator's custom key на неправильный хост. Resolver пропускает provider в таком случае:

go
// internal/manager/biz/setting/llm.go:155
if pk.id == model.LLMProviderCustom && strings.TrimSpace(baseURL) == "" {
    continue
}

Предоставьте BaseURL через env или Settings UI; иначе provider никогда не появится в каталоге.

Env-переменные

VarПо умолчаниюЗаметки
ONGRID_CUSTOM_API_KEYПусто = provider выпадает
ONGRID_CUSTOM_BASE_URLREQUIRED
ONGRID_CUSTOM_MODELДефолтный model id, отправляемый на каждый вызов
ONGRID_CUSTOM_MODELSCatalog-список (closed set, который показывает picker SPA)

Нет out-of-box дефолтного каталога — заполните то, что ваш эндпоинт поддерживает.

Pre-registered внутренний ChatModel

Graph-kernel runtime pre-registers внутренний ChatModel для provider id custom при загрузке, даже когда ключ ещё не сконфигурирован. Это свойство «сконфигурированный ПОСЛЕ загрузки маршрутизируется немедленно, без рестарта», которое операторы ожидают от Settings UI:

go
// cmd/ongrid/main.go:2457
for _, id := range []string{
    llm.ProviderOpenAI, llm.ProviderAnthropic, llm.ProviderZhipu,
    llm.ProviderGemini, llm.ProviderDeepSeek, llm.ProviderKimi, llm.ProviderCustom,
} {
    if _, ok := innerModels[id]; !ok {
        addInner(id, "") // model supplied per-call (picker / DefaultResolver)
    }
}

Внутренний существует при загрузке; per-call key / baseURL разрешается динамически через LLM-settings resolver. Несконфигурированные providers никогда не достают до picker (каталог /v1/aiops/models гейтится на ResolveProviders), так что внутренний безвреден, пока он действительно не нужен.

Примеры конфигурации

OpenRouter

bash
ONGRID_CUSTOM_API_KEY=sk-or-v1-...
ONGRID_CUSTOM_BASE_URL=https://openrouter.ai/api/v1
ONGRID_CUSTOM_MODEL=anthropic/claude-sonnet-4
ONGRID_CUSTOM_MODELS=anthropic/claude-sonnet-4,anthropic/claude-opus-4,meta-llama/llama-3.3-70b

Локальный vLLM

bash
ONGRID_CUSTOM_API_KEY=sk-not-checked-by-vllm
ONGRID_CUSTOM_BASE_URL=http://vllm.internal:8000/v1
ONGRID_CUSTOM_MODEL=Qwen2.5-72B-Instruct
ONGRID_CUSTOM_MODELS=Qwen2.5-72B-Instruct

vLLM не валидирует API-ключи по умолчанию — поставьте любую непустую строку.

Groq

bash
ONGRID_CUSTOM_API_KEY=gsk_...
ONGRID_CUSTOM_BASE_URL=https://api.groq.com/openai/v1
ONGRID_CUSTOM_MODEL=llama-3.3-70b-versatile

Mistral

bash
ONGRID_CUSTOM_API_KEY=...
ONGRID_CUSTOM_BASE_URL=https://api.mistral.ai/v1
ONGRID_CUSTOM_MODEL=mistral-large-latest

Сделать Custom дефолтным

bash
ONGRID_LLM_DEFAULT_PROVIDER=custom

Берегитесь LLM-resolver bug — если default_provider не установлен, resolver fall back'ит на первый отсортированный provider id (anthropic). С OpenRouter, подключённым через custom slot, но default_provider="", chat-вызовы идут к Anthropic model id на Anthropic-эндпоинте, не OpenRouter — который падает на auth. Поставьте default_provider=custom явно.

Особенности

  • Schema fidelity — предполагает, что эндпоинт говорит реальный OpenAI Chat Completions. Эндпоинты, которые срезают поля (tool_calls, finish_reason), будут стабильно деградировать function-calling агента.
  • Streaming — многие relays пока не поддерживают streaming. Адаптер обрабатывает оба режима; если Stream() ошибается "streaming not supported", chat-UI авто-fall back'ит на buffered.
  • Нет нативного rate-limit — корпоративные шлюзы часто наложат per-token rate limits, которые не показываются как стандартные 429. Поставьте ONGRID_LLM_DAILY_TOKEN_LIMIT для cross-provider budget-guard — см. Budget.

См. также