File size: 2,445 Bytes
13eeded
 
8b84edc
84ef14b
 
13eeded
 
2918218
d92713e
 
13eeded
8b84edc
 
 
 
 
 
 
 
13eeded
64daaca
13eeded
 
 
84ef14b
 
13eeded
84ef14b
 
13eeded
84ef14b
13eeded
 
 
8b84edc
13eeded
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8b84edc
64daaca
13eeded
 
 
 
 
 
 
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
from fastapi import FastAPI, UploadFile, Form, Request
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import HTMLResponse, JSONResponse, FileResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
import shutil, os
from tempfile import gettempdir

app = FastAPI()

# βœ… CORS to allow frontend access
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# βœ… Static assets
app.mount("/resources", StaticFiles(directory="resources"), name="resources")
app.mount("/static", StaticFiles(directory="static"), name="static")

# βœ… Jinja2 Templates
templates = Jinja2Templates(directory="templates")

# βœ… Serve Homepage
@app.get("/", response_class=HTMLResponse)
async def serve_home(request: Request):
    return templates.TemplateResponse("home.html", {"request": request})

# βœ… Predict endpoint (handles image + document)
@app.post("/predict")
async def predict(question: str = Form(...), file: UploadFile = Form(...)):
    try:
        temp_path = f"temp_{file.filename}"
        with open(temp_path, "wb") as f:
            shutil.copyfileobj(file.file, f)

        is_image = file.content_type.startswith("image/")

        if is_image:
            from appImage import answer_question_from_image
            from PIL import Image
            image = Image.open(temp_path).convert("RGB")
            answer, audio_path = answer_question_from_image(image, question)

        else:
            from app import answer_question_from_doc
            class NamedFile:
                def __init__(self, name): self.filename = name
                def read(self): return open(self.filename, "rb").read()
            answer, audio_path = answer_question_from_doc(NamedFile(temp_path), question)

        os.remove(temp_path)

        if audio_path and os.path.exists(audio_path):
            return JSONResponse({
                "answer": answer,
                "audio": f"/audio/{os.path.basename(audio_path)}"
            })
        else:
            return JSONResponse({"answer": answer})

    except Exception as e:
        return JSONResponse({"error": str(e)}, status_code=500)

# βœ… Serve audio
@app.get("/audio/{filename}")
async def get_audio(filename: str):
    filepath = os.path.join(gettempdir(), filename)
    return FileResponse(filepath, media_type="audio/mpeg")