Messages and delivery
قائمة انتظار الأوامر
نُسلسِل عمليات الرد التلقائي الواردة (كل القنوات) عبر طابور صغير داخل العملية لمنع تصادم عدة عمليات وكيل، مع السماح بالتوازي الآمن عبر الجلسات.
لماذا
- يمكن أن تكون عمليات الرد التلقائي مكلفة (استدعاءات LLM) ويمكن أن تتصادم عند وصول عدة رسائل واردة في وقت متقارب.
- التسلسل يتجنب التنافس على الموارد المشتركة (ملفات الجلسات، السجلات، إدخال CLI القياسي) ويقلل احتمال حدود المعدل من الجهات العليا.
كيف يعمل
- يفرغ طابور FIFO واع بالمسارات كل مسار بحد تزامن قابل للضبط (الافتراضي 1 للمسارات غير المضبوطة؛ الافتراضي للمسار main هو 4، وللمسار subagent هو 8).
- يضع
runEmbeddedPiAgentالعملية في الطابور حسب مفتاح الجلسة (المسارsession:<key>) لضمان وجود عملية نشطة واحدة فقط لكل جلسة. - ثم توضع كل عملية جلسة في مسار عام (
mainافتراضيا) بحيث يكون إجمالي التوازي محدودا بواسطةagents.defaults.maxConcurrent. - عند تفعيل التسجيل المطول، تصدر العمليات الموضوعة في الطابور تنبيها قصيرا إذا انتظرت أكثر من نحو ثانيتين قبل البدء.
- تستمر مؤشرات الكتابة في العمل فورا عند الإضافة إلى الطابور (عندما تدعمها القناة)، لذلك تبقى تجربة المستخدم بلا تغيير أثناء انتظار الدور.
الافتراضيات
عند عدم الضبط، تستخدم كل أسطح القنوات الواردة:
mode: "steer"debounceMs: 500cap: 20drop: "summarize"
steer هو الافتراضي لأنه يحافظ على استجابة دورة النموذج النشطة دون
بدء عملية جلسة ثانية. وهو يفرغ كل رسائل التوجيه التي وصلت
قبل حد النموذج التالي. إذا تعذر على العملية الحالية قبول التوجيه،
يتراجع OpenClaw إلى إدخال طابور متابعة.
أوضاع الطابور
يمكن للرسائل الواردة توجيه العملية الحالية، أو انتظار دورة متابعة، أو فعل الأمرين معا:
steer: يضع رسائل التوجيه في طابور وقت التشغيل النشط. يسلم Pi كل رسائل التوجيه المعلقة بعد أن تنهي دورة المساعد الحالية تنفيذ استدعاءات أدواتها، وقبل استدعاء LLM التالي؛ ويتلقى خادم تطبيق Codex طلبturn/steerواحدا مجمعا. إذا لم تكن العملية تبث بنشاط أو لم يكن التوجيه متاحا، يتراجع OpenClaw إلى إدخال طابور متابعة.queue(قديم): توجيه قديم واحد في كل مرة. يسلم Pi رسالة توجيه واحدة من الطابور عند كل حد نموذج؛ ويتلقى خادم تطبيق Codex طلباتturn/steerمنفصلة. فضّلsteerما لم تكن تحتاج إلى السلوك المتسلسل السابق.followup: يضع كل رسالة في الطابور لدورة وكيل لاحقة بعد انتهاء العملية الحالية.collect: يدمج الرسائل الموضوعة في الطابور في دورة متابعة واحدة بعد نافذة الهدوء. إذا كانت الرسائل تستهدف قنوات/سلاسل مختلفة، فتفرغ بشكل فردي للحفاظ على التوجيه.steer-backlog(ويعرف أيضا باسمsteer+backlog): يوجه الآن ويحفظ الرسالة نفسها لدورة متابعة.interrupt(قديم): يجهض العملية النشطة لتلك الجلسة، ثم يشغل أحدث رسالة.
يعني Steer-backlog أنك قد تحصل على رد متابعة بعد العملية الموجهة، لذلك
قد تبدو أسطح البث كأنها مكررة. فضّل collect/steer إذا أردت
ردا واحدا لكل رسالة واردة.
لسلوك التوقيت والاعتمادات الخاص بوقت التشغيل، راجع
طابور التوجيه. ولأمر /steer <message>
الصريح، راجع توجيه.
اضبطه عالميا أو لكل قناة عبر messages.queue:
{
messages: {
queue: {
mode: "steer",
debounceMs: 500,
cap: 20,
drop: "summarize",
byChannel: { discord: "collect" },
},
},
}
خيارات الطابور
تنطبق الخيارات على followup وcollect وsteer-backlog (وكذلك على steer أو queue القديم عندما يتراجع التوجيه إلى المتابعة):
debounceMs: نافذة الهدوء قبل تفريغ المتابعات الموضوعة في الطابور. الأرقام المجردة هي بالمللي ثانية؛ وتقبل خيارات/queueالوحداتmsوsوmوhوd.cap: الحد الأقصى للرسائل الموضوعة في الطابور لكل جلسة. القيم الأقل من1يتم تجاهلها.drop: "summarize": الافتراضي. إسقاط أقدم الإدخالات الموضوعة في الطابور عند الحاجة، والاحتفاظ بملخصات مضغوطة، وحقنها كموجه متابعة اصطناعي.drop: "old": إسقاط أقدم الإدخالات الموضوعة في الطابور عند الحاجة، دون حفظ الملخصات.drop: "new": رفض أحدث رسالة عندما يكون الطابور ممتلئا بالفعل.
الافتراضيات: debounceMs: 500، وcap: 20، وdrop: summarize.
الأسبقية
لاختيار الوضع، يحل OpenClaw بالترتيب:
- تجاوز
/queueمضمن أو مخزن لكل جلسة. messages.queue.byChannel.<channel>.messages.queue.mode.steerالافتراضي.
بالنسبة إلى الخيارات، تتغلب خيارات /queue المضمنة أو المخزنة على الإعداد. ثم
تطبق مهلة إزالة الارتداد الخاصة بالقناة (messages.queue.debounceMsByChannel)، وافتراضيات مهلة إزالة الارتداد في Plugin،
وخيارات messages.queue العامة، والافتراضيات المدمجة. cap وdrop خياران عامان/خاصان بالجلسة، وليسا مفاتيح إعداد لكل قناة.
التجاوزات لكل جلسة
- أرسل
/queue <mode>كأمر مستقل لتخزين الوضع للجلسة الحالية. - يمكن دمج الخيارات:
/queue collect debounce:0.5s cap:25 drop:summarize - يمسح
/queue defaultأو/queue resetتجاوز الجلسة.
النطاق والضمانات
- ينطبق على عمليات وكلاء الرد التلقائي عبر كل القنوات الواردة التي تستخدم مسار ردود Gateway (WhatsApp web، و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.stalled؛ أماsession.stuckفمحجوز لمسك سجلات الجلسات القديمة دون عمل نشط، وهذا المسار وحده يمكنه تحرير مسار الجلسة المتأثر كي يفرغ العمل الموضوع في الطابور. تتراجع تشخيصاتsession.stuckالمتكررة ما دامت الجلسة بلا تغيير.