feat: Finalizer-Agent – dritter Agent der nach Worker + Review einschreitet
Backend:
- SessionRecord + DB-Migration: finalizer_agent_id auf sessions
- ChatContext.FinalizerContext (Model, SystemPrompt, Tools, Workspace)
- ChatService: FinalizerContext aufbauen (analog zu ReviewContext)
- AnthropicService: RunFinalizer() nach Review-Phase (oder direkt nach Worker)
- RunReviewAgentChat() refactored zu generischem RunAgentChat()
mit agentType-Parameter ('review' | 'finalizer') für SSE-Events und DB-Tags
- SSE-Events: finalizer_start, finalizer_text, finalizer_tool_use, finalizer_done
Frontend:
- Session-Page: Finalizer-Agent-Picker (im 'Weitere Einstellungen' Bereich)
- Chat: SSE-Events für Finalizer-Phase verarbeiten
- UI: addReviewBubble/finalizeReviewBubble unterstützen agentType 'finalizer'
mit eigener Farbe (success-green) und Flag-Checkered-Icon
- renderMarkdown: [Finalizer: AgentName] Tags parsen
- History: Finalizer-Messages als .finalizer-bubble rendern
- Shared-Page: Finalizer-Messages korrekt erkennen und stylen
- Dashboard: Finalizer-Badge (flag-checkered) auf Session-Cards
This commit is contained in:
1 parent
a3f2aa38c1
commit
4bec740765
14 files changed
+228
-46
No files matched your search
+37
-1
@@ -142,6 +142,41 @@ public class ChatService
|
||||
}
|
||||
}
|
||||
|
||||
// Finalizer-Agent vorbereiten (falls konfiguriert)
|
||||
FinalizerContext finalizerContext = null;
|
||||
if (!string.IsNullOrEmpty(session.FinalizerAgentId))
|
||||
{
|
||||
var finalizerAgent = await _db.GetAgent(session.FinalizerAgentId);
|
||||
if (finalizerAgent != null)
|
||||
{
|
||||
var finalizerModelId = ResolveModelId(finalizerAgent.Model);
|
||||
var finalizerMarked = await _db.GetMarkedMessages(sessionId);
|
||||
var finalizerMemDir = _memoryService.GetAgentMemoryDir(finalizerAgent.AgentId);
|
||||
var finalizerSkills = await _db.GetAgentSkills(finalizerAgent.AgentId);
|
||||
var finalizerWorkspace = workspace;
|
||||
var finalizerSystemText = SystemPromptBuilder.Build(
|
||||
finalizerAgent, session, finalizerMarked, _memoryService, finalizerMemDir,
|
||||
finalizerSkills, _skillService, userPersona: user?.GetEffectivePersona(),
|
||||
resolvedWorkspace: finalizerWorkspace);
|
||||
|
||||
var finalizerPrompt = new List<object>();
|
||||
if (!string.IsNullOrWhiteSpace(finalizerSystemText))
|
||||
finalizerPrompt.Add(new { type = "text", text = finalizerSystemText });
|
||||
|
||||
finalizerContext = new FinalizerContext
|
||||
{
|
||||
ModelId = finalizerModelId,
|
||||
SystemPrompt = finalizerPrompt,
|
||||
AgentId = finalizerAgent.AgentId,
|
||||
Workspace = finalizerWorkspace,
|
||||
UseMemory = finalizerAgent.UseMemory,
|
||||
WebSearchVersion = finalizerAgent.WebSearchVersion,
|
||||
ToolChoice = finalizerAgent.ToolChoice ?? "any",
|
||||
Agent = finalizerAgent
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return new ChatContext
|
||||
{
|
||||
ChainId = chainId,
|
||||
@@ -157,7 +192,8 @@ public class ChatService
|
||||
MaxIterations = maxIterations,
|
||||
Agent = agent,
|
||||
Session = session,
|
||||
Review = reviewContext
|
||||
Review = reviewContext,
|
||||
Finalizer = finalizerContext
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user