添加通用交互重连

This commit is contained in:
junleea 2025-05-21 20:00:58 +08:00
parent 48289fafc6
commit 6a6c5c53fb
8 changed files with 75 additions and 110 deletions

View File

@ -35,6 +35,7 @@ const activePath = ref(route.fullPath)
const tabs = useTabsStore(); const tabs = useTabsStore();
// //
const setTags = (route: any) => { const setTags = (route: any) => {
console.log("set tag:",route);
const isExist = tabs.list.some(item => { const isExist = tabs.list.some(item => {
return item.path === route.fullPath; return item.path === route.fullPath;
}); });
@ -45,6 +46,7 @@ const setTags = (route: any) => {
path: route.fullPath path: route.fullPath
}); });
} }
console.log("tabs list:", tabs.list);
}; };
setTags(route); setTags(route);
onBeforeRouteUpdate(to => { onBeforeRouteUpdate(to => {

View File

@ -553,22 +553,26 @@ onMounted(() => {
// // // //
// md.use(markdownItMermaid); // md.use(markdownItMermaid);
// } // }
let url = IMWSConnect();
"wss://pm.ljsea.top/im/ai_chat_ws?" +
"token=" +
localStorage.getItem("token");
//
let test_url = "ws://127.0.0.1:8084/im/ai_chat_ws?" + "token=" + localStorage.getItem("token");
//url =test_url;
socket.value = new WebSocket(url);
socket.value.onopen = () => {
console.log("WebSocket 连接已建立");
ElMessage.success("连接成功");
};
//getMessage(125);
messagesContainer.value = document.querySelector(".chat-messages");
socket.value.onmessage = (event) => {
userUIconfigInfo.value = JSON.parse(
localStorage.getItem("userUIconfigInfo") || "{}"
);
console.log("userUIconfigInfo:", userUIconfigInfo.value);
messagesContainer.value = document.querySelector(".chat-messages");
//console.log("userUIconfigInfo:", userUIconfigInfo.value);
});
onUnmounted(() => {
if (socket.value) {
socket.value.close();
}
});
const doReceiveMessage = (event) => {
//
let msg: WSMessage = JSON.parse(event.data); let msg: WSMessage = JSON.parse(event.data);
const existingMessage = messages.find( const existingMessage = messages.find(
(msg) => msg.role === "assistant" && !msg.finished (msg) => msg.role === "assistant" && !msg.finished
@ -584,64 +588,7 @@ onMounted(() => {
finished: false, finished: false,
}); });
} }
//console.log("resp:", msg);
sessionID.value = msg.session_id;
currentAIMessage.value += msg.msg.msg.response;
if (msg.msg.msg.done) {
const assistantMessage = messages[messages.length - 1];
assistantMessage.finished = true;
loading.value = false;
doButtonD();
}
nextTick(() => {
scrollToBottom(); //
});
};
socket.value.onclose = () => {
console.log("WebSocket 连接已关闭");
ElMessage.error("连接已关闭");
//
//socket.value = new WebSocket(url);
socket.value = null;
};
socket.value.onerror = (error) => {
//socket.value = new WebSocket(url);
socket.value = null;
console.error("WebSocket 发生错误:", error);
};
userUIconfigInfo.value = JSON.parse(
localStorage.getItem("userUIconfigInfo") || "{}"
);
//console.log("userUIconfigInfo:", userUIconfigInfo.value);
});
onUnmounted(() => {
if (socket.value) {
socket.value.close();
}
});
const doReceiveMessage = (event) => {
//
let msg: WSMessage = JSON.parse(event.data);
const existingMessage = messages.find(
(msg) => msg.role === "assistant" && !msg.finished
);
if (existingMessage) {
//
existingMessage.content += msg.msg.msg.response;
} else {
//
messages.push({
role: "assistant",
content: msg.msg.msg.response,
finished: false,
});
}
//console.log("resp:", msg);
sessionID.value = msg.session_id; sessionID.value = msg.session_id;
currentAIMessage.value += msg.msg.msg.response; currentAIMessage.value += msg.msg.msg.response;
if (msg.msg.msg.done) { if (msg.msg.msg.done) {
@ -675,14 +622,23 @@ const updateUserUIconfigInfo = () => {
}); });
} }
const sendMessage = () => { const sendMessage = async () => {
localStorage.setItem("gen_ai_chat_model_id", selectModel.value.toString()); //ws
sendMessageWithFile() if (socket.value == null) {
await IMWSConnect();
}
if(loading.value === true){
ElMessage.warning("正在等待AI回复请稍后再试");
return;
}
await nextTick();
sendMessageWithFile();
return; return;
}; };
const sendMessageWithFile = () => { const sendMessageWithFile =async () => {
if (inputMessage.value.trim() === "") { if (inputMessage.value.trim() === "") {
ElMessage.warning("消息不能为空"); ElMessage.warning("消息不能为空");
return; return;
@ -725,33 +681,13 @@ const sendMessageWithFile = () => {
} }
console.log("end_msg:", end_msg); console.log("end_msg:", end_msg);
if(socket.value == null){
socket.value = new WebSocket(wssUrl);
socket.value.onmessage = (event) => {
doReceiveMessage(event);
};
socket.value.onclose = () => {
console.log("WebSocket 连接已关闭");
ElMessage.error("连接已关闭");
//
//socket.value = new WebSocket(url);
socket.value = null;
};
socket.value.onerror = (error) => {
//socket.value = new WebSocket(url);
socket.value = null;
console.error("WebSocket 发生错误:", error);
};
ElMessage.error("已重新连接!");
}
try { try {
socket.value.send(JSON.stringify(end_msg)); socket.value.send(JSON.stringify(end_msg));
console.log("send msg:", end_msg); console.log("send msg:", end_msg);
} catch (e) { } catch (e) {
ElMessage.error("发送失败!连接已断开!"); //ElMessage.error("!!");
socket.value = new WebSocket(socket.value.url); await IMWSConnect();
return; socket.value.send(JSON.stringify(end_msg));
} }
if (sessionID.value == 0) { if (sessionID.value == 0) {
sessionName.value = inputMessage.value; sessionName.value = inputMessage.value;
@ -769,10 +705,6 @@ const sendMessageWithFile = () => {
} }
} }
// let img_content= img_msg.image_content
// for (let i = 0; i < img_content.length; i++) {
// pMsgContent += `![${img_content[i].img_name}](${img_content[i].img_url})` + "\n";
// }
pMsgContent = pMsgContent + "输入:" + file_msg.text; pMsgContent = pMsgContent + "输入:" + file_msg.text;
} else { } else {
pMsgContent = end_msg.msg; pMsgContent = end_msg.msg;
@ -788,6 +720,37 @@ const sendMessageWithFile = () => {
} }
}; };
const IMWSConnect = async () =>{
let url =
"wss://pm.ljsea.top/im/ai_chat_ws?" +
"token=" +
localStorage.getItem("token");
//
let test_url = "ws://127.0.0.1:8084/im/ai_chat_ws?" + "token=" + localStorage.getItem("token");
//url =test_url;
socket.value =new WebSocket(url);
socket.value.onopen = () => {
console.log("WebSocket 连接已建立");
ElMessage.success("连接成功");
};
socket.value.onmessage = (event) => {
doReceiveMessage(event);
};
socket.value.onclose = () => {
console.log("WebSocket 连接已关闭");
ElMessage.error("连接已关闭");
//
//socket.value = new WebSocket(url);
socket.value = null;
};
socket.value.onerror = (error) => {
socket.value = null;
console.log("WebSocket 连接发生错误:", error);
};
}
const loadSession = async (session_id: number) => { const loadSession = async (session_id: number) => {
sessionID.value = session_id; sessionID.value = session_id;
messages.length = 0; // messages.length = 0; //
@ -836,7 +799,7 @@ const getMessage = async (session_id: number) => {
}; };
result = await GetMessageService(req); result = await GetMessageService(req);
if (result["code"] === 0) { if (result["code"] === 0) {
console.log(result["data"]); // console.log(result["data"]);
let data = result["data"]; let data = result["data"];
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
if (data[i]["Type"] === 3) { if (data[i]["Type"] === 3) {

View File

@ -21,7 +21,7 @@
<el-dialog title="查看详情" v-model="visible1" width="700px" destroy-on-close> <el-dialog title="查看详情" v-model="visible1" width="700px" destroy-on-close>
<TableDetail :data="viewData"></TableDetail> <TableDetail :data="viewData"></TableDetail>
</el-dialog> </el-dialog>
<div> <div v-if="code_edit">
<transition name="fade"> <transition name="fade">
<div <div
v-if="code_edit" v-if="code_edit"

View File

@ -82,7 +82,7 @@ let columns = ref([
{ prop: 'Function', label: '功能' }, { prop: 'Function', label: '功能' },
{ prop: 'Info', label: '描述信息' }, { prop: 'Info', label: '描述信息' },
{ prop: 'CreatedAt', label: '创建时间',type: 'date' }, { prop: 'CreatedAt', label: '创建时间',type: 'date' },
{ prop: 'operator', label: '操作', width: 250 , operate: { view: true, edit: true, delete: true,push: {link: false,label:"继续该会话"},gen: {show: false,label:"下载文件"} }}, { prop: 'operator', label: '操作', width: 250 , operate: { view: true, edit: true, delete: true,push: {link: false,label:"继续该会话"},gen: {show: false,label:"下载文件"}, genv2:{type:"", label:"", show:false} }},
]) ])
const page = reactive({ const page = reactive({
index: 1, index: 1,

View File

@ -87,7 +87,7 @@ let columns = ref([
{ prop: 'FileNameList', label:"知识库文件", width: 300}, { prop: 'FileNameList', label:"知识库文件", width: 300},
{ prop: 'CreatedAt', label: '创建时间',type: 'date' }, { prop: 'CreatedAt', label: '创建时间',type: 'date' },
{ prop: 'UpdatedAt', label: '上次更新时间', type: 'date'}, { prop: 'UpdatedAt', label: '上次更新时间', type: 'date'},
{ prop: 'operator', label: '操作', width: 250 , operate: { view: true, edit: true, delete: true,push: {link: false,label:"继续该会话"},gen: {show: false,label:"下载文件"} }}, { prop: 'operator', label: '操作', width: 250 , operate: { view: true, edit: true, delete: true,push: {link: false,label:"继续该会话"},gen: {show: false,label:"下载文件"}, genv2:{type:"", label:"", show:false} }},
]) ])
const page = reactive({ const page = reactive({
index: 1, index: 1,

View File

@ -92,7 +92,7 @@ let columns = ref([
{prop: 'Url', label: 'URl'}, {prop: 'Url', label: 'URl'},
{ prop: 'token', label: '消耗token数',width:50}, { prop: 'token', label: '消耗token数',width:50},
{ prop: 'CreatedAt', label: '创建时间',type: 'date' }, { prop: 'CreatedAt', label: '创建时间',type: 'date' },
{ prop: 'operator', label: '操作', width: 250 , operate: { view: true, edit: true, delete: true,push: {link: false,label:"继续该会话"},gen: {show: false,label:"下载文件"} }}, { prop: 'operator', label: '操作', width: 250 , operate: { view: true, edit: true, delete: true,push: {link: false,label:"继续该会话"},gen: {show: false,label:"下载文件"},genv2:{type:"", label:"", show:false} }},
]) ])
const page = reactive({ const page = reactive({
index: 1, index: 1,

View File

@ -103,7 +103,7 @@ let columns = ref([
{ prop: "Context", label: "会话背景参数" ,width: 100}, { prop: "Context", label: "会话背景参数" ,width: 100},
{ prop: 'CreatedAt', label: '创建时间',type: 'date',width: 180 }, { prop: 'CreatedAt', label: '创建时间',type: 'date',width: 180 },
{ prop: 'UpdatedAt', label: '更新时间',type: 'date',width: 180 }, { prop: 'UpdatedAt', label: '更新时间',type: 'date',width: 180 },
{ prop: 'operator', label: '操作' , operate: { view: false, edit: true, delete: true,push: {link: true,label:"继续该会话"},gen: {show: false,label:"下载文件"}}}, { prop: 'operator', label: '操作' , operate: { view: false, edit: true, delete: true,push: {link: true,label:"继续该会话"},gen: {show: false,label:"下载文件"}, genv2:{type:"", label:"", show:false}}},
]) ])
const getData = async () => { const getData = async () => {

View File

@ -1,6 +1,6 @@
<template> <template>
<transition name="slide"> <transition name="slide">
<div v-if="show" class="side-panel"> <div class="side-panel">
<button @click="handleClose" class="close-btn"></button> <button @click="handleClose" class="close-btn"></button>
<el-button type="primary" @click="UpdateFileCOntent">保存修改</el-button> <el-button type="primary" @click="UpdateFileCOntent">保存修改</el-button>
<div class="content"> <div class="content">