Spaces:
Sleeping
Sleeping
from fastapi import FastAPI | |
from pydantic import BaseModel | |
import faq as faq | |
import util as util | |
import uvicorn | |
import gradio as gr | |
from typing import List, Optional | |
from fastapi.responses import JSONResponse | |
app = FastAPI() | |
class Request(BaseModel): | |
question: Optional[str] = "?" | |
sheet_url: str | |
page_content_column: str | |
k: Optional[int] = 20 | |
reload_collection: Optional[bool] = False | |
id_column: Optional[str] = None | |
synonyms: Optional[List[List[str]]] = None | |
async def post_api(request: Request) -> JSONResponse: | |
if request.id_column is not None: | |
util.SPLIT_PAGE_BREAKS = True | |
if request.synonyms is not None: | |
util.SYNONYMS = request.synonyms | |
vectordb = faq.load_vectordb(request.sheet_url, request.page_content_column) | |
if request.reload_collection: | |
faq.delete_vectordb_current_collection(vectordb) | |
vectordb = faq.load_vectordb(request.sheet_url, request.page_content_column) | |
documents = faq.similarity_search(vectordb, request.question, k=request.k) | |
df_doc = util.transform_documents_to_dataframe(documents) | |
if request.id_column is not None: | |
df_doc = util.remove_duplicates_by_column(df_doc, request.id_column) | |
return JSONResponse(util.dataframe_to_dict(df_doc)) | |
async def put_api(request: Request) -> bool: | |
success = False | |
if request.id_column is not None: | |
util.SPLIT_PAGE_BREAKS = True | |
if request.synonyms is not None: | |
util.SYNONYMS = request.synonyms | |
vectordb = faq.load_vectordb(request.sheet_url, request.page_content_column) | |
if request.reload_collection: | |
faq.delete_vectordb_current_collection(vectordb) | |
vectordb = faq.load_vectordb(request.sheet_url, request.page_content_column) | |
success = True | |
return success | |
async def delete_vectordb_api() -> None: | |
faq.delete_vectordb() | |
def ask(sheet_url: str, page_content_column: str, k: int, reload_collection: bool, question: str): | |
util.SPLIT_PAGE_BREAKS = False | |
vectordb = faq.load_vectordb(sheet_url, page_content_column) | |
if reload_collection: | |
faq.delete_vectordb_current_collection(vectordb) | |
vectordb = faq.load_vectordb(sheet_url, page_content_column) | |
documents = faq.similarity_search(vectordb, question, k=k) | |
df_doc = util.transform_documents_to_dataframe(documents) | |
return util.dataframe_to_dict(df_doc), gr.Checkbox.update(False) | |
with gr.Blocks() as block: | |
sheet_url = gr.Textbox(label="Google Sheet URL") | |
page_content_column = gr.Textbox(label="Question Column") | |
k = gr.Slider(1, 30, step=1, label="K") | |
reload_collection = gr.Checkbox(label="Reload Collection?") | |
question = gr.Textbox(label="Question") | |
ask_button = gr.Button("Ask") | |
answer_output = gr.JSON(label="Answer") | |
ask_button.click( | |
ask, | |
inputs=[sheet_url, page_content_column, k, reload_collection, question], | |
outputs=[answer_output, reload_collection] | |
) | |
app = gr.mount_gradio_app(app, block, path="/") | |
if __name__ == "__main__": | |
uvicorn.run(app, host="0.0.0.0", port=7860) | |