يوفر RouterShift واجهات متوافقة مع OpenAI وAnthropic وGemini للنماذج النشطة لمفتاحك. يُطبق التوجيه والتحويل والفوترة ودليل التدقيق خلف حدود البروتوكول.
الميزات الرئيسية
واجهة برمجة تطبيقات متوافقة مع OpenAI — بديل مباشر لأي عميل OpenAI SDK
توجيه ذكي مع استراتيجيات قابلة للتكوين (الوزن، التوزيع الدوري، بناءً على زمن الاستجابة، التبديل الاحتياطي)
قاطع دائرة مدمج وتحديد معدل لحماية تطبيقك
تخزين مؤقت دلالي لتقليل زمن الاستجابة والتكاليف على الاستعلامات المتكررة
تسجيل ومراقبة وتحليلات إنفاق شاملة
دعم متعدد المزوّدين مع تبديل احتياطي تلقائي عند عدم توفر مزوّد
عنوان الأساس المتوافق مع OpenAI
تستخدم جميع طلبات API عنوان الأساس التالي. تتوافق الواجهة بالكامل مع مكتبات OpenAI؛ ما عليك سوى تغيير عنوان الأساس واستخدام مفتاح RouterShift API.
https://api.routershift.com/v1
عنوان الأساس المتوافق مع Anthropic
لـ Anthropic SDK أو Claude Code. ملاحظة: بدون اللاحقة /v1 — تقوم SDK بإضافة /v1/messages تلقائيًا.
https://api.routershift.com
التوافق مع بروتوكولات متعددة
يمكن لعملاء OpenAI وAnthropic وGemini عادة الاتصال بتغيير عنوان الأساس وبيانات الاعتماد. امتدادات البروتوكول الأصلي لا تنتقل تلقائياً بين البروتوكولات: يدعم التحويل فقط الحقول التي يمكن تمثيل معناها بصورة مكافئة. راجع OpenAPI للواجهات الموثقة؛ وتظل قيود المسارات والنماذج سارية.
فئات النماذج المدعومة
يمثل GET /v1/models المرجع للنماذج المتاحة لمفتاحك. يعتمد التوفر أيضاً على المنتج وصحة المسار والصلاحيات والرصيد والمنطقة وسياسة الوصول الخاص.
الحصول على المساعدة
إذا واجهت مشاكل أو لديك أسئلة، راجع الأقسام أدناه للحصول على أدلة مفصلة. للاستفسارات المتعلقة بالفوترة، تواصل مع الدعم عبر لوحة التحكم. للحصول على تحديثات الحالة في الوقت الفعلي، قم بزيارة صفحة الحالة.
قائمة نقاط النهاية الكاملة
يمثل الجدول فهرساً مقروءاً لمستوى البيانات العام. عقد الآلة في /api/openapi.yaml والمرجع التفاعلي في /api/docs، مع استمرار نطاقات المفاتيح.
GET/v1/version
إصدار وتوافق API لمستوى البيانات
GET/v1/models
عرض النماذج
GET/v1/requests/:id
إيصال الطلب الأصلي: قراءة أدلة التنفيذ والمحاسبة دون إعادة إرسال
GET/v1/requests/:id/result
نتيجة صوت محفوظة: قراءة النتائج الأصلية المدعومة دون توليد جديد
POST/v1/chat/completions
إكمال المحادثة (متوافق مع OpenAI)
POST/v1/contracted/chat/completions
إكمال المحادثة (متوافق مع OpenAI)
POST/v1/messages
Messages API (متوافق مع Anthropic)
POST/v1/messages/count_tokens
تقدير رموز Messages (النص والتفكير والأدوات؛ ليس استهلاكاً أصلياً دقيقاً)
يوفر RouterShift المحادثة والتضمينات واكتشاف النماذج ونقاط نهاية أخرى مدعومة. استخدم تنسيق الطلب والاستجابة الخاص بنقطة النهاية المختارة والمتوافقة مع OpenAI أو Anthropic أو Gemini.
أضف أدوات إلى الوكيل عبر MCP، أو استخدم Python/Node SDK في تطبيقك؛ فهما طريقتان متوازيتان للوصول. اتبع خطوات stdio المحلية الأربع ولا تحفظ بيانات الاعتماد في إعدادات مشتركة أو في نظام التحكم بالإصدارات.
طابق الحالة والزمن والاستخدام الأصلي ومصدر التخزين والإنفاق حسب التاريخ والنموذج والمفتاح، واضبط الميزانيات والتنبيهات المتاحة.
تكاملات SDK والوكلاء
استخدم عميلاً متوافقاً قياسياً أو حزم RouterShift لبايثون وNode.js؛ كلاهما يعتمد عقد API النشط نفسه.
تنزيل Python 0.3.7 وNode 0.3.7
تستهدف التنزيلات المثبتة الإصدار في هذه الصفحة Python 0.3.7 وNode 0.3.7 وتشمل اكتشاف النماذج التفصيلي. يلزم Python 3.9 أو أحدث؛ ويتطلب Node.js وMCP المحلي إصدار Node 20 أو أحدث. لا تعني الأرشيفات النشر على npm أو PyPI. لا يحتاج مستخدم SDK العادي لـNode إلى تبعيات MCP الاختيارية.
لا يلزم مصدر العميل أو بيانات اعتماد المزود. شارك اللغة وبيئة التشغيل وإصدار SDK وmodel_code + operation + mode والمعاملات المنقحة وحدود الوسائط وصلاحية URL والاستعادة وميزانية العملة والتزامن. REST هو عقد التنفيذ؛ وSDK عميل خفيف اختياري وMCP المحلي مدخل stdio للوكلاء. يستخدم SDK الخاص أصلاً دون /v1. قد يتطلب SDK المزود تعديل الحقول وإعادة المحاولة؛ تغيير المفتاح أو العنوان وحده لا يضمن التوافق متعدد الوسائط. اتفق على أمثلة منقحة للطلبات والاستجابات والنتائج المتوقعة. اختبر أولاً استجابات اصطناعية 200/202 وGET معلقاً وSSE غير مكتمل وإرسالاً مجهولاً وتسليماً مكرراً؛ يتطلب القبول المدفوع إذناً منفصلاً وميزانية صريحة.
نفّذ أولًا هذا الطلب للقراءة فقط، وانسخ رمز نموذج دقيقًا إلى الأمثلة أدناه. تعرض القائمة ما يمكن للمفتاح رؤيته؛ ولا تثبت تفعيل كل عملية أو وضع لذلك النموذج.
استخدم مفتاح التنفيذ نفسه مع GET /v1/models?details=1: لا ينشئ مهمة ولا يحجز أموالاً ولا يستدعي المزود؛ وتظل المصادقة والسجلات وحدود المعدل سارية. افحص مسارات وأنماط details.operations وconstraints.status وimport_contract.status/reason. احفظ الأبعاد والشروط والعملة والدقة والمحددات ووقت الرصد وsemantic_sha256. السعر المرجعي ليس عقداً قابلاً للتنفيذ. غياب القيود أو جهلها لا يعني مدخلات غير محدودة؛ وavailable لا يضمن الأموال. ليست هذه Schema كاملة لكل نموذج أو إسقاطاً شاملاً للعقود غير الرمزية. يبقى models.list() قائمة عادية افتراضياً؛ اطلب التفاصيل صراحة بأساليب SDK المضمنة أو REST. في constraints تصف available المجموعة المراجعة للعملية؛ وتتطلب unsupported إرشادات العملية المحددة.
ميز details.constraints.operations[].scope: تمثل reviewed_subset مجموعة العملية المراجعة؛ وتنطبق finite_admission_opt_in فقط على الطلبات التي تفعل الحد المحدود صراحة، لا على كل دردشة عادية. ليست parameters مخطط Schema كاملاً للمدخلات. إن وجدت details.admission، افحص status وprofile و/details/admission/required_headers وحدود المدخلات والمخرجات المعلنة؛ وتبقى النماذج المجهولة unavailable. لا يمنح الاكتشاف أموالاً أو سقف تسعير عاماً.
يتضمن Node 0.3.7 الأسلوب listDetails() وخيار details=true في models.list؛ ويتضمن Python 0.3.7 الأسلوبين models.list(details=True) وlist_details(). أساليب الاكتشاف التفصيلي هذه موجودة في حزم هذا الإصدار. يبقى models.list() قائمة عادية افتراضياً؛ ولا تحصل التثبيتات القديمة على الأساليب الجديدة تلقائياً.
يمكن لـ Python وNode وMCP استدعاء النماذج النصية. يستطيع الوكيل الاحتفاظ بنموذجه الأساسي واستدعاء RouterShift عند الحاجة. تبقى الصلاحيات والرسوم ضمن واجهة API نفسها.
import os
from routershift import RequestOptions, RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
response = client.chat.completions.create(
model="YOUR_TEXT_MODEL_CODE",
messages=[{"role": "user", "content": "Summarize this project in one sentence."}],
request_options=RequestOptions(max_retries=0),
)
print(response.choices[0].message.content)
طلبات Omni عبر HTTP
يرسل المثال صوت WAV ويطلب نصًا وصوتًا عبر تدفق HTTP. اختر مسارًا متوافقًا مع OpenAI تم التحقق منه، مع وضع stream وصوت يدعمهما النموذج. تتطلب النماذج التي تدعم SSE فقط الخيار stream:true؛ وتقبل routershift_chat هذا الخيار أيضًا. يحتفظ SDK بكتل المحتوى وaudio وmodalities واستدعاءات الأدوات والاستجابات الصوتية. لا يوفر HTTP Omni اتصالات Realtime WebSocket أو تحويلًا عشوائيًا بين بروتوكولات المزوّدين.
import base64
import os
from pathlib import Path
from routershift import RequestOptions, RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
audio_data = base64.b64encode(Path("/absolute/path/to/sample.wav").read_bytes()).decode()
response = client.chat.completions.create(
model="YOUR_OMNI_MODEL_CODE",
messages=[{"role": "user", "content": [
{"type": "text", "text": "Describe the sound."},
{"type": "input_audio", "input_audio": {"data": audio_data, "format": "wav"}},
]}],
stream=True,
modalities=["text", "audio"],
audio={"voice": "YOUR_MODEL_VOICE", "format": "wav"},
request_options=RequestOptions(max_retries=0),
)
for chunk in response:
if chunk.choices:
delta = chunk.choices[0].delta or {}
print(delta.get("content", ""), end="")
if delta.get("audio"):
print(delta["audio"].get("transcript", ""), end="")
توليد الكلام
تستدعي audio.speech المسار /v1/audio/speech. يعيد Python بايتات الصوت؛ ويعيد Node بايتات data وقيمة contentType الفعلية. اختر صوتًا وتنسيقًا يدعمهما النموذج. لا يُحفظ الصوت تلقائيًا في ملف محلي.
import os
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
speech = client.audio.speech(
model="YOUR_SPEECH_MODEL_CODE",
input="Welcome to RouterShift.",
voice="YOUR_MODEL_VOICE",
response_format="wav",
)
print(len(speech))
تفريغ الصوت
ترسل audio.transcribe الملف الصوتي المحدد صراحة بصيغة multipart إلى /v1/audio/transcriptions. احتفظ بامتداد الملف الحقيقي. يطلب المثال JSON ويقرأ text؛ وتعتمد اللغات والتنسيقات المدعومة على المسار.
import os
from pathlib import Path
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
transcript = client.audio.transcribe(
model="YOUR_TRANSCRIPTION_MODEL_CODE",
file=Path("/absolute/path/to/sample.wav").read_bytes(),
filename="sample.wav",
response_format="json",
)
print(transcript.text)
تفريغ صوت من عنوان HTTPS
استخدم audio.transcribe_url في Python أو audio.transcribeURL في Node.js، أو أرسل JSON يتضمن file_url إلى /v1/transcriptions. تتحقق حزمة SDK من عنوان HTTPS ولا تنزّل التسجيل محليًا. تستخدم علامتا Go وJava عميلَي HTTP القياسيين للغتين؛ ولا تدّعي RouterShift توفير حزم SDK خاصة بها لهما.
import os
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
transcript = client.audio.transcribe_url(
"YOUR_TRANSCRIPTION_MODEL_CODE",
"https://media.example/recording.wav",
language="en",
audio_format="wav",
response_format="json",
)
print(transcript.text)
إنشاء الصور والاستعلام عن مهامها
استخدم images.generate مع نموذج مفعّل لإنشاء الصور. للنماذج التي تدعم الصور غير المتزامنة، أضف async_=True في Python أو async: true في Node.js، ثم استعلم عن id المُعاد باستخدام images.retrieve. تتضمن الاستجابة المكتملة data وروابط الصور؛ وتتضمن الاستجابة المعلقة id وstatus.
import os
from routershift import ImageTaskResponse, RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
image = client.images.generate(
model="YOUR_IMAGE_MODEL_CODE",
prompt="A quiet garden in watercolor",
)
print(image)
if isinstance(image, ImageTaskResponse):
print(client.images.retrieve(image.id))
إرسال فيديو والاستعلام عن حالته
يرسل videos.create مهمة فيديو واحدة ويعيد task_id. احفظه قبل الاستعلام عبر videos.retrieve؛ قد لا تحتوي المهمة المعلقة على video_url بعد. يوفر كلا SDK أيضًا videos.poll للانتظار بمدة محدودة. مسار API هو /v1/video/generations، وكلمة video بصيغة المفرد.
تدعم مسارات Seedance وWan 3.0 الأصلية المتحقَّق منها الحقل generate_audio: حذفه يحافظ على إعداد المورد، وfalse يطلب فيديو بلا مسار صوتي، وtrue يطلب الصوت. يحوّله Wan إلى parameters.audio ويُفعّل الصوت افتراضياً حالياً. تبقى تعرفة فيديو Wan نفسها مع الصوت أو بدونه، دون رسم صوتي إضافي. قد لا تدعم المسارات الأخرى الحقل؛ ولا تُحذف القيم الصريحة بصمت.
import os
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
task = client.videos.create(
model="YOUR_VIDEO_MODEL_CODE",
prompt="A slow camera movement through a garden",
)
print(task.task_id)
result = client.videos.retrieve(task.task_id)
print(result.status, result.video_url)
اختيار المعلمات حسب النموذج
أرسل فقط المعلمات التي تم اعتمادها للنموذج والعملية المختارين. احتفظ بقيمة false الصريحة وseed=0؛ حذف الحقل يُبقي القيمة الافتراضية للمزوّد. تصف هذه الملاحظات التنفيذ البرمجي، وليس توفرًا مُتحققًا منه في الإنتاج.
Qwen Image 3.0: تعد seed وwatermark وprompt_extend وenable_thinking عناصر تحكم خاصة بالنموذج. تقبل prompt_extend_mode القيمتين direct وagent؛ وتتطلب agent توسيع المطالبة ولا تُستخدم لتحرير الصور. تعمل enable_thinking فقط عند تفعيل توسيع المطالبة ولا تُفعّل prompt_extend ضمنيًا.
فيديو Wan 3.0: تعد seed وwatermark وprompt_extend عناصر تحكم خاصة بالنموذج. استخدم generate_audio لتوليد الصوت؛ كونها اختيارية أو إلزامية أو غير مدعومة يعتمد على النموذج المختار. تتطلب مواد file/link قيمة prompt_extend=true أو حذف المعلمة؛ وتُرفض قيمة false الصريحة.
Ark Seedance: مسار المنصة الحالي لا يقبل seed أوprompt_extend. لا تنقل معلمات Qwen أوWan بين المزوّدين.
الدعم البرمجي لا يعني النشر، والنشر لا يعني اعتماد المنتج. التطوير دون اتصال للتحرير المتقدم وتمديد الفيديو وMOV وDraft وHappyHorse وWan 2.7 وAnimate وVACE لا يعني تفعيل منتجاتها. تحقق من النموذج والعملية والمعلمات قبل إرسال طلب مدفوع.
من الصور المرجعية إلى فيديو بإطار أول (REST وSDK وMCP)
ينشئ هذا المثال صورة من ثلاثة مراجع HTTPS لا تتضمن صور أشخاص، ثم يمرر رابط HTTPS الناتج في image_url ليكون الإطار الأول للفيديو. استبدل رمزي النموذجين برمزين ظاهرين لمفتاحك في /v1/models ومقبولين كلٌّ على حدة للعملية المعنية؛ فالظهور وحده لا يعني السماح. تتطلب دقة 720p والمدة البالغة 5 ثوانٍ دعم مسار الفيديو المختار.
Ark: استخدم مسار تحرير Seedream Pro مقبولًا ومسار Seedance يقبل الإطار الأول. لا تُستخدم المراجع الثلاثة إلا مع نموذج يدعمها؛ و2048x1152 ليست دقة عامة. لصور الأشخاص الحقيقيين قواعد منفصلة؛ واستثناء تحويل النص إلى صورة ضمن الحساب نفسه لا يجيز دمج ثلاث صور فوتوغرافية.
Bailian: يقبل مسار تحرير Qwen Image 3.0 المعتمد من صورة مرجعية واحدة إلى ثلاث ويعيد رابط URL؛ لا تتوقع b64_json ولا تفترض تفعيل وضع الصور غير المتزامن. يستخدم Wan الحقل image_url للإطار الأول. يجب أن يقبل المسار المختار الدقة والمدة؛ وإتاحة ميزة في لوحة المورد لا تثبت تفعيل مسار المنصة.
تعرض علامات التبويب تسلسلًا واحدًا، لا إعادة محاولات تلقائية. في REST أو MCP نفّذ كل خطوة على حدة. تجاوز قراءة مهمة الصورة إذا عاد رابط الصورة المكتملة بالفعل؛ وإلا فاستعلم مرة واحدة عن المهمة الأصلية ولا تتابع إلا برابط HTTPS صالح. احتفظ بمعرّف task_id للفيديو واستعلم مرة واحدة عن المهمة نفسها؛ ويمكن فحص المهمة المعلّقة لاحقًا.
تعيد مهام الصور في REST وSDK الحقل id، بينما تعيد مهام الفيديو task_id. تعرض نتائج MCP المحلية structuredContent.task_id عند وجود معرّف للمهمة: افحص isError وnext_action أولًا، ثم اقرأ structuredContent.outputs[].url أو محتوى صورة MCP المرفق. لا يُمرَّر في image_url للفيديو إلا رابط HTTPS فعلي؛ فمحتوى الصورة المرفق وحده ليس رابطًا. لا تفترض أن MCP يعيد data[0].url الخاص بـ REST.
يختلف رفض 400 الصريح عن انتهاء مهلة النقل مع جهل نتيجة الإرسال. عند الخطأ احتفظ برمز الخطأ ورسالته الآمنين وبـ X-Request-ID ومعرّف المهمة إن وُجد؛ لا تتوقع السبب الخام من المورد ولا تعِد إرسال طلب POST المدفوع تلقائيًا. فشل قراءة المهمة يعني تعذر معرفة حالتها فقط، لا فشل الإنشاء. انتهاء مهلة الانتظار لا يلغي العمل ولا يرد الرسوم. تُحسم الميزانية والخصم والتسوية وفق سجلات المنصة، لا هذا المثال ولا السعر المعروض من المورد.
إضافة أدوات النماذج إلى الوكيل
أضف أدوات إلى الوكيل عبر MCP، أو استخدم Python/Node SDK في تطبيقك؛ فهما طريقتان متوازيتان للوصول. اتبع خطوات stdio المحلية الأربع ولا تحفظ بيانات الاعتماد في إعدادات مشتركة أو في نظام التحكم بالإصدارات.
1. إنشاء مجلد مخصص وتثبيت MCP
استخدم Node 20 أو أحدث. يضيف هذا التثبيت المخصص لـ MCP اعتماديتي النظير الخاصتين بالبروتوكول؛ ولا يحتاجهما تثبيت Node SDK العادي.
استبدل مسار المثال، واضبط مفتاح API في بيئتك المحلية فقط، واحتفظ بأصل API الموثوق من دون /v1 أو بيانات اعتماد أو استعلام أو جزء. تستخدم علامة Codex صيغة stdio وenv_vars الموثقة.
أعد تشغيل عميل MCP أو حمّله من جديد، وتأكد من ظهور الأدوات العشر، ثم استدعِ routershift_list_models للقراءة فقط أولًا. لا تستدعِ أداة نموذج مدفوعة إلا عندما تنوي إرسال تلك العملية.
تتوفر عشر أدوات: routershift_list_models, routershift_estimate_chat, routershift_chat, routershift_generate_image, routershift_create_video, routershift_get_task, routershift_get_request, routershift_speech, routershift_transcribe, routershift_transcribe_url. اختر أولًا نموذجًا يدعم العملية المطلوبة. استعلم عن مهام الصور والفيديو باستخدام routershift_get_task مع kind بقيمة image أو video وtask_id. استعلم عن إيصال الطلب باستخدام routershift_get_request وrequest_id للقراءة فقط؛ فهذا لا يرسل عملية مدفوعة ولا يفعّلها. في 0.3.7 يقرأ details:true تفاصيل النماذج والعقود. يقرأ routershift_estimate_chat حد القبول الأعلى المحدود فقط: بلا استدعاء للمورد أو حجز أموال أو تنفيذ تلقائي؛ funds_verified=false. عرض السعر ليس الفاتورة النهائية ولا إذناً بالتنفيذ.
تقبل routershift_chat مراجع HTTPS للصور والفيديو؛ وتقرأ audio_file مسار WAV/MP3 مطلقًا تختاره صراحة، بحد أقصى 16 MiB. تقرأ routershift_transcribe ملفًا صوتيًا محليًا محددًا عبر file_path؛ بينما تمرر routershift_transcribe_url قيمة file_url عبر HTTPS دون تنزيلها. تُعاد مخرجات الكلام وصوت Omni مضمّنة. تقبل routershift_generate_image قيمة response_format من نوع url أو b64_json؛ وعندما يكون خرج b64_json محدود الحجم وصالحًا بصيغة PNG أو JPEG أو WebP أو GIF، تعيد محتوى image أصليًا في MCP من دون كتابة ملف أو تنزيله أو إعادة استضافته، ومن دون نسخ Base64 إلى JSON نصي. تُحذف صراحة بيانات الصور الأكبر من الحد أو ذات الصيغة المجهولة؛ لا تعِد إرسال طلب مدفوع لاسترجاع خرج محذوف. لا يفحص المحوّل المجلدات ولا يحفظ النتائج تلقائيًا.
تعرض علامة JSON بنية mcpServers الشائعة؛ وتعرض علامة TOML صيغة Codex الموثقة. تختلف مواقع الإعداد وأذونات العمليات الفرعية حسب العميل. يحتاج عملاء MCP البعيد فقط إلى وسيلة نقل مدعومة بصورة منفصلة؛ ولا تدّعي هذه الأمثلة أنها اختُبرت في جميع واجهات الوكلاء.
يتيح محوّل MCP المحلي استدعاء واجهات RouterShift للنصوص والوسائط المتعددة والصوت والمهام. توفر بوابة /v1/mcp الحالية الوصول إلى الأدوات الخارجية المهيأة. ولا تحل إعدادات HTTP/SSE الخاصة بها محل إعدادات أدوات النماذج المحلية الموضحة هنا.
الوصول إلى النماذج والانتظار والفوترة
منصات UGC: أرسل مرة واحدة، واحفظ معرّف المهمة وX-Request-ID الأصلي، ثم استعلم عن المهمة نفسها. معرّف العمل الخاص بتطبيقك لا يضمن إعادة آمنة على الخادم. تشترك REST وSDK وMCP في المهام والفوترة؛ تغيير طريقة الوصول لا يسمح بتكرار توليد مجهول النتيجة.
عندما يكون import_contract متاحاً والعملية مدعومة، استخدم endpoint_prefix/request_header (X-RouterShift-Customer-Contract) على /v1/contracted/... مع الطلب الكامل وsemantic_sha256. الرأس نفسه على /v1 العادي لا يفعل الحماية. توقف عند عقد غير مدعوم أو 404 أو تغير البصمة؛ ولا تعاود الإرسال دون حماية. تتطلب الدردشة المحمية أيضاً X-RouterShift-Token-Bound وX-RouterShift-Max-Admission-Quote وX-RouterShift-Quote-Currency مع عقد محدود موثق للمدخلات والمخرجات والتفكير. لا تستنتجها من البصمة أو طول السياق. المحاكاة العامة وadmission_quote مع bound_proven=false أو funds_verified=false ليست إذناً بالإنفاق أو سقفاً عاماً للتكلفة.
سجّل الإرسال والتنفيذ والتسليم والفوترة بشكل منفصل. عند غياب معرّف المهمة، تحقّق دون POST جديد. فشل GET يعني فقط أن الحالة غير متاحة. إذا اكتمل التوليد وفشل التنزيل، استعد تسليم النتيجة المعروفة نفسها. توقف released وreconciliation_required الاستعلام المتكرر، لكنها لا تثبت النجاح أو استرداد المال.
احفظ المعرف الأصلي واقرأ الإيصال عبر GET /v1/requests/ORIGINAL_REQUEST_ID. يقرأ GET /v1/requests/ORIGINAL_REQUEST_ID/result نتائج الصوت المحفوظة المدعومة فقط، وليس مخزناً عاماً للمخرجات. يغلف Python 0.3.7 (منذ 0.3.6) audio.retrieve/poll استعلام ASR الأصلي 202؛ ولا يعلن Node 0.3.7 أساليب مكافئة. لا تعيد طلبات GET الإرسال ولا تتولى استعادة المحاسبة. احفظ النتائج المتزامنة ومعرفات المهام الفعلية. افصل الإرسال المجهول وفشل التسليم والتسوية المعلقة؛ انتهاء المهلة لا يسمح بتكرار POST مدفوع.
عند receipt.metering.basis=recorded_settlement_context تعرض الاستجابة الأبعاد المسجلة لطلبات تمت تسويتها فقط. ليست إيصال المزود الأصلي أو فاتورته أو تفصيلاً كاملاً للرسوم. احفظ النصوص quantity/unit/pricing_unit_divisor؛ وتبقى الأدلة الغائبة أو غير المدعومة unavailable. لا تستبدل الاستخدام المجهول بصفر ولا تستنتج الرسوم النهائية أو تبدأ استعادة من هذا الإسقاط للقراءة فقط.
تحتفظ حالة وقائمة المحادثات غير المتزامنة بالحقل status وتضيف execution_status وbilling_status وreason_code وnext_action وretry_allowed: false. تعني completed أن النتيجة متاحة، لا أن الفوترة سُوّيت؛ ولا تعني unknown المجانية أو رد الأموال. ينقل _billing_status في SDK الصور وbilling_status في MCP فقط ترويسة X-Billing-Status الفعلية المسموح بها؛ ولا تُملأ القيمة عند غياب الترويسة أو عدم صلاحيتها. لا يبدأ الاستعلام استعادة الفوترة ولا يجيز إعادة الإرسال.
انسخ معرّف الطلب الكامل من صفحة تكاليف المستخدم أو سجلات طلبات المسؤول، ثم ابحث عن request_id مطابق تمامًا: UTF-8 صالح وغير فارغ، بحد أقصى 256 بايت، دون مسافات أو محارف تحكم. تبقى الصلاحيات ومرشحات الوقت والنموذج الحالية سارية؛ وعدم التطابق لا يثبت عدم قبول الطلب أو عدم وجود تكلفة. احفظ معرّف الإرسال الأصلي ومعرّف المهمة ومعرّفات الاستعلامات اللاحقة كلًا على حدة. يظل تصدير CSV شاملًا كامل النطاق الزمني المحدد، لا الصفوف المصفّاة بالمعرّف فقط.
تحكّم في الإرسالات الجديدة بطابور تطبيقك وحدود كل مستخدم، مع استعلامات متباعدة ومحدودة المدة. انتهاء المهلة يوقف الانتظار المحلي لا عمل المورّد. اختبارات التزامن المحاكية لا تعتمد قدرة المورّد على التوليد المتزامن.
استبدل YOUR_* برموز نماذجك أو أصواتك أو معرّفات المهام. تسرد /v1/models الرموز المرئية لمفتاحك، ولا تؤكد تفعيل النص أو Omni أو الصور أو الفيديو أو الصوت أو جميع الأوضاع. تحقّق من المدخلات والمخرجات والأوضاع المفعّلة للنموذج. لا يُدّعى دعم جميع النماذج أو Realtime.
تحتفظ دردشة SDK العادية وMessages بإعادة المحاولة التلقائية: يجب أن تستخدم طلبات UGC للدردشة وOmni صراحة Python RequestOptions(max_retries=0) أو Node maxRetries=0 وredirect=error. انعدام المحاولات في أساليب الوسائط المخصصة لا يشمل جميع الأساليب. لا تتكرر طلبات الصور والفيديو والكلام والتفريغ تلقائيًا؛ وتُرسل محادثة MCP مرة واحدة أيضًا. انتهاء المهلة أو إيقاف الانتظار لا يلغي العمل ولا يسترد الرسوم ولا يجعل إعادة الإرسال آمنة. احتفظ بمعرّف الصورة id ومعرّف الفيديو task_id. تمثل released وreconciliation_required حالات نهائية، ولا تثبت نجاح التوليد.
تستخدم استدعاءات SDK وMCP نفس API والأسعار وقياس الاستخدام والمحفظة والتسوية التي تستخدمها الطلبات المباشرة. ولا تضيف رصيدًا أو نظام فوترة منفصلًا. رابط النتيجة لا يؤكد اكتمال التسوية؛ راجع حالة الفوترة في API عند توفرها وسجلات لوحة التحكم الحالية.
يشير as_of في تقدير السعر إلى وقت الاستعلام، وليس مدة ضمان للسعر. تُسوّى المهام المقبولة وفق عقد السعر المحفوظ والاستخدام الفعلي الأصلي، دون تطبيق تعديلات الكتالوج أو أسعار المفتاح اللاحقة. تثبيت التعرفة لا يثبت المبلغ النهائي. إذا كانت بيانات الاستخدام ناقصة أو متعارضة فتجب مطابقتها بدلاً من تخمين الرسوم. استعلم عن المهمة الأصلية ولا تُنشئ مهمة جديدة بمعلمات مختلفة.
حزم SDK الرسمية
عملاء بأنواع محددة للنماذج والدردشة والرسائل والتضمينات والوسائط والمهام غير المتزامنة دون واجهات جلسة لوحة التحكم.
الأنظمة المتوافقة
تستخدم عملاء OpenAI وAnthropic وGemini المتوافقة مجموعة البروتوكول المدعومة فقط. تحقق من بادئة العنوان والحقول وتحليل الاستجابة وإعادة المحاولة؛ تغيير المفتاح أو العنوان وحده لا يضمن الوسائط خارج الدردشة.
بروتوكولات الوكلاء
يوفر MCP وA2A حدود تشغيل متبادل مستقرة دون كشف تفاصيل التوجيه الداخلية.
إصدارات SDK مستقلة
تصدر حزم SDK بصورة مستقلة عن نشر المنصة. يتضمن Python 0.3.7 وNode 0.3.7 أساليب الاكتشاف التفصيلي. تحقق من التنزيلات المثبتة الإصدار بقيم SHA-256؛ ولا تعني الأرشيفات النشر على npm أو PyPI أو القبول الأصلي للنموذج. يبقى عقد OpenAPI الفعلي هو المرجع.
import os
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
models = client.models.list()
print([model.id for model in models])
response = client.chat.completions.create(
model="YOUR_MODEL_CODE",
messages=[{"role": "user", "content": "Hello"}],
)
المصادقة
تتطلب جميع طلبات API المصادقة باستخدام رمز Bearer. يمكنك إنشاء مفاتيح API وإدارتها من لوحة تحكم لوحة التحكم.
تنسيق مفتاح API
تبدأ مفاتيح API بـ sk- يتبعها معرّف فريد. حافظ على أمان مفاتيح API ولا تكشفها أبدًا في الكود المصدري أو نظام التحكم بالإصدارات.
رأس التفويض
أدرج مفتاح API في رأس Authorization في كل طلب:
Authorization: Bearer YOUR_API_KEY
أفضل ممارسات الأمان
لا تقم مطلقًا بتضمين مفاتيح API مباشرة في الكود المصدري. استخدم متغيرات البيئة أو مدير الأسرار.
قم بتدوير مفاتيح API بانتظام من لوحة التحكم — أنشئ مفاتيح جديدة وألغِ المفاتيح القديمة بدون توقف.
استخدم مفاتيح API منفصلة لبيئات التطوير والإنتاج.
عيّن حدود الاستخدام وتقييدات IP لمفاتيح API لحماية إضافية.
راقب استخدام المفاتيح في لوحة التحكم للكشف عن أي نشاط غير عادي.
لا تقم بإدراج مفاتيح API في نظام التحكم بالإصدارات. أضف ملفات .env إلى .gitignore.
تواقيع HMAC للويب هوك
يتضمن Webhook المستخدم في X-RS-Signature ملخص HMAC-SHA256 السداسي العشري للجسم. يحدد X-RS-Event وX-RS-Delivery الحدث والتسليم.
تقديم الطلبات
يوفر RouterShift المحادثة والتضمينات واكتشاف النماذج ونقاط نهاية أخرى مدعومة. استخدم تنسيق الطلب والاستجابة الخاص بنقطة النهاية المختارة والمتوافقة مع OpenAI أو Anthropic أو Gemini.
إكمال المحادثة
أرسل طلب إكمال محادثة مع اسم النموذج ومصفوفة الرسائل ومعلمات اختيارية مثل temperature وmax_tokens وtop_p. يقوم RouterShift بتوجيه طلبك إلى المزوّد المناسب بناءً على تكوين التوجيه الخاص بك.
الاستجابات بالبث المباشر
قم بتمكين البث المباشر بتعيين stream: true. يدعم RouterShift أحداث الخادم المرسلة (SSE) للبث المباشر للرموز. تنسيق البث متوافق مع مواصفات البث من OpenAI.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.routershift.com/v1",
api_key=os.environ["ROUTERSHIFT_API_KEY"],
)
stream = client.chat.completions.create(
model="YOUR_MODEL_CODE",
messages=[{"role": "user", "content": "Tell me a story"}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
الطلبات غير المتزامنة
للمهام طويلة التشغيل أو معالجة الدفعات، استخدم الوضع غير المتزامن. قدم طلبًا واستعلم عن النتائج — مفيد لأعباء العمل التي تتجاوز حدود مهلة الانتظار العادية.
معالجة الدفعات
ارفع ملف JSONL إلى POST /v1/batch ثم استعلم عن الحالة والنتائج. يعتمد الوقت والسعر على وضع التنفيذ وعقد النموذج؛ ولا تضمن الدفعة وحدها خصماً أو موعد إنجاز ثابتاً.
التضمينات
أنشئ تضمينات متجهية للنص باستخدام نقطة النهاية /v1/embeddings. التضمينات مفيدة للبحث الدلالي والتجميع والتوليد المعزز بالاسترجاع (RAG).
تقدير الرموز
أرسل محتوى طلب المحادثة إلى POST /v1/chat/completions/estimate لتقدير الرموز والتكلفة قبل الاستدعاء. التقدير ليس الخصم النهائي؛ تعتمد الفوترة على الاستخدام الفعلي وعقد التسعير المطبق.
حدود المعدل وضوابط الطلب
تتحدد الحدود الفعلية وفق مفتاح API وسياسة العميل ومسار النموذج وسعة المزوّد. وتعكس رؤوس الاستجابة ولوحة التحكم الإعدادات الفعلية قيد التشغيل.
حدود المعدل الافتراضية
تعيد مفاتيح المنصة x-ratelimit-limit-{tps,rpm,tpm,tph}، وللحدود المفعّلة x-ratelimit-remaining-{tps,rpm,tpm,tph}. يظهر Retry-After فقط عندما يمكن للانتظار استعادة السعة، مقربًا لأعلى إلى ثوانٍ كاملة؛ ولا يضمن نجاح المحاولة التالية. عند غيابه، تحقق من حصة الطلب والسياسة. لا تُعد إرسال POST تلقائيًا إذا كانت نتيجته مجهولة؛ استخدم تراجعًا محدودًا بتفاوت عشوائي فقط للطلبات المؤكد أمان إعادة محاولتها.
رموز استجابة HTTP
429429 Too Many Requests — لقد تجاوزت حد المعدل. تحقق من رأس Retry-After وتراجع.
402402 Payment Required — رصيد حسابك غير كافٍ. أضف رصيدًا في قسم الفوترة.
403403 محظور — لا يُسمح للمفتاح المصادق عليه باستخدام هذا النموذج أو المسار أو العملية. راجع نطاقات المفتاح وسياسة العميل.
503503 Service Unavailable — لا يتوفر أي مزوّد حاليًا للنموذج المطلوب. ربما يكون قاطع الدائرة قد عطل جميع المزوّدين مؤقتًا.
401401 Unauthorized — رأس Authorization مفقود أو غير صحيح.
400400 Bad Request — معلمات طلب غير صالحة. تحقق من رسالة الخطأ للحصول على التفاصيل.
الفوترة والتسعير
يستخدم RouterShift محافظ مسبقة الدفع ولقطة سعر لكل طلب. تُخصم الطلبات الناجحة بسعر البيع للعميل ووفق أبعاد الفوترة المهيأة للمنتج.
نموذج التسعير
يستخدم الخصم سعر البيع المعتمد للعميل ويثبّت النموذج والعملة وإصدار السعر وأبعاد الفوترة لكل طلب. يعرض الدليل العام سعر القائمة للمقارنة، أما تكلفة المزوّد فهي حقيقة تسوية.
الفوترة والفواتير
طابق الطلبات والرموز وأبعاد التخزين المؤقت والإنفاق حسب التاريخ والنموذج ومفتاح API. تعتمد الفواتير والاستردادات على دليل السعر المحفوظ في الخادم ولا تعيد تغييرات السعر كتابة التاريخ.
المحفظة والرصيد
تُحاسب محافظ CNY وUSD بشكل مستقل. الرصيد النقدي المتاح يستثني الأموال المجمدة بالفعل؛ لا تخصمها مرة ثانية. الائتمان الشخصي المؤجل وضمان المنصة معطلان افتراضياً ويتطلبان موافقة منفصلة على الائتمان ورأس مال الضمان. الائتمان المستخدم وأصل الدين غير المسدد ليسا رصيداً نقدياً ولا يمنحان صلاحية تلقائية للنماذج. يتطلب قبول الطلب عقد قياس معتمداً وحداً أعلى مثبتاً للتكلفة. التقدم المباشر ليس فاتورة نهائية؛ تبقى النتائج أو الكميات المجهولة قيد المطابقة. يُحتسب الشحن بعد تأكيد استلام الدفع.
الباقات والقسائم
لا تؤثر الباقات أو العروض أو القسائم أو خطط التوفير على السعر إلا عند وجود قاعدة مطبقة. يبقى تمويل الخصم منفصلاً عن مستحقات المزوّد الأصلية.
محرك عمولة الموزع
يحصل الموزعون على نسبة مئوية من هامش المنصة على كل طلب من المستخدمين المدعوين. تتيح تجاوزات معدل العمولة لكل نموذج برامج شركاء دقيقة — مثلًا، 15% على GPT-4o، 10% على Claude. الإسناد يتم تلقائيًا عبر روابط الدعوة؛ والاستيطان يتم في الوقت الفعلي لكل طلب.
الوصول الخاص
يجمع الوصول الخاص بين BYOK ومجموعات حسابات الذكاء الاصطناعي مع تحكم مركزي وتسعير مرن وتحويل تلقائي عند الأعطال.
تكامل BYOK
اربط مفاتيحك بعد تفعيل الوصول الخاص. يحاسب المورّد حسابك بشكل منفصل، وتتبع رسوم RouterShift الخطة والإعفاءات السارية. لا يعني BYOK أن كل الاستخدام مجاني.
مجموعات الحسابات
اربط مجموعات الحسابات الخارجية عبر جسر مفاتيح وطبقة سياسات موحّدة.
نظام الاشتراك
الوصول الخاص خدمة إضافية اختيارية. راجع الرسوم الشهرية الثابتة أو رسوم الاستخدام والعملة والتجديد والإعفاءات قبل التفعيل. تبقى واجهة المنصة الأساسية مدفوعة حسب الاستخدام.
التحويل عند الأعطال
عند تعذر المصدر الخاص، يمكن تجربة مسارات المنصة المؤهلة للنموذج نفسه بالتتابع ضمن صلاحيات المفتاح والمنطقة. يخضع الاستخدام لسعر البيع وفحص الرصيد والميزانية؛ ولا يجعله الاشتراك الخاص أو الإعفاء من رسوم الخدمة مجانياً.
تسوية قابلة للتدقيق باليوان والدولار
سلسلة أدلة مالية واحدة للتسعير والخصم وتقاسم الإيرادات والاسترداد والدفع والفوترة، وليست مجرد تحويل للعرض. حساب واحد يشتري النماذج المحلية والعالمية: يحتفظ العميل بتجربة اليوان بينما تُسوّى تكاليف التوريد الدولية بعملتها الأصلية.
فصل عملة البيع عن عملة التكلفة
تُباع المنتجات المحلية وتصدر فواتيرها باليوان، ولا يتحمل العميل تقلب الدولار لكل طلب عندما يتقاضى المزود بالدولار.
لقطة للسعر والصرف لكل طلب
يثبت كل طلب نسخة سعر الصرف والسعر المعتمدتين وحركات المحفظة الفعلية، ولا تعيد التغييرات اللاحقة كتابة السجل.
مستحقات المزود بعملته الأصلية
يبقى التزام المزود بعملة المنبع، بينما تسجل هوامش المنصة والعمولات والضرائب كحقائق محاسبية منفصلة.
استرداد عبر المسار الأصلي
يعكس الاسترداد حركات اليوان والدولار الأصلية، وتسجل أي إعادة تحويل فعلية ربح أو خسارة الصرف بصورة مستقلة.
معالجة الأخطاء
افهم أخطاء API الشائعة وكيفية معالجتها بطريقة سلسة في تطبيقك.
هيكل استجابة الخطأ
تتبع جميع الأخطاء التنسيق القياسي مع كائن خطأ يحتوي على message وtype وcode وparam (إن وجدت).
التزم بقيمة Retry-After عند وجودها. أعد فقط العمليات المتطابقة أو القابلة لإعادة التشغيل بأمان، واستخدم تراجعًا أسيًا محدودًا مع تذبذب، وتوقف عند استنفاد ميزانية المحاولات أو الوقت التي يحددها التطبيق.
أنواع الأخطاء الشائعة
invalid_request_error — جسم طلب غير صحيح أو معلمات مطلوبة مفقودة.
authentication_error — مفتاح API غير صالح أو منتهي الصلاحية أو ملغى.
rate_limit_error — عدد كبير جدًا من الطلبات. أبطئ واحترم رؤوس Retry-After.
server_error — مشكلة مؤقتة في المزوّد أو المنصة. أعد المحاولة مع التراجع المتزايد.
upstream_error — لا يوجد مورّد متاح أو فشل استدعاء المورّد. افحص error.code قبل تقرير إعادة المحاولة.
content_filter_error — تم حظر الطلب بواسطة حواجز الحماية أو مرشح المحتوى. راجع المحتوى المُشار إليه.
رموز الخطأ المنظمة
تتضمن أخطاء الاستدلال المتوافقة مع OpenAI الحقل القابل للقراءة آلياً error.code. استخدمه للمعالجة البرمجية بدلاً من تحليل نص الرسالة.
AUTH_INVALIDبيانات الاعتماد غير صالحة
AUTH_EXPIREDانتهت الجلسة
AUTH_EMAIL_NOT_VERIFIEDالبريد الإلكتروني غير موثق
AUTH_INSUFFICIENTتم رفض الوصول
WALLET_LOWرصيد غير كافٍ
WALLET_EMPTYالمحفظة فارغة
RATE_LIMIT_GLOBALتم تجاوز حد المعدل
RATE_LIMIT_KEYتم تجاوز حد معدل مفتاح API
RES_MODEL_NOT_FOUNDالنموذج غير موجود
UPSTREAM_UNREACHABLEالمزود الأساسي غير متاح
UPSTREAM_ERRORخطأ المزود الأساسي
UPSTREAM_TIMEOUTانتهت مهلة المزود الأساسي
INTERNAL_ERRORخطأ داخلي في الخادم
error.code
الوصف
AUTH_INVALID
بيانات الاعتماد غير صالحة
AUTH_EXPIRED
انتهت الجلسة
AUTH_EMAIL_NOT_VERIFIED
البريد الإلكتروني غير موثق
AUTH_INSUFFICIENT
تم رفض الوصول
WALLET_LOW
رصيد غير كافٍ
WALLET_EMPTY
المحفظة فارغة
RATE_LIMIT_GLOBAL
تم تجاوز حد المعدل
RATE_LIMIT_KEY
تم تجاوز حد معدل مفتاح API
RES_MODEL_NOT_FOUND
النموذج غير موجود
UPSTREAM_UNREACHABLE
المزود الأساسي غير متاح
UPSTREAM_ERROR
خطأ المزود الأساسي
UPSTREAM_TIMEOUT
انتهت مهلة المزود الأساسي
INTERNAL_ERROR
خطأ داخلي في الخادم
معالجة مهلة الانتظار
اختر مهل الاتصال والطلب وخمول البث وفقًا لعبء العمل وزمن استجابة النموذج. لا ينبغي للعمليات المتزامنة والمتدفقة وغير المتزامنة وعمليات الدفعات مشاركة قيمة ثابتة واحدة.