Automatically retry a tool call using a post-hook with RetryAgentRun.
In agentic workflows, tools can fail due to rate limits, network glitches, or temporary API downtime. Instead of the agent giving up or asking the user for help, a post-hook allows the system to:
Intercept the failed tool response.
Analyze the error (e.g., checking for a 429 or 500 status code).
Trigger a retry autonomously, ensuring a seamless user experience.
"""Retry Tool Call From Post Hook=============================Demonstrates retry tool call from post hook."""from agno.agent import Agentfrom agno.db.sqlite import SqliteDbfrom agno.exceptions import RetryAgentRunfrom agno.models.openai import OpenAIChatfrom agno.run import RunContextfrom agno.tools import FunctionCall, toolfrom agno.utils.log import logger# ---------------------------------------------------------------------------# Create Agent# ---------------------------------------------------------------------------def post_hook(run_context: RunContext, fc: FunctionCall): logger.info(f"Post-hook: {fc.function.name}") logger.info(f"Arguments: {fc.arguments}") if run_context.session_state is None: run_context.session_state = {} shopping_list = ( run_context.session_state.get("shopping_list", []) if run_context.session_state else [] ) if len(shopping_list) < 3: raise RetryAgentRun( f"Shopping list is: {shopping_list}. Minimum 3 items in the shopping list. " + f"Add {3 - len(shopping_list)} more items." )@tool(post_hook=post_hook)def add_item(run_context: RunContext, item: str) -> str: """Add an item to the shopping list.""" if run_context.session_state is None: run_context.session_state = {} if "shopping_list" not in run_context.session_state: run_context.session_state["shopping_list"] = [] run_context.session_state["shopping_list"].append(item) return f"The shopping list is now {run_context.session_state['shopping_list']}"agent = Agent( model=OpenAIChat(id="gpt-5.2"), session_id="retry_tool_call_from_post_hook_session", db=SqliteDb( session_table="retry_tool_call_from_post_hook_session", db_file="tmp/retry_tool_call_from_post_hook.db", ), # Initialize the session state with empty shopping list session_state={"shopping_list": []}, tools=[add_item], markdown=True,)# ---------------------------------------------------------------------------# Run Agent# ---------------------------------------------------------------------------if __name__ == "__main__": agent.print_response("Add milk", stream=True) print( f"Final session state: {agent.get_session_state(session_id='retry_tool_call_from_post_hook_session')}" )