Spaces:
Runtime error
Runtime error
Chintan Donda
commited on
Commit
•
d2ef46d
1
Parent(s):
35c01e8
Updating Mandi Price widget to auto-populate sub-dropdown lists based on the selection of the above dropdown
Browse files- app.py +152 -50
- src/constants.py +40 -65
- src/langchain_utils.py +23 -23
- src/mandi_price.py +83 -2
app.py
CHANGED
@@ -27,7 +27,8 @@ class DomState:
|
|
27 |
self.answer = ''
|
28 |
self.summary = ''
|
29 |
self.mandi_price = ''
|
30 |
-
|
|
|
31 |
self.mandi_to_date = datetime.datetime.now().strftime('%Y-%m-%d')
|
32 |
self.weather_info = ''
|
33 |
self.weather_forecast = ''
|
@@ -86,29 +87,6 @@ class DomState:
|
|
86 |
return self.answer
|
87 |
|
88 |
|
89 |
-
def click_handler_for_mandi_price(
|
90 |
-
self,
|
91 |
-
state_name,
|
92 |
-
apmc_name,
|
93 |
-
commodity_name,
|
94 |
-
from_date,
|
95 |
-
to_date
|
96 |
-
):
|
97 |
-
if state_name and apmc_name and commodity_name and from_date and to_date:
|
98 |
-
self.mandi_price = self.kkms_kssw_obj.mandi_utils_obj.get_mandi_price(state_name, apmc_name, commodity_name, from_date, to_date)
|
99 |
-
|
100 |
-
# NOTE: Below code is only to display Mandi Prices in Gradio front-end. It could be removed when Engineering team writes a wrapper on top of app.py.
|
101 |
-
self.mandi_price = sorted(self.mandi_price['data'], key=lambda x: x.get('created_at', ''), reverse=True)
|
102 |
-
mandi_price = ''
|
103 |
-
for ids in self.mandi_price:
|
104 |
-
mandi_price += f'='*100 + '\n'
|
105 |
-
for id, val in ids.items():
|
106 |
-
mandi_price += '%-30s: %s\n' % (id, val)
|
107 |
-
self.mandi_price = mandi_price
|
108 |
-
|
109 |
-
return self.mandi_price
|
110 |
-
|
111 |
-
|
112 |
def click_handler_for_get_weather(
|
113 |
self,
|
114 |
city
|
@@ -176,6 +154,62 @@ class DomState:
|
|
176 |
return self.kkms_kssw_obj.weather_utils_obj.get_weather_forecast(state, district)
|
177 |
|
178 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
179 |
def click_handler_for_feedback(
|
180 |
self,
|
181 |
question_category,
|
@@ -370,9 +404,11 @@ with gr.Blocks(title='KKMS-Smart-Search-Demo') as demo:
|
|
370 |
label="Select Question Category",
|
371 |
value=constants_utils.INDEX_CATEGORY[0]
|
372 |
)
|
|
|
373 |
question = gr.Textbox(label="Enter your question", placeholder='Type the question here')
|
374 |
# Get the Relevant paragraphs for the question asked
|
375 |
relevant_paragraphs = gr.Textbox(label="Relevant paragraphs are:", value=dom.relevant_paragraphs, interactive=False)
|
|
|
376 |
b_relevant_paragraphs = gr.Button("Get Relevant paragraphs").style(size='sm')
|
377 |
b_relevant_paragraphs.click(
|
378 |
fn=dom.click_handler_for_get_relevant_paragraphs,
|
@@ -384,6 +420,7 @@ with gr.Blocks(title='KKMS-Smart-Search-Demo') as demo:
|
|
384 |
with gr.Tab(label='Sources of relevant paragraphs'):
|
385 |
# Get the Sources of relevant paragraphs
|
386 |
sources_relevant_paragraphs = gr.Textbox(label="Sources of relevant paragraphs are:", interactive=False)
|
|
|
387 |
relevant_paragraphs.change(
|
388 |
dom.click_handler_for_relevant_paragraphs_source,
|
389 |
relevant_paragraphs,
|
@@ -394,6 +431,7 @@ with gr.Blocks(title='KKMS-Smart-Search-Demo') as demo:
|
|
394 |
with gr.Column(scale=1, min_width=600):
|
395 |
with gr.Tab(label='Answer'):
|
396 |
answer = gr.Textbox(label="Answer is:", value=dom.answer, interactive=False)
|
|
|
397 |
relevant_paragraphs.change(
|
398 |
dom.click_handler_for_get_answer,
|
399 |
[relevant_paragraphs, question],
|
@@ -409,14 +447,22 @@ with gr.Blocks(title='KKMS-Smart-Search-Demo') as demo:
|
|
409 |
label="Select language",
|
410 |
value=list(constants_utils.INDIC_LANGUAGE.keys())[0]
|
411 |
)
|
|
|
412 |
indic_lang_answer = gr.Textbox(label="Answer in the selected language is:", interactive=False)
|
|
|
|
|
413 |
answer.change(
|
414 |
-
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
|
|
|
|
|
|
|
|
|
|
|
420 |
|
421 |
with gr.Column(scale=1, min_width=600):
|
422 |
with gr.Tab(label='Feedback'):
|
@@ -425,12 +471,13 @@ with gr.Blocks(title='KKMS-Smart-Search-Demo') as demo:
|
|
425 |
[
|
426 |
"Correct",
|
427 |
"Incorrect",
|
428 |
-
"Partially Correct and contains irrelevant text",
|
429 |
"Correct but not complete",
|
|
|
430 |
],
|
431 |
label="Answer is",
|
432 |
value="Correct"
|
433 |
)
|
|
|
434 |
b_feedback = gr.Button("Submit Feedback").style(size='sm')
|
435 |
b_feedback.click(
|
436 |
fn=dom.click_handler_for_feedback,
|
@@ -444,38 +491,84 @@ with gr.Blocks(title='KKMS-Smart-Search-Demo') as demo:
|
|
444 |
with gr.Column(scale=1, min_width=600):
|
445 |
chatbot = gr.Chatbot()
|
446 |
msg = gr.Textbox()
|
447 |
-
|
448 |
-
|
449 |
-
|
450 |
-
|
451 |
-
|
452 |
-
|
453 |
-
|
|
|
|
|
|
|
454 |
|
455 |
|
456 |
#############################################################################
|
457 |
# Widget for Mandi Price
|
458 |
with gr.Row(visible=False) as rowMandiPrice:
|
459 |
with gr.Column(scale=1, min_width=600):
|
460 |
-
# Select State
|
461 |
state_name = gr.Dropdown(
|
462 |
-
constants_utils.
|
463 |
-
label="Select state",
|
464 |
-
value=constants_utils.
|
465 |
)
|
466 |
-
|
467 |
-
|
468 |
-
|
469 |
-
|
470 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
471 |
# From/To date in yyyy-mm-dd format
|
472 |
-
from_date = gr.Textbox(label="From date
|
473 |
-
to_date = gr.Textbox(label="To date
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
474 |
|
475 |
with gr.Column(scale=1, min_width=600):
|
476 |
mandi_price = gr.Textbox(label=f"Mandi Price is:", value=dom.mandi_price, interactive=False)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
477 |
b_summary = gr.Button("Get Mandi Price").style(size='sm')
|
478 |
-
b_summary.click(fn=dom.click_handler_for_mandi_price, inputs=[state_name, apmc_name,
|
479 |
|
480 |
|
481 |
#############################################################################
|
@@ -516,6 +609,7 @@ with gr.Blocks(title='KKMS-Smart-Search-Demo') as demo:
|
|
516 |
with gr.Tab(label='Weather Forecast Summary'):
|
517 |
# Get the summary of the weather forecast
|
518 |
weather_forecast_summary = gr.Textbox(label="Weather Forecast Summary is:", interactive=False)
|
|
|
519 |
district.change(
|
520 |
dom.click_handler_for_weather_forecast_summary,
|
521 |
district_weather,
|
@@ -531,6 +625,7 @@ with gr.Blocks(title='KKMS-Smart-Search-Demo') as demo:
|
|
531 |
label="Select language",
|
532 |
value=list(constants_utils.INDIC_LANGUAGE.keys())[0]
|
533 |
)
|
|
|
534 |
indic_weather_forecast_summary = gr.Textbox(label="Weather Forecast Summary in the selected language is:", interactive=False)
|
535 |
|
536 |
# By default display weather forecast summary in Hindi. User can change it later on.
|
@@ -574,12 +669,14 @@ with gr.Blocks(title='KKMS-Smart-Search-Demo') as demo:
|
|
574 |
with gr.Row(visible=True) as rowUploadPdf:
|
575 |
with gr.Column(scale=1, min_width=600):
|
576 |
file_output = gr.File()
|
|
|
577 |
upload_button = gr.UploadButton(
|
578 |
"Click to Upload PDF Files",
|
579 |
file_types=['.pdf'],
|
580 |
file_count="multiple"
|
581 |
)
|
582 |
upload_button.upload(dom._upload_file, upload_button, file_output)
|
|
|
583 |
b_files = gr.Button("Load PDF Files").style(size='sm')
|
584 |
b_files.click(
|
585 |
fn=dom.click_handler_for_load_files_urls,
|
@@ -589,6 +686,7 @@ with gr.Blocks(title='KKMS-Smart-Search-Demo') as demo:
|
|
589 |
with gr.Row(visible=False) as rowUploadOnlinePdf:
|
590 |
with gr.Column(scale=1, min_width=600):
|
591 |
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')
|
|
|
592 |
b_urls = gr.Button("Load Online PDFs").style(size='sm')
|
593 |
b_urls.click(
|
594 |
fn=dom.click_handler_for_load_files_urls,
|
@@ -598,12 +696,14 @@ with gr.Blocks(title='KKMS-Smart-Search-Demo') as demo:
|
|
598 |
with gr.Row(visible=False) as rowUploadTextFile:
|
599 |
with gr.Column(scale=1, min_width=600):
|
600 |
file_output = gr.File()
|
|
|
601 |
upload_button = gr.UploadButton(
|
602 |
"Click to Upload Text Files",
|
603 |
file_types=['.txt'],
|
604 |
file_count="multiple"
|
605 |
)
|
606 |
upload_button.upload(dom._upload_file, upload_button, file_output)
|
|
|
607 |
b_files = gr.Button("Load Text Files").style(size='sm')
|
608 |
b_files.click(
|
609 |
fn=dom.click_handler_for_load_files_urls,
|
@@ -613,6 +713,7 @@ with gr.Blocks(title='KKMS-Smart-Search-Demo') as demo:
|
|
613 |
with gr.Row(visible=False) as rowUploadUrls:
|
614 |
with gr.Column(scale=1, min_width=600):
|
615 |
urls = gr.Textbox(label="Enter URLs (Supports uploading from multiple URLs. Enter the URLs in comma (,) separated format.)", placeholder='Type the URLs here')
|
|
|
616 |
b_urls = gr.Button("Load URLs").style(size='sm')
|
617 |
b_urls.click(
|
618 |
fn=dom.click_handler_for_load_files_urls,
|
@@ -637,6 +738,7 @@ with gr.Blocks(title='KKMS-Smart-Search-Demo') as demo:
|
|
637 |
with gr.Column(scale=1, min_width=600):
|
638 |
with gr.Tab(label='Following PDFs, Text files, and URLs have been ingested and indexed in the Knowledge Base and are available for querying.'):
|
639 |
kb_sources = gr.Textbox(label=f"Data loaded from:", value=dom.kb_sources, interactive=False)
|
|
|
640 |
b_kb_sources = gr.Button("Display Data Sources").style(size='sm')
|
641 |
b_kb_sources.click(
|
642 |
fn=dom.click_handler_for_get_kb_sources,
|
|
|
27 |
self.answer = ''
|
28 |
self.summary = ''
|
29 |
self.mandi_price = ''
|
30 |
+
# At max past 7 days of data can be fetched for Mandi price
|
31 |
+
self.mandi_from_date = (datetime.datetime.now() - datetime.timedelta(days=7)).strftime('%Y-%m-%d')
|
32 |
self.mandi_to_date = datetime.datetime.now().strftime('%Y-%m-%d')
|
33 |
self.weather_info = ''
|
34 |
self.weather_forecast = ''
|
|
|
87 |
return self.answer
|
88 |
|
89 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
def click_handler_for_get_weather(
|
91 |
self,
|
92 |
city
|
|
|
154 |
return self.kkms_kssw_obj.weather_utils_obj.get_weather_forecast(state, district)
|
155 |
|
156 |
|
157 |
+
def click_handler_for_mandi_price(
|
158 |
+
self,
|
159 |
+
state_name,
|
160 |
+
apmc_name,
|
161 |
+
commodity,
|
162 |
+
from_date,
|
163 |
+
to_date
|
164 |
+
):
|
165 |
+
if state_name and apmc_name and commodity and from_date and to_date:
|
166 |
+
self.mandi_price = self.kkms_kssw_obj.mandi_utils_obj.get_mandi_price(state_name, apmc_name, commodity, from_date, to_date)
|
167 |
+
|
168 |
+
# NOTE: Below code is only to display Mandi Prices in Gradio front-end. It could be removed when Engineering team writes a wrapper on top of app.py.
|
169 |
+
if isinstance(self.mandi_price, dict) and 'data' in self.mandi_price:
|
170 |
+
self.mandi_price = sorted(self.mandi_price['data'], key=lambda x: x.get('created_at', ''), reverse=True)
|
171 |
+
mandi_price = ''
|
172 |
+
for ids in self.mandi_price:
|
173 |
+
mandi_price += f'='*100 + '\n'
|
174 |
+
for id, val in ids.items():
|
175 |
+
mandi_price += '%-30s: %s\n' % (id, val)
|
176 |
+
self.mandi_price = mandi_price
|
177 |
+
else:
|
178 |
+
self.mandi_price = f'Mandi Price for {state_name} - {apmc_name} - {commodity} - from {from_date} to {to_date} is not available. Please select the correct State name, APMC name, Commodity with different dates.'
|
179 |
+
else:
|
180 |
+
self.mandi_price = 'Please select all the fields State name, APMC name, Commodity and from-to dates.'
|
181 |
+
|
182 |
+
return self.mandi_price
|
183 |
+
|
184 |
+
|
185 |
+
def click_handler_for_mandi_price_apmc_name_dropdown_list_update(
|
186 |
+
self,
|
187 |
+
state_name,
|
188 |
+
apmc_name
|
189 |
+
):
|
190 |
+
return gr.update(
|
191 |
+
choices=self.kkms_kssw_obj.mandi_utils_obj.get_mandi_apmcs(state_name)
|
192 |
+
)
|
193 |
+
|
194 |
+
|
195 |
+
def click_handler_for_mandi_price_commodity_dropdown_list_update(
|
196 |
+
self,
|
197 |
+
state_name,
|
198 |
+
apmc_name,
|
199 |
+
from_date,
|
200 |
+
to_date,
|
201 |
+
commodity
|
202 |
+
):
|
203 |
+
return gr.update(
|
204 |
+
choices=self.kkms_kssw_obj.mandi_utils_obj.get_mandi_commodity(
|
205 |
+
state_name,
|
206 |
+
apmc_name,
|
207 |
+
from_date,
|
208 |
+
to_date
|
209 |
+
)
|
210 |
+
)
|
211 |
+
|
212 |
+
|
213 |
def click_handler_for_feedback(
|
214 |
self,
|
215 |
question_category,
|
|
|
404 |
label="Select Question Category",
|
405 |
value=constants_utils.INDEX_CATEGORY[0]
|
406 |
)
|
407 |
+
|
408 |
question = gr.Textbox(label="Enter your question", placeholder='Type the question here')
|
409 |
# Get the Relevant paragraphs for the question asked
|
410 |
relevant_paragraphs = gr.Textbox(label="Relevant paragraphs are:", value=dom.relevant_paragraphs, interactive=False)
|
411 |
+
|
412 |
b_relevant_paragraphs = gr.Button("Get Relevant paragraphs").style(size='sm')
|
413 |
b_relevant_paragraphs.click(
|
414 |
fn=dom.click_handler_for_get_relevant_paragraphs,
|
|
|
420 |
with gr.Tab(label='Sources of relevant paragraphs'):
|
421 |
# Get the Sources of relevant paragraphs
|
422 |
sources_relevant_paragraphs = gr.Textbox(label="Sources of relevant paragraphs are:", interactive=False)
|
423 |
+
|
424 |
relevant_paragraphs.change(
|
425 |
dom.click_handler_for_relevant_paragraphs_source,
|
426 |
relevant_paragraphs,
|
|
|
431 |
with gr.Column(scale=1, min_width=600):
|
432 |
with gr.Tab(label='Answer'):
|
433 |
answer = gr.Textbox(label="Answer is:", value=dom.answer, interactive=False)
|
434 |
+
|
435 |
relevant_paragraphs.change(
|
436 |
dom.click_handler_for_get_answer,
|
437 |
[relevant_paragraphs, question],
|
|
|
447 |
label="Select language",
|
448 |
value=list(constants_utils.INDIC_LANGUAGE.keys())[0]
|
449 |
)
|
450 |
+
|
451 |
indic_lang_answer = gr.Textbox(label="Answer in the selected language is:", interactive=False)
|
452 |
+
|
453 |
+
# Automatically translate answer in the selected language upon change in the answer
|
454 |
answer.change(
|
455 |
+
dom.click_handler_for_get_indic_translation,
|
456 |
+
answer,
|
457 |
+
indic_lang_answer
|
458 |
+
)
|
459 |
+
|
460 |
+
# Automatically translate answer in the selected language upon change in the language selection
|
461 |
+
language.change(
|
462 |
+
dom.click_handler_for_get_indic_translation,
|
463 |
+
[answer, language],
|
464 |
+
indic_lang_answer
|
465 |
+
)
|
466 |
|
467 |
with gr.Column(scale=1, min_width=600):
|
468 |
with gr.Tab(label='Feedback'):
|
|
|
471 |
[
|
472 |
"Correct",
|
473 |
"Incorrect",
|
|
|
474 |
"Correct but not complete",
|
475 |
+
"Partially Correct and also contains irrelevant text",
|
476 |
],
|
477 |
label="Answer is",
|
478 |
value="Correct"
|
479 |
)
|
480 |
+
|
481 |
b_feedback = gr.Button("Submit Feedback").style(size='sm')
|
482 |
b_feedback.click(
|
483 |
fn=dom.click_handler_for_feedback,
|
|
|
491 |
with gr.Column(scale=1, min_width=600):
|
492 |
chatbot = gr.Chatbot()
|
493 |
msg = gr.Textbox()
|
494 |
+
|
495 |
+
with gr.Row():
|
496 |
+
submit = gr.Button("Submit")
|
497 |
+
submit.click(
|
498 |
+
dom.kkms_kssw_obj.langchain_utils_obj.user, [msg, chatbot], [msg, chatbot]
|
499 |
+
).then(dom.kkms_kssw_obj.langchain_utils_obj.bot, chatbot, chatbot)
|
500 |
+
|
501 |
+
clear = gr.Button("Clear")
|
502 |
+
clear.click(
|
503 |
+
dom.kkms_kssw_obj.langchain_utils_obj.clear_history, None, chatbot, queue=False)
|
504 |
|
505 |
|
506 |
#############################################################################
|
507 |
# Widget for Mandi Price
|
508 |
with gr.Row(visible=False) as rowMandiPrice:
|
509 |
with gr.Column(scale=1, min_width=600):
|
510 |
+
# Select State name
|
511 |
state_name = gr.Dropdown(
|
512 |
+
list(constants_utils.MANDI_PRICE_STATES_IDS.keys()),
|
513 |
+
label="Select state name",
|
514 |
+
value=list(constants_utils.MANDI_PRICE_STATES_IDS.keys())[0]
|
515 |
)
|
516 |
+
|
517 |
+
# Select APMC Name
|
518 |
+
apmc_name = gr.Dropdown(
|
519 |
+
choices=[],
|
520 |
+
label="Select APMC Name"
|
521 |
+
)
|
522 |
+
|
523 |
+
# Select Commodity
|
524 |
+
commodity = gr.Dropdown(
|
525 |
+
choices=[],
|
526 |
+
label="Select Commodity"
|
527 |
+
)
|
528 |
+
|
529 |
+
# Get APMC of the selected state name
|
530 |
+
state_name.change(
|
531 |
+
dom.click_handler_for_mandi_price_apmc_name_dropdown_list_update,
|
532 |
+
state_name,
|
533 |
+
apmc_name
|
534 |
+
)
|
535 |
+
|
536 |
# From/To date in yyyy-mm-dd format
|
537 |
+
from_date = gr.Textbox(label="From date", value=dom.mandi_from_date, placeholder='Please enter the From date here in yyyy-mm-dd format')
|
538 |
+
to_date = gr.Textbox(label="To date", value=dom.mandi_to_date, placeholder='Please enter the To date here in yyyy-mm-dd format')
|
539 |
+
|
540 |
+
# Get Commodity of the selected State name - APMC name - From/To Date
|
541 |
+
apmc_name.change(
|
542 |
+
dom.click_handler_for_mandi_price_commodity_dropdown_list_update,
|
543 |
+
[state_name, apmc_name, from_date, to_date],
|
544 |
+
commodity
|
545 |
+
)
|
546 |
+
|
547 |
+
# NOTE: Commodity changes whenever there is a change in From/To date selection
|
548 |
+
from_date.change(
|
549 |
+
dom.click_handler_for_mandi_price_commodity_dropdown_list_update,
|
550 |
+
[state_name, apmc_name, from_date, to_date],
|
551 |
+
commodity
|
552 |
+
)
|
553 |
+
|
554 |
+
# NOTE: Commodity changes whenever there is a change in From/To date selection
|
555 |
+
to_date.change(
|
556 |
+
dom.click_handler_for_mandi_price_commodity_dropdown_list_update,
|
557 |
+
[state_name, apmc_name, from_date, to_date],
|
558 |
+
commodity
|
559 |
+
)
|
560 |
|
561 |
with gr.Column(scale=1, min_width=600):
|
562 |
mandi_price = gr.Textbox(label=f"Mandi Price is:", value=dom.mandi_price, interactive=False)
|
563 |
+
|
564 |
+
commodity.change(
|
565 |
+
dom.click_handler_for_mandi_price,
|
566 |
+
[state_name, apmc_name, commodity, from_date, to_date],
|
567 |
+
mandi_price
|
568 |
+
)
|
569 |
+
|
570 |
b_summary = gr.Button("Get Mandi Price").style(size='sm')
|
571 |
+
b_summary.click(fn=dom.click_handler_for_mandi_price, inputs=[state_name, apmc_name, commodity, from_date, to_date], outputs=[mandi_price])
|
572 |
|
573 |
|
574 |
#############################################################################
|
|
|
609 |
with gr.Tab(label='Weather Forecast Summary'):
|
610 |
# Get the summary of the weather forecast
|
611 |
weather_forecast_summary = gr.Textbox(label="Weather Forecast Summary is:", interactive=False)
|
612 |
+
|
613 |
district.change(
|
614 |
dom.click_handler_for_weather_forecast_summary,
|
615 |
district_weather,
|
|
|
625 |
label="Select language",
|
626 |
value=list(constants_utils.INDIC_LANGUAGE.keys())[0]
|
627 |
)
|
628 |
+
|
629 |
indic_weather_forecast_summary = gr.Textbox(label="Weather Forecast Summary in the selected language is:", interactive=False)
|
630 |
|
631 |
# By default display weather forecast summary in Hindi. User can change it later on.
|
|
|
669 |
with gr.Row(visible=True) as rowUploadPdf:
|
670 |
with gr.Column(scale=1, min_width=600):
|
671 |
file_output = gr.File()
|
672 |
+
|
673 |
upload_button = gr.UploadButton(
|
674 |
"Click to Upload PDF Files",
|
675 |
file_types=['.pdf'],
|
676 |
file_count="multiple"
|
677 |
)
|
678 |
upload_button.upload(dom._upload_file, upload_button, file_output)
|
679 |
+
|
680 |
b_files = gr.Button("Load PDF Files").style(size='sm')
|
681 |
b_files.click(
|
682 |
fn=dom.click_handler_for_load_files_urls,
|
|
|
686 |
with gr.Row(visible=False) as rowUploadOnlinePdf:
|
687 |
with gr.Column(scale=1, min_width=600):
|
688 |
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')
|
689 |
+
|
690 |
b_urls = gr.Button("Load Online PDFs").style(size='sm')
|
691 |
b_urls.click(
|
692 |
fn=dom.click_handler_for_load_files_urls,
|
|
|
696 |
with gr.Row(visible=False) as rowUploadTextFile:
|
697 |
with gr.Column(scale=1, min_width=600):
|
698 |
file_output = gr.File()
|
699 |
+
|
700 |
upload_button = gr.UploadButton(
|
701 |
"Click to Upload Text Files",
|
702 |
file_types=['.txt'],
|
703 |
file_count="multiple"
|
704 |
)
|
705 |
upload_button.upload(dom._upload_file, upload_button, file_output)
|
706 |
+
|
707 |
b_files = gr.Button("Load Text Files").style(size='sm')
|
708 |
b_files.click(
|
709 |
fn=dom.click_handler_for_load_files_urls,
|
|
|
713 |
with gr.Row(visible=False) as rowUploadUrls:
|
714 |
with gr.Column(scale=1, min_width=600):
|
715 |
urls = gr.Textbox(label="Enter URLs (Supports uploading from multiple URLs. Enter the URLs in comma (,) separated format.)", placeholder='Type the URLs here')
|
716 |
+
|
717 |
b_urls = gr.Button("Load URLs").style(size='sm')
|
718 |
b_urls.click(
|
719 |
fn=dom.click_handler_for_load_files_urls,
|
|
|
738 |
with gr.Column(scale=1, min_width=600):
|
739 |
with gr.Tab(label='Following PDFs, Text files, and URLs have been ingested and indexed in the Knowledge Base and are available for querying.'):
|
740 |
kb_sources = gr.Textbox(label=f"Data loaded from:", value=dom.kb_sources, interactive=False)
|
741 |
+
|
742 |
b_kb_sources = gr.Button("Display Data Sources").style(size='sm')
|
743 |
b_kb_sources.click(
|
744 |
fn=dom.click_handler_for_get_kb_sources,
|
src/constants.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1 |
import os
|
2 |
import src.web_crawler as web_crawler_utils
|
3 |
import src.weather as weather_utils
|
|
|
4 |
|
5 |
# Wheater to load the existing index store or create from scratch?
|
6 |
LOAD_FROM_EXISTING_INDEX_STORE = True
|
@@ -51,45 +52,23 @@ DATA_SOURCES = {
|
|
51 |
|
52 |
# LangChain related constants
|
53 |
SIMILARITY_TOP_K = 1
|
|
|
54 |
MODE = 'embedding'
|
55 |
RESPONSE_MODE = 'default'
|
56 |
TEXT_SPLITTER_CHUNK_SIZE = 1000
|
57 |
TEXT_SPLITTER_CHUNK_OVERLAP = 0
|
58 |
TEXT_SPLITTER_SEPARATOR = '\n\n'
|
59 |
|
|
|
|
|
|
|
60 |
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
'https://agricoop.nic.in/#gsc.tab=0',
|
65 |
-
|
66 |
-
'https://dmi.gov.in/Documents/GrantCAGrapes.pdf',
|
67 |
-
'https://dmi.gov.in/Documents/organicfaq.pdf',
|
68 |
-
'https://dmi.gov.in/Documents/CAGMOrganic-III.pdf',
|
69 |
-
'https://dmi.gov.in/GradesStandard.aspx',
|
70 |
-
'https://www.india.gov.in/topics/agriculture',
|
71 |
-
'https://www.india.gov.in/farmers-portal',
|
72 |
-
|
73 |
-
# Pest Management related
|
74 |
-
'https://niphm.gov.in/IPMPackages/Maize.pdf',
|
75 |
-
|
76 |
-
# Banned Pesticides
|
77 |
-
'https://ppqs.gov.in/divisions/cib-rc/registered-products', # Online PDF links on the page
|
78 |
-
|
79 |
-
# Mandi Price related
|
80 |
-
'https://agmarknet.gov.in/',
|
81 |
-
|
82 |
-
# General information related: Information of interests are present on the 2nd level url
|
83 |
-
'https://www.manage.gov.in/nf/nf.asp',
|
84 |
-
|
85 |
-
# Weather forecast related
|
86 |
-
'https://nwp.imd.gov.in/blf/blf_temp/', # need to select state -> district (on the new page) -> displays detailed table -> can get info at the block level as well from the same page on selection
|
87 |
-
'https://nwp.imd.gov.in/blf/blf_temp/dis.php?value=12gujarat', # to get weather forecast for the given state
|
88 |
-
'https://nwp.imd.gov.in/blf/blf_temp/block.php?dis=12BHAVNAGAR', # to get the weather forecast for the given district
|
89 |
-
]
|
90 |
-
|
91 |
|
92 |
# Supported Indian laguages for translating the English text to Indian language
|
|
|
93 |
INDIC_LANGUAGE = {
|
94 |
'Hindi': 'hi',
|
95 |
'Gujarati': 'gu',
|
@@ -102,41 +81,6 @@ INDIC_LANGUAGE = {
|
|
102 |
'Malayalam': 'ml',
|
103 |
}
|
104 |
|
105 |
-
# State list used in the Mandi Price widget dropdown list
|
106 |
-
MANDI_PRICE_STATES = [
|
107 |
-
'ANDAMAN AND NICOBAR ISLANDS',
|
108 |
-
'ANDHRA PRADESH',
|
109 |
-
'ASSAM',
|
110 |
-
'BIHAR',
|
111 |
-
'CHANDIGARH',
|
112 |
-
'CHHATTISGARH',
|
113 |
-
'GOA',
|
114 |
-
'GUJARAT',
|
115 |
-
'HARYANA',
|
116 |
-
'HIMACHAL PRADESH',
|
117 |
-
'JAMMU AND KASHMIR',
|
118 |
-
'JHARKHAND',
|
119 |
-
'KARNATAKA',
|
120 |
-
'KERALA',
|
121 |
-
'MADHYA PRADESH',
|
122 |
-
'MAHARASHTRA',
|
123 |
-
'NAGALAND',
|
124 |
-
'ODISHA',
|
125 |
-
'PUDUCHERRY',
|
126 |
-
'PUNJAB',
|
127 |
-
'RAJASTHAN',
|
128 |
-
'TAMIL NADU',
|
129 |
-
'TELANGANA',
|
130 |
-
'TRIPURA',
|
131 |
-
'UTTAR PRADESH',
|
132 |
-
'UTTARAKHAND',
|
133 |
-
'WEST BENGAL'
|
134 |
-
]
|
135 |
-
|
136 |
-
# State list used in the Weather forecast widget dropdown list
|
137 |
-
weather_utils_obj = weather_utils.WEATHER()
|
138 |
-
WEATHER_FORECAST_STATE_CODES = weather_utils_obj.get_state_names_codes()
|
139 |
-
|
140 |
# LIST OF PESTICIDES WHICH ARE BANNED AND RESTRICTED USE (List created from: https://pib.gov.in/PressReleaseIframePage.aspx?PRID=1896140)
|
141 |
BANNED_PESTICIDES_FORMULATIONS = [
|
142 |
'Alachlor',
|
@@ -152,3 +96,34 @@ BANNED_PESTICIDES_FORMULATIONS = [
|
|
152 |
'Copper Acetoarsenite',
|
153 |
]
|
154 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import os
|
2 |
import src.web_crawler as web_crawler_utils
|
3 |
import src.weather as weather_utils
|
4 |
+
import src.mandi_price as mandi_utils
|
5 |
|
6 |
# Wheater to load the existing index store or create from scratch?
|
7 |
LOAD_FROM_EXISTING_INDEX_STORE = True
|
|
|
52 |
|
53 |
# LangChain related constants
|
54 |
SIMILARITY_TOP_K = 1
|
55 |
+
ANSWER_SIMILARITY_TOP_K = 3
|
56 |
MODE = 'embedding'
|
57 |
RESPONSE_MODE = 'default'
|
58 |
TEXT_SPLITTER_CHUNK_SIZE = 1000
|
59 |
TEXT_SPLITTER_CHUNK_OVERLAP = 0
|
60 |
TEXT_SPLITTER_SEPARATOR = '\n\n'
|
61 |
|
62 |
+
# State list used in the Mandi Price widget dropdown list
|
63 |
+
mandi_utils_obj = mandi_utils.MANDI_PRICE()
|
64 |
+
MANDI_PRICE_STATES_IDS = mandi_utils_obj.get_mandi_states()
|
65 |
|
66 |
+
# State list used in the Weather forecast widget dropdown list
|
67 |
+
weather_utils_obj = weather_utils.WEATHER()
|
68 |
+
WEATHER_FORECAST_STATE_CODES = weather_utils_obj.get_state_names_codes()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
69 |
|
70 |
# Supported Indian laguages for translating the English text to Indian language
|
71 |
+
# NOTE: Add mappings here to add the support for any other Indic language
|
72 |
INDIC_LANGUAGE = {
|
73 |
'Hindi': 'hi',
|
74 |
'Gujarati': 'gu',
|
|
|
81 |
'Malayalam': 'ml',
|
82 |
}
|
83 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
84 |
# LIST OF PESTICIDES WHICH ARE BANNED AND RESTRICTED USE (List created from: https://pib.gov.in/PressReleaseIframePage.aspx?PRID=1896140)
|
85 |
BANNED_PESTICIDES_FORMULATIONS = [
|
86 |
'Alachlor',
|
|
|
96 |
'Copper Acetoarsenite',
|
97 |
]
|
98 |
|
99 |
+
# URLs used by FTAs at different KCCs
|
100 |
+
URLS = [
|
101 |
+
# Govt. Schemes
|
102 |
+
'https://agricoop.nic.in/en/Major#gsc.tab=0'
|
103 |
+
'https://agricoop.nic.in/#gsc.tab=0',
|
104 |
+
|
105 |
+
'https://dmi.gov.in/Documents/GrantCAGrapes.pdf',
|
106 |
+
'https://dmi.gov.in/Documents/organicfaq.pdf',
|
107 |
+
'https://dmi.gov.in/Documents/CAGMOrganic-III.pdf',
|
108 |
+
'https://dmi.gov.in/GradesStandard.aspx',
|
109 |
+
'https://www.india.gov.in/topics/agriculture',
|
110 |
+
'https://www.india.gov.in/farmers-portal',
|
111 |
+
|
112 |
+
# Pest Management related
|
113 |
+
'https://niphm.gov.in/IPMPackages/Maize.pdf',
|
114 |
+
|
115 |
+
# Banned Pesticides
|
116 |
+
'https://ppqs.gov.in/divisions/cib-rc/registered-products', # Online PDF links on the page
|
117 |
+
|
118 |
+
# Mandi Price related
|
119 |
+
'https://enam.gov.in/web/dashboard/trade-data', # Currently Mandi Price widget fetches data from this url
|
120 |
+
'https://agmarknet.gov.in/',
|
121 |
+
|
122 |
+
# General information related: Information of interests are present on the 2nd level url
|
123 |
+
'https://www.manage.gov.in/nf/nf.asp',
|
124 |
+
|
125 |
+
# Weather forecast related
|
126 |
+
'https://nwp.imd.gov.in/blf/blf_temp/', # need to select state -> district (on the new page) -> displays detailed table -> can get info at the block level as well from the same page on selection
|
127 |
+
'https://nwp.imd.gov.in/blf/blf_temp/dis.php?value=12gujarat', # to get weather forecast for the given state
|
128 |
+
'https://nwp.imd.gov.in/blf/blf_temp/block.php?dis=12BHAVNAGAR', # to get the weather forecast for the given district
|
129 |
+
]
|
src/langchain_utils.py
CHANGED
@@ -82,28 +82,6 @@ class LANGCHAIN_UTILS:
|
|
82 |
self.index_category_doc_type_wise_data_sources = {}
|
83 |
|
84 |
|
85 |
-
def generate_prompt_template(
|
86 |
-
self,
|
87 |
-
prompt_type='general'
|
88 |
-
):
|
89 |
-
prompt_template = ''
|
90 |
-
|
91 |
-
if prompt_type == 'general':
|
92 |
-
prompt_template = """Write a concise summary of the following:
|
93 |
-
|
94 |
-
{text}
|
95 |
-
|
96 |
-
SUMMARIZE IN ENGLISH:"""
|
97 |
-
|
98 |
-
elif prompt_type == 'weather':
|
99 |
-
prompt_template = """
|
100 |
-
What would be the weather based on the below data:
|
101 |
-
{text}
|
102 |
-
"""
|
103 |
-
|
104 |
-
return prompt_template
|
105 |
-
|
106 |
-
|
107 |
def user(
|
108 |
self,
|
109 |
user_message,
|
@@ -140,6 +118,28 @@ class LANGCHAIN_UTILS:
|
|
140 |
return None
|
141 |
|
142 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
143 |
def get_textual_summary(
|
144 |
self,
|
145 |
text,
|
@@ -213,7 +213,7 @@ class LANGCHAIN_UTILS:
|
|
213 |
)
|
214 |
|
215 |
# Search for the similar docs
|
216 |
-
docs = docsearch.similarity_search(question, k=
|
217 |
|
218 |
llm = OpenAI(temperature=0)
|
219 |
# Create a Chain for question answering
|
|
|
82 |
self.index_category_doc_type_wise_data_sources = {}
|
83 |
|
84 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
def user(
|
86 |
self,
|
87 |
user_message,
|
|
|
118 |
return None
|
119 |
|
120 |
|
121 |
+
def generate_prompt_template(
|
122 |
+
self,
|
123 |
+
prompt_type='general'
|
124 |
+
):
|
125 |
+
prompt_template = ''
|
126 |
+
|
127 |
+
if prompt_type == 'general':
|
128 |
+
prompt_template = """Write a concise summary of the following:
|
129 |
+
|
130 |
+
{text}
|
131 |
+
|
132 |
+
SUMMARIZE IN ENGLISH:"""
|
133 |
+
|
134 |
+
elif prompt_type == 'weather':
|
135 |
+
prompt_template = """
|
136 |
+
What would be the weather based on the below data:
|
137 |
+
{text}
|
138 |
+
"""
|
139 |
+
|
140 |
+
return prompt_template
|
141 |
+
|
142 |
+
|
143 |
def get_textual_summary(
|
144 |
self,
|
145 |
text,
|
|
|
213 |
)
|
214 |
|
215 |
# Search for the similar docs
|
216 |
+
docs = docsearch.similarity_search(question, k=constants_utils.ANSWER_SIMILARITY_TOP_K)
|
217 |
|
218 |
llm = OpenAI(temperature=0)
|
219 |
# Create a Chain for question answering
|
src/mandi_price.py
CHANGED
@@ -3,9 +3,9 @@ import requests
|
|
3 |
|
4 |
class MANDI_PRICE:
|
5 |
def __init__(self):
|
|
|
6 |
self.base_url = "https://enam.gov.in/web/Ajax_ctrl/trade_data_list"
|
7 |
-
# "https://enam.gov.in/web/dashboard/trade-data"
|
8 |
-
# "https://enam.gov.in/web/dashboard/trade_data_list",
|
9 |
|
10 |
|
11 |
def get_mandi_price(self,
|
@@ -31,3 +31,84 @@ class MANDI_PRICE:
|
|
31 |
)
|
32 |
|
33 |
return response.json()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
4 |
class MANDI_PRICE:
|
5 |
def __init__(self):
|
6 |
+
# Base URL to get the Mandi Price details
|
7 |
self.base_url = "https://enam.gov.in/web/Ajax_ctrl/trade_data_list"
|
8 |
+
# self.base_url = "https://enam.gov.in/web/dashboard/trade-data"
|
|
|
9 |
|
10 |
|
11 |
def get_mandi_price(self,
|
|
|
31 |
)
|
32 |
|
33 |
return response.json()
|
34 |
+
|
35 |
+
|
36 |
+
def get_mandi_states(
|
37 |
+
self
|
38 |
+
):
|
39 |
+
base_url = 'https://enam.gov.in/web/ajax_ctrl/states_name'
|
40 |
+
headers = {
|
41 |
+
'Accept': 'application/json, text/javascript, */*; q=0.01',
|
42 |
+
}
|
43 |
+
|
44 |
+
response = requests.get(
|
45 |
+
base_url,
|
46 |
+
headers=headers,
|
47 |
+
)
|
48 |
+
|
49 |
+
response = response.json()
|
50 |
+
response = response.get('data', [])
|
51 |
+
# state_names = [i for i in map(lambda x: x.get('state_name', ''), response)]
|
52 |
+
state_names_ids = {}
|
53 |
+
for state in response:
|
54 |
+
if state.get('state_name', ''):
|
55 |
+
state_names_ids[state.get('state_name')] = state.get('state_id', '')
|
56 |
+
|
57 |
+
return state_names_ids
|
58 |
+
|
59 |
+
|
60 |
+
def get_mandi_apmcs(
|
61 |
+
self,
|
62 |
+
state_name
|
63 |
+
):
|
64 |
+
base_url = 'https://enam.gov.in/web/Ajax_ctrl/apmc_list'
|
65 |
+
headers = {
|
66 |
+
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8",
|
67 |
+
"Referer": "https://enam.gov.in/web/dashboard/trade-data",
|
68 |
+
"Accept": "application/json, text/javascript, */*; q=0.01",
|
69 |
+
}
|
70 |
+
payload = f'state_id={self.get_mandi_states().get(state_name)}'
|
71 |
+
|
72 |
+
response = requests.post(
|
73 |
+
base_url,
|
74 |
+
data=payload,
|
75 |
+
headers=headers
|
76 |
+
)
|
77 |
+
|
78 |
+
response = response.json()
|
79 |
+
response = response.get('data', [])
|
80 |
+
# apmc_names = [i for i in map(lambda x: x.get('apmc_name', ''), response)]
|
81 |
+
apmc_names_ids = {}
|
82 |
+
for apmc in response:
|
83 |
+
if apmc.get('apmc_name', ''):
|
84 |
+
apmc_names_ids[apmc.get('apmc_name')] = apmc.get('apmc_id', '')
|
85 |
+
|
86 |
+
return list(apmc_names_ids.keys())
|
87 |
+
|
88 |
+
|
89 |
+
def get_mandi_commodity(
|
90 |
+
self,
|
91 |
+
state_name,
|
92 |
+
apmc_name,
|
93 |
+
from_date,
|
94 |
+
to_date
|
95 |
+
):
|
96 |
+
base_url = 'https://enam.gov.in/web/Ajax_ctrl/commodity_list'
|
97 |
+
headers = {
|
98 |
+
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8",
|
99 |
+
"Accept": "application/json, text/javascript, */*; q=0.01",
|
100 |
+
"Referer": "https://enam.gov.in/web/dashboard/trade-data"
|
101 |
+
}
|
102 |
+
payload = f'language=en&stateName={state_name}&apmcName={apmc_name}&fromDate={from_date}&toDate={to_date}'
|
103 |
+
|
104 |
+
response = requests.post(
|
105 |
+
base_url,
|
106 |
+
data=payload,
|
107 |
+
headers=headers
|
108 |
+
)
|
109 |
+
|
110 |
+
response = response.json()
|
111 |
+
commodity_names_ids = response.get('data', [])
|
112 |
+
commodity_list = [i for i in map(lambda x: x.get('commodity', ''), commodity_names_ids)]
|
113 |
+
return commodity_list
|
114 |
+
|