From bd891029dfa96403e1bb2f62a54c87d7394b5ab3 Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Sun, 12 Apr 2026 01:13:12 +0800 Subject: [PATCH] feat(tool-approval): add run_python preview support --- server/chat_flow_tool_loop.py | 10 ++++++++++ static/src/components/panels/ToolApprovalPanel.vue | 9 ++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/server/chat_flow_tool_loop.py b/server/chat_flow_tool_loop.py index c5fd659..92adce4 100644 --- a/server/chat_flow_tool_loop.py +++ b/server/chat_flow_tool_loop.py @@ -99,6 +99,16 @@ def _build_tool_approval_preview(web_terminal, function_name: str, arguments: Di preview["summary"] = f"执行命令: {args.get('command') or ''}" return preview + if function_name in {"run_python", "runpython"}: + code = str(args.get("code") or "") + timeout = args.get("timeout") + preview["code"] = code + preview["timeout"] = timeout + # 兼容前端已有 command 展示分支 + preview["command"] = code + preview["summary"] = f"执行 Python 代码(timeout={timeout if timeout is not None else '未提供'}s)" + return preview + if function_name in {"create_file", "create_folder", "delete_file"}: preview["path"] = args.get("path") preview["summary"] = f"{function_name}: {args.get('path') or ''}" diff --git a/static/src/components/panels/ToolApprovalPanel.vue b/static/src/components/panels/ToolApprovalPanel.vue index 80f2600..ecbdf4f 100644 --- a/static/src/components/panels/ToolApprovalPanel.vue +++ b/static/src/components/panels/ToolApprovalPanel.vue @@ -69,7 +69,7 @@
{{ item.preview?.command || '' }}
+ >{{ item.preview?.code || item.preview?.command || '' }}
工具:{{ item.tool_name }}
@@ -126,7 +126,8 @@ defineEmits<{ }>(); const isEditPreview = (item: any) => item?.tool_name === 'edit_file' && item?.preview?.edit_context; -const isCommandPreview = (item: any) => ['run_command', 'terminal_input'].includes(item?.tool_name); +const isCommandPreview = (item: any) => + ['run_command', 'terminal_input', 'run_python', 'runpython'].includes(item?.tool_name); const isWritePreview = (item: any) => item?.tool_name === 'write_file'; const isRenamePreview = (item: any) => item?.tool_name === 'rename_file'; const isPathOnlyPreview = (item: any) => @@ -149,7 +150,9 @@ const getToolLabel = (toolName: string) => { delete_file: '删除文件', rename_file: '重命名文件', write_file: '写入文件', - edit_file: '编辑文件' + edit_file: '编辑文件', + run_python: '执行 Python', + runpython: '执行 Python' }; return map[name] || name || '待审批操作'; };