@@ -60,31 +60,40 @@ def use(self, tool_string: str):
60
60
self ._printer .print (content = f"\n \n { error } \n " , color = "yellow" )
61
61
return error
62
62
tool = self ._select_tool (calling .function_name )
63
- return self ._use (tool = tool , calling = calling )
63
+ return self ._use (tool_string = tool_string , tool = tool , calling = calling )
64
64
65
- def _use (self , tool : BaseTool , calling : ToolCalling ) -> None :
66
- if self ._check_tool_repeated_usage (calling = calling ):
67
- result = self ._i18n .errors ("task_repeated_usage" ).format (
68
- tool = calling .function_name , tool_input = calling .arguments
69
- )
70
- else :
71
- self .tools_handler .on_tool_start (calling = calling )
65
+ def _use (self , tool_string : str , tool : BaseTool , calling : ToolCalling ) -> None :
66
+ try :
67
+ if self ._check_tool_repeated_usage (calling = calling ):
68
+ result = self ._i18n .errors ("task_repeated_usage" ).format (
69
+ tool = calling .function_name , tool_input = calling .arguments
70
+ )
71
+ else :
72
+ self .tools_handler .on_tool_start (calling = calling )
72
73
73
- result = self .tools_handler .cache .read (
74
- tool = calling .function_name , input = calling .arguments
75
- )
74
+ result = self .tools_handler .cache .read (
75
+ tool = calling .function_name , input = calling .arguments
76
+ )
76
77
77
- if not result :
78
- result = tool ._run (** calling .arguments )
79
- self .tools_handler .on_tool_end (calling = calling , output = result )
78
+ if not result :
79
+ result = tool ._run (** calling .arguments )
80
+ self .tools_handler .on_tool_end (calling = calling , output = result )
80
81
81
- self ._printer .print (content = f"\n \n { result } \n " , color = "yellow" )
82
- self ._telemetry .tool_usage (
83
- llm = self .llm , tool_name = tool .name , attempts = self ._run_attempts
84
- )
82
+ self ._printer .print (content = f"\n \n { result } \n " , color = "yellow" )
83
+ self ._telemetry .tool_usage (
84
+ llm = self .llm , tool_name = tool .name , attempts = self ._run_attempts
85
+ )
85
86
86
- result = self ._format_result (result = result )
87
- return result
87
+ result = self ._format_result (result = result )
88
+ return result
89
+ except Exception :
90
+ self ._run_attempts += 1
91
+ if self ._run_attempts > self ._max_parsing_attempts :
92
+ self ._telemetry .tool_usage_error (llm = self .llm )
93
+ return ToolUsageErrorException (
94
+ self ._i18n .errors ("tool_usage_error" )
95
+ ).message
96
+ return self .use (tool_string = tool_string )
88
97
89
98
def _format_result (self , result : Any ) -> None :
90
99
self .task .used_tools += 1
0 commit comments