모델 개요
Ongrid 는 베이크된 모델과 함께 출하 하지 않습니다. 플랫폼은 다중 provider 라우터입니다: 하나 이상의 업스트림에 대해 API 키를 제공하면 매니저가 SPA 의 메시지별 picker 에 구성된 카탈로그를 표면화하고 모든 채팅 / RCA / 번역 호출이 런타임에 올바른 업스트림으로 디스패치됩니다.
박스 그대로 7 provider 가 지원됩니다:
| Provider | 기본 모델 | 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 |
추가:
두 구성 경로
두 경로 모두 라우터가 소비하는 같은 []llm.ProviderConfig 를 생성; 누가 노브를 조작하는지만 다릅니다.
환경 변수 시드 (부팅)
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 은 관리자가:
- Provider 별 API 키 추가 / 회전 (secret 플래그가 설정된
system_settings.llm.<provider>_api_key에 저장). - BaseURL 편집 (relay, 지역 엔드포인트, 중국 기반 미러).
- Provider 별 모델 리스트 유지 (picker 가 보여 주는 폐쇄 셋).
- Provider 별 기본 모델 고정.
- 기본 provider 선택 — 홈 페이지 채팅이 메시지별 고정이 없을 때 폴백하는 곳.
6 벤더 카드와 7 번째 "Custom" 카드는 실제 provider mark 로고 (simple-icons 에서 소싱) 와 함께 렌더링되어 관리자가 레이블을 읽지 않고도 인식할 수 있게.
핫 스왑
Provider 편집은 매니저 재시작 없이 60 초 내에 효과 발생. DB → 라우터 캐시 TTL 은 resolver 의 60 초 + MultiClient 의 자체 60 초 — 최악 경우 120 초. Edge 에이전트는 영향 없음; 매니저가 유일한 LLM 클라이언트.
Resolver
LLMSettingsResolver 가 system_settings.llm.* 에서 읽어 []llm.ProviderConfig 조립. 필드별 환경 기본으로 폴백하여 반쪽 구성 설치 (환경으로 키 설정, 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 는 어디에나 나타남 — 채팅 picker, 감사 로그, ChatReq.Provider, WithProvider 옵션.
카탈로그 엔드포인트
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 키가 구성되지 않은 provider 는 조용히 제거됨 — picker 가 실제로 가용한 것을 아는 방법. API 키 자체는 이 엔드포인트로 절대 반환되지 않음.
호출별 디스패치
ChatReq 가 Provider 필드 운반; 설정 시 MultiClient.Chat 이 매칭 서브 클라이언트로 디스패치. 비어 있을 때 라우터는 구성된 기본 사용 (DB > env > 첫 정렬).
// internal/pkg/llm/router.go
func (m *MultiClient) Chat(ctx context.Context, req ChatReq) (*ChatResp, error)그래프 커널 호출 (ReAct 에이전트) 의 경우 등가물은 eino 모델 옵션으로 llm.WithProvider(id) — 라우팅 참고.
어디에 무엇이
- Anthropic / OpenAI / Zhipu / DeepSeek / Gemini / Kimi / Custom — provider 당 한 페이지: 환경 변수, 기본 모델, 벤더 특화 특이점.
- 라우팅 & 기본 —
RoutingChatModel.pick, DefaultResolver, 코드에서 비기본 provider 배선 방법. - 예산 & 제한 —
ONGRID_LLM_DAILY_TOKEN_LIMIT,BudgetCallback,ErrBudgetExceeded의미.