الانتقال إلى المحتوى الرئيسي

الوكلاء الفرعيون

الوكلاء الفرعيون هم عمليات تشغيل وكيل في الخلفية يتم إنشاؤها من عملية وكيل موجودة. يعملون في جلسة خاصة بهم (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).

كيفية التمكين

{
  agents: {
    defaults: {
      subagents: {
        maxSpawnDepth: 2, // السماح للوكلاء الفرعيين بإنشاء أبناء (الافتراضي: 1)
        maxChildrenPerAgent: 5, // الحد الأقصى للأبناء النشطين لكل جلسة وكيل (الافتراضي: 5)
        maxConcurrent: 8, // الحد الأقصى للتزامن على مستوى المسار العام (الافتراضي: 8)
      },
    },
  },
}

مستويات العمق

DepthSession key shapeRoleCan spawn?
0agent:<id>:mainالوكيل الرئيسيدائمًا
1agent:<id>:subagent:<uuid>وكيل فرعي (orchestrator عند السماح بالعمق 2)فقط إذا maxSpawnDepth >= 2
2agent:<id>:subagent:<uuid>:subagent:<uuid>وكيل فرعي-فرعي (عامل نهائي)أبدًا

سلسلة الإعلان (Announce chain)

تتدفق النتائج عائدًا عبر السلسلة:
  1. ينتهي عامل العمق-2 → يعلن إلى والده (orchestrator في العمق-1)
  2. يستقبل orchestrator في العمق-1 الإعلان، يركّب النتائج، ينتهي → يعلن إلى الرئيسي
  3. يستقبل الوكيل الرئيسي الإعلان ويقوم بالتسليم إلى المستخدم
كل مستوى يرى فقط إعلانات أبنائه المباشرين.

سياسة الأدوات حسب العمق

  • العمق 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؛ ملفات تعريف الوكيل تتغلب عند التعارض.
ملاحظة: الدمج تراكمي (additive)، لذا تظل ملفات تعريف الرئيسي متاحة دائمًا كخيارات احتياطية. العزل الكامل للمصادقة لكل وكيل غير مدعوم حاليًا.

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_list
  • sessions_history
  • sessions_send
  • sessions_spawn
عند تعيين maxSpawnDepth >= 2، يحصل وكلاء العمق-1 من نوع orchestrator أيضًا على 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"]
      },
    },
  },
}

التزامن

يستخدم الوكلاء الفرعيون مسار قائمة انتظار مخصص داخل العملية:
  • اسم المسار: 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).