Ändern Sie Ihre base URL und setzen Sie einen OrcaRouter-Schlüssel ein. Ihre Modelle, Ihr SDK und der Rest Ihres Codes bleiben genau so, wie sie sind — umbenannt werden nur die openrouter/-Router-IDs.
OrcaRouter spricht die APIs von OpenAI, Anthropic und Gemini nativ, Sie behalten also das SDK, das Sie bereits nutzen. In jedem Ausschnitt sind Zeilen mit - am Anfang zu entfernen und Zeilen mit + am Anfang hinzuzufügen.
client = OpenAI(
- base_url="https://openrouter.ai/api/v1",
+ base_url="https://api.orcarouter.ai/v1",
api_key=ORCAROUTER_API_KEY,
)Das ist die einzige Code-Änderung. Setzen Sie zusätzlich einen OrcaRouter-Schlüssel ein — Ihre Modellnamen, Nachrichten und das Streaming bleiben gleich, sofern Sie keine openrouter/-Router-ID aufrufen.
client = Anthropic(
+ base_url="https://api.orcarouter.ai",
api_key=ORCAROUTER_API_KEY,
)Wir sprechen die API von Anthropic direkt, OpenRouter tut das nicht. Wenn Sie Claude bisher über das OpenAI-SDK aufgerufen haben, um zu OpenRouter zu passen, können Sie damit aufhören.
const ai = new GoogleGenAI({
apiKey: ORCAROUTER_API_KEY,
+ httpOptions: { baseUrl: "https://api.orcarouter.ai" },
});Wir sprechen auch die Gemini-API direkt, das Google-SDK funktioniert also unverändert.
Imports, Client und ein echter Aufruf. Läuft unverändert, sobald ORCAROUTER_API_KEY in Ihrer Umgebung gesetzt ist.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.orcarouter.ai/v1",
api_key=os.environ["ORCAROUTER_API_KEY"],
)
response = client.chat.completions.create(
model="anthropic/claude-sonnet-4",
messages=[{"role": "user", "content": "Hello"}],
)
print(response.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.orcarouter.ai/v1",
apiKey: process.env.ORCAROUTER_API_KEY,
});
const response = await client.chat.completions.create({
model: "anthropic/claude-sonnet-4",
messages: [{ role: "user", content: "Hello" }],
});
console.log(response.choices[0].message.content);curl https://api.orcarouter.ai/v1/chat/completions \
-H "Authorization: Bearer $ORCAROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-4",
"messages": [{"role": "user", "content": "Hello"}]
}'import os
from anthropic import Anthropic
client = Anthropic(
base_url="https://api.orcarouter.ai",
api_key=os.environ["ORCAROUTER_API_KEY"],
)
message = client.messages.create(
model="anthropic/claude-sonnet-4",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}],
)
print(message.content[0].text)import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
baseURL: "https://api.orcarouter.ai",
apiKey: process.env.ORCAROUTER_API_KEY,
});
const message = await client.messages.create({
model: "anthropic/claude-sonnet-4",
max_tokens: 1024,
messages: [{ role: "user", content: "Hello" }],
});
console.log(message.content[0].text);curl https://api.orcarouter.ai/v1/messages \
-H "x-api-key: $ORCAROUTER_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-4",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Hello"}]
}'import os
from google import genai
client = genai.Client(
api_key=os.environ["ORCAROUTER_API_KEY"],
http_options={"base_url": "https://api.orcarouter.ai"},
)
response = client.models.generate_content(
model="google/gemini-2.5-pro",
contents="Hello",
)
print(response.text)import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
apiKey: process.env.ORCAROUTER_API_KEY,
httpOptions: { baseUrl: "https://api.orcarouter.ai" },
});
const response = await ai.models.generateContent({
model: "google/gemini-2.5-pro",
contents: "Hello",
});
console.log(response.text);curl "https://api.orcarouter.ai/v1beta/models/google/gemini-2.5-pro:generateContent" \
-H "x-goog-api-key: $ORCAROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [{"parts": [{"text": "Hello"}]}]
}'Wir verwenden dieselben vendor/model-Namen, anthropic/claude-sonnet-4 funktioniert also unverändert. Die Ausnahme sind OpenRouters eigene openrouter/-Router-IDs: die werden umbenannt.
| Bei OpenRouter | Bei OrcaRouter |
|---|---|
openrouter/auto | orcarouter/auto |
openrouter/free | orcarouter/free |
| Jeder andere openrouter/-Router | Kein Gegenstück – nennen Sie stattdessen ein Modell |
| Jede vendor/model-ID, etwa anthropic/claude-sonnet-4 | Dieselbe ID, unverändert |
Besser jetzt wissen als im Produktivbetrieb herausfinden.
Für die meisten Integrationen ja. Ändern Sie die base URL und setzen Sie einen OrcaRouter-Schlüssel ein; SDK, Modellnamen, Nachrichten und Streaming bleiben gleich. Ausnahmen sind die eigenen openrouter/-Router-IDs von OpenRouter, die umbenannt werden, und die vier oben aufgeführten Dinge, die OrcaRouter bewusst nicht tut.
Das OpenAI-SDK will https://api.orcarouter.ai/v1. Die beiden anderen wollen https://api.orcarouter.ai – den Pfad hängt jedes selbst an.
Der Wert ändert sich — ein OpenRouter-Schlüssel authentifiziert sich hier nicht —, der Ort nicht: Welchen Header Ihr SDK schon sendet, den lesen wir.
Die Router von OrcaRouter sind die mit orcarouter/. Zwei entsprechen den ihren direkt: Verwenden Sie orcarouter/auto statt openrouter/auto und orcarouter/free statt openrouter/free — gleiches Prinzip in beiden Fällen, wir wählen zum Anfragezeitpunkt ein Modell für Sie aus, und mit dem zweiten bleiben Sie in der kostenlosen Stufe. Für ihre übrigen Router gibt es hier kein Gegenstück, nennen Sie stattdessen ein Modell.
Verschieben Sie models und route in extra_body. Alles andere bleibt gleich: Listen Sie Ihre Modelle in Wunschreihenfolge auf, wir probieren sie der Reihe nach. Mindestens 2 Modelle, höchstens 5. Es lohnt sich, das sauber zu machen. Auf oberster Ebene lesen wir die Felder nicht, Ihre Fallbacks hören also still auf zu wirken — und in Installationen, die den Anfragetext unverändert weiterreichen, erhält das Modell die zusätzlichen Felder und lehnt den Aufruf womöglich ganz ab.
Lesen Sie X-Orca-Request-Id aus der Antwort und rufen Sie dann /v1/generation auf. Eine 501 heißt, dass Kostenabfragen auf diesem Deployment abgeschaltet sind.
Senden Sie X-Title, dann behält Ihre Anwendung ihren Namen in Ihren Auswertungen, ohne Änderung; wir lesen auch die Header-Namen von OpenRouter. HTTP-Referer allein benennt Ihre Anwendung nur, wenn ihre Domain zu den bereits bekannten gehört — senden Sie also einen Titel-Header, wenn Sie sichergehen wollen. Diese Zeile steht hier, damit Sie die Header nicht versehentlich entfernen.
Wir verwenden beides nicht. Auf einem normalen Kanal werden sie verworfen, bevor die Anfrage das Modell erreicht; auf einem Kanal, der den Rohtext weiterleitet, werden sie mitgesendet, und ein strenger Anbieter kann die Anfrage ablehnen. Sie zu entfernen ist in beiden Fällen die sichere Wahl.
Alles, was Sie erwarten, plus einige, die OpenRouter nicht hat. Hier verfügbar, bei OpenRouter nicht: /v1/messages, /v1beta/models … generateContent, /v1/rerank und /v1/realtime. Nicht verfügbar: /v1/fine-tunes, GET /v1/files und /v1/images/variations.
Fehler kommen in der Form zurück, die Sie schon behandeln. Richten Sie sich nach dem HTTP-Status: Wiederholen Sie einen 429, wenn wir ein Retry-After senden, warten Sie ab und wiederholen Sie einen 5xx außer 501 — das heißt, dass wir diesen Aufruf gar nicht bedienen — und behandeln Sie einen 4xx auf einen Relay-Aufruf als etwas, das in Ihrer Anfrage zu beheben ist. Die Ausnahme ist ein 404 von /v1/generation: Er kann schlicht bedeuten, dass die Anfrage noch nicht abgerechnet ist, wiederholen Sie diesen also kurz. Lesen Sie error.type nicht als Ursprung: orcarouter_api_error ist immer unserer, aber für einige unserer eigenen Fehler senden wir bewusst das Vokabular des Anbieters, damit Ihr SDK seinen gewohnten Zweig nimmt — ein von uns und ein vom Modell verhängtes Ratenlimit heißen beide rate_limit_error. Geben Sie X-Orca-Request-Id an, wenn wir einen einzelnen Aufruf nachschlagen sollen.