""" API для RAG: индексация документов и ответы на вопросы """ from fastapi import APIRouter, status, Request from typing import Annotated from dishka.integrations.fastapi import FromDishka, inject from src.domain.repositories.user_repository import IUserRepository from src.presentation.middleware.auth_middleware import get_current_user from src.presentation.schemas.rag_schemas import ( QuestionRequest, RAGAnswer, IndexDocumentRequest, IndexDocumentResponse, ) from src.application.use_cases.rag_use_cases import RAGUseCases from src.domain.entities.user import User router = APIRouter(prefix="/rag", tags=["rag"]) @router.post("/index", response_model=IndexDocumentResponse, status_code=status.HTTP_200_OK) @inject async def index_document( body: IndexDocumentRequest, request: Request, user_repo: Annotated[IUserRepository, FromDishka()], use_cases: Annotated[RAGUseCases, FromDishka()], ): """Индексирование идет через чанкирование, далее эмбеддинг и загрузка в векторную бд""" current_user = await get_current_user(request, user_repo) result = await use_cases.index_document(body.document_id) return IndexDocumentResponse(**result) @router.post("/question", response_model=RAGAnswer, status_code=status.HTTP_200_OK) @inject async def ask_question( body: QuestionRequest, request: Request, user_repo: Annotated[IUserRepository, FromDishka()], use_cases: Annotated[RAGUseCases, FromDishka()], ): """Отвечает на вопрос, используя RAG в рамках беседы""" current_user = await get_current_user(request, user_repo) result = await use_cases.ask_question( conversation_id=body.conversation_id, user_id=current_user.user_id, question=body.question, top_k=body.top_k, rerank_top_n=body.rerank_top_n, ) return RAGAnswer(**result)