From 6697da9581f1378fb8400afb21bed8db458d8a06 Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Sat, 4 Apr 2026 15:12:18 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=BD=AE=E8=AF=A2?= =?UTF-8?q?=E6=9C=BA=E5=88=B6=E4=B8=8B=E5=AF=B9=E8=AF=9D=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E4=B8=8D=E8=87=AA=E5=8A=A8=E6=9B=B4=E6=96=B0=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端:在标题生成后将 conversation_changed 事件添加到任务事件流 - 前端:在 taskPolling 中添加 conversation_changed 事件处理 - 前端:同步更新当前对话标题和对话列表中的标题 - 兼容:保留 WebSocket 的标题更新逻辑以向后兼容 Co-Authored-By: Claude Sonnet 4.5 --- server/chat_flow_helpers.py | 19 ++++++++++++++++ static/src/app/methods/taskPolling.ts | 27 +++++++++++++++++++++++ static/src/composables/useLegacySocket.ts | 9 ++++++++ 3 files changed, 55 insertions(+) diff --git a/server/chat_flow_helpers.py b/server/chat_flow_helpers.py index 815c124..b68e1f4 100644 --- a/server/chat_flow_helpers.py +++ b/server/chat_flow_helpers.py @@ -73,6 +73,25 @@ def generate_conversation_title_background( if not ok: return + # 添加标题更新事件到任务事件流(用于轮询机制) + try: + from server.tasks import task_manager + tasks = task_manager.list_tasks(username) + running_task = None + for task in tasks: + if task.status == "running" and getattr(task, "conversation_id", None) == conversation_id: + running_task = task + break + + if running_task: + task_manager._append_event( + running_task, + 'conversation_changed', + {'conversation_id': conversation_id, 'title': safe_title} + ) + except Exception as exc: + debug_logger(f"[TitleGen] 添加任务事件失败: {exc}") + try: socketio_instance.emit( 'conversation_changed', diff --git a/static/src/app/methods/taskPolling.ts b/static/src/app/methods/taskPolling.ts index df6b7ed..bc98d68 100644 --- a/static/src/app/methods/taskPolling.ts +++ b/static/src/app/methods/taskPolling.ts @@ -116,6 +116,10 @@ export const taskPollingMethods = { this.handleTokenUpdate(eventData, eventIdx); break; + case 'conversation_changed': + this.handleConversationChanged(eventData, eventIdx); + break; + case 'conversation_resolved': this.handleConversationResolved(eventData, eventIdx); break; @@ -665,6 +669,29 @@ export const taskPollingMethods = { } }, + handleConversationChanged(data: any, eventIdx: number) { + debugLog('[TaskPolling] 对话标题已更新, idx:', eventIdx, data); + + if (data && data.conversation_id === this.currentConversationId) { + // 更新当前对话标题 + if (data.title) { + this.currentConversationTitle = data.title; + debugLog('[TaskPolling] 更新当前对话标题:', data.title); + } + + // 更新对话列表中的标题 + if (data.title && Array.isArray(this.conversations)) { + const conv = this.conversations.find(c => c && c.id === data.conversation_id); + if (conv) { + conv.title = data.title; + debugLog('[TaskPolling] 更新对话列表中的标题:', data.title); + } + } + + this.$forceUpdate(); + } + }, + handleConversationResolved(data: any) { if (data && data.conversation_id) { this.currentConversationId = data.conversation_id; diff --git a/static/src/composables/useLegacySocket.ts b/static/src/composables/useLegacySocket.ts index 6aba52d..aaed752 100644 --- a/static/src/composables/useLegacySocket.ts +++ b/static/src/composables/useLegacySocket.ts @@ -763,6 +763,15 @@ export async function initializeLegacySocket(ctx: any) { if (ctx.initialRouteResolved) { ctx.currentConversationId = data.conversation_id; ctx.currentConversationTitle = data.title || ''; + + // 更新对话列表中的标题 + if (data.title && Array.isArray(ctx.conversations)) { + const conv = ctx.conversations.find(c => c && c.id === data.conversation_id); + if (conv) { + conv.title = data.title; + } + } + ctx.promoteConversationToTop(data.conversation_id); if (data.cleared) {