Skip to content

Custom (compatible con OpenAI)

TL;DR

bash
ONGRID_CUSTOM_API_KEY=...
ONGRID_CUSTOM_BASE_URL=https://your-relay/v1     # REQUIRED — no upstream default
ONGRID_CUSTOM_MODEL=your-default-model

Provider id: custom. Adapter SDK: eino-openai (cualquier endpoint compatible con OpenAI Chat Completions).

El slot Custom es la 7ma card de provider en la UI de Settings. Existe para todo lo que sea compatible con OpenAI a nivel wire pero no sea uno de los seis providers horneados:

  • vLLM / TGI / llama.cpp self-hosted.
  • OpenRouter, Together, Fireworks, Anyscale, Groq, Mistral.
  • Gateways corporativos internos de modelo.
  • Providers nuevos que salgan antes de que Ongrid añada un slot dedicado para ellos.

El guard de base-URL

El slot custom requiere una base URL explícita. Sin una, el SDK subyacente caería silenciosamente al default de OpenAI (https://api.openai.com/v1), enviando la key custom del operador al host equivocado. El resolver saltea el provider en ese caso:

go
// internal/manager/biz/setting/llm.go:155
if pk.id == model.LLMProviderCustom && strings.TrimSpace(baseURL) == "" {
    continue
}

Provee una BaseURL vía env o UI de Settings; en caso contrario el provider nunca aparece en el catálogo.

Env vars

VarDefaultNotas
ONGRID_CUSTOM_API_KEYVacío = provider descartado
ONGRID_CUSTOM_BASE_URLREQUERIDO
ONGRID_CUSTOM_MODELID de modelo default enviado en cada llamada
ONGRID_CUSTOM_MODELSLista de catálogo (conjunto cerrado que muestra el picker de la SPA)

No hay catálogo default de fábrica — rellena lo que tu endpoint soporte.

ChatModel interno pre-registrado

El runtime del graph-kernel pre-registra un ChatModel interno para el provider id custom al boot, incluso cuando no hay key configurada aún. Esta es la propiedad "configurado DESPUÉS del boot rutea inmediatamente, sin reinicio" que los operadores esperan de la UI de Settings:

go
// cmd/ongrid/main.go:2457
for _, id := range []string{
    llm.ProviderOpenAI, llm.ProviderAnthropic, llm.ProviderZhipu,
    llm.ProviderGemini, llm.ProviderDeepSeek, llm.ProviderKimi, llm.ProviderCustom,
} {
    if _, ok := innerModels[id]; !ok {
        addInner(id, "") // model supplied per-call (picker / DefaultResolver)
    }
}

El inner existe al boot; el key / baseURL por-llamada se resuelve dinámicamente vía el LLM-settings resolver. Los providers no configurados nunca alcanzan al picker (el catálogo /v1/aiops/models gateaa en ResolveProviders), así que el inner es inocuo hasta que se necesite realmente.

Ejemplos de configuración

OpenRouter

bash
ONGRID_CUSTOM_API_KEY=sk-or-v1-...
ONGRID_CUSTOM_BASE_URL=https://openrouter.ai/api/v1
ONGRID_CUSTOM_MODEL=anthropic/claude-sonnet-4
ONGRID_CUSTOM_MODELS=anthropic/claude-sonnet-4,anthropic/claude-opus-4,meta-llama/llama-3.3-70b

vLLM local

bash
ONGRID_CUSTOM_API_KEY=sk-not-checked-by-vllm
ONGRID_CUSTOM_BASE_URL=http://vllm.internal:8000/v1
ONGRID_CUSTOM_MODEL=Qwen2.5-72B-Instruct
ONGRID_CUSTOM_MODELS=Qwen2.5-72B-Instruct

vLLM no valida API keys por defecto — pon cualquier string no vacío.

Groq

bash
ONGRID_CUSTOM_API_KEY=gsk_...
ONGRID_CUSTOM_BASE_URL=https://api.groq.com/openai/v1
ONGRID_CUSTOM_MODEL=llama-3.3-70b-versatile

Mistral

bash
ONGRID_CUSTOM_API_KEY=...
ONGRID_CUSTOM_BASE_URL=https://api.mistral.ai/v1
ONGRID_CUSTOM_MODEL=mistral-large-latest

Haciendo a Custom el default

bash
ONGRID_LLM_DEFAULT_PROVIDER=custom

Cuidado con el bug del resolver LLM — si default_provider no está seteado, el resolver cae al primer provider id ordenado (anthropic). Con OpenRouter cableado vía el slot custom pero default_provider="", las llamadas de chat van al id de modelo de Anthropic en el endpoint de Anthropic, no a OpenRouter — lo cual falla en auth. Establece default_provider=custom explícitamente.

Quirks

  • Fidelidad de schema — asume que el endpoint habla Chat Completions OpenAI real. Endpoints que eliminan campos (tool_calls, finish_reason) degradarán la function-calling del agente confiablemente.
  • Streaming — muchos relays no soportan streaming aún. El adapter maneja ambos modos; si Stream() erra con "streaming not supported", la UI de chat auto-cae a buffered.
  • Sin rate-limit nativo — los gateways corporativos frecuentemente imponen rate limits por-token que no aparecen como 429s estándar. Setea ONGRID_LLM_DAILY_TOKEN_LIMIT para un guard de budget cross-provider — ver Budget.

Ver también