Overview de modelos
Ongrid no trae un modelo horneado. La plataforma es un router multi-provider: tú provees API keys para uno o más upstreams, el manager muestra el catálogo configurado al picker por-mensaje de la SPA, y cada llamada de chat / RCA / translate hace dispatch al upstream correcto en runtime.
Siete providers están soportados de fábrica:
| Provider | Modelo default | 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 (compatible con OpenAI) | — | ONGRID_CUSTOM_API_KEY + base URL |
Más:
- Una capa de routing — elige provider por llamada, default dinámico.
- Un gate de budget — tope global de tokens por UTC-día.
Las dos rutas de configuración
Ambas rutas producen el mismo []llm.ProviderConfig que consume el router; difieren solo en quién opera la perilla.
Sembrado por env (boot)
cmd/ongrid/main.go lee cfg.LLM.* y siembra filas matcheando en system_settings.llm.* vía setting.Service.SetIfAbsent. El primer boot de una instalación fresca con ONGRID_ANTHROPIC_API_KEY=... termina con una instalación Anthropic-default funcional — sin login de SPA requerido.
SetIfAbsent es la clave — los re-boots nunca sobrescriben ediciones de operador en la SPA.
UI de Settings (runtime)
/settings/llm en la SPA permite a un admin:
- Añadir / rotar la API key por-provider (almacenada en
system_settings.llm.<provider>_api_keycon el flag secret seteado). - Editar la BaseURL (relays, endpoints regionales, mirrors en China).
- Mantener la lista de modelos por-provider (el conjunto cerrado que muestra el picker).
- Fijar el modelo default por provider.
- Elegir el default provider — a qué cae el chat de la home page cuando no hay pin por-mensaje seteado.
Las 6 cards de vendor más la 7ma card "Custom" se renderizan con sus logos de mark de provider reales (sacados de simple-icons) para que los admins los reconozcan sin leer las labels.
Hot swap
Las ediciones de provider toman efecto en 60s sin reinicio del manager. El TTL de cache DB → router es 60s del resolver, más 60s propios del MultiClient — así que en el peor caso 120s. Los agentes edge no se ven afectados; el manager es el único cliente LLM.
El resolver
LLMSettingsResolver lee de system_settings.llm.* y ensambla []llm.ProviderConfig. Cae a defaults de env por campo, así que una instalación a medio configurar (key seteada vía env, BaseURL en blanco) sigue funcionando.
// internal/manager/biz/setting/llm.go:133
func (r *LLMSettingsResolver) ResolveProviders(ctx context.Context) (
providers []llm.ProviderConfig, defaultProvider string, err error,
)Los IDs de provider son strings estables: openai, anthropic, zhipu, gemini, deepseek, kimi, custom. Estos ids aparecen en todas partes — el picker de chat, audit logs, ChatReq.Provider, opción WithProvider.
El endpoint de catálogo
GET /v1/aiops/models devuelve el catálogo que renderiza el picker de la 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"
}Los providers sin API key configurada se descartan silenciosamente — así sabe el picker qué está realmente disponible. Las API keys en sí nunca son devueltas por este endpoint.
Dispatch por-llamada
Un ChatReq lleva un campo Provider; cuando está seteado, MultiClient.Chat hace dispatch al sub-cliente matcheando. Cuando está vacío, el router usa el default configurado (DB > env > primero ordenado).
// internal/pkg/llm/router.go
func (m *MultiClient) Chat(ctx context.Context, req ChatReq) (*ChatResp, error)Para llamadas del graph-kernel (el agente ReAct), el equivalente es llm.WithProvider(id) como una opción de model eino — ver Routing.
Qué está dónde
- Anthropic / OpenAI / Zhipu / DeepSeek / Gemini / Kimi / Custom — una página por provider con las env vars, el modelo default y cualquier quirk vendor-específico.
- Routing & default —
RoutingChatModel.pick, el DefaultResolver, y cómo cablear un provider no-default en código. - Budget & limits —
ONGRID_LLM_DAILY_TOKEN_LIMIT, elBudgetCallback, la semántica deErrBudgetExceeded.
Ver también
- Arquitectura — dónde se sienta la capa LLM en la capa L3 de intelligence.
- Variables de entorno — la matriz completa
ONGRID_*_API_KEY+ONGRID_*_MODEL+ONGRID_*_BASE_URL.