|
@@ -7,10 +7,11 @@ import EChartsPlugin from '/@/components/markdown/plugins/echarts'
|
|
import ToolsLoadingPlugin from '/@/components/markdown/plugins/tools-loading'
|
|
import ToolsLoadingPlugin from '/@/components/markdown/plugins/tools-loading'
|
|
import Markdown from '/@/components/markdown/Markdown.vue'
|
|
import Markdown from '/@/components/markdown/Markdown.vue'
|
|
import assist from '/@/api/assist'
|
|
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 { useLoading } from '/@/utils/loading-util'
|
|
import { Setting as EleSetting } from '@element-plus/icons-vue'
|
|
import { Setting as EleSetting } from '@element-plus/icons-vue'
|
|
import { useRouter } from 'vue-router'
|
|
import { useRouter } from 'vue-router'
|
|
|
|
+import { ElMessage } from 'element-plus'
|
|
|
|
|
|
const plugins: Array<MarkdownPlugin<any>> = [EChartsPlugin(), ToolsLoadingPlugin()]
|
|
const plugins: Array<MarkdownPlugin<any>> = [EChartsPlugin(), ToolsLoadingPlugin()]
|
|
|
|
|
|
@@ -110,7 +111,7 @@ const sendMessage = () => {
|
|
if (!inputMessage.value.trim()) return
|
|
if (!inputMessage.value.trim()) return
|
|
|
|
|
|
messages.value.push({
|
|
messages.value.push({
|
|
- id: `${Date.now()}`,
|
|
|
|
|
|
+ id: messages.value.length,
|
|
role: 'user',
|
|
role: 'user',
|
|
render_content: inputMessage.value,
|
|
render_content: inputMessage.value,
|
|
content: inputMessage.value,
|
|
content: inputMessage.value,
|
|
@@ -118,7 +119,7 @@ const sendMessage = () => {
|
|
})
|
|
})
|
|
|
|
|
|
const rtn = reactive<Message>({
|
|
const rtn = reactive<Message>({
|
|
- id: `${Date.now()}`,
|
|
|
|
|
|
+ id: messages.value.length,
|
|
role: 'assistant',
|
|
role: 'assistant',
|
|
render_content: '',
|
|
render_content: '',
|
|
content: '',
|
|
content: '',
|
|
@@ -175,7 +176,7 @@ const replaceMessage = (index: number) => {
|
|
} else {
|
|
} else {
|
|
// 没有找到AI回复消息,创建新的
|
|
// 没有找到AI回复消息,创建新的
|
|
rtn = reactive<Message>({
|
|
rtn = reactive<Message>({
|
|
- id: `${Date.now()}`,
|
|
|
|
|
|
+ id: messages.value.length,
|
|
role: 'assistant',
|
|
role: 'assistant',
|
|
render_content: '',
|
|
render_content: '',
|
|
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({
|
|
chatInstance.value = assist.chat({
|
|
chatRequest: {
|
|
chatRequest: {
|
|
message: prompt.value
|
|
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,
|
|
: context,
|
|
modelClassId: selectedModel.value,
|
|
modelClassId: selectedModel.value,
|
|
},
|
|
},
|
|
@@ -222,14 +223,14 @@ ${resp.response.data.replace('\n', '')}
|
|
|
|
|
|
`
|
|
`
|
|
messages.value.push({
|
|
messages.value.push({
|
|
- id: resp.response.id,
|
|
|
|
|
|
+ id: messages.value.length,
|
|
tool_call_id: resp.response.id,
|
|
tool_call_id: resp.response.id,
|
|
role: 'tool',
|
|
role: 'tool',
|
|
render_content: '',
|
|
render_content: '',
|
|
name: resp.response.name,
|
|
name: resp.response.name,
|
|
content: resp.response.data,
|
|
content: resp.response.data,
|
|
timestamp: Date.now(),
|
|
timestamp: Date.now(),
|
|
- tool_calls: []
|
|
|
|
|
|
+ tool_calls: [],
|
|
})
|
|
})
|
|
break
|
|
break
|
|
}
|
|
}
|
|
@@ -274,7 +275,6 @@ ${resp.request.data.replace('\n', '')}
|
|
chatInstance.value = undefined
|
|
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)
|
|
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)
|
|
const editingConversationId = ref<number | undefined>(undefined)
|
|
@@ -356,6 +392,10 @@ const getUserInfos = ref<{
|
|
userName: string
|
|
userName: string
|
|
}>(Local.get('userInfo') || {})
|
|
}>(Local.get('userInfo') || {})
|
|
|
|
|
|
|
|
+const canSendMessage = computed(()=> {
|
|
|
|
+ return !inputMessage.value.trim() && loadingModels.value && loadConversations.value
|
|
|
|
+})
|
|
|
|
+
|
|
const router = useRouter()
|
|
const router = useRouter()
|
|
const redirectToModelManager = () => router.push('manage/model')
|
|
const redirectToModelManager = () => router.push('manage/model')
|
|
</script>
|
|
</script>
|
|
@@ -368,7 +408,7 @@ const redirectToModelManager = () => router.push('manage/model')
|
|
<h3>对话历史</h3>
|
|
<h3>对话历史</h3>
|
|
<el-button round :icon="EleSetting" size="small" @click="redirectToModelManager"></el-button>
|
|
<el-button round :icon="EleSetting" size="small" @click="redirectToModelManager"></el-button>
|
|
</div>
|
|
</div>
|
|
- <el-scrollbar class="conversation-list">
|
|
|
|
|
|
+ <el-scrollbar class="conversation-list" v-loading="loadConversations">
|
|
<div
|
|
<div
|
|
v-for="conv in conversations"
|
|
v-for="conv in conversations"
|
|
:key="conv.id"
|
|
:key="conv.id"
|
|
@@ -427,7 +467,7 @@ const redirectToModelManager = () => router.push('manage/model')
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</el-scrollbar>
|
|
</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>
|
|
</el-aside>
|
|
|
|
|
|
<!-- 右侧聊天区域 -->
|
|
<!-- 右侧聊天区域 -->
|
|
@@ -459,15 +499,7 @@ const redirectToModelManager = () => router.push('manage/model')
|
|
{{ message.render_content }}
|
|
{{ message.render_content }}
|
|
</div>
|
|
</div>
|
|
<div class="user-message-actions">
|
|
<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>
|
|
</div>
|
|
</div>
|
|
<el-avatar class="message-avatar" :src="getUserInfos.avatar" :icon="User" />
|
|
<el-avatar class="message-avatar" :src="getUserInfos.avatar" :icon="User" />
|
|
@@ -581,7 +613,7 @@ const redirectToModelManager = () => router.push('manage/model')
|
|
size="small"
|
|
size="small"
|
|
@click="sendMessage"
|
|
@click="sendMessage"
|
|
@keyup.ctrl.enter="sendMessage"
|
|
@keyup.ctrl.enter="sendMessage"
|
|
- :disabled="!inputMessage.trim() && loadingModels"
|
|
|
|
|
|
+ :disabled="canSendMessage"
|
|
>
|
|
>
|
|
发送
|
|
发送
|
|
</el-button>
|
|
</el-button>
|