Agno now treats a 0, False or [] as a real answer when a sync tool returns it and when a workflow step produces it. Both places used to count those values as empty.
Sync tool results reach the model
When an agent ran with run(), a tool that returned a falsy value sent the model an empty tool message, and Agno saved that empty string to the session. arun() already sent the value. run() and arun() now both pass it on:
def count_open_tickets(customer_id: str) -> int:
"""Count the customer's open support tickets."""
return 0
# Before, with agent.run(): the model received ""
# Now: the model receives "0"With the real value, the model can tell "no open tickets" apart from a tool that produced no output.
Workflow steps keep falsy content
Agno counted a step's content as missing whenever it was falsy. A step that produced 0 or False looked empty to later steps, so get_all_previous_content() skipped it. Inside Parallel, the same check dropped it from get_step_content() and from the combined Parallel output. Agno now treats step content as present unless it's None or blank text.
Learn more about writing tools and parallel workflows in the documentation.
Frequently asked questions
With agent.run(), Agno sent the model an empty tool message when a tool returned a falsy value such as 0, False or []. run() and arun() now both pass the real value to the model.
Agno counted falsy step content as missing, so it left it out of the combined Parallel output and of get_step_content() and get_all_previous_content(). Now only None or blank text counts as missing step content.



