From 1c8a447dc777d400ecbe8b310ae3b89b756fbb04 Mon Sep 17 00:00:00 2001 From: Kirigaya <1193466151@qq.com> Date: Sun, 13 Jul 2025 23:59:02 +0800 Subject: [PATCH 1/3] release parallel test --- renderer/src/api/message-bridge.ts | 27 ++++++++++++------- .../main-panel/chat/core/task-loop.ts | 7 +++-- .../auto-detector/diagram-item-record.vue | 3 ++- .../main-panel/tool/auto-detector/diagram.ts | 7 +++-- .../main-panel/tool/auto-detector/diagram.vue | 20 +++++++++++++- .../main-panel/tool/auto-detector/index.vue | 7 ++++- service/src/common/router.ts | 10 +++++-- service/src/llm/llm.service.ts | 6 +++-- service/src/main.ts | 1 + 9 files changed, 66 insertions(+), 22 deletions(-) diff --git a/renderer/src/api/message-bridge.ts b/renderer/src/api/message-bridge.ts index 231973d..a998ece 100644 --- a/renderer/src/api/message-bridge.ts +++ b/renderer/src/api/message-bridge.ts @@ -1,6 +1,7 @@ import { pinkLog, redLog } from '@/views/setting/util'; import { acquireVsCodeApi, electronApi, getPlatform } from './platform'; import { isReactive } from 'vue'; +import { v4 as uuidv4 } from 'uuid'; export interface VSCodeMessage { command: string; @@ -9,6 +10,7 @@ export interface VSCodeMessage { } export interface RestFulResponse { + _id?: string code: number; msg: T; } @@ -163,8 +165,8 @@ export class MessageBridge { const command = message.command; const data = message.data; - const handlers = this.handlers.get(command) || []; - handlers.forEach(handler => handler(data)); + const handlers = this.handlers.get(command) || new Set(); + handlers.forEach(handler => handler(data)); } public postMessage(message: VSCodeMessage) { @@ -231,15 +233,22 @@ export class MessageBridge { * @returns */ public commandRequest(command: string, data?: ICommandRequestData): Promise> { - - return new Promise((resolve, reject) => { - this.addCommandListener(command, (data) => { - resolve(data as RestFulResponse); - }, { once: true }); + const _id = uuidv4(); + + return new Promise((resolve, reject) => { + const handler = this.addCommandListener(command, (data) => { + if (data._id === _id) { + handler(); + resolve(data as RestFulResponse); + } + }, { once: false }); this.postMessage({ - command, - data: this.deserializeReactiveData(data) + command, + data: this.deserializeReactiveData({ + _id, + ...data + }) }); }); } diff --git a/renderer/src/components/main-panel/chat/core/task-loop.ts b/renderer/src/components/main-panel/chat/core/task-loop.ts index 96c46b6..b53b1ee 100644 --- a/renderer/src/components/main-panel/chat/core/task-loop.ts +++ b/renderer/src/components/main-panel/chat/core/task-loop.ts @@ -221,6 +221,7 @@ export class TaskLoop { }, { once: false }); const doneHandler = this.bridge.addCommandListener('llm/chat/completions/done', data => { + if (data.sessionId !== sessionId) { return; } @@ -229,11 +230,12 @@ export class TaskLoop { chunkHandler(); errorHandler(); + doneHandler(); resolve({ stop: false }); - }, { once: true }); + }, { once: false }); const errorHandler = this.bridge.addCommandListener('llm/chat/completions/error', data => { if (data.sessionId !== sessionId) { @@ -246,13 +248,14 @@ export class TaskLoop { }); chunkHandler(); + errorHandler(); doneHandler(); resolve({ stop: true }); - }, { once: true }); + }, { once: false }); this.bridge.postMessage({ command: 'llm/chat/completions', diff --git a/renderer/src/components/main-panel/tool/auto-detector/diagram-item-record.vue b/renderer/src/components/main-panel/tool/auto-detector/diagram-item-record.vue index 85c107c..f870485 100644 --- a/renderer/src/components/main-panel/tool/auto-detector/diagram-item-record.vue +++ b/renderer/src/components/main-panel/tool/auto-detector/diagram-item-record.vue @@ -182,7 +182,7 @@ const toolcallPercent = computed(() => { .item-json { border-radius: 4px; padding: 6px 10px; - font-size: 15px; + font-size: 13px; font-family: var(--code-font-family, monospace); margin: 2px 0 8px 0; white-space: pre-wrap; @@ -193,6 +193,7 @@ const toolcallPercent = computed(() => { } .code-container { + font-size: 13px; margin-top: 10px; border-radius: .3em; padding: 0 10px; 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 633140f..ec76f11 100644 --- a/renderer/src/components/main-panel/tool/auto-detector/diagram.ts +++ b/renderer/src/components/main-panel/tool/auto-detector/diagram.ts @@ -51,6 +51,7 @@ export interface NodeDataView { export interface DiagramContext { preset: (type: string) => void, render: () => void, + resetDataView: () => void, state?: DiagramState, setCaption: (value: string) => void } @@ -178,7 +179,7 @@ export async function makeNodeTest( context.render(); try { - const loop = new TaskLoop({ maxEpochs: 1 }); + const loop = new TaskLoop({ maxEpochs: 1, verbose: 0 }); const usePrompt = (prompt || 'please call the tool {tool} to make some test').replace('{tool}', dataView.tool.name); const chatStorage = { messages: [], @@ -198,8 +199,6 @@ export async function makeNodeTest( } } as ChatStorage; - loop.setMaxEpochs(1); - let aiMockJson: any = undefined; loop.registerOnToolCall(toolCall => { @@ -225,7 +224,7 @@ export async function makeNodeTest( return toolCall; }); - loop.registerOnToolCalled(toolCalled => { + loop.registerOnToolCalled(toolCalled => { dataView.toolcallTimecost = Date.now() - createAt - dataView.llmTimecost!; if (toolCalled.state === MessageState.Success) { diff --git a/renderer/src/components/main-panel/tool/auto-detector/diagram.vue b/renderer/src/components/main-panel/tool/auto-detector/diagram.vue index eaecf05..789db0f 100644 --- a/renderer/src/components/main-panel/tool/auto-detector/diagram.vue +++ b/renderer/src/components/main-panel/tool/auto-detector/diagram.vue @@ -188,7 +188,7 @@ const drawDiagram = async () => { // 如果保存了 edges 信息,则需要进行同步 const reservedEdges = autoDetectDiagram?.edges; - if (reservedEdges && reservedEdges.length > 0) { + if (reservedEdges) { for (const edge of reservedEdges) { if (edge.sources && edge.targets && edge.sources.length > 0 && edge.targets.length > 0) { edges.push({ @@ -662,6 +662,24 @@ function getNodePopupStyle(node: any): any { height: `${popupHeight}px` }; } + +// 重置所有节点的状态为初始值 +function resetDataView() { + state.dataView.forEach((view, key) => { + state.dataView.set(key, { + ...view, + status: 'waiting', + result: null, + createAt: undefined, + finishAt: undefined, + llmTimecost: undefined, + toolcallTimecost: undefined + }); + }); +} + +context.resetDataView = resetDataView; +