Skip to content

Commit b18cd78

Browse files
committed
feat: add function to extract tool ID from raw ID
1 parent fd400f2 commit b18cd78

File tree

1 file changed

+27
-1
lines changed

1 file changed

+27
-1
lines changed

apps/application/flow/tools.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import asyncio
1010
import json
1111
import queue
12+
import re
1213
import threading
1314
from typing import Iterator
1415

@@ -283,6 +284,31 @@ def run_forever():
283284
return _global_loop
284285

285286

287+
def _extract_tool_id(raw_id):
288+
"""从 raw_id 中提取最后一个符合 call_... 模式的 id,若无匹配则返回原值或 None"""
289+
if not raw_id:
290+
return None
291+
if not isinstance(raw_id, str):
292+
raw_id = str(raw_id)
293+
294+
s = raw_id
295+
prefix = 'call_'
296+
positions = [m.start() for m in re.finditer(re.escape(prefix), s)]
297+
if not positions:
298+
return raw_id
299+
300+
# 取最后一个前缀位置,截到下一个前缀或结尾
301+
start = positions[-1]
302+
end = len(s)
303+
for pos in positions:
304+
if pos > start:
305+
end = pos
306+
break
307+
308+
tool_id = s[start:end]
309+
return tool_id or raw_id
310+
311+
286312
async def _yield_mcp_response(chat_model, message_list, mcp_servers, mcp_output_enable=True):
287313
try:
288314
client = MultiServerMCPClient(json.loads(mcp_servers))
@@ -342,7 +368,7 @@ async def _yield_mcp_response(chat_model, message_list, mcp_servers, mcp_output_
342368
yield chunk[0]
343369

344370
if mcp_output_enable and isinstance(chunk[0], ToolMessage):
345-
tool_id = chunk[0].tool_call_id
371+
tool_id = _extract_tool_id(chunk[0].tool_call_id)
346372
if tool_id in tool_calls_info:
347373
tool_info = tool_calls_info[tool_id]
348374
content = generate_tool_message_complete(

0 commit comments

Comments
 (0)