Ändra din base URL och sätt in en OrcaRouter-nyckel. Dina modeller, ditt SDK och resten av koden förblir precis som de är — det enda som byter namn är openrouter/-router-id:n.
OrcaRouter talar OpenAI:s, Anthropics och Geminis API:er direkt, så du behåller det SDK du redan använder. I varje utdrag är rader som börjar med - sådant du tar bort och rader som börjar med + sådant du lägger till.
client = OpenAI(
- base_url="https://openrouter.ai/api/v1",
+ base_url="https://api.orcarouter.ai/v1",
api_key=ORCAROUTER_API_KEY,
)Det är den enda kodändringen. Sätt dessutom in en OrcaRouter-nyckel — dina modellnamn, meddelanden och streaming är sig lika, om du inte anropar ett openrouter/-router-id.
client = Anthropic(
+ base_url="https://api.orcarouter.ai",
api_key=ORCAROUTER_API_KEY,
)Vi talar Anthropics API direkt, vilket OpenRouter inte gör. Har du anropat Claude via OpenAI:s SDK för att passa OpenRouter kan du sluta med det.
const ai = new GoogleGenAI({
apiKey: ORCAROUTER_API_KEY,
+ httpOptions: { baseUrl: "https://api.orcarouter.ai" },
});Vi talar även Geminis API direkt, så Googles SDK fungerar utan ändringar.
Importer, klient och ett riktigt anrop. Körbar som den är, så snart ORCAROUTER_API_KEY är satt i din miljö.
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"}]}]
}'Vi använder samma vendor/model-namn, så anthropic/claude-sonnet-4 fungerar som det är. Undantaget är OpenRouters egna openrouter/-router-id: de byter namn.
| Hos OpenRouter | Hos OrcaRouter |
|---|---|
openrouter/auto | orcarouter/auto |
openrouter/free | orcarouter/free |
| Alla andra openrouter/-routrar | Ingen motsvarighet — ange en modell i stället |
| Alla vendor/model-ID:n, till exempel anthropic/claude-sonnet-4 | Samma ID, oförändrat |
Bättre att veta nu än att upptäcka det i produktion.
För de flesta integrationer, ja. Ändra base URL och sätt in en OrcaRouter-nyckel; ditt SDK, dina modellnamn, meddelanden och streaming förblir desamma. Undantagen är OpenRouters egna openrouter/-router-ID:n, som byter namn, och de fyra saker OrcaRouter medvetet inte gör, som listas ovan.
OpenAI-SDK:n vill ha https://api.orcarouter.ai/v1. De andra två vill ha https://api.orcarouter.ai — sökvägen lägger var och en till själv.
Värdet ändras — en OpenRouter-nyckel autentiserar inte här — men platsen gör det inte: vi läser samma header som din SDK redan skickar.
OrcaRouters routrar är de med orcarouter/. Två motsvarar deras direkt: använd orcarouter/auto i stället för openrouter/auto, och orcarouter/free i stället för openrouter/free — samma tanke i båda fallen, vi väljer en modell åt dig när förfrågan kommer in, och den senare håller dig kvar på nivån utan kostnad. Deras övriga routrar har ingen motsvarighet här, så ange en modell i stället.
Flytta in models och route i extra_body. Allt annat är sig likt: lista dina modeller i önskad ordning så provar vi dem i tur och ordning. Minst 2 modeller, högst 5. Värt att göra ordentligt. På översta nivån läser vi dem inte, så dina reserver slutar tyst att fungera — och i installationer som vidarebefordrar förfrågans kropp som den är får modellen de extra fälten och kan avvisa anropet helt.
Läs X-Orca-Request-Id ur svaret och anropa sedan /v1/generation. Ett 501 betyder att kostnadsuppslag är avstängda i den här installationen.
Skicka X-Title så behåller din applikation sitt namn i din statistik utan någon ändring; vi läser även OpenRouters egna headernamn. Enbart HTTP-Referer namnger din applikation bara om domänen är en vi redan känner igen, så skicka en titelheader om du vill vara säker. Raden finns här för att du inte ska ta bort dem av misstag.
Vi använder ingen av dem. På en vanlig kanal tas de bort innan förfrågan når modellen; på en kanal som vidarebefordrar den råa kroppen skickas de med, och en strikt leverantör kan avvisa förfrågan. Att ta bort dem är det säkra valet i båda fallen.
Allt du förväntar dig, plus några som OpenRouter inte har. Finns här men inte hos OpenRouter: /v1/messages, /v1beta/models … generateContent, /v1/rerank och /v1/realtime. Finns inte: /v1/fine-tunes, GET /v1/files och /v1/images/variations.
Fel kommer tillbaka i samma form som du redan hanterar. Agera på HTTP-statusen: gör om en 429 när vi skickar Retry-After, backa av och gör om en 5xx utom 501 — som betyder att vi inte betjänar det anropet alls — och behandla en 4xx på ett relay-anrop som något att rätta i din förfrågan. Undantaget är en 404 från /v1/generation: den kan helt enkelt betyda att förfrågan inte är avräknad än, så gör om just den en kort stund. Läs inte error.type som ursprunget: orcarouter_api_error är alltid vårt, men för en del av våra egna fel skickar vi medvetet leverantörens ordval så att din SDK tar sin vanliga gren — en hastighetsgräns vi satt och en som modellen satt säger båda rate_limit_error. Ange X-Orca-Request-Id när du behöver att vi slår upp ett enskilt anrop.