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 diorigin/main(dbf5eedac40, 2026-07-14).discourse-aiincluso 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)
- 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 aai_bot_allowed_groups. - In un argomento pubblico,
@menzionail bot in un post in modo che risponda. - 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). - Osserva: viene aggiunto un nuovo post di risposta del bot invece di rigenerare quello esistente. Ripetendo “Riprova” si aggiunge un post extra ogni volta.
- 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) accodaJobs::CreateAiReplyconreply_post_id: post.id— ovvero “rigenera questo post esistente.”Jobs::CreateAiReplylo carica comereply_poste lo passa aPlayground#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?→falseper gli argomenti pubblici (~riga 518).existing_reply_postviene consumato solo all’interno del ramoif stream_reply(reply_post = existing_reply_post, ~riga 538).- Il ramo
elsenon in streaming (~riga 662) esegue incondizionatamentePostCreator.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.