Chintan Donda
Update the App name
a01a527
raw
history blame
21 kB
import gradio as gr
import os
import datetime
import src.constants as constants_utils
import src.kkms_kssw as kkms_kssw
import src.weather as weather_utils
os.environ["CURL_CA_BUNDLE"] = ""
import warnings
warnings.filterwarnings('ignore')
class DomState:
def __init__(
self,
index_type,
load_from_existing_index_file
):
self.index_type = index_type
self.load_from_existing_index_file = load_from_existing_index_file
self.relevant_paragraphs = ''
self.sources_relevant_paragraphs = ''
self.answer = ''
self.summary = ''
self.mandi_price = ''
self.mandi_from_date = (datetime.datetime.now() - datetime.timedelta(days=5)).strftime('%Y-%m-%d')
self.mandi_to_date = datetime.datetime.now().strftime('%Y-%m-%d')
self.weather_info = ''
self.weather_forecast = ''
self.weather_forecast_summary = ''
self.indic_translation = ''
# Initialize index (vector store) - This will create a new index from scratch if load_from_existing_index_file == False
self.kkms_kssw_obj = kkms_kssw.KKMS_KSSW()
self.kkms_kssw_obj.load_create_index()
def click_handler_for_get_relevant_paragraphs(
self,
question_category,
question
):
self.relevant_paragraphs = self.kkms_kssw_obj.query(
question=question,
question_category=question_category
)
if self.index_type in ['FAISS', 'Chroma']:
self.sources_relevant_paragraphs = [doc.metadata for doc in self.relevant_paragraphs]
self.relevant_paragraphs = [doc.page_content.replace('\n', '').replace('\t', ' ') for doc in self.relevant_paragraphs]
return self.relevant_paragraphs
def click_handler_for_relevant_paragraphs_source(
self,
relevant_paragraphs
):
return self.sources_relevant_paragraphs
def click_handler_for_summary(
self,
answer
):
self.sumamry = self.kkms_kssw_obj.langchain_utils_obj.get_textual_summary(answer)
return self.sumamry
def click_handler_for_get_answer(
self,
relevant_paragraphs,
question
):
self.answer = self.kkms_kssw_obj.langchain_utils_obj.get_answer_from_para(
relevant_paragraphs,
question
)
return self.answer
def click_handler_for_mandi_price(
self,
state_name,
apmc_name,
commodity_name,
from_date,
to_date
):
if state_name and apmc_name and commodity_name and from_date and to_date:
self.mandi_price = self.kkms_kssw_obj.mandi_utils_obj.get_mandi_price(state_name, apmc_name, commodity_name, from_date, to_date)
return self.mandi_price
def click_handler_for_get_weather(
self,
city
):
time, info, temperature = self.kkms_kssw_obj.weather_utils_obj.get_weather(city)
self.weather_info = f'Weather in {city.capitalize()} on {time} is {temperature} with {info}.'
return self.weather_info
def click_handler_for_get_weather_forecast(
self,
state,
district
):
self.weather_forecast = self.kkms_kssw_obj.weather_utils_obj.get_weather_forecast(state, district)
return self.weather_forecast
def click_handler_for_weather_forecast_summary(
self,
weather_forecast
):
self.weather_forecast_summary = self.kkms_kssw_obj.langchain_utils_obj.get_weather_forecast_summary(weather_forecast)
return self.weather_forecast_summary
def click_handler_for_load_files_urls(
self,
doc_type,
files_or_urls,
question_category
):
self.kkms_kssw_obj.upload_data(
doc_type=constants_utils.DATA_SOURCES[doc_type],
files_or_urls=files_or_urls,
index_category=question_category
)
def click_handler_for_get_indic_translation(
self,
eng_ans,
language='Hindi'
):
self.indic_translation = self.kkms_kssw_obj.translator_utils_obj.get_indic_google_translate(eng_ans, language)
return self.indic_translation
def click_handler_for_weather_forecast_districts_dropdown_list_update(
self,
state,
district
):
return gr.update(
choices=self.kkms_kssw_obj.weather_utils_obj.get_district_names(state)
)
def click_handler_for_weather_forecast_district(
self,
state,
district,
weather
):
return self.kkms_kssw_obj.weather_utils_obj.get_weather_forecast(state, district)
def _upload_file(self, files):
file_paths = [file.name for file in files]
return file_paths
def select_widget(
self,
choice
):
if choice == "Custom Query":
return [
gr.update(visible=True),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
]
elif choice == "General (AgGPT)":
return [
gr.update(visible=False),
gr.update(visible=True),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
]
elif choice == "Mandi Price":
return [
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=True),
gr.update(visible=False),
gr.update(visible=False),
]
elif choice == "Weather":
return [
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=True),
gr.update(visible=False),
]
elif choice == "Load Custom Data":
return [
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=True)
]
else:
return gr.update(visible=False)
def select_files_urls(
self,
choice
):
if choice == "PDF":
return [
gr.update(visible=True),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
]
elif choice == "Online PDF":
return [
gr.update(visible=False),
gr.update(visible=True),
gr.update(visible=False),
gr.update(visible=False),
]
elif choice == "Text File":
return [
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=True),
gr.update(visible=False),
]
elif choice == "URLs":
return [
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=True),
]
else:
return [
gr.update(visible=True),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
]
with gr.Blocks(title='KKMS-Smart-Search-Demo') as demo:
dom = DomState(
index_type=constants_utils.INDEX_TYPE,
load_from_existing_index_file=constants_utils.LOAD_FROM_EXISTING_INDEX_STORE
)
widgets = gr.Radio(
[
"Custom Query",
"General (AgGPT)",
"Mandi Price",
"Weather",
"Load Custom Data"
],
label="Query related to",
value="Custom Query"
)
#############################################################################
# Widget for Custom Queries
with gr.Row(visible=True) as rowCustomQuery:
with gr.Column(scale=1, min_width=600):
with gr.Tab(label='Relevant paragraphs'):
question_category = gr.Dropdown(
constants_utils.INDEX_CATEGORY,
label="Select Question Category")
question = gr.Textbox(label="Enter your question", placeholder='Type the question here')
# Get the Relevant paragraphs for the question asked
relevant_paragraphs = gr.Textbox(label="Relevant paragraphs are:", value=dom.relevant_paragraphs, interactive=False)
b_relevant_paragraphs = gr.Button("Get Relevant paragraphs").style(size='sm')
b_relevant_paragraphs.click(
fn=dom.click_handler_for_get_relevant_paragraphs,
inputs=[question_category, question],
outputs=[relevant_paragraphs]
)
with gr.Column(scale=1):
with gr.Tab(label='Sources of relevant paragraphs'):
# Get the Sources of relevant paragraphs
sources_relevant_paragraphs = gr.Textbox(label="Sources of relevant paragraphs are:", interactive=False)
relevant_paragraphs.change(
dom.click_handler_for_relevant_paragraphs_source,
relevant_paragraphs,
sources_relevant_paragraphs
)
# Get the exact answer for the question asked from the retrieved Relevant paragraphs
with gr.Column(scale=1, min_width=600):
with gr.Tab(label='Answer'):
answer = gr.Textbox(label="Answer is:", value=dom.answer, interactive=False)
relevant_paragraphs.change(
dom.click_handler_for_get_answer,
[relevant_paragraphs, question],
answer
)
# Covert the answer to Indian language
with gr.Column(scale=1, min_width=600):
with gr.Tab(label='Answer in selected language'):
# Select the language
language = gr.Dropdown(
list(constants_utils.INDIC_LANGUAGE.keys()),
label="Select language")
indic_lang_answer = gr.Textbox(label="Answer in the selected language is:", interactive=False)
answer.change(
dom.click_handler_for_get_indic_translation,
answer,
indic_lang_answer
)
b_indic_lang_answer = gr.Button("Get answer in selected language").style(size='sm')
b_indic_lang_answer.click(fn=dom.click_handler_for_get_indic_translation, inputs=[answer, language], outputs=[indic_lang_answer])
#############################################################################
# Widget for General Query using AgGPT
with gr.Row(visible=False) as rowGeneral:
with gr.Column(scale=1, min_width=600):
chatbot = gr.Chatbot()
msg = gr.Textbox()
submit = gr.Button("Submit")
clear = gr.Button("Clear")
submit.click(
dom.kkms_kssw_obj.langchain_utils_obj.user, [msg, chatbot], [msg, chatbot]
).then(dom.kkms_kssw_obj.langchain_utils_obj.bot, chatbot, chatbot)
clear.click(
dom.kkms_kssw_obj.langchain_utils_obj.clear_history, None, chatbot, queue=False)
#############################################################################
# Widget for Mandi Price
with gr.Row(visible=False) as rowMandiPrice:
with gr.Column(scale=1, min_width=600):
# Select State
state_name = gr.Dropdown(constants_utils.MANDI_PRICE_STATES, label="Select state")
# APMC name
apmc_name = gr.Textbox(label="Enter APMC name", placeholder='Type the APMC name here')
# APMC name
commodity_name = gr.Textbox(label="Enter Commodity name", placeholder='Type the Commodity name here')
# From/To date in yyyy-mm-dd format
from_date = gr.Textbox(label="From date?", value=dom.mandi_from_date, placeholder='Please enter the From date here in yyyy-mm-dd format')
to_date = gr.Textbox(label="To date?", value=dom.mandi_to_date, placeholder='Please enter the To date here in yyyy-mm-dd format')
with gr.Column(scale=1, min_width=600):
mandi_price = gr.Textbox(label=f"Mandi Price is:", value=dom.mandi_price, interactive=False)
b_summary = gr.Button("Get Mandi Price").style(size='sm')
b_summary.click(fn=dom.click_handler_for_mandi_price, inputs=[state_name, apmc_name, commodity_name, from_date, to_date], outputs=[mandi_price])
#############################################################################
# Widget for Weather Info
with gr.Row(visible=False) as rowWeather:
########### Weather Forecast ###########
with gr.Column(scale=1, min_width=600):
with gr.Tab(label='Weather Forecast for next 5 days'):
# Select the State
state = gr.Dropdown(
list(constants_utils.WEATHER_FORECAST_STATE_CODES.keys()),
label="Select state"
)
# Select District
district = gr.Dropdown(
choices=[],
label="Select District"
)
# Get districts of the selected state
state.change(
dom.click_handler_for_weather_forecast_districts_dropdown_list_update,
state,
district
)
# Get weather forecast on district selection event
district_weather = gr.Textbox(label=f"Weather forecast is:", interactive=False)
district.change(
dom.click_handler_for_weather_forecast_district,
[state, district],
district_weather
)
with gr.Column(scale=1, min_width=600):
with gr.Tab(label='Weather Forecast Summary'):
# Get the summary of the weather forecast
weather_forecast_summary = gr.Textbox(label="Weather Forecast Summary is:", interactive=False)
district.change(
dom.click_handler_for_weather_forecast_summary,
district_weather,
weather_forecast_summary
)
# Covert the weather forcast summary in Indian language
with gr.Column(scale=1, min_width=600):
with gr.Tab(label='Weather Forecast Summary in selected language'):
# Select the language
language = gr.Dropdown(
list(constants_utils.INDIC_LANGUAGE.keys()),
label="Select language")
indic_weather_forecast_summary = gr.Textbox(label="Weather Forecast Summary in the selected language is:", interactive=False)
# By default display weather forecast summary in Hindi. User can change it later on.
weather_forecast_summary.change(
dom.click_handler_for_get_indic_translation,
weather_forecast_summary,
indic_weather_forecast_summary
)
# User can get the weather forecast summary in their preferred language as well
b_indic_weather_forecast_summary = gr.Button("Get answer in selected language").style(size='sm')
b_indic_weather_forecast_summary.click(fn=dom.click_handler_for_get_indic_translation, inputs=[weather_forecast_summary, language], outputs=[indic_weather_forecast_summary])
with gr.Column(scale=1, min_width=600):
with gr.Tab(label='Weather Info'):
weather = gr.Textbox(label=f"Current weather is:", interactive=False)
district.change(
dom.click_handler_for_get_weather,
district,
weather
)
#############################################################################
# Widget to load and process from the custom data source
with gr.Row(visible=False) as rowLoadCustomData:
with gr.Column(scale=1, min_width=600):
with gr.Tab(label='Load Custom Data (Do not upload data from the same file/url again. Once it is uploaded, it gets stored forever.)'):
question_category = gr.Dropdown(
constants_utils.INDEX_CATEGORY,
label="Select Query Type")
doc_type = gr.Radio(
list(constants_utils.DATA_SOURCES.keys()),
label="Select data source (Supports uploading multiple Files/URLs)",
value="PDF"
)
with gr.Row(visible=True) as rowUploadPdf:
with gr.Column(scale=1, min_width=600):
file_output = gr.File()
upload_button = gr.UploadButton(
"Click to Upload PDF Files",
file_types=['.pdf'],
file_count="multiple"
)
upload_button.upload(dom._upload_file, upload_button, file_output)
b_files = gr.Button("Load PDF Files").style(size='sm')
b_files.click(
fn=dom.click_handler_for_load_files_urls,
inputs=[doc_type, upload_button, question_category]
)
with gr.Row(visible=False) as rowUploadOnlinePdf:
with gr.Column(scale=1, min_width=600):
urls = gr.Textbox(label="Enter URLs for Online PDF (Supports uploading from multiple URLs. Enter the URLs in comma (,) separated format.)", placeholder='Type the URLs here')
b_urls = gr.Button("Load Online PDFs").style(size='sm')
b_urls.click(
fn=dom.click_handler_for_load_files_urls,
inputs=[doc_type, urls, question_category]
)
with gr.Row(visible=False) as rowUploadTextFile:
with gr.Column(scale=1, min_width=600):
file_output = gr.File()
upload_button = gr.UploadButton(
"Click to Upload Text Files",
file_types=['.txt'],
file_count="multiple"
)
upload_button.upload(dom._upload_file, upload_button, file_output)
b_files = gr.Button("Load Text Files").style(size='sm')
b_files.click(
fn=dom.click_handler_for_load_files_urls,
inputs=[doc_type, file_output, question_category]
)
with gr.Row(visible=False) as rowUploadUrls:
with gr.Column(scale=1, min_width=600):
urls = gr.Textbox(label="Enter URLs (Supports uploading from multiple URLs. Enter the URLs in comma (,) separated format.)", placeholder='Type the URLs here')
b_urls = gr.Button("Load URLs").style(size='sm')
b_urls.click(
fn=dom.click_handler_for_load_files_urls,
inputs=[doc_type, urls, question_category]
)
doc_type.change(
fn=dom.select_files_urls,
inputs=doc_type,
outputs=[
rowUploadPdf,
rowUploadOnlinePdf,
rowUploadTextFile,
rowUploadUrls,
],
)
widgets.change(
fn=dom.select_widget,
inputs=widgets,
outputs=[
rowCustomQuery,
rowGeneral,
rowMandiPrice,
rowWeather,
rowLoadCustomData,
],
)
demo.launch(share=False)