Der Wechsel von OpenRouter kostet eine Zeile

Ä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.

Drei Dinge zum Prüfen

  1. Die richtige base URL für Ihr SDK verwenden — Das OpenAI-SDK will https://api.orcarouter.ai/v1. Die beiden anderen wollen https://api.orcarouter.ai – den Pfad hängt jedes selbst an.
  2. Ersetzen Sie Ihren API-Schlüssel durch den OrcaRouter-Schlüssel — Der Wert ändert sich — ein OpenRouter-Schlüssel authentifiziert sich hier nicht —, der Ort nicht: Welchen Header Ihr SDK schon sendet, den lesen wir.
  3. Ihre Modellnamen beibehalten — 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.

Vorher und nachher: die Zeile, die sich ändert

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.

OpenAI — Python

  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.

Anthropic — Python

  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.

Gemini — TypeScript

  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.

Vollständige Beispiele für jedes SDK

Imports, Client und ein echter Aufruf. Läuft unverändert, sobald ORCAROUTER_API_KEY in Ihrer Umgebung gesetzt ist.

OpenAI — Python

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)

OpenAI — TypeScript

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);

OpenAI — cURL

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

Anthropic — Python

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)

Anthropic — TypeScript

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);

Anthropic — cURL

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

Gemini — Python

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)

Gemini — TypeScript

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);

Gemini — cURL

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

Modell-IDs: was umbenannt wird

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 OpenRouterBei OrcaRouter
openrouter/autoorcarouter/auto
openrouter/freeorcarouter/free
Jeder andere openrouter/-RouterKein Gegenstück – nennen Sie stattdessen ein Modell
Jede vendor/model-ID, etwa anthropic/claude-sonnet-4Dieselbe ID, unverändert

Unterschiede bei der Abrechnung

Vier Dinge, die wir nicht tun

Besser jetzt wissen als im Produktivbetrieb herausfinden.

Häufige Fragen

Kann OrcaRouter OpenRouter direkt ersetzen?

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.

Welche base URL braucht welches SDK?

Das OpenAI-SDK will https://api.orcarouter.ai/v1. Die beiden anderen wollen https://api.orcarouter.ai – den Pfad hängt jedes selbst an.

Kann ich meinen OpenRouter-API-Schlüssel weiterverwenden?

Der Wert ändert sich — ein OpenRouter-Schlüssel authentifiziert sich hier nicht —, der Ort nicht: Welchen Header Ihr SDK schon sendet, den lesen wir.

Was ersetzt openrouter/auto und openrouter/free?

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.

Funktioniert Fallback-Routing genauso?

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.

Wie sehe ich, was eine Anfrage gekostet hat?

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.

Identifizieren X-Title und HTTP-Referer meine App weiterhin?

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.

Was passiert mit provider und transforms in meinen Anfragen?

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.

Welche Endpunkte bietet OrcaRouter an?

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.

Kommen Fehler im selben Format zurück?

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.