فهرست منبع

接入修改对话时访问历史记录

kagg886 2 ماه پیش
والد
کامیت
92d071ea8f
3فایلهای تغییر یافته به همراه51 افزوده شده و 5 حذف شده
  1. 12 1
      src/api/assist/index.ts
  2. 11 0
      src/api/assist/type.ts
  3. 28 4
      src/views/assistant/index.vue

+ 12 - 1
src/api/assist/index.ts

@@ -7,7 +7,9 @@ import {
 	LmConfigEditReq,
 	LmConfigStatusReq,
 	LmConfigDeleteParams,
-	LmConfigGetParams
+	LmConfigGetParams,
+	SessionMessagesListParams,
+	SessionMessagesSaveReq
 } from '/@/api/assist/type'
 import { get, post, del, put } from '/@/utils/request'
 import getOrigin from '/@/utils/origin'
@@ -35,6 +37,15 @@ export default {
 		add: (title: string) => post('/system/lmsessions/add', {title}),
 		// 删除大模型会话
 		del: (ids: number[]) => del('/system/lmsessions/delete', { ids }),
+
+		message: {
+			// 获取会话消息列表
+			list: (params: SessionMessagesListParams) =>
+				get('/system/lmsessions/messages/list', params),
+			// 保存会话消息
+			save: (data: SessionMessagesSaveReq) =>
+				post('/system/lmsessions/messages/save', data)
+		}
 	},
 
 	// SSE聊天方法

+ 11 - 0
src/api/assist/type.ts

@@ -148,3 +148,14 @@ export type LmSession = {
 	id: number
 	title: string
 }
+
+// 会话消息列表查询参数
+export type SessionMessagesListParams = {
+	sessionId: number
+}
+
+// 保存会话消息请求
+export type SessionMessagesSaveReq = {
+	sessionId: number
+	messages: Message[]
+}

+ 28 - 4
src/views/assistant/index.vue

@@ -265,13 +265,19 @@ ${resp.request.data.replace('\n', '')}
 					break
 			}
 		},
-		onComplete: (e) => {
+		onComplete: async (e) => {
 			if (e !== undefined) {
 				rtn.content += `
 
 				`
 			}
 			rtn.render_content += '\n'
+
+			await assist.session.message.save({
+				sessionId: activeConversationId.value!,
+				messages: messages.value,
+			})
+
 			chatInstance.value = undefined
 		},
 	})
@@ -311,6 +317,24 @@ onMounted(doLoadConversations)
 // 当前活跃会话
 const activeConversationId = ref<number | undefined>(undefined)
 
+watch(activeConversationId,async (newVal)=> {
+	if (newVal === undefined) {
+		return
+	}
+	await doLoadingMessage(newVal)
+})
+
+const {loading: loadingMessage, doLoading: doLoadingMessage} = useLoading(async (id: number)=> {
+	const data: { messages: Message[]; total: number } = await assist.session.message.list({ sessionId: id }).catch(() => {
+		return {
+			list: [],
+			total: 0
+		}
+	})
+
+	messages.value = data.messages ?? []
+})
+
 // 选择会话
 const selectConversation = (id: number) => {
 	activeConversationId.value = id
@@ -393,7 +417,7 @@ const getUserInfos = ref<{
 }>(Local.get('userInfo') || {})
 
 const canSendMessage = computed(()=> {
-	return !inputMessage.value.trim() && loadingModels.value && loadConversations.value
+	return !inputMessage.value.trim() || loadingModels.value || loadConversations.value || loadingMessage.value || activeConversationId.value === undefined
 })
 
 const router = useRouter()
@@ -473,7 +497,7 @@ const redirectToModelManager = () => router.push('manage/model')
 		<!-- 右侧聊天区域 -->
 		<el-main class="chat-main">
 			<!-- 消息展示区域 -->
-			<div class="messages-container" ref="messagesContainer">
+			<div class="messages-container" ref="messagesContainer" v-loading="loadingMessage">
 				<div v-if="messages.length !== 0">
 					<div v-for="message in messages" :key="message.id" :class="['message-wrapper', message.role]">
 						<!-- AI消息 -->
@@ -600,7 +624,7 @@ const redirectToModelManager = () => router.push('manage/model')
 							resize="none"
 							@keydown.enter.ctrl="sendMessage"
 							@keydown.enter.meta="sendMessage"
-							:disabled="isConversationActive"
+							:disabled="isConversationActive || activeConversationId === undefined"
 						/>
 					</div>