Review-Agent: Default=Approved + vollständige Tool-Boxes für Sub-Agents
Backend:
- Review-Agent: Default = Approved (analog zum Preparer Default=Forward)
Nur bei explizitem [FEEDBACK]-Tag wird Feedback zurückgespielt
Verhindert Loop wenn Review-Agent bestätigt ohne [APPROVED]-Tag
- Neues SSE-Event {agentType}_tool_end für Sub-Agent Tool-Ergebnisse
Sendet toolName, input, result, isError nach Tool-Ausführung
Frontend Streaming (stream-ui.js + chat.js):
- addReviewToolUse: Vollständige Tool-Box mit Loading-Spinner statt nur Name
- finishReviewToolBox: Befüllt Tool-Box nach tool_end mit Details (Pfad, Diff, Result)
- Event-Handler für preparer/review/finalizer_tool_end
Frontend History (history.js):
- _renderReviewGroup: Vollständige Tool-Boxes statt einfache Tool-Use-Indikatoren
- Tool-Result Look-Ahead für korrekte Zuordnung (toolCallId-Match)
- Web-Search-Sources in Review-Bubbles unterstützt
- Tool-Visibility-Filter (isToolVisible) auch für Sub-Agent-Tools
CSS:
- .review-tool-use → .review-tool-box (erbt normale Tool-Box-Styles)
This commit is contained in:
1 parent
f3b6491643
commit
1fc6889ced
5 files changed
+93
-30
No files matched your search
@@ -450,30 +450,35 @@ public class AnthropicService
|
||||
|
||||
var result = new ReviewResult { ReviewIterationCount = reviewIterations };
|
||||
|
||||
// Prüfe ob [APPROVED]
|
||||
if (!string.IsNullOrEmpty(reviewText) && reviewText.Contains("[APPROVED]"))
|
||||
// Default = Approved (analog zum Preparer, wo Default = Forward ist).
|
||||
// Nur bei explizitem [FEEDBACK]-Tag wird Feedback an den Worker zurückgespielt.
|
||||
// [APPROVED] wird weiterhin erkannt, ist aber nicht mehr zwingend nötig.
|
||||
if (!string.IsNullOrEmpty(reviewText) && reviewText.Contains("[FEEDBACK]"))
|
||||
{
|
||||
// Explizites Feedback – an Worker zurückspielen
|
||||
var feedbackText = reviewText.Replace("[FEEDBACK]", "").Replace("[APPROVED]", "").Trim();
|
||||
result.HasFeedback = true;
|
||||
result.Feedback = $"[Review-Feedback von {review.Agent?.Name ?? "Review-Agent"} (Runde {reviewRound + 1}/{review.MaxReviewIterations})]:\n{feedbackText}";
|
||||
|
||||
await TryWriteSse(response, "review_feedback", new
|
||||
{
|
||||
round = reviewRound + 1,
|
||||
maxRounds = review.MaxReviewIterations,
|
||||
feedback = feedbackText,
|
||||
agentName = review.Agent?.Name ?? "Review-Agent"
|
||||
}, cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Default: Approved (kein [FEEDBACK]-Tag → alles OK)
|
||||
await TryWriteSse(response, "review_approved", new
|
||||
{
|
||||
round = reviewRound + 1,
|
||||
agentName = review.Agent?.Name ?? "Review-Agent"
|
||||
}, cancellationToken);
|
||||
result.HasFeedback = false;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Feedback – an Worker zurückspielen
|
||||
result.HasFeedback = true;
|
||||
result.Feedback = $"[Review-Feedback von {review.Agent?.Name ?? "Review-Agent"} (Runde {reviewRound + 1}/{review.MaxReviewIterations})]:\n{reviewText}";
|
||||
|
||||
await TryWriteSse(response, "review_feedback", new
|
||||
{
|
||||
round = reviewRound + 1,
|
||||
maxRounds = review.MaxReviewIterations,
|
||||
feedback = reviewText,
|
||||
agentName = review.Agent?.Name ?? "Review-Agent"
|
||||
}, cancellationToken);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -803,6 +808,16 @@ public class AnthropicService
|
||||
is_error = isError
|
||||
});
|
||||
|
||||
await TryWriteSse(response, $"{agentType}_tool_end", new
|
||||
{
|
||||
toolName,
|
||||
toolId,
|
||||
input = toolInput.ToString(),
|
||||
result = toolResult.Length > 500 ? toolResult[..500] + "..." : toolResult,
|
||||
isError,
|
||||
agentName
|
||||
}, cancellationToken);
|
||||
|
||||
await _db.SaveMessage(new MessageRecord
|
||||
{
|
||||
ChainId = chainId,
|
||||
|
||||
Reference in new issue
Block a user