feat(rag): add temporary chat attachments

This commit is contained in:
wren
2026-05-25 15:37:37 +08:00
parent 0f385c9839
commit 75c077da77
16 changed files with 2257 additions and 16 deletions
@@ -30,6 +30,10 @@ from fastapi_modules.fastapi_leaudit.domian.vo.ragChatVo import (
RagMessagePageVO,
RagOperationResultVO,
)
from fastapi_modules.fastapi_leaudit.domian.vo.ragChatAttachmentVo import (
RagChatAttachmentDeleteVO,
RagChatAttachmentVO,
)
from fastapi_modules.fastapi_leaudit.domian.vo.ragDatasetVo import (
RagDatasetBatchDeleteResultVO,
RagDatasetDetailVO,
@@ -43,8 +47,10 @@ from fastapi_modules.fastapi_leaudit.domian.vo.ragDatasetVo import (
)
from fastapi_modules.fastapi_leaudit.services.impl.permissionServiceImpl import PermissionServiceImpl
from fastapi_modules.fastapi_leaudit.services.impl.ragChatServiceImpl import RagChatServiceImpl
from fastapi_modules.fastapi_leaudit.services.impl.ragChatAttachmentServiceImpl import RagChatAttachmentServiceImpl
from fastapi_modules.fastapi_leaudit.services.impl.ragDatasetServiceImpl import RagDatasetServiceImpl
from fastapi_modules.fastapi_leaudit.services.permissionService import IPermissionService
from fastapi_modules.fastapi_leaudit.services.ragChatAttachmentService import IRagChatAttachmentService
from fastapi_modules.fastapi_leaudit.services.ragChatService import IRagChatService
from fastapi_modules.fastapi_leaudit.services.ragDatasetService import IRagDatasetService
@@ -76,6 +82,7 @@ class RagChatController(BaseController):
def __init__(self):
super().__init__(prefix="/v3/rag", tags=["RAG 聊天"])
self.RagChatService: IRagChatService = RagChatServiceImpl()
self.RagChatAttachmentService: IRagChatAttachmentService = RagChatAttachmentServiceImpl()
self.RagDatasetService: IRagDatasetService = RagDatasetServiceImpl()
self.PermissionService: IPermissionService = PermissionServiceImpl()
@@ -484,6 +491,8 @@ class RagChatController(BaseController):
Query=Body.query,
ConversationId=Body.conversationId,
AppId=Body.appId,
AttachmentId=Body.attachmentId,
AttachmentIds=Body.attachmentIds,
)
return StreamingResponse(
stream,
@@ -491,6 +500,62 @@ class RagChatController(BaseController):
headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no", "Connection": "keep-alive"},
)
@self.router.post("/chat/attachments", response_model=Result[RagChatAttachmentVO])
async def UploadChatAttachment(
file: UploadFile = File(...),
conversation_id: str | None = Form(None),
app_id: int | None = Form(None),
payload: dict[str, Any] = Depends(verify_access_token),
):
if not await self._check_permission(int(payload["user_id"]), [self._PERMISSIONS["chat_use"]]):
return JSONResponse(status_code=403, content={"code": 403, "msg": "当前用户没有上传聊天附件权限", "data": None})
tenant_context = self._tenant_context(payload)
file_bytes = await file.read()
data = await self.RagChatAttachmentService.CreateAttachment(
CurrentUserId=int(payload["user_id"]),
**tenant_context,
ConversationId=conversation_id,
AppId=app_id,
FileName=file.filename or "attachment",
ContentType=file.content_type,
Content=file_bytes,
)
return Result.success(data=data)
@self.router.get("/chat/attachments/{AttachmentId}", response_model=Result[RagChatAttachmentVO])
async def GetChatAttachment(
AttachmentId: str,
conversation_id: str = Query(..., description="附件所属会话ID"),
payload: dict[str, Any] = Depends(verify_access_token),
):
if not await self._check_permission(int(payload["user_id"]), [self._PERMISSIONS["chat_use"]]):
return JSONResponse(status_code=403, content={"code": 403, "msg": "当前用户没有查看聊天附件权限", "data": None})
tenant_context = self._tenant_context(payload)
data = await self.RagChatAttachmentService.GetAttachment(
CurrentUserId=int(payload["user_id"]),
**tenant_context,
ConversationId=conversation_id,
AttachmentId=AttachmentId,
)
return Result.success(data=data)
@self.router.delete("/chat/attachments/{AttachmentId}", response_model=Result[RagChatAttachmentDeleteVO])
async def DeleteChatAttachment(
AttachmentId: str,
conversation_id: str = Query(..., description="附件所属会话ID"),
payload: dict[str, Any] = Depends(verify_access_token),
):
if not await self._check_permission(int(payload["user_id"]), [self._PERMISSIONS["chat_use"]]):
return JSONResponse(status_code=403, content={"code": 403, "msg": "当前用户没有删除聊天附件权限", "data": None})
tenant_context = self._tenant_context(payload)
data = await self.RagChatAttachmentService.DeleteAttachment(
CurrentUserId=int(payload["user_id"]),
**tenant_context,
ConversationId=conversation_id,
AttachmentId=AttachmentId,
)
return Result.success(data=data)
@self.router.post("/chat/messages/{MessageId}/stop", response_model=Result[RagOperationResultVO])
async def StopMessage(
MessageId: str,