608 lines
17 KiB
JavaScript
608 lines
17 KiB
JavaScript
import { apiGet, apiAdminGet, apiAdminPost, apiAdminPut, apiAdminDelete, apiRequest } from './base'
|
|
|
|
/**
|
|
* 知识库管理API模块
|
|
* 包含数据库管理、文档管理、查询接口等功能
|
|
*/
|
|
|
|
// =============================================================================
|
|
// === 数据库管理分组 ===
|
|
// =============================================================================
|
|
|
|
export const databaseApi = {
|
|
/**
|
|
* 获取所有知识库
|
|
* @returns {Promise} - 知识库列表
|
|
*/
|
|
getDatabases: async () => {
|
|
return apiAdminGet('/api/knowledge/databases')
|
|
},
|
|
|
|
/**
|
|
* 创建知识库
|
|
* @param {Object} databaseData - 知识库数据
|
|
* @returns {Promise} - 创建结果
|
|
*/
|
|
createDatabase: async (databaseData) => {
|
|
return apiAdminPost('/api/knowledge/databases', databaseData)
|
|
},
|
|
|
|
/**
|
|
* 获取知识库详细信息
|
|
* @param {string} kbId - 知识库ID
|
|
* @returns {Promise} - 知识库信息
|
|
*/
|
|
getDatabaseInfo: async (kbId) => {
|
|
return apiAdminGet(`/api/knowledge/databases/${kbId}`)
|
|
},
|
|
|
|
/**
|
|
* 修复知识库文件统计
|
|
* @param {string} kbId - 知识库ID
|
|
* @returns {Promise} - 修复结果
|
|
*/
|
|
repairDatabaseStats: async (kbId) => {
|
|
return apiAdminPost(`/api/knowledge/databases/${kbId}/stats/repair`, {})
|
|
},
|
|
|
|
/**
|
|
* 更新知识库信息
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {Object} updateData - 更新数据
|
|
* @returns {Promise} - 更新结果
|
|
*/
|
|
updateDatabase: async (kbId, updateData) => {
|
|
return apiAdminPut(`/api/knowledge/databases/${kbId}`, updateData)
|
|
},
|
|
|
|
/**
|
|
* 删除知识库
|
|
* @param {string} kbId - 知识库ID
|
|
* @returns {Promise} - 删除结果
|
|
*/
|
|
deleteDatabase: async (kbId) => {
|
|
return apiAdminDelete(`/api/knowledge/databases/${kbId}`)
|
|
},
|
|
|
|
/**
|
|
* 使用 AI 生成或优化知识库描述
|
|
* @param {string} name - 知识库名称
|
|
* @param {string} currentDescription - 当前描述(可选)
|
|
* @param {Array} fileList - 文件列表(可选)
|
|
* @returns {Promise} - 生成结果
|
|
*/
|
|
generateDescription: async (name, currentDescription = '', fileList = []) => {
|
|
return apiAdminPost('/api/knowledge/generate-description', {
|
|
name,
|
|
current_description: currentDescription,
|
|
file_list: fileList
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 获取当前用户有权访问的知识库列表(用于智能体配置)
|
|
* @returns {Promise} - 可访问的知识库列表
|
|
*/
|
|
getAccessibleDatabases: async () => {
|
|
return apiGet('/api/knowledge/databases/accessible')
|
|
}
|
|
}
|
|
|
|
// =============================================================================
|
|
// === 文档管理分组 ===
|
|
// =============================================================================
|
|
|
|
const buildQuery = (params) => {
|
|
const query = new URLSearchParams()
|
|
Object.entries(params).forEach(([key, value]) => {
|
|
if (value !== undefined && value !== null && value !== '') {
|
|
query.set(key, String(value))
|
|
}
|
|
})
|
|
return query.toString()
|
|
}
|
|
|
|
export const documentApi = {
|
|
/**
|
|
* 分页获取知识库文档列表
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {Object} params - 查询参数
|
|
* @returns {Promise} - 文档列表
|
|
*/
|
|
listDocuments: async (kbId, params = {}) => {
|
|
const query = buildQuery(params)
|
|
return apiAdminGet(`/api/knowledge/databases/${kbId}/documents${query ? `?${query}` : ''}`)
|
|
},
|
|
|
|
/**
|
|
* 检查知识库中是否存在指定文件名或相对路径
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {string} filename - 文件名或相对路径
|
|
* @returns {Promise} - 存在性检查结果
|
|
*/
|
|
documentExists: async (kbId, filename) => {
|
|
const query = buildQuery({ filename })
|
|
return apiAdminGet(`/api/knowledge/databases/${kbId}/documents/exists?${query}`)
|
|
},
|
|
|
|
/**
|
|
* 创建文件夹
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {string} folderName - 文件夹名称
|
|
* @param {string} parentId - 父文件夹ID
|
|
* @returns {Promise} - 创建结果
|
|
*/
|
|
createFolder: async (kbId, folderName, parentId = null) => {
|
|
return apiAdminPost(`/api/knowledge/databases/${kbId}/folders`, {
|
|
folder_name: folderName,
|
|
parent_id: parentId
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 添加文档到知识库
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {Array} items - 文档列表
|
|
* @param {Object} params - 处理参数
|
|
* @returns {Promise} - 添加结果
|
|
*/
|
|
addDocuments: async (kbId, items, params = {}) => {
|
|
return apiAdminPost(`/api/knowledge/databases/${kbId}/documents`, {
|
|
items,
|
|
params
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 将已上传文件添加为知识库文档记录(不解析、不入库)
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {Array} items - 已上传文件的 MinIO URL 列表
|
|
* @param {Object} params - 添加参数
|
|
* @returns {Promise} - 添加结果
|
|
*/
|
|
addUploadedDocuments: async (kbId, items, params = {}) => {
|
|
return apiAdminPost(`/api/knowledge/databases/${kbId}/documents/add`, {
|
|
items,
|
|
params
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 获取文档信息
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {string} docId - 文档ID
|
|
* @returns {Promise} - 文档信息
|
|
*/
|
|
getDocumentInfo: async (kbId, docId) => {
|
|
return apiAdminGet(`/api/knowledge/databases/${kbId}/documents/${docId}`)
|
|
},
|
|
|
|
/**
|
|
* 获取文档基本信息
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {string} docId - 文档ID
|
|
* @returns {Promise} - 文档基本信息
|
|
*/
|
|
getDocumentBasicInfo: async (kbId, docId) => {
|
|
return apiAdminGet(`/api/knowledge/databases/${kbId}/documents/${docId}/basic`)
|
|
},
|
|
|
|
/**
|
|
* 获取文档解析内容和分块
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {string} docId - 文档ID
|
|
* @returns {Promise} - 文档内容信息
|
|
*/
|
|
getDocumentContent: async (kbId, docId) => {
|
|
return apiAdminGet(`/api/knowledge/databases/${kbId}/documents/${docId}/content`)
|
|
},
|
|
|
|
/**
|
|
* 删除文档
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {string} docId - 文档ID
|
|
* @returns {Promise} - 删除结果
|
|
*/
|
|
deleteDocument: async (kbId, docId) => {
|
|
return apiAdminDelete(`/api/knowledge/databases/${kbId}/documents/${docId}`)
|
|
},
|
|
|
|
/**
|
|
* 批量删除文档
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {Array} fileIds - 文件ID列表
|
|
* @returns {Promise} - 批量删除结果
|
|
*/
|
|
batchDeleteDocuments: async (kbId, fileIds) => {
|
|
return apiRequest(
|
|
`/api/knowledge/databases/${kbId}/documents/batch`,
|
|
{
|
|
method: 'DELETE',
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
},
|
|
body: JSON.stringify(fileIds)
|
|
},
|
|
true,
|
|
'json'
|
|
)
|
|
},
|
|
|
|
/**
|
|
* 下载文档
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {string} docId - 文档ID
|
|
* @returns {Promise} - Response对象
|
|
*/
|
|
downloadDocument: async (kbId, docId) => {
|
|
return apiAdminGet(`/api/knowledge/databases/${kbId}/documents/${docId}/download`, {}, 'blob')
|
|
},
|
|
|
|
/**
|
|
* 手动触发文档解析
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {Array} fileIds - 文件ID列表
|
|
* @returns {Promise} - 解析任务结果
|
|
*/
|
|
parseDocuments: async (kbId, fileIds) => {
|
|
return apiAdminPost(`/api/knowledge/databases/${kbId}/documents/parse`, fileIds)
|
|
},
|
|
|
|
/**
|
|
* 手动触发全部待解析文档解析
|
|
* @param {string} kbId - 知识库ID
|
|
* @returns {Promise} - 解析任务结果
|
|
*/
|
|
parsePendingDocuments: async (kbId) => {
|
|
return apiAdminPost(`/api/knowledge/databases/${kbId}/documents/parse-pending`, {})
|
|
},
|
|
|
|
/**
|
|
* 手动触发文档入库
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {Array} fileIds - 文件ID列表
|
|
* @param {Object} params - 处理参数
|
|
* @returns {Promise} - 入库任务结果
|
|
*/
|
|
indexDocuments: async (kbId, fileIds, params = {}) => {
|
|
return apiAdminPost(`/api/knowledge/databases/${kbId}/documents/index`, {
|
|
file_ids: fileIds,
|
|
params
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 手动触发全部待入库文档入库
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {Object} params - 处理参数
|
|
* @returns {Promise} - 入库任务结果
|
|
*/
|
|
indexPendingDocuments: async (kbId, params = {}) => {
|
|
return apiAdminPost(`/api/knowledge/databases/${kbId}/documents/index-pending`, {
|
|
params
|
|
})
|
|
}
|
|
}
|
|
|
|
// =============================================================================
|
|
// === 图谱构建分组 ===
|
|
// =============================================================================
|
|
|
|
function graphBuildUrl(kbId, action) {
|
|
return `/api/knowledge/databases/${kbId}/graph-build/${action}`
|
|
}
|
|
|
|
export const graphBuildApi = {
|
|
getStatus: async (kbId) => {
|
|
return apiAdminGet(graphBuildUrl(kbId, 'status'))
|
|
},
|
|
|
|
configure: async (kbId, data) => {
|
|
return apiAdminPost(graphBuildUrl(kbId, 'config'), data)
|
|
},
|
|
|
|
startIndex: async (kbId, batchSize = 20) => {
|
|
return apiAdminPost(graphBuildUrl(kbId, 'index'), {
|
|
batch_size: batchSize
|
|
})
|
|
},
|
|
|
|
reset: async (kbId, data) => {
|
|
return apiAdminPost(graphBuildUrl(kbId, 'reset'), data)
|
|
}
|
|
}
|
|
|
|
// =============================================================================
|
|
// === 思维导图分组 ===
|
|
// =============================================================================
|
|
|
|
export const mindmapApi = {
|
|
getDatabases: async () => {
|
|
return apiAdminGet('/api/knowledge/mindmap/databases')
|
|
},
|
|
|
|
getDatabaseFiles: async (kbId) => {
|
|
return apiAdminGet(`/api/knowledge/databases/${kbId}/mindmap/files`)
|
|
},
|
|
|
|
generateMindmap: async (kbId, fileIds = [], userPrompt = '', incremental = false) => {
|
|
return apiAdminPost(`/api/knowledge/databases/${kbId}/mindmap/generate`, {
|
|
file_ids: fileIds,
|
|
user_prompt: userPrompt,
|
|
incremental
|
|
})
|
|
},
|
|
|
|
getByDatabase: async (kbId) => {
|
|
return apiAdminGet(`/api/knowledge/databases/${kbId}/mindmap`)
|
|
},
|
|
|
|
getDiff: async (kbId) => {
|
|
return apiAdminGet(`/api/knowledge/databases/${kbId}/mindmap/diff`)
|
|
}
|
|
}
|
|
|
|
// =============================================================================
|
|
// === 查询分组 ===
|
|
// =============================================================================
|
|
|
|
export const queryApi = {
|
|
/**
|
|
* 查询知识库
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {string} query - 查询文本
|
|
* @param {Object} meta - 查询参数
|
|
* @returns {Promise} - 查询结果
|
|
*/
|
|
queryKnowledgeBase: async (kbId, query, meta = {}) => {
|
|
return apiAdminPost(`/api/knowledge/databases/${kbId}/query`, {
|
|
query,
|
|
meta
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 测试查询知识库
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {string} query - 查询文本
|
|
* @param {Object} meta - 查询参数
|
|
* @returns {Promise} - 测试结果
|
|
*/
|
|
queryTest: async (kbId, query, meta = {}) => {
|
|
return apiAdminPost(`/api/knowledge/databases/${kbId}/query-test`, {
|
|
query,
|
|
meta
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 获取知识库查询参数
|
|
* @param {string} kbId - 知识库ID
|
|
* @returns {Promise} - 查询参数
|
|
*/
|
|
getKnowledgeBaseQueryParams: async (kbId) => {
|
|
return apiAdminGet(`/api/knowledge/databases/${kbId}/query-params`)
|
|
},
|
|
|
|
/**
|
|
* 更新知识库查询参数
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {Object} params - 查询参数
|
|
* @returns {Promise} - 更新结果
|
|
*/
|
|
updateKnowledgeBaseQueryParams: async (kbId, params) => {
|
|
return apiAdminPut(`/api/knowledge/databases/${kbId}/query-params`, params)
|
|
},
|
|
|
|
/**
|
|
* 生成知识库的测试问题
|
|
* @param {string} kbId - 知识库ID
|
|
* @param {number} count - 生成问题数量,默认10
|
|
* @returns {Promise} - 生成的问题列表
|
|
*/
|
|
generateSampleQuestions: async (kbId, count = 10) => {
|
|
return apiAdminPost(`/api/knowledge/databases/${kbId}/sample-questions`, {
|
|
count
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 获取知识库的测试问题
|
|
* @param {string} kbId - 知识库ID
|
|
* @returns {Promise} - 问题列表
|
|
*/
|
|
getSampleQuestions: async (kbId) => {
|
|
return apiAdminGet(`/api/knowledge/databases/${kbId}/sample-questions`)
|
|
}
|
|
}
|
|
|
|
// =============================================================================
|
|
// === 文件管理分组 ===
|
|
// =============================================================================
|
|
|
|
export const fileApi = {
|
|
/**
|
|
* 抓取 URL 内容
|
|
* @param {string} url - 目标 URL
|
|
* @param {string} kbId - 知识库 ID
|
|
* @returns {Promise} - 抓取结果
|
|
*/
|
|
fetchUrl: async (url, kbId = null) => {
|
|
return apiAdminPost('/api/knowledge/files/fetch-url', {
|
|
url,
|
|
kb_id: kbId
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 从工作区导入文件到知识库 MinIO 暂存区
|
|
* @param {string} kbId - 知识库 ID
|
|
* @param {Array<string>} paths - 工作区文件路径
|
|
* @returns {Promise} - 导入结果
|
|
*/
|
|
importWorkspaceFiles: async (kbId, paths) => {
|
|
return apiAdminPost('/api/knowledge/files/import-workspace', {
|
|
kb_id: kbId,
|
|
paths
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 上传文件
|
|
* @param {File} file - 文件对象
|
|
* @param {string} kbId - 知识库ID(可选)
|
|
* @returns {Promise} - 上传结果
|
|
*/
|
|
uploadFile: async (file, kbId = null) => {
|
|
const formData = new FormData()
|
|
formData.append('file', file)
|
|
|
|
const url = kbId ? `/api/knowledge/files/upload?kb_id=${kbId}` : '/api/knowledge/files/upload'
|
|
|
|
return apiAdminPost(url, formData, {
|
|
headers: {
|
|
'Content-Type': 'multipart/form-data'
|
|
}
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 获取支持的文件类型
|
|
* @returns {Promise} - 文件类型列表
|
|
*/
|
|
getSupportedFileTypes: async () => {
|
|
return apiAdminGet('/api/knowledge/files/supported-types')
|
|
},
|
|
|
|
/**
|
|
* 上传文件夹(zip格式)
|
|
* @param {File} file - zip文件
|
|
* @param {string} kbId - 知识库ID
|
|
* @returns {Promise} - 上传结果
|
|
*/
|
|
uploadFolder: async (file, kbId) => {
|
|
const formData = new FormData()
|
|
formData.append('file', file)
|
|
|
|
// 使用 apiRequest 直接发送 FormData,但使用统一的错误处理
|
|
return apiRequest(
|
|
`/api/knowledge/files/upload-folder?kb_id=${kbId}`,
|
|
{
|
|
method: 'POST',
|
|
body: formData
|
|
// 不设置 Content-Type,让浏览器自动设置 boundary
|
|
},
|
|
true,
|
|
'json'
|
|
) // 需要认证,期望JSON响应
|
|
},
|
|
|
|
/**
|
|
* 处理文件夹(异步处理zip文件)
|
|
* @param {Object} data - 处理参数
|
|
* @param {string} data.file_path - 已上传的zip文件路径
|
|
* @param {string} data.kb_id - 知识库ID
|
|
* @param {string} data.content_hash - 文件内容哈希
|
|
* @returns {Promise} - 处理任务结果
|
|
*/
|
|
processFolder: async ({ file_path, kb_id, content_hash }) => {
|
|
return apiAdminPost('/api/knowledge/files/process-folder', {
|
|
file_path,
|
|
kb_id,
|
|
content_hash
|
|
})
|
|
}
|
|
}
|
|
|
|
// =============================================================================
|
|
// === 知识库类型分组 ===
|
|
// =============================================================================
|
|
|
|
export const typeApi = {
|
|
/**
|
|
* 获取支持的知识库类型
|
|
* @returns {Promise} - 知识库类型列表
|
|
*/
|
|
getKnowledgeBaseTypes: async () => {
|
|
return apiAdminGet('/api/knowledge/types')
|
|
},
|
|
|
|
/**
|
|
* 获取支持的知识库分块策略
|
|
* @returns {Promise} - 分块策略列表
|
|
*/
|
|
getChunkPresets: async () => {
|
|
return apiAdminGet('/api/knowledge/chunk-presets')
|
|
},
|
|
|
|
/**
|
|
* 获取知识库统计信息
|
|
* @returns {Promise} - 统计信息
|
|
*/
|
|
getStatistics: async () => {
|
|
return apiAdminGet('/api/knowledge/stats')
|
|
}
|
|
}
|
|
|
|
// =============================================================================
|
|
// === RAG评估分组 ===
|
|
// =============================================================================
|
|
|
|
export const evaluationApi = {
|
|
uploadDataset: async (kbId, file, metadata = {}) => {
|
|
const formData = new FormData()
|
|
formData.append('file', file)
|
|
formData.append('name', metadata.name || '')
|
|
formData.append('description', metadata.description || '')
|
|
|
|
return apiAdminPost(`/api/evaluation/databases/${kbId}/datasets/upload`, formData)
|
|
},
|
|
|
|
listDatasets: async (kbId) => {
|
|
return apiAdminGet(`/api/evaluation/databases/${kbId}/datasets`)
|
|
},
|
|
|
|
getDataset: async (kbId, datasetId, page = 1, pageSize = 50) => {
|
|
const params = new URLSearchParams({
|
|
page: page.toString(),
|
|
page_size: pageSize.toString()
|
|
})
|
|
return apiAdminGet(`/api/evaluation/databases/${kbId}/datasets/${datasetId}?${params}`)
|
|
},
|
|
|
|
deleteDataset: async (datasetId) => {
|
|
return apiAdminDelete(`/api/evaluation/datasets/${datasetId}`)
|
|
},
|
|
|
|
downloadDataset: async (datasetId) => {
|
|
return apiAdminGet(`/api/evaluation/datasets/${datasetId}/download`, {}, 'blob')
|
|
},
|
|
|
|
generateDataset: async (kbId, params) => {
|
|
return apiAdminPost(`/api/evaluation/databases/${kbId}/datasets/generate`, params)
|
|
},
|
|
|
|
runEvaluation: async (kbId, params) => {
|
|
return apiAdminPost(`/api/evaluation/databases/${kbId}/runs`, params)
|
|
},
|
|
|
|
listRuns: async (kbId) => {
|
|
return apiAdminGet(`/api/evaluation/databases/${kbId}/runs`)
|
|
},
|
|
|
|
getRunResults: async (kbId, runId, params = {}) => {
|
|
const queryParams = new URLSearchParams()
|
|
|
|
if (params.page) queryParams.append('page', params.page)
|
|
if (params.pageSize) queryParams.append('page_size', params.pageSize)
|
|
if (params.errorOnly !== undefined) queryParams.append('error_only', params.errorOnly)
|
|
|
|
const url = `/api/evaluation/databases/${kbId}/runs/${runId}${queryParams.toString() ? '?' + queryParams.toString() : ''}`
|
|
return apiAdminGet(url)
|
|
},
|
|
|
|
deleteRun: async (kbId, runId) => {
|
|
return apiAdminDelete(`/api/evaluation/databases/${kbId}/runs/${runId}`)
|
|
}
|
|
}
|