ForcePilot/web/src/apis/knowledge_api.js
Wenjie Zhang fffe237780 feat(知识库): 在生成描述时支持传入文件列表
在知识库描述生成功能中增加文件列表参数,使AI能参考文件内容生成更准确的描述
前端组件传递文件列表至API,后端处理时将其包含在提示词中
2026-01-03 19:02:08 +08:00

493 lines
14 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { 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} dbId - 知识库ID
* @returns {Promise} - 知识库信息
*/
getDatabaseInfo: async (dbId) => {
return apiAdminGet(`/api/knowledge/databases/${dbId}`)
},
/**
* 更新知识库信息
* @param {string} dbId - 知识库ID
* @param {Object} updateData - 更新数据
* @returns {Promise} - 更新结果
*/
updateDatabase: async (dbId, updateData) => {
return apiAdminPut(`/api/knowledge/databases/${dbId}`, updateData)
},
/**
* 删除知识库
* @param {string} dbId - 知识库ID
* @returns {Promise} - 删除结果
*/
deleteDatabase: async (dbId) => {
return apiAdminDelete(`/api/knowledge/databases/${dbId}`)
},
/**
* 使用 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
})
}
}
// =============================================================================
// === 文档管理分组 ===
// =============================================================================
export const documentApi = {
/**
* 创建文件夹
* @param {string} dbId - 知识库ID
* @param {string} folderName - 文件夹名称
* @param {string} parentId - 父文件夹ID
* @returns {Promise} - 创建结果
*/
createFolder: async (dbId, folderName, parentId = null) => {
return apiAdminPost(`/api/knowledge/databases/${dbId}/folders`, {
folder_name: folderName,
parent_id: parentId
})
},
/**
* 移动文档/文件夹
* @param {string} dbId - 知识库ID
* @param {string} docId - 文档/文件夹ID
* @param {string} newParentId - 新的父文件夹ID
* @returns {Promise} - 移动结果
*/
moveDocument: async (dbId, docId, newParentId) => {
return apiAdminPut(`/api/knowledge/databases/${dbId}/documents/${docId}/move`, {
new_parent_id: newParentId
})
},
/**
* 添加文档到知识库
* @param {string} dbId - 知识库ID
* @param {Array} items - 文档列表
* @param {Object} params - 处理参数
* @returns {Promise} - 添加结果
*/
addDocuments: async (dbId, items, params = {}) => {
return apiAdminPost(`/api/knowledge/databases/${dbId}/documents`, {
items,
params
})
},
/**
* 获取文档信息
* @param {string} dbId - 知识库ID
* @param {string} docId - 文档ID
* @returns {Promise} - 文档信息
*/
getDocumentInfo: async (dbId, docId) => {
return apiAdminGet(`/api/knowledge/databases/${dbId}/documents/${docId}`)
},
/**
* 删除文档
* @param {string} dbId - 知识库ID
* @param {string} docId - 文档ID
* @returns {Promise} - 删除结果
*/
deleteDocument: async (dbId, docId) => {
return apiAdminDelete(`/api/knowledge/databases/${dbId}/documents/${docId}`)
},
/**
* 下载文档
* @param {string} dbId - 知识库ID
* @param {string} docId - 文档ID
* @returns {Promise} - Response对象
*/
downloadDocument: async (dbId, docId) => {
return apiAdminGet(`/api/knowledge/databases/${dbId}/documents/${docId}/download`, {}, 'blob')
},
/**
* 重新分块文档
* @param {string} dbId - 知识库ID
* @param {Array} fileIds - 文件ID列表
* @param {Object} params - 处理参数
* @returns {Promise} - 重新分块结果
*/
rechunksDocuments: async (dbId, fileIds, params = {}) => {
return apiAdminPost(`/api/knowledge/databases/${dbId}/documents/rechunks`, {
file_ids: fileIds,
params
})
}
}
// =============================================================================
// === 查询分组 ===
// =============================================================================
export const queryApi = {
/**
* 查询知识库
* @param {string} dbId - 知识库ID
* @param {string} query - 查询文本
* @param {Object} meta - 查询参数
* @returns {Promise} - 查询结果
*/
queryKnowledgeBase: async (dbId, query, meta = {}) => {
return apiAdminPost(`/api/knowledge/databases/${dbId}/query`, {
query,
meta
})
},
/**
* 测试查询知识库
* @param {string} dbId - 知识库ID
* @param {string} query - 查询文本
* @param {Object} meta - 查询参数
* @returns {Promise} - 测试结果
*/
queryTest: async (dbId, query, meta = {}) => {
return apiAdminPost(`/api/knowledge/databases/${dbId}/query-test`, {
query,
meta
})
},
/**
* 获取知识库查询参数
* @param {string} dbId - 知识库ID
* @returns {Promise} - 查询参数
*/
getKnowledgeBaseQueryParams: async (dbId) => {
return apiAdminGet(`/api/knowledge/databases/${dbId}/query-params`)
},
/**
* 更新知识库查询参数
* @param {string} dbId - 知识库ID
* @param {Object} params - 查询参数
* @returns {Promise} - 更新结果
*/
updateKnowledgeBaseQueryParams: async (dbId, params) => {
return apiAdminPut(`/api/knowledge/databases/${dbId}/query-params`, params)
},
/**
* 生成知识库的测试问题
* @param {string} dbId - 知识库ID
* @param {number} count - 生成问题数量默认10
* @returns {Promise} - 生成的问题列表
*/
generateSampleQuestions: async (dbId, count = 10) => {
return apiAdminPost(`/api/knowledge/databases/${dbId}/sample-questions`, {
count
})
},
/**
* 获取知识库的测试问题
* @param {string} dbId - 知识库ID
* @returns {Promise} - 问题列表
*/
getSampleQuestions: async (dbId) => {
return apiAdminGet(`/api/knowledge/databases/${dbId}/sample-questions`)
}
}
// =============================================================================
// === 文件管理分组 ===
// =============================================================================
export const fileApi = {
/**
* 上传文件
* @param {File} file - 文件对象
* @param {string} dbId - 知识库ID可选
* @returns {Promise} - 上传结果
*/
uploadFile: async (file, dbId = null) => {
const formData = new FormData()
formData.append('file', file)
const url = dbId
? `/api/knowledge/files/upload?db_id=${dbId}`
: '/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} dbId - 知识库ID
* @returns {Promise} - 上传结果
*/
uploadFolder: async (file, dbId) => {
const formData = new FormData()
formData.append('file', file)
// 使用 apiRequest 直接发送 FormData但使用统一的错误处理
return apiRequest(`/api/knowledge/files/upload-folder?db_id=${dbId}`, {
method: 'POST',
body: formData,
// 不设置 Content-Type让浏览器自动设置 boundary
}, true, 'json') // 需要认证期望JSON响应
},
/**
* 处理文件夹异步处理zip文件
* @param {Object} data - 处理参数
* @param {string} data.file_path - 已上传的zip文件路径
* @param {string} data.db_id - 知识库ID
* @param {string} data.content_hash - 文件内容哈希
* @returns {Promise} - 处理任务结果
*/
processFolder: async ({ file_path, db_id, content_hash }) => {
return apiAdminPost('/api/knowledge/files/process-folder', {
file_path,
db_id,
content_hash
})
}
}
// =============================================================================
// === 知识库类型分组 ===
// =============================================================================
export const typeApi = {
/**
* 获取支持的知识库类型
* @returns {Promise} - 知识库类型列表
*/
getKnowledgeBaseTypes: async () => {
return apiAdminGet('/api/knowledge/types')
},
/**
* 获取知识库统计信息
* @returns {Promise} - 统计信息
*/
getStatistics: async () => {
return apiAdminGet('/api/knowledge/stats')
}
}
// =============================================================================
// === Embedding模型状态检查分组 ===
// =============================================================================
export const embeddingApi = {
/**
* 获取指定embedding模型的状态
* @param {string} modelId - 模型ID
* @returns {Promise} - 模型状态
*/
getModelStatus: async (modelId) => {
return apiAdminGet(`/api/knowledge/embedding-models/${modelId}/status`)
},
/**
* 获取所有embedding模型的状态
* @returns {Promise} - 所有模型状态
*/
getAllModelsStatus: async () => {
return apiAdminGet('/api/knowledge/embedding-models/status')
}
}
// =============================================================================
// === RAG评估分组 ===
// =============================================================================
export const evaluationApi = {
/**
* 上传评估基准文件
* @param {string} dbId - 知识库ID
* @param {File} file - JSONL文件
* @param {Object} metadata - 基准元数据
* @returns {Promise} - 上传结果
*/
uploadBenchmark: async (dbId, file, metadata = {}) => {
const formData = new FormData()
formData.append('file', file)
formData.append('name', metadata.name || '')
formData.append('description', metadata.description || '')
// 调试:打印 FormData 内容
console.log('FormData 内容:')
for (let [key, value] of formData.entries()) {
console.log(key, value)
}
console.log('file type:', file ? file.type : 'undefined')
console.log('file name:', file ? file.name : 'undefined')
// 直接传递 FormDataapiAdminPost 会正确处理
return apiAdminPost(`/api/evaluation/databases/${dbId}/benchmarks/upload`, formData)
},
/**
* 获取评估基准列表
* @param {string} dbId - 知识库ID
* @returns {Promise} - 基准列表
*/
getBenchmarks: async (dbId) => {
return apiAdminGet(`/api/evaluation/databases/${dbId}/benchmarks`)
},
/**
* 获取评估基准详情
* @param {string} benchmarkId - 基准ID
* @returns {Promise} - 基准详情
*/
getBenchmark: async (benchmarkId) => {
return apiAdminGet(`/api/evaluation/benchmarks/${benchmarkId}`)
},
/**
* 获取评估基准详情带db_id
* @param {string} dbId - 知识库ID
* @param {string} benchmarkId - 基准ID
*/
getBenchmarkByDb: async (dbId, benchmarkId, page = 1, pageSize = 50) => {
const params = new URLSearchParams({
page: page.toString(),
page_size: pageSize.toString()
})
return apiAdminGet(`/api/evaluation/databases/${dbId}/benchmarks/${benchmarkId}?${params}`)
},
/**
* 删除评估基准
* @param {string} benchmarkId - 基准ID
* @returns {Promise} - 删除结果
*/
deleteBenchmark: async (benchmarkId) => {
return apiAdminDelete(`/api/evaluation/benchmarks/${benchmarkId}`)
},
/**
* 自动生成评估基准
* @param {string} dbId - 知识库ID
* @param {Object} params - 生成参数
* @param {number} params.count - 生成问题数量
* @param {boolean} params.include_answers - 是否生成答案
* @param {Object} params.llm_config - LLM配置
* @returns {Promise} - 生成结果
*/
generateBenchmark: async (dbId, params) => {
return apiAdminPost(`/api/evaluation/databases/${dbId}/benchmarks/generate`, params)
},
/**
* 运行RAG评估
* @param {string} dbId - 知识库ID
* @param {Object} params - 评估参数
* @param {string} params.benchmark_id - 基准ID
* @param {Object} params.retrieval_config - 检索配置
* @returns {Promise} - 评估任务ID
*/
runEvaluation: async (dbId, params) => {
return apiAdminPost(`/api/evaluation/databases/${dbId}/run`, params)
},
/**
* 获取评估结果
* @param {string} taskId - 任务ID
* @returns {Promise} - 评估结果
*/
getEvaluationResults: async (taskId) => {
// 已废弃:请改用 getEvaluationResultsByDb
return apiAdminGet(`/api/evaluation/${taskId}/results`)
},
/**
* 删除评估结果
* @param {string} taskId - 任务ID
* @returns {Promise} - 删除结果
*/
deleteEvaluationResult: async (taskId) => {
// 已废弃:请改用 deleteEvaluationResultByDb
return apiAdminDelete(`/api/evaluation/${taskId}`)
},
// 新接口:带 db_id 的评估结果查询与删除
getEvaluationResultsByDb: async (dbId, taskId, 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/${dbId}/results/${taskId}${queryParams.toString() ? '?' + queryParams.toString() : ''}`;
return apiAdminGet(url);
},
deleteEvaluationResultByDb: async (dbId, taskId) => {
return apiAdminDelete(`/api/evaluation/databases/${dbId}/results/${taskId}`)
},
/**
* 获取知识库的评估历史记录
* @param {string} dbId - 知识库ID
* @returns {Promise} - 评估历史列表
*/
getEvaluationHistory: async (dbId) => {
return apiAdminGet(`/api/evaluation/databases/${dbId}/history`)
}
}