מעבר מ-OpenRouter עולה שורה אחת

שנו את ה-base URL שלכם והחליפו למפתח OrcaRouter. המודלים, ה-SDK ושאר הקוד נשארים בדיוק כפי שהם — השינוי היחיד הוא מזהי הנתבים ⁨openrouter/⁩.

שלושה דברים לבדוק

  1. השתמשו ב-base URL הנכון ל-SDK שלכם — ה-SDK של OpenAI מצפה ל-⁨https://api.orcarouter.ai/v1⁩. השניים האחרים מצפים ל-⁨https://api.orcarouter.ai⁩ — כל אחד מוסיף את הנתיב שלו בעצמו.
  2. החליפו למפתח OrcaRouter שלכם — הערך משתנה — מפתח OpenRouter לא יאומת כאן — אבל המקום לא: אנחנו קוראים את אותה כותרת שה-SDK שלכם כבר שולח.
  3. שמרו על שמות המודלים — אנחנו משתמשים באותם שמות בתבנית ⁨vendor/model⁩, ולכן ⁨anthropic/claude-sonnet-4⁩ עובד כמו שהוא. היוצא מן הכלל הוא מזהי הנתבים ⁨openrouter/⁩ של OpenRouter עצמה: אותם משנים.

לפני ואחרי: השורה שמשתנה

OrcaRouter מדבר באופן מובנה את ממשקי ה-API של ⁨OpenAI⁩, ⁨Anthropic⁩ ו-⁨Gemini⁩, כך שאתם נשארים עם ה-SDK שכבר בשימוש. בכל קטע קוד, שורות שמתחילות ב-⁨-⁩ הן אלה שמוחקים, ושורות שמתחילות ב-⁨+⁩ הן אלה שמוסיפים.

OpenAI — Python

  client = OpenAI(
-     base_url="https://openrouter.ai/api/v1",
+     base_url="https://api.orcarouter.ai/v1",
      api_key=ORCAROUTER_API_KEY,
  )

זה השינוי היחיד בקוד. בנוסף החליפו למפתח OrcaRouter — שמות הדגמים, ההודעות והסטרימינג נשארים אותו דבר, אלא אם אתם קוראים למזהה נתב ⁨openrouter/⁩.

Anthropic — Python

  client = Anthropic(
+     base_url="https://api.orcarouter.ai",
      api_key=ORCAROUTER_API_KEY,
  )

אנחנו תומכים ב-API של Anthropic באופן ישיר, מה ש-OpenRouter אינו מציע. אם קראתם ל-Claude דרך ה-SDK של OpenAI כדי להתאים ל-OpenRouter, אפשר להפסיק.

Gemini — TypeScript

  const ai = new GoogleGenAI({
    apiKey: ORCAROUTER_API_KEY,
+   httpOptions: { baseUrl: "https://api.orcarouter.ai" },
  });

גם ב-API של Gemini אנחנו תומכים ישירות, כך שה-SDK של Google עובד ללא שינוי.

דוגמאות מלאות לכל SDK

כולל ייבוא, יצירת הלקוח וקריאה אמיתית אחת. רץ בדיוק כך, ברגע ש-ORCAROUTER_API_KEY מוגדר בסביבה שלכם.

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

מזהי מודלים: מה משנים

אנחנו משתמשים באותם שמות בתבנית ⁨vendor/model⁩, ולכן ⁨anthropic/claude-sonnet-4⁩ עובד כמו שהוא. היוצא מן הכלל הוא מזהי הנתבים ⁨openrouter/⁩ של OpenRouter עצמה: אותם משנים.

ב-OpenRouterב-OrcaRouter
openrouter/autoorcarouter/auto
openrouter/freeorcarouter/free
כל נתב ⁨openrouter/⁩ אחראין מקבילה — ציינו מודל במקום זאת
כל מזהה בצורת ⁨vendor/model⁩, למשל ⁨anthropic/claude-sonnet-4⁩אותו מזהה, ללא שינוי

הבדלים בחיוב

ארבעה דברים שאיננו עושים

עדיף לדעת עכשיו מאשר לגלות בסביבת הייצור.

שאלות נפוצות

האם OrcaRouter יכול להחליף את OpenRouter כמו שהוא?

ברוב האינטגרציות, כן. שנו את ה-base URL והחליפו למפתח OrcaRouter; ה-SDK, שמות המודלים, ההודעות וה-streaming נשארים כפי שהם. היוצאים מן הכלל הם מזהי הנתבים ⁨openrouter/⁩ של OpenRouter עצמה, שמקבלים שם חדש, וארבעת הדברים ש-OrcaRouter במכוון לא עושה, המפורטים למעלה.

איזה base URL צריך כל SDK?

ה-SDK של OpenAI מצפה ל-⁨https://api.orcarouter.ai/v1⁩. השניים האחרים מצפים ל-⁨https://api.orcarouter.ai⁩ — כל אחד מוסיף את הנתיב שלו בעצמו.

אפשר להמשיך להשתמש במפתח ה-API של OpenRouter?

הערך משתנה — מפתח OpenRouter לא יאומת כאן — אבל המקום לא: אנחנו קוראים את אותה כותרת שה-SDK שלכם כבר שולח.

מה מחליף את ⁨openrouter/auto⁩ ואת ⁨openrouter/free⁩?

הנתבים של OrcaRouter הם אלה שמתחילים ב-⁨orcarouter/⁩. שניים מהם מקבילים ישירות לשלהם: השתמשו ב-⁨orcarouter/auto⁩ במקום ⁨openrouter/auto⁩, וב-⁨orcarouter/free⁩ במקום ⁨openrouter/free⁩ — אותו רעיון בשני המקרים, אנחנו בוחרים עבורכם מודל ברגע הבקשה, והשני משאיר אתכם בשכבה ללא עלות. לשאר הנתבים שלהם אין מקבילה כאן, אז ציינו מודל מפורש.

האם ניתוב הגיבוי עובד באותה צורה?

העבירו את models ואת route אל תוך extra_body. כל השאר נשאר זהה: רשמו את המודלים לפי סדר העדפה ואנחנו ננסה אותם בזה אחר זה. לפחות 2 מודלים, לכל היותר 5. כדאי לעשות זאת כראוי. ברמה העליונה איננו קוראים אותם, ולכן הגיבויים שלכם מפסיקים לעבוד בשקט; ובהתקנות שמעבירות את גוף הבקשה כמות שהוא, המודל מקבל את השדות המיותרים ועלול לדחות את הקריאה כולה.

איך בודקים כמה עלתה בקשה?

קראו את X-Orca-Request-Id מהתגובה, ואז קראו ל-‎⁨/v1/generation⁩. קוד 501 מעיד שבהתקנה הזו בירור עלויות מכובה.

האם X-Title ו-HTTP-Referer עדיין מזהים את האפליקציה שלי?

שלחו X-Title והאפליקציה שלכם תשמור על שמה בנתונים האנליטיים ללא כל שינוי; אנחנו קוראים גם את שמות הכותרות של OpenRouter עצמו. ‏HTTP-Referer לבדה תזהה את האפליקציה שלכם רק אם הדומיין שלה נמצא בין אלה שאנחנו כבר מזהים, ולכן שלחו כותרת כותרת אם ברצונכם לוודא. השורה הזו כאן כדי שלא תסירו אותן בטעות.

מה קורה ל-provider ול-transforms בבקשות שלי?

אנחנו לא משתמשים באף אחד מהם. בערוץ רגיל הם מושמטים לפני שהבקשה מגיעה למודל; בערוץ שמוגדר להעביר את גוף הבקשה כמות שהוא הם נשלחים הלאה, וספק קפדני עלול לדחות את הבקשה. להסיר אותם זה הצעד הבטוח בשני המקרים.

אילו נקודות קצה OrcaRouter מספק?

כל מה שאתם מצפים לו, ועוד כמה ש-OpenRouter אינו מציע. זמינות כאן ולא ב-OpenRouter: ⁨/v1/messages⁩, ⁨/v1beta/models … generateContent⁩, ⁨/v1/rerank⁩ ו-⁨/v1/realtime⁩. לא זמינות: ⁨/v1/fine-tunes⁩, ⁨GET /v1/files⁩ ו-⁨/v1/images/variations⁩.

האם שגיאות חוזרות באותה צורה?

השגיאות חוזרות באותו מבנה שאתם כבר מטפלים בו. פעלו לפי סטטוס ה-HTTP: נסו שוב 429 כשאנחנו שולחים Retry-After, המתינו ונסו שוב 5xx למעט 501 — שמשמעו שאנחנו לא משרתים את הקריאה הזאת כלל — והתייחסו ל-4xx בקריאת ריליי כאל משהו לתקן בבקשה שלכם. היוצא מן הכלל הוא 404 מ-⁨/v1/generation⁩: ייתכן שפשוט טרם הסתיימה ההתחשבנות על הבקשה, אז נסו אותו שוב לזמן קצר. אל תקראו את error.type כמקור: orcarouter_api_error הוא תמיד שלנו, אך לחלק מהתקלות שלנו אנחנו שולחים בכוונה את אוצר המילים של הספק כדי שה-SDK שלכם ילך במסלול הרגיל שלו — הגבלת קצב שאנחנו הטלנו ואחת שהמודל הטיל נקראות שתיהן rate_limit_error. ציינו X-Orca-Request-Id כשצריך שנאתר קריאה מסוימת.