Att byta från OpenRouter tar en rad

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

Tre saker att kontrollera

  1. Använd rätt base URL för ditt SDK — 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.
  2. Byt till din OrcaRouter-nyckel — 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.
  3. Behåll dina modellnamn — 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.

Före och efter: raden som ändras

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.

OpenAI — Python

  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.

Anthropic — Python

  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.

Gemini — TypeScript

  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.

Kompletta exempel för varje SDK

Importer, klient och ett riktigt anrop. Körbar som den är, så snart ORCAROUTER_API_KEY är satt i din miljö.

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-ID:n: vad du byter namn på

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 OpenRouterHos OrcaRouter
openrouter/autoorcarouter/auto
openrouter/freeorcarouter/free
Alla andra openrouter/-routrarIngen motsvarighet — ange en modell i stället
Alla vendor/model-ID:n, till exempel anthropic/claude-sonnet-4Samma ID, oförändrat

Skillnader i debitering

Fyra saker vi inte gör

Bättre att veta nu än att upptäcka det i produktion.

Vanliga frågor

Kan OrcaRouter ersätta OpenRouter rakt av?

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.

Vilken base URL behöver varje SDK?

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.

Kan jag fortsätta använda min OpenRouter-API-nyckel?

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.

Vad ersätter openrouter/auto och openrouter/free?

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.

Fungerar reservdirigering på samma sätt?

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.

Hur ser jag vad en förfrågan kostade?

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.

Identifierar X-Title och HTTP-Referer fortfarande min app?

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.

Vad händer med provider och transforms i mina förfrågningar?

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.

Vilka endpoints erbjuder OrcaRouter?

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.

Kommer fel tillbaka i samma format?

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.