Modelle-Übersicht
Ongrid liefert kein eingebackenes Modell aus. Die Plattform ist ein Multi-Provider-Router: Sie liefern API-Keys für ein oder mehrere Upstreams, der Manager exponiert den konfigurierten Katalog im Per-Message-Picker der SPA, und jeder Chat- / RCA- / Translate-Aufruf dispatcht zur Laufzeit an den richtigen Upstream.
Sieben Provider werden von Haus aus unterstützt:
| Provider | Standardmodell | 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-kompatibel) | — | ONGRID_CUSTOM_API_KEY + Base-URL |
Plus:
- Eine Routing-Schicht — Provider pro Aufruf wählen, dynamischer Default.
- Ein Budget-Gate — globaler Per-UTC-Tag-Token-Cap.
Die zwei Konfigurationspfade
Beide Pfade produzieren dieselbe []llm.ProviderConfig, die der Router konsumiert; sie unterscheiden sich nur darin, wer den Knopf bedient.
Env-geseedet (Boot)
cmd/ongrid/main.go liest cfg.LLM.* und seedet passende Zeilen in system_settings.llm.* via setting.Service.SetIfAbsent. Der erste Boot einer frischen Installation mit ONGRID_ANTHROPIC_API_KEY=... endet mit einer funktionierenden Anthropic-Default-Installation — kein SPA-Login erforderlich.
SetIfAbsent ist der Schlüssel — Re-Boots überschreiben nie Operator-Edits in der SPA.
Settings-UI (Laufzeit)
/settings/llm in der SPA lässt einen Admin:
- Den Per-Provider-API-Key hinzufügen / rotieren (gespeichert in
system_settings.llm.<provider>_api_keymit gesetztem Secret-Flag). - Die BaseURL editieren (Relays, regionale Endpunkte, China-basierte Mirrors).
- Die Per-Provider-Modell-Liste pflegen (das geschlossene Set, das der Picker zeigt).
- Das Standardmodell pro Provider pinnen.
- Den Default-Provider auswählen — auf was der Home-Page-Chat zurückfällt, wenn kein Per-Message-Pin gesetzt ist.
Die 6 Vendor-Karten plus die 7. „Custom"-Karte rendern mit ihren echten Provider-Mark-Logos (bezogen von simple-icons), sodass Admins sie ohne Labels lesen erkennen.
Hot Swap
Provider-Edits treten innerhalb von 60s ohne Manager-Restart in Kraft. Die DB → Router-Cache-TTL ist die 60s des Resolvers plus die eigenen 60s des MultiClient — also Worst-Case 120s. Edge-Agenten sind unbetroffen; der Manager ist der einzige LLM-Client.
Der Resolver
LLMSettingsResolver liest aus system_settings.llm.* und stellt []llm.ProviderConfig zusammen. Fällt pro Feld auf env-Defaults zurück, sodass eine halb-konfigurierte Installation (Key via env gesetzt, BaseURL leer gelassen) trotzdem funktioniert.
// internal/manager/biz/setting/llm.go:133
func (r *LLMSettingsResolver) ResolveProviders(ctx context.Context) (
providers []llm.ProviderConfig, defaultProvider string, err error,
)Provider-IDs sind stabile Strings: openai, anthropic, zhipu, gemini, deepseek, kimi, custom. Diese IDs tauchen überall auf — der Chat-Picker, Audit-Logs, ChatReq.Provider, WithProvider-Option.
Der Katalog-Endpunkt
GET /v1/aiops/models gibt den Katalog zurück, den der SPA-Picker rendert:
{
"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"
}Provider ohne konfigurierten API-Key werden stillschweigend gedroppt — so weiß der Picker, was tatsächlich verfügbar ist. API-Keys selbst werden von diesem Endpunkt nie zurückgegeben.
Per-Call-Dispatch
Ein ChatReq trägt ein Provider-Feld; wenn gesetzt, dispatcht MultiClient.Chat zum passenden Sub-Client. Wenn leer, verwendet der Router den konfigurierten Default (DB > env > erstes sortiertes).
// internal/pkg/llm/router.go
func (m *MultiClient) Chat(ctx context.Context, req ChatReq) (*ChatResp, error)Für Graph-Kernel-Aufrufe (der ReAct-Agent) ist das Äquivalent llm.WithProvider(id) als eino-Modell-Option — siehe Routing.
Wo was ist
- Anthropic / OpenAI / Zhipu / DeepSeek / Gemini / Kimi / Custom — eine Seite pro Provider mit den Umgebungsvariablen, dem Standardmodell und allen vendor-spezifischen Eigenheiten.
- Routing & Default —
RoutingChatModel.pick, der DefaultResolver und wie man im Code einen Nicht-Default-Provider verdrahtet. - Budget & Limits —
ONGRID_LLM_DAILY_TOKEN_LIMIT, derBudgetCallback, dieErrBudgetExceeded-Semantik.
Siehe auch
- Architektur — wo die LLM-Schicht in der L3-Intelligenzschicht sitzt.
- Umgebungsvariablen — die vollständige
ONGRID_*_API_KEY- +ONGRID_*_MODEL- +ONGRID_*_BASE_URL-Matrix.