From e01a7fdde0033100105f774d70bf67226ba9255f Mon Sep 17 00:00:00 2001 From: Hyperzlib Date: Mon, 3 Feb 2025 04:05:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B7=B1=E5=BA=A6=E6=80=9D?= =?UTF-8?q?=E8=80=83=E7=9A=84=E6=98=BE=E7=A4=BA=EF=BC=8C=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=B8=80=E4=BA=9Bbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/chatcomplete.ts | 16 +- src/components.d.ts | 2 + src/components/ChatMessage.vue | 68 +- src/components/MarkdownParser.vue | 10 +- src/types/base.ts | 6 +- src/types/chatComplete.ts | 4 + src/views/ChatComplete.vue | 31 +- src/views/ChatCompleteController.ts | 1550 ++++++++++++++------------- tsconfig.tsbuildinfo | 2 +- 9 files changed, 914 insertions(+), 775 deletions(-) create mode 100644 src/types/chatComplete.ts diff --git a/src/api/chatcomplete.ts b/src/api/chatcomplete.ts index 53d6296..704a8d9 100644 --- a/src/api/chatcomplete.ts +++ b/src/api/chatcomplete.ts @@ -85,6 +85,12 @@ export type GetBotPersonaInfoParams = { export type GetBotPersonaInfoResponse = BotPersonaInfo +export type ChatCompleteStreamOutputEvents = { + onToolRun?: (toolName: string) => any, + onToolOutput?: (output: string) => any, + onMessage?: (deltaMessage: string) => any +} + export const chatCompleteApi = { indexPage(params: IndexPageParams, onProgress: IndexPageOnProgress): Promise { return new Promise((resolve, reject) => { @@ -184,7 +190,7 @@ export const chatCompleteApi = { return data.data }, - chatCompleteStreamOutput(taskId: string, onMessage: (deltaMessage: string) => any): Promise { + chatCompleteStreamOutput(taskId: string, eventListeners: ChatCompleteStreamOutputEvents = {}): Promise { return new Promise((resolve, reject) => { let url = getWebSocketApiUrl('/chatcomplete/message/stream', { task_id: taskId @@ -194,11 +200,15 @@ export const chatCompleteApi = { let ws = new WebSocket(url) ws.addEventListener('message', (event) => { if (event.data.startsWith('+')) { // 实时输出的消息是以+开头的纯文本 - onMessage(event.data.substring(1)) + eventListeners.onMessage?.(event.data.substring(1)) + } else if (event.data.startsWith('>')) { + eventListeners.onToolOutput?.(event.data.substring(1)) } else { // 其他消息是JSON格式 let data = JSON.parse(event.data) if (data.event === 'connected') { - onMessage(data.outputed_message) + eventListeners.onMessage?.(data.outputed_message) + } else if (data.event === 'tool_run') { + eventListeners.onToolRun?.(data.tool_name) } else if (data.event === 'finished') { isFinished = true resolve(data.result) diff --git a/src/components.d.ts b/src/components.d.ts index a525e74..66d8b30 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -12,6 +12,8 @@ declare module '@vue/runtime-core' { ChatCompleteSettingsModal: typeof import('./components/ChatCompleteSettingsModal.vue')['default'] ChatMessage: typeof import('./components/ChatMessage.vue')['default'] ConversationList: typeof import('./components/ConversationList.vue')['default'] + IonAccordion: typeof import('@ionic/vue')['IonAccordion'] + IonAccordionGroup: typeof import('@ionic/vue')['IonAccordionGroup'] IonApp: typeof import('@ionic/vue')['IonApp'] IonAvatar: typeof import('@ionic/vue')['IonAvatar'] IonButton: typeof import('@ionic/vue')['IonButton'] diff --git a/src/components/ChatMessage.vue b/src/components/ChatMessage.vue index 394dd98..e4efa6b 100644 --- a/src/components/ChatMessage.vue +++ b/src/components/ChatMessage.vue @@ -1,4 +1,5 @@