From af4f9e5139972e6ba7a1ced6b270e1541d233477 Mon Sep 17 00:00:00 2001 From: CaptainB Date: Wed, 13 Aug 2025 13:36:13 +0800 Subject: [PATCH] fix: improve default parameter handling in MCP tool code generation --- apps/common/utils/tool_code.py | 46 ++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/apps/common/utils/tool_code.py b/apps/common/utils/tool_code.py index 2b2157e84..9e0f950e2 100644 --- a/apps/common/utils/tool_code.py +++ b/apps/common/utils/tool_code.py @@ -103,31 +103,35 @@ except Exception as e: # 修改函数参数以包含 params 中的默认值 arg_names = [arg.arg for arg in node.args.args] - # 为有默认值的参数添加默认值 + # 为参数添加默认值,确保参数顺序正确 defaults = [] - for arg_name in arg_names: + num_defaults = 0 + + # 从后往前检查哪些参数有默认值 + for i, arg_name in enumerate(arg_names): if arg_name in params: - # 将参数值转换为 AST 节点 - default_value = params[arg_name] - if isinstance(default_value, str): - defaults.append(ast.Constant(value=default_value)) - elif isinstance(default_value, (int, float, bool)): - defaults.append(ast.Constant(value=default_value)) - elif default_value is None: - defaults.append(ast.Constant(value=None)) + num_defaults = len(arg_names) - i + break + + # 为有默认值的参数创建默认值列表 + if num_defaults > 0: + for i in range(len(arg_names) - num_defaults, len(arg_names)): + arg_name = arg_names[i] + if arg_name in params: + default_value = params[arg_name] + if isinstance(default_value, str): + defaults.append(ast.Constant(value=default_value)) + elif isinstance(default_value, (int, float, bool)): + defaults.append(ast.Constant(value=default_value)) + elif default_value is None: + defaults.append(ast.Constant(value=None)) + else: + defaults.append(ast.Constant(value=str(default_value))) else: - # 对于复杂类型,使用字符串表示 - defaults.append(ast.Constant(value=str(default_value))) - else: - defaults.append(None) + # 如果某个参数没有默认值,需要添加 None 占位 + defaults.append(ast.Constant(value=None)) - # 只保留非 None 的默认值(从右到左) - while defaults and defaults[-1] is None: - defaults.pop() - - # 更新函数的默认参数 - if defaults: - node.args.defaults = [d for d in defaults if d is not None] + node.args.defaults = defaults func_code = ast.unparse(node) functions.append(f"@mcp.tool()\n{func_code}\n")