66 @date:2026/1/14 19:14
77 @desc:
88"""
9+ import time
10+ import traceback
911
1012import uuid_utils .compat as uuid
1113from django .db .models import QuerySet
1214
15+ from common .utils .logger import maxkb_logger
1316from common .utils .tool_code import ToolExecutor
1417from knowledge .models .knowledge_action import State
1518from tools .models import Tool
@@ -35,10 +38,50 @@ def get_field_value(value, kwargs):
3538 return get_reference (value .get ('value' ), kwargs )
3639
3740
38- def get_tool_execute_parameters (parameter_setting , kwargs ):
41+ def _coerce_by_type (field_type , raw ):
42+ if raw is None :
43+ return None
44+ t = (field_type or "" ).lower ()
45+
46+ if t in ("string" , "str" , "text" ):
47+ return str (raw )
48+ if t in ("int" , "integer" ):
49+ return int (raw )
50+ if t in ("float" , "number" , "double" ):
51+ return float (raw )
52+ if t in ("bool" , "boolean" ):
53+ if isinstance (raw , bool ):
54+ return raw
55+ if isinstance (raw , (int , float )):
56+ return bool (raw )
57+ if isinstance (raw , str ):
58+ v = raw .strip ().lower ()
59+ if v in ("true" , "1" , "yes" , "y" , "on" ):
60+ return True
61+ if v in ("false" , "0" , "no" , "n" , "off" ):
62+ return False
63+ raise ValueError (f"Cannot coerce { raw !r} to bool" )
64+ if t in ("list" , "array" ):
65+ if isinstance (raw , list ):
66+ return raw
67+ if isinstance (raw , tuple ):
68+ return list (raw )
69+ raise ValueError (f"Cannot coerce { raw !r} to list" )
70+ if t in ("dict" , "object" , "json" ):
71+ if isinstance (raw , dict ):
72+ return raw
73+ raise ValueError (f"Cannot coerce { raw !r} to dict" )
74+
75+ return raw
76+
77+
78+ def get_tool_execute_parameters (input_field_list , parameter_setting , kwargs ):
79+ type_map = {f .get ("name" ): f .get ("type" ) for f in (input_field_list or []) if f .get ("name" )}
80+
3981 parameters = {}
4082 for key , value in parameter_setting .items ():
41- parameters [key ] = get_field_value (value , kwargs )
83+ raw = get_field_value (value , kwargs )
84+ parameters [key ] = _coerce_by_type (type_map .get (key ), raw )
4285 return parameters
4386
4487
@@ -67,7 +110,6 @@ def support(self, trigger_task, **kwargs):
67110
68111 def execute (self , trigger_task , ** kwargs ):
69112 parameter_setting = trigger_task .get ('parameter' )
70- parameters = get_tool_execute_parameters (parameter_setting , kwargs )
71113 tool_id = trigger_task .get ('source_id' )
72114 task_record_id = uuid .uuid7 ()
73115
@@ -82,14 +124,22 @@ def execute(self, trigger_task, **kwargs):
82124 state = State .STARTED
83125 ).save ()
84126
127+ start_time = time .time ()
85128 try :
86129 tool = QuerySet (Tool ).filter (id = tool_id ).first ()
130+ parameters = get_tool_execute_parameters (tool .input_field_list , parameter_setting , kwargs )
131+
87132 executor = ToolExecutor ()
88- # executor.exec_code(tool.code, parameters)
89- print (tool )
90- print (parameters )
133+ result = executor .exec_code (tool .code , parameters )
134+ maxkb_logger .info (f"Tool execution result: { result } " )
91135
92- QuerySet (TaskRecord ).filter (id = task_record_id ).update (state = State .SUCCESS , run_time = 0 )
136+ QuerySet (TaskRecord ).filter (id = task_record_id ).update (
137+ state = State .SUCCESS ,
138+ run_time = time .time () - start_time
139+ )
93140 except Exception as e :
94- state = State .FAILURE
95- QuerySet (TaskRecord ).filter (id = task_record_id ).update (state = state , run_time = 0 )
141+ maxkb_logger .error (f"Tool execution error: { traceback .format_exc ()} " )
142+ QuerySet (TaskRecord ).filter (id = task_record_id ).update (
143+ state = State .FAILURE ,
144+ run_time = time .time () - start_time
145+ )
0 commit comments