From 5fbff1e85a7578861533edf3460b6b4583f3c3f4 Mon Sep 17 00:00:00 2001 From: Meghan Morrow <129645384+STUzhy@users.noreply.github.com> Date: Thu, 10 Jul 2025 17:18:31 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E8=87=AA=E6=A3=80=E5=B9=B6=E8=A1=8C=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加并行测试开关UI,允许用户选择串行或并行测试模式 - 实现makeParallelTest函数,支持在单个对话请求中并行测试多个工具 - 优化测试逻辑,提升测试效率和用户体验 - 添加中英文国际化支持 - 保持向后兼容,默认使用串行测试模式 --- .../main-panel/tool/auto-detector/diagram.ts | 119 ++++++++++++++++++ .../main-panel/tool/auto-detector/index.vue | 72 +++++++---- renderer/src/i18n/en.json | 1 + renderer/src/i18n/zh-cn.json | 1 + 4 files changed, 169 insertions(+), 24 deletions(-) diff --git a/renderer/src/components/main-panel/tool/auto-detector/diagram.ts b/renderer/src/components/main-panel/tool/auto-detector/diagram.ts index bc3dcf4..bf6596b 100644 --- a/renderer/src/components/main-panel/tool/auto-detector/diagram.ts +++ b/renderer/src/components/main-panel/tool/auto-detector/diagram.ts @@ -161,6 +161,125 @@ export function topoSortParallel(state: DiagramState): string[][] { return result; } +export async function makeParallelTest( + dataViews: Reactive[], + enableXmlWrapper: boolean, + prompt: string | null = null, + context: DiagramContext +) { + if (dataViews.length === 0) { + return; + } + + // 设置所有节点状态为运行中 + const createAt = Date.now(); + dataViews.forEach(dataView => { + dataView.status = 'running'; + dataView.createAt = createAt; + }); + context.render(); + + try { + const loop = new TaskLoop({ maxEpochs: 1 }); + + // 构建所有工具的信息 + const allTools = dataViews.map(dataView => ({ + name: dataView.tool.name, + description: dataView.tool.description, + inputSchema: dataView.tool.inputSchema, + enabled: true + })); + + // 构建测试提示词,包含所有工具 + const toolNames = dataViews.map(dv => dv.tool.name).join(', '); + const usePrompt = (prompt || 'please call the tools {tool} to make some test').replace('{tool}', toolNames); + + const chatStorage = { + messages: [], + settings: { + temperature: 0.6, + systemPrompt: '', + enableTools: allTools, + enableWebSearch: false, + contextLength: 5, + enableXmlWrapper, + parallelToolCalls: true // 开启并行工具调用 + } + } as ChatStorage; + + loop.setMaxEpochs(1); + + // 记录工具调用信息,用于匹配工具调用结果 + const toolCallMap: Map> = new Map(); // toolCallId -> dataView + let completedToolsCount = 0; + + loop.registerOnToolCall(toolCall => { + // 找到对应的dataView + const dataView = dataViews.find(dv => dv.tool.name === toolCall.function?.name); + if (dataView) { + dataView.function = toolCall.function; + dataView.llmTimecost = Date.now() - createAt; + context.render(); + + // 记录工具调用ID与dataView的映射 + if (toolCall.id) { + toolCallMap.set(toolCall.id, dataView); + } + } + return toolCall; + }); + + loop.registerOnToolCalled(toolCalled => { + // 这里我们需要改变策略,因为没有工具调用ID信息 + // 对于并行调用,我们可以根据工具调用的顺序来匹配结果 + // 简单的策略:找到第一个仍在运行状态的工具 + const runningView = dataViews.find(dv => dv.status === 'running'); + if (runningView) { + runningView.toolcallTimecost = Date.now() - createAt - (runningView.llmTimecost || 0); + + if (toolCalled.state === MessageState.Success) { + runningView.status = 'success'; + runningView.result = toolCalled.content; + } else { + runningView.status = 'error'; + runningView.result = toolCalled.content; + } + + completedToolsCount++; + context.render(); + + // 如果所有工具都完成了,终止循环 + if (completedToolsCount >= dataViews.length) { + loop.abort(); + } + } + return toolCalled; + }); + + loop.registerOnError(error => { + dataViews.forEach(dataView => { + if (dataView.status === 'running') { + dataView.status = 'error'; + dataView.result = error; + } + }); + context.render(); + }); + + await loop.start(chatStorage, usePrompt); + + } finally { + const finishAt = Date.now(); + dataViews.forEach(dataView => { + dataView.finishAt = finishAt; + if (dataView.status === 'running') { + dataView.status = 'success'; + } + }); + context.render(); + } +} + export async function makeNodeTest( dataView: Reactive, enableXmlWrapper: boolean, diff --git a/renderer/src/components/main-panel/tool/auto-detector/index.vue b/renderer/src/components/main-panel/tool/auto-detector/index.vue index 035b407..217af14 100644 --- a/renderer/src/components/main-panel/tool/auto-detector/index.vue +++ b/renderer/src/components/main-panel/tool/auto-detector/index.vue @@ -37,6 +37,13 @@ color: enableXmlWrapper ? 'var(--main-color)' : undefined }">XML +
+ + {{ t('parallel-test') }} +
{{ t("cancel") }} @@ -70,7 +77,7 @@