POST /v1/chat/completions- المنفذ نفسه مثل Gateway (تعدد إرسال WS + HTTP):
http://<gateway-host>:<port>/v1/chat/completions
GET /v1/modelsGET /v1/models/{id}POST /v1/embeddingsPOST /v1/responses
openclaw agent)، لذلك تتطابق التوجيهات/الأذونات/الإعدادات مع Gateway لديك.
المصادقة
تستخدم إعدادات مصادقة Gateway. مسارات مصادقة HTTP الشائعة:- مصادقة السر المشترك (
gateway.auth.mode="token"أو"password"):Authorization: Bearer <token-or-password> - مصادقة HTTP الموثوقة الحاملة للهوية (
gateway.auth.mode="trusted-proxy"): وجّه عبر الوكيل المهيأ والواعي بالهوية ودعه يحقن ترويسات الهوية المطلوبة - مصادقة مفتوحة لدخول خاص (
gateway.auth.mode="none"): لا يلزم وجود ترويسة مصادقة
- عند استخدام
gateway.auth.mode="token"، استخدمgateway.auth.token(أوOPENCLAW_GATEWAY_TOKEN). - عند استخدام
gateway.auth.mode="password"، استخدمgateway.auth.password(أوOPENCLAW_GATEWAY_PASSWORD). - عند استخدام
gateway.auth.mode="trusted-proxy"، يجب أن يأتي طلب HTTP من مصدر وكيل موثوق مهيأ؛ وتتطلب وكلاء local loopback على المضيف نفسه ضبطًا صريحًا:gateway.auth.trustedProxy.allowLoopback = true. - يمكن للمتصلين الداخليين على المضيف نفسه الذين يتجاوزون الوكيل استخدام
gateway.auth.password/OPENCLAW_GATEWAY_PASSWORDكخيار رجوع محلي مباشر. أي دليل في ترويسةForwardedأوX-Forwarded-*أوX-Real-IPيُبقي الطلب على مسار الوكيل الموثوق بدلًا من ذلك. - إذا كانت
gateway.auth.rateLimitمهيأة وحدث عدد كبير جدًا من إخفاقات المصادقة، فترجع نقطة النهاية429معRetry-After.
حد الأمان (مهم)
تعامل مع نقطة النهاية هذه كسطح وصول كامل للمشغّل لمثيل Gateway.- مصادقة HTTP bearer هنا ليست نموذج نطاق ضيق لكل مستخدم.
- يجب التعامل مع رمز/كلمة مرور Gateway صالحة لنقطة النهاية هذه كاعتماد مالك/مشغّل.
- تمر الطلبات عبر مسار وكيل مستوى التحكم نفسه مثل إجراءات المشغّل الموثوق.
- لا يوجد حد أدوات منفصل لغير المالك/لكل مستخدم على نقطة النهاية هذه؛ بمجرد أن يجتاز المتصل مصادقة Gateway هنا، يعامل OpenClaw ذلك المتصل كمشغّل موثوق لهذا Gateway.
- في أوضاع مصادقة السر المشترك (
tokenوpassword)، تستعيد نقطة النهاية الإعدادات الافتراضية الكاملة العادية للمشغّل حتى لو أرسل المتصل ترويسةx-openclaw-scopesأضيق. - تحترم أوضاع HTTP الحاملة لهوية موثوقة (مثل مصادقة الوكيل الموثوق أو
gateway.auth.mode="none") ترويسةx-openclaw-scopesعند وجودها، وإلا فتعود إلى مجموعة النطاقات الافتراضية العادية للمشغّل. - إذا كانت سياسة الوكيل الهدف تسمح بأدوات حساسة، يمكن لنقطة النهاية هذه استخدامها.
- أبقِ نقطة النهاية هذه على loopback/tailnet/دخول خاص فقط؛ لا تعرضها مباشرة للإنترنت العام.
gateway.auth.mode="token"أو"password"+Authorization: Bearer ...- يثبت امتلاك سر مشغّل Gateway المشترك
- يتجاهل
x-openclaw-scopesالأضيق - يستعيد مجموعة نطاقات المشغّل الافتراضية الكاملة:
operator.admin,operator.approvals,operator.pairing,operator.read,operator.talk.secrets,operator.write - يعامل أدوار الدردشة على نقطة النهاية هذه كأدوار مرسلة من المالك
- أوضاع HTTP الحاملة لهوية موثوقة (مثل مصادقة الوكيل الموثوق، أو
gateway.auth.mode="none"على دخول خاص)- تصادق هوية موثوقة خارجية أو حد نشر ما
- تحترم
x-openclaw-scopesعند وجود الترويسة - تعود إلى مجموعة نطاقات المشغّل الافتراضية العادية عند غياب الترويسة
- تفقد دلالات المالك فقط عندما يضيّق المتصل النطاقات صراحة ويحذف
operator.admin - تتطلب
operator.adminلعناصر تحكم الطلب على مستوى المالك مثلx-openclaw-model
متى تستخدم نقطة النهاية هذه
استخدم/v1/chat/completions عندما تدمج أدوات أو خلفية تطبيق موثوقة مع Gateway موجود ويمكنها الاحتفاظ باعتمادات مشغّل Gateway بأمان.
- فضّل هذا بدلًا من إضافة قناة مدمجة جديدة عندما يكون التكامل مجرد سطح مشغّل/عميل آخر لـ Gateway نفسه.
- بالنسبة لعملاء الهواتف المحمولة الأصليين الذين يتصلون مباشرة بـ Gateway بعيد، فضّل WebChat أو بروتوكول Gateway، ونفّذ تدفق تمهيد الجهاز المقترن/رمز الجهاز حتى لا يحتاج الجهاز إلى رمز/كلمة مرور HTTP مشتركة.
- ابنِ Plugin قناة بدلًا من ذلك عندما تدمج شبكة مراسلة خارجية لها مستخدموها أو غرفها أو تسليم Webhook أو نقل صادر خاص بها. راجع بناء Plugins.
عقد نموذج يضع الوكيل أولًا
يعامل OpenClaw حقل OpenAImodel كـ هدف وكيل، وليس كمعرّف نموذج مزود خام.
- يوجّه
model: "openclaw"إلى الوكيل الافتراضي المهيأ. - يوجّه
model: "openclaw/default"أيضًا إلى الوكيل الافتراضي المهيأ. - يوجّه
model: "openclaw/<agentId>"إلى وكيل محدد.
- يتجاوز
x-openclaw-model: <provider/model-or-bare-id>نموذج الخلفية للوكيل المحدد. يمكن لمتصلي bearer بالسر المشترك استخدام هذه الترويسة. يحتاج المتصلون الحاملون للهوية، مثل طلبات الوكيل الموثوق أو الدخول الخاص بلا مصادقة معx-openclaw-scopes، إلىoperator.admin؛ ويتلقى المتصلون ذوو إذن الكتابة فقط403 missing scope: operator.admin. - يبقى
x-openclaw-agent-id: <agentId>مدعومًا كتجاوز توافق. - يتحكم
x-openclaw-session-key: <sessionKey>صراحة في توجيه الجلسة. يجب ألا تستخدم القيمة مساحات أسماء جلسات داخلية محجوزة مثلsubagent:أوcron:أوacp:؛ تُرفض تلك الطلبات مع400 invalid_request_error. - يضبط
x-openclaw-message-channel: <channel>سياق قناة الدخول الاصطناعية للمطالبات والسياسات الواعية بالقناة.
model: "openclaw:<agentId>"model: "agent:<agentId>"
تفعيل نقطة النهاية
اضبطgateway.http.endpoints.chatCompletions.enabled على true:
تعطيل نقطة النهاية
اضبطgateway.http.endpoints.chatCompletions.enabled على false:
سلوك الجلسة
افتراضيًا تكون نقطة النهاية عديمة الحالة لكل طلب (يُنشأ مفتاح جلسة جديد في كل استدعاء). إذا تضمّن الطلب سلسلة OpenAIuser، يشتق Gateway مفتاح جلسة ثابتًا منها، وبذلك يمكن للاستدعاءات المتكررة مشاركة جلسة وكيل.
بالنسبة للتطبيقات المخصصة، فالافتراضي الأكثر أمانًا هو إعادة استخدام قيمة user نفسها لكل سلسلة محادثة. تجنّب معرّفات مستوى الحساب إلا إذا كنت تريد صراحة أن تشارك محادثات أو أجهزة متعددة جلسة OpenClaw واحدة. استخدم x-openclaw-session-key فقط عندما تحتاج إلى تحكم صريح في التوجيه عبر عدة عملاء أو سلاسل، واختر مفاتيح مملوكة للتطبيق لا تبدأ بمساحات أسماء داخلية محجوزة مثل subagent: أو cron: أو acp:.
لماذا هذا السطح مهم
هذه أعلى مجموعة توافق ذات أثر للواجهات الأمامية والأدوات المستضافة ذاتيًا:- تتوقع معظم إعدادات Open WebUI وLobeChat وLibreChat وجود
/v1/models. - تتوقع كثير من أنظمة RAG وجود
/v1/embeddings. - يستطيع عملاء دردشة OpenAI الحاليون عادة البدء بـ
/v1/chat/completions. - يفضّل العملاء الأكثر قربًا من الوكلاء بشكل متزايد
/v1/responses.
قائمة النماذج وتوجيه الوكيل
What does `/v1/models` return?
What does `/v1/models` return?
قائمة أهداف وكلاء OpenClaw.المعرّفات المُرجعة هي إدخالات
openclaw وopenclaw/default وopenclaw/<agentId>.
استخدمها مباشرة كقيم OpenAI model.Does `/v1/models` list agents or sub-agents?
Does `/v1/models` list agents or sub-agents?
يسرد أهداف الوكلاء على المستوى الأعلى، وليس نماذج مزودي الخلفية ولا الوكلاء الفرعيين.تبقى الوكلاء الفرعيون ضمن طوبولوجيا التنفيذ الداخلية. ولا تظهر كنماذج صورية.
Why is `openclaw/default` included?
Why is `openclaw/default` included?
openclaw/default هو الاسم المستعار الثابت للوكيل الافتراضي المهيأ.يعني ذلك أن العملاء يمكنهم الاستمرار في استخدام معرّف واحد يمكن التنبؤ به حتى إذا تغيّر معرّف الوكيل الافتراضي الحقيقي بين البيئات.How do I override the backend model?
How do I override the backend model?
استخدم
x-openclaw-model. هذا تجاوز على مستوى المالك: يعمل مع مسار رمز/كلمة مرور bearer بالسر المشترك لـ Gateway، ويتطلب operator.admin على مسارات HTTP الحاملة للهوية مثل مصادقة الوكيل الموثوق.أمثلة:
x-openclaw-model: openai/gpt-5.4
x-openclaw-model: gpt-5.5إذا حذفته، يعمل الوكيل المحدد بخيار النموذج العادي المهيأ له.How do embeddings fit this contract?
How do embeddings fit this contract?
يستخدم
/v1/embeddings معرّفات model نفسها لأهداف الوكلاء.استخدم model: "openclaw/default" أو model: "openclaw/<agentId>".
عندما تحتاج إلى نموذج تضمين محدد، أرسله في x-openclaw-model من متصل بالسر المشترك أو متصل حامل للهوية مع operator.admin.
بدون تلك الترويسة، يمر الطلب إلى إعداد التضمين العادي للوكيل المحدد.البث (SSE)
اضبطstream: true لتلقي الأحداث المرسلة من الخادم (SSE):
Content-Type: text/event-stream- كل سطر حدث هو
data: <json> - ينتهي البث بـ
data: [DONE]
عقد أدوات الدردشة
يدعم/v1/chat/completions مجموعة فرعية من أدوات الدوال متوافقة مع عملاء دردشة OpenAI الشائعين.
حقول الطلب المدعومة
tools: مصفوفة من{ "type": "function", "function": { ... } }tool_choice:"auto"أو"none"أو"required"أو{ "type": "function", "function": { "name": "..." } }- أدوار متابعة
messages[*].role: "tool" messages[*].tool_call_idلربط نتائج الأدوات باستدعاء أداة سابقmax_completion_tokens: رقم؛ حد لكل استدعاء لإجمالي رموز الإكمال (بما في ذلك رموز الاستدلال). اسم حقل OpenAI Chat Completions الحالي؛ وهو المفضل عند إرسال كل منmax_completion_tokensوmax_tokens.max_tokens: رقم؛ اسم مستعار قديم مقبول للتوافق مع الإصدارات السابقة. يتم تجاهله عند وجودmax_completion_tokensأيضًا.temperature: رقم؛ درجة حرارة أخذ عينات بأفضل جهد تُمرر إلى المزود العلوي عبر قناة معاملات بث الوكيل.top_p: رقم؛ أخذ عينات نووية بأفضل جهد يُمرر إلى المزود العلوي عبر قناة معاملات بث الوكيل.frequency_penalty: رقم؛ عقوبة تكرار بأفضل جهد تُمرر إلى المزود العلوي عبر قناة معاملات بث الوكيل. النطاق المتحقق منه: -2.0 إلى 2.0. ترجع400 invalid_request_errorللقيم خارج النطاق.presence_penalty: رقم؛ عقوبة حضور بأفضل جهد تُمرر إلى المزود العلوي عبر قناة معاملات بث الوكيل. النطاق المتحقق منه: -2.0 إلى 2.0. ترجع400 invalid_request_errorللقيم خارج النطاق.seed: رقم (عدد صحيح)؛ بذرة بأفضل جهد تُمرر إلى المزود العلوي عبر قناة معاملات بث الوكيل. ترجع400 invalid_request_errorللقيم غير الصحيحة.stop: سلسلة أو مصفوفة تصل إلى 4 سلاسل؛ تسلسلات إيقاف بأفضل جهد تُمرر إلى المزود العلوي عبر قناة معاملات بث الوكيل. ترجع400 invalid_request_errorلأكثر من 4 تسلسلات أو لإدخالات غير نصية/فارغة.
max_completion_tokens لنقاط نهاية عائلة OpenAI، وmax_tokens للمزوّدين الذين لا يقبلون إلا الاسم القديم (مثل Mistral وChutes). تتبع حقول أخذ العينات (temperature، top_p، frequency_penalty، presence_penalty، seed) قناة معلمات البث نفسها؛ أما واجهة Codex Responses الخلفية المستندة إلى ChatGPT فتزيلها من جهة الخادم لأنها تستخدم أخذ عينات ثابتًا. ينتقل stop أيضًا عبر قناة معلمات البث ويُطابق حقل الإيقاف في النقل (stop لواجهات Chat Completions الخلفية، وstop_sequences لـ Anthropic)؛ ولا تحتوي OpenAI Responses API على معلمة إيقاف، لذلك لا يُطبَّق stop على النماذج المدعومة بواجهة Responses.
المتغيرات غير المدعومة
تعيد نقطة النهاية400 invalid_request_error للمتغيرات غير المدعومة للأدوات، بما في ذلك:
toolsغير المصفوفية- إدخالات أدوات ليست دوال
- غياب
tool.function.name - متغيرات
tool_choiceمثلallowed_toolsوcustom - قيم
tool_choice.function.nameالتي لا تطابقtoolsالمقدمة
tool_choice: "required" وtool_choice المثبتة على دالة، تضيّق نقطة النهاية مجموعة أدوات الدوال العميلة المكشوفة، وتوجّه وقت التشغيل إلى استدعاء أداة عميل قبل الاستجابة، وتعيد خطأ إذا لم تتضمن استجابة الوكيل استدعاء أداة عميل منظمًا مطابقًا. ينطبق هذا العقد على قائمة HTTP tools المقدمة من المستدعي، وليس على كل أداة وكيل داخلية في OpenClaw.
شكل استجابة الأدوات غير المتدفقة
عندما يقرر الوكيل استدعاء الأدوات، تستخدم الاستجابة:- إدخالات
choices[0].finish_reason = "tool_calls" choices[0].message.tool_calls[]مع:idtype: "function"function.namefunction.arguments(سلسلة JSON)
choices[0].message.content (وقد تكون فارغة).
شكل استجابة الأدوات المتدفقة
عندما تكونstream: true، تُصدَر استدعاءات الأدوات على هيئة أجزاء SSE تزايدية:
- دلتا أولية لدور المساعد
- دلتا اختيارية لتعليقات المساعد
- جزء واحد أو أكثر من
delta.tool_callsيحمل هوية الأداة وأجزاء الوسائط - جزء نهائي مع
finish_reason: "tool_calls" data: [DONE]
stream_options.include_usage=true، يُصدر جزء استخدام لاحق قبل [DONE].
حلقة متابعة الأدوات
بعد تلقيtool_calls، ينبغي للعميل تنفيذ الدالة أو الدوال المطلوبة وإرسال طلب متابعة يتضمن:
- رسالة استدعاء الأداة السابقة من المساعد
- رسالة واحدة أو أكثر بدور
role: "tool"معtool_call_idمطابق
إعداد Open WebUI سريع
لاتصال Open WebUI أساسي:- عنوان URL الأساسي:
http://127.0.0.1:18789/v1 - عنوان URL الأساسي لـ Docker على macOS:
http://host.docker.internal:18789/v1 - مفتاح API: رمز bearer الخاص بـ Gateway لديك
- النموذج:
openclaw/default
- يجب أن يسرد
GET /v1/modelsالقيمةopenclaw/default - يجب أن يستخدم Open WebUI القيمة
openclaw/defaultكمعرّف نموذج الدردشة - إذا أردت مزوّدًا/نموذجًا خلفيًا محددًا لذلك الوكيل، فاضبط النموذج الافتراضي العادي للوكيل أو أرسل
x-openclaw-modelمن مستدعٍ ذي سر مشترك أو مستدعٍ يحمل هوية معoperator.admin
openclaw/default، فيمكن لمعظم إعدادات Open WebUI الاتصال باستخدام عنوان URL الأساسي والرمز نفسيهما.
أمثلة
جلسة مستقرة لمحادثة تطبيق واحدة:user نفسها في الاستدعاءات اللاحقة لتلك المحادثة لمتابعة جلسة الوكيل نفسها.
غير متدفق:
- يعيد
/v1/modelsأهداف وكلاء OpenClaw، وليس كتالوجات المزوّد الخام. - يكون
openclaw/defaultحاضرًا دائمًا بحيث يعمل معرّف ثابت واحد عبر البيئات. - تنتمي تجاوزات المزوّد/النموذج الخلفية إلى
x-openclaw-model، وليس إلى حقل OpenAImodel. في مسارات مصادقة HTTP الحاملة للهوية، يتطلب هذا الرأسoperator.admin. - يدعم
/v1/embeddingsقيمةinputكسلسلة أو مصفوفة سلاسل.