Routing

CC-Relay unterstuetzt mehrere Routing-Strategien zur Verteilung von Anfragen auf verschiedene Provider. Diese Seite erklaert jede Strategie und wie sie konfiguriert wird.

Ueberblick

Routing bestimmt, wie cc-relay entscheidet, welcher Provider jede Anfrage bearbeitet. Die richtige Strategie haengt von Ihren Prioritaeten ab: Verfuegbarkeit, Kosten, Latenz oder Lastverteilung.

StrategieKonfigurationswertBeschreibungAnwendungsfall
Round-Robinround_robinSequentielle Rotation durch ProviderGleichmaessige Verteilung
Weighted Round-Robinweighted_round_robinProportionale Verteilung nach GewichtungKapazitaetsbasierte Verteilung
ShuffleshuffleFaire Zufallsverteilung (“Karten austeilen”)Randomisierter Lastausgleich
Failoverfailover (Standard)Prioritaetsbasiert mit automatischem RetryHohe Verfuegbarkeit
Model-Basedmodel_basedRouting nach Modellname-PraefixMulti-Modell-Deployments

Konfiguration

Konfigurieren Sie das Routing in Ihrer Konfigurationsdatei:

routing:
# Strategie: round_robin, weighted_round_robin, shuffle, failover (Standard), model_based
strategy: failover

# Timeout fuer Failover-Versuche in Millisekunden (Standard: 5000)
failover_timeout: 5000

# Debug-Header aktivieren (X-CC-Relay-Strategy, X-CC-Relay-Provider)
debug: false

# Model-based Routing Konfiguration (nur verwendet wenn 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

Standard: Wenn strategy nicht angegeben ist, verwendet cc-relay failover als sicherste Option.

Strategien

Round-Robin

Sequentielle Verteilung mit einem atomaren Zaehler. Jeder Provider erhaelt eine Anfrage, bevor ein Provider eine zweite erhaelt.

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

Funktionsweise:

  1. Anfrage 1 → Provider A
  2. Anfrage 2 → Provider B
  3. Anfrage 3 → Provider C
  4. Anfrage 4 → Provider A (Zyklus wiederholt sich)

Optimal fuer: Gleichmaessige Verteilung auf Provider mit aehnlicher Kapazitaet.

Weighted Round-Robin

Verteilt Anfragen proportional basierend auf Provider-Gewichtungen. Verwendet den Nginx Smooth Weighted Round-Robin Algorithmus fuer gleichmaessige Verteilung.

routing:
strategy: weighted_round_robin

providers:
- name: "anthropic"
  type: "anthropic"
  keys:
    - key: "${ANTHROPIC_API_KEY}"
      weight: 3  # Erhaelt 3x mehr Anfragen

- name: "zai"
  type: "zai"
  keys:
    - key: "${ZAI_API_KEY}"
      weight: 1  # Erhaelt 1x Anfragen
[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

Funktionsweise:

Mit Gewichtungen 3:1, von je 4 Anfragen:

  • 3 Anfragen → anthropic
  • 1 Anfrage → zai

Standardgewichtung: 1 (wenn nicht angegeben)

Optimal fuer: Lastverteilung basierend auf Provider-Kapazitaet, Rate-Limits oder Kostenzuweisung.

Shuffle

Faire Zufallsverteilung mit dem Fisher-Yates “Karten austeilen” Muster. Jeder erhaelt eine Karte, bevor jemand eine zweite erhaelt.

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

Funktionsweise:

  1. Alle Provider beginnen in einem “Kartenstapel”
  2. Zufaelliger Provider wird ausgewaehlt und aus dem Stapel entfernt
  3. Wenn der Stapel leer ist, alle Provider neu mischen
  4. Garantiert faire Verteilung ueber Zeit

Optimal fuer: Randomisierter Lastausgleich bei gleichzeitiger Gewaehrleistung von Fairness.

Failover

Versucht Provider in Prioritaetsreihenfolge. Bei Fehlschlag werden parallele Rennen mit den verbleibenden Providern gestartet fuer die schnellste erfolgreiche Antwort. Dies ist die Standardstrategie.

routing:
strategy: failover

providers:
- name: "anthropic"
  type: "anthropic"
  keys:
    - key: "${ANTHROPIC_API_KEY}"
      priority: 2  # Wird zuerst versucht (hoeher = hoehere Prioritaet)

- name: "zai"
  type: "zai"
  keys:
    - key: "${ZAI_API_KEY}"
      priority: 1  # Fallback
[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

Funktionsweise:

  1. Versucht zuerst den Provider mit hoechster Prioritaet
  2. Bei Fehlschlag (siehe Failover-Ausloeser), parallele Anfragen an alle verbleibenden Provider starten
  3. Erste erfolgreiche Antwort zurueckgeben, andere abbrechen
  4. Beachtet failover_timeout fuer die Gesamtoperationsdauer

Standardprioritaet: 1 (wenn nicht angegeben)

Optimal fuer: Hohe Verfuegbarkeit mit automatischem Fallback.

Model-Based

Leitet Anfragen basierend auf dem Modellnamen in der Anfrage an Provider weiter. Verwendet Longest-Prefix-Matching fuer Spezifitaet.

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"

Funktionsweise:

  1. Extrahiert den model Parameter aus der Anfrage
  2. Versucht das laengste Praefix-Match in model_mapping zu finden
  3. Leitet an den entsprechenden Provider weiter
  4. Faellt auf default_provider zurueck, wenn kein Match gefunden wird
  5. Wenn weder Match noch Standard existiert, werden alle Provider beibehalten (kein Filtering / Graceful Fallback)

Beispiele fuer Praefix-Matching:

Angefordertes ModellMapping-EintraegeAusgewaehlter EintragProvider
claude-opus-4claude-opus, claudeclaude-opusanthropic
claude-sonnet-3.5claude-sonnet, claudeclaude-sonnetanthropic
glm-4-plusglm-4, glmglm-4zai
qwen-72bqwen, claudeqwenollama
llama-3.2llama, claudellamaollama
gpt-4claude, llama(kein Match)default_provider

Optimal fuer: Multi-Modell-Deployments, bei denen verschiedene Modelle an unterschiedliche Provider weitergeleitet werden muessen.

Debug-Header

Wenn routing.debug: true, fuegt cc-relay Diagnose-Header zu Antworten hinzu:

HeaderWertBeschreibung
X-CC-Relay-StrategyStrategienameWelche Routing-Strategie verwendet wurde
X-CC-Relay-ProviderProvider-NameWelcher Provider die Anfrage bearbeitet hat

Beispiel-Antwort-Header:

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

Sicherheitswarnung: Debug-Header offenbaren interne Routing-Entscheidungen. Nur in Entwicklungs- oder vertrauenswuerdigen Umgebungen verwenden. Niemals in Produktion mit nicht vertrauenswuerdigen Clients aktivieren.

Failover-Ausloeser

Die Failover-Strategie loest einen Retry bei bestimmten Fehlerbedingungen aus:

AusloeserBedingungenBeschreibung
Statuscode429, 500, 502, 503, 504Rate-Limit oder Server-Fehler
Timeoutcontext.DeadlineExceededAnfrage-Timeout ueberschritten
Verbindungnet.ErrorNetzwerkfehler, DNS-Fehler, Verbindung abgelehnt

Wichtig: Client-Fehler (4xx ausser 429) loesen keinen Failover aus. Diese weisen auf Probleme mit der Anfrage selbst hin, nicht mit dem Provider.

Statuscodes erklaert

CodeBedeutungFailover?
429Rate-Limit erreichtJa - anderen Provider versuchen
500Interner ServerfehlerJa - Serverproblem
502Bad GatewayJa - Upstream-Problem
503Service nicht verfuegbarJa - voruebergehend nicht erreichbar
504Gateway TimeoutJa - Upstream-Timeout
400Ungueltige AnfrageNein - Anfrage korrigieren
401Nicht autorisiertNein - Authentifizierung korrigieren
403VerbotenNein - Berechtigungsproblem

Beispiele

Einfacher Failover (Empfohlen fuer die meisten Benutzer)

Verwenden Sie die Standardstrategie mit priorisierten Providern:

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

Lastverteilung mit Gewichtungen

Last basierend auf Provider-Kapazitaet verteilen:

routing:
strategy: weighted_round_robin

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

- name: "secondary"
  type: "anthropic"
  keys:
    - key: "${SECONDARY_KEY}"
      weight: 1  # 25% des Traffics
[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

Entwicklung mit Debug-Headern

Debug-Header fuer Fehlerbehebung aktivieren:

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}"

Hohe Verfuegbarkeit mit schnellem Failover

Failover-Latenz minimieren:

routing:
strategy: failover
failover_timeout: 3000  # 3 Sekunden 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-Modell mit Model-Based Routing

Verschiedene Modelle an spezialisierte Provider weiterleiten:

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"

Mit dieser Konfiguration:

  • Claude Modelle → Anthropic
  • GLM Modelle → Z.AI
  • Qwen/Llama Modelle → Ollama (lokal)
  • Andere Modelle → Anthropic (Standard)

Provider-Gewichtung und -Prioritaet

Gewichtung und Prioritaet werden in der Schluessel-Konfiguration des Providers angegeben:

providers:
- name: "example"
  type: "anthropic"
  keys:
    - key: "${API_KEY}"
      weight: 3      # Fuer weighted-round-robin (hoeher = mehr Traffic)
      priority: 2    # Fuer failover (hoeher = wird zuerst versucht)
      rpm_limit: 60  # Rate-Limit-Tracking
[[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

Hinweis: Gewichtung und Prioritaet werden vom ersten Schluessel in der Schluesselliste des Providers gelesen.

Naechste Schritte