Gravidade
Normal — mas causa grande incômodo em tópicos públicos movimentados: cliques repetidos em Tentar novamente inundam o tópico com publicações duplicadas do bot, fazendo com que, para os membros, pareça que o bot está “postando por conta própria / preso em um loop.”
Plataforma
- Servidor: Discourse core
main(linha 2026.7.x), reproduzido contra oorigin/mainmais recente (dbf5eedac40, 2026-07-14).discourse-aiincluído no core. - Cliente: reproduzido em vários navegadores/dispositivos (Chrome desktop, Chrome Android, Safari iOS) — é um problema do lado do servidor, portanto o cliente é irrelevante.
Descrição
Resultado atual: Em um tópico público, clicar em Tentar novamente em uma resposta do bot de IA adiciona uma nova publicação do bot ao tópico. A resposta original permanece intacta, então cada tentativa adiciona outra publicação. N tentativas → N publicações extras.
Resultado esperado: A opção Tentar novamente deve regenerar a resposta existente do bot no mesmo lugar (substituindo seu conteúdo), da mesma forma como funciona em uma conversa de MP/DM com o bot de IA. Nenhuma nova publicação deve ser criada.
Passos para reproduzir (em uma instalação fresca do Discourse)
- Ative o Discourse AI + bot de IA; crie/ative um agente (persona) de IA com um usuário de bot e ative a opção “Permitir menções em tópicos” para que ele possa responder em tópicos públicos (
allow_topic_mentions). Adicione o grupo do seu usuário aos grupos permitidos do agente e à configuraçãoai_bot_allowed_groups. - Em um tópico público, faça uma
@mençãoao bot em uma publicação para que ele responda. - Na resposta do bot, abra o menu de administração/porca da publicação e clique em Tentar novamente (a ação de regeneração →
POST /discourse-ai/ai-bot/post/:post_id/retry). - Observe: uma nova resposta do bot é adicionada em vez de a existente ser regenerada. Repita a ação Tentar novamente → uma publicação extra a cada vez.
- Para contrastar, faça o mesmo em um MP com o bot: a opção Tentar novamente regenera corretamente no mesmo lugar (sem duplicatas). A divergência entre MP e tópico público é a evidência.
Reproduz 100% das vezes em tópicos públicos.
Causa raiz (referências de código, origin/main atual)
BotController#retry_response(plugins/discourse-ai/app/controllers/discourse_ai/ai_bot/bot_controller.rb) enfileiraJobs::CreateAiReplycomreply_post_id: post.id— ou seja, “regenerar esta publicação existente.”Jobs::CreateAiReplya carrega comoreply_poste a passa paraPlayground#reply_to(..., existing_reply_post: reply_post).- Em
Playground#reply_to(plugins/discourse-ai/lib/ai_bot/playground.rb):stream_reply = post.topic.private_message? if stream_reply.nil?→falsepara tópicos públicos (~L518).existing_reply_posté consumido apenas dentro da branchif stream_reply(reply_post = existing_reply_post, ~L538).- A branch
elsenão streaming (~L662) faz incondicionalmentePostCreator.create!(...), adicionando uma nova publicação e nunca tocando na publicação que está sendo tentada novamente.
Portanto, para qualquer tópico que não seja MP, a intenção de “regenerar no mesmo lugar” de retry_response é silenciosamente ignorada e uma duplicata é criada em vez disso. (A mesma assimetria significa que as respostas do bot em tópicos públicos são não streaming, o que é o comportamento preexistente; o bug é especificamente que o existing_reply_post de Tentar novamente é ignorado nesse caminho.)
Correção sugerida (apenas direcionamento)
Respeitar existing_reply_post independentemente do streaming — por exemplo, na branch não streaming, se existing_reply_post estiver presente, revise (revise/editar) em vez de chamar PostCreator.create!; ou desacoplar a decisão de “reutilizar publicação existente” de stream_reply.
Modo seguro
N/A — comportamento de plugin do lado do servidor, independente de temas/JS do site.