Visão geral dos modelos
O Ongrid não vem com um modelo embutido. A plataforma é um router multi-provider: você fornece API keys para um ou mais upstreams, o manager expõe o catálogo configurado ao picker do SPA por-mensagem, e cada chamada de chat / RCA / translate despacha para o upstream certo em runtime.
Sete providers são suportados de fábrica:
| Provider | Modelo padrão | 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-compatible) | — | ONGRID_CUSTOM_API_KEY + base URL |
Mais:
- Uma camada de roteamento — escolha provider por call, default dinâmico.
- Um gate de budget — cap global de tokens por dia UTC.
Os dois caminhos de configuração
Ambos os caminhos produzem o mesmo []llm.ProviderConfig que o router consome; eles diferem apenas em quem opera o knob.
Env-semeado (boot)
cmd/ongrid/main.go lê cfg.LLM.* e semeia linhas correspondentes em system_settings.llm.* via setting.Service.SetIfAbsent. Primeiro boot de uma instalação fresca com ONGRID_ANTHROPIC_API_KEY=... termina com uma instalação Anthropic-default funcionando — sem login no SPA necessário.
SetIfAbsent é a chave — re-boots nunca sobrescrevem edits do operador no SPA.
UI de Settings (runtime)
/settings/llm no SPA deixa um admin:
- Adicionar / rotacionar a API key por-provider (armazenada em
system_settings.llm.<provider>_api_keycom a flag de secret setada). - Editar a BaseURL (relays, endpoints regionais, mirrors China-based).
- Manter a lista de modelo por-provider (o conjunto fechado que o picker mostra).
- Fixar o modelo padrão por-provider.
- Escolher o default provider — o que o chat da home cai quando nenhum pin por-mensagem está setado.
Os 6 cards de vendor mais o 7º card "Custom" renderizam com seus logos reais de mark de provider (originados de simple-icons) para que admins os reconheçam sem ler labels.
Hot swap
Edits de provider têm efeito em 60s sem restart do manager. O TTL de cache DB → router é o 60s do resolver, mais o 60s do próprio MultiClient — então pior caso 120s. Edge agents não são afetados; o manager é o único client LLM.
O resolver
LLMSettingsResolver lê de system_settings.llm.* e monta []llm.ProviderConfig. Cai para defaults de env por-campo para que uma instalação meio-configurada (chave setada via env, BaseURL deixada em branco) ainda funcione.
// internal/manager/biz/setting/llm.go:133
func (r *LLMSettingsResolver) ResolveProviders(ctx context.Context) (
providers []llm.ProviderConfig, defaultProvider string, err error,
)Provider IDs são strings estáveis: openai, anthropic, zhipu, gemini, deepseek, kimi, custom. Esses ids aparecem em todo lugar — o picker de chat, audit logs, ChatReq.Provider, opção WithProvider.
O endpoint do catálogo
GET /v1/aiops/models retorna o catálogo que o picker do SPA renderiza:
{
"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 sem API key configurada são silenciosamente descartados — é assim que o picker sabe o que está realmente disponível. API keys em si nunca são retornadas por este endpoint.
Dispatch por-call
Um ChatReq carrega um campo Provider; quando setado, MultiClient.Chat despacha para o sub-client correspondente. Quando vazio, o router usa o default configurado (DB > env > primeiro ordenado).
// internal/pkg/llm/router.go
func (m *MultiClient) Chat(ctx context.Context, req ChatReq) (*ChatResp, error)Para chamadas de graph-kernel (o agent ReAct), o equivalente é llm.WithProvider(id) como uma opção de modelo eino — veja Roteamento.
O que está onde
- Anthropic / OpenAI / Zhipu / DeepSeek / Gemini / Kimi / Custom — uma página por provider com as env vars, o modelo padrão, e pegadinhas específicas do vendor.
- Routing & default —
RoutingChatModel.pick, o DefaultResolver, e como conectar um provider não-padrão no código. - Budget & limites —
ONGRID_LLM_DAILY_TOKEN_LIMIT, oBudgetCallback, a semânticaErrBudgetExceeded.
Veja também
- Arquitetura — onde a camada LLM se senta na camada L3 de inteligência.
- Variáveis de ambiente — a matriz completa
ONGRID_*_API_KEY+ONGRID_*_MODEL+ONGRID_*_BASE_URL.