Messages and delivery

قائمة انتظار الأوامر

يسلسل OpenClaw عمليات الرد التلقائي الواردة (عبر جميع القنوات) من خلال طابور صغير داخل العملية لمنع تعارض عمليات الوكيل المتعددة، مع الاستمرار في إتاحة التوازي الآمن بين الجلسات.

لماذا

  • قد تكون عمليات الرد التلقائي مكلفة (استدعاءات LLM)، وقد تتعارض عند وصول عدة رسائل واردة في أوقات متقاربة.
  • يمنع التسلسل التنافس على الموارد المشتركة (ملفات الجلسات والسجلات وstdin الخاص بـ CLI)، ويقلل احتمال بلوغ حدود المعدل لدى الجهة المقدّمة.

آلية العمل

  • يفرّغ طابور FIFO مدرك للمسارات كل مسار وفق حد تزامن قابل للتهيئة (الافتراضي 1 للمسارات غير المهيأة؛ والقيمة الافتراضية لـmain هي 4 ولـsubagent هي 8).
  • تضع runEmbeddedAgent العمليات في الطابور حسب مفتاح الجلسة (المسار session:<key>) لضمان وجود عملية نشطة واحدة فقط لكل جلسة.
  • تُوضع كل عملية جلسة بعد ذلك في مسار عام (main افتراضيًا)، بحيث يكون التوازي الإجمالي محدودًا بواسطة agents.defaults.maxConcurrent.
  • عند تمكين التسجيل التفصيلي، تصدر العمليات الموضوعة في الطابور إشعارًا موجزًا إذا انتظرت أكثر من نحو ثانيتين قبل البدء.
  • تظل مؤشرات الكتابة تعمل فور وضع العملية في الطابور (عندما تدعمها القناة)، بحيث لا تتغير تجربة المستخدم أثناء انتظار العملية لدورها.

القيم الافتراضية

عند عدم تعيينها، تستخدم جميع واجهات القنوات الواردة ما يلي:

  • mode: "steer"
  • debounceMs: 500
  • cap: 20
  • drop: "summarize"

التوجيه ضمن الدورة نفسها هو السلوك الافتراضي. تُحقن المطالبة التي تصل في أثناء العملية في بيئة التشغيل النشطة عندما تكون العملية قادرة على قبول التوجيه، ولذلك لا تبدأ عملية جلسة ثانية. إذا تعذر على العملية النشطة قبول التوجيه، ينتظر OpenClaw انتهاء العملية النشطة قبل بدء المطالبة.

أوضاع الطابور

يتحكم /queue في كيفية التعامل مع الرسائل الواردة العادية عندما تكون للجلسة عملية نشطة بالفعل:

  • steer: يحقن الرسائل في بيئة التشغيل النشطة. يسلّم OpenClaw جميع رسائل التوجيه المعلّقة بعد انتهاء دورة المساعد الحالية من تنفيذ استدعاءات أدواتها وقبل استدعاء LLM التالي؛ ويتلقى خادم تطبيق Codex دفعة واحدة من turn/steer. إذا لم تكن العملية تبث بنشاط أو لم يكن التوجيه متاحًا، ينتظر OpenClaw انتهاء العملية النشطة قبل بدء المطالبة.
  • followup: لا يوجّه. يضع كل رسالة في الطابور لدورة وكيل لاحقة بعد انتهاء العملية الحالية.
  • collect: لا يوجّه. يدمج الرسائل الموضوعة في الطابور في دورة متابعة واحدة بعد نافذة الهدوء. إذا استهدفت الرسائل قنوات أو سلاسل محادثة مختلفة، فتُفرغ كل منها على حدة للحفاظ على التوجيه.
  • interrupt: يُجهض العملية النشطة لتلك الجلسة، ثم يشغّل أحدث رسالة.

لمعرفة توقيت بيئة التشغيل وسلوك التبعيات الخاصين بكل بيئة، راجع طابور التوجيه. وللاطلاع على الأمر الصريح /steer <message>، راجع التوجيه.

يمكن التهيئة عموميًا أو لكل قناة عبر messages.queue:

json5
{  messages: {    queue: {      mode: "steer",      debounceMs: 500,      cap: 20,      drop: "summarize",      byChannel: { discord: "collect" },    },  },}

خيارات الطابور

تنطبق الخيارات على التسليم من الطابور. يحدد debounceMs أيضًا نافذة هدوء توجيه Codex في وضع steer:

  • debounceMs: نافذة الهدوء قبل تفريغ رسائل المتابعة الموضوعة في الطابور أو دفعات التجميع؛ وفي وضع steer الخاص بـCodex، نافذة الهدوء قبل إرسال دفعة turn/steer. تمثل الأرقام المجردة أجزاء من ألف من الثانية؛ وتقبل خيارات /queue الوحدات ms وs وm وh وd.
  • cap: الحد الأقصى للرسائل الموضوعة في الطابور لكل جلسة. تُتجاهل القيم الأقل من 1.
  • drop: "summarize" (الافتراضي): يحذف أقدم الإدخالات الموضوعة في الطابور عند الحاجة، ويحتفظ بملخصات موجزة، ويحقنها كمطالبة متابعة اصطناعية.
  • drop: "old": يحذف أقدم الإدخالات الموضوعة في الطابور عند الحاجة، من دون الاحتفاظ بالملخصات.
  • drop: "new": يرفض أحدث رسالة عندما يكون الطابور ممتلئًا بالفعل.

القيم الافتراضية: debounceMs: 500 وcap: 20 وdrop: summarize.

التوجيه والبث

عندما يكون بث القناة partial أو block، قد يظهر التوجيه في صورة عدة ردود مرئية قصيرة بينما تبلغ العملية النشطة حدود بيئة التشغيل:

  • partial: قد تُنهى المعاينة مبكرًا، ثم تبدأ معاينة جديدة بعد قبول التوجيه.
  • block: قد تُنشئ الكتل بحجم المسودة المظهر التسلسلي نفسه.
  • من دون البث، يعود التوجيه إلى متابعة بعد العملية النشطة عندما يتعذر على بيئة التشغيل قبول التوجيه ضمن الدورة نفسها.

لا يُجهض steer الأدوات قيد التنفيذ. استخدم /queue interrupt عندما ينبغي لأحدث رسالة إجهاض العملية الحالية.

ترتيب الأولوية

لاختيار الوضع، يحسم OpenClaw الإعداد وفق الترتيب التالي:

  1. تجاوز /queue المضمّن أو المخزّن لكل جلسة.
  2. messages.queue.byChannel.<channel>.
  3. messages.queue.mode.
  4. الوضع الافتراضي steer.

بالنسبة إلى الخيارات، تتقدم خيارات /queue المضمّنة أو المخزّنة على التهيئة. ثم يُطبّق تأخير القناة المحدد (messages.queue.debounceMsByChannel)، والقيم الافتراضية لتأخير Plugin، وخيارات messages.queue العامة، والقيم الافتراضية المضمّنة، بهذا الترتيب. يُعد cap وdrop خيارين عامين أو خاصين بالجلسة، وليسا مفتاحي تهيئة لكل قناة.

التجاوزات الخاصة بكل جلسة

  • أرسل /queue <steer|followup|collect|interrupt> كأمر مستقل لتخزين وضع الطابور للجلسة الحالية.
  • يمكن دمج الخيارات: /queue collect debounce:0.5s cap:25 drop:summarize
  • يمحو /queue default أو /queue reset تجاوز الجلسة.

إلغاء الدورات الموضوعة في الطابور

بينما تبقى مطالبة في طابور المتابعة أو التجميع (مثل وصول chat.send من TUI أو دردشة الويب أثناء نشاط دورة أخرى)، يحتفظ Gateway بهوية إلغاء يملكها Gateway لمعرّف runId الخاص بذلك العميل حتى يُشغّل المحتوى الموضوع في الطابور أو يُحذف. تتبع الهوية المحتوى المدمج في ملخص تجاوز السعة.

  • يلغي chat.abort المزود بمعرّف runId محدد تلك الدورة ما دامت في الطابور، إذا كان مقدم الطلب مخولًا (وفق قواعد الملكية نفسها المطبقة على العمليات النشطة).
  • يلغي chat.abort الخاص بجلسة من دون runId الدورات المخولة الموضوعة في الطابور أولًا، ثم يُجهض العمليات النشطة المخولة. يمنع هذا الترتيب تفريغ الطابور من ترقية عمل إلى جلسة متوقفة جزئيًا.
  • لا يمثّل مسح طابور الجلسة بالكامل من دون عمليات تحقق خاصة بكل مقدم طلب مسار الإيقاف للجلسات متعددة المالكين.
  • لا تُعرض فترات الانتظار في الطابور كعمليات وكيل نشطة ضمن sessions.list، ولا تملك دلالات مهلة العملية النشطة؛ فالمرحلة النشطة وحدها تملكها.

تمرر البرامج العميلة (بما فيها TUI) المطالبات التي تصل في أثناء العملية، وتدع Gateway يطبق وضع الطابور. يستخدم مفتاح Esc أو /stop إجهاضًا على نطاق الجلسة، حتى لا يؤدي فقدان المقابض المحلية إلى ترك مطالبة ما تزال في الطابور قيد التشغيل.

النطاق والضمانات

  • ينطبق على عمليات وكيل الرد التلقائي عبر جميع القنوات الواردة التي تستخدم مسار رد Gateway (ويب WhatsApp وTelegram وSlack وDiscord وSignal وiMessage ودردشة الويب وغيرها).
  • يكون المسار الافتراضي (main) على مستوى العملية للرسائل الواردة ونبضات Heartbeat الرئيسية؛ اضبط agents.defaults.maxConcurrent للسماح بتشغيل عدة جلسات بالتوازي.
  • قد توجد مسارات إضافية (مثل cron وcron-nested وnested وsubagent) حتى تعمل المهام الخلفية بالتوازي من دون حظر الردود الواردة. تشغل دورات وكيل Cron المعزولة خانة cron بينما يستخدم تنفيذ الوكيل الداخلي cron-nested؛ ويستخدم كلاهما cron.maxConcurrentRuns. تحتفظ تدفقات nested المشتركة غير التابعة لـCron بسلوك مسارها الخاص. تُتتبّع هذه العمليات المنفصلة بوصفها مهام خلفية.
  • تضمن المسارات الخاصة بكل جلسة أن تلمس عملية وكيل واحدة فقط جلسة معينة في كل مرة.
  • لا توجد تبعيات خارجية أو خيوط عامل في الخلفية؛ بل TypeScript خالص مع الوعود.

استكشاف الأخطاء وإصلاحها

  • إذا بدت الأوامر عالقة، فمكّن السجلات التفصيلية وابحث عن الأسطر "queued for ...ms" للتأكد من أن الطابور قيد التفريغ.
  • يقاطع محوّل Codex عمليات خادم تطبيق Codex التي تقبل دورة ثم تتوقف عن إصدار التقدم، حتى يمكن تحرير مسار الجلسة النشط بدلًا من انتظار مهلة العملية الخارجية.
  • عند تمكين التشخيصات، تُصنف الجلسات التي تبقى في processing بعد diagnostics.stuckSessionWarnMs من دون رصد أي تقدم في الرد أو الأداة أو الحالة أو الكتلة أو ACP وفق النشاط الحالي:
    • يُسجل العمل النشط ذو التقدم الحديث باسم session.long_running. كما تظل استدعاءات النموذج الصامتة المملوكة ضمن session.long_running حتى diagnostics.stuckSessionAbortMs، حتى لا تُصنف الجهات المقدّمة البطيئة أو غير الباثة على أنها متوقفة قبل الأوان.
    • يُسجل العمل النشط من دون تقدم حديث باسم session.stalled؛ وتتحول استدعاءات النموذج المملوكة واستدعاءات الأدوات المحظورة والعمليات المضمنة المتوقفة إلى session.stalled عند عتبة الإجهاض أو بعدها. ولا يُخفى نشاط النموذج أو الأداة القديم غير المملوك باعتباره طويل التشغيل.
    • يُحجز session.stuck لسجلات الجلسة القديمة القابلة للاسترداد، بما في ذلك الجلسات الخاملة الموضوعة في الطابور ذات نشاط النموذج أو الأداة القديم غير المملوك.
    • يؤدي session.stuck دائمًا إلى استرداد يمكنه تحرير مسار الجلسة المتأثر. ويمكن أيضًا لتصنيف session.stalled بعد diagnostics.stuckSessionAbortMs (استدعاء أداة محظور، أو استدعاء نموذج متوقف، أو عملية مضمنة متوقفة) تشغيل استرداد بإجهاض نشط، ولذلك يستطيع كلا التصنيفين فك طابور عالق، وليس session.stuck وحده.
    • تتباعد أسطر سجل التحذير المتكررة لـsession.stuck وsession.long_running تزايديًا ما دامت الجلسة بلا تغيير؛ ومع ذلك، تستمر محاولات الاسترداد عند كل نبضة Heartbeat بغض النظر عن هذا التباعد.

ذو صلة

Was this useful?
On this page

On this page