Bot de IA “Retry” cria resposta duplicada em vez de regenerar, em tópicos públicos (não MP)

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 o origin/main mais recente (dbf5eedac40, 2026-07-14). discourse-ai incluí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)

  1. 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ção ai_bot_allowed_groups.
  2. Em um tópico público, faça uma @menção ao bot em uma publicação para que ele responda.
  3. 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).
  4. 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.
  5. 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) enfileira Jobs::CreateAiReply com reply_post_id: post.id — ou seja, “regenerar esta publicação existente.”
  • Jobs::CreateAiReply a carrega como reply_post e a passa para Playground#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?false para tópicos públicos (~L518).
    • existing_reply_post é consumido apenas dentro da branch if stream_reply (reply_post = existing_reply_post, ~L538).
    • A branch else não streaming (~L662) faz incondicionalmente PostCreator.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.

1 curtida