From 19fed3551e627b0bdabb3820a810f96eb200719f Mon Sep 17 00:00:00 2001 From: haotian <2421912570@qq.com> Date: Thu, 4 Sep 2025 11:36:55 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9=E6=9F=A5=E8=AF=A2=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=90=8D\n2.=E5=AE=9E=E7=8E=B0=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E6=95=B0=E6=8D=AE=E9=9B=86=E4=B8=8B=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3\n3.=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E5=88=B0ragflow?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E4=B8=8A=E4=BC=A0=E5=AD=97=E8=8A=82=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ragflow_controller.py | 32 +++++++++++++++---- .../module_admin/entity/vo/ragflow_vo.py | 18 ++++++++++- .../module_admin/service/ragflow_service.py | 17 ++++++++-- .../utils/ragflow_asy_util.py | 32 +++++++++++++++++++ 4 files changed, 89 insertions(+), 10 deletions(-) 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,