Spaces:
Build error
Build error
import os | |
import shutil | |
from fastapi import FastAPI, UploadFile, File, HTTPException, Form | |
from fastapi.middleware.cors import CORSMiddleware | |
from pydantic import BaseModel | |
import requests | |
from langchain.text_splitter import RecursiveCharacterTextSplitter | |
from langchain_community.vectorstores.faiss import FAISS | |
from langchain.chains.question_answering import load_qa_chain | |
from langchain.prompts import PromptTemplate | |
from langchain_google_genai import GoogleGenerativeAIEmbeddings, ChatGoogleGenerativeAI | |
import google.generativeai as genai | |
from dotenv import load_dotenv | |
app = FastAPI() | |
# Configure CORS | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=["*"], | |
allow_credentials=True, | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
# Load environment variables | |
load_dotenv() | |
# Configure Google API | |
genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) | |
class QuestionInput(BaseModel): | |
question: str | |
class UploadInput(BaseModel): | |
url: str = Form(None) | |
def scrape_data(url): | |
return "scraped data" | |
def split_text_into_chunks(text): | |
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) | |
text_chunks = splitter.split_text(text) | |
return text_chunks | |
def create_vector_store(chunks): | |
embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001") | |
vector_store = FAISS.from_texts(chunks, embedding=embeddings) | |
vector_store.save_local("faiss_index") | |
def setup_conversation_chain(template): | |
model = ChatGoogleGenerativeAI(model="gemini-pro", temperature=0.3) | |
prompt = PromptTemplate(template=template, input_variables=["context", "question"]) | |
chain = load_qa_chain(model, chain_type="stuff", prompt=prompt) | |
return chain | |
async def upload_files(url: str = Form(None)): | |
try: | |
# print(url) | |
# all_text = "" | |
# # Process URL | |
# if url: | |
# # check if url is valid (request doesnt give error) | |
# if # doesnt give error | |
# all_text = scrape_data(url) | |
# else: | |
# raise HTTPException(status_code=400, detail="Invalid URL") | |
# if not all_text: | |
# raise HTTPException(status_code=400, detail="No content to process") | |
# chunks = split_text_into_chunks(all_text) | |
# create_vector_store(chunks) | |
return {"message": "Content uploaded and processed successfully"} | |
except HTTPException as http_exc: | |
print(f"HTTP Exception: {http_exc.detail}") | |
raise http_exc | |
except Exception as e: | |
print(f"Unhandled Exception: {e}") | |
raise HTTPException(status_code=500, detail=str(e)) | |
async def ask_question(question_input: QuestionInput): | |
try: | |
embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001") | |
indexed_data = FAISS.load_local("reviews_index", embeddings, allow_dangerous_deserialization=True) | |
docs = indexed_data.similarity_search(question_input.question) | |
prompt_template = """ | |
Your alias is AI Rate Professor. Your task is to provide a thorough response based on the given context, ensuring all relevant details are included. | |
If the requested information isn't available, simply state, "answer not available in context," then answer based on your understanding, connecting with the context. | |
Don't provide incorrect information.\n\n | |
Context: \n {context}?\n | |
Question: \n {question}\n | |
Answer: | |
""" | |
chain = setup_conversation_chain(prompt_template) | |
response = chain({"input_documents": docs, "question": question_input.question}, return_only_outputs=True) | |
print(response["output_text"]) | |
return {"answer": response["output_text"]} | |
except Exception as e: | |
raise HTTPException(status_code=500, detail=str(e)) | |
# prompt_template = """ | |
# Your alias is AI Rate Professor. Your task is to provide a thorough response based on the given context, ensuring all relevant details are included. | |
# If the requested information isn't available, simply state, "answer not available in context," then answer based on your understanding, connecting with the context. | |
# Don't provide incorrect information.\n\n | |
# Context: \n {context}?\n | |
# Question: \n {question}\n | |
# Answer: | |
# """ |