diff --git a/ruoyi-fastapi-backend/module_admin/controller/ragflow_controller.py b/ruoyi-fastapi-backend/module_admin/controller/ragflow_controller.py index 243b862..2618473 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/ragflow_controller.py +++ b/ruoyi-fastapi-backend/module_admin/controller/ragflow_controller.py @@ -13,7 +13,7 @@ from module_admin.service.ragflow_service import RAGFlowService from utils.log_util import logger from utils.page_util import PageResponseModel from utils.response_util import ResponseUtil -from module_admin.entity.vo.ragflow_vo import RagflowListQueryModel +from module_admin.entity.vo.ragflow_vo import RagflowListQueryModel, ListDocumentsQueryModel # from config.env import RAGFlowConfig @@ -21,19 +21,37 @@ from module_admin.entity.vo.ragflow_vo import RagflowListQueryModel ragflowController = APIRouter(prefix="/system/ragflow", dependencies=[Depends(LoginService.get_current_user)]) - -@ragflowController.post("/dataset_list", response_model=PageResponseModel +# 查看数据集列表 +@ragflowController.post("/dataset_list" + # , response_model=PageResponseModel # , dependencies=[Depends(CheckUserInterfaceAuth("system:ragflow:list"))]" ) async def get_system_ragflow_list( request: Request, - rage_flow_query: RagflowListQueryModel , - query_db: AsyncSession = Depends(get_db), + rage_flow_dastset_query: RagflowListQueryModel , + # query_db: AsyncSession = Depends(get_db), ): - result = await RAGFlowService.get_ragflow_list_services(query_db, rage_flow_query) + result = await RAGFlowService.get_ragflow_dataset_list_services(None, rage_flow_dastset_query) return ResponseUtil.success(data = result) # 获取分页数据 - # ragflow_list, total = await RagflowService.get_ragflow_list(query_db, ragflow_page_query) \ No newline at end of file + # ragflow_list, total = await RagflowService.get_ragflow_list(query_db, ragflow_page_query) + +# 列出数据集中文档列表 +@ragflowController.get("/list_documents/{dataset_id}") +async def list_documents_by_dataset_id( + request: Request, + dataset_id: str, + list_documents_query: ListDocumentsQueryModel = Depends(ListDocumentsQueryModel.as_query), + + # query_db: AsyncSession = Depends(get_db), +): + """ + 列出数据集中文档列表 + """ + print(list_documents_query) + result = await RAGFlowService.list_documents(None, dataset_id, list_documents_query) + + return ResponseUtil.success(data = result) \ No newline at end of file diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/ragflow_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/ragflow_vo.py index f885ae4..c6820a7 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/vo/ragflow_vo.py +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/ragflow_vo.py @@ -13,4 +13,20 @@ class RagflowListQueryModel(BaseModel): orderby: Optional[str] = Field(default='create_time', description='排序字段') desc: Optional[str] = Field(default='true', description='排序方式') name: Optional[str] = Field(default=None, description='名称') - dataset_id: Optional[str] = Field(default=None, description='数据集ID') \ No newline at end of file + dataset_id: Optional[str] = Field(default=None, description='数据集ID') + +@as_query +class ListDocumentsQueryModel(BaseModel): + """ + 查询文档列表参数模型 + """ + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + page: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页数量') + orderby: Optional[str] = Field(default='create_time', description='排序字段') + desc: Optional[str] = Field(default='true', description='排序方式') + keywords: Optional[str] = Field(default=None, description='关键字') + document_id: Optional[str] = Field(default=None, description='文档ID') + document_name: Optional[str] = Field(default=None, description='文档名称') + + \ No newline at end of file diff --git a/ruoyi-fastapi-backend/module_admin/service/ragflow_service.py b/ruoyi-fastapi-backend/module_admin/service/ragflow_service.py index 55785b4..83aea1f 100644 --- a/ruoyi-fastapi-backend/module_admin/service/ragflow_service.py +++ b/ruoyi-fastapi-backend/module_admin/service/ragflow_service.py @@ -1,6 +1,6 @@ from sqlalchemy.ext.asyncio import AsyncSession from utils.ragflow_asy_util import AsyncRAGFlowClient -from module_admin.entity.vo.ragflow_vo import RagflowListQueryModel +from module_admin.entity.vo.ragflow_vo import RagflowListQueryModel, ListDocumentsQueryModel from config.env import RAGFlowConfig class RAGFlowService: @@ -10,7 +10,7 @@ class RAGFlowService: # 获取数据集列表 @classmethod - async def get_ragflow_list_services(cls, query_db: AsyncSession, rage_flow_query: RagflowListQueryModel): + async def get_ragflow_dataset_list_services(cls, query_db: AsyncSession, rage_flow_query: RagflowListQueryModel): """ 获取数据集列表 """ @@ -19,4 +19,17 @@ class RAGFlowService: result = await client.list_datasets(**(rage_flow_query.model_dump())) # 获取分页数据 + return result.get('data', None) + + # 获取数据集中文档列表 + @classmethod + async def list_documents( + cls, + query_db: AsyncSession, + dataset_id: str, + list_documents_query: ListDocumentsQueryModel, + ): + async with AsyncRAGFlowClient(RAGFlowConfig.RAGFLOW_BASE_URL, RAGFlowConfig.RAGFLOW_API_KEY) as client: + result = await client.list_documents(dataset_id=dataset_id, **(list_documents_query.model_dump())) + return result.get('data', None) \ No newline at end of file diff --git a/ruoyi-fastapi-backend/utils/ragflow_asy_util.py b/ruoyi-fastapi-backend/utils/ragflow_asy_util.py index 8678397..424298c 100644 --- a/ruoyi-fastapi-backend/utils/ragflow_asy_util.py +++ b/ruoyi-fastapi-backend/utils/ragflow_asy_util.py @@ -291,6 +291,38 @@ class AsyncRAGFlowClient: except (aiohttp.ContentTypeError, json.JSONDecodeError): text = await response.text() raise RAGFlowError(response.status, text) + + async def upload_documents_bytes(self, dataset_id: str, file_name, file_bytes: List) -> Dict[str, Any]: + """ + 上传文档到数据集 + + Args: + dataset_id: 数据集ID + file_paths: 文件路径列表 + """ + if not self._session: + await self.create_session() + + endpoint = f"/api/v1/datasets/{dataset_id}/documents" + url = f"{self.base_url}{endpoint}" + + # 准备multipart数据 + data = aiohttp.FormData() + for file in file_bytes: + + data.add_field('file', file, filename=file_name) + + headers = {'Authorization': f'Bearer {self.api_key}'} + + async with self._session.post(url, headers=headers, data=data) as response: + try: + result = await response.json() + if result.get('code', 0) != 0: + raise RAGFlowError(result.get('code'), result.get('message')) + return result + except (aiohttp.ContentTypeError, json.JSONDecodeError): + text = await response.text() + raise RAGFlowError(response.status, text) async def update_document(self, dataset_id: str, document_id: str, name: Optional[str] = None, meta_fields: Optional[Dict[str, Any]] = None,