Spaces:
Sleeping
Sleeping
| import json | |
| import chardet | |
| import pandas as pd | |
| import streamlit as st | |
| import pymysql | |
| import ast | |
| import re | |
| from utils import word_sentence_similarity, get_list_meaning_word, iast_process | |
| from llama_index.core.tools.tool_spec.base import BaseToolSpec | |
| from database import execute_query, get_details_mantra_json | |
| import pandas as pd | |
| import json | |
| import ast | |
| import logging | |
| # Constants | |
| SCRIPTURE_DESCRIPTIONS_CSV_PATH = "Data/scripture_descriptions.csv" | |
| VEDAMANTRA_CSV_PATH = "Data/veda_content_modified_v5.csv" | |
| PADA_CSV_PATH = "Data/term_data_processed_v2.csv" | |
| class ScriptureDescriptionToolSpec(BaseToolSpec): | |
| ''' | |
| Purpose: Obtains the description or summary about vedas, mandalas, kandas, shuktas, archakah, adhyaya, and other scriptural elements. | |
| Returns: A dictionary containing the description or basic information about the specified scriptural element. | |
| Structure of the levels in each Vedas: | |
| RigVeda->Mandala->Shukta | |
| ShuklaYajurVeda->Adhyaya | |
| SamaVeda->Archika->Shukta | |
| Atharvaveda->Kandah->Shukta | |
| Sample query: | |
| 1. Describe the first kandah, second shukta from Atharvaveda? | |
| scripture_name: Atharvaveda, level_0: 1, level_1:2 | |
| 2. Summarize ShuklaYajurVeda? | |
| 3. What is the difference between ShuklaYajurVeda and KrishnaYajurVeda? | |
| ''' | |
| spec_functions = ["get_description"] | |
| def __init__(self): | |
| super().__init__() | |
| with open(SCRIPTURE_DESCRIPTIONS_CSV_PATH, 'rb') as f: | |
| result = chardet.detect(f.read()) | |
| encoding = result['encoding'] | |
| self.df = pd.read_csv(SCRIPTURE_DESCRIPTIONS_CSV_PATH, encoding=encoding) | |
| def _query_description(self, conditions): | |
| try: | |
| result = self.df[conditions] | |
| if not result.empty: | |
| return result.iloc[0].to_dict() | |
| else: | |
| raise IndexError("Scripture description not found.") | |
| except IndexError as e: | |
| raise ValueError(f"Failed to get scripture description: {e}") | |
| def get_description(self, scripture_name: str, level_1: int=None, level_2: int=None, level_3: int=None): | |
| try: | |
| conditions = (self.df['scripture_name'].str.lower() == scripture_name.lower()) | |
| if level_3 is not None: | |
| conditions &= (self.df['level_1'] == str(level_1)) & (self.df['level_2'] == str(level_2)) & (self.df['level_3'] == str(level_3)) | |
| elif level_2 is not None: | |
| conditions &= (self.df['level_1'] == str(level_1)) & (self.df['level_2'] == str(level_2)) | |
| elif level_1 is not None: | |
| conditions &= (self.df['level_1'] == str(level_1)) | |
| return self._query_description(conditions) | |
| except ValueError as e: | |
| return {"error": str(e)} | |
| class MantraToolSpec(BaseToolSpec): | |
| ''' | |
| Use the function `get_vedamantra_details` to retrieve detailed information about Vedic mantras, including vedamantra, padapatha, devata, chandah, | |
| and rishi, from all Vedas (RigVeda, AtharvaVeda, SamaVeda, KrishnaYajurVeda, and ShuklaYajurVeda). | |
| Use the function `get_vedamantra_summary` to access the information such as anvaya of the mantra, mantraVishaya of the mantra, | |
| adhibautic (or adhyatmic or adhidyvic) meaning (or bhavarth) of the mantra, purpose of the mantra, usage of the mantra, and tippani of the mantra. | |
| Sample Questions: | |
| 1. Obtain the vedamantra of the mantra whose id is 1.1.1.1? | |
| 2. Retrieve the devata of the vedamantra from Rigveda, first mandala, first shukta, and first mantra. | |
| 3. Provide the meaning of the vedamantra from Rigveda, first mandala, first shukta, and first mantra written by Tulsi Ram. | |
| 4. Explain the adhibautic meaning of the first mantra from RigVeda, first mandala, and first shukta. | |
| 5. Identify the mantraVishaya of the vedamantra from RigVeda, first mandala, first shukta, and first mantra. | |
| 6. What is the adibhautic meaning of the mantra 1.1.1.9? | |
| 7. What is the adhyatmic meaning of the mantra 1.1.1.7? | |
| 8. What is the adhidyic meaning of the 6th mantra from RigVeda, first mandala, and first shukta? | |
| ''' | |
| spec_functions = ["get_vedamantra_details", "get_vedamantra_summary"] | |
| def __init__(self): | |
| super().__init__() | |
| self.df_vedamantra = pd.read_csv(VEDAMANTRA_CSV_PATH, encoding='utf-8') | |
| def _get_mantra_details_by_scripture(self, scripture_name=None, KandahNumber=None,MandalaNumber=None, ArchikahNumber=None, | |
| ShuktaNumber=None, PrapatakNumber=None, MantraNumber=None, | |
| AnuvakNumber=None, AdhyayaNumber=None): | |
| try: | |
| condition = True | |
| if scripture_name: | |
| condition = (self.df_vedamantra['scripture_name'].str.lower() == scripture_name.lower()) | |
| if KandahNumber: | |
| condition &= (self.df_vedamantra['KandahNumber'] == KandahNumber) | |
| if MandalaNumber: | |
| condition &= (self.df_vedamantra['MandalaNumber'] == MandalaNumber) | |
| if ArchikahNumber: | |
| condition &= (self.df_vedamantra['ArchikahNumber'] == ArchikahNumber) | |
| if ShuktaNumber: | |
| condition &= (self.df_vedamantra['ShuktaNumber'] == ShuktaNumber) | |
| if PrapatakNumber: | |
| condition &= (self.df_vedamantra['PrapatakNumber'] == PrapatakNumber) | |
| if MantraNumber: | |
| condition &= (self.df_vedamantra['MantraNumber'] == MantraNumber) | |
| if AnuvakNumber: | |
| condition &= (self.df_vedamantra['AnuvakNumber'] == AnuvakNumber) | |
| if AdhyayaNumber: | |
| condition &= (self.df_vedamantra['AdhyayaNumber'] == AdhyayaNumber) | |
| filtered_df = self.df_vedamantra[condition] | |
| if not filtered_df.empty: | |
| return filtered_df | |
| else: | |
| return None | |
| except Exception as e: | |
| logging.error(f"Error in _get_pada_details_by_scripture: {e}") | |
| def get_vedamantra_details(self, mantraid=None, scripture_name=None, KandahNumber=None,MandalaNumber=None, ArchikahNumber=None, | |
| ShuktaNumber=None, PrapatakNumber=None, MantraNumber=None, | |
| AnuvakNumber=None, AdhyayaNumber=None): | |
| try: | |
| if mantraid: | |
| MantraID = mantraid | |
| else: | |
| filter_df = self._get_mantra_details_by_scripture(scripture_name=scripture_name, KandahNumber=KandahNumber,MandalaNumber=MandalaNumber, ArchikahNumber=ArchikahNumber, | |
| ShuktaNumber=ShuktaNumber, PrapatakNumber=PrapatakNumber, MantraNumber=MantraNumber, | |
| AnuvakNumber=AnuvakNumber, AdhyayaNumber=AdhyayaNumber) | |
| if filter_df is not None: | |
| MantraID = filter_df.iloc[0]['mantra_number'] | |
| query = f"SELECT mantra_json FROM veda_content WHERE mantra_number = '{MantraID}'" | |
| details = get_details_mantra_json(query) | |
| mantra_details = details['mantraHeader']['language'][1] | |
| return mantra_details | |
| except Exception as e: | |
| return json.dumps({"error": str(e)}) | |
| def get_vedamantra_summary(self, mantraid=None, scripture_name=None, KandahNumber=None,MandalaNumber=None, ArchikahNumber=None, | |
| ShuktaNumber=None, PrapatakNumber=None, MantraNumber=None, | |
| AnuvakNumber=None, AdhyayaNumber=None): | |
| ''' | |
| Sample Query: | |
| 1. Obtain the anvaya of the mantra whose id (mantraid) is 1.1.1.1? | |
| 2. Retrieve tha adibhautic meaning of the mantra from RigVeda, first mandala, first shukta, and first mantra. | |
| 3. Provide the adhyatmic meaning of the mantra 1.1.1.9? | |
| 4. What is the tippani of the mantra 1.1.1.7? | |
| 5. What is the adhyatmic meaning of the mantra 1.1.1.7? | |
| 6. What is the mantravishaya of the 6th mantra from RigVeda, first mandala, and first shukta? | |
| ''' | |
| try: | |
| if mantraid: | |
| MantraID = mantraid | |
| else: | |
| filtered_df = self._get_mantra_details_by_scripture(scripture_name=scripture_name, KandahNumber=KandahNumber,MandalaNumber=MandalaNumber, ArchikahNumber=ArchikahNumber, | |
| ShuktaNumber=ShuktaNumber, PrapatakNumber=PrapatakNumber, MantraNumber=MantraNumber, | |
| AnuvakNumber=AnuvakNumber, AdhyayaNumber=AdhyayaNumber) | |
| if filtered_df is not None: | |
| MantraID = filtered_df.iloc[0]['mantra_number'] | |
| query = f"SELECT mantra_json FROM veda_content WHERE mantra_number = '{MantraID}'" | |
| json_dict = get_details_mantra_json(query) | |
| mantra_summary = json_dict['mantraSummary']['language'] | |
| summary_dict = {"Roman-IAST summary of vedamantra": json_dict['mantraSummary']['language'][1]} | |
| for item in mantra_summary: | |
| if item['languageName'] == 'English': | |
| mahatma = item['mahatma']['mahatmaName'] | |
| summary_dict[f"English summary of vedamantra by {mahatma}"] = item | |
| return summary_dict | |
| except Exception as e: | |
| return {"error": str(e)} | |
| class PadaToolSpec(BaseToolSpec): | |
| ''' | |
| Purpose: To obtains a complete or meaningful meaning of a word or pada based on context information. | |
| 1. The function 'get_meaning_pada' used to get all the possible meanings of the pada based on the given information. | |
| 2. The function 'get_adibauatic_adidaivic_adhyatmic_meaning_of_pada' used to get the adibhautic, adidaivic and sdyatmic meaning | |
| of a word based on the information about the mantra (or vedamantra). | |
| Use the context to generate a meaningful meaning of the pada in the vedamantra. | |
| Sample query: | |
| 1. What is the meaning of the word apratidhṛṣṭa-śavasam? | |
| 2. What is the adibauatic meaning of the word agnim in the context of the vedamantra from Rigveda, first mandala, first shukta, and first mantra? | |
| 3. Whats the adidaivic meaning of the word apratidhṛṣṭa-śavasam in the mantra 1.1.1.1? | |
| 4. What is the adhyatmic meaning of the word apratidhṛṣṭa-śavasam in the context of the vedamantra from Rigveda, first mandala, first shukta, and first mantra? | |
| ''' | |
| spec_functions = ["get_pada_meaning","get_adibauatic_adidaivic_adhyatmic_meaning_of_pada"] | |
| def __init__(self): | |
| super().__init__() | |
| self.df_terms = pd.read_csv(PADA_CSV_PATH, dtype={'AnuvakNumber': 'Int64', 'PrapatakNumber': 'Int64', 'KandahNumber': 'Int64', 'ShuktaNumber': 'Int64', 'ArchikahNumber': 'Int64', 'AdhyayaNumber': 'Int64', 'MandalaNumber': 'Int64', 'ParyayaNumber': 'Int64'}, encoding='utf-8') | |
| self.df_vedic_content = pd.read_csv(VEDAMANTRA_CSV_PATH,encoding = 'utf-8') | |
| def _get_pada_details_by_scripture(self, pada, scripture_name=None, KandahNumber=None,MandalaNumber=None, ArchikahNumber=None, | |
| ShuktaNumber=None, PrapatakNumber=None, MantraNumber=None,AnuvakNumber=None, AdhyayaNumber=None): | |
| try: | |
| #pada = iast_process(pada) | |
| condition = (self.df_terms['Pada'] == pada) | |
| if scripture_name: | |
| condition &= (self.df_terms['scripture_name'].str.lower() == scripture_name.lower()) | |
| if KandahNumber: | |
| condition &= (self.df_terms['KandahNumber'] == KandahNumber) | |
| if MandalaNumber: | |
| condition &= (self.df_terms['MandalaNumber'] == MandalaNumber) | |
| if ArchikahNumber: | |
| condition &= (self.df_terms['ArchikahNumber'] == ArchikahNumber) | |
| if ShuktaNumber: | |
| condition &= (self.df_terms['ShuktaNumber'] == ShuktaNumber) | |
| if PrapatakNumber: | |
| condition &= (self.df_terms['PrapatakNumber'] == PrapatakNumber) | |
| if MantraNumber: | |
| condition &= (self.df_terms['MantraNumber'] == MantraNumber) | |
| if AnuvakNumber: | |
| condition &= (self.df_terms['AnuvakNumber'] == AnuvakNumber) | |
| if AdhyayaNumber: | |
| condition &= (self.df_terms['AdhyayaNumber'] == AdhyayaNumber) | |
| filtered_df = self.df_terms[condition] | |
| if not filtered_df.empty: | |
| return filtered_df | |
| else: | |
| return None | |
| except KeyError as ke: | |
| logging.error(f"KeyError in _get_pada_details_by_scripture: {ke}") | |
| except Exception as e: | |
| logging.error(f"Error in _get_pada_details_by_scripture: {e}") | |
| return None | |
| def _get_vedamantra_meaning(self, mantraID, MahatmaName=None): | |
| try: | |
| query = f"SELECT mantra_json FROM veda_content WHERE mantra_number = '{mantraID}'" | |
| jsonDict = get_details_mantra_json(query) | |
| mantraSummary = jsonDict['mantraSummary']['language'] | |
| if MahatmaName is not None: | |
| filtered_summary = [data_dict for data_dict in mantraSummary if data_dict.get('mahatma', {}).get('mahatmaName') == MahatmaName] | |
| if filtered_summary: | |
| mantraSummary = filtered_summary | |
| best_meaning = None | |
| best_count = 0 | |
| for data_dict in mantraSummary: | |
| if data_dict.get('languageName') == "English": | |
| meanings = data_dict['mahatma']['bhavartha'] | |
| count = sum(bool(meanings.get(cat, None)) for cat in ['adibhautic', 'adidaivic', 'adhyatmic']) | |
| if count >= best_count: | |
| best_meaning = {cat: meanings.get(cat, None) for cat in ['adibhautic', 'adidaivic', 'adhyatmic']} | |
| best_count = count | |
| return best_meaning if best_meaning else json.dumps({"error": "Required meaning associated with vedamantra is not available."}) | |
| except Exception as e: | |
| logging.error(f"Error in _get_vedamantra_meaning: {e}") | |
| return json.dumps({"error": f"An error occurred: {e}"}) | |
| def _get_pada_morphology(self, term_details, meanings): | |
| try: | |
| morphology_list = ast.literal_eval(term_details['Morphology']) | |
| term_morph_list = [] | |
| for morphs in morphology_list: | |
| term_info = {} | |
| for field in ['stem', 'root']: | |
| morph_word = morphs.get(field) | |
| if morph_word: | |
| meaning = word_sentence_similarity(meanings, morph_word) | |
| term_info[f'{field}_word'] = morph_word | |
| term_info[f'{field}_meaning'] = meaning[0][0] if meaning else None | |
| term_info[f'{field}_score'] = meaning[0][1] if meaning else None | |
| term_info['grammar'] = morphs['grammar'] | |
| term_morph_list.append(term_info) | |
| return term_morph_list | |
| except Exception as e: | |
| logging.error(f"Error in _get_pada_morphology: {e}") | |
| return [] | |
| def get_pada_meaning(self, pada): | |
| #pada=iast_process(pada) | |
| try: | |
| pada_details = self.df_terms[self.df_terms['Pada'] == pada] | |
| meanings_list = [] | |
| for morphs in ast.literal_eval(pada_details['Morphology'].values[0]): | |
| for field in ['stem', 'root']: | |
| word = morphs.get(field) | |
| if word: | |
| meanings_list.append(get_list_meaning_word(word)) | |
| return meanings_list | |
| except Exception as e: | |
| logging.error(f"Error in get_pada_meaning: {e}") | |
| return json.dumps({"error": f"Required meaning associated with pada is not available. {e}"}) | |
| def get_adibauatic_adidaivic_adhyatmic_meaning_of_pada(self, pada, mantraid=None, scripture_name=None, | |
| KandahNumber=None,MandalaNumber=None, ArchikahNumber=None, | |
| ShuktaNumber=None, PrapatakNumber=None, MantraNumber=None, | |
| AnuvakNumber=None, AdhyayaNumber=None,MahatmaName=None): | |
| ''' | |
| Sample query: | |
| 1. What is the meaning of pada 'agnim' from RigVeda, first mandala, first shukta and first mantra? | |
| 2. What is the adhyatmic meaning of the pada agnim in the context of the mantra whose id is '1.1.1.1?' | |
| ''' | |
| try: | |
| #pada = iast_process(pada) | |
| if mantraid: | |
| details = self.df_terms[(self.df_terms['mantra_id'] == mantraid) & (self.df_terms['Pada'] == pada)] | |
| else: | |
| details = self._get_pada_details_by_scripture(pada, scripture_name=scripture_name, KandahNumber=KandahNumber,MandalaNumber=MandalaNumber, ArchikahNumber=ArchikahNumber, | |
| ShuktaNumber=ShuktaNumber, PrapatakNumber=PrapatakNumber, MantraNumber=MantraNumber, | |
| AnuvakNumber=AnuvakNumber, AdhyayaNumber=AdhyayaNumber) | |
| if not details.empty: | |
| pada_details = details.iloc[0] | |
| print(pada_details) | |
| mantraID = pada_details['mantra_id'] | |
| meanings = self._get_vedamantra_meaning(mantraID,MahatmaName=MahatmaName) | |
| if 'error' in meanings: | |
| return meanings | |
| ab_term_morph_list = self._get_pada_morphology(pada_details, meanings['adibhautic']) | |
| ad_term_morph_list = self._get_pada_morphology(pada_details, meanings['adidaivic']) | |
| at_term_morph_list = self._get_pada_morphology(pada_details, meanings['adhyatmic']) | |
| return json.dumps({ | |
| f'adibhautic_info_{pada}': ab_term_morph_list, | |
| 'vedamantra_adibhautic_meaning': meanings['adibhautic'], | |
| f'adidavic_info_{pada}': ad_term_morph_list, | |
| 'vedamantra_adidavic_meaning': meanings['adidaivic'], | |
| f'adhyatmic_info_{pada}': at_term_morph_list, | |
| 'vedamantra_adhyatmic_meaning': meanings['adhyatmic'] | |
| }) | |
| else: | |
| return json.dumps({"error": f"No details found for pada '{pada}'"}) | |
| except Exception as e: | |
| logging.error(f"Error in get_adibauatic_adidaivic_adhyatmic_meaning_of_pada: {e}") | |
| return json.dumps({"error": f"Failed to get meaning of the word {pada}. {e}"}) | |