diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index c9efb318b..91b5dc404 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -1689,6 +1689,7 @@ func (al *AgentLoop) runTurn(ctx context.Context, ts *turnState) (turnResult, er activeCandidates, activeModel := al.selectCandidates(ts.agent, ts.userMessage, messages) pendingMessages := append([]providers.Message(nil), ts.opts.InitialSteeringMessages...) var finalContent string + var lastAssistantTextContent string // text from last response that also had tool calls turnLoop: for ts.currentIteration() < ts.agent.MaxIterations || len(pendingMessages) > 0 || func() bool { @@ -2169,6 +2170,9 @@ turnLoop: }) allResponsesHandled := len(normalizedToolCalls) > 0 + if response.Content != "" { + lastAssistantTextContent = response.Content + } assistantMsg := providers.Message{ Role: "assistant", Content: response.Content, @@ -2668,6 +2672,9 @@ turnLoop: if finalContent == "" { if ts.currentIteration() >= ts.agent.MaxIterations && ts.agent.MaxIterations > 0 { finalContent = toolLimitResponse + } else if lastAssistantTextContent != "" { + // LLM returned empty after tool execution but already provided text in the tool-call response + finalContent = lastAssistantTextContent } else { finalContent = ts.opts.DefaultResponse }