Messages and delivery
قائمة انتظار الأوامر
يسلسل OpenClaw عمليات الرد التلقائي الواردة (عبر جميع القنوات) من خلال طابور صغير داخل العملية لمنع تعارض عمليات الوكيل المتعددة، مع الاستمرار في إتاحة التوازي الآمن بين الجلسات.
لماذا
- قد تكون عمليات الرد التلقائي مكلفة (استدعاءات LLM)، وقد تتعارض عند وصول عدة رسائل واردة في أوقات متقاربة.
- يمنع التسلسل التنافس على الموارد المشتركة (ملفات الجلسات والسجلات و
stdinالخاص بـ CLI)، ويقلل احتمال بلوغ حدود المعدل لدى الجهة المقدّمة.
آلية العمل
- يفرّغ طابور FIFO مدرك للمسارات كل مسار وفق حد تزامن قابل للتهيئة (الافتراضي 1 للمسارات غير المهيأة؛ والقيمة الافتراضية لـ
mainهي 4 ولـsubagentهي 8). - تضع
runEmbeddedAgentالعمليات في الطابور حسب مفتاح الجلسة (المسارsession:<key>) لضمان وجود عملية نشطة واحدة فقط لكل جلسة. - تُوضع كل عملية جلسة بعد ذلك في مسار عام (
mainافتراضيًا)، بحيث يكون التوازي الإجمالي محدودًا بواسطةagents.defaults.maxConcurrent. - عند تمكين التسجيل التفصيلي، تصدر العمليات الموضوعة في الطابور إشعارًا موجزًا إذا انتظرت أكثر من نحو ثانيتين قبل البدء.
- تظل مؤشرات الكتابة تعمل فور وضع العملية في الطابور (عندما تدعمها القناة)، بحيث لا تتغير تجربة المستخدم أثناء انتظار العملية لدورها.
القيم الافتراضية
عند عدم تعيينها، تستخدم جميع واجهات القنوات الواردة ما يلي:
mode: "steer"debounceMs: 500cap: 20drop: "summarize"
التوجيه ضمن الدورة نفسها هو السلوك الافتراضي. تُحقن المطالبة التي تصل في أثناء العملية في بيئة التشغيل النشطة عندما تكون العملية قادرة على قبول التوجيه، ولذلك لا تبدأ عملية جلسة ثانية. إذا تعذر على العملية النشطة قبول التوجيه، ينتظر OpenClaw انتهاء العملية النشطة قبل بدء المطالبة.
أوضاع الطابور
يتحكم /queue في كيفية التعامل مع الرسائل الواردة العادية عندما تكون للجلسة عملية نشطة بالفعل:
steer: يحقن الرسائل في بيئة التشغيل النشطة. يسلّم OpenClaw جميع رسائل التوجيه المعلّقة بعد انتهاء دورة المساعد الحالية من تنفيذ استدعاءات أدواتها وقبل استدعاء LLM التالي؛ ويتلقى خادم تطبيق Codex دفعة واحدة منturn/steer. إذا لم تكن العملية تبث بنشاط أو لم يكن التوجيه متاحًا، ينتظر OpenClaw انتهاء العملية النشطة قبل بدء المطالبة.followup: لا يوجّه. يضع كل رسالة في الطابور لدورة وكيل لاحقة بعد انتهاء العملية الحالية.collect: لا يوجّه. يدمج الرسائل الموضوعة في الطابور في دورة متابعة واحدة بعد نافذة الهدوء. إذا استهدفت الرسائل قنوات أو سلاسل محادثة مختلفة، فتُفرغ كل منها على حدة للحفاظ على التوجيه.interrupt: يُجهض العملية النشطة لتلك الجلسة، ثم يشغّل أحدث رسالة.
لمعرفة توقيت بيئة التشغيل وسلوك التبعيات الخاصين بكل بيئة، راجع طابور التوجيه. وللاطلاع على الأمر الصريح /steer <message>، راجع التوجيه.
يمكن التهيئة عموميًا أو لكل قناة عبر messages.queue:
{ 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 الإعداد وفق الترتيب التالي:
- تجاوز
/queueالمضمّن أو المخزّن لكل جلسة. messages.queue.byChannel.<channel>.messages.queue.mode.- الوضع الافتراضي
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 بغض النظر عن هذا التباعد.
- يُسجل العمل النشط ذو التقدم الحديث باسم