Il bot AI “Retry” crea una risposta duplicata invece di rigenerarla, nei topic pubblici (non PM)

Gravità

Normale — ma altamente fastidiosa in argomenti pubblici molto attivi: clicchi ripetuti su “Riprova” inondano l’argomento con post duplicati del bot, dando agli utenti l’impressione che il bot stia “postando da solo / sia bloccato in un ciclo”.

Piattaforma

  • Server: Discourse core main (linea 2026.7.x), riprodotto sull’ultima versione di origin/main (dbf5eedac40, 2026-07-14). discourse-ai incluso nel core.
  • Client: riprodotto da diversi browser/dispositivi (Chrome desktop, Chrome Android, Safari iOS) — essendo un problema lato server, il client è irrilevante.

Descrizione

Risultato effettivo: In un argomento pubblico, cliccando su Riprova in una risposta del bot AI viene aggiunto un nuovo post del bot all’argomento. La risposta originale rimane invariata, quindi ogni tentativo di “Riprova” aggiunge un post aggiuntivo. N tentativi → N post extra.

Risultato atteso: “Riprova” dovrebbe rigenerare la risposta esistente del bot nello stesso posto (sostituendone il contenuto), come avviene nelle conversazioni PM / DM con il bot AI. Non dovrebbe essere creato alcun nuovo post.

Passaggi per riprodurre il problema (partendo da una nuova installazione di Discourse)

  1. Abilita Discourse AI + AI bot; crea/abilita un agente (persona) AI con un utente bot e attiva l’opzione “Consenti menzioni negli argomenti” (allow_topic_mentions) in modo che possa rispondere negli argomenti pubblici. Aggiungi il gruppo del tuo utente ai gruppi consentiti dell’agente e a ai_bot_allowed_groups.
  2. In un argomento pubblico, @menziona il bot in un post in modo che risponda.
  3. Nella risposta del bot, apri il menu amministrazione/chiave inglese del post e clicca su Riprova (l’azione di rigenerazione → POST /discourse-ai/ai-bot/post/:post_id/retry).
  4. Osserva: viene aggiunto un nuovo post di risposta del bot invece di rigenerare quello esistente. Ripetendo “Riprova” si aggiunge un post extra ogni volta.
  5. Per contrasto, esegui la stessa operazione in un PM con il bot: “Riprova” rigenera correttamente il post esistente (nessun duplicato). La divergenza tra PM e argomento pubblico è l’indicatore del problema.

Il problema si riproduce nel 100% dei casi negli argomenti pubblici.

Causa radice (riferimenti al codice, origin/main attuale)

  • BotController#retry_response (plugins/discourse-ai/app/controllers/discourse_ai/ai_bot/bot_controller.rb) accoda Jobs::CreateAiReply con reply_post_id: post.id — ovvero “rigenera questo post esistente.”
  • Jobs::CreateAiReply lo carica come reply_post e lo passa a Playground#reply_to(..., existing_reply_post: reply_post).
  • In Playground#reply_to (plugins/discourse-ai/lib/ai_bot/playground.rb):
    • stream_reply = post.topic.private_message? if stream_reply.nil?false per gli argomenti pubblici (~riga 518).
    • existing_reply_post viene consumato solo all’interno del ramo if stream_reply (reply_post = existing_reply_post, ~riga 538).
    • Il ramo else non in streaming (~riga 662) esegue incondizionatamente PostCreator.create!(...), aggiungendo un nuovo post e non toccando mai il post in fase di “Riprova”.

Quindi, per qualsiasi argomento non PM, l’intento di “rigenerare nello stesso posto” da retry_response viene silenziosamente ignorato e viene creato un duplicato. (La stessa asimmetria significa che le risposte del bot negli argomenti pubblici non sono in streaming, che è il comportamento preesistente; il bug è specificamente che existing_reply_post di “Riprova” viene ignorato in questo percorso.)

Correzione suggerita (solo direzione)

Rispettare existing_reply_post indipendentemente dallo streaming — ad esempio, nel ramo non in streaming, se existing_reply_post è presente, revisionarlo invece di chiamare PostCreator.create!; oppure disaccoppiare la decisione “riutilizza post esistente” da stream_reply.

Modalità sicura

N/D — comportamento del plugin lato server, indipendente da temi/JS del sito.

1 Mi Piace