Skip to content

Commit 182c9e2

Browse files
committed
feat: add tool_init_params to mcp_response_generator for enhanced tool handling
--bug=1066029@tapd-62980211 --user=刘瑞斌 【工具】工具执行记录中不应该记录传递的启动参数 https://www.tapd.cn/62980211/s/1840687
1 parent 9b105d1 commit 182c9e2

File tree

3 files changed

+24
-10
lines changed

3 files changed

+24
-10
lines changed

apps/application/chat_pipeline/step/chat_step/impl/base_chat_step.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ def _handle_mcp_request(self, mcp_source, mcp_servers, mcp_tool_ids, tool_ids,
245245
if mcp_tool and mcp_tool['is_active']:
246246
mcp_servers_config = {**mcp_servers_config, **json.loads(mcp_tool['code'])}
247247

248+
tool_init_params = {}
248249
if tool_ids and len(tool_ids) > 0: # 如果有工具ID,则将其转换为MCP
249250
self.context['tool_ids'] = tool_ids
250251
for tool_id in tool_ids:
@@ -254,6 +255,7 @@ def _handle_mcp_request(self, mcp_source, mcp_servers, mcp_tool_ids, tool_ids,
254255
executor = ToolExecutor()
255256
if tool.init_params is not None:
256257
params = json.loads(rsa_long_decrypt(tool.init_params))
258+
tool_init_params = json.loads(rsa_long_decrypt(tool.init_params))
257259
else:
258260
params = {}
259261
tool_config = executor.get_tool_mcp_config(tool.code, params, tool.name, tool.desc)
@@ -288,7 +290,7 @@ def _handle_mcp_request(self, mcp_source, mcp_servers, mcp_tool_ids, tool_ids,
288290
mcp_servers_config[app.name] = app_config
289291

290292
if len(mcp_servers_config) > 0:
291-
return mcp_response_generator(chat_model, message_list, json.dumps(mcp_servers_config), mcp_output_enable)
293+
return mcp_response_generator(chat_model, message_list, json.dumps(mcp_servers_config), mcp_output_enable, tool_init_params)
292294

293295
return None
294296

apps/application/flow/step_node/ai_chat_step_node/impl/base_chat_node.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ def _handle_mcp_request(self, mcp_source, mcp_servers, mcp_tool_id, mcp_tool_ids
230230
if mcp_tool and mcp_tool['is_active']:
231231
mcp_servers_config = {**mcp_servers_config, **json.loads(mcp_tool['code'])}
232232
mcp_servers_config = self.handle_variables(mcp_servers_config)
233-
233+
tool_init_params = {}
234234
if tool_ids and len(tool_ids) > 0: # 如果有工具ID,则将其转换为MCP
235235
self.context['tool_ids'] = tool_ids
236236
for tool_id in tool_ids:
@@ -240,6 +240,7 @@ def _handle_mcp_request(self, mcp_source, mcp_servers, mcp_tool_id, mcp_tool_ids
240240
executor = ToolExecutor()
241241
if tool.init_params is not None:
242242
params = json.loads(rsa_long_decrypt(tool.init_params))
243+
tool_init_params = json.loads(rsa_long_decrypt(tool.init_params))
243244
else:
244245
params = {}
245246
tool_config = executor.get_tool_mcp_config(tool.code, params, tool.name, tool.desc)
@@ -274,7 +275,7 @@ def _handle_mcp_request(self, mcp_source, mcp_servers, mcp_tool_id, mcp_tool_ids
274275
mcp_servers_config[app.name] = app_config
275276

276277
if len(mcp_servers_config) > 0:
277-
r = mcp_response_generator(chat_model, message_list, json.dumps(mcp_servers_config), mcp_output_enable)
278+
r = mcp_response_generator(chat_model, message_list, json.dumps(mcp_servers_config), mcp_output_enable, tool_init_params)
278279
return NodeResult(
279280
{'result': r, 'chat_model': chat_model, 'message_list': message_list,
280281
'history_message': [{'content': message.content, 'role': message.type} for message in

apps/application/flow/tools.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,16 @@
1313
import threading
1414
from functools import reduce
1515
from typing import Iterator
16-
from maxkb.const import CONFIG
16+
1717
from django.http import StreamingHttpResponse
1818
from langchain_core.messages import BaseMessageChunk, BaseMessage, ToolMessage, AIMessageChunk
1919
from langchain_mcp_adapters.client import MultiServerMCPClient
2020
from langgraph.prebuilt import create_react_agent
21+
2122
from application.flow.i_step_node import WorkFlowPostHandler
2223
from common.result import result
2324
from common.utils.logger import maxkb_logger
25+
from maxkb.const import CONFIG
2426

2527

2628
class Reasoning:
@@ -104,7 +106,7 @@ def get_reasoning_content(self, chunk):
104106
if reasoning_content_end_tag_index > -1:
105107
reasoning_content_chunk = self.reasoning_content_chunk[0:reasoning_content_end_tag_index]
106108
content_chunk = self.reasoning_content_chunk[
107-
reasoning_content_end_tag_index + self.reasoning_content_end_tag_len:]
109+
reasoning_content_end_tag_index + self.reasoning_content_end_tag_len:]
108110
self.reasoning_content += reasoning_content_chunk
109111
self.content += content_chunk
110112
self.reasoning_content_chunk = ""
@@ -314,7 +316,7 @@ def _extract_tool_id(raw_id):
314316
return tool_id or raw_id
315317

316318

317-
async def _yield_mcp_response(chat_model, message_list, mcp_servers, mcp_output_enable=True):
319+
async def _yield_mcp_response(chat_model, message_list, mcp_servers, mcp_output_enable=True, tool_init_params={}):
318320
try:
319321
client = MultiServerMCPClient(json.loads(mcp_servers))
320322
tools = await client.get_tools()
@@ -362,11 +364,20 @@ async def _yield_mcp_response(chat_model, message_list, mcp_servers, mcp_output_
362364
# 尝试解析 JSON,判断是否完整
363365
if entry['id'] and entry['arguments']:
364366
try:
365-
json.loads(entry['arguments'])
367+
parsed_args = json.loads(entry['arguments'])
368+
# 过滤掉 tool_init_params 中的参数
369+
if tool_init_params:
370+
filtered_args = {
371+
k: v for k, v in parsed_args.items()
372+
if k not in tool_init_params
373+
}
374+
else:
375+
filtered_args = parsed_args
376+
366377
# JSON 完整,保存到 tool_calls_info
367378
tool_calls_info[entry['id']] = {
368379
'name': entry['name'],
369-
'input': entry['arguments']
380+
'input': json.dumps(filtered_args, ensure_ascii=False)
370381
}
371382
# 从 fragments 中移除
372383
del _tool_fragments[idx]
@@ -410,14 +421,14 @@ def get_real_error(exc):
410421
raise RuntimeError(error_msg) from None
411422

412423

413-
def mcp_response_generator(chat_model, message_list, mcp_servers, mcp_output_enable=True):
424+
def mcp_response_generator(chat_model, message_list, mcp_servers, mcp_output_enable=True, tool_init_params={}):
414425
"""使用全局事件循环,不创建新实例"""
415426
result_queue = queue.Queue()
416427
loop = get_global_loop() # 使用共享循环
417428

418429
async def _run():
419430
try:
420-
async_gen = _yield_mcp_response(chat_model, message_list, mcp_servers, mcp_output_enable)
431+
async_gen = _yield_mcp_response(chat_model, message_list, mcp_servers, mcp_output_enable, tool_init_params)
421432
async for chunk in async_gen:
422433
result_queue.put(('data', chunk))
423434
except Exception as e:

0 commit comments

Comments
 (0)