Routing

CC-Relay soporta multiples estrategias de routing para distribuir solicitudes entre proveedores. Esta pagina explica cada estrategia y como configurarlas.

Descripcion General

El routing determina como cc-relay elige que proveedor maneja cada solicitud. La estrategia correcta depende de sus prioridades: disponibilidad, costo, latencia o distribucion de carga.

EstrategiaValor de ConfiguracionDescripcionCaso de Uso
Round-Robinround_robinRotacion secuencial a traves de proveedoresDistribucion uniforme
Weighted Round-Robinweighted_round_robinDistribucion proporcional por pesoDistribucion basada en capacidad
ShuffleshuffleAleatorio justo (“repartir cartas”)Balanceo de carga aleatorio
Failoverfailover (predeterminado)Basado en prioridad con reintento automaticoAlta disponibilidad
Model-Basedmodel_basedRouting por prefijo de nombre de modeloDespliegues multi-modelo

Configuracion

Configure el routing en su archivo de configuracion:

routing:
# Estrategia: round_robin, weighted_round_robin, shuffle, failover (predeterminado), model_based
strategy: failover

# Timeout para intentos de failover en milisegundos (predeterminado: 5000)
failover_timeout: 5000

# Habilitar headers de debug (X-CC-Relay-Strategy, X-CC-Relay-Provider)
debug: false

# Configuracion de routing basado en modelo (solo usado cuando strategy: model_based)
model_mapping:
  claude-opus: anthropic    # claude-opus-* models → anthropic provider
  claude-sonnet: anthropic  # claude-sonnet-* models → anthropic provider
  glm-4: zai                # glm-4* models → zai provider
  qwen: ollama              # qwen* models → ollama provider

# Default provider when no model mapping matches
default_provider: anthropic
[routing]
# Strategy: round_robin, weighted_round_robin, shuffle, failover (default), model_based
strategy = "failover"

# Timeout for failover attempts in milliseconds (default: 5000)
failover_timeout = 5000

# Enable debug headers (X-CC-Relay-Strategy, X-CC-Relay-Provider)
debug = false

# Default provider when no model mapping matches
default_provider = "anthropic"

# Model-based routing configuration (only used when strategy: model_based)
[routing.model_mapping]
claude-opus = "anthropic"    # claude-opus-* models → anthropic provider
claude-sonnet = "anthropic"  # claude-sonnet-* models → anthropic provider
glm-4 = "zai"                # glm-4* models → zai provider
qwen = "ollama"              # qwen* models → ollama provider

Predeterminado: Si strategy no se especifica, cc-relay usa failover como la opcion mas segura.

Estrategias

Round-Robin

Distribucion secuencial usando un contador atomico. Cada proveedor recibe una solicitud antes de que cualquier proveedor reciba una segunda.

routing:
strategy: round_robin
[routing]
strategy = "round_robin"

Como funciona:

  1. Solicitud 1 → Proveedor A
  2. Solicitud 2 → Proveedor B
  3. Solicitud 3 → Proveedor C
  4. Solicitud 4 → Proveedor A (el ciclo se repite)

Mejor para: Distribucion uniforme entre proveedores con capacidad similar.

Weighted Round-Robin

Distribuye solicitudes proporcionalmente basandose en los pesos de los proveedores. Usa el algoritmo Nginx smooth weighted round-robin para distribucion uniforme.

routing:
strategy: weighted_round_robin

providers:
- name: "anthropic"
  type: "anthropic"
  keys:
    - key: "${ANTHROPIC_API_KEY}"
      weight: 3  # Recibe 3x mas solicitudes

- name: "zai"
  type: "zai"
  keys:
    - key: "${ZAI_API_KEY}"
      weight: 1  # Recibe 1x solicitudes
[routing]
strategy = "weighted_round_robin"

[[providers]]
name = "anthropic"
type = "anthropic"

[[providers.keys]]
key = "${ANTHROPIC_API_KEY}"
weight = 3  # Receives 3x more requests

[[providers]]
name = "zai"
type = "zai"

[[providers.keys]]
key = "${ZAI_API_KEY}"
weight = 1  # Receives 1x requests

Como funciona:

Con pesos 3:1, de cada 4 solicitudes:

  • 3 solicitudes → anthropic
  • 1 solicitud → zai

Peso predeterminado: 1 (si no se especifica)

Mejor para: Distribuir carga basada en capacidad del proveedor, limites de tasa o asignacion de costos.

Shuffle

Distribucion aleatoria justa usando el patron Fisher-Yates de “repartir cartas”. Todos reciben una carta antes de que alguien reciba una segunda.

routing:
strategy: shuffle
[routing]
strategy = "shuffle"

Como funciona:

  1. Todos los proveedores comienzan en un “mazo”
  2. Se selecciona un proveedor aleatorio y se remueve del mazo
  3. Cuando el mazo esta vacio, se barajan todos los proveedores
  4. Garantiza distribucion justa a lo largo del tiempo

Mejor para: Balanceo de carga aleatorio mientras se asegura equidad.

Failover

Intenta proveedores en orden de prioridad. En caso de fallo, lanza carreras paralelas con los proveedores restantes para obtener la respuesta exitosa mas rapida. Esta es la estrategia predeterminada.

routing:
strategy: failover

providers:
- name: "anthropic"
  type: "anthropic"
  keys:
    - key: "${ANTHROPIC_API_KEY}"
      priority: 2  # Se intenta primero (mayor = mayor prioridad)

- name: "zai"
  type: "zai"
  keys:
    - key: "${ZAI_API_KEY}"
      priority: 1  # Respaldo
[routing]
strategy = "failover"

[[providers]]
name = "anthropic"
type = "anthropic"

[[providers.keys]]
key = "${ANTHROPIC_API_KEY}"
priority = 2  # Tried first (higher = higher priority)

[[providers]]
name = "zai"
type = "zai"

[[providers.keys]]
key = "${ZAI_API_KEY}"
priority = 1  # Fallback

Como funciona:

  1. Intenta primero el proveedor de mayor prioridad
  2. Si falla (ver Disparadores de Failover), lanza solicitudes paralelas a todos los proveedores restantes
  3. Retorna la primera respuesta exitosa, cancela las otras
  4. Respeta failover_timeout para el tiempo total de la operacion

Prioridad predeterminada: 1 (si no se especifica)

Mejor para: Alta disponibilidad con fallback automatico.

Model-Based

Enruta solicitudes a proveedores basandose en el nombre del modelo en la solicitud. Usa coincidencia de prefijo mas largo para especificidad.

routing:
strategy: model_based

model_mapping:
  claude-opus: anthropic
  claude-sonnet: anthropic
  glm-4: zai
  qwen: ollama
  llama: ollama

default_provider: anthropic

providers:
- name: "anthropic"
  type: "anthropic"
  keys:
    - key: "${ANTHROPIC_API_KEY}"

- name: "zai"
  type: "zai"
  keys:
    - key: "${ZAI_API_KEY}"

- name: "ollama"
  type: "ollama"
  base_url: "http://localhost:11434"
[routing]
strategy = "model_based"
default_provider = "anthropic"

[routing.model_mapping]
claude-opus = "anthropic"
claude-sonnet = "anthropic"
glm-4 = "zai"
qwen = "ollama"
llama = "ollama"

[[providers]]
name = "anthropic"
type = "anthropic"

[[providers.keys]]
key = "${ANTHROPIC_API_KEY}"

[[providers]]
name = "zai"
type = "zai"

[[providers.keys]]
key = "${ZAI_API_KEY}"

[[providers]]
name = "ollama"
type = "ollama"
base_url = "http://localhost:11434"

Como funciona:

  1. Extrae el nombre del modelo del cuerpo de la solicitud (ej., claude-opus-4)
  2. Encuentra el prefijo mas largo que coincida en model_mapping (ej., claude-opus)
  3. Enruta al proveedor mapeado (ej., anthropic)
  4. Si no hay coincidencia, usa default_provider
  5. Si no hay predeterminado, enruta a cualquier proveedor disponible

Ejemplos de coincidencia de prefijo:

Modelo SolicitadoMappingResultado
claude-opus-4claude-opus: anthropicanthropic
claude-sonnet-4-20250514claude-sonnet: anthropicanthropic
glm-4.7glm-4: zaizai
qwen3:8bqwen: ollamaollama
unknown-model(sin coincidencia)default_provider

Mejor para: Configuraciones multi-proveedor donde diferentes proveedores manejan diferentes familias de modelos.

Cabeceras de Depuracion

Cuando routing.debug: true, cc-relay agrega cabeceras de diagnostico a las respuestas:

CabeceraValorDescripcion
X-CC-Relay-StrategyNombre de estrategiaQue estrategia de routing se uso
X-CC-Relay-ProviderNombre del proveedorQue proveedor manejo la solicitud

Ejemplo de cabeceras de respuesta:

X-CC-Relay-Strategy: failover
X-CC-Relay-Provider: anthropic

Advertencia de Seguridad: Las cabeceras de depuracion exponen decisiones internas de routing. Use solo en desarrollo o entornos confiables. Nunca habilite en produccion con clientes no confiables.

Disparadores de Failover

La estrategia de failover dispara reintento en condiciones de error especificas:

DisparadorCondicionesDescripcion
Codigo de Estado429, 500, 502, 503, 504Limite de tasa o errores de servidor
Timeoutcontext.DeadlineExceededTimeout de solicitud excedido
Conexionnet.ErrorErrores de red, fallos DNS, conexion rechazada

Importante: Los errores de cliente (4xx excepto 429) no disparan failover. Estos indican problemas con la solicitud misma, no con el proveedor.

Codigos de Estado Explicados

CodigoSignificadoFailover?
429Limite de TasaSi - intentar otro proveedor
500Error Interno del ServidorSi - problema del servidor
502Bad GatewaySi - problema upstream
503Servicio No DisponibleSi - temporalmente caido
504Gateway TimeoutSi - timeout upstream
400Solicitud IncorrectaNo - corregir la solicitud
401No AutorizadoNo - corregir autenticacion
403ProhibidoNo - problema de permisos

Ejemplos

Failover Simple (Recomendado para la Mayoria de Usuarios)

Use la estrategia predeterminada con proveedores priorizados:

routing:
strategy: failover

providers:
- name: "anthropic"
  type: "anthropic"
  keys:
    - key: "${ANTHROPIC_API_KEY}"
      priority: 2

- name: "zai"
  type: "zai"
  keys:
    - key: "${ZAI_API_KEY}"
      priority: 1
[routing]
strategy = "failover"

[[providers]]
name = "anthropic"
type = "anthropic"

[[providers.keys]]
key = "${ANTHROPIC_API_KEY}"
priority = 2

[[providers]]
name = "zai"
type = "zai"

[[providers.keys]]
key = "${ZAI_API_KEY}"
priority = 1

Balanceo de Carga con Pesos

Distribuir carga basada en capacidad del proveedor:

routing:
strategy: weighted_round_robin

providers:
- name: "primary"
  type: "anthropic"
  keys:
    - key: "${PRIMARY_KEY}"
      weight: 3  # 75% del trafico

- name: "secondary"
  type: "anthropic"
  keys:
    - key: "${SECONDARY_KEY}"
      weight: 1  # 25% del trafico
[routing]
strategy = "weighted_round_robin"

[[providers]]
name = "primary"
type = "anthropic"

[[providers.keys]]
key = "${PRIMARY_KEY}"
weight = 3  # 75% of traffic

[[providers]]
name = "secondary"
type = "anthropic"

[[providers.keys]]
key = "${SECONDARY_KEY}"
weight = 1  # 25% of traffic

Desarrollo con Cabeceras de Depuracion

Habilitar cabeceras de depuracion para solucion de problemas:

routing:
strategy: round_robin
debug: true

providers:
- name: "anthropic"
  type: "anthropic"
  keys:
    - key: "${ANTHROPIC_API_KEY}"

- name: "zai"
  type: "zai"
  keys:
    - key: "${ZAI_API_KEY}"
[routing]
strategy = "round_robin"
debug = true

[[providers]]
name = "anthropic"
type = "anthropic"

[[providers.keys]]
key = "${ANTHROPIC_API_KEY}"

[[providers]]
name = "zai"
type = "zai"

[[providers.keys]]
key = "${ZAI_API_KEY}"

Alta Disponibilidad con Failover Rapido

Minimizar latencia de failover:

routing:
strategy: failover
failover_timeout: 3000  # 3 segundos de timeout

providers:
- name: "anthropic"
  type: "anthropic"
  keys:
    - key: "${ANTHROPIC_API_KEY}"
      priority: 2

- name: "zai"
  type: "zai"
  keys:
    - key: "${ZAI_API_KEY}"
      priority: 1
[routing]
strategy = "failover"
failover_timeout = 3000  # 3 second timeout

[[providers]]
name = "anthropic"
type = "anthropic"

[[providers.keys]]
key = "${ANTHROPIC_API_KEY}"
priority = 2

[[providers]]
name = "zai"
type = "zai"

[[providers.keys]]
key = "${ZAI_API_KEY}"
priority = 1

Multi-Modelo con Routing Basado en Modelo

Enrutar diferentes familias de modelos a diferentes proveedores:

routing:
strategy: model_based

model_mapping:
  claude-opus: anthropic
  claude-sonnet: anthropic
  claude-haiku: anthropic
  glm-4: zai
  glm-3: zai
  qwen: ollama
  llama: ollama

default_provider: anthropic

providers:
- name: "anthropic"
  type: "anthropic"
  keys:
    - key: "${ANTHROPIC_API_KEY}"

- name: "zai"
  type: "zai"
  keys:
    - key: "${ZAI_API_KEY}"

- name: "ollama"
  type: "ollama"
  base_url: "http://localhost:11434"
[routing]
strategy = "model_based"
default_provider = "anthropic"

[routing.model_mapping]
claude-opus = "anthropic"
claude-sonnet = "anthropic"
claude-haiku = "anthropic"
glm-4 = "zai"
glm-3 = "zai"
qwen = "ollama"
llama = "ollama"

[[providers]]
name = "anthropic"
type = "anthropic"

[[providers.keys]]
key = "${ANTHROPIC_API_KEY}"

[[providers]]
name = "zai"
type = "zai"

[[providers.keys]]
key = "${ZAI_API_KEY}"

[[providers]]
name = "ollama"
type = "ollama"
base_url = "http://localhost:11434"

Con esta configuracion:

  • claude-opus-4 → anthropic
  • glm-4.7 → zai
  • qwen3:8b → ollama
  • unknown-model → anthropic (predeterminado)

Peso y Prioridad de Proveedor

El peso y la prioridad se especifican en la configuracion de claves del proveedor:

providers:
- name: "example"
  type: "anthropic"
  keys:
    - key: "${API_KEY}"
      weight: 3      # Para weighted-round-robin (mayor = mas trafico)
      priority: 2    # Para failover (mayor = se intenta primero)
      rpm_limit: 60  # Seguimiento de limite de tasa
[[providers]]
name = "example"
type = "anthropic"

[[providers.keys]]
key = "${API_KEY}"
weight = 3      # For weighted-round-robin (higher = more traffic)
priority = 2    # For failover (higher = tried first)
rpm_limit = 60  # Rate limit tracking

Nota: El peso y la prioridad se leen de la primera clave en la lista de claves del proveedor.

Proximos Pasos