fix(preparer): Logik invertiert - Default=Forward, [QUESTION]=Stopp

Kernproblem: Claude vergisst [FORWARD]-Tag → Preparer leitet nie weiter.

Lösung - Logik umgedreht:
- Jede Antwort wird automatisch an Session-Agent weitergeleitet (Default)
- Nur bei explizitem [QUESTION]-Tag wird gestoppt (Rückfrage an User)
- [FORWARD] wird weiterhin erkannt und entfernt, ist aber optional

Weitere Fixes:
- Preparer bekommt eigene History mit includeTag='preparer',
  damit er den Kontext seiner vorherigen Rückfragen sieht
- Session-Agent bekommt saubere History ohne Sub-Agent-Messages
  (nach Preparer-Phase frisch aus DB geladen)
- [QUESTION] wird im Frontend-Markdown ausgeblendet
This commit is contained in:
Meleki committed 2026-03-07 16:35:29 +01:00
1 parent 43d3e9dc26
commit 14e721f95b
4 files changed
+65 -65

No files matched your search

+9 -16
View File
@@ -128,9 +128,6 @@ public static class ChatEndpoint
}, attachmentRecords);
}
// History komplett aus DB aufbauen (inkl. gerade gespeicherter Message/tool_result)
var messages = await chatService.BuildHistoryFromDb(sessionId);
res.Headers["Content-Type"] = "text/event-stream";
res.Headers["Cache-Control"] = "no-cache";
res.Headers["Connection"] = "keep-alive";
@@ -138,8 +135,12 @@ public static class ChatEndpoint
// ── Preparer-Agent Phase (vor dem Worker) ──
if (ctx.Preparer != null && !isChoiceResponse)
{
// Preparer bekommt History MIT seinen eigenen vorherigen Messages (Tag "preparer"),
// damit er den Kontext seiner Rückfragen kennt
var preparerHistory = await chatService.BuildHistoryFromDb(sessionId, includeTag: "preparer");
var preparerResult = await anthropic.RunPreparer(
res, ctx.Preparer, messages, ctx.ChainId, ctx.Workspace, sessionId, cancellationToken);
res, ctx.Preparer, preparerHistory, ctx.ChainId, ctx.Workspace, sessionId, cancellationToken);
if (!preparerResult.ShouldForward)
{
@@ -154,20 +155,9 @@ public static class ChatEndpoint
return;
}
// Preparer ist zufrieden → aufbereiteten Prompt als zusätzlichen Kontext an die History anhängen
// Preparer ist zufrieden → aufbereiteten Prompt in DB speichern
if (!string.IsNullOrWhiteSpace(preparerResult.ForwardedPrompt))
{
// Den aufbereiteten Prompt als System-Context-Message einfügen
messages.Add(new Dictionary<string, object>
{
["role"] = "user",
["content"] = new List<object>
{
new { type = "text", text = $"[Vorbereitet von {ctx.Preparer.Agent?.Name ?? "Vorbereiter-Agent"}]:\n{preparerResult.ForwardedPrompt}" }
}
});
// Auch in DB speichern
await db.SaveMessage(new MessageRecord
{
ChainId = ctx.ChainId,
@@ -179,6 +169,9 @@ public static class ChatEndpoint
}
}
// History für den Session-Agent: OHNE Sub-Agent-Messages (saubere History)
var messages = await chatService.BuildHistoryFromDb(sessionId);
// Bei Choice-Response: toolChoice auf "auto" setzen, damit Claude frei antworten kann
var effectiveToolChoice = isChoiceResponse ? "auto" : ctx.ToolChoice;