feat(subturn): support stateful iteration for evaluator-optimizer pattern

Add ActualSystemPrompt and InitialMessages fields to SubTurnConfig to enable
stateful worker context passing across multiple evaluation iterations.

Changes:
- Add ActualSystemPrompt field to separate system role from user task description
- Add InitialMessages field to preload ephemeral session history before agent loop starts
- Add Messages field to ToolResult for carrying session history (internal use, not serialized)
- Update runTurn to inject system prompt and preload history from InitialMessages
- Update AgentLoopSpawner to map new fields from tools.SubTurnConfig to agent.SubTurnConfig

This enables the evaluator-optimizer execution strategy in team tool to maintain
worker context across iterations while keeping SubTurn isolation intact.
This commit is contained in:
Administrator
2026-03-19 10:15:00 +08:00
parent c732e63650
commit 53404f18ca
4 changed files with 77 additions and 28 deletions
+12
View File
@@ -64,6 +64,7 @@ type processOptions struct {
SenderID string // Current sender ID for dynamic context
SenderDisplayName string // Current sender display name for dynamic context
UserMessage string // User message content (may include prefix)
SystemPromptOverride string // Override the default system prompt (Used by SubTurns)
Media []string // media:// refs from inbound message
DefaultResponse string // Response when LLM returns empty
EnableSummary bool // Whether to trigger summarization
@@ -1069,6 +1070,17 @@ func (al *AgentLoop) runAgentLoop(
maxMediaSize := cfg.Agents.Defaults.GetMaxMediaSize()
messages = resolveMediaRefs(messages, al.mediaStore, maxMediaSize)
// 1.5 Override the System prompt (e.g., for Evaluator/Optimizer specific personas)
if opts.SystemPromptOverride != "" {
for i, msg := range messages {
if msg.Role == "system" {
messages[i].Content = opts.SystemPromptOverride
messages[i].SystemParts = []providers.ContentBlock{{Type: "text", Text: opts.SystemPromptOverride}}
break
}
}
}
// 2. Save user message to session
if !opts.SkipAddUserMessage && opts.UserMessage != "" {
agent.Sessions.AddMessage(opts.SessionKey, "user", opts.UserMessage)