diff --git a/Services/ChatService.cs b/Services/ChatService.cs index 931a7a1..932d6c0 100644 --- a/Services/ChatService.cs +++ b/Services/ChatService.cs @@ -29,6 +29,24 @@ public class ChatService private int MaxHistory => _settings.GetInt("MaxHistory", 220); private int ReminderInterval => _settings.GetInt("ReminderInterval", 30); + // Rollen-Klarstellung für Panel-Member (Fusion/MoA). Member laufen READ-ONLY (PlanMode bzw. + // tool-los). Ohne diesen Hinweis behält jeder Member seinen normalen Agent-Prompt und versucht + // oft Schreib-/Execute-/git-Aktionen, die gefiltert werden → er "beißt sich fest" in wiederholten, + // fehlschlagenden Tool-Versuchen. Der Hinweis lenkt ihn auf reine Analyse/Vorschlag; das tatsächliche + // Umsetzen (Schreiben, Ausführen, Committen) übernimmt der Synthese-Agent (Session-Worker). + private const string PanelMemberRolePrompt = @"## KRITISCH: Deine Rolle als Panel-Agent (Proposer) + +Du bist einer von mehreren KI-Agenten, die PARALLEL und UNABHÄNGIG dieselbe Anfrage beantworten. Aus euren Antworten synthetisiert anschließend ein separater Agent EINE Gesamtantwort für den User. + +### Du arbeitest READ-ONLY +Dir stehen NUR lesende Tools zur Verfügung (Dateien lesen, suchen, auflisten). Schreibende oder ausführende Aktionen – Dateien anlegen/ändern/löschen, Shell-/Build-Befehle, git/commit, Deployment – sind für dich DEAKTIVIERT und werden blockiert. Versuche sie GAR NICHT ERST: Du kommst damit nicht weiter, verschwendest nur Zeit und blockierst dich selbst in fehlschlagenden Tool-Versuchen. + +### Deine Aufgabe +Liefere deinen besten VORSCHLAG als Text-Antwort: Analyse, Lösung, konkrete Code-Vorschläge, Begründung. Nutze die lesenden Tools, um dich am echten Stand zu orientieren – aber führe nichts aus und ändere nichts. Beschreibe stattdessen klar, WAS zu tun ist. Das tatsächliche Umsetzen übernimmt der Synthese-Agent. + +### Wichtig +Nur deine finale Text-Antwort wird weiterverwendet. Formuliere sie vollständig und eigenständig, sodass sie auch ohne deine Tool-Schritte verständlich ist. Antworte zügig und direkt – kein Schreib-/Commit-Versuch."; + public static string ResolveModelId(string model) { // OpenAI-kompatible Provider werden unverändert durchgereicht (Format: "provider:model") @@ -155,7 +173,14 @@ public class ChatService foreach (var pid in panelIds) { var pc = await BuildSubAgentContext(pid, sessionId, workspace, session, user); - if (pc != null) panelContexts.Add(pc); + if (pc != null) + { + // Proposer-Rolle klarstellen (read-only) → Member versuchen nicht mehr vergeblich + // zu schreiben/committen und "beißen sich fest". Gilt für alle Provider-Pfade + // (Anthropic nutzt SystemPrompt direkt, CLI/OpenAI via ExtractSystemPromptText). + pc.SystemPrompt.Add(new { type = "text", text = PanelMemberRolePrompt }); + panelContexts.Add(pc); + } } }