Spaces:
Running
Running
import os | |
import logging | |
import shutil | |
import time | |
import re | |
from typing import List | |
from fastapi import FastAPI, UploadFile | |
from fastapi.middleware import Middleware | |
from fastapi.middleware.cors import CORSMiddleware | |
from fastapi.responses import StreamingResponse | |
from .rag import ChatPDF | |
middleware = [ | |
Middleware( | |
CORSMiddleware, | |
allow_origins=["*"], | |
allow_methods=['*'], | |
allow_headers=['*'] | |
) | |
] | |
app = FastAPI(middleware=middleware) | |
files_dir = os.path.expanduser("~/wtp_be_files/") | |
session_assistant = ChatPDF() | |
logging.basicConfig(level=logging.INFO) | |
logger = logging.getLogger(__name__) | |
def astreamer(generator): | |
t0 = time.time() | |
for i in generator: | |
logger.info(f"Chunk being yielded (time {int((time.time()-t0)*1000)}ms)") | |
yield i | |
logger.info(f"Over (time {int((time.time()-t0)*1000)}ms)") | |
async def process_input(text: str): | |
generator = None | |
if text and len(text.strip()) > 0: | |
if session_assistant.pdf_count > 0: | |
text = text.strip() | |
streaming_response = session_assistant.ask(text) | |
generator = streaming_response.response_gen | |
else: | |
message = "Please add a PDF document first." | |
generator = re.split(r'(\s)', message) | |
else: | |
message = "The provided query is empty." | |
generator = re.split(r'(\s)', message) | |
return StreamingResponse(astreamer(generator), media_type='text/event-stream') | |
def upload(files: list[UploadFile]): | |
try: | |
os.makedirs(files_dir) | |
for file in files: | |
try: | |
path = f"{files_dir}/{file.filename}" | |
file.file.seek(0) | |
with open(path, 'wb') as destination: | |
shutil.copyfileobj(file.file, destination) | |
finally: | |
file.file.close() | |
finally: | |
session_assistant.ingest(files_dir) | |
shutil.rmtree(files_dir) | |
message = "Files inserted successfully." | |
generator = re.split(r'(\s)', message) | |
return StreamingResponse(astreamer(generator), media_type='text/event-stream') | |
def ping(): | |
session_assistant.clear() | |
message = "All files have been cleared." | |
generator = re.split(r'(\s)', message) | |
return StreamingResponse(astreamer(generator), media_type='text/event-stream') | |
def ping(): | |
return "Pong!" | |