fix: use prior assistant text when LLM returns empty after tool execution
When the LLM returns both text content and tool calls in the same response, the follow-up LLM call after tool execution sometimes returns an empty response (the model considers the turn complete since it already provided its answer). Track the last non-empty assistant text content and use it as a fallback instead of the generic "model returned an empty response" error message. Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
ee03d1247d
commit
0041f38920
1 changed files with 7 additions and 0 deletions
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue