الوكلاء الفرعيون
الوكلاء الفرعيون هم تشغيلات وكلاء في الخلفية يتم إنشاؤها من تشغيل وكيل موجود. تعمل في جلستها الخاصة (agent:<agentId>:subagent:<uuid>) وعند الانتهاء، تعلن نتيجتها مرة أخرى إلى قناة دردشة الطالب. يُتتبَّع كل تشغيل وكيل فرعي باعتباره مهمة في الخلفية.
أمر الشرطة المائلة
استخدم/subagents لفحص تشغيلات الوكلاء الفرعيين أو التحكم فيها للجلسة الحالية:
/subagents list/subagents kill <id|#|all>/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents send <id|#> <message>/subagents steer <id|#> <message>/subagents spawn <agentId> <task> [--model <model>] [--thinking <level>]
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>
/subagents info بيانات وصفية للتشغيل (الحالة، والطوابع الزمنية، ومعرّف الجلسة، ومسار النص الحواري، والتنظيف).
استخدم sessions_history للحصول على عرض استرجاع محدود ومصفّى أمنيًا؛ وافحص
مسار النص الحواري على القرص عندما تحتاج إلى النص الحواري الخام الكامل.
سلوك الإنشاء
يبدأ/subagents spawn وكيلًا فرعيًا في الخلفية كأمر مستخدم، وليس كترحيل داخلي، ويرسل تحديث إكمال نهائيًا واحدًا مرة أخرى إلى دردشة الطالب عند انتهاء التشغيل.
- أمر الإنشاء غير حاجب؛ إذ يعيد معرّف تشغيل فورًا.
- عند الإكمال، يعلن الوكيل الفرعي رسالة ملخص/نتيجة مرة أخرى إلى قناة دردشة الطالب.
- يكون تسليم الإكمال قائمًا على الدفع. بعد الإنشاء، لا تجرِ استقصاءً لـ
/subagents listأوsessions_listأوsessions_historyفي حلقة لمجرد انتظار انتهائه؛ افحص الحالة عند الطلب فقط من أجل التصحيح أو التدخل. - عند الإكمال، يغلق OpenClaw بأفضل جهد علامات تبويب/عمليات المتصفح المتتبعة التي فتحها ذلك الوكيل الفرعي قبل متابعة تدفق تنظيف الإعلان.
- بالنسبة إلى الإنشاءات اليدوية، يكون التسليم مرنًا:
- يحاول OpenClaw أولًا التسليم المباشر عبر
agentباستخدام مفتاح idempotency ثابت. - إذا فشل التسليم المباشر، فإنه يعود إلى توجيه الطابور.
- إذا لم يكن توجيه الطابور متاحًا أيضًا، تُعاد محاولة الإعلان مع تراجع أسي قصير قبل التخلي النهائي.
- يحاول OpenClaw أولًا التسليم المباشر عبر
- يحتفظ تسليم الإكمال بمسار الطالب الذي تم حله:
- تفوز مسارات الإكمال المرتبطة بالخيط أو المحادثة عند توفرها
- إذا كان أصل الإكمال يوفر قناة فقط، يملأ OpenClaw الهدف/الحساب المفقودين من المسار المحلول لجلسة الطالب (
lastChannel/lastTo/lastAccountId) بحيث يستمر التسليم المباشر في العمل
- إن التسليم إلى جلسة الطالب عند الإكمال هو سياق داخلي مولَّد وقت التشغيل (وليس نصًا من تأليف المستخدم) ويتضمن:
Result(أحدث نص ردassistantظاهر، وإلا أحدث نص مُنقّى لـ tool/toolResult)Status(completed successfully/failed/timed out/unknown)- إحصاءات وقت تشغيل/رموز مدمجة
- تعليمة تسليم تخبر وكيل الطالب بإعادة الصياغة بصوت المساعد المعتاد (وليس تمرير البيانات الوصفية الداخلية الخام)
- تتجاوز
--modelو--thinkingالقيم الافتراضية لذلك التشغيل المحدد. - استخدم
info/logلفحص التفاصيل والمخرجات بعد الإكمال. - يعمل
/subagents spawnفي وضع اللقطة الواحدة (mode: "run"). أما جلسات الارتباط الدائم بالخيط، فاستخدمsessions_spawnمعthread: trueوmode: "session". - بالنسبة إلى جلسات ACP harness (Codex وClaude Code وGemini CLI)، استخدم
sessions_spawnمعruntime: "acp"وراجع وكلاء ACP.
- موازاة أعمال “البحث / المهمة الطويلة / الأداة البطيئة” دون حجب التشغيل الرئيسي.
- إبقاء الوكلاء الفرعيين معزولين افتراضيًا (فصل الجلسات + العزل الاختياري).
- إبقاء سطح الأدوات صعب الإساءة: لا تحصل الوكلاء الفرعيون على أدوات الجلسات افتراضيًا.
- دعم عمق تعشيش قابل للضبط لأنماط المنسّق.
agents.defaults.subagents.model أو عبر تجاوزات لكل وكيل.
الأداة
استخدمsessions_spawn:
- يبدأ تشغيل وكيل فرعي (
deliver: false، المسار العام:subagent) - ثم يشغّل خطوة إعلان وينشر رد الإعلان إلى قناة دردشة الطالب
- النموذج الافتراضي: يرث من المستدعي إلا إذا عيّنت
agents.defaults.subagents.model(أوagents.list[].subagents.modelلكل وكيل)؛ وتظلsessions_spawn.modelالصريحة لها الأولوية. - التفكير الافتراضي: يرث من المستدعي إلا إذا عيّنت
agents.defaults.subagents.thinking(أوagents.list[].subagents.thinkingلكل وكيل)؛ وتظلsessions_spawn.thinkingالصريحة لها الأولوية. - المهلة الافتراضية للتشغيل: إذا تم حذف
sessions_spawn.runTimeoutSeconds، يستخدم OpenClaw القيمةagents.defaults.subagents.runTimeoutSecondsعند تعيينها؛ وإلا يعود إلى0(من دون مهلة).
task(مطلوب)label?(اختياري)agentId?(اختياري؛ الإنشاء تحت معرّف وكيل آخر إذا كان مسموحًا)model?(اختياري؛ يتجاوز نموذج الوكيل الفرعي؛ يتم تخطي القيم غير الصالحة ويعمل الوكيل الفرعي على النموذج الافتراضي مع تحذير في نتيجة الأداة)thinking?(اختياري؛ يتجاوز مستوى التفكير لتشغيل الوكيل الفرعي)runTimeoutSeconds?(القيمة الافتراضية هيagents.defaults.subagents.runTimeoutSecondsعند تعيينها، وإلا0؛ وعند التعيين، يُجهض تشغيل الوكيل الفرعي بعد N ثانية)thread?(الافتراضيfalse؛ وعندtrueيطلب ربط خيط القناة لهذه الجلسة الفرعية)mode?(run|session)- الافتراضي هو
run - إذا كانت
thread: trueوتم حذفmode، تصبح القيمة الافتراضيةsession - يتطلب
mode: "session"القيمةthread: true
- الافتراضي هو
cleanup?(delete|keep، الافتراضيkeep)sandbox?(inherit|require، الافتراضيinherit؛ وترفضrequireالإنشاء ما لم يكن وقت تشغيل الطفل الهدف معزولًا)- لا يقبل
sessions_spawnمعلمات تسليم القنوات (target،channel،to،threadId،replyTo،transport). بالنسبة إلى التسليم، استخدمmessage/sessions_sendمن التشغيل المُنشأ.
الجلسات المرتبطة بالخيوط
عندما تكون روابط الخيوط مفعلة لقناة ما، يمكن للوكيل الفرعي أن يظل مرتبطًا بخيط بحيث تستمر رسائل المستخدم اللاحقة في ذلك الخيط في التوجيه إلى الجلسة نفسها.القنوات الداعمة للخيوط
- Discord (وهي حاليًا القناة الوحيدة المدعومة): تدعم جلسات وكلاء فرعيين ثابتة مرتبطة بالخيط (
sessions_spawnمعthread: true)، وعناصر تحكم يدوية بالخيوط (/focusو/unfocusو/agentsو/session idleو/session max-age)، ومفاتيح المهايئchannels.discord.threadBindings.enabledوchannels.discord.threadBindings.idleHoursوchannels.discord.threadBindings.maxAgeHoursوchannels.discord.threadBindings.spawnSubagentSessions.
- أنشئ باستخدام
sessions_spawnمعthread: true(واختياريًاmode: "session"). - ينشئ OpenClaw خيطًا أو يربطه بهدف تلك الجلسة في القناة النشطة.
- تُوجَّه الردود ورسائل المتابعة في ذلك الخيط إلى الجلسة المرتبطة.
- استخدم
/session idleلفحص/تحديث إلغاء التركيز التلقائي عند عدم النشاط واستخدم/session max-ageللتحكم في الحد الصلب. - استخدم
/unfocusلفك الارتباط يدويًا.
- يربط
/focus <target>الخيط الحالي (أو ينشئ واحدًا) بهدف وكيل فرعي/جلسة. - يزيل
/unfocusالربط للخيط المرتبط الحالي. - يسرد
/agentsالتشغيلات النشطة وحالة الربط (thread:<id>أوunbound). - يعمل
/session idleو/session max-ageفقط للخيوط المركّزة المرتبطة.
- الافتراضي العام:
session.threadBindings.enabledوsession.threadBindings.idleHoursوsession.threadBindings.maxAgeHours - يكون تجاوز القناة ومفاتيح الربط التلقائي عند الإنشاء خاصة بالمهايئ. راجع القنوات الداعمة للخيوط أعلاه.
agents.list[].subagents.allowAgents: قائمة بمعرّفات الوكلاء التي يمكن استهدافها عبرagentId(["*"]للسماح بأي منها). الافتراضي: وكيل الطالب فقط.agents.defaults.subagents.allowAgents: قائمة السماح الافتراضية لوكيل الهدف والمستخدمة عندما لا يعيّن وكيل الطالبsubagents.allowAgentsالخاص به.- حارس وراثة العزل: إذا كانت جلسة الطالب معزولة، يرفض
sessions_spawnالأهداف التي ستعمل من دون عزل. agents.defaults.subagents.requireAgentId/agents.list[].subagents.requireAgentId: عندtrue، تُحظر استدعاءاتsessions_spawnالتي تحذفagentId(لفرض اختيار ملف تعريف صريح). الافتراضي: false.
- استخدم
agents_listلمعرفة معرّفات الوكلاء المسموح بها حاليًا لـsessions_spawn.
- تُؤرشف جلسات الوكلاء الفرعيين تلقائيًا بعد
agents.defaults.subagents.archiveAfterMinutes(الافتراضي: 60). - تستخدم الأرشفة
sessions.deleteوتعيد تسمية النص الحواري إلى*.deleted.<timestamp>(في المجلد نفسه). - يؤدي
cleanup: "delete"إلى الأرشفة فورًا بعد الإعلان (مع الإبقاء على النص الحواري عبر إعادة التسمية). - الأرشفة التلقائية تتم بأفضل جهد؛ وتُفقد المؤقتات المعلّقة إذا أُعيد تشغيل البوابة.
- لا تؤدي
runTimeoutSecondsإلى الأرشفة التلقائية؛ فهي توقف التشغيل فقط. وتبقى الجلسة حتى الأرشفة التلقائية. - تنطبق الأرشفة التلقائية بالتساوي على الجلسات ذات العمق 1 و2.
- تنظيف المتصفح منفصل عن تنظيف الأرشفة: تُغلق علامات التبويب/العمليات المتتبعة بأفضل جهد عند انتهاء التشغيل، حتى إذا تم الاحتفاظ بسجل النص الحواري/الجلسة.
الوكلاء الفرعيون المتداخلون
افتراضيًا، لا يمكن للوكلاء الفرعيين إنشاء وكلاء فرعيين خاصين بهم (maxSpawnDepth: 1). يمكنك تمكين مستوى واحد من التداخل بتعيين maxSpawnDepth: 2، مما يسمح بنمط المنسّق: الرئيسي ← وكيل فرعي منسّق ← وكلاء فرعيون فرعيون عاملون.
كيفية التمكين
مستويات العمق
| Depth | Session key shape | Role | Can spawn? |
|---|---|---|---|
| 0 | agent:<id>:main | الوكيل الرئيسي | دائمًا |
| 1 | agent:<id>:subagent:<uuid> | وكيل فرعي (منسّق عند السماح بالعمق 2) | فقط إذا كانت maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> | وكيل فرعي فرعي (عامل طرفي) | أبدًا |
سلسلة الإعلان
تتدفق النتائج صعودًا عبر السلسلة:- ينتهي العامل ذو العمق 2 ← ويعلن إلى الأصل ذي العمق 1 (المنسّق)
- يتلقى المنسّق ذو العمق 1 الإعلان، ويولّف النتائج، وينتهي ← ثم يعلن إلى الرئيسي
- يتلقى الوكيل الرئيسي الإعلان ويسلّمه إلى المستخدم
- ابدأ عمل الطفل مرة واحدة وانتظر أحداث الإكمال بدلًا من بناء حلقات استقصاء
حول
sessions_listأوsessions_historyأو/subagents listأو أوامرexecمع sleep. - إذا وصل حدث إكمال طفل بعد أن أرسلت الإجابة النهائية بالفعل،
فالمتابعة الصحيحة هي الرمز الصامت الدقيق
NO_REPLY/no_reply.
سياسة الأدوات حسب العمق
- يُكتب الدور ونطاق التحكم في بيانات الجلسة الوصفية وقت الإنشاء. وهذا يمنع مفاتيح الجلسات المسطحة أو المستعادة من استعادة امتيازات المنسّق عن طريق الخطأ.
- العمق 1 (منسّق، عند
maxSpawnDepth >= 2): يحصل علىsessions_spawnوsubagentsوsessions_listوsessions_historyحتى يتمكن من إدارة أطفاله. وتظل أدوات الجلسة/النظام الأخرى مرفوضة. - العمق 1 (طرفي، عند
maxSpawnDepth == 1): لا توجد أدوات جلسات (السلوك الافتراضي الحالي). - العمق 2 (عامل طرفي): لا توجد أدوات جلسات — ويُرفض
sessions_spawnدائمًا عند العمق 2. ولا يمكنه إنشاء أطفال إضافيين.
حد الإنشاء لكل وكيل
يمكن أن تحتوي كل جلسة وكيل (في أي عمق) علىmaxChildrenPerAgent (الافتراضي: 5) طفلًا نشطًا كحد أقصى في الوقت نفسه. يمنع ذلك التفرع المنفلت من منسّق واحد.
الإيقاف المتسلسل
يؤدي إيقاف منسّق ذي عمق 1 تلقائيًا إلى إيقاف جميع أطفاله ذوي العمق 2:- يؤدي
/stopفي الدردشة الرئيسية إلى إيقاف جميع الوكلاء ذوي العمق 1 وينتقل ذلك تسلسليًا إلى أطفالهم ذوي العمق 2. - يؤدي
/subagents kill <id>إلى إيقاف وكيل فرعي محدد وينتقل ذلك تسلسليًا إلى أطفاله. - يؤدي
/subagents kill allإلى إيقاف جميع الوكلاء الفرعيين للطالب وينتقل ذلك تسلسليًا.
المصادقة
تُحل مصادقة الوكيل الفرعي بواسطة معرّف الوكيل، وليس بواسطة نوع الجلسة:- مفتاح جلسة الوكيل الفرعي هو
agent:<agentId>:subagent:<uuid>. - يُحمَّل مخزن المصادقة من
agentDirالخاص بذلك الوكيل. - تُدمج ملفات تعريف مصادقة الوكيل الرئيسي باعتبارها احتياطيًا؛ وتتجاوز ملفات تعريف الوكيل ملفات تعريف الرئيسي عند التعارض.
الإعلان
يبلّغ الوكلاء الفرعيون مرة أخرى عبر خطوة إعلان:- تعمل خطوة الإعلان داخل جلسة الوكيل الفرعي (وليس جلسة الطالب).
- إذا رد الوكيل الفرعي بالنص الدقيق
ANNOUNCE_SKIP، فلن يُنشر شيء. - إذا كان أحدث نص مساعد هو الرمز الصامت الدقيق
NO_REPLY/no_reply، فسيتم كتم مخرجات الإعلان حتى إذا وُجد تقدم ظاهر سابق. - بخلاف ذلك يعتمد التسليم على عمق الطالب:
- تستخدم جلسات الطالب ذات المستوى الأعلى استدعاء
agentلاحقًا مع تسليم خارجي (deliver=true) - تتلقى جلسات الوكلاء الفرعيين المتداخلة للطالب حقن متابعة داخليًا (
deliver=false) حتى يتمكن المنسّق من توليف نتائج الأطفال داخل الجلسة - إذا اختفت جلسة وكيل فرعي متداخلة للطالب، يعود OpenClaw إلى طالب تلك الجلسة عند توفره
- تستخدم جلسات الطالب ذات المستوى الأعلى استدعاء
- بالنسبة إلى جلسات الطالب ذات المستوى الأعلى، يحل التسليم المباشر في وضع الإكمال أولًا أي مسار محادثة/خيط مرتبط وأي تجاوز hook، ثم يملأ حقول هدف القناة المفقودة من المسار المخزن لجلسة الطالب. وهذا يُبقي عمليات الإكمال على الدردشة/الموضوع الصحيحين حتى عندما لا يحدد أصل الإكمال سوى القناة.
- يقتصر تجميع إكمالات الأطفال على تشغيل الطالب الحالي عند بناء نتائج الإكمال المتداخلة، مما يمنع تسرب مخرجات أطفال قديمة من تشغيل سابق إلى الإعلان الحالي.
- تحافظ ردود الإعلان على توجيه الخيط/الموضوع عند توفره في مهايئات القنوات.
- يُطبَّع سياق الإعلان إلى كتلة أحداث داخلية مستقرة:
- المصدر (
subagentأوcron) - مفتاح/معرّف جلسة الطفل
- نوع الإعلان + تسمية المهمة
- سطر حالة مشتق من ناتج وقت التشغيل (
successأوerrorأوtimeoutأوunknown) - محتوى النتيجة المختار من أحدث نص مساعد ظاهر، وإلا أحدث نص مُنقّى لـ tool/toolResult
- تعليمة متابعة تصف متى يجب الرد ومتى يجب البقاء صامتًا
- المصدر (
- لا يُستنتج
Statusمن مخرجات النموذج؛ بل يأتي من إشارات ناتج وقت التشغيل. - عند انتهاء المهلة، إذا لم يحصل الطفل إلا على استدعاءات أدوات، يمكن للإعلان أن يختزل ذلك السجل إلى ملخص قصير للتقدم الجزئي بدلًا من إعادة تشغيل مخرجات الأدوات الخام.
- وقت التشغيل (مثل
runtime 5m12s) - استخدام الرموز (الإدخال/الإخراج/الإجمالي)
- التكلفة المقدّرة عند ضبط تسعير النموذج (
models.providers.*.models[].cost) sessionKeyوsessionIdومسار النص الحواري (حتى يتمكن الوكيل الرئيسي من جلب السجل عبرsessions_historyأو فحص الملف على القرص)- البيانات الوصفية الداخلية مخصصة للتنسيق فقط؛ ويجب إعادة كتابة الردود الموجهة للمستخدم بصوت مساعد طبيعي.
sessions_history المسار التنسيقي الأكثر أمانًا:
- يُطبَّع استرجاع المساعد أولًا:
- تُزال وسوم التفكير
- تُزال كتل البنية
<relevant-memories>/<relevant_memories> - تُزال كتل حمولات XML النصية العادية لاستدعاءات الأدوات مثل
<tool_call>...</tool_call>، و<function_call>...</function_call>، و<tool_calls>...</tool_calls>، و<function_calls>...</function_calls>، بما في ذلك الحمولات المقتطعة التي لا تُغلق بشكل صحيح - تُزال بنية استدعاءات/نتائج الأدوات المخفّضة وعلامات السياق التاريخي
- تُزال رموز التحكم بالنموذج المسرّبة مثل
<|assistant|>، وغيرها من رموز ASCII من الشكل<|...|>، والمتغيرات كاملة العرض<|...|> - يُزال XML المشوّه لاستدعاءات أدوات MiniMax
- يُحجب النص الشبيه ببيانات الاعتماد/الرموز
- قد تُقتطع الكتل الطويلة
- قد تُسقط السجلات الكبيرة جدًا الصفوف الأقدم أو تستبدل صفًا كبيرًا جدًا بالقيمة
[sessions_history omitted: message too large] - يكون فحص النص الحواري الخام على القرص هو الاحتياطي عندما تحتاج إلى النص الحواري الكامل بايتًا لبايت
سياسة الأدوات (أدوات الوكلاء الفرعيين)
افتراضيًا، تحصل الوكلاء الفرعيون على كل الأدوات باستثناء أدوات الجلسات وأدوات النظام:sessions_listsessions_historysessions_sendsessions_spawn
sessions_history هنا أيضًا عرض استرجاع محدودًا ومنقحًا؛ وليس
تفريغًا خامًا للنص الحواري.
عندما تكون maxSpawnDepth >= 2، تحصل الوكلاء الفرعيون المنسّقون من العمق 1 بالإضافة إلى sessions_spawn وsubagents وsessions_list وsessions_history حتى يتمكنوا من إدارة أطفالهم.
يمكنك التجاوز عبر الإعدادات:
التزامن
تستخدم الوكلاء الفرعيون مسار طابور مخصصًا داخل العملية:- اسم المسار:
subagent - التزامن:
agents.defaults.subagents.maxConcurrent(الافتراضي8)
الإيقاف
- يؤدي إرسال
/stopفي دردشة الطالب إلى إجهاض جلسة الطالب وإيقاف أي تشغيلات وكلاء فرعيين نشطة تم إنشاؤها منها، مع الانتقال تسلسليًا إلى الأطفال المتداخلين. - يؤدي
/subagents kill <id>إلى إيقاف وكيل فرعي محدد وينتقل ذلك تسلسليًا إلى أطفاله.
القيود
- الإعلان الرجوعي للوكيل الفرعي يتم بأفضل جهد. إذا أُعيد تشغيل البوابة، فستُفقد أعمال “الإعلان رجوعًا” المعلقة.
- لا تزال الوكلاء الفرعيون تشترك في موارد عملية البوابة نفسها؛ فاعتبر
maxConcurrentصمام أمان. - يكون
sessions_spawnدائمًا غير حاجب: إذ يعيد{ status: "accepted", runId, childSessionKey }فورًا. - لا يحقن سياق الوكيل الفرعي إلا
AGENTS.md+TOOLS.md(من دونSOUL.mdأوIDENTITY.mdأوUSER.mdأوHEARTBEAT.mdأوBOOTSTRAP.md). - الحد الأقصى لعمق التداخل هو 5 (
maxSpawnDepthضمن المجال 1–5). ويُوصى بالعمق 2 لمعظم حالات الاستخدام. - يحد
maxChildrenPerAgentمن عدد الأطفال النشطين لكل جلسة (الافتراضي: 5، المجال: 1–20).