diff --git a/dashboard/src/views/ConversationDetailView.vue b/dashboard/src/views/ConversationDetailView.vue index 0c84f79..c1caa4b 100644 --- a/dashboard/src/views/ConversationDetailView.vue +++ b/dashboard/src/views/ConversationDetailView.vue @@ -136,7 +136,19 @@ const loadMessages = async () => { if (res.success) { messages.value = res.data.messages || [] if (messages.value.length > 0) { - conversationTitle.value = res.data.title || '' + // 优先使用服务器返回的标题,否则用用户的第一条提问 + if (res.data.title) { + conversationTitle.value = res.data.title + } else if (res.data.first_message) { + conversationTitle.value = res.data.first_message + } else { + // 查找用户的第一条消息作为标题 + const userMsg = messages.value.find(m => m.role === 'user') + if (userMsg) { + // 截取前30个字符作为标题 + conversationTitle.value = userMsg.content.slice(0, 30) + (userMsg.content.length > 30 ? '...' : '') + } + } } } } catch (e) { @@ -211,6 +223,17 @@ const sendMessage = async () => { ...streamingMessage.value, created_at: new Date().toISOString() }) + + // 如果标题为空,自动用第一条用户消息作为标题 + if (!conversationTitle.value || conversationTitle.value === '新对话') { + const userMsg = messages.value.find(m => m.role === 'user') + if (userMsg) { + conversationTitle.value = userMsg.content.slice(0, 30) + (userMsg.content.length > 30 ? '...' : '') + // 调用 API 更新标题 + conversationsAPI.update(conversationId.value, { title: conversationTitle.value }) + } + } + streamingMessage.value = null } sending.value = false diff --git a/dashboard/src/views/ConversationsView.vue b/dashboard/src/views/ConversationsView.vue index c246000..19ab49b 100644 --- a/dashboard/src/views/ConversationsView.vue +++ b/dashboard/src/views/ConversationsView.vue @@ -12,7 +12,7 @@
{{ formatDate(c.created_at) }} • {{ c.model || '默认模型' }}