From f37b8babcd756a9f10ed8d05c5e9f944ee1cfb10 Mon Sep 17 00:00:00 2001 From: Kirigaya <1193466151@qq.com> Date: Wed, 21 May 2025 20:29:50 +0800 Subject: [PATCH] =?UTF-8?q?0.1.0=20=E6=89=80=E6=9C=89=20mvp=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 + README.md | 2 +- renderer/public/iconfont.css | 10 +- renderer/public/iconfont.woff2 | Bin 6700 -> 6772 bytes .../main-panel/chat/chat-box/chat.ts | 53 +- .../chat-box/options/parallel-tool-calls.vue | 25 + .../chat/chat-box/options/setting.vue | 9 +- .../chat/chat-box/options/tool-use.vue | 42 +- .../main-panel/chat/core/handle-tool-calls.ts | 4 +- .../main-panel/chat/core/task-loop.ts | 4 +- .../main-panel/prompt/prompt-templates.vue | 4 - .../resource/resource-list-templates.vue | 4 - .../main-panel/resource/resource-list.vue | 4 - .../components/main-panel/tool/tool-list.vue | 4 - .../src/components/main-panel/tool/tools.ts | 27 +- renderer/src/i18n/ar.json | 3 +- renderer/src/i18n/de.json | 3 +- renderer/src/i18n/en.json | 3 +- renderer/src/i18n/fr.json | 3 +- renderer/src/i18n/ja.json | 3 +- renderer/src/i18n/ko.json | 3 +- renderer/src/i18n/ru.json | 3 +- renderer/src/i18n/zh-cn.json | 3 +- renderer/src/i18n/zh-tw.json | 3 +- renderer/src/views/connect/connection-log.vue | 6 +- .../src/views/connect/connection-panel.vue | 19 +- renderer/src/views/connect/core.ts | 54 +- renderer/src/views/connect/index.vue | 4 +- renderer/src/views/connect/type.ts | 8 +- renderer/src/views/setting/api.ts | 5 +- service/src/hook/llm.ts | 24 + service/src/llm/llm.controller.ts | 11 - service/src/llm/llm.service.ts | 13 +- service/src/mcp/client.service.ts | 2 +- service/src/mcp/connect.controller.ts | 10 +- service/src/mcp/connect.service.ts | 34 +- service/tabs.my-browser.json | 1434 ++++++++++++++++- 37 files changed, 1684 insertions(+), 161 deletions(-) create mode 100644 renderer/src/components/main-panel/chat/chat-box/options/parallel-tool-calls.vue diff --git a/CHANGELOG.md b/CHANGELOG.md index d758fea..768bd7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ - 新特性:更新协议内容,支持 streamable http 协议,未来将逐步取代 SSE 的连接方式 - 对于 uv 创建的 py 项目进行特殊支持:自动初始化项目,并将 mcp 定向到 .venv/bin/mcp 中,不再需要用户全局安装 mcp - 对于 npm 创建的 js/ts 项目进行特殊支持:自动初始化项目 +- 去除了 websearch 的设置,增加了 parallel_tool_calls 的设置,parallel_tool_calls 默认为 true,代表 允许模型在单轮回复中调用多个工具 +- 重构了 openmcp 连接模块的基础设施,基于新的技术设施实现了更加详细的连接模块的日志系统 ## [main] 0.0.9 - 修复 0.0.8 引入的bug:system prompt 返回的是索引而非真实内容 diff --git a/README.md b/README.md index dc80bf8..4169476 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ | `ext` | 支持基本的 MCP 项目管理 | `迭代版本` | 100% | `P0` | | `service` | 支持自定义支持 openai 接口协议的大模型接入 | `完整版本` | 100% | `Done` | | `service` | 支持自定义接口协议的大模型接入 | `MVP` | 0% | `P1` | -| `all` | 支持同时调试多个 MCP Server | `MVP` | 80% | `P0` | +| `all` | 支持同时调试多个 MCP Server | `MVP` | 100% | `P0` | | `all` | 支持通过大模型进行在线验证 | `迭代版本` | 100% | `Done` | | `all` | 支持对用户对应服务器的调试工作内容进行保存 | `迭代版本` | 100% | `Done` | | `render` | 高危操作权限确认 | `MVP` | 0% | `P1` | diff --git a/renderer/public/iconfont.css b/renderer/public/iconfont.css index feacc0c..2f32010 100644 --- a/renderer/public/iconfont.css +++ b/renderer/public/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 4870215 */ - src: url('iconfont.woff2?t=1746703816245') format('woff2'), - url('iconfont.woff?t=1746703816245') format('woff'), - url('iconfont.ttf?t=1746703816245') format('truetype'); + src: url('iconfont.woff2?t=1747820198035') format('woff2'), + url('iconfont.woff?t=1747820198035') format('woff'), + url('iconfont.ttf?t=1747820198035') format('truetype'); } .iconfont { @@ -13,6 +13,10 @@ -moz-osx-font-smoothing: grayscale; } +.icon-parallel:before { + content: "\e61d"; +} + .icon-waiting:before { content: "\e6d0"; } diff --git a/renderer/public/iconfont.woff2 b/renderer/public/iconfont.woff2 index 45332aee8e083e4cd5867629084226a59147baa3..6e2c510eaa3f7f3c57205d34c4d2b62f2bfda365 100644 GIT binary patch literal 6772 zcmV-)8jIz3Pew8T0RR9102*`v3jhEB05H@502(C#0RR9100000000000000000000 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 WLJn<*O<`IZe<5qe$Y@N2R{#KapC3N} literal 6700 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 Cn%-#u diff --git a/renderer/src/components/main-panel/chat/chat-box/chat.ts b/renderer/src/components/main-panel/chat/chat-box/chat.ts index 0258567..5af36dd 100644 --- a/renderer/src/components/main-panel/chat/chat-box/chat.ts +++ b/renderer/src/components/main-panel/chat/chat-box/chat.ts @@ -47,11 +47,11 @@ export interface TextMessage { export type ChatMessage = ToolMessage | TextMessage; // 新增状态和工具数据 -interface EnableToolItem { - name: string; - description: string; - enabled: boolean; - inputSchema?: any; +export interface EnableToolItem { + name: string; + description: string; + enabled: boolean; + inputSchema: any; } export interface ChatSetting { @@ -61,10 +61,11 @@ export interface ChatSetting { temperature: number enableWebSearch: boolean contextLength: number + parallelToolCalls: boolean } export interface ChatStorage { - messages: ChatMessage[] + messages: ChatMessage[] settings: ChatSetting } @@ -95,8 +96,6 @@ interface TextItem { export type RichTextItem = PromptTextItem | ResourceTextItem | TextItem; -export const allTools = ref([]); - export interface ICommonRenderMessage { role: 'user' | 'assistant/content'; content: string; @@ -110,41 +109,27 @@ export interface IToolRenderMessage { toolResults: ToolCallContent[][]; tool_calls: ToolCall[]; showJson?: Ref; - extraInfo: IExtraInfo; + extraInfo: IExtraInfo; } export type IRenderMessage = ICommonRenderMessage | IToolRenderMessage; export function getToolSchema(enableTools: EnableToolItem[]) { const toolsSchema = []; - for (let i = 0; i < enableTools.length; i++) { + for (let i = 0; i < enableTools.length; i++) { const enableTool = enableTools[i]; if (enableTool.enabled) { - - if (enableTool.inputSchema) { - toolsSchema.push({ - type: 'function', - function: { - name: enableTool.name, - description: enableTool.description || "", - parameters: enableTool.inputSchema - } - }); - } else { - const tool = allTools.value[i]; - - toolsSchema.push({ - type: 'function', - function: { - name: tool.name, - description: tool.description || "", - parameters: tool.inputSchema - } - }); - } - } - } + toolsSchema.push({ + type: 'function', + function: { + name: enableTool.name, + description: enableTool.description || "", + parameters: enableTool.inputSchema + } + }); + } + } return toolsSchema; } diff --git a/renderer/src/components/main-panel/chat/chat-box/options/parallel-tool-calls.vue b/renderer/src/components/main-panel/chat/chat-box/options/parallel-tool-calls.vue new file mode 100644 index 0000000..a9f58c5 --- /dev/null +++ b/renderer/src/components/main-panel/chat/chat-box/options/parallel-tool-calls.vue @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/renderer/src/components/main-panel/chat/chat-box/options/setting.vue b/renderer/src/components/main-panel/chat/chat-box/options/setting.vue index acf72f6..acf23e1 100644 --- a/renderer/src/components/main-panel/chat/chat-box/options/setting.vue +++ b/renderer/src/components/main-panel/chat/chat-box/options/setting.vue @@ -5,7 +5,7 @@ - + @@ -22,7 +22,7 @@ import SystemPrompt from './system-prompt.vue'; import ToolUse from './tool-use.vue'; import Prompt from './prompt.vue'; import Resource from './resource.vue'; -import Websearch from './websearch.vue'; +import ParallelToolCalls from './parallel-tool-calls.vue'; import Temperature from './temperature.vue'; import ContextLength from './context-length.vue'; @@ -57,9 +57,10 @@ if (!tabStorage.settings) { modelIndex: llmManager.currentModelIndex, enableTools: [], enableWebSearch: false, - temperature: 0.7, + temperature: 0.6, contextLength: 20, - systemPrompt: '' + systemPrompt: '', + parallelToolCalls: true } as ChatSetting; } diff --git a/renderer/src/components/main-panel/chat/chat-box/options/tool-use.vue b/renderer/src/components/main-panel/chat/chat-box/options/tool-use.vue index e9ace2a..d7b92ec 100644 --- a/renderer/src/components/main-panel/chat/chat-box/options/tool-use.vue +++ b/renderer/src/components/main-panel/chat/chat-box/options/tool-use.vue @@ -37,9 +37,9 @@ diff --git a/renderer/src/components/main-panel/chat/core/handle-tool-calls.ts b/renderer/src/components/main-panel/chat/core/handle-tool-calls.ts index 41b3379..05d2b8f 100644 --- a/renderer/src/components/main-panel/chat/core/handle-tool-calls.ts +++ b/renderer/src/components/main-panel/chat/core/handle-tool-calls.ts @@ -1,6 +1,6 @@ import type { ToolCallContent, ToolCallResponse } from "@/hook/type"; -import { callTool } from "../../tool/tools"; import { MessageState, type ToolCall } from "../chat-box/chat"; +import { mcpClientAdapter } from "@/views/connect/core"; export interface ToolCallResult { state: MessageState; @@ -25,7 +25,7 @@ export async function handleToolCalls(toolCall: ToolCall): Promise { - for (const client of mcpClientAdapter.clients) { - await client.getPromptTemplates(); - } - if (tabStorage.currentPromptName === undefined) { const masterNode = mcpClientAdapter.masterNode; const prompt = masterNode.promptTemplates?.values().next(); diff --git a/renderer/src/components/main-panel/resource/resource-list-templates.vue b/renderer/src/components/main-panel/resource/resource-list-templates.vue index ba0e76e..e4a428d 100644 --- a/renderer/src/components/main-panel/resource/resource-list-templates.vue +++ b/renderer/src/components/main-panel/resource/resource-list-templates.vue @@ -89,10 +89,6 @@ function handleClick(template: ResourceTemplate) { } onMounted(async () => { - for (const client of mcpClientAdapter.clients) { - await client.getResourceTemplates({ cache: false }); - } - if (tabStorage.currentResourceName === undefined && tabStorage.currentType === 'template') { const masterNode = mcpClientAdapter.masterNode; const resourceTemplate = masterNode?.resourceTemplates?.values().next(); diff --git a/renderer/src/components/main-panel/resource/resource-list.vue b/renderer/src/components/main-panel/resource/resource-list.vue index 8b5122c..6e46bc3 100644 --- a/renderer/src/components/main-panel/resource/resource-list.vue +++ b/renderer/src/components/main-panel/resource/resource-list.vue @@ -91,10 +91,6 @@ async function handleClick(resource: Resources) { } onMounted(async () => { - for (const client of mcpClientAdapter.clients) { - await client.getResources(); - } - if (tabStorage.currentResourceName === undefined && tabStorage.currentType === 'resource') { const masterNode = mcpClientAdapter.masterNode; const resource = masterNode.resources?.values().next(); diff --git a/renderer/src/components/main-panel/tool/tool-list.vue b/renderer/src/components/main-panel/tool/tool-list.vue index d59cd02..79ee547 100644 --- a/renderer/src/components/main-panel/tool/tool-list.vue +++ b/renderer/src/components/main-panel/tool/tool-list.vue @@ -65,10 +65,6 @@ function handleClick(tool: { name: string }) { } onMounted(async () => { - for (const client of mcpClientAdapter.clients) { - await client.getTools(); - } - if (tabStorage.currentToolName === undefined) { const masterNode = mcpClientAdapter.masterNode; const tool = masterNode.tools?.values().next(); diff --git a/renderer/src/components/main-panel/tool/tools.ts b/renderer/src/components/main-panel/tool/tools.ts index de46429..030200b 100644 --- a/renderer/src/components/main-panel/tool/tools.ts +++ b/renderer/src/components/main-panel/tool/tools.ts @@ -1,7 +1,4 @@ -import { useMessageBridge } from '@/api/message-bridge'; -import { mcpSetting } from '@/hook/mcp'; -import type { ToolsListResponse, ToolCallResponse, CasualRestAPI } from '@/hook/type'; -import { mcpClientAdapter } from '@/views/connect/core'; +import type { ToolCallResponse } from '@/hook/type'; export interface ToolStorage { activeNames: any[]; @@ -9,25 +6,3 @@ export interface ToolStorage { lastToolCallResponse?: ToolCallResponse | string; formData: Record; } - -/** - * @description 根据工具名字和参数调取工具 - * @param toolName - * @param toolArgs - * @returns - */ -export async function callTool(toolName: string, toolArgs: Record) { - - mcpClientAdapter - - const bridge = useMessageBridge(); - const { msg } = await bridge.commandRequest('tools/call', { - toolName, - toolArgs: JSON.parse(JSON.stringify(toolArgs)), - callToolOption: { - timeout: mcpSetting.timeout * 1000 - } - }); - - return msg; -} \ No newline at end of file diff --git a/renderer/src/i18n/ar.json b/renderer/src/i18n/ar.json index 58772fc..97ce616 100644 --- a/renderer/src/i18n/ar.json +++ b/renderer/src/i18n/ar.json @@ -155,5 +155,6 @@ "return": "عودة", "error": "خطأ", "feedback": "تعليقات", - "waiting-mcp-server": "في انتظار استجابة خادم MCP" + "waiting-mcp-server": "في انتظار استجابة خادم MCP", + "parallel-tool-calls": "السماح للنموذج باستدعاء أدوات متعددة في رد واحد" } \ No newline at end of file diff --git a/renderer/src/i18n/de.json b/renderer/src/i18n/de.json index 4c569c2..be8f275 100644 --- a/renderer/src/i18n/de.json +++ b/renderer/src/i18n/de.json @@ -155,5 +155,6 @@ "return": "Zurück", "error": "Fehler", "feedback": "Feedback", - "waiting-mcp-server": "Warten auf Antwort vom MCP-Server" + "waiting-mcp-server": "Warten auf Antwort vom MCP-Server", + "parallel-tool-calls": "Erlauben Sie dem Modell, mehrere Tools in einer einzigen Antwort aufzurufen" } \ No newline at end of file diff --git a/renderer/src/i18n/en.json b/renderer/src/i18n/en.json index 5c9ab7c..a1e41e5 100644 --- a/renderer/src/i18n/en.json +++ b/renderer/src/i18n/en.json @@ -155,5 +155,6 @@ "return": "Back", "error": "Error", "feedback": "Feedback", - "waiting-mcp-server": "Waiting for MCP server response" + "waiting-mcp-server": "Waiting for MCP server response", + "parallel-tool-calls": "Allow the model to call multiple tools in a single reply" } \ No newline at end of file diff --git a/renderer/src/i18n/fr.json b/renderer/src/i18n/fr.json index e73832a..b553741 100644 --- a/renderer/src/i18n/fr.json +++ b/renderer/src/i18n/fr.json @@ -155,5 +155,6 @@ "return": "Retour", "error": "Erreur", "feedback": "Retour", - "waiting-mcp-server": "En attente de la réponse du serveur MCP" + "waiting-mcp-server": "En attente de la réponse du serveur MCP", + "parallel-tool-calls": "Permettre au modèle d'appeler plusieurs outils en une seule réponse" } \ No newline at end of file diff --git a/renderer/src/i18n/ja.json b/renderer/src/i18n/ja.json index 6cc72cf..3a755e9 100644 --- a/renderer/src/i18n/ja.json +++ b/renderer/src/i18n/ja.json @@ -155,5 +155,6 @@ "return": "戻る", "error": "エラー", "feedback": "フィードバック", - "waiting-mcp-server": "MCPサーバーの応答を待機中" + "waiting-mcp-server": "MCPサーバーの応答を待機中", + "parallel-tool-calls": "モデルが単一の返信で複数のツールを呼び出すことを許可する" } \ No newline at end of file diff --git a/renderer/src/i18n/ko.json b/renderer/src/i18n/ko.json index 99f41da..bb5ac07 100644 --- a/renderer/src/i18n/ko.json +++ b/renderer/src/i18n/ko.json @@ -155,5 +155,6 @@ "return": "돌아가기", "error": "오류", "feedback": "피드백", - "waiting-mcp-server": "MCP 서버 응답 대기 중" + "waiting-mcp-server": "MCP 서버 응답 대기 중", + "parallel-tool-calls": "모델이 단일 응답에서 여러 도구를 호출할 수 있도록 허용" } \ No newline at end of file diff --git a/renderer/src/i18n/ru.json b/renderer/src/i18n/ru.json index 62804ca..a757bb7 100644 --- a/renderer/src/i18n/ru.json +++ b/renderer/src/i18n/ru.json @@ -155,5 +155,6 @@ "return": "Назад", "error": "Ошибка", "feedback": "Обратная связь", - "waiting-mcp-server": "Ожидание ответа от сервера MCP" + "waiting-mcp-server": "Ожидание ответа от сервера MCP", + "parallel-tool-calls": "Разрешить модели вызывать несколько инструментов в одном ответе" } \ No newline at end of file diff --git a/renderer/src/i18n/zh-cn.json b/renderer/src/i18n/zh-cn.json index 68fe9ab..d145509 100644 --- a/renderer/src/i18n/zh-cn.json +++ b/renderer/src/i18n/zh-cn.json @@ -155,5 +155,6 @@ "return": "返回", "error": "错误", "feedback": "反馈", - "waiting-mcp-server": "等待 MCP 服务器响应" + "waiting-mcp-server": "等待 MCP 服务器响应", + "parallel-tool-calls": "允许模型在单轮回复中调用多个工具" } \ No newline at end of file diff --git a/renderer/src/i18n/zh-tw.json b/renderer/src/i18n/zh-tw.json index 77e186f..4f0ffd8 100644 --- a/renderer/src/i18n/zh-tw.json +++ b/renderer/src/i18n/zh-tw.json @@ -155,5 +155,6 @@ "return": "返回", "error": "錯誤", "feedback": "反饋", - "waiting-mcp-server": "等待MCP伺服器響應" + "waiting-mcp-server": "等待MCP伺服器響應", + "parallel-tool-calls": "允許模型在單輪回覆中調用多個工具" } \ No newline at end of file diff --git a/renderer/src/views/connect/connection-log.vue b/renderer/src/views/connect/connection-log.vue index c41fc9f..60d3b28 100644 --- a/renderer/src/views/connect/connection-log.vue +++ b/renderer/src/views/connect/connection-log.vue @@ -11,13 +11,13 @@
- {{ log.message }} + {{ log.message || '' }}
@@ -52,7 +52,7 @@ function clearLogs() {