tech5's picture
Copied GitHub project to Hugging Face Space
6048b8c
from fastapi import FastAPI, UploadFile, File, Form
from fastapi.responses import JSONResponse
from fastapi.middleware.cors import CORSMiddleware
import os
import shutil
from typing import List
from backend.models.embed import embed_and_store # Import from embed.py
from backend.models.app import chat_with_user
app = FastAPI()
# CORS setup for frontend communication(Streamlit)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def root():
return {"message": "FastAPI backend is running!"}
# PDF Upload endpoint
@app.post("/upload/")
async def upload_pdfs(user_id: str = Form(...), files: List[UploadFile] = File(...)):
# Create directories for the user
base_dir = os.path.join("/tmp/docs", user_id)
pdf_dir = os.path.join(base_dir, "pdfs")
image_dir = os.path.join(base_dir,"images")
faiss_dir = os.path.join(base_dir, "faiss_index")
os.makedirs(pdf_dir, exist_ok=True)
os.makedirs(image_dir,exist_ok=True)
os.makedirs(faiss_dir, exist_ok=True)
# Save uploaded PDFs to the user's directory
for file in files:
filename_lower = file.filename.lower()
# First check filename extensions
if filename_lower.endswith(".pdf"):
file_path = os.path.join(pdf_dir, file.filename)
elif any(filename_lower.endswith(ext) for ext in [".png", ".jpg", ".jpeg"]):
file_path = os.path.join(image_dir, file.filename)
# Then fall back to content-type if extension not recognized
elif file.content_type == "application/pdf":
file_path = os.path.join(pdf_dir, file.filename)
elif file.content_type and file.content_type.startswith("image/"):
file_path = os.path.join(image_dir, file.filename)
else:
return {"error": f"Unsupported file type: {file.filename} ({file.content_type})"}
with open(file_path, "wb") as f:
f.write(await file.read())
# Process the PDFs and embed them into FAISS
try:
embed_and_store(user_id=user_id)
return {"message": f"Documents uploaded and embedded successfully for user {user_id}"}
except Exception as e:
return JSONResponse(status_code=500, content={"error": str(e)})
# Chat endpoint
@app.post("/chat/")
async def chat(user_id: str = Form(...), query: str = Form(...)):
# Load the user's vectorstore and perform the query
try:
response = chat_with_user(user_id, query)
return {"response": response}
except Exception as e:
return JSONResponse(status_code=500, content={"error": str(e)})