Skip to content

Commit 3830ee9

Browse files
committed
feat: enhance function parameter handling to support default values
1 parent 5e99770 commit 3830ee9

File tree

1 file changed

+27
-23
lines changed

1 file changed

+27
-23
lines changed

apps/common/utils/tool_code.py

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -101,29 +101,33 @@ def _generate_mcp_server_code(self, _code, params):
101101
imports.append(ast.unparse(node))
102102
elif isinstance(node, ast.FunctionDef):
103103
# 修改函数参数以包含 params 中的默认值
104-
func_name = node.name
105-
if func_name in params:
106-
func_params = params[func_name]
107-
# 为函数参数设置默认值
108-
for i, arg in enumerate(node.args.args):
109-
arg_name = arg.arg
110-
if arg_name in func_params:
111-
# 创建默认值节点
112-
default_value = func_params[arg_name]
113-
if isinstance(default_value, str):
114-
default_node = ast.Constant(value=default_value)
115-
elif isinstance(default_value, (int, float, bool)):
116-
default_node = ast.Constant(value=default_value)
117-
else:
118-
default_node = ast.Constant(value=str(default_value))
119-
120-
# 添加到defaults列表
121-
if not hasattr(node.args, 'defaults') or node.args.defaults is None:
122-
node.args.defaults = []
123-
# 确保defaults列表长度正确
124-
while len(node.args.defaults) < len(node.args.args):
125-
node.args.defaults.insert(0, None)
126-
node.args.defaults[i] = default_node
104+
arg_names = [arg.arg for arg in node.args.args]
105+
106+
# 为有默认值的参数添加默认值
107+
defaults = []
108+
for arg_name in arg_names:
109+
if arg_name in params:
110+
# 将参数值转换为 AST 节点
111+
default_value = params[arg_name]
112+
if isinstance(default_value, str):
113+
defaults.append(ast.Constant(value=default_value))
114+
elif isinstance(default_value, (int, float, bool)):
115+
defaults.append(ast.Constant(value=default_value))
116+
elif default_value is None:
117+
defaults.append(ast.Constant(value=None))
118+
else:
119+
# 对于复杂类型,使用字符串表示
120+
defaults.append(ast.Constant(value=str(default_value)))
121+
else:
122+
defaults.append(None)
123+
124+
# 只保留非 None 的默认值(从右到左)
125+
while defaults and defaults[-1] is None:
126+
defaults.pop()
127+
128+
# 更新函数的默认参数
129+
if defaults:
130+
node.args.defaults = [d for d in defaults if d is not None]
127131

128132
func_code = ast.unparse(node)
129133
functions.append(f"@mcp.tool()\n{func_code}\n")

0 commit comments

Comments
 (0)