kagg886 пре 2 месеци
родитељ
комит
84de095612
3 измењених фајлова са 81 додато и 35 уклоњено
  1. 8 0
      src/api/assist/index.ts
  2. 7 1
      src/api/assist/type.ts
  3. 66 34
      src/views/assistant/index.vue

+ 8 - 0
src/api/assist/index.ts

@@ -29,6 +29,14 @@ export default {
 		setStatus: (data: LmConfigStatusReq) => put('/system/lmconfig/status', data),
 	},
 
+	session: {
+		list: (params: any) => get('/system/lmsessions/list',params),
+		// 添加大模型会话
+		add: (title: string) => post('/system/lmsessions/add', {title}),
+		// 删除大模型会话
+		del: (ids: number[]) => del('/system/lmsessions/delete', { ids }),
+	},
+
 	// SSE聊天方法
 	chat: (
 		data:

+ 7 - 1
src/api/assist/type.ts

@@ -16,7 +16,7 @@
 
 // 消息类型定义
 export type Message = {
-	id: string
+	id: number
 	role: 'user' | 'assistant' | 'system' | 'meta' | 'tool'
 	//仅markdown渲染器需要
 	render_content: string
@@ -142,3 +142,9 @@ export type LmConfigDeleteParams = {
 export type LmConfigGetParams = {
 	id: number
 }
+
+
+export type LmSession = {
+	id: number
+	title: string
+}

+ 66 - 34
src/views/assistant/index.vue

@@ -7,10 +7,11 @@ import EChartsPlugin from '/@/components/markdown/plugins/echarts'
 import ToolsLoadingPlugin from '/@/components/markdown/plugins/tools-loading'
 import Markdown from '/@/components/markdown/Markdown.vue'
 import assist from '/@/api/assist'
-import { ChatResponse, LmConfigInfo, Message } from '/@/api/assist/type'
+import { ChatResponse, LmConfigInfo, LmSession, Message } from '/@/api/assist/type'
 import { useLoading } from '/@/utils/loading-util'
 import { Setting as EleSetting } from '@element-plus/icons-vue'
 import { useRouter } from 'vue-router'
+import { ElMessage } from 'element-plus'
 
 const plugins: Array<MarkdownPlugin<any>> = [EChartsPlugin(), ToolsLoadingPlugin()]
 
@@ -110,7 +111,7 @@ const sendMessage = () => {
 	if (!inputMessage.value.trim()) return
 
 	messages.value.push({
-		id: `${Date.now()}`,
+		id: messages.value.length,
 		role: 'user',
 		render_content: inputMessage.value,
 		content: inputMessage.value,
@@ -118,7 +119,7 @@ const sendMessage = () => {
 	})
 
 	const rtn = reactive<Message>({
-		id: `${Date.now()}`,
+		id: messages.value.length,
 		role: 'assistant',
 		render_content: '',
 		content: '',
@@ -175,7 +176,7 @@ const replaceMessage = (index: number) => {
 	} else {
 		// 没有找到AI回复消息,创建新的
 		rtn = reactive<Message>({
-			id: `${Date.now()}`,
+			id: messages.value.length,
 			role: 'assistant',
 			render_content: '',
 			content: '',
@@ -186,23 +187,23 @@ const replaceMessage = (index: number) => {
 	}
 
 	// 重新发起对话
-	chatInternal(rtn,messages.value.slice(0,aiMessageIndex))
+	chatInternal(rtn, messages.value.slice(0, aiMessageIndex))
 }
 
-const chatInternal = (rtn:Message,context: Message[] = messages.value) => {
+const chatInternal = (rtn: Message, context: Message[] = messages.value) => {
 	chatInstance.value = assist.chat({
 		chatRequest: {
 			message: prompt.value
 				? [
-					{
-						id: `${Date.now()}`,
-						role: 'system',
-						render_content: prompt.value,
-						content: prompt.value,
-						timestamp: Date.now(),
-					},
-					...context,
-				]
+						{
+							id: messages.value.length,
+							role: 'system',
+							render_content: prompt.value,
+							content: prompt.value,
+							timestamp: Date.now(),
+						},
+						...context,
+				  ]
 				: context,
 			modelClassId: selectedModel.value,
 		},
@@ -222,14 +223,14 @@ ${resp.response.data.replace('\n', '')}
 
 `
 					messages.value.push({
-						id: resp.response.id,
+						id: messages.value.length,
 						tool_call_id: resp.response.id,
 						role: 'tool',
 						render_content: '',
 						name: resp.response.name,
 						content: resp.response.data,
 						timestamp: Date.now(),
-						tool_calls: []
+						tool_calls: [],
 					})
 					break
 				}
@@ -274,7 +275,6 @@ ${resp.request.data.replace('\n', '')}
 			chatInstance.value = undefined
 		},
 	})
-
 }
 
 // 终止对话
@@ -294,7 +294,20 @@ const scrollToBottom = () => {
 
 // 会话管理模块
 // 所有会话
-const conversations = ref<{ id: number; title: string }[]>([])
+const conversations = ref<LmSession[]>([])
+const { loading: loadConversations, doLoading: doLoadConversations } = useLoading(async () => {
+	const data: { list: LmSession[]; total: number } = await assist.session.list({ pageNum: 1, pageSize: 30 }).catch(() => {
+		return {
+			list: [],
+			total: 0
+		}
+	})
+
+	conversations.value = data.list
+})
+
+onMounted(doLoadConversations)
+
 // 当前活跃会话
 const activeConversationId = ref<number | undefined>(undefined)
 
@@ -304,9 +317,32 @@ const selectConversation = (id: number) => {
 }
 
 // 删除会话
-const deleteConversation = (id: number) => {
-	// TODO: 实现删除对话逻辑
-}
+const deleteConversation = async (id: number) => {
+	const res = assist.session.del([id]).then(()=>{}).catch(()=> undefined)
+	if (res === undefined) {
+		return
+	}
+	ElMessage.success('删除成功')
+	if (id === undefined) {
+		activeConversationId.value = undefined
+	}
+	await nextTick()
+	await doLoadConversations()
+}
+
+// 创建新对话
+const { loading: creatingConversation, doLoading: createConversation } = useLoading(async () => {
+	try {
+		// 调用API创建新对话,默认标题为"新对话"
+		await assist.session.add('新对话')
+		// 刷新对话列表
+		await doLoadConversations()
+	} catch (error) {
+		console.error('创建对话失败:', error)
+		// 可以在这里添加错误提示
+		throw error
+	}
+})
 
 // 编辑会话状态管理
 const editingConversationId = ref<number | undefined>(undefined)
@@ -356,6 +392,10 @@ const getUserInfos = ref<{
 	userName: string
 }>(Local.get('userInfo') || {})
 
+const canSendMessage = computed(()=> {
+	return !inputMessage.value.trim() && loadingModels.value && loadConversations.value
+})
+
 const router = useRouter()
 const redirectToModelManager = () => router.push('manage/model')
 </script>
@@ -368,7 +408,7 @@ const redirectToModelManager = () => router.push('manage/model')
 				<h3>对话历史</h3>
 				<el-button round :icon="EleSetting" size="small" @click="redirectToModelManager"></el-button>
 			</div>
-			<el-scrollbar class="conversation-list">
+			<el-scrollbar class="conversation-list" v-loading="loadConversations">
 				<div
 					v-for="conv in conversations"
 					:key="conv.id"
@@ -427,7 +467,7 @@ const redirectToModelManager = () => router.push('manage/model')
 					</div>
 				</div>
 			</el-scrollbar>
-			<el-button type="primary" size="large" class="create-conversation-btn">创建对话</el-button>
+			<el-button type="primary" size="large" class="create-conversation-btn" @click="createConversation" :loading="creatingConversation">创建对话</el-button>
 		</el-aside>
 
 		<!-- 右侧聊天区域 -->
@@ -459,15 +499,7 @@ const redirectToModelManager = () => router.push('manage/model')
 									{{ message.render_content }}
 								</div>
 								<div class="user-message-actions">
-									<el-button
-										type="primary"
-										size="small"
-										@click="replaceMessage(messages.indexOf(message))"
-										class="retry-btn"
-										plain
-									>
-										重试
-									</el-button>
+									<el-button type="primary" size="small" @click="replaceMessage(messages.indexOf(message))" class="retry-btn" plain> 重试 </el-button>
 								</div>
 							</div>
 							<el-avatar class="message-avatar" :src="getUserInfos.avatar" :icon="User" />
@@ -581,7 +613,7 @@ const redirectToModelManager = () => router.push('manage/model')
 							size="small"
 							@click="sendMessage"
 							@keyup.ctrl.enter="sendMessage"
-							:disabled="!inputMessage.trim() && loadingModels"
+							:disabled="canSendMessage"
 						>
 							发送
 						</el-button>