Skip to content

Commit af4f9e5

Browse files
committed
fix: improve default parameter handling in MCP tool code generation
1 parent 3830ee9 commit af4f9e5

File tree

1 file changed

+26
-22
lines changed

1 file changed

+26
-22
lines changed

apps/common/utils/tool_code.py

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -103,31 +103,35 @@ def _generate_mcp_server_code(self, _code, params):
103103
# 修改函数参数以包含 params 中的默认值
104104
arg_names = [arg.arg for arg in node.args.args]
105105

106-
# 为有默认值的参数添加默认值
106+
# 为参数添加默认值,确保参数顺序正确
107107
defaults = []
108-
for arg_name in arg_names:
108+
num_defaults = 0
109+
110+
# 从后往前检查哪些参数有默认值
111+
for i, arg_name in enumerate(arg_names):
109112
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))
113+
num_defaults = len(arg_names) - i
114+
break
115+
116+
# 为有默认值的参数创建默认值列表
117+
if num_defaults > 0:
118+
for i in range(len(arg_names) - num_defaults, len(arg_names)):
119+
arg_name = arg_names[i]
120+
if arg_name in params:
121+
default_value = params[arg_name]
122+
if isinstance(default_value, str):
123+
defaults.append(ast.Constant(value=default_value))
124+
elif isinstance(default_value, (int, float, bool)):
125+
defaults.append(ast.Constant(value=default_value))
126+
elif default_value is None:
127+
defaults.append(ast.Constant(value=None))
128+
else:
129+
defaults.append(ast.Constant(value=str(default_value)))
118130
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]
131+
# 如果某个参数没有默认值,需要添加 None 占位
132+
defaults.append(ast.Constant(value=None))
133+
134+
node.args.defaults = defaults
131135

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

0 commit comments

Comments
 (0)