Messages and delivery
الرسائل
تنتقل الرسائل الواردة عبر التوجيه، وإزالة التكرار/التجميع المؤجل، وتشغيل الوكيل، والتسليم الصادر:
رسالة واردة -> التوجيه/الارتباطات -> مفتاح الجلسة -> إزالة التكرار + التجميع المؤجل -> قائمة الانتظار (إذا كان هناك تشغيل نشط بالفعل) -> تشغيل الوكيل (البث + الأدوات) -> الردود الصادرة (حدود القناة + التجزئة)أسطح الإعداد الرئيسية:
messages.*للبادئات، ووضع الرسائل في قائمة الانتظار، والتجميع المؤجل للرسائل الواردة، وسلوك المجموعات.agents.defaults.*لبث الكتل، والتجزئة، والإعدادات الافتراضية للرد الصامت.- تجاوزات القنوات (
channels.telegram.*، وchannels.whatsapp.*، وما إلى ذلك) للحدود الخاصة بكل قناة ومفاتيح تبديل البث.
راجع الإعداد للاطلاع على المخطط الكامل.
إزالة تكرار الرسائل الواردة
قد تعيد القنوات تسليم الرسالة نفسها بعد إعادة الاتصال. يحتفظ OpenClaw بذاكرة تخزين مؤقت داخل الذاكرة، مفهرسة حسب نطاق الوكيل ومسار القناة (القناة + الطرف النظير + الحساب + سلسلة المحادثة) ومعرّف الرسالة، كي لا تؤدي الرسالة المعاد تسليمها إلى تشغيل الوكيل مرة ثانية. تنتهي صلاحية إدخال ذاكرة التخزين المؤقت بعد 20 دقيقة أو بمجرد تتبع 5000 إدخال، أيهما يحدث أولًا.
التجميع المؤجل للرسائل الواردة
يمكن تجميع الرسائل النصية المتتالية والسريعة من المرسل نفسه في دور واحد للوكيل عبر messages.inbound. يُطبّق التجميع المؤجل ضمن نطاق كل قناة + محادثة، ويستخدم أحدث رسالة لسلسلة الردود/المعرّفات.
{ messages: { inbound: { debounceMs: 2000, byChannel: { discord: 1500, slack: 1500, whatsapp: 5000, }, }, },}- ينطبق التجميع المؤجل على الرسائل النصية فقط؛ وتؤدي الوسائط/المرفقات إلى الإرسال الفوري.
- تتجاوز أوامر التحكم (الإيقاف/الإلغاء/الحالة، وما إلى ذلك) التجميع المؤجل كي تُرسَل فورًا.
- معطّل افتراضيًا: لا يملك
messages.inbound.debounceMsقيمة افتراضية مضمّنة، لذا لا يُفعّل التجميع المؤجل إلا بعد ضبطه (عموميًا أو لكل قناة). - يمثل الاشتراك الاختياري في
coalesceSameSenderDmsضمن iMessage الاستثناء الوحيد: إذ يحتفظ بجميع نصوص الرسائل المباشرة من المرسل نفسه (بما فيها الأوامر) مدة تكفي لوصول الإرسال المجزأ من Apple للأمر+عنوان URL باعتباره دورًا واحدًا. تُرسَل محادثات المجموعات دائمًا فورًا بغض النظر عن هذا الإعداد.
الجلسات والأجهزة
يمتلك Gateway الجلسات، وليس العملاء.
- تُدمج المحادثات المباشرة في مفتاح الجلسة الرئيسية للوكيل.
- تحصل المجموعات/القنوات على مفاتيح جلسات خاصة بها.
- يوجد مخزن الجلسات والنصوص المسجلة على مضيف Gateway.
يمكن ربط أجهزة/قنوات متعددة بالجلسة نفسها، لكن لا تتم مزامنة السجل بالكامل مرة أخرى مع كل عميل. استخدم جهازًا أساسيًا واحدًا للمحادثات الطويلة لتجنب تباعد السياق. تعرض واجهة التحكم وTUI دائمًا نص الجلسة المسجل والمدعوم من Gateway، ولذلك فهما مصدر الحقيقة.
التفاصيل: إدارة الجلسات.
نصوص المطالبات وسياق السجل
تملأ Plugins القنوات عدة حقول نصية في السياق الوارد، مرتبة من الأكثر إلى الأقل تفضيلًا:
| الحقل | الغرض |
|---|---|
BodyForAgent |
النص المعروض للنموذج للدور الحالي. يرجع إلى CommandBody / RawBody / Body عند عدم ضبطه. |
BodyForCommands |
نص نظيف يُستخدم لتحليل التوجيهات/الأوامر. يرجع إلى CommandBody / RawBody / Body عند عدم ضبطه. |
CommandBody |
نص وسيط قديم؛ يُفضّل BodyForCommands. |
RawBody |
اسم مستعار مهمل لـ CommandBody. |
Body |
نص مطالبة قديم؛ قد يتضمن أغلفة القنوات وأغلفة السجل. |
عندما توفر قناة سجلًا، فإنها تغلفه باستخدام:
[Chat messages since your last reply - for context][Current message - respond to this]
بالنسبة إلى المحادثات غير المباشرة (المجموعات/القنوات/الغرف)، يُسبَق نص الرسالة الحالية بتسمية المرسل، بما يطابق النمط المستخدم لإدخالات السجل. لا تنطبق إزالة التوجيهات إلا على قسم الرسالة الحالية، ولذلك يظل السجل دون تغيير. ينبغي للقنوات التي تغلف السجل ضبط BodyForCommands (أو CommandBody / RawBody القديمين) على نص الرسالة الأصلي، والإبقاء على Body بوصفه المطالبة المدمجة.
مخازن السجل المؤقتة مخصصة للرسائل المعلقة فقط: فهي تتضمن رسائل المجموعات التي لم تؤدِ إلى تشغيل (مثل الرسائل الخاضعة لاشتراط الإشارة)، وتستبعد الرسائل الموجودة بالفعل في نص الجلسة المسجل. يُعرض السجل المنظم وبيانات الرد وإعادة التوجيه والبيانات الوصفية للقناة باعتبارها كتل سياق غير موثوقة بدور المستخدم أثناء تجميع المطالبة.
اضبط حجم السجل باستخدام messages.groupChat.historyLimit (القيمة الافتراضية العامة) أو تجاوزات خاصة بكل قناة مثل channels.slack.historyLimit وchannels.telegram.accounts.<id>.historyLimit (اضبط 0 للتعطيل).
البيانات الوصفية لنتائج الأدوات
يمثل content في نتيجة الأداة النتيجة المرئية للنموذج؛ أما details فهو بيانات وصفية لوقت التشغيل تُستخدم في عرض واجهة المستخدم والتشخيصات وتسليم الوسائط وPlugins.
- تتم إزالة
toolResult.detailsقبل إعادة التشغيل لدى المزوّد وقبل إدخال Compaction. - لا تحتفظ نصوص الجلسات المسجلة والمخزنة إلا بـ
detailsمحدود الحجم؛ وتُستبدل البيانات الوصفية المفرطة الحجم بملخص موجز يحمل العلامةpersistedDetailsTruncated: true. - ينبغي لـ Plugins والأدوات وضع النص الذي يجب أن يقرأه النموذج في
content، وليس فيdetailsفقط.
قائمة الانتظار والمتابعات
عندما يكون هناك تشغيل نشط بالفعل، توجه الرسائل الواردة إليه افتراضيًا. يتحكم messages.queue في الوضع:
| الوضع | السلوك |
|---|---|
steer (الافتراضي) |
إدخال المطالبة الجديدة في التشغيل النشط. |
followup |
تشغيل الرسالة بعد انتهاء التشغيل النشط. |
collect |
تجميع الرسائل المتوافقة في دور لاحق واحد. |
interrupt |
إلغاء التشغيل النشط، ثم بدء أحدث مطالبة. |
القيم الافتراضية: قيمة messages.queue.debounceMs هي 500ms (تنطبق بالتساوي على تجميع التوجيه والمتابعة والجمع)، وقيمة messages.queue.cap هي 20 رسالة في قائمة الانتظار، وقيمة messages.queue.drop هي summarize (يتوفر أيضًا old وnew). اضبط التجاوزات الخاصة بكل قناة عبر messages.queue.byChannel وmessages.queue.debounceMsByChannel.
التفاصيل: قائمة انتظار الأوامر وقائمة انتظار التوجيه.
ملكية تشغيل القناة
يمكن لـ Plugins القنوات الحفاظ على الترتيب، وتجميع المدخلات مؤجلًا، وتطبيق ضغط عكسي للنقل قبل دخول الرسالة إلى قائمة انتظار الجلسة. وينبغي ألا تفرض مهلة منفصلة حول دور الوكيل نفسه. بمجرد توجيه رسالة إلى جلسة، تتحكم دورة حياة الجلسة والأداة ووقت التشغيل في العمل طويل الأمد، كي تُبلغ جميع القنوات عن الأدوار البطيئة وتتعافى منها بصورة متسقة.
البث والتجزئة والتجميع
يرسل بث الكتل ردودًا جزئية بينما ينتج النموذج كتل النص؛ وتحترم التجزئة حدود النص في القناة وتتجنب تقسيم كتل التعليمات البرمجية المسيّجة.
agents.defaults.blockStreamingDefault(on|off، القيمة الافتراضيةoff)agents.defaults.blockStreamingBreak(text_end|message_end)agents.defaults.blockStreamingChunk(minChars|maxChars|breakPreference)agents.defaults.blockStreamingCoalesce(تجميع قائم على الخمول)agents.defaults.humanDelay(توقف شبيه بالبشر بين ردود الكتل)- تجاوزات القنوات:
*.streaming.block.enabledو*.streaming.block.coalesceفي القنوات المضمّنة؛ ويرحّلopenclaw doctor --fixالمفاتيح المسطحة القديمة. يكون بث الكتل متوقفًا ما لم يُفعّل صراحةً، في كل قناة بما فيها Telegram. ويُعد QQ Bot الاستثناء: فهو لا يملك مفاتيحstreaming.blockويبث ردود الكتل ما لم تكن قيمةchannels.qqbot.streaming.modeهي"off".
التفاصيل: البث + التجزئة.
ظهور الاستدلال والرموز
- يتحكم
/reasoning on|off|streamفي الظهور. - يظل محتوى الاستدلال محسوبًا ضمن استخدام الرموز عندما ينتجه النموذج.
- يدعم Telegram بث الاستدلال في فقاعة مسودة مؤقتة تُحذف بعد التسليم النهائي؛ استخدم
/reasoning onلإخراج الاستدلال الدائم.
التفاصيل: توجيهات التفكير + الاستدلال واستخدام الرموز.
البادئات وسلاسل المحادثات والردود
- تسلسل البادئات الصادرة:
messages.responsePrefix، وchannels.<channel>.responsePrefix، وchannels.<channel>.accounts.<id>.responsePrefix. يملك WhatsApp أيضًاchannels.whatsapp.messagePrefixللبادئة الواردة. - سلسلة الردود عبر
replyToModeوالقيم الافتراضية الخاصة بكل قناة.
التفاصيل: الإعداد ووثائق القنوات.
الردود الصامتة
يعني الرمز الصامت NO_REPLY (غير حساس لحالة الأحرف، ولذلك يطابق no_reply أيضًا) «عدم تسليم رد مرئي للمستخدم». عندما يحتوي الدور أيضًا على وسائط أدوات معلقة، مثل صوت TTS مولّد، يزيل OpenClaw النص الصامت لكنه يظل يسلّم مرفق الوسائط.
تُحدّد سياسة الصمت حسب نوع المحادثة:
- لا تتلقى المحادثات المباشرة أبدًا إرشادات مطالبة
NO_REPLY. إذا أعاد تشغيل مباشر رمزًا صامتًا مجردًا عن طريق الخطأ، يكبته OpenClaw بدلًا من إعادة كتابته أو تسليمه. - تسمح المجموعات/القنوات بالصمت افتراضيًا. في وضع الرد المرئي
message_tool، يعني الصمت أن النموذج لا يستدعيmessage(action=send). - يسمح التنسيق الداخلي بالصمت افتراضيًا.
توجد القيم الافتراضية ضمن agents.defaults.silentReply؛ ويمكن لـ surfaces.<id>.silentReply تجاوز سياسة المجموعات/العمليات الداخلية لكل سطح.
يستخدم OpenClaw أيضًا الردود الصامتة لإخفاقات المشغّل الداخلية العامة في المحادثات غير المباشرة، كي لا ترى المجموعات/القنوات النصوص النمطية لأخطاء Gateway. ولا يزال من الممكن تسليم الإخفاقات المصنفة التي تتضمن نص استرداد موجّهًا للمستخدم، مثل إشعارات فقدان المصادقة أو حد المعدل أو الحمل الزائد. تعرض المحادثات المباشرة نص إخفاق موجزًا افتراضيًا؛ ولا تظهر تفاصيل المشغّل الخام إلا عند تفعيل /verbose full.
تُسقط الردود الصامتة المجردة على جميع الأسطح، كي تظل الجلسات الأصلية صامتة بدلًا من إعادة كتابة نص الحارس إلى كلام احتياطي.
ذو صلة
- إعادة هيكلة دورة حياة الرسائل - التصميم المستهدف الدائم للإرسال والاستلام
- البث - تسليم الرسائل في الوقت الفعلي
- إعادة المحاولة - سلوك إعادة محاولة تسليم الرسائل
- قائمة الانتظار - قائمة انتظار معالجة الرسائل
- القنوات - تكاملات منصات المراسلة