1+ import logging
12import time
23from strands .hooks import HookProvider , HookRegistry , AfterToolCallEvent
34
5+ logger = logging .getLogger (__name__ )
6+
47
58class FailOnToolError (HookProvider ):
69 def __init__ (self , max_retries : int = 3 , retry_delay : float = 1.0 ):
@@ -12,17 +15,21 @@ def register_hooks(self, registry: HookRegistry) -> None:
1215
1316 def check_result (self , event : AfterToolCallEvent ) -> None :
1417 if event .result .get ("isError" , False ):
18+ tool_name = event .tool_use ["name" ]
19+ error_content = event .result .get ("content" , [{}])[0 ].get ("text" , "Unknown error" )
20+ logger .warning (f"Tool { tool_name } failed: { error_content } " )
21+
1522 for attempt in range (self .max_retries ):
23+ logger .info (f"Retrying tool { tool_name } (attempt { attempt + 1 } /{ self .max_retries } )" )
1624 time .sleep (self .retry_delay )
1725 try :
18- # Retry the tool execution
1926 result = event .selected_tool (event .tool_use , event .invocation_state )
2027 if not result .get ("isError" , False ):
28+ logger .info (f"Tool { tool_name } succeeded on retry { attempt + 1 } " )
2129 event .result = result
2230 return
23- except Exception :
31+ except Exception as e :
32+ logger .warning (f"Retry { attempt + 1 } failed: { e } " )
2433 continue
25-
26- # All retries failed
27- error_content = event .result .get ("content" , [{}])[0 ].get ("text" , "Unknown error" )
28- raise RuntimeError (f"Tool { event .tool_use ['name' ]} failed after { self .max_retries } retries: { error_content } " )
34+
35+ raise RuntimeError (f"Tool { tool_name } failed after { self .max_retries } retries: { error_content } " )
0 commit comments