feat: 重构知识库系统,移除Hermes集成,增强RAG和同步功能

主要变更:
- 移除Hermes智能体及相关回调服务
- 新增知识库RAG、同步、调度、规范化和索引任务服务
- 重构orchestrator服务,增强运行时聊天功能
- 更新前端聊天、政策制度、设置等页面样式和逻辑
- 更新expense_claims和document_intelligence服务
- 删除llm_wiki相关服务和测试文件
- 更新docker-compose配置和启动脚本
This commit is contained in:
caoxiaozhu
2026-05-17 08:38:41 +00:00
parent 212c935308
commit 68f663f2f4
308 changed files with 83729 additions and 13588 deletions

View File

@@ -6,6 +6,7 @@ import { useSystemState } from '../../composables/useSystemState.js'
import { useToast } from '../../composables/useToast.js'
import { recognizeOcrFiles } from '../../services/ocr.js'
import { clearUserConversations, deleteConversation, fetchLatestConversation, runOrchestrator } from '../../services/orchestrator.js'
import { renderMarkdown } from '../../utils/markdown.js'
import {
fetchExpenseClaimAttachmentAsset,
fetchExpenseClaimDetail,
@@ -228,69 +229,6 @@ function createMessage(role, text, attachments = [], extras = {}) {
}
}
function isMarkdownTableDivider(line = '') {
const value = String(line || '').trim()
if (!value.includes('|')) return false
return /^\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)+\|?$/.test(value)
}
function splitMarkdownTableRow(line = '') {
return String(line || '')
.trim()
.replace(/^\|/, '')
.replace(/\|$/, '')
.split('|')
.map((cell) => cell.trim())
}
function buildAnswerBlocks(text = '') {
const lines = String(text || '').replace(/\r\n/g, '\n').split('\n')
const blocks = []
let index = 0
while (index < lines.length) {
const line = lines[index].trim()
if (!line) {
index += 1
continue
}
if (
line.includes('|') &&
index + 1 < lines.length &&
isMarkdownTableDivider(lines[index + 1])
) {
const headers = splitMarkdownTableRow(line)
const rows = []
index += 2
while (index < lines.length && lines[index].includes('|') && lines[index].trim()) {
rows.push(splitMarkdownTableRow(lines[index]))
index += 1
}
blocks.push({ type: 'table', headers, rows })
continue
}
const paragraphLines = [line]
index += 1
while (
index < lines.length &&
lines[index].trim() &&
!(
lines[index].includes('|') &&
index + 1 < lines.length &&
isMarkdownTableDivider(lines[index + 1])
)
) {
paragraphLines.push(lines[index].trim())
index += 1
}
blocks.push({ type: 'paragraph', text: paragraphLines.join(' ') })
}
return blocks
}
function formatMessageTime(value) {
if (!value) {
return nowTime()
@@ -3424,31 +3362,39 @@ export default {
}
const backendMessage = buildBackendMessage(rawText, effectiveFileNames, effectiveOcrSummary)
const payload = await runOrchestrator({
source: 'user_message',
user_id: user.username || user.name || 'anonymous',
conversation_id: conversationId.value || null,
message: backendMessage,
context_json: {
role_codes: Array.isArray(user.roleCodes) ? user.roleCodes : [],
is_admin: Boolean(user.isAdmin),
name: user.name || '',
role: user.role || '',
position: user.position || '',
grade: user.grade || '',
...buildClientTimeContext(),
session_type: activeSessionType.value,
entry_source: props.entrySource,
user_input_text: systemGenerated ? '' : rawText,
attachment_names: effectiveFileNames,
attachment_count: effectiveFileNames.length,
draft_claim_id: isKnowledgeSession.value ? undefined : draftClaimId.value || undefined,
ocr_summary: effectiveOcrSummary,
ocr_documents: effectiveOcrDocuments,
...(linkedRequest.value && !isKnowledgeSession.value ? { request_context: linkedRequest.value } : {}),
...extraContext
}
})
const payload = await runOrchestrator(
{
source: 'user_message',
user_id: user.username || user.name || 'anonymous',
conversation_id: conversationId.value || null,
message: backendMessage,
context_json: {
role_codes: Array.isArray(user.roleCodes) ? user.roleCodes : [],
is_admin: Boolean(user.isAdmin),
name: user.name || '',
role: user.role || '',
position: user.position || '',
grade: user.grade || '',
...buildClientTimeContext(),
session_type: activeSessionType.value,
entry_source: props.entrySource,
user_input_text: systemGenerated ? '' : rawText,
attachment_names: effectiveFileNames,
attachment_count: effectiveFileNames.length,
draft_claim_id: isKnowledgeSession.value ? undefined : draftClaimId.value || undefined,
ocr_summary: effectiveOcrSummary,
ocr_documents: effectiveOcrDocuments,
...(linkedRequest.value && !isKnowledgeSession.value ? { request_context: linkedRequest.value } : {}),
...extraContext
}
},
isKnowledgeSession.value
? {
timeoutMs: 18000,
timeoutMessage: '知识问答整理超时,已停止等待。建议缩小问题范围或稍后重试。'
}
: {}
)
responsePayload = payload
conversationId.value = String(payload?.conversation_id || '').trim() || conversationId.value
@@ -3852,7 +3798,7 @@ export default {
buildReviewRiskHint,
buildReviewActionHint,
buildReviewStatusTag,
buildAnswerBlocks,
renderMarkdown,
buildExpenseQueryWindowLabel,
buildExpenseQueryHint,
getExpenseQueryActivePage,