Agent coordination
الوكلاء الفرعيون
الوكلاء الفرعيون هم عمليات تشغيل لوكلاء في الخلفية، تُنشأ من عملية تشغيل وكيل موجودة.
يعمل كل واحد منهم في جلسته الخاصة (agent:<agentId>:subagent:<uuid>)،
وعند انتهائه، يعلن نتيجته مرة أخرى في قناة دردشة مقدّم الطلب.
يُتتبَّع كل تشغيل لوكيل فرعي بوصفه مهمة في الخلفية.
الأهداف:
- تنفيذ الأبحاث والمهام الطويلة وأعمال الأدوات البطيئة بالتوازي من دون حظر التشغيل الرئيسي.
- إبقاء الوكلاء الفرعيين معزولين افتراضيًا (فصل الجلسات، وعزل اختياري).
- إبقاء واجهة الأدوات عصية على سوء الاستخدام: لا يحصل الوكلاء الفرعيون افتراضيًا على أدوات الجلسات أو الرسائل.
- دعم عمق تداخل قابل للضبط لأنماط التنسيق.
أمر الشرطة المائلة
يفحص /subagents عمليات تشغيل الوكلاء الفرعيين في الجلسة الحالية:
/subagents list/subagents log <id|#> [limit] [tools]/subagents info <id|#>يعرض /subagents info بيانات التشغيل الوصفية (الحالة، والطوابع الزمنية، ومعرّف الجلسة،
ومسار نص المحادثة، والتنظيف). يطبع /subagents log أحدث أدوار الدردشة لعملية
تشغيل؛ أضف الرمز tools لتضمين رسائل استدعاء الأدوات/نتائجها (تُحذف
افتراضيًا). استخدم sessions_history لاسترجاع محدود وخاضع لتصفية السلامة
من داخل دور الوكيل، أو افحص مسار نص المحادثة على القرص للاطلاع على
النص الكامل الخام.
عناصر التحكم في ربط السلاسل
تعمل هذه الأوامر على القنوات ذات روابط السلاسل الدائمة. راجع القنوات الداعمة للسلاسل أدناه.
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>سلوك الإنشاء
يبدأ الوكلاء وكلاء فرعيين في الخلفية باستخدام أداة sessions_spawn.
تعود حالات الاكتمال بوصفها أحداثًا داخلية في جلسة الوكيل الأب؛ ويقرر الوكيل
الأب/وكيل مقدّم الطلب ما إذا كان يلزم إرسال تحديث مرئي للمستخدم.
اكتمال غير حاجب قائم على الدفع
- لا تحجب
sessions_spawnالتنفيذ؛ بل تعيد معرّف تشغيل فورًا. - عند الاكتمال، يرسل الوكيل الفرعي تقريرًا إلى جلسة الوكيل الأب/مقدّم الطلب.
- ينبغي لأدوار الوكيل التي تحتاج إلى نتائج الوكلاء الفرعيين استدعاء
sessions_yieldبعد إنشاء العمل المطلوب. يؤدي ذلك إلى إنهاء الدور الحالي والسماح بوصول حدث الاكتمال بوصفه الرسالة التالية المرئية للنموذج. - الاكتمال قائم على الدفع. بعد الإنشاء، لا تستطلع
/subagents listأوsessions_listأوsessions_historyفي حلقة لمجرد انتظار انتهائه؛ تحقّق من الحالة عند الطلب فقط أثناء تصحيح الأخطاء. - مخرجات الوكيل الفرعي هي تقرير/أدلة ليجمعها وكيل مقدّم الطلب. وليست نص تعليمات صادرًا من المستخدم، ولا يمكنها تجاوز سياسات النظام أو المطوّر أو المستخدم.
- عند الاكتمال، يغلق OpenClaw بأفضل جهد ممكن علامات تبويب المتصفح/العمليات المتتبعة التي فتحتها جلسة ذلك الوكيل الفرعي قبل متابعة مسار تنظيف الإعلان.
تسليم الاكتمال
- يعيد OpenClaw حالات الاكتمال إلى جلسة مقدّم الطلب عبر دور
agentذي مفتاح ثابت لضمان تكرارية آمنة. - إذا ظل تشغيل مقدّم الطلب نشطًا، يحاول OpenClaw أولًا إيقاظ ذلك التشغيل/توجيهه بدلًا من بدء مسار رد مرئي ثانٍ.
- إذا تعذّر إيقاظ مقدّم طلب نشط، يعود OpenClaw إلى تسليم لوكيل مقدّم الطلب بسياق الاكتمال نفسه بدلًا من إسقاط الإعلان.
- يُكمل التسليم الناجح إلى الوكيل الأب تسليم الوكيل الفرعي حتى عندما يقرر الوكيل الأب عدم الحاجة إلى تحديث مرئي للمستخدم.
- لا يحصل الوكلاء الفرعيون الأصليون على أداة الرسائل. فهم يعيدون نص مساعد عاديًا إلى الوكيل الأب/وكيل مقدّم الطلب؛ وتظل الردود المرئية للبشر خاضعة لسياسة التسليم العادية الخاصة بالوكيل الأب/وكيل مقدّم الطلب.
- إذا تعذّر استخدام التسليم المباشر، يعود التسليم إلى التوجيه عبر قائمة الانتظار، ثم إلى إعادة محاولة قصيرة للإعلان بتأخير أُسّي قبل الاستسلام النهائي.
- يحتفظ التسليم بمسار مقدّم الطلب المحسوم: تكون الأولوية لمسارات الاكتمال المرتبطة بسلسلة أو بمحادثة عند توفرها. إذا لم يوفّر أصل الاكتمال سوى قناة، يملأ OpenClaw الهدف/الحساب المفقود من المسار المحسوم لجلسة مقدّم الطلب (
lastChannel/lastTo/lastAccountId) لكي يظل التسليم المباشر عاملًا.
البيانات الوصفية لتسليم الاكتمال
تسليم الاكتمال إلى جلسة مقدّم الطلب هو سياق داخلي مولّد في وقت التشغيل (وليس نصًا صادرًا من المستخدم)، ويتضمن:
Result— نص أحدث ردassistantمرئي من الوكيل الفرعي. لا تُرفّع مخرجات Tool/toolResult إلى نتائج الوكيل الفرعي. لا تعيد عمليات التشغيل الفاشلة نهائيًا استخدام نص الرد الملتقط.Status—completed; ready for parent review/failed/timed out/unknown.- إحصاءات موجزة لوقت التشغيل/الرموز.
- تعليمة مراجعة تطلب من وكيل مقدّم الطلب التحقق من النتيجة قبل تقرير ما إذا كانت المهمة الأصلية قد اكتملت.
- إرشادات متابعة تطلب من وكيل مقدّم الطلب مواصلة المهمة أو تسجيل متابعة عندما تترك نتيجة الوكيل الفرعي إجراءات إضافية.
- تعليمة تحديث نهائي لمسار عدم وجود إجراءات أخرى، مكتوبة بصوت المساعد العادي من دون تمرير البيانات الوصفية الداخلية الخام.
الأوضاع وبيئة تشغيل ACP
- يتجاوز
--modelو--thinkingالقيم الافتراضية لعملية التشغيل المحددة تلك. - استخدم
info/logلفحص التفاصيل والمخرجات بعد الاكتمال. - للجلسات الدائمة المرتبطة بسلسلة، استخدم
sessions_spawnمعthread: trueوmode: "session". - إذا كانت قناة مقدّم الطلب لا تدعم روابط السلاسل، فاستخدم
mode: "run"بدلًا من إعادة محاولة توليفة مرتبطة بسلسلة يستحيل تنفيذها. - لجلسات حاضنة ACP (Claude Code أو Gemini CLI أو OpenCode أو Codex ACP/acpx الصريح)، استخدم
sessions_spawnمعruntime: "acp"عندما تعلن الأداة عن بيئة التشغيل تلك. راجع نموذج تسليم ACP عند تصحيح حالات الاكتمال أو حلقات وكيل إلى وكيل. عندما يكون Plugin codexمفعّلًا، ينبغي أن يفضّل التحكم في دردشة/سلسلة Codex الأمر/codex ...على ACP ما لم يطلب المستخدم ACP/acpx صراحةً. - يخفي OpenClaw
runtime: "acp"حتى يُفعّل ACP، ولا يكون مقدّم الطلب معزولًا، ويُحمّل Plugin خلفي مثلacpx. تتوقعruntime: "acp"معرّف حاضنة ACP خارجيًا، أو إدخالًا فيagents.list[]يحتوي علىruntime.type="acp"؛ استخدم بيئة تشغيل الوكيل الفرعي الافتراضية لوكلاء إعداد OpenClaw العاديين منagents_list.
أوضاع السياق
يبدأ الوكلاء الفرعيون الأصليون معزولين ما لم يطلب المستدعي صراحةً تفرّع النص الحالي للمحادثة.
| الوضع | متى يُستخدم | السلوك |
|---|---|---|
isolated |
بحث جديد، أو تنفيذ مستقل، أو عمل أدوات بطيء، أو أي شيء يمكن شرحه بإيجاز في نص المهمة | ينشئ نص محادثة نظيفًا للوكيل الفرعي. هذا هو الوضع الافتراضي ويُبقي استهلاك الرموز أقل. |
fork |
عمل يعتمد على المحادثة الحالية، أو نتائج الأدوات السابقة، أو تعليمات دقيقة موجودة بالفعل في نص محادثة مقدّم الطلب | يفرّع نص محادثة مقدّم الطلب إلى جلسة الوكيل الفرعي قبل بدء الوكيل الفرعي. |
استخدم fork باعتدال. فهو مخصص للتفويض الحساس للسياق، وليس
بديلًا عن كتابة مطالبة مهمة واضحة.
الأداة: sessions_spawn
تبدأ تشغيل وكيل فرعي باستخدام deliver: false على مسار subagent العام،
ثم تنفّذ خطوة إعلان وتنشر رد الإعلان في قناة دردشة مقدّم الطلب.
يعتمد التوفر على سياسة الأدوات الفعلية للمستدعي. يتضمن ملف التعريف المضمّن
coding الأداة sessions_spawn؛ بينما لا يتضمنها messaging ولا minimal.
يسمح full بكل الأدوات. أضف tools.alsoAllow: ["sessions_spawn", "sessions_yield", "subagents"]، أو استخدم tools.profile: "coding"،
للوكلاء ذوي ملف تعريف أضيق والذين ينبغي أن يتمكنوا مع ذلك من تفويض العمل.
يمكن لسياسات السماح/المنع الخاصة بالقناة/المجموعة، والموفّر، والعزل، وكل وكيل
أن تزيل الأداة بعد مرحلة ملف التعريف. استخدم /tools من الجلسة نفسها
لتأكيد قائمة الأدوات الفعلية.
القيم الافتراضية:
- النموذج: يرث الوكلاء الفرعيون الأصليون نموذج المستدعي ما لم تضبط
agents.defaults.subagents.model(أوagents.list[].subagents.modelلكل وكيل). تستخدم عمليات إنشاء بيئة تشغيل ACP نموذج الوكيل الفرعي المضبوط نفسه عند وجوده؛ وإلا تحتفظ حاضنة ACP بقيمتها الافتراضية الخاصة. يظلsessions_spawn.modelالصريح صاحب الأولوية. - التفكير: يرث الوكلاء الفرعيون الأصليون إعداد التفكير من المستدعي ما لم تضبط
agents.defaults.subagents.thinking(أوagents.list[].subagents.thinkingلكل وكيل). تطبّق عمليات إنشاء بيئة تشغيل ACP أيضًاagents.defaults.models["provider/model"].params.thinkingللنموذج المحدد. يظلsessions_spawn.thinkingالصريح صاحب الأولوية. - مهلة التشغيل: يستخدم OpenClaw
agents.defaults.subagents.runTimeoutSecondsعند ضبطه؛ وإلا يعود إلى0(من دون مهلة). لا تقبلsessions_spawnتجاوزات للمهلة لكل استدعاء. - تسليم المهمة: يتلقى الوكلاء الفرعيون الأصليون المهمة المفوّضة في أول رسالة
[Subagent Task]مرئية لهم. تحمل مطالبة نظام الوكيل الفرعي قواعد وقت التشغيل وسياق التوجيه، لا نسخة مكررة مخفية من المهمة.
تتضمن عمليات إنشاء الوكلاء الفرعيين الأصليين المقبولة البيانات الوصفية
لنموذج الوكيل الفرعي المحسوم في نتيجة الأداة: يحتوي resolvedModel على مرجع النموذج المطبق،
ويحتوي resolvedProvider على بادئة الموفّر عندما يتضمن المرجع واحدة.
وضع مطالبة التفويض
يتحكم agents.defaults.subagents.delegationMode في إرشادات المطالبة فقط؛ ولا يغيّر سياسة الأدوات ولا يفرض التفويض.
suggest(الافتراضي): يحتفظ بالتلميح القياسي في المطالبة لاستخدام الوكلاء الفرعيين للأعمال الأكبر أو الأبطأ.prefer: يطلب من الوكيل الرئيسي الحفاظ على سرعة الاستجابة وتفويض أي عمل أكثر تعقيدًا من رد مباشر عبرsessions_spawn.
التجاوز لكل وكيل: agents.list[].subagents.delegationMode.
{ agents: { defaults: { subagents: { delegationMode: "prefer", maxConcurrent: 4, }, }, list: [ { id: "coordinator", subagents: { delegationMode: "prefer" }, }, ], },}معلمات الأداة
taskstringrequiredوصف المهمة للوكيل الفرعي.
taskNamestringمعرّف ثابت اختياري لتحديد وكيل فرعي بعينه في مخرجات الحالة اللاحقة. يجب أن يطابق [a-z][a-z0-9_-]{0,63}، ولا يمكن أن يكون هدفًا محجوزًا مثل last أو all.
labelstringتسمية اختيارية قابلة للقراءة.
agentIdstringأنشئ تحت معرّف وكيل آخر مهيأ عندما يسمح بذلك subagents.allowAgents.
cwdstringدليل عمل اختياري للمهمة الخاصة بتشغيل الوكيل الفرعي. تظل الوكلاء الفرعية الأصلية تحمّل ملفات التمهيد من مساحة عمل الوكيل المستهدف؛ ولا يغيّر cwd سوى الموضع الذي تنفّذ فيه أدوات وقت التشغيل وأُطر CLI العمل المفوّض.
runtime"subagent" | "acp"default: subagentلا يُستخدم acp إلا لأُطر ACP الخارجية (claude أو droid أو gemini أو opencode أو Codex ACP/acpx المطلوب صراحةً)، ولإدخالات agents.list[] التي تكون قيمة runtime.type فيها هي acp.
resumeSessionIdstringخاص بـ ACP فقط. يستأنف جلسة إطار ACP موجودة عند استخدام runtime: "acp"؛ ويُتجاهل عند إنشاء وكلاء فرعية أصلية.
streamTo"parent"خاص بـ ACP فقط. يبث مخرجات تشغيل ACP إلى الجلسة الأصل عند استخدام runtime: "acp"؛ احذفه عند إنشاء وكلاء فرعية أصلية.
modelstringتجاوز نموذج الوكيل الفرعي. تُتخطى القيم غير الصالحة، ويعمل الوكيل الفرعي بالنموذج الافتراضي مع تحذير في نتيجة الأداة.
thinkingstringتجاوز مستوى التفكير لتشغيل الوكيل الفرعي.
threadbooleandefault: falseعندما تكون القيمة true، يطلب ربط سلسلة محادثة القناة بجلسة الوكيل الفرعي هذه.
mode"run" | "session"default: runإذا كانت thread: true وحُذفت mode، تصبح القيمة الافتراضية session. تتطلب mode: "session" استخدام thread: true.
إذا لم يكن ربط سلسلة المحادثة متاحًا لقناة مقدّم الطلب، فاستخدم mode: "run" بدلًا منه.
cleanup"delete" | "keep"default: keepتؤرشف "delete" الجلسة فورًا بعد الإعلان (مع استمرار الاحتفاظ بالنص المنسوخ عبر إعادة التسمية).
sandbox"inherit" | "require"default: inheritترفض require الإنشاء ما لم يكن وقت تشغيل الوكيل الفرعي المستهدف معزولًا.
context"isolated" | "fork"default: isolatedتُفرّع fork النص المنسوخ الحالي لمقدّم الطلب إلى جلسة الوكيل الفرعي. للوكلاء الفرعية الأصلية فقط. تستخدم عمليات الإنشاء المرتبطة بسلسلة محادثة fork افتراضيًا؛ وتستخدم العمليات غير المرتبطة بسلسلة محادثة isolated افتراضيًا.
أسماء المهام والاستهداف
taskName معرّف موجّه للنموذج لأغراض التنسيق، وليس مفتاح جلسة.
استخدمه لأسماء الوكلاء الفرعية الثابتة مثل review_subagents أو
linux_validation أو docs_update عندما قد يحتاج المنسّق إلى فحص
ذلك الوكيل الفرعي لاحقًا.
يقبل تحليل الهدف التطابقات التامة لـ taskName والبادئات
غير الملتبسة. يقتصر التطابق على نافذة الأهداف النشطة/الحديثة نفسها المستخدمة
مع أهداف /subagents المرقّمة، لذلك لا يجعل وكيل فرعي مكتمل قديم
المعرّف المعاد استخدامه ملتبسًا. إذا اشترك وكيلان فرعيان نشطان أو حديثان في
taskName نفسه، يكون الهدف ملتبسًا؛ استخدم بدلًا منه فهرس القائمة أو مفتاح الجلسة أو
معرّف التشغيل.
لا تصلح الأهداف المحجوزة last وall كقيم لـ taskName
لأن لها معاني تحكمية بالفعل.
الأداة: sessions_yield
تنهي دور النموذج الحالي وتنتظر وصول أحداث وقت التشغيل، وبشكل أساسي أحداث اكتمال الوكلاء الفرعية، في الرسالة التالية. استخدمها بعد إنشاء أعمال الوكلاء الفرعية المطلوبة عندما يتعذر على مقدّم الطلب تقديم إجابة نهائية حتى تصل تلك الاكتمالات.
sessions_yield هي آلية الانتظار الأساسية. لا تستبدلها بحلقات استقصاء
عبر subagents أو sessions_list أو sessions_history أو أمر
sleep في الصدفة أو استقصاء العمليات لمجرد اكتشاف اكتمال الوكيل الفرعي.
لا تستخدم sessions_yield إلا عندما تتضمنها قائمة الأدوات الفعلية للجلسة.
قد تعرض بعض ملفات تعريف الأدوات الدنيا أو المخصصة sessions_spawn و
subagents من دون عرض sessions_yield؛ وفي هذه الحالة، لا تنشئ
حلقة استقصاء لمجرد انتظار الاكتمال.
عند وجود وكلاء فرعية نشطة، يحقن OpenClaw كتلة مطالبة مختصرة منشأة
في وقت التشغيل باسم Active Subagents ضمن الأدوار العادية، كي يتمكن مقدّم الطلب من رؤية
جلسات الوكلاء الفرعية الحالية ومعرّفات التشغيل والحالات والتسميات والمهام
وأسماء taskName البديلة من دون استقصاء. تُقتبس حقول المهمة والتسمية في تلك
الكتلة بوصفها بيانات لا تعليمات، لأنها قد تنشأ
من وسائط إنشاء قدّمها المستخدم/النموذج.
الأداة: subagents
تسرد عمليات تشغيل الوكلاء الفرعية التي أنشأتها جلسة مقدّم الطلب. يقتصر نطاقها على مقدّم الطلب الحالي؛ ولا يمكن للوكيل الفرعي رؤية سوى الوكلاء الفرعية الخاضعة لسيطرته.
استخدم subagents للحصول على الحالة عند الطلب وتصحيح الأخطاء. استخدم sessions_yield
لانتظار أحداث الاكتمال.
الجلسات المرتبطة بسلاسل المحادثات
عند تمكين روابط سلاسل المحادثات لقناة، يمكن أن يظل الوكيل الفرعي مرتبطًا بسلسلة محادثة، بحيث يستمر توجيه رسائل المستخدم اللاحقة في تلك السلسلة إلى جلسة الوكيل الفرعي نفسها.
القنوات الداعمة لسلاسل المحادثات
تدعم القناة جلسات الوكلاء الفرعية الدائمة المرتبطة بسلاسل المحادثات
(sessions_spawn مع thread: true) عندما تسجّل مهايئًا لربط المحادثات.
القنوات المضمّنة التي تدعم ذلك: Discord و
iMessage وMatrix وTelegram. ينشئ Discord وMatrix
سلسلة محادثة فرعية افتراضيًا؛ بينما يربط Telegram وiMessage
المحادثة الحالية افتراضيًا. استخدم مفاتيح إعداد threadBindings الخاصة بكل قناة
للتمكين والمهل وspawnSessions.
التدفق السريع
الإنشاء
استخدم sessions_spawn مع thread: true (واختياريًا mode: "session").
الربط
ينشئ OpenClaw سلسلة محادثة أو يربطها بهدف الجلسة ذاك في القناة النشطة.
توجيه المتابعات
تُوجّه الردود ورسائل المتابعة في سلسلة المحادثة تلك إلى الجلسة المرتبطة.
فحص المهل
استخدم /session idle لفحص/تحديث إلغاء التركيز التلقائي عند الخمول،
و/session max-age للتحكم في الحد الأقصى الصارم.
فصل الربط
استخدم /unfocus لفصل الربط يدويًا.
عناصر التحكم اليدوية
| الأمر | التأثير |
|---|---|
/focus <target> |
يربط سلسلة المحادثة الحالية (أو ينشئ واحدة) بهدف وكيل فرعي/جلسة |
/unfocus |
يزيل الربط عن سلسلة المحادثة المرتبطة حاليًا |
/agents |
يسرد عمليات التشغيل النشطة وحالة الربط (binding:<id> أو unbound أو bindings unavailable) |
/session idle |
يفحص/يحدّث إلغاء التركيز التلقائي عند الخمول (لسلاسل المحادثات المرتبطة والمركّز عليها فقط) |
/session max-age |
يفحص/يحدّث الحد الأقصى الصارم (لسلاسل المحادثات المرتبطة والمركّز عليها فقط) |
مفاتيح الإعداد
- الإعداد الافتراضي العام:
session.threadBindings.enabledوsession.threadBindings.idleHoursوsession.threadBindings.maxAgeHours. - مفاتيح تجاوز القناة والربط التلقائي عند الإنشاء خاصة بكل مهايئ. راجع القنوات الداعمة لسلاسل المحادثات أعلاه.
راجع مرجع الإعداد و أوامر الشرطة المائلة للاطلاع على تفاصيل المهايئات الحالية.
قائمة السماح
agents.list[].subagents.allowAgentsstring[]قائمة معرّفات الوكلاء المهيئين الذين يمكن استهدافهم عبر agentId صريح (["*"] تسمح بأي هدف مهيأ). الافتراضي: وكيل مقدّم الطلب فقط. إذا عيّنت قائمة وما زلت تريد أن ينشئ مقدّم الطلب نسخة من نفسه باستخدام agentId، فأدرج معرّف مقدّم الطلب في القائمة.
agents.defaults.subagents.allowAgentsstring[]قائمة السماح الافتراضية للوكلاء المستهدفين المهيئين، وتُستخدم عندما لا يعيّن وكيل مقدّم الطلب قيمة subagents.allowAgents الخاصة به.
agents.defaults.subagents.requireAgentIdbooleandefault: falseيحظر استدعاءات sessions_spawn التي تحذف agentId (ويفرض اختيار ملف تعريف صريحًا). التجاوز لكل وكيل: agents.list[].subagents.requireAgentId.
agents.defaults.subagents.announceTimeoutMsnumberdefault: 120000مهلة كل استدعاء لمحاولات تسليم إعلان agent عبر Gateway. القيم أعداد صحيحة موجبة بالميلي ثانية، ويُحدّ نطاقها عند الحد الأقصى الآمن لمؤقت المنصة. قد تجعل عمليات إعادة المحاولة العابرة إجمالي انتظار الإعلان أطول من مهلة مهيأة واحدة.
إذا كانت جلسة مقدّم الطلب معزولة، ترفض sessions_spawn الأهداف
التي ستعمل من دون عزل.
الاكتشاف
استخدم agents_list لمعرفة معرّفات الوكلاء المسموح بها حاليًا لـ
sessions_spawn. تتضمن الاستجابة النموذج الفعلي لكل وكيل مدرج
وبيانات وصفية مضمّنة لوقت التشغيل، كي يستطيع المستدعون التمييز بين OpenClaw وCodex
app-server وأوقات التشغيل الأصلية المهيأة الأخرى.
يجب أن تشير إدخالات allowAgents إلى معرّفات وكلاء مهيئين في agents.list[].
تعني ["*"] أي وكيل مستهدف مهيأ بالإضافة إلى مقدّم الطلب. إذا حُذف إعداد وكيل
لكن بقي معرّفه في allowAgents، فسترفض sessions_spawn ذلك المعرّف
وتحذفه agents_list من النتائج. شغّل openclaw doctor --fix لتنظيف
إدخالات قائمة السماح القديمة، أو أضف إدخالًا أدنى في agents.list[] عندما يجب أن يظل الهدف
قابلًا للإنشاء مع وراثة الإعدادات الافتراضية.
الأرشفة التلقائية
- تُؤرشف جلسات الوكلاء الفرعية تلقائيًا بعد
agents.defaults.subagents.archiveAfterMinutes(الافتراضي60). - تستخدم الأرشفة
sessions.deleteوتعيد تسمية النص المنسوخ إلى*.deleted.<timestamp>(في المجلد نفسه). - تؤرشف
cleanup: "delete"الجلسة فورًا بعد الإعلان (مع استمرار الاحتفاظ بالنص المنسوخ عبر إعادة التسمية). - الأرشفة التلقائية بأفضل جهد؛ وتُفقد المؤقتات المعلّقة إذا أُعيد تشغيل Gateway.
- لا تؤدي مهل التشغيل المهيأة إلى الأرشفة التلقائية؛ فهي توقف التشغيل فقط. وتبقى الجلسة حتى الأرشفة التلقائية.
- تنطبق الأرشفة التلقائية بالتساوي على جلسات العمق 1 والعمق 2.
- تنظيف المتصفح منفصل عن تنظيف الأرشيف: تُغلق علامات تبويب/عمليات المتصفح المتتبعة بأفضل جهد عند انتهاء التشغيل، حتى عند الاحتفاظ بالنص المنسوخ/سجل الجلسة.
الوكلاء الفرعية المتداخلة
افتراضيًا، لا يمكن للوكلاء الفرعية إنشاء وكلاء فرعية خاصة بها
(maxSpawnDepth: 1). عيّن maxSpawnDepth: 2 لتمكين مستوى واحد من
التداخل — نمط المنسّق: الرئيسي ← الوكيل الفرعي المنسّق ←
الوكلاء الفرعية العاملة.
{ agents: { defaults: { subagents: { maxSpawnDepth: 2, // السماح للوكلاء الفرعية بإنشاء وكلاء فرعية (الافتراضي: 1، النطاق 1-5) maxChildrenPerAgent: 5, // الحد الأقصى للوكلاء الفرعية النشطة لكل جلسة وكيل (الافتراضي: 5، النطاق 1-20) maxConcurrent: 8, // الحد الأقصى لمسار التزامن العام (الافتراضي: 8) runTimeoutSeconds: 900, // المهلة الافتراضية لـ sessions_spawn (0 = بلا مهلة) announceTimeoutMs: 120000, // مهلة إعلان Gateway لكل استدعاء }, }, },}مستويات العمق
| العمق | بنية مفتاح الجلسة | الدور | هل يمكنه إنشاء وكلاء؟ |
|---|---|---|---|
| 0 | agent:<id>:main |
الوكيل الرئيسي | دائمًا |
| 1 | agent:<id>:subagent:<uuid> |
وكيل فرعي (منسّق عند السماح بالعمق 2) | فقط إذا كان maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> |
وكيل فرعي من المستوى الثاني (عامل طرفي) | أبدًا |
سلسلة الإعلان
تتدفق النتائج صعودًا عبر السلسلة:
- ينتهي العامل في العمق 2 ← يعلن لوالده (المنسّق في العمق 1).
- يتلقى المنسّق في العمق 1 الإعلان، ويولّف النتائج، وينتهي ← يعلن للرئيسي.
- يتلقى الوكيل الرئيسي الإعلان ويسلّمه إلى المستخدم.
لا يرى كل مستوى إلا الإعلانات الواردة من أبنائه المباشرين.
سياسة الأدوات حسب العمق
- يُكتبان الدور ونطاق التحكم في البيانات الوصفية للجلسة وقت الإنشاء. يمنع ذلك مفاتيح الجلسات المسطّحة أو المستعادة من استعادة امتيازات المنسّق عن طريق الخطأ.
- العمق 1 (منسّق، عندما يكون
maxSpawnDepth >= 2): يحصل علىsessions_spawnوsubagentsوsessions_listوsessions_historyليتمكن من إنشاء الأبناء وفحص حالتهم. تظل أدوات الجلسة/النظام الأخرى محظورة. - العمق 1 (طرفي، عندما يكون
maxSpawnDepth == 1): لا توجد أدوات جلسة (السلوك الافتراضي الحالي). - العمق 2 (عامل طرفي): لا توجد أدوات جلسة — تكون
sessions_spawnمحظورة دائمًا في العمق 2. لا يمكنه إنشاء أبناء إضافيين.
حد الإنشاء لكل وكيل
يمكن لكل جلسة وكيل (في أي عمق) أن تضم في الوقت نفسه ما لا يزيد على maxChildrenPerAgent من الأبناء النشطين (القيمة الافتراضية 5). يمنع هذا التفرع الجامح من منسّق واحد.
الإيقاف المتسلسل
يؤدي إيقاف منسّق في العمق 1 تلقائيًا إلى إيقاف جميع أبنائه في العمق 2:
- يؤدي
/stopفي المحادثة الرئيسية إلى إيقاف جميع وكلاء العمق 1، ويتسلسل الإيقاف إلى أبنائهم في العمق 2.
المصادقة
تُحل مصادقة الوكيل الفرعي حسب معرّف الوكيل، لا حسب نوع الجلسة:
- مفتاح جلسة الوكيل الفرعي هو
agent:<agentId>:subagent:<uuid>. - يُحمّل مخزن المصادقة من
agentDirالخاص بذلك الوكيل. - تُدمج ملفات تعريف مصادقة الوكيل الرئيسي بوصفها خيارًا احتياطيًا؛ وتتغلب ملفات تعريف الوكيل على ملفات تعريف الرئيسي عند التعارض.
الدمج إضافي، لذا تكون ملفات تعريف الرئيسي متاحة دائمًا بوصفها خيارات احتياطية. عزل المصادقة بالكامل لكل وكيل غير مدعوم حتى الآن.
الإعلان
ترفع الوكلاء الفرعية تقاريرها عبر خطوة إعلان:
- تعمل خطوة الإعلان داخل جلسة الوكيل الفرعي (وليس جلسة الطالب).
- إذا رد الوكيل الفرعي بـ
ANNOUNCE_SKIPتمامًا، فلن يُنشر شيء. - إذا كان أحدث نص للمساعد هو رمز الصمت المطابق تمامًا
NO_REPLY/no_reply، فيُمنع إخراج الإعلان حتى لو وُجد تقدم مرئي سابق.
يعتمد التسليم على عمق الطالب:
- تستخدم جلسات الطالب في المستوى الأعلى استدعاء
agentللمتابعة مع التسليم الخارجي (deliver=true). - تتلقى جلسات الوكيل الفرعي الطالب المتداخلة حقن متابعة داخليًا (
deliver=false) كي يتمكن المنسّق من توليف نتائج الأبناء داخل الجلسة. - إذا اختفت جلسة وكيل فرعي طالب متداخلة، يعود OpenClaw إلى طالب تلك الجلسة عند توفره.
بالنسبة إلى جلسات الطالب في المستوى الأعلى، يحل التسليم المباشر في وضع الاكتمال أولًا أي مسار محادثة/سلسلة رسائل مرتبط وتجاوز للخطاف، ثم يملأ حقول القناة والوجهة المفقودة من المسار المخزن لجلسة الطالب. يُبقي ذلك عمليات الاكتمال في المحادثة/الموضوع الصحيح حتى عندما لا يحدد مصدر الاكتمال سوى القناة.
يقتصر تجميع اكتمالات الأبناء على تشغيل الطالب الحالي عند إنشاء نتائج الاكتمال المتداخلة، ما يمنع تسرب مخرجات الأبناء القديمة من تشغيل سابق إلى الإعلان الحالي. تحافظ ردود الإعلان على توجيه سلسلة الرسائل/الموضوع عند توفره في محولات القنوات.
سياق الإعلان
يُطبّع سياق الإعلان إلى كتلة أحداث داخلية مستقرة:
| الحقل | المصدر |
|---|---|
| المصدر | subagent أو cron |
| معرّفات الجلسة | مفتاح/معرّف جلسة الابن |
| النوع | نوع الإعلان + تسمية المهمة |
| الحالة | مشتقة من نتيجة وقت التشغيل (ok أو error أو timeout أو unknown) — ولا تُستنتج من نص النموذج |
| محتوى النتيجة | أحدث نص مرئي للمساعد من الابن |
| المتابعة | تعليمة تصف متى يجب الرد ومتى يجب التزام الصمت |
تُبلغ عمليات التشغيل الطرفية الفاشلة عن حالة الفشل دون إعادة تشغيل نص الرد الملتقط. لا يُرفع إخراج الأداة/toolResult إلى نص نتيجة الابن.
سطر الإحصاءات
تتضمن حمولات الإعلان سطر إحصاءات في النهاية (حتى عند التفافها):
- وقت التشغيل (مثل
runtime 5m12s). - استخدام الرموز (الإدخال/الإخراج/الإجمالي).
- التكلفة المقدّرة عند ضبط تسعير النموذج (
models.providers.*.models[].cost). sessionKeyوsessionIdومسار النص المنسوخ كي يتمكن الوكيل الرئيسي من جلب السجل عبرsessions_historyأو فحص الملف على القرص.
البيانات الوصفية الداخلية مخصصة للتنسيق فقط؛ وينبغي إعادة صياغة الردود الموجهة للمستخدم بصوت مساعد طبيعي.
لماذا يُفضّل sessions_history
تُعد sessions_history مسار التنسيق الأكثر أمانًا لقراءة النص المنسوخ للابن من داخل دورة وكيل:
- تحجب النصوص المشابهة لبيانات الاعتماد/الرموز حتى عند تعطيل حجب السجلات العام.
- تقتطع كتل النص الطويلة (4000 محرف لكل كتلة)، وتحذف توقيعات التفكير وحمولات إعادة تشغيل الاستدلال وبيانات الصور المضمنة.
- تفرض حدًا أقصى للاستجابة قدره 80 كيلوبايت؛ وتُستبدل الصفوف المتضخمة بـ
[sessions_history omitted: message too large]. - استخدم
nextOffsetعند وجوده للتنقل إلى الخلف عبر نوافذ النصوص المنسوخة الأقدم. - لا تزيل
sessions_historyوسوم الاستدلال أو بنية<relevant-memories>أو XML الخاص باستدعاءات الأدوات من نص الرسالة — بل تعيد كتل محتوى منظّمة قريبة من بنية النص المنسوخ الخام، مع الحجب وتقييد الحجم فقط. يطبق/subagents logمنقّي نثر أشد (يزيل وسوم الاستدلال وبنية الذاكرة وXML الخاص باستدعاءات الأدوات) لأنه يعرض أسطر محادثة عادية بدلًا من الكتل المنظّمة. - يُعد فحص النص المنسوخ الخام على القرص الخيار الاحتياطي عندما تحتاج إلى النص الكامل المطابق بايتًا ببايت.
سياسة الأدوات
تستخدم الوكلاء الفرعية أولًا ملف التعريف ومسار سياسة الأدوات نفسيهما اللذين يستخدمهما الوكيل الأب أو المستهدف. بعد ذلك، يطبق OpenClaw طبقة قيود الوكيل الفرعي.
تفقد الوكلاء الفرعية دائمًا gateway وagents_list وsession_status وcron بغض النظر عن العمق أو الدور (وهي أدوات على مستوى النظام/تفاعلية، أو أدوات ينبغي أن ينسقها الوكيل الرئيسي). وتفقد الوكلاء الفرعية الطرفية (السلوك الافتراضي في العمق 1، ودائمًا في العمق 2) أيضًا subagents وsessions_list وsessions_history وsessions_spawn. لا تحصل الوكلاء الفرعية مطلقًا على أداة message — إذ تُعطّل وقت الإنشاء، ولا تُرشّح عبر قائمة الحظر هذه — وتظل sessions_send محظورة كي لا تتواصل الوكلاء الفرعية إلا عبر سلسلة الإعلان.
تظل sessions_history هنا أيضًا طريقة استرجاع محدودة ومنقّاة — وليست تفريغًا خامًا للنص المنسوخ.
عندما يكون maxSpawnDepth >= 2، تتلقى الوكلاء الفرعية المنسّقة في العمق 1 أيضًا sessions_spawn وsubagents وsessions_list وsessions_history كي تتمكن من إدارة أبنائها.
التجاوز عبر الإعداد
{ agents: { defaults: { subagents: { maxConcurrent: 1, }, }, }, tools: { subagents: { tools: { // deny wins deny: ["gateway", "cron"], // if allow is set, it becomes allow-only (deny still wins) // allow: ["read", "exec", "process"] }, }, },}تُعد tools.subagents.tools.allow مرشحًا نهائيًا للسماح فقط. يمكنها تضييق مجموعة الأدوات المحلولة بالفعل، لكنها لا تستطيع إعادة إضافة أداة أزالها tools.profile. على سبيل المثال، يتضمن tools.profile: "coding" الأداتين web_search/web_fetch ولكن ليس أداة browser. للسماح للوكلاء الفرعية ذات ملف تعريف البرمجة باستخدام أتمتة المتصفح، أضف المتصفح في مرحلة ملف التعريف:
{ tools: { profile: "coding", alsoAllow: ["browser"], },}استخدم agents.list[].tools.alsoAllow: ["browser"] الخاص بكل وكيل عندما ينبغي لوكيل واحد فقط الحصول على أتمتة المتصفح.
التزامن
تستخدم الوكلاء الفرعية مسار طابور مخصصًا داخل العملية:
- اسم المسار:
subagent - التزامن:
agents.defaults.subagents.maxConcurrent(القيمة الافتراضية8)
الحيوية والاسترداد
لا يعامل OpenClaw غياب endedAt على أنه دليل دائم على أن الوكيل الفرعي لا يزال نشطًا. تتوقف عمليات التشغيل غير المنتهية الأقدم من نافذة التشغيل القديمة (ساعتان، أو مهلة التشغيل المضبوطة مضافًا إليها فترة سماح قصيرة، أيهما أطول) عن الاحتساب كنشطة/معلّقة في /subagents list وملخصات الحالة وبوابات اكتمال التوابع وفحوص التزامن لكل جلسة.
بعد إعادة تشغيل Gateway، تُزال عمليات التشغيل القديمة غير المنتهية والمستعادة ما لم تكن جلسة الابن موسومة بـ abortedLastRun: true. تظل عمليات التشغيل التي أُجهضت بسبب إعادة التشغيل مسجلة لتدفق استرداد الوكيل الفرعي اليتيم: تُنهى عمليات التشغيل القديمة دون استئناف، بينما تتلقى جلسات الأبناء الحديثة رسالة استئناف اصطناعية قبل مسح علامة الإجهاض.
الاسترداد التلقائي بعد إعادة التشغيل محدود لكل جلسة ابن. إذا قُبل الابن نفسه من الوكلاء الفرعية مرارًا لاسترداد اليتيم داخل نافذة التعطل السريع المتكرر، يحفظ OpenClaw علامة منع استرداد على تلك الجلسة ويتوقف عن استئنافها تلقائيًا في عمليات إعادة التشغيل اللاحقة. شغّل openclaw tasks maintenance --apply لتسوية سجل المهمة، أو openclaw doctor --fix لمسح علامات استرداد الإجهاض القديمة من الجلسات الموسومة بعلامة المنع.
الإيقاف
- يؤدي إرسال
/stopفي محادثة الطالب إلى إجهاض جلسة الطالب وإيقاف أي عمليات تشغيل نشطة للوكلاء الفرعية أُنشئت منها، مع تسلسل الإيقاف إلى الأبناء المتداخلين.
القيود
- يكون إعلان الوكيل الفرعي وفق أفضل جهد ممكن. إذا أُعيد تشغيل Gateway، فستُفقد أعمال «الإعلان إلى الخلف» المعلّقة.
- تظل الوكلاء الفرعية تتشارك موارد عملية Gateway نفسها؛ تعامل مع
maxConcurrentبوصفه صمام أمان. - تكون
sessions_spawnدائمًا غير حاجبة: إذ تُعيد{ status: "accepted", runId, childSessionKey }فورًا. - لا يحقن سياق الوكيل الفرعي سوى
AGENTS.mdوTOOLS.md(ولا يحقنSOUL.mdأوIDENTITY.mdأوUSER.mdأوMEMORY.mdأوHEARTBEAT.mdأوBOOTSTRAP.md). تتبع الوكلاء الفرعية الأصلية في Codex الحد نفسه: يظلTOOLS.mdضمن تعليمات سلسلة Codex الموروثة، بينما تُحقن ملفات الشخصية والهوية والمستخدم الخاصة بالوالد فقط بوصفها تعليمات تعاون مقتصرة على الدور، كي لا تنسخها الوكلاء الأبناء. - الحد الأقصى لعمق التداخل هو 5 (نطاق
maxSpawnDepth: من 1 إلى 5). يُوصى بالعمق 2 لمعظم حالات الاستخدام. - يحدّد
maxChildrenPerAgentسقف عدد الوكلاء الأبناء النشطين لكل جلسة (القيمة الافتراضية5، والنطاق من1إلى20).