Usar Claude Code con cualquier modelo vía OpenRouter
· Adrian "Nano" Alvarez · publicado
Claude Code lee unas variables de entorno que eligen el endpoint y el modelo. Apúntalas a OpenRouter y el modelo pasa a ser un argumento más.
Llevo un tiempo usando Claude Code y en algún momento se me quedó una pregunta en la cabeza: ¿y si no quiero que Claude sea el modelo detrás de Claude Code?
Resulta que la herramienta es más flexible de lo que parece. Claude Code lee un conjunto de variables de entorno que controlan a dónde van sus peticiones a la API y qué modelo usa cada rol. La importante es ANTHROPIC_BASE_URL: apunta Claude Code a cualquier endpoint que hable la Messages API de Anthropic, no solo al de Anthropic.
Anthropic documenta esto para LLM gateways, y OpenRouter ofrece un endpoint compatible con Anthropic pensado justo para este caso.
OpenRouter como gateway
En lugar de hablar directamente con Anthropic, Claude Code puede hablar con:
https://openrouter.ai/api
OpenRouter es una sola API delante de cientos de modelos de decenas de proveedores, con una sola clave y una sola factura. Claude Code sigue hablando su protocolo nativo y OpenRouter traduce la petición para el modelo que hayas elegido. Sin proxy local de por medio.
Así mantienes la interfaz de Claude Code, sus herramientas, el loop del agente y la experiencia en terminal, y cambias lo que hay debajo.
Una advertencia antes de seguir. Claude Code está ajustado a la semántica de la API de Anthropic: tool calls, streaming, extended thinking. Un modelo que no sea de Anthropic puede manejar parte de eso peor, o no manejarlo. El propio OpenRouter recomienda el proveedor first-party de Anthropic para compatibilidad total. Trata los otros modelos como un experimento, no como un reemplazo directo.
Las variables de entorno
Tres variables hacen la redirección:
export ANTHROPIC_BASE_URL="https://openrouter.ai/api"
export ANTHROPIC_AUTH_TOKEN="$OPENROUTER_API_KEY"
export ANTHROPIC_API_KEY=""
ANTHROPIC_BASE_URLmanda todas las peticiones a OpenRouter.ANTHROPIC_AUTH_TOKENse autentica con tu clave de OpenRouter.ANTHROPIC_API_KEYtiene que estar vacía de forma explícita. Si tiene un valor, Claude Code puede volver a su autenticación normal con Anthropic. La guía de integración de OpenRouter también lo remarca.
Después, los overrides de modelo. Claude Code usa alias de modelo internamente (opus, sonnet, haiku, fable) y un valor por defecto aparte para los subagentes. Cada uno tiene su variable, documentada aquí:
export ANTHROPIC_DEFAULT_FABLE_MODEL="$MODEL"
export ANTHROPIC_DEFAULT_OPUS_MODEL="$MODEL"
export ANTHROPIC_DEFAULT_SONNET_MODEL="$MODEL"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="$MODEL"
export CLAUDE_CODE_SUBAGENT_MODEL="$MODEL"
Pon todas. Si solo cambias el modelo principal, las tareas en segundo plano y los subagentes siguen pidiendo un modelo de Claude por alias, y acabas usando dos modelos sin darte cuenta.
Exportar ocho variables a mano cada vez cansa, así que lo metí en un comando.
El script orclaude
La interfaz:
orclaude <vendor/model-slug> [claude args...]
Por ejemplo:
orclaude anthropic/claude-sonnet-5.5
orclaude openai/gpt-6.1-sol
El script:
#!/usr/bin/env bash
# Run Claude Code against any OpenRouter model:
# orclaude <vendor/model-slug> [claude args...]
: "${OPENROUTER_API_KEY:?Set OPENROUTER_API_KEY in your shell profile}"
MODEL="${1:?Usage: orclaude <vendor/model-slug> [claude args...]}"
shift
export ANTHROPIC_BASE_URL="https://openrouter.ai/api"
export ANTHROPIC_AUTH_TOKEN="$OPENROUTER_API_KEY"
export ANTHROPIC_API_KEY=""
export ANTHROPIC_DEFAULT_FABLE_MODEL="$MODEL"
export ANTHROPIC_DEFAULT_OPUS_MODEL="$MODEL"
export ANTHROPIC_DEFAULT_SONNET_MODEL="$MODEL"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="$MODEL"
export CLAUDE_CODE_SUBAGENT_MODEL="$MODEL"
exec claude --model "$MODEL" "$@"
Las variables solo viven en ese proceso. Tu sesión normal de claude sigue en tu cuenta de siempre, y orclaude es la de OpenRouter. Sin proxy, sin contenedor de Docker, sin fork de Claude Code.
Para confirmar que funcionó, ejecuta /status dentro de la sesión. Debería mostrar el auth token como origen y https://openrouter.ai/api como base URL.
Un comando orclaude nativo en PowerShell
En Windows, añade un wrapper a tu perfil de PowerShell (notepad $PROFILE) para que orclaude se comporte como cualquier otro comando:
function orclaude {
& "$HOME\Scripts\orclaude.ps1" @args
}
Como el modelo es solo un argumento, la versión de PowerShell también puede guardar una lista corta de favoritos y dejarte elegir uno por número:
# Run Claude Code against any OpenRouter model:
# orclaude <vendor/model-slug | list number> [claude args...]
$Models = @(
"anthropic/claude-sonnet-5.5"
"openai/gpt-6.1-sol"
"google/gemini-3.8-flash"
"deepseek/deepseek-v4.1-flash"
)
if ($args.Count -eq 0 -or $args[0] -in @("-help", "--help", "-h")) {
Write-Host ""
Write-Host "Available models:" -ForegroundColor Cyan
for ($i = 0; $i -lt $Models.Count; $i++) {
Write-Host " [$($i + 1)] $($Models[$i])"
}
Write-Host ""
exit 0
}
if (-not $env:OPENROUTER_API_KEY) {
Write-Error "Set OPENROUTER_API_KEY in your environment"
exit 1
}
$Model = [string]$args[0]
if ($Model -match '^\d+$') {
$Index = [int]$Model
if ($Index -lt 1 -or $Index -gt $Models.Count) {
Write-Error "No model #$Index. Run orclaude -help to see the list."
exit 1
}
$Model = $Models[$Index - 1]
}
$ClaudeArgs = @($args | Select-Object -Skip 1)
$env:ANTHROPIC_BASE_URL = "https://openrouter.ai/api"
$env:ANTHROPIC_AUTH_TOKEN = $env:OPENROUTER_API_KEY
$env:ANTHROPIC_API_KEY = ""
$env:ANTHROPIC_DEFAULT_FABLE_MODEL = $Model
$env:ANTHROPIC_DEFAULT_OPUS_MODEL = $Model
$env:ANTHROPIC_DEFAULT_SONNET_MODEL = $Model
$env:ANTHROPIC_DEFAULT_HAIKU_MODEL = $Model
$env:CLAUDE_CODE_SUBAGENT_MODEL = $Model
& claude --model $Model @ClaudeArgs
exit $LASTEXITCODE
Hay dos detalles fáciles de hacer mal:
@($args | Select-Object -Skip 1)en lugar de$args[1..($args.Count - 1)]. Con un solo argumento, ese rango se convierte en1..0, que PowerShell recorre hacia atrás, así que el slug del modelo se le pasa aclaudeuna segunda vez como argumento suelto.- En PowerShell, asignar
""a una variable de entorno la elimina del proceso actual. ParaANTHROPIC_API_KEYes justo lo que queremos: no queda ninguna clave a la que volver.
Ahora orclaude -help imprime la lista:
Available models:
[1] anthropic/claude-sonnet-5.5
[2] openai/gpt-6.1-sol
[3] google/gemini-3.8-flash
[4] deepseek/deepseek-v4.1-flash
y orclaude 3 arranca una sesión con el tercero. Un número fuera de la lista falla con un mensaje en lugar de lanzar Claude Code con un modelo vacío.
macOS y Linux
En macOS o Linux, el script de Bash de arriba es toda la configuración. Guárdalo como orclaude en algún directorio de tu $PATH y hazlo ejecutable:
chmod +x orclaude
Y luego:
orclaude <vendor/model-slug>
Si prefieres que todas las sesiones pasen por OpenRouter, pon las variables en ~/.zshrc o ~/.bashrc. Esa es la configuración persistente que recomienda OpenRouter. Claude Code no lee archivos .env, así que el perfil de la shell es el sitio.
Por qué importa la separación
El script es corto. Lo interesante es la arquitectura que deja ver.
Claude Code es el harness: las herramientas, los permisos, el loop del agente, la interfaz de terminal. El modelo es otra capa, y el harness no tiene por qué venir del mismo proveedor que el modelo.
Así que en lugar de:
Claude Code → Claude
el stack pasa a ser:
Claude Code → gateway compatible con Anthropic → modelo
Con OpenRouter como capa intermedia tienes una clave de API, una factura, un catálogo, routing entre proveedores con failover y seguimiento de uso en un solo panel. Cambiar de modelo es un argumento, no una migración.
Mantienes el flujo de Claude Code que ya conoces, y aun así puedes descubrir qué hace un modelo distinto dentro de él.