Agentes de programación con IA y harness
Apunte Claude Code, Codex CLI, OpenClaw, Cline, Cursor y más de 25 agentes de programación al gateway con los mismos tres pasos, cada uno con su destino de configuración exacto y los nombres de sus claves.
Todos los agentes de programación con IA leen una URL base y una clave de API de algún sitio: una variable de entorno, un archivo de configuración o un panel de ajustes. Esta página indica de dónde lee cada harness, qué protocolo habla y la particularidad que realmente hace tropezar a la gente. Las configuraciones completas listas para copiar están en la documentación.
Apunte base_url al gateway
Por defecto https://your-gateway.gatellm.io; que incluya /v1 depende del SDK (cada ejemplo indica el valor exacto).
Cambie a una clave de acceso del gateway
No es una clave upstream sk-…; la misma clave de acceso se monta en la cabecera que espere su SDK.
Use el nombre del modelo del gateway
El que haya configurado en la consola, no el nombre oficial del proveedor.
Authorization: Bearer <key>x-api-key: <key>x-goog-api-key: <key>Matriz de compatibilidad de harness
| Harness | Protocolo | Soporte | Destino de configuración | Nombres de claves / ajustes | Documentación |
|---|---|---|---|---|---|
| Agentes de terminal | |||||
| Claude Code | Anthropic | Nativo | env vars | ANTHROPIC_BASE_URL, ANTHROPIC_API_KEY, ANTHROPIC_MODEL | Configuración en GitHub ↗ · Documentación |
| Codex CLI | OpenAI Responses | Nativo | ~/.codex/config.toml | base_url, env_key, wire_api | Configuración en GitHub ↗ · Documentación |
| Gemini CLI | Gemini | Nativo | env vars | GOOGLE_GEMINI_BASE_URL, GEMINI_API_KEY | Configuración en GitHub ↗ · Documentación |
| OpenClaw | OpenAI / Anthropic-compatible | Compatible con OpenAI | openclaw.json | models.providers.<id>.baseUrl, models.providers.<id>.apiKey | Documentación |
| opencode | OpenAI-compatible | Compatible con OpenAI | opencode.json | provider.<id>.options.baseURL | Documentación |
| Crush | OpenAI / Anthropic-compatible | Compatible con OpenAI | crush.json | providers.<id>.base_url, providers.<id>.type | Documentación |
| Factory Droid | OpenAI / Anthropic-compatible | Compatible con OpenAI | ~/.factory/settings.json | customModels[].baseUrl, customModels[].provider | Documentación |
| Goose | OpenAI-compatible | Compatible con OpenAI | env vars | OPENAI_HOST, OPENAI_BASE_PATH, OPENAI_API_KEY | Documentación |
| Aider | OpenAI-compatible (LiteLLM) | Compatible con OpenAI | env vars | OPENAI_API_BASE | Documentación |
| Qwen Code | OpenAI-compatible | Compatible con OpenAI | env vars | OPENAI_BASE_URL, OPENAI_API_KEY, OPENAI_MODEL | Documentación |
| OpenHands | OpenAI-compatible (LiteLLM) | Compatible con OpenAI | ~/.openhands/settings.json | base_url, model openai/ prefix | Documentación |
| Kimi Code CLI | OpenAI / Anthropic | Compatible con OpenAI | config.toml | providers | Documentación |
| Plandex | OpenAI-compatible | Compatible con OpenAI | custom models JSON | baseUrl | Documentación |
| SWE-agent | OpenAI-compatible (LiteLLM) | Compatible con OpenAI | env vars | OPENAI_BASE_URL | Documentación |
| Grok Build | OpenAI-compatible | Compatible con OpenAI | config.toml | custom models | Documentación |
| Mistral Vibe | OpenAI-compatible | Compatible con OpenAI | ~/.vibe/config.toml | providers | Documentación |
| MiMo Code | OpenAI-compatible | Compatible con OpenAI | /connect custom provider | base URL, API key | Documentación |
| ForgeCode | OpenAI / Anthropic | Compatible con OpenAI | setup wizard | base URL | Documentación |
| Codebuff | OpenAI-compatible | Compatible con OpenAI | settings | base URL, API key | Documentación |
| IDE y extensiones | |||||
| Cline | OpenAI-compatible | Compatible con OpenAI | Settings → OpenAI Compatible | Base URL, API Key, Model ID | Documentación |
| Roo Code | OpenAI-compatible | Compatible con OpenAI | Settings → OpenAI Compatible | Base URL, API Key, Model ID | Documentación |
| Kilo Code | OpenAI-compatible | Compatible con OpenAI | Settings → OpenAI Compatible | Base URL, API Key, Model ID | Documentación |
| Continue | OpenAI-compatible | Compatible con OpenAI | config.yaml | models[].apiBase | Documentación |
| Zed | OpenAI-compatible | Compatible con OpenAI | settings.json | language_models.openai_compatible.<id>.api_url | Documentación |
| Cursor | OpenAI | Parcial | Settings → Models → Override OpenAI Base URL | Override OpenAI Base URL | Documentación |
| Windsurf | OpenAI-compatible | Compatible con OpenAI | Settings → Models → BYOK / custom | Base URL, API Key | Documentación |
| GitHub Copilot (BYOK) | OpenAI-compatible | Compatible con OpenAI | Manage Models → OpenAI-compatible | Base URL, API Key | Documentación |
| Plataformas gestionadas | |||||
| Warp | OpenAI / Anthropic / Gemini (BYOK) | Parcial | Settings → BYOK | BYOK API keys | Documentación |
| Amazon Q Developer CLI | MCP | Sin endpoint personalizado | MCP server | — | Documentación |
| Devin | — | Sin endpoint personalizado | — | — | Documentación |
Cómo nombrar el modelo del gateway
Algunos harness fijan su propio ID de modelo y lo envían tal cual. Si su modelo del gateway tiene otro nombre, la primera llamada devuelve 404. Dos formas de alinearlos:
Asigne al modelo del gateway exactamente el nombre que solicita el harness: sin configuración adicional.
O modifique el harness para que use el nombre de su gateway mediante su variable de entorno de modelo (por ejemplo, ANTHROPIC_MODEL).
Particularidades
Claude Code envía el valor predeterminado que tenga configurado (por ejemplo, claude-opus-5 o claude-sonnet-5), no el nombre de su gateway. O asigne al modelo del gateway exactamente el nombre que solicita el harness, o configure la variable de entorno del modelo del harness (por ejemplo, ANTHROPIC_MODEL) con el nombre de su gateway. Una discrepancia produce 404 model_not_found en el primer mensaje.
La URL base para clientes de estilo Anthropic apunta a la raíz del gateway (sin /v1); el cliente añade /v1/messages por su cuenta. Añadir /v1 aquí duplica el segmento de ruta.
Codex CLI exige wire_api = "responses" para un bloque personalizado [model_providers.*]. El gateway implementa /v1/responses de forma nativa: apunte allí base_url y asigne env_key a una clave de acceso del gateway.
Aider, OpenHands y SWE-agent se apoyan en LiteLLM: configure OPENAI_API_BASE con el gateway y dé al modelo un prefijo openai/ (por ejemplo, openai/nombre-del-modelo-del-gateway) para que LiteLLM lo enrute como un endpoint compatible con OpenAI.
Codex, Gemini CLI y Qwen Code usan por defecto el inicio de sesión OAuth o de suscripción del proveedor. Para pasar por el gateway debe cambiar a autenticación con clave de API (configurar la clave y la URL base explícitamente); de lo contrario, el agente omite el gateway por completo.
Cline / Roo / Kilo y otros deciden la capacidad de llamada a herramientas y de visión a partir del nombre del modelo. Un nombre personalizado del gateway puede desactivar el function calling; si fallan las llamadas a herramientas, revise las reglas de detección de capacidades del cliente o asigne al modelo un nombre que coincida con una familia conocida.
Durante una inferencia upstream larga, el gateway emite líneas de comentario SSE :keep-alive (inofensivas: omita las líneas que empiezan por :) y, si la transmisión se corta a mitad, inserta un campo _gateway_warning en lugar de devolver un error, para que harness como Claude Code no aborten toda la conversación.
En modo automático, Claude Code espera un veredicto del lado del servidor (un campo safeguards en la solicitud) antes de una acción potencialmente peligrosa. Cuando el upstream es Anthropic oficial, el veredicto se produce dentro de esa misma solicitud y el gateway lo deja pasar sin tocarlo. Cuando el upstream es un tercero que ignora el campo, el gateway responde en su lugar, y el valor predeterminado de fábrica (allow_all) libera todas las acciones, lo cual es más permisivo que no intervenir en la llamada. Devuelva una ruta a su upstream escribiendo "anthropic_server_safeguards": "upstream" en el extra_config de ese upstream; la opción de la consola es solo para administradores.
# Every agent is one base_url + one access key away
export ANTHROPIC_BASE_URL="https://your-gateway.gatellm.io" # Anthropic agents: root (no /v1)
export ANTHROPIC_API_KEY="<gateway access key>"
export OPENAI_API_BASE="https://your-gateway.gatellm.io/v1" # OpenAI-compatible agents: /v1
export OPENAI_API_KEY="<gateway access key>"
# Codex CLI (~/.codex/config.toml) speaks the Responses protocol
# [model_providers.gatellm]
# base_url = "https://your-gateway.gatellm.io/v1"
# wire_api = "responses"