Skip to content

Custom (OpenAI-kompatibel)

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 (jeder OpenAI-Chat-Completions–kompatible Endpunkt).

Der Custom-Slot ist die 7. Provider-Karte in der Settings-UI. Er existiert für alles, was auf Wire-Level OpenAI-kompatibel ist, aber nicht einer der sechs eingebackenen Provider ist:

  • Selbstgehostetes vLLM / TGI / llama.cpp.
  • OpenRouter, Together, Fireworks, Anyscale, Groq, Mistral.
  • Interne Corporate-Modell-Gateways.
  • Neue Provider, die ausgeliefert werden, bevor Ongrid einen dedizierten Slot für sie hinzufügt.

Der Base-URL-Guard

Der Custom-Slot erfordert eine explizite Base-URL. Ohne eine würde das zugrundeliegende SDK stillschweigend auf OpenAIs Default zurückfallen (https://api.openai.com/v1) und den custom-Key des Operators an den falschen Host senden. Der Resolver überspringt den Provider in diesem Fall:

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

Liefern Sie eine BaseURL via env oder Settings-UI; sonst erscheint der Provider nie im Katalog.

Umgebungsvariablen

VarDefaultNotizen
ONGRID_CUSTOM_API_KEYLeer = Provider gedroppt
ONGRID_CUSTOM_BASE_URLERFORDERLICH
ONGRID_CUSTOM_MODELStandard-Modell-ID, die bei jedem Aufruf gesendet wird
ONGRID_CUSTOM_MODELSKatalog-Liste (geschlossenes Set, das der SPA-Picker zeigt)

Es gibt keinen Out-of-Box-Default-Katalog — füllen Sie ein, was Ihr Endpunkt unterstützt.

Pre-registrierter innerer ChatModel

Die Graph-Kernel-Runtime registriert einen inneren ChatModel für die custom-Provider-ID beim Boot vorab, auch wenn noch kein Key konfiguriert ist. Das ist die „konfiguriert NACH Boot routet sofort, kein Restart"-Eigenschaft, die Operatoren von der Settings-UI erwarten:

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)
    }
}

Der Inner existiert beim Boot; der Per-Call-Key / BaseURL wird dynamisch via den LLM-Settings-Resolver aufgelöst. Unkonfigurierte Provider erreichen nie den Picker (der /v1/aiops/models-Katalog gatet auf ResolveProviders), sodass der Inner harmlos ist, bis er tatsächlich gebraucht wird.

Konfigurationsbeispiele

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

Lokales 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 validiert API-Keys standardmäßig nicht — setzen Sie eine beliebige nicht-leere Zeichenkette.

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 zum Default machen

bash
ONGRID_LLM_DEFAULT_PROVIDER=custom

Achten Sie auf den LLM-Resolver-Bug — wenn default_provider nicht gesetzt ist, fällt der Resolver auf die erstsortierte Provider-ID (anthropic) zurück. Mit OpenRouter via den Custom-Slot verdrahtet, aber default_provider="", gehen Chat-Aufrufe an Anthropics Modell-ID auf Anthropics Endpunkt, nicht an OpenRouter — was beim Auth fehlschlägt. Setzen Sie default_provider=custom explizit.

Eigenheiten

  • Schema-Treue — nimmt an, dass der Endpunkt echtes OpenAI-Chat-Completions spricht. Endpunkte, die Felder strippen (tool_calls, finish_reason), degradieren das Function-Calling des Agenten zuverlässig.
  • Streaming — viele Relays unterstützen noch kein Streaming. Der Adapter handhabt beide Modi; wenn Stream() mit "streaming not supported" errort, fällt die Chat-UI automatisch auf buffered zurück.
  • Kein natives Rate-Limit — Corporate-Gateways verhängen oft Per-Token-Rate-Limits, die nicht als Standard-429s erscheinen. Setzen Sie ONGRID_LLM_DAILY_TOKEN_LIMIT für einen Cross-Provider-Budget-Guard — siehe Budget.

Siehe auch