الوكلاء الفرعيون
الوكلاء الفرعيون هم عمليات تشغيل وكيل في الخلفية يتم إنشاؤها من عملية وكيل موجودة. يعملون في جلسة خاصة بهم (agent:<agentId>:subagent:<uuid>) وعند الانتهاء يعلنون نتيجتهم مرة أخرى في قناة دردشة الطالب.
أمر Slash
استخدم/subagents لفحص أو التحكم في عمليات الوكلاء الفرعيين للجلسة الحالية:
/subagents list/subagents kill <id|#|all>/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents send <id|#> <message>
/subagents info بيانات التشغيل (الحالة، الطوابع الزمنية، معرف الجلسة، مسار النص، التنظيف).
الأهداف الرئيسية:
- تنفيذ أعمال “بحث / مهمة طويلة / أداة بطيئة” بالتوازي دون حجب التشغيل الرئيسي.
- إبقاء الوكلاء الفرعيين معزولين افتراضيًا (فصل الجلسات + عزل اختياري).
- تقليل إساءة استخدام الأدوات: الوكلاء الفرعيون لا يحصلون على أدوات الجلسة افتراضيًا.
- دعم عمق تداخل قابل للتهيئة لأنماط الـ orchestrator.
agents.defaults.subagents.model أو عبر إعدادات خاصة بكل وكيل.
الأداة
استخدمsessions_spawn:
- يبدأ تشغيل وكيل فرعي (
deliver: false, مسار عام:subagent) - ثم ينفّذ خطوة announce وينشر رد الإعلان في قناة دردشة الطالب
- النموذج الافتراضي: يرث من المستدعي ما لم تقم بتعيين
agents.defaults.subagents.model(أوagents.list[].subagents.modelلكل وكيل)؛ أي قيمةsessions_spawn.modelصريحة لها الأولوية. - التفكير الافتراضي: يرث من المستدعي ما لم تقم بتعيين
agents.defaults.subagents.thinking(أوagents.list[].subagents.thinkingلكل وكيل)؛ أي قيمةsessions_spawn.thinkingصريحة لها الأولوية.
task(مطلوب)label?(اختياري)agentId?(اختياري؛ الإنشاء تحت معرف وكيل آخر إذا كان مسموحًا)model?(اختياري؛ يتجاوز نموذج الوكيل الفرعي؛ القيم غير الصالحة يتم تخطيها ويعمل الوكيل الفرعي على النموذج الافتراضي مع تحذير في نتيجة الأداة)thinking?(اختياري؛ يتجاوز مستوى التفكير لتشغيل الوكيل الفرعي)runTimeoutSeconds?(الافتراضي0؛ عند التعيين يتم إيقاف تشغيل الوكيل الفرعي بعد N ثانية)cleanup?(delete|keep, الافتراضيkeep)
agents.list[].subagents.allowAgents: قائمة بمعرفات الوكلاء التي يمكن استهدافها عبرagentId(["*"]للسماح للجميع). الافتراضي: فقط وكيل الطالب.
- استخدم
agents_listلمعرفة معرفات الوكلاء المسموح بها حاليًا لـsessions_spawn.
الأرشفة التلقائية
- تتم أرشفة جلسات الوكلاء الفرعيين تلقائيًا بعد
agents.defaults.subagents.archiveAfterMinutes(الافتراضي: 60). - تستخدم الأرشفة
sessions.deleteوتعيد تسمية النص إلى*.deleted.<timestamp>(في نفس المجلد). cleanup: "delete"يقوم بالأرشفة فورًا بعد announce (مع الاحتفاظ بالنص عبر إعادة التسمية).- الأرشفة التلقائية بنمط best-effort؛ يتم فقدان المؤقتات المعلقة إذا أُعيد تشغيل البوابة.
runTimeoutSecondsلا يقوم بالأرشفة التلقائية؛ بل يوقف التشغيل فقط. تبقى الجلسة حتى الأرشفة التلقائية.- تنطبق الأرشفة التلقائية على جلسات العمق 1 والعمق 2 على حد سواء.
الوكلاء الفرعيون المتداخلون
افتراضيًا، لا يمكن للوكلاء الفرعيين إنشاء وكلاء فرعيين خاصين بهم (maxSpawnDepth: 1). يمكنك تمكين مستوى واحد من التداخل عبر تعيين maxSpawnDepth: 2، مما يسمح بنمط orchestrator: الرئيسي → وكيل فرعي orchestrator → وكلاء فرعيون عاملون (sub-sub-agents).
كيفية التمكين
مستويات العمق
| Depth | Session key shape | Role | Can spawn? |
|---|---|---|---|
| 0 | agent:<id>:main | الوكيل الرئيسي | دائمًا |
| 1 | agent:<id>:subagent:<uuid> | وكيل فرعي (orchestrator عند السماح بالعمق 2) | فقط إذا maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> | وكيل فرعي-فرعي (عامل نهائي) | أبدًا |
سلسلة الإعلان (Announce chain)
تتدفق النتائج عائدًا عبر السلسلة:- ينتهي عامل العمق-2 → يعلن إلى والده (orchestrator في العمق-1)
- يستقبل orchestrator في العمق-1 الإعلان، يركّب النتائج، ينتهي → يعلن إلى الرئيسي
- يستقبل الوكيل الرئيسي الإعلان ويقوم بالتسليم إلى المستخدم
سياسة الأدوات حسب العمق
- العمق 1 (orchestrator، عند
maxSpawnDepth >= 2): يحصل علىsessions_spawn,subagents,sessions_list,sessions_historyلإدارة أبنائه. تظل أدوات الجلسة/النظام الأخرى مرفوضة. - العمق 1 (عامل نهائي، عند
maxSpawnDepth == 1): بدون أدوات جلسة (السلوك الافتراضي الحالي). - العمق 2 (عامل نهائي): بدون أدوات جلسة — يتم رفض
sessions_spawnدائمًا في العمق 2. لا يمكنه إنشاء أبناء إضافيين.
حد الإنشاء لكل وكيل
يمكن لكل جلسة وكيل (في أي عمق) أن تمتلك بحد أقصىmaxChildrenPerAgent (الافتراضي: 5) أبناء نشطين في نفس الوقت. هذا يمنع التوسع المفرط من orchestrator واحد.
الإيقاف المتسلسل (Cascade stop)
إيقاف orchestrator في العمق-1 يوقف تلقائيًا جميع أبنائه في العمق-2:- تنفيذ
/stopفي الدردشة الرئيسية يوقف جميع وكلاء العمق-1 ويتسلسل إلى أبنائهم في العمق-2. /subagents kill <id>يوقف وكيلًا فرعيًا محددًا ويتسلسل إلى أبنائه./subagents kill allيوقف جميع الوكلاء الفرعيين للطالب ويتسلسل.
المصادقة
تُحل مصادقة الوكيل الفرعي بحسب معرّف الوكيل، وليس بحسب نوع الجلسة:- مفتاح جلسة الوكيل الفرعي هو
agent:<agentId>:subagent:<uuid>. - يتم تحميل مخزن المصادقة من
agentDirالخاص بذلك الوكيل. - يتم دمج ملفات تعريف مصادقة الوكيل الرئيسي كـ fallback؛ ملفات تعريف الوكيل تتغلب عند التعارض.
Announce
يقوم الوكلاء الفرعيون بالإبلاغ عبر خطوة announce:- تعمل خطوة announce داخل جلسة الوكيل الفرعي (وليس جلسة الطالب).
- إذا رد الوكيل الفرعي بالنص
ANNOUNCE_SKIPحرفيًا، فلن يتم نشر أي شيء. - خلاف ذلك، يتم نشر رد الإعلان في قناة دردشة الطالب عبر استدعاء متابعة
agent(deliver=true). - تحافظ ردود الإعلان على توجيه الخيوط/الموضوعات عند توفره (خيوط Slack، موضوعات Telegram، خيوط Matrix).
- يتم توحيد رسائل الإعلان إلى قالب ثابت:
Status:مشتق من نتيجة التشغيل (success,error,timeout, أوunknown).Result:محتوى الملخص من خطوة announce (أو(not available)إذا لم يوجد).Notes:تفاصيل الخطأ وسياق مفيد آخر.
- لا يتم استنتاج
Statusمن مخرجات النموذج؛ بل يأتي من إشارات نتيجة وقت التشغيل.
- مدة التشغيل (مثل
runtime 5m12s) - استخدام الرموز (input/output/total)
- التكلفة التقديرية عند تكوين تسعير النموذج (
models.providers.*.models[].cost) sessionKeyوsessionIdومسار النص (ليتمكن الوكيل الرئيسي من جلب السجل عبرsessions_historyأو فحص الملف على القرص)
سياسة الأدوات (أدوات الوكيل الفرعي)
افتراضيًا، يحصل الوكلاء الفرعيون على جميع الأدوات باستثناء أدوات الجلسة وأدوات النظام:sessions_listsessions_historysessions_sendsessions_spawn
maxSpawnDepth >= 2، يحصل وكلاء العمق-1 من نوع orchestrator أيضًا على sessions_spawn, subagents, sessions_list, وsessions_history لإدارة أبنائهم.
تجاوز عبر الإعداد:
التزامن
يستخدم الوكلاء الفرعيون مسار قائمة انتظار مخصص داخل العملية:- اسم المسار:
subagent - التزامن:
agents.defaults.subagents.maxConcurrent(الافتراضي8)
الإيقاف
- إرسال
/stopفي دردشة الطالب يجهض جلسة الطالب ويوقف أي عمليات وكيل فرعي نشطة تم إنشاؤها منها، مع التسلسل إلى الأبناء المتداخلين. /subagents kill <id>يوقف وكيلًا فرعيًا محددًا ويتسلسل إلى أبنائه.
القيود
- إعلان الوكيل الفرعي بنمط best-effort. إذا أُعيد تشغيل البوابة، يتم فقدان أعمال “announce back” المعلقة.
- لا يزال الوكلاء الفرعيون يشاركون نفس موارد عملية البوابة؛ استخدم
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).