whx 1 день тому
батько
коміт
9354bae8f1

Різницю між файлами не показано, бо вона завелика
+ 894 - 0
virgo.wzfrontend/aiChat/package-lock.json


+ 1 - 0
virgo.wzfrontend/aiChat/package.json

@@ -9,6 +9,7 @@
 		"preview": "vite preview"
 	},
 	"dependencies": {
+		"@microsoft/fetch-event-source": "^2.0.1",
 		"axios": "^1.11.0",
 		"dayjs": "^1.11.13",
 		"element-plus": "^2.10.4",

+ 44 - 25
virgo.wzfrontend/aiChat/src/components/AIFlowChat.vue

@@ -27,6 +27,9 @@
 	// 引入 github 代码主题
 	import 'highlight.js/styles/github.css';
 	import config from '@/config'
+	import {
+		fetchEventSource
+	} from '@microsoft/fetch-event-source';
 	const emits = defineEmits(['updateURL']);
 	const user = ref(useUserStore().userData);
 	// 对话历史
@@ -120,15 +123,19 @@
 				AIoutputs: ''
 			})
 			// 2. 初始化状态
-			loading.value = true
+			loading.value = true;
 			currentAIResponse.value = ''
 			prompt.value = '' // 清空输入框
-			const response = await fetch(`${config.baseURL}/api/ai/chat/run/7`, {
-				method: "POST",
+			let result = '';
+			fetchEventSource(`${config.baseURL}/api/ai/chat/run/7`, {
+				method: 'POST',
 				headers: {
+					'Accept': 'text/event-stream',
 					"Content-Type": "application/json",
 					"token": useUserStore().token
 				},
+				timeout: 1200000000, // 超时
+				openWhenHidden: true,
 				body: JSON.stringify({
 					query: userMessage,
 					conversationId: conversationId.value,
@@ -136,31 +143,43 @@
 						websiteURL: "",
 						fileURL: ""
 					}
-				})
-			});
-			const reader = response.body.getReader();
-			const decoder = new TextDecoder();
-			let done = false;
-			let result = '';
-			while (!done) {
-				const {
-					value,
-					done: doneReading
-				} = await reader.read();
-				done = doneReading;
-				let resultString = decoder.decode(value, {
-					stream: true
-				});
-				loading.value = false;
-				result += resultString.replaceAll('data:', '');
-				console.log(result);
-				chatHistory.value[chatHistory.value.length - 1].AIoutputs = renderMarkdown(result);
-				scrollToBottom();
-			}
+				}),
+				onmessage(event) {
+					// 处理接收到的消息
+					if (!isStrictJSONString(event.data)) {
+						result += event.data;
+						console.log(result);
+						chatHistory.value[chatHistory.value.length - 1].AIoutputs = renderMarkdown(result);
+						scrollToBottom();
+					}
+				},
+				onopen(response) {
+					// 连接打开时的回调
+					console.log('Connection opened:', response.status);
+				},
+				onerror(error) {
+					// 错误处理
+					console.error('Error:', error);
+				},
+				onclose() {
+					// 连接关闭时的回调
+					loading.value = false;
+				}
+			})
 		} catch (error) {
 			console.error("请求失败:", error);
 		}
 	}
+	const isStrictJSONString = str => {
+		console.log(str);
+		try {
+			const parsed = JSON.parse(str);
+			return parsed !== null && typeof parsed === 'object';
+		} catch (e) {
+			return false;
+		}
+	}
+
 	const scrollToBottom = () => {
 		nextTick(() => {
 			if (chatBody.value) {
@@ -261,7 +280,7 @@
 					:autosize="{ minRows: 2, maxRows: 6 }">
 				</el-input>
 				<div class="input-button">
-					<el-button style="margin-left: 10px;" size="default" :icon="Plus" circle
+					<el-button style="margin-left: 10px;" size="default" :icon="Plus" :disabled="loading" circle
 						@click="selectVisible = true">
 					</el-button>
 					<el-button circle type="primary" @click="sendMessage" :disabled="!prompt.trim() || loading"

Різницю між файлами не показано, бо вона завелика
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/ai/assets/AIChat-DkyyfcKC.css


Різницю між файлами не показано, бо вона завелика
+ 0 - 5
virgo.wzfrontend/src/main/resources/static/ai/assets/AIChat-B2766qt1.js


Різницю між файлами не показано, бо вона завелика
+ 6 - 0
virgo.wzfrontend/src/main/resources/static/ai/assets/AIChat-C2buUlF5.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/ai/assets/Chats-D2MkEz0f.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/ai/assets/Home-CNFrV4Ee.js


Різницю між файлами не показано, бо вона завелика
+ 1 - 1
virgo.wzfrontend/src/main/resources/static/ai/assets/ai-BTXxsNwk.js


Різницю між файлами не показано, бо вона завелика
+ 2 - 2
virgo.wzfrontend/src/main/resources/static/ai/assets/index-CIxvKuUC.js


+ 1 - 1
virgo.wzfrontend/src/main/resources/static/ai/index.html

@@ -5,7 +5,7 @@
 		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
 		<link rel="icon" href="https://file-node.oss-cn-shanghai.aliyuncs.com/youji/f9617c7f80da485cb3cc72b6accc62ed">
 		<title>WorkArk AI</title>

-		<script type="module" crossorigin src="./assets/index-CIxvKuUC.js"></script>
+		<script type="module" crossorigin src="./assets/index-BKrnkg6r.js"></script>
 		<link rel="stylesheet" crossorigin href="./assets/index-95H28FZP.css">
 	</head>
 	<body>