模型概览
Ongrid 不带烤好的模型。平台是一个多 provider 路由器:你给一个或多个上 游的 API key,manager 把配好的目录露给 SPA 的按消息 picker,每次 chat / RCA / translate 在运行时派发到对的上游。
开箱支持七个 provider:
| Provider | 默认 model | 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 兼容) | — | ONGRID_CUSTOM_API_KEY + base URL |
加上:
两条配置路径
两条都产出同一个 []llm.ProviderConfig 给路由器消费;区别只在谁转旋钮。
env 播种(启动)
cmd/ongrid/main.go 读 cfg.LLM.*,通过 setting.Service.SetIfAbsent 把匹配的行种到 system_settings.llm.*。新装 首次启动带 ONGRID_ANTHROPIC_API_KEY=... 就以一个能用的 Anthropic-默认装机 结束 —— 不用登 SPA。
SetIfAbsent 是关键 —— 重启从不覆盖 SPA 里的运维编辑。
Settings UI(运行时)
SPA 里的 /settings/llm 让 admin:
- 加 / 轮转按 provider 的 API key(带 secret flag 存到
system_settings.llm.<provider>_api_key)。 - 改 BaseURL(中继、区域端点、中国镜像)。
- 维护按 provider 的模型列表(picker 显示的闭合集)。
- 钉每个 provider 的默认模型。
- 选默认 provider —— 没按消息钉时主页 chat 用的回退。
6 个 provider 卡片加第 7 个 "Custom" 卡片渲染时带真实 provider mark logo (来自 simple-icons),让 admin 不看 label 也能认出来。
热切
provider 编辑 60s 内生效,不用重启 manager。DB → 路由器缓存 TTL 是 resolver 的 60s,加 MultiClient 自己的 60s —— 最坏 120s。edge agent 不受影响;manager 是唯一的 LLM client。
resolver
LLMSettingsResolver 从 system_settings.llm.* 读,装出 []llm.ProviderConfig。每字段按 env 默认回退,所以半配的装机(env 设了 key,BaseURL 留空)也能跑。
// internal/manager/biz/setting/llm.go:133
func (r *LLMSettingsResolver) ResolveProviders(ctx context.Context) (
providers []llm.ProviderConfig, defaultProvider string, err error,
)Provider id 是稳定字符串:openai、anthropic、zhipu、gemini、 deepseek、kimi、custom。这些 id 到处出现 —— chat picker、审计日志、 ChatReq.Provider、WithProvider 选项。
目录 endpoint
GET /v1/aiops/models 返回 SPA picker 渲染的目录:
{
"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"
}没配 API key 的 provider 静默丢掉 —— picker 就这么知道实际有什么可选。API key 本身永远不会从这个 endpoint 返回。
按调派发
ChatReq 带 Provider 字段;设了的话 MultiClient.Chat 派给匹配的子 client。 空的话路由器用配置的默认(DB > env > 字典序第一)。
// internal/pkg/llm/router.go
func (m *MultiClient) Chat(ctx context.Context, req ChatReq) (*ChatResp, error)graph-kernel 调用(ReAct agent)等价是 llm.WithProvider(id) 作为 eino model 选项 —— 见 路由。
哪里看什么
- Anthropic / OpenAI / Zhipu / DeepSeek / Gemini / Kimi / Custom —— 每个 provider 一页,带 env 变量、默认 model、 厂商专属怪癖。
- 路由与默认 ——
RoutingChatModel.pick、DefaultResolver、 代码里怎么接一个非默认 provider。 - 预算与限额 ——
ONGRID_LLM_DAILY_TOKEN_LIMIT、BudgetCallback、ErrBudgetExceeded语义。