File size: 2,443 Bytes
64fd9b7
a037cf8
 
 
64fd9b7
a037cf8
78bd110
a7ef914
a037cf8
78bd110
a037cf8
78bd110
 
 
 
 
 
 
 
 
 
 
a037cf8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a7ef914
 
 
 
78bd110
a7ef914
78bd110
a7ef914
 
 
a037cf8
0d2dbdc
 
 
 
64fd9b7
 
a037cf8
64fd9b7
 
 
a037cf8
 
 
 
 
 
 
 
 
64fd9b7
 
a037cf8
 
 
 
 
64fd9b7
 
a037cf8
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# 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))