KI-Bot „Retry“ erstellt in öffentlichen Themen (keine PN) eine doppelte Antwort statt einer Neugenerierung

Schweregrad

Normal — aber hochstörend in belebten öffentlichen Themen: Wiederholtes Klicken auf „Wiederholen“ spült das Thema mit doppelten Bot-Beiträgen voll, sodass es für Mitglieder so aussieht, als würde der Bot „selbstständig posten / in einer Schleife hängen bleiben.“

Plattform

  • Server: Discourse-Kern main (2026.7.x-Zweig), reproduziert gegen neuestes origin/main (dbf5eedac40, 2026-07-14). discourse-ai im Kern enthalten.
  • Client: Reproduziert von mehreren Browsern/Geräten (Desktop Chrome, Android Chrome, iOS Safari) — es ist serverseitig, daher ist der Client irrelevant.

Beschreibung

Tatsächliches Ergebnis: In einem öffentlichen Thema fügt das Klicken auf Wiederholen bei einer AI-Bot-Antwort einen ganz neuen Bot-Beitrag zum Thema hinzu. Die ursprüngliche Antwort bleibt unverändert, sodass jeder Wiederholungsversuch einen weiteren Beitrag hinzufügt. N Wiederholungen → N zusätzliche Beiträge.

Erwartetes Ergebnis: Wiederholen sollte die bestehende Bot-Antwort an Ort und Stelle neu generieren (den Inhalt ersetzen), genau wie es in einer AI-Bot-PM/DM-Konversation der Fall ist. Es sollte kein neuer Beitrag erstellt werden.

Schritte zur Reproduktion (von einem frischen Discourse)

  1. Aktiviere Discourse AI + AI-Bot; erstelle/aktiviere einen AI-Agenten (Persona) mit einem Bot-Benutzer und schalte „Erlaube Thema-Erwähnungen“ ein, damit er in öffentlichen Themen antworten kann (allow_topic_mentions). Füge die Benutzergruppe zu den erlaubten Gruppen des Agenten und zu ai_bot_allowed_groups hinzu.
  2. Erwähne den Bot in einem öffentlichen Thema in einem Beitrag, damit er antwortet.
  3. Öffne im Antwortbeitrag des Bots das Admin-/Schraubenschlüssel-Menü und klicke auf Wiederholen (die Regenerationsaktion → POST /discourse-ai/ai-bot/post/:post_id/retry).
  4. Beobachtung: Eine neue Bot-Antwort wird angehängt, anstatt die bestehende neu zu generieren. Wiederhole Wiederholen → jedes Mal ein zusätzlicher Beitrag.
  5. Zum Vergleich: Führe dasselbe in einer PM mit dem Bot durch: Wiederholen generiert korrekt an Ort und Stelle neu (keine Duplikate). Die Divergenz zwischen PM und öffentlichem Thema ist der Hinweis.

Reproduziert zu 100 % der Zeit in öffentlichen Themen.

Ursache (Code-Verweise, aktuelles origin/main)

  • BotController#retry_response (plugins/discourse-ai/app/controllers/discourse_ai/ai_bot/bot_controller.rb) wertet Jobs::CreateAiReply mit `reply_post_id: post.id`` ein — d. h. „regeneriere diesen bestehenden Beitrag.“
  • Jobs::CreateAiReply lädt ihn als reply_post und übergibt ihn an 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 für öffentliche Themen (~L518).
    • existing_reply_post wird nur innerhalb des if stream_reply-Zweigs verbraucht (reply_post = existing_reply_post, ~L538).
    • Der nicht-streamende else-Zweig (~L662) führt bedingungslos PostCreator.create!(...) aus, hängt einen neuen Beitrag an und berührt den zu wiederholenden Beitrag nie.

Für jedes nicht-PM-Thema wird die Absicht „an Ort und Stelle neu generieren“ aus retry_response stillschweigend verworfen und stattdessen ein Duplikat erstellt. (Die gleiche Asymmetrie bedeutet, dass Bot-Antworten in öffentlichen Themen nicht gestreamt werden, was das bestehende Verhalten ist; der Fehler besteht speziell darin, dass existing_reply_post von Retry auf diesem Pfad ignoriert wird.)

Vorgeschlagene Lösung (nur Richtung)

existing_reply_post unabhängig vom Streaming beachten — z. B. im nicht-streamenden Zweig, wenn existing_reply_post vorhanden ist, diesen revise (revidieren) statt PostCreator.create! aufzurufen; oder die Entscheidung „bestehenden Beitrag wiederverwenden“ von stream_reply entkoppeln.

Sicherer Modus

N/A — serverseitiges Plugin-Verhalten, unabhängig von Themen/Website-JS.

1 „Gefällt mir“