fix: 修复轮询机制下对话标题不自动更新的问题
- 后端:在标题生成后将 conversation_changed 事件添加到任务事件流 - 前端:在 taskPolling 中添加 conversation_changed 事件处理 - 前端:同步更新当前对话标题和对话列表中的标题 - 兼容:保留 WebSocket 的标题更新逻辑以向后兼容 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
321818f7ef
commit
6697da9581
@ -73,6 +73,25 @@ def generate_conversation_title_background(
|
|||||||
if not ok:
|
if not ok:
|
||||||
return
|
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:
|
try:
|
||||||
socketio_instance.emit(
|
socketio_instance.emit(
|
||||||
'conversation_changed',
|
'conversation_changed',
|
||||||
|
|||||||
@ -116,6 +116,10 @@ export const taskPollingMethods = {
|
|||||||
this.handleTokenUpdate(eventData, eventIdx);
|
this.handleTokenUpdate(eventData, eventIdx);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'conversation_changed':
|
||||||
|
this.handleConversationChanged(eventData, eventIdx);
|
||||||
|
break;
|
||||||
|
|
||||||
case 'conversation_resolved':
|
case 'conversation_resolved':
|
||||||
this.handleConversationResolved(eventData, eventIdx);
|
this.handleConversationResolved(eventData, eventIdx);
|
||||||
break;
|
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) {
|
handleConversationResolved(data: any) {
|
||||||
if (data && data.conversation_id) {
|
if (data && data.conversation_id) {
|
||||||
this.currentConversationId = data.conversation_id;
|
this.currentConversationId = data.conversation_id;
|
||||||
|
|||||||
@ -763,6 +763,15 @@ export async function initializeLegacySocket(ctx: any) {
|
|||||||
if (ctx.initialRouteResolved) {
|
if (ctx.initialRouteResolved) {
|
||||||
ctx.currentConversationId = data.conversation_id;
|
ctx.currentConversationId = data.conversation_id;
|
||||||
ctx.currentConversationTitle = data.title || '';
|
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);
|
ctx.promoteConversationToTop(data.conversation_id);
|
||||||
|
|
||||||
if (data.cleared) {
|
if (data.cleared) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user