From 8bba879ce6e39a4328e7134baf80cde9fe54c535 Mon Sep 17 00:00:00 2001 From: Kirigaya <1193466151@qq.com> Date: Thu, 10 Apr 2025 20:45:44 +0800 Subject: [PATCH] =?UTF-8?q?0.0.1=20=E5=89=8D=E5=90=8E=E7=AB=AF=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- renderer/public/iconfont.css | 10 +- renderer/public/iconfont.woff2 | Bin 4264 -> 4384 bytes .../src/components/main-panel/chat/index.vue | 72 ++++++++------ .../components/main-panel/chat/task-loop.ts | 24 ++++- service/tabs.json | 91 +++++++++++++++++- 5 files changed, 158 insertions(+), 39 deletions(-) diff --git a/renderer/public/iconfont.css b/renderer/public/iconfont.css index 2f0615f..dee1de8 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=1744276722320') format('woff2'), - url('iconfont.woff?t=1744276722320') format('woff'), - url('iconfont.ttf?t=1744276722320') format('truetype'); + src: url('iconfont.woff2?t=1744289078529') format('woff2'), + url('iconfont.woff?t=1744289078529') format('woff'), + url('iconfont.ttf?t=1744289078529') format('truetype'); } .iconfont { @@ -13,6 +13,10 @@ -moz-osx-font-smoothing: grayscale; } +.icon-openmcp:before { + content: "\e666"; +} + .icon-double-loading:before { content: "\e8fc"; } diff --git a/renderer/public/iconfont.woff2 b/renderer/public/iconfont.woff2 index fad5f13c5c38e30e622a0b5e163b8863ceb8a480..9ed60a0274fbcd074b8923bcccd5b96aa2c0c064 100644 GIT binary patch literal 4384 zcmV+*5#R22Pew8T0RR9101+Sn3jhEB03PH301(mu0RR9100000000000000000000 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 KE+UMW2zx!=!|p8r diff --git a/renderer/src/components/main-panel/chat/index.vue b/renderer/src/components/main-panel/chat/index.vue index bd716db..9db42a9 100644 --- a/renderer/src/components/main-panel/chat/index.vue +++ b/renderer/src/components/main-panel/chat/index.vue @@ -5,7 +5,7 @@
- +
@@ -90,7 +90,14 @@
-
Agent
+
+ Agent + + 正在生成答案 + + + +
@@ -268,6 +275,12 @@ watch(streamingContent, () => { } }, { deep: true }); +watch(streamingToolCalls, () => { + if (autoScroll.value) { + scrollToBottom(); + } +}, { deep: true }); + let loop: TaskLoop | undefined = undefined; const handleSend = () => { @@ -278,36 +291,37 @@ const handleSend = () => { const userMessage = userInput.value.trim(); - loop = new TaskLoop( - streamingContent, - streamingToolCalls, - // onerror - (msg) => { - ElMessage({ - message: msg, - type: 'error', - duration: 3000 - }); + loop = new TaskLoop(streamingContent, streamingToolCalls); - tabStorage.messages.push({ - role: 'assistant', - content: `错误: ${msg}` - }); + loop.registerOnError((msg) => { + ElMessage({ + message: msg, + type: 'error', + duration: 3000 + }); - isLoading.value = false; - }, - // onchunk - (chunk) => { - scrollToBottom(); - }, - // ondone - () => { - isLoading.value = false; - scrollToBottom(); + tabStorage.messages.push({ + role: 'assistant', + content: `错误: ${msg}` + }); + + isLoading.value = false; + }); + + loop.registerOnChunk((chunk) => { + scrollToBottom(); + }); + + loop.registerOnDone(() => { + isLoading.value = false; + scrollToBottom(); + }); + + loop.registerOnEpoch(() => { + isLoading.value = true; + scrollToBottom(); + }); - loop = undefined; - } - ); loop.start(tabStorage, userMessage); userInput.value = ''; diff --git a/renderer/src/components/main-panel/chat/task-loop.ts b/renderer/src/components/main-panel/chat/task-loop.ts index 2aeee59..9a3b1af 100644 --- a/renderer/src/components/main-panel/chat/task-loop.ts +++ b/renderer/src/components/main-panel/chat/task-loop.ts @@ -22,9 +22,10 @@ export class TaskLoop { constructor( private readonly streamingContent: Ref, private readonly streamingToolCalls: Ref, - private readonly onError: (msg: string) => void = (msg) => {}, - private readonly onChunk: (chunk: ChatCompletionChunk) => void = (chunk) => {}, - private readonly onDone: () => void = () => {}, + private onError: (msg: string) => void = (msg) => {}, + private onChunk: (chunk: ChatCompletionChunk) => void = (chunk) => {}, + private onDone: () => void = () => {}, + private onEpoch: () => void = () => {}, private readonly taskOptions: TaskLoopOptions = { maxEpochs: 20 }, ) {} @@ -166,6 +167,21 @@ export class TaskLoop { this.streamingToolCalls.value = []; } + public registerOnError(handler: (msg: string) => void) { + this.onError = handler; + } + + public registerOnChunk(handler: (chunk: ChatCompletionChunk) => void) { + this.onChunk = handler; + } + + public registerOnDone(handler: () => void) { + this.onDone = handler; + } + + public registerOnEpoch(handler: () => void) { + this.onEpoch = handler; + } /** * @description 开启循环,异步更新 DOM @@ -176,6 +192,8 @@ export class TaskLoop { for (let i = 0; i < this.taskOptions.maxEpochs; ++ i) { + this.onEpoch(); + // 初始累计清空 this.streamingContent.value = ''; this.streamingToolCalls.value = []; diff --git a/service/tabs.json b/service/tabs.json index 4ea9883..65687a3 100644 --- a/service/tabs.json +++ b/service/tabs.json @@ -1,5 +1,5 @@ { - "currentIndex": 1, + "currentIndex": 2, "tabs": [ { "name": "交互测试", @@ -115,17 +115,100 @@ { "name": "multiply", "description": "对两个数字进行实数域的乘法运算", - "enabled": false + "enabled": true }, { "name": "is_even", "description": "判断一个整数是否为偶数", - "enabled": false + "enabled": true }, { "name": "capitalize", "description": "将字符串首字母大写", - "enabled": false + "enabled": true + } + ], + "enableWebSearch": false, + "temperature": 0.7, + "contextLength": 10, + "systemPrompt": "" + } + } + }, + { + "name": "交互测试", + "icon": "icon-robot", + "type": "blank", + "componentIndex": 3, + "storage": { + "messages": [ + { + "role": "user", + "content": "什么是斐波那契数列?" + }, + { + "role": "assistant", + "content": "斐波那契数列(Fibonacci sequence)是以意大利数学家**列昂纳多·斐波那契**(Leonardo Fibonacci)命名的一个经典数列。其定义如下:\n\n### **定义**\n- **前两项**: \n \\( F_0 = 0 \\), \\( F_1 = 1 \\)(部分定义从 \\( F_1 = 1 \\), \\( F_2 = 1 \\) 开始)。\n- **递推关系**: \n 从第三项开始,每一项等于前两项之和: \n \\( F_n = F_{n-1} + F_{n-2} \\) (\\( n \\geq 2 \\))。\n\n### **数列示例**\n前几项为: \n0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...\n\n### **关键特性**\n1. **黄金分割**: \n 当 \\( n \\) 趋近于无穷大时,相邻两项的比值 \\( \\frac{F_{n+1}}{F_n} \\) 趋近于**黄金比例** \\( \\phi \\approx 1.618 \\)。\n\n2. **通项公式(比奈公式)**: \n \\[\n F_n = \\frac{\\phi^n - (-\\phi)^{-n}}{\\sqrt{5}}, \\quad \\phi = \\frac{1+\\sqrt{5}}{2}\n \\]\n 该公式通过无理数精确计算整数项。\n\n3. **应用领域**: \n - 自然界:如花瓣排列、松果螺旋、鹦鹉螺壳的生长模式。 \n - 计算机科学:动态规划、递归算法(需注意重复计算的优化)。 \n - 金融:斐波那契回调线用于技术分析。\n\n### **扩展知识**\n- **负数项**:递推关系可反向延伸,如 \\( F_{-n} = (-1)^{n+1}F_n \\)。\n- **变体**:卢卡斯数列(Lucas sequence)以 \\( L_0=2 \\), \\( L_1=1 \\) 开始,同样满足递推关系。\n\n斐波那契数列因其简洁的递推定义与广泛的自然关联性,成为数学和科学中的经典研究对象。" + }, + { + "role": "user", + "content": "add 1 2" + }, + { + "role": "assistant", + "content": "", + "tool_calls": [ + { + "id": "call_0_4eeb1c2f-8345-4b75-b002-af252af0728f", + "index": 0, + "type": "function", + "function": { + "name": "add", + "arguments": "{\"a\":1,\"b\":2}" + } + } + ] + }, + { + "role": "tool", + "tool_call_id": "call_0_4eeb1c2f-8345-4b75-b002-af252af0728f", + "content": "[{\"type\":\"text\",\"text\":\"3\"}]" + }, + { + "role": "assistant", + "content": "1 + 2 = 3" + }, + { + "role": "user", + "content": "nihao" + }, + { + "role": "assistant", + "content": "你好!有什么可以帮您的吗?😊" + } + ], + "settings": { + "modelIndex": 0, + "enableTools": [ + { + "name": "add", + "description": "对两个数字进行实数域的加法", + "enabled": true + }, + { + "name": "multiply", + "description": "对两个数字进行实数域的乘法运算", + "enabled": true + }, + { + "name": "is_even", + "description": "判断一个整数是否为偶数", + "enabled": true + }, + { + "name": "capitalize", + "description": "将字符串首字母大写", + "enabled": true } ], "enableWebSearch": false,