غيّر عنوان base URL وضع مفتاح OrcaRouter. أما نماذجك و SDK وبقية شيفرتك فتبقى كما هي تمامًا — وما يُعاد تسميته هو معرّفات الموجِّهات openrouter/ وحدها.
يتعامل OrcaRouter مع واجهات OpenAI وAnthropic وGemini مباشرةً، لذا تحتفظ بـ SDK الذي تستخدمه أصلًا. في كل مقتطف، الأسطر التي تبدأ بـ - هي ما تحذفه، والأسطر التي تبدأ بـ + هي ما تضيفه.
client = OpenAI(
- base_url="https://openrouter.ai/api/v1",
+ base_url="https://api.orcarouter.ai/v1",
api_key=ORCAROUTER_API_KEY,
)هذا هو التغيير الوحيد في الشيفرة. وضَع أيضًا مفتاح OrcaRouter — أسماء نماذجك ورسائلك والبثّ تبقى كما هي، ما لم تستدعِ معرّف موجِّه يبدأ بـ openrouter/.
client = Anthropic(
+ base_url="https://api.orcarouter.ai",
api_key=ORCAROUTER_API_KEY,
)نحن ندعم واجهة Anthropic مباشرةً، وهو ما لا يوفّره OpenRouter. فإن كنت تستدعي Claude عبر SDK الخاص بـ OpenAI لمجاراة OpenRouter، فلم تعد بحاجة إلى ذلك.
const ai = new GoogleGenAI({
apiKey: ORCAROUTER_API_KEY,
+ httpOptions: { baseUrl: "https://api.orcarouter.ai" },
});وندعم كذلك واجهة Gemini مباشرةً، لذا يعمل SDK من Google دون أي تعديل.
يشمل الاستيراد وتهيئة العميل واستدعاءً حقيقيًا واحدًا. يعمل كما هو بمجرّد ضبط ORCAROUTER_API_KEY في بيئتك.
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"}]}]
}'نستخدم صيغة التسمية نفسها vendor/model، لذا يعمل anthropic/claude-sonnet-4 كما هو. والاستثناء هو معرّفات موجِّهات OpenRouter نفسها التي تبدأ بـ openrouter/، فهذه يُعاد تسميتها.
| على OpenRouter | على OrcaRouter |
|---|---|
openrouter/auto | orcarouter/auto |
openrouter/free | orcarouter/free |
| أي موجِّه آخر من نوع openrouter/ | لا نظير له — اذكر نموذجًا بعينه بدلًا منه |
| أي معرّف بصيغة vendor/model، مثل anthropic/claude-sonnet-4 | المعرّف نفسه دون تغيير |
أن تعرف الآن خير من أن تكتشف ذلك في بيئة التشغيل.
في معظم التكاملات، نعم. غيّر base URL وضع مفتاح OrcaRouter؛ أما SDK وأسماء النماذج والرسائل والبثّ فتبقى كما هي. الاستثناءات هي معرّفات موجِّهات openrouter/ الخاصة بـ OpenRouter، والتي يُعاد تسميتها، والأمور الأربعة التي لا يقوم بها OrcaRouter عن قصد، والمذكورة أعلاه.
يتطلب SDK الخاص بـ OpenAI العنوان https://api.orcarouter.ai/v1، أما الاثنان الآخران فيكفيهما https://api.orcarouter.ai، إذ يضيف كلٌّ منهما مساره بنفسه.
القيمة تتغيّر — مفتاح OpenRouter لا يُصادَق عليه هنا — أما الموضع فلا يتغيّر: نقرأ الترويسة نفسها التي ترسلها حزمة التطوير لديك بالفعل.
موجِّهات 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 ليحتفظ تطبيقك باسمه في تحليلاتك دون أي تغيير؛ ونحن نقرأ كذلك أسماء الترويسات الخاصة بـ OpenRouter. أما ترويسة HTTP-Referer وحدها فلا تسمّي تطبيقك إلا إذا كان نطاقه ضمن النطاقات التي نعرفها سلفًا، لذا أرسل ترويسة العنوان إن أردت التأكد. وُضع هذا البند هنا كي لا تحذفهما سهوًا.
لا نستخدم أيًّا منهما. على قناة عادية يُحذفان قبل أن يصل الطلب إلى النموذج؛ وعلى قناة مهيّأة لتمرير الجسم كما هو يُمرّران، وقد يرفض مزوّد صارم الطلب. إزالتهما هي الخيار الآمن في الحالتين.
كل ما تتوقعه، إضافةً إلى بضع نقاط لا يوفّرها 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 حين تحتاج منّا البحث عن استدعاء بعينه.