HamidOmarov's picture
Fix imports/order and provide full working FastAPI app
a037cf8
raw
history blame
2.44 kB
# app/api.py
from typing import List, Optional
from fastapi import FastAPI, UploadFile, File
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse, RedirectResponse
from pydantic import BaseModel
from .rag_system import SimpleRAG, UPLOAD_DIR
app = FastAPI(title="RAG API", version="1.2.3")
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
rag = SimpleRAG()
# ---------- Models ----------
class UploadResponse(BaseModel):
filename: str
chunks_added: int
class AskRequest(BaseModel):
question: str
top_k: int = 5
class AskResponse(BaseModel):
answer: str
contexts: List[str]
class HistoryResponse(BaseModel):
total_chunks: int
# ---------- Debug ----------
@app.get("/debug/translate")
def debug_translate():
try:
from transformers import pipeline
tr = pipeline("translation", model="Helsinki-NLP/opus-mt-az-en", cache_dir=str(rag.cache_dir), device=-1)
out = tr("Sənəd təmiri və quraşdırılması ilə bağlı işlər görülüb.", max_length=80)[0]["translation_text"]
return {"ok": True, "example_out": out}
except Exception as e:
return JSONResponse(status_code=500, content={"ok": False, "error": str(e)})
# ---------- Core ----------
@app.get("/")
def root():
return RedirectResponse(url="/docs")
@app.get("/health")
def health():
return {"status": "ok", "version": app.version, "summarizer": "extractive_en+translate+fallback"}
@app.post("/upload_pdf", response_model=UploadResponse)
async def upload_pdf(file: UploadFile = File(...)):
dest = UPLOAD_DIR / file.filename
with open(dest, "wb") as f:
while True:
chunk = await file.read(1024 * 1024)
if not chunk:
break
f.write(chunk)
added = rag.add_pdf(dest)
return UploadResponse(filename=file.filename, chunks_added=added)
@app.post("/ask_question", response_model=AskResponse)
def ask_question(payload: AskRequest):
hits = rag.search(payload.question, k=max(1, payload.top_k))
contexts = [c for c, _ in hits]
answer = rag.synthesize_answer(payload.question, contexts)
return AskResponse(answer=answer, contexts=contexts)
@app.get("/get_history", response_model=HistoryResponse)
def get_history():
return HistoryResponse(total_chunks=len(rag.chunks))