-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapi.py
More file actions
97 lines (76 loc) · 3.16 KB
/
api.py
File metadata and controls
97 lines (76 loc) · 3.16 KB
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import FileResponse, JSONResponse
from pydantic import BaseModel
from typing import List
import os
from main import extract_pdf_elements, categorize_elements, generate_text_summaries, generate_img_summaries, create_multi_vector_retriever, multi_modal_rag_chain
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from fastapi.staticfiles import StaticFiles
import logging
from fastapi.middleware.cors import CORSMiddleware
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
app = FastAPI()
# CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Mount the static directory
app.mount("/static", StaticFiles(directory="static"), name="static")
# Add this new route to serve the index.html
@app.get("/")
async def read_index():
return FileResponse('static/index.html')
# Serve static files
@app.get("/{filename}")
async def serve_static(filename: str):
file_path = os.path.join("static", filename)
if os.path.exists(file_path):
return FileResponse(file_path)
return {"error": "File not found"}
class Query(BaseModel):
question: str
@app.post("/upload_pdf/")
async def upload_pdf(file: UploadFile = File(...)):
if not file.filename.endswith('.pdf'):
raise HTTPException(status_code=400, detail="Only PDF files are allowed")
# Save the uploaded file
file_path = f"uploads/{file.filename}"
os.makedirs("uploads", exist_ok=True)
with open(file_path, "wb") as buffer:
buffer.write(await file.read())
# Process the PDF
raw_pdf_elements = extract_pdf_elements("uploads/", file.filename)
texts, tables = categorize_elements(raw_pdf_elements)
text_summaries, table_summaries = generate_text_summaries(texts, tables, summarize_texts=True)
img_base64_list, image_summaries = generate_img_summaries("uploads/")
# Create vectorstore and retriever
vectorstore = Chroma(collection_name="mm_rag_api", embedding_function=OpenAIEmbeddings())
retriever = create_multi_vector_retriever(
vectorstore, text_summaries, texts, table_summaries, tables, image_summaries, img_base64_list
)
# Create RAG chain
global chain_multimodal_rag
chain_multimodal_rag = multi_modal_rag_chain(retriever)
try:
contents = await file.read()
# Here you would typically save the file or process it
# For this example, we'll just return a success message
return {"filename": file.filename, "message": "File uploaded successfully"}
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
return {"message": "PDF processed successfully"}
@app.post("/query/")
async def query(query: Query):
if not chain_multimodal_rag:
raise HTTPException(status_code=400, detail="Please upload a PDF first")
response = chain_multimodal_rag.invoke(query.question)
return {"response": response}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=8000)