Fix #545: Prevent delegate messages duplication by using SendResponse: false in processSystemMessage and adding unique tracking with Once for subagent announcements
This commit addresses the issue where subagent tasks were producing multiple answers after delegation: - Changed SendResponse from true to false in processSystemMessage to prevent duplicate notifications - Added sync.Once field to SubagentTask to ensure unique announcement tracking - Modified announcement logic to use sync.Once for idempotency The fixes ensure that when subagents complete their tasks, their results are communicated uniquely without duplication by preventing: 1) system messages from re-triggering user responses, and 2) multiple announcement attempts from the same subagent task.
This commit is contained in:
parent
028605cfd0
commit
faa31fdd7d
2 changed files with 18 additions and 3 deletions
|
|
@ -571,7 +571,7 @@ func (al *AgentLoop) processSystemMessage(
|
||||||
UserMessage: fmt.Sprintf("[System: %s] %s", msg.SenderID, msg.Content),
|
UserMessage: fmt.Sprintf("[System: %s] %s", msg.SenderID, msg.Content),
|
||||||
DefaultResponse: "Background task completed.",
|
DefaultResponse: "Background task completed.",
|
||||||
EnableSummary: false,
|
EnableSummary: false,
|
||||||
SendResponse: true,
|
SendResponse: false, // Prevent duplicate responses caused by system message processing
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ type SubagentTask struct {
|
||||||
Status string
|
Status string
|
||||||
Result string
|
Result string
|
||||||
Created int64
|
Created int64
|
||||||
|
announcedOnce sync.Once // Ensures the completion announcement is sent only once
|
||||||
}
|
}
|
||||||
|
|
||||||
type SubagentManager struct {
|
type SubagentManager struct {
|
||||||
|
|
@ -216,7 +217,7 @@ After completing the task, provide a clear summary of what was done.`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send announce message back to main agent
|
// Send announce message back to main agent
|
||||||
if sm.bus != nil {
|
task.announcedOnce.Do(func() {
|
||||||
announceContent := fmt.Sprintf("Task '%s' completed.\n\nResult:\n%s", task.Label, task.Result)
|
announceContent := fmt.Sprintf("Task '%s' completed.\n\nResult:\n%s", task.Label, task.Result)
|
||||||
pubCtx, pubCancel := context.WithTimeout(context.Background(), 5*time.Second)
|
pubCtx, pubCancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||||
defer pubCancel()
|
defer pubCancel()
|
||||||
|
|
@ -227,7 +228,21 @@ After completing the task, provide a clear summary of what was done.`
|
||||||
ChatID: fmt.Sprintf("%s:%s", task.OriginChannel, task.OriginChatID),
|
ChatID: fmt.Sprintf("%s:%s", task.OriginChannel, task.OriginChatID),
|
||||||
Content: announceContent,
|
Content: announceContent,
|
||||||
})
|
})
|
||||||
}
|
})
|
||||||
|
|
||||||
|
task.announcedOnce.Do(func() {
|
||||||
|
// Send announce message back to main agent
|
||||||
|
announceContent := fmt.Sprintf("Task '%s' completed.\n\nResult:\n%s", task.Label, task.Result)
|
||||||
|
pubCtx, pubCancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||||
|
defer pubCancel()
|
||||||
|
sm.bus.PublishInbound(pubCtx, bus.InboundMessage{
|
||||||
|
Channel: "system",
|
||||||
|
SenderID: fmt.Sprintf("subagent:%s", task.ID),
|
||||||
|
// Format: "original_channel:original_chat_id" for routing back
|
||||||
|
ChatID: fmt.Sprintf("%s:%s", task.OriginChannel, task.OriginChatID),
|
||||||
|
Content: announceContent,
|
||||||
|
})
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sm *SubagentManager) GetTask(taskID string) (*SubagentTask, bool) {
|
func (sm *SubagentManager) GetTask(taskID string) (*SubagentTask, bool) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue