fix: preserve interim content as fallback when retry produces empty response

Fixes regression from #825 where models that respond with final text
directly (no tools) had their answer discarded by the retry mechanism.

Closes #878
This commit is contained in:
Nikolas de Hor
2026-02-20 09:21:27 -03:00
parent c8089021a5
commit 4eb07c44b9

View File

@@ -185,6 +185,7 @@ class AgentLoop:
final_content = None
tools_used: list[str] = []
text_only_retried = False
interim_content: str | None = None # Fallback if retry produces nothing
while iteration < self.max_iterations:
iteration += 1
@@ -231,9 +232,11 @@ class AgentLoop:
else:
final_content = self._strip_think(response.content)
# Some models send an interim text response before tool calls.
# Give them one retry; don't forward the text to avoid duplicates.
# Give them one retry; save the content as fallback in case
# the retry produces nothing useful (e.g. model already answered).
if not tools_used and not text_only_retried and final_content:
text_only_retried = True
interim_content = final_content
logger.debug("Interim text response (no tools used yet), retrying: {}", final_content[:80])
messages = self.context.add_assistant_message(
messages, response.content,
@@ -241,6 +244,9 @@ class AgentLoop:
)
final_content = None
continue
# Fall back to interim content if retry produced nothing
if not final_content and interim_content:
final_content = interim_content
break
return final_content, tools_used