diff --git a/schoolNewsWeb/src/apis/ai/chat.ts b/schoolNewsWeb/src/apis/ai/chat.ts index d5db5f6..9077152 100644 --- a/schoolNewsWeb/src/apis/ai/chat.ts +++ b/schoolNewsWeb/src/apis/ai/chat.ts @@ -77,14 +77,32 @@ export const chatApi = { eventSource.addEventListener('message', (event) => { try { // 解析JSON字符串,处理Unicode转义 - const data = JSON.parse(event.data); - fullMessage += data; - callback?.onMessage?.(data); + let data = JSON.parse(event.data); + // 过滤掉SSE格式残留的data:前缀、空行和思考标签 + if (typeof data === 'string') { + data = data + .replace(/^data:/gm, '') + .replace(/^\s*[\r\n]/gm, '') + .replace(/<\/?think>/gi, ''); + } + if (data && data.trim()) { + fullMessage += data; + callback?.onMessage?.(data); + } } catch (e) { // 如果不是JSON,直接使用原始数据 - const data = event.data; - fullMessage += data; - callback?.onMessage?.(data); + let data = event.data; + // 过滤掉SSE格式残留的data:前缀、空行和思考标签 + if (typeof data === 'string') { + data = data + .replace(/^data:/gm, '') + .replace(/^\s*[\r\n]/gm, '') + .replace(/<\/?think>/gi, ''); + } + if (data && data.trim()) { + fullMessage += data; + callback?.onMessage?.(data); + } } }); @@ -345,14 +363,32 @@ export const chatApi = { eventSource.addEventListener('message', (event) => { try { // 解析JSON字符串,处理Unicode转义 - const data = JSON.parse(event.data); - fullMessage += data; - callback?.onMessage?.(data); + let data = JSON.parse(event.data); + // 过滤掉SSE格式残留的data:前缀、空行和思考标签 + if (typeof data === 'string') { + data = data + .replace(/^data:/gm, '') + .replace(/^\s*[\r\n]/gm, '') + .replace(/<\/?think>/gi, ''); + } + if (data && data.trim()) { + fullMessage += data; + callback?.onMessage?.(data); + } } catch (e) { // 如果不是JSON,直接使用原始数据 - const data = event.data; - fullMessage += data; - callback?.onMessage?.(data); + let data = event.data; + // 过滤掉SSE格式残留的data:前缀、空行和思考标签 + if (typeof data === 'string') { + data = data + .replace(/^data:/gm, '') + .replace(/^\s*[\r\n]/gm, '') + .replace(/<\/?think>/gi, ''); + } + if (data && data.trim()) { + fullMessage += data; + callback?.onMessage?.(data); + } } }); diff --git a/schoolNewsWeb/src/views/admin/manage/ai/components/DocumentSegmentDialog.vue b/schoolNewsWeb/src/views/admin/manage/ai/components/DocumentSegmentDialog.vue index 906005e..69d365a 100644 --- a/schoolNewsWeb/src/views/admin/manage/ai/components/DocumentSegmentDialog.vue +++ b/schoolNewsWeb/src/views/admin/manage/ai/components/DocumentSegmentDialog.vue @@ -736,7 +736,6 @@ function formatTimestamp(timestamp: number): string { line-height: 1.6; color: #4A5565; font-size: 14px; - white-space: pre-wrap; word-break: break-word; letter-spacing: -0.01em; } diff --git a/schoolNewsWeb/src/views/admin/manage/ai/components/KnowledgeInfo.vue b/schoolNewsWeb/src/views/admin/manage/ai/components/KnowledgeInfo.vue index 5260bb6..654aba2 100644 --- a/schoolNewsWeb/src/views/admin/manage/ai/components/KnowledgeInfo.vue +++ b/schoolNewsWeb/src/views/admin/manage/ai/components/KnowledgeInfo.vue @@ -229,13 +229,14 @@ @@ -407,13 +408,19 @@ function handleViewSegments(document: AiUploadFile) { segmentDialogVisible.value = true; } +// 关闭分段对话框 +function handleSegmentDialogClose(val: boolean) { + segmentDialogVisible.value = val; + if (!val) { + selectedDocument.value = null; + } +} + // 下载文件 function handleDownload(document: AiUploadFile) { if (document.sysFileId) { - window.open(`/api/file/download/${document.sysFileId}`, '_blank'); - } else if (document.filePath) { - window.open(`/api/file/download/${document.filePath}`, '_blank'); - } else { + window.open(`${FILE_DOWNLOAD_URL}${document.sysFileId}`, '_blank'); + }else { ElMessage.warning('文件路径不存在'); } } diff --git a/schoolNewsWeb/src/views/public/ai/AIAgent.mobile.vue b/schoolNewsWeb/src/views/public/ai/AIAgent.mobile.vue index 6121893..c966cb5 100644 --- a/schoolNewsWeb/src/views/public/ai/AIAgent.mobile.vue +++ b/schoolNewsWeb/src/views/public/ai/AIAgent.mobile.vue @@ -585,6 +585,9 @@ function formatMessageTime(dateStr: string | undefined) { function formatMarkdown(content: string) { let html = content; + // 过滤掉思考标签和data:前缀 + html = html.replace(/<\/?think>/gi, ''); + html = html.replace(/^data:/gm, ''); html = html.replace(/```([\s\S]*?)```/g, '
$1
'); html = html.replace(/`([^`]+)`/g, '$1'); html = html.replace(/\*\*([^*]+)\*\*/g, '$1'); diff --git a/schoolNewsWeb/src/views/public/ai/AIAgent.vue b/schoolNewsWeb/src/views/public/ai/AIAgent.vue index d3edc63..9844e8f 100644 --- a/schoolNewsWeb/src/views/public/ai/AIAgent.vue +++ b/schoolNewsWeb/src/views/public/ai/AIAgent.vue @@ -1114,6 +1114,10 @@ function formatMarkdown(content: string) { // 简单的 Markdown 转换(可以使用 marked.js 等库进行更复杂的转换) let html = content; + // 过滤掉思考标签和data:前缀 + html = html.replace(/<\/?think>/gi, ''); + html = html.replace(/^data:/gm, ''); + // 代码块 html = html.replace(/```(\w+)?\n([\s\S]*?)```/g, '
$2
');