심각도
보통 — 하지만 번잡한 공개 토픽에서는 고충이 큼: 반복적인 재시도(Retry) 클릭으로 인해 봇의 중복 게시물이 토픽에 범람하여, 회원들에게 봇이 "혼자 게시물을 올리고 있다/루프에 걸려 있다"는 인상을 줍니다.
플랫폼
- 서버: Discourse 코어
main(2026.7.x 라인), 최신origin/main(dbf5eedac40, 2026-07-14)에서 재현.discourse-ai는 코어에 번들링되어 있음. - 클라이언트: 여러 브라우저/기기(데스크톱 Chrome, Android Chrome, iOS Safari)에서 재현 — 이는 서버 측 문제이므로 클라이언트는 무관합니다.
설명
실제 결과: 공개 토픽에서 AI 봇 답변의 **재시도(Retry)**를 클릭하면 토픽에 완전히 새로운 봇 게시물이 추가됩니다. 원래 답변은 그대로 남아 있으므로, 재시도할 때마다 게시물이 하나씩 추가됩니다. N번 재시도 → N개의 추가 게시물.
기대 결과: 재시도는 AI 봇 PM/DM 대화에서와 마찬가지로 기존 봇 답변을 그 자리에서 다시 생성(내용 치환)해야 합니다. 새로운 게시물이 생성되어서는 안 됩니다.
재현 단계 (새로운 Discourse 기준)
- Discourse AI + AI 봇을 활성화하고, 봇 사용자를 가진 AI **에이전트(페르소나)**를 생성/활성화하며, 공개 토픽에서 답변할 수 있도록 “토픽 멘션 허용”(
allow_topic_mentions)을 켜십시오. 사용자의 그룹을 에이전트의 허용 그룹 및ai_bot_allowed_groups에 추가하십시오. - 공개 토픽에서 게시물에 봇을
@멘션하여 답변을 유도하십시오. - 봇의 답변에서 게시물 관리자/렌치 메뉴를 열고 **재시도(Retry)**를 클릭하십시오 (다시 생성 동작 →
POST /discourse-ai/ai-bot/post/:post_id/retry). - 관찰: 기존 답변이 다시 생성되는 대신 새로운 봇 답변이 추가됩니다. 재시도를 반복할 때마다 게시물이 하나씩 추가됩니다.
- 비교를 위해 봇과의 PM에서 동일한 작업을 수행하십시오: 재시도는 올바르게 그 자리에서 다시 생성됩니다(중복 없음). PM과 공개 토픽 간의 차이점이 문제의 핵심입니다.
공개 토픽에서는 100% 재현됩니다.
근본 원인 (코드 포인터, 현재 origin/main)
BotController#retry_response(plugins/discourse-ai/app/controllers/discourse_ai/ai_bot/bot_controller.rb)는 **reply_post_id: post.id**와 함께Jobs::CreateAiReply를 큐에 추가합니다 — 즉, “이 기존 게시물을 다시 생성하라”는 의미입니다.Jobs::CreateAiReply는 이를reply_post로 로드하고Playground#reply_to(..., existing_reply_post: reply_post)로 전달합니다.Playground#reply_to(plugins/discourse-ai/lib/ai_bot/playground.rb)에서:stream_reply = post.topic.private_message? if stream_reply.nil?→ 공개 토픽의 경우false(~L518).existing_reply_post는if stream_reply분기(reply_post = existing_reply_post, ~L538) 내부에서만 소비됩니다.- 비스트리밍
else분기(~L662)는 무조건PostCreator.create!(...)를 실행하여 새 게시물을 추가하고, 재시도 대상 게시물을 건드리지 않습니다.
따라서 PM이 아닌 모든 토픽에서 retry_response의 “그 자리에서 다시 생성” 의도는 조용히 무시되고, 대신 중복 게시물이 생성됩니다. (이 비대칭성은 또한 공개 토픽의 봇 답변이 비스트리밍임을 의미하며, 이는 기존 동작입니다. 버그는 구체적으로 재시도의 existing_reply_post가 해당 경로에서 무시된다는 것입니다.)
권장 수정 방향 (방향성만 제시)
스트리밍 여부와 관계없이 existing_reply_post를 존중하십시오 — 예: 비스트리밍 분기에서 existing_reply_post가 존재하면 PostCreator.create!를 호출하는 대신 이를 revise하십시오; 또는 “기존 게시물 재사용” 결정을 stream_reply와 분리하십시오.
안전 모드
해당 없음 — 서버 측 플러그인 동작이며, 테마/사이트 JS와 독립적입니다.