@@ -52,3 +52,39 @@ type Provider interface {
5252
5353 StreamResponse(ctx context.Context, messages []message.Message, tools []tools.BaseTool) (<-chan ProviderEvent, error)
5454}
55+
56+func cleanupMessages(messages []message.Message) []message.Message {
57+ // First pass: filter out canceled messages
58+ var cleanedMessages []message.Message
59+ for _, msg := range messages {
60+ if msg.FinishReason() != "canceled" {
61+ cleanedMessages = append(cleanedMessages, msg)
62+ }
63+ }
64+
65+ // Second pass: filter out tool messages without a corresponding tool call
66+ var result []message.Message
67+ toolMessageIDs := make(map[string]bool)
68+
69+ for _, msg := range cleanedMessages {
70+ if msg.Role == message.Assistant {
71+ for _, toolCall := range msg.ToolCalls() {
72+ toolMessageIDs[toolCall.ID] = true // Mark as referenced
73+ }
74+ }
75+ }
76+
77+ // Keep only messages that aren't unreferenced tool messages
78+ for _, msg := range cleanedMessages {
79+ if msg.Role == message.Tool {
80+ for _, toolCall := range msg.ToolResults() {
81+ if referenced, exists := toolMessageIDs[toolCall.ToolCallID]; exists && referenced {
82+ result = append(result, msg)
83+ }
84+ }
85+ } else {
86+ result = append(result, msg)
87+ }
88+ }
89+ return result
90+}