From 8f4f40f894695a9df359c5550e457487c0132f8a Mon Sep 17 00:00:00 2001 From: 04cb <0x04cb@gmail.com> Date: Sat, 7 Mar 2026 13:31:32 +0800 Subject: [PATCH] Fix Qwen model error by ensuring user message is kept after memory compression Qwen models require a user message in the message array, otherwise they return 'No user query found in messages' error. The adjustRecentStartForToolCalls function now ensures at least one user message is included in recent messages after compression to prevent this validation error. --- internal/agent/memory_compressor.go | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/internal/agent/memory_compressor.go b/internal/agent/memory_compressor.go index c830d1a9..1fb31d91 100644 --- a/internal/agent/memory_compressor.go +++ b/internal/agent/memory_compressor.go @@ -345,8 +345,29 @@ func (mc *MemoryCompressor) adjustRecentStartForToolCalls(msgs []ChatMessage, re adjusted-- } + // Ensure at least one user message is included in recent messages to avoid Qwen model error + // Qwen models require a user message in the message array, otherwise they return: + // "No user query found in messages" + hasUserMessage := false + for i := adjusted; i < len(msgs); i++ { + if strings.EqualFold(msgs[i].Role, "user") { + hasUserMessage = true + break + } + } + + // If no user message in recent messages, adjust backwards to include one + if !hasUserMessage { + for adjusted > 0 { + adjusted-- + if strings.EqualFold(msgs[adjusted].Role, "user") { + break + } + } + } + if adjusted != recentStart { - mc.logger.Debug("adjusted recent window to keep tool call context", + mc.logger.Debug("adjusted recent window to keep tool call context and user message", zap.Int("original_recent_start", recentStart), zap.Int("adjusted_recent_start", adjusted), )