Skip to content

Commit 4269750

Browse files
committed
feat: add type coercion for tool execution parameters in tool_task.py
1 parent 05d89f9 commit 4269750

1 file changed

Lines changed: 59 additions & 9 deletions

File tree

apps/trigger/handler/impl/task/tool_task.py

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66
@date:2026/1/14 19:14
77
@desc:
88
"""
9+
import time
10+
import traceback
911

1012
import uuid_utils.compat as uuid
1113
from django.db.models import QuerySet
1214

15+
from common.utils.logger import maxkb_logger
1316
from common.utils.tool_code import ToolExecutor
1417
from knowledge.models.knowledge_action import State
1518
from 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

Comments
 (0)