from typing import List from fastapi import APIRouter, Depends, File, Form, UploadFile from sqlalchemy.ext.asyncio import AsyncSession from starlette.responses import StreamingResponse from database import get_db from schemas.library import LibraryFileRequest, LibraryFileResponse from schemas.agent import QueryQuestionRequest, QueryKnowledgeRequest from service import library_service, agent_service from storage import upload_rustfs from ocr import ocr_from_url router = APIRouter(prefix="/library", tags=["Library"]) @router.post("/upload") def upload(file: UploadFile = File(...), filename: str = Form(...)): url = upload_rustfs(file.file, filename) return ocr_from_url(url) @router.post("/question") def generate_question(query: QueryQuestionRequest): return StreamingResponse( agent_service.query_question_agent(query), media_type="text/event-stream", ) @router.post("/knowledge") def generate_knowledge(query: QueryKnowledgeRequest): return StreamingResponse( agent_service.query_knowledge_agent(query), media_type="text/event-stream", ) @router.get("/files", response_model=List[LibraryFileResponse]) async def list_files(db: AsyncSession = Depends(get_db)): return await library_service.list_files(db) @router.get("/files/{file_id}", response_model=LibraryFileResponse) async def get_file(file_id: int, db: AsyncSession = Depends(get_db)): return await library_service.get_file(db, file_id) @router.post("/files", response_model=bool) async def add_file(data: LibraryFileRequest, db: AsyncSession = Depends(get_db)): return await library_service.add_file(db, data) @router.put("/files/{file_id}", response_model=bool) async def edit_file(file_id: int, data: LibraryFileRequest, db: AsyncSession = Depends(get_db)): return await library_service.edit_file(db, file_id, data)