El bot de IA "Retry" crea una respuesta duplicada en lugar de regenerarla, en temas públicos (no PM)

Gravedad

Normal, pero con alto nivel de molestia en temas públicos con mucho tráfico: los clics repetidos en «Reintentar» inundan el tema con publicaciones duplicadas del bot, por lo que para los miembros parece que el bot está «publicando por su cuenta / atascado en un bucle».

Plataforma

  • Servidor: Discourse core main (rama 2026.7.x), reproducido contra la última versión de origin/main (dbf5eedac40, 2026-07-14). discourse-ai incluido en el núcleo.
  • Cliente: reproducido desde múltiples navegadores/dispositivos (Chrome de escritorio, Chrome para Android, Safari para iOS): al ser un problema del servidor, el cliente es irrelevante.

Descripción

Resultado actual: En un tema público, hacer clic en Reintentar en una respuesta del bot de IA añade una publicación nueva del bot al tema. La respuesta original se deja intacta, por lo que cada reintento añade otra publicación. N reintentos → N publicaciones extra.

Resultado esperado: Reintentar debería regenerar la respuesta existente del bot en su lugar (reemplazando su contenido), igual que lo hace dentro de una conversación de MP / DM con el bot de IA. No debería crearse ninguna publicación nueva.

Pasos para reproducir (desde una instalación fresca de Discourse)

  1. Habilita Discourse AI + el bot de IA; crea/habilita un agente (persona) de IA con un usuario bot y activa la opción «Permitir menciones en temas» para que pueda responder en temas públicos (allow_topic_mentions). Añade el grupo de tu usuario a los grupos permitidos del agente y a ai_bot_allowed_groups.
  2. En un tema público, @menciona al bot en una publicación para que responda.
  3. En la respuesta del bot, abre el menú de administración/arandelas de la publicación y haz clic en Reintentar (la acción de regenerar → POST /discourse-ai/ai-bot/post/:post_id/retry).
  4. Observa: se añade una nueva respuesta del bot en lugar de regenerar la existente. Repite el reintento → una publicación extra cada vez.
  5. Para contrastar, haz lo mismo dentro de un MP con el bot: Reintentar regenera correctamente en su lugar (sin duplicados). La divergencia entre MP y tema público es la clave.

Se reproduce el 100 % de las veces en temas públicos.

Causa raíz (punteros de código, origin/main actual)

  • BotController#retry_response (plugins/discourse-ai/app/controllers/discourse_ai/ai_bot/bot_controller.rb) encola Jobs::CreateAiReply con reply_post_id: post.id — es decir, «regenera esta publicación existente».
  • Jobs::CreateAiReply la carga como reply_post y la pasa a Playground#reply_to(..., existing_reply_post: reply_post).
  • En Playground#reply_to (plugins/discourse-ai/lib/ai_bot/playground.rb):
    • stream_reply = post.topic.private_message? if stream_reply.nil?false para temas públicos (~L518).
    • existing_reply_post solo se consume dentro de la rama if stream_reply (reply_post = existing_reply_post, ~L538).
    • La rama else no transmitida (~L662) hace incondicionalmente PostCreator.create!(...), añadiendo una nueva publicación y sin tocar nunca la publicación que se está reintentando.

Por lo tanto, en cualquier tema que no sea MP, la intención de «regenerar en su lugar» de retry_response se descarta silenciosamente y se crea un duplicado en su lugar. (La misma asimetría significa que las respuestas del bot en temas públicos no son transmitidas, que es el comportamiento preexistente; el error es específicamente que existing_reply_post de Reintentar se ignora en esa ruta).

Corrección sugerida (solo dirección)

Respetar existing_reply_post independientemente de la transmisión — por ejemplo, en la rama no transmitida, si existing_reply_post está presente, revise en lugar de llamar a PostCreator.create!; o desacoplar la decisión de «reutilizar publicación existente» de stream_reply.

Modo seguro

N/A — comportamiento del plugin del servidor, independiente de temas/JS del sitio.

1 me gusta