واجهة API متوافقة مع OpenAI
آخر تحديث: 11 نوفمبر 2026
ما هي
تتيح واجهة API المتوافقة مع OpenAI لأي أداة تتعامل مع تنسيق chat completions في OpenAI استخدام نماذج الدردشة في ToRun، مع الدفع من حسابك في ToRun. يستطيع وكيل برمجة مثل opencode استخدام ToRun بوصفه مزوّد النماذج الخاص به، إلى جانب أدوات MCP من ToRun.
العنوان وتسجيل الدخول
| عنوان URL الأساسي | https://mcp.torun.ai/v1 |
| تسجيل الدخول | Authorization: Bearer <your developer key> |
استخدم مفتاح المطوّر نفسه الذي تستخدمه لخادم MCP: راجع مفاتيح المطوّر. المفتاح الذي أُنشئ قبل إضافة واجهة API المتوافقة مع OpenAI يتلقى الرد 403 insufficient_scope. صلاحيات المفتاح لا تتغير أبدًا، لذا أنشئ مفتاحًا جديدًا.
للواجهة نقطتا نهاية: GET /v1/models وPOST /v1/chat/completions. أي مسار آخر تحت /v1 يردّ بـ 404 not_found.
النماذج
يعرض GET /v1/models النموذج torun/auto أولًا، ثم كل نموذج نصي تستطيع خطتك استخدامه، بمعرّف النموذج. ويذكر كل نموذج:
- كمية النص التي يستطيع قراءتها (
context_length) وطول الرد الذي يستطيع كتابته (max_completion_tokens)، - هل يستطيع استدعاء الأدوات (
supports_tools) وقراءة الصور (supports_vision)، - سعره بوحدات Runs لكل مليون رمز (
pricing:inputوoutput).
يتيح torun/auto لـ ToRun اختيار نموذج لكل طلب: نموذج يقرأ الصور عندما يحتوي الطلب على صورة، ونموذج يستدعي الأدوات عندما يرسل tools.
Chat completions
يقبل POST /v1/chat/completions:
messagesبالأدوارsystemوdeveloper(يُعامَل معاملةsystem) وuserوassistantوtool،toolsوtool_choice(autoأوnoneأوrequiredأو دالة واحدة مسمّاة): تعود أدوات أداتك الخاصة إليها كاستدعاءات أدوات، ولا يشغّلها ToRun أبدًا،response_formatمعjson_object. يُقبلjson_schemaويأتي الرد بتنسيق JSON، لكن المخطط نفسه لا يُفرض،temperature(من 0 إلى 2)، وtop_p(من 0 إلى 1)، وmax_completion_tokensأوmax_tokens، وstop(حتى 4 تسلسلات)، وseed، وreasoning_effort،streamوstream_options.include_usage.
قيمة n أكبر من 1، وlogprobs، وtop_logprobs، والصوت، وأي مخرجات غير النص تُرفض بالرد 400 unsupported_parameter بدلًا من تجاهلها.
الصور
أرسل الصورة مضمّنة، بصيغة data:image/...;base64,... في جزء image_url، حتى 20 ميغابايت لكل طلب. الصورة المرسلة كرابط تُرفض بالرد 400 image_url_not_supported: لا يجلبها ToRun. تخضع الصور لفحص الأمان، كما في التطبيق.
البث
مع "stream": true يصل الرد كأحداث server-sent events بشكل chat.completion.chunk:
- يحمل الجزء الأول الدور
assistant، وتُبث استدعاءات الأدوات معindexالخاص بها. - عندما لا يكون هناك ما يُرسل، يصل سطر تعليق
: keepaliveكل 15 ثانية؛ ويتخطاه محللو SSE. - ينهي
data: [DONE]البث الذي نجح. - مع
stream_options.include_usage، يكون للجزء الأخيرchoicesفارغ ويحملusage. - يصل الفشل بعد بدء البث كحدث واحد
data: {"error": ...}، دون[DONE].
يُوقف الاستدعاء بلا بث بعد 110 ثوانٍ بالرد 504 timeout. أرسل الطلبات الطويلة مع "stream": true.
الاستخدام
يحمل usage القيم prompt_tokens وcompletion_tokens وtotal_tokens وprompt_tokens_details.cached_tokens وcompletion_tokens_details.reasoning_tokens، إضافةً إلى torun_credits: تكلفة الاستدعاء بوحدات Runs.
استخدامها في opencode
يضيف إعداد opencode الموجود في صفحة المطورين ToRun كمزوّد نماذج إلى جانب خادم MCP:
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"torun": {
"npm": "@ai-sdk/openai-compatible",
"name": "ToRun",
"options": { "baseURL": "https://mcp.torun.ai/v1", "apiKey": "{env:TORUN_API_KEY}" },
"models": { "torun/auto": { "name": "ToRun Auto" } }
}
}
}
تعمل أي أداة أخرى تتعامل مع واجهة الدردشة في OpenAI بالطريقة نفسها. يعرض تبويب OpenAI API في الصفحة هذا الاستدعاء:
curl https://mcp.torun.ai/v1/chat/completions \
-H "Authorization: Bearer $TORUN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "torun/auto", "messages": [{"role": "user", "content": "Hello"}]}'
كيف تُدفع الاستدعاءات
تكلّف استدعاءات API عدد Runs نفسه الذي يكلّفه الاستخدام نفسه في التطبيق. لا يدفع ثمنها إلا الرصيد المدفوع: أولًا حصة خطتك المدفوعة، ثم محفظتك إذا سمحت بذلك في المفتاح. الحصة المجانية لا تدفع أبدًا ثمن استدعاءات API. تنطبق حدود المفتاح الشهرية واليومية، وتخضع الردود لفحص الأمان مثل ردود الدردشة.
الحدود
يستطيع كل مفتاح إرسال 60 طلبًا في الدقيقة إلى هذه الواجهة وتشغيل 4 عمليات completions في الوقت نفسه. وفوق ذلك تردّ الواجهة بـ 429 rate_limit_exceeded مع ترويسة Retry-After.
الأخطاء
لكل خطأ الشكل {"error": {"message": ..., "type": ..., "param": ..., "code": ...}}. تأتي message باللغة التي تطلبها ترويسة Accept-Language في الطلب.
| الحالة | الرمز | المعنى |
|---|---|---|
| 400 | invalid_json, missing_parameter, invalid_parameter, unsupported_parameter |
الطلب غير صحيح، أو يستخدم معاملًا لا يدعمه ToRun. |
| 400 | image_url_not_supported |
أُرسلت صورة كرابط؛ أرسلها مضمّنة. |
| 400 | content_blocked |
حظر فحص الأمان المحتوى. |
| 400 | upstream_rejected |
رفض مزوّد النموذج الطلب؛ وتذكر الرسالة السبب. |
| 401 | invalid_api_key |
المفتاح مفقود أو مكتوب خطأً أو ملغى. |
| 402 | insufficient_credits, wallet_spend_not_allowed, spending_cap_reached |
لا يستطيع الحساب أو المفتاح دفع ثمن الاستدعاء. |
| 403 | insufficient_scope |
أُنشئ المفتاح قبل إضافة هذه الواجهة؛ أنشئ مفتاحًا جديدًا. |
| 403 | model_not_available |
النموذج غير متاح في خطتك. |
| 403 | account_suspended, no_developer_access |
الحساب موقوف، أو ليس لديه وصول المطورين. |
| 404 | model_not_found |
معرّف النموذج ليس من النماذج التي يعرضها GET /v1/models. |
| 404 | not_found |
لا يوجد مسار كهذا تحت /v1. |
| 429 | rate_limit_exceeded |
استدعاءات كثيرة جدًا؛ انتظر المدة المذكورة في Retry-After. |
| 500 | internal_error |
حدث خطأ من جهة ToRun. |
| 502 | upstream_error, empty_reply |
فشل مزوّد النموذج، أو أرسل ردًا فارغًا. |
| 503 | upstream_error, cap_unreadable, scan_unavailable |
خدمة يحتاجها الاستدعاء غير متاحة مؤقتًا؛ حاول مرة أخرى. |
| 504 | timeout |
تجاوز الاستدعاء بلا بث مدة 110 ثوانٍ. |
الطلب الذي لا يمكن دفع ثمنه يتلقى الرد 402، وليس 429، حتى لا يواصل العميل إعادة محاولته.