feat: add variable handling for tool parameters in base_chat_node and base_mcp_node

--story=1019430 --user=刘瑞斌 GitHub#3113 【MCP调用】MCP配置支持传入变量 https://www.tapd.cn/62980211/s/1775665
This commit is contained in:
CaptainB 2025-09-18 10:48:11 +08:00
parent b9ac3b941d
commit c1a214b08f
2 changed files with 20 additions and 0 deletions

View File

@ -220,11 +220,13 @@ class BaseChatNode(IChatNode):
mcp_tool_ids = list(set(mcp_tool_ids + [mcp_tool_id]))
if mcp_source == 'custom' and mcp_servers is not None and '"stdio"' not in mcp_servers:
mcp_servers_config = json.loads(mcp_servers)
mcp_servers_config = self.handle_variables(mcp_servers_config)
elif mcp_tool_ids:
mcp_tools = QuerySet(Tool).filter(id__in=mcp_tool_ids).values()
for mcp_tool in mcp_tools:
if mcp_tool and mcp_tool['is_active']:
mcp_servers_config = {**mcp_servers_config, **json.loads(mcp_tool['code'])}
mcp_servers_config = self.handle_variables(mcp_servers_config)
if tool_enable:
if tool_ids and len(tool_ids) > 0: # 如果有工具ID则将其转换为MCP
@ -253,6 +255,22 @@ class BaseChatNode(IChatNode):
return None
def handle_variables(self, tool_params):
# 处理参数中的变量
for k, v in tool_params.items():
if type(v) == str:
tool_params[k] = self.workflow_manage.generate_prompt(tool_params[k])
if type(v) == dict:
self.handle_variables(v)
if (type(v) == list) and (type(v[0]) == str):
tool_params[k] = self.get_reference_content(v)
return tool_params
def get_reference_content(self, fields: List[str]):
return str(self.workflow_manage.get_reference_field(
fields[0],
fields[1:]))
@staticmethod
def get_history_message(history_chat_record, dialogue_number, dialogue_type, runtime_node_id):
start_index = len(history_chat_record) - dialogue_number

View File

@ -27,10 +27,12 @@ class BaseMcpNode(IMcpNode):
if not tool.is_active:
raise ValueError(f"Tool with ID {mcp_tool_id} is inactive.")
servers = json.loads(tool.code)
servers = self.handle_variables(servers) # 处理servers中的变量
params = json.loads(json.dumps(tool_params))
params = self.handle_variables(params)
else:
servers = json.loads(mcp_servers)
servers = self.handle_variables(servers) # 处理servers中的变量
params = json.loads(json.dumps(tool_params))
params = self.handle_variables(params)