بوت الذكاء الاصطناعي "Retry" ينشئ ردًا مكررًا بدلاً من إعادة التوليد، في المواضيع العامة (غير الرسائل الخاصة)

الخطورة

عادية — لكنها مصدر إزعاج كبير في المواضيع العامة المزدحمة: يؤدي النقر المتكرر على زر “إعادة المحاولة” إلى إغراق الموضوع بمشاركات مكررة من البوت، مما يعطي الأعضاء انطباعاً بأن البوت “ينشر بمفرده / عالق في حلقة تكرار”.

المنصة

  • الخادم: Discourse core main (سلسلة 2026.7.x)، تم إعادة إنتاج المشكلة مع أحدث نسخة من origin/main (dbf5eedac40، 2026-07-14). تم تضمين discourse-ai في النواة.
  • العميل: تم إعادة إنتاج المشكلة من متصفحات/أجهزة متعددة (Chrome على سطح المكتب، Chrome على Android، Safari على iOS) — إنها مشكلة جانب الخادم، لذا لا يهم نوع العميل.

الوصف

النتيجة الفعلية: في موضوع عام، يؤدي النقر على إعادة المحاولة في رد بوت الذكاء الاصطناعي إلى إضافة مشاركة جديدة تماماً من البوت إلى الموضوع. يترك الرد الأصلي دون تعديل، لذا تضيف كل محاولة إعادة مشاركة إضافية. N محاولات إعادة → N مشاركات إضافية.

النتيجة المتوقعة: يجب أن تقوم إعادة المحاولة بإعادة توليد رد البوت الحالي في مكانه (استبدال محتواه)، بنفس الطريقة التي يعمل بها داخل محادثة رسائل خاصة / رسائل مباشرة مع بوت الذكاء الاصطناعي. لا ينبغي إنشاء مشاركة جديدة.

خطوات إعادة الإنتاج (من نسخة Discourse جديدة)

  1. فعّل Discourse AI + AI bot؛ أنشئ/فعّل وكيلاً (شخصية) للذكاء الاصطناعي مع مستخدم بوت، وفعّل خيار “السماح بذكر الموضوعات” حتى يتمكن من الإجابة في المواضيع العامة (allow_topic_mentions). أضف مجموعة مستخدمك إلى المجموعات المسموح بها للوكيل وإلى ai_bot_allowed_groups.
  2. في موضوع عام، قم بـ @mention البوت في مشاركة حتى يرد.
  3. في رد البوت، افتح قائمة المسؤول/المفتاح الخاصة بالمشاركة وانقر على إعادة المحاولة (إجراء إعادة التوليد → POST /discourse-ai/ai-bot/post/:post_id/retry).
  4. الملاحظة: يتم إضافة رد جديد من البوت بدلاً من إعادة توليد الرد الحالي. كرر إعادة المحاولة → مشاركة إضافية في كل مرة.
  5. للتباين، قم بنفس الإجراء داخل رسالة خاصة مع البوت: تعيد المحاولة بشكل صحيح التوليد في مكانها (بدون تكرار). التباين بين الرسائل الخاصة والموضوع العام هو الدليل على المشكلة.

تظهر المشكلة بنسبة 100% من الوقت في المواضيع العامة.

السبب الجذري (إشارات الكود، origin/main الحالي)

  • BotController#retry_response (plugins/discourse-ai/app/controllers/discourse_ai/ai_bot/bot_controller.rb) يضيف Jobs::CreateAiReply إلى قائمة الانتظار مع reply_post_id: post.id — أي “أعد توليد هذه المشاركة الموجودة”.
  • يحمل Jobs::CreateAiReply المشاركة كـ reply_post ويمررها إلى Playground#reply_to(..., existing_reply_post: reply_post).
  • في Playground#reply_to (plugins/discourse-ai/lib/ai_bot/playground.rb):
    • stream_reply = post.topic.private_message? if stream_reply.nil?false للمواضيع العامة (~L518).
    • يتم استخدام existing_reply_post فقط داخل فرع if stream_reply (reply_post = existing_reply_post، ~L538).
    • فرع else غير المتدفق (~L662) يقوم بشكل غير مشروط بـ PostCreator.create!(...)، مما يضيف مشاركة جديدة ولا يلمس المشاركة التي يتم إعادة تجربتها أبداً.

لذلك، في أي موضوع غير خاص، يتم تجاهل نية “إعادة التوليد في المكان” من retry_response بصمت، ويتم إنشاء نسخة مكررة بدلاً من ذلك. (هذا التباين يعني أيضاً أن ردود البوت في المواضيع العامة غير متدفقة، وهو السلوك السابق؛ لكن الخطأ محدد في أن existing_reply_post الخاص بإعادة المحاولة يتم تجاهله في هذا المسار.)

الإصلاح المقترح (اتجاه فقط)

احترم existing_reply_post بغض النظر عن التدفق — على سبيل المثال، في الفرع غير المتدفق، إذا كان existing_reply_post موجوداً، قم بـ revise (تعديل) المشاركة بدلاً من استدعاء PostCreator.create!؛ أو افصل قرار “إعادة استخدام المشاركة الموجودة” عن stream_reply.

الوضع الآمن

غير قابل للتطبيق — سلوك إضافي جانب الخادم، مستقل عن سمات/كود JavaScript للموقع.

إعجاب واحد (1)