Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
| import json | |
| from langchain.agents import Tool | |
| from langchain_core.tools import StructuredTool | |
| from config import SanatanConfig | |
| from nalayiram_helper import ( | |
| get_standardized_azhwar_names, | |
| get_standardized_divya_desam_names, | |
| get_standardized_prabandham_names, | |
| ) | |
| from push_notifications_helper import push | |
| from serperdev_helper import search as search_web | |
| from sanatan_assistant import ( | |
| format_scripture_answer, | |
| query, | |
| ) | |
| tool_push = Tool( | |
| name="push", description="Send a push notification to the user", func=push | |
| ) | |
| allowed_collections = [s["collection_name"] for s in SanatanConfig.scriptures] | |
| tool_search_db = StructuredTool.from_function( | |
| query, | |
| name="tool_search_db", | |
| description=( | |
| "🚫 use this tool to fetch any data from the database." | |
| "rules for metadata_where_clause:" | |
| """ | |
| - ⚠️ Every time you include a metadata_where_clause argument, you must first call the appropriate standardization tool (tool_get_standardized_divya_desam_names,tool_get_standardized_prabandham_names,tool_get_standardized_azhwar_names). Never insert raw values directly. Even if the input already looks correct, you must still call the tool. If you fail to do this, the query will be invalid. | |
| > Standardization Step 1: Call the standardization tool to get the canonical Divya Desam name. | |
| |--Example: | |
| |----standardized_divya_desams = tool_get_standardized_divya_desam_names() | |
| |----standardized_divya_desam = look for closest match to "Thirukkudandai" in standardized_divya_desams | |
| > Standardization Step 2: Use the standardized name in your DB search argument for metadata_where_clause for the field divya_desams. | |
| - When choosing collection_name argument for the tool_search_db, make sure you choose the exact collection_name from the metadata configuration above | |
| - Always prefer a single tool call with composite filters rather than multiple calls. | |
| - For MetadataWhereClause.filters.$.metadata_search_operator do not use $regex as angument. use semantic search option by using query argument instead. | |
| - If user posts a thematic question, do not ignore the theme when you pass `query` arguments. | |
| - Use `MetadataWhereClause` recursively with `filters` and `groups` to build nested conditions. | |
| """ | |
| "- Always set metadata filters when user mentions a specific divya desam, prabandham, azhwar, or any other known field from the configuration. Example: {\"prabandham_name\": \"Thiruvaimozhi\"}." | |
| "- Multiple metadata filters can be passed at the same time." | |
| "- If passing '$in' as metadata_search_operator, the metadata_value should always be of type array. for instance {'metadata_field': 'divya_desams', 'metadata_search_operator': '$in', 'metadata_value': []'Srirangam']}" | |
| "- Set metadata filters as None if no metadata filter is requested.\n" | |
| "rules for search_type:" | |
| "- use `random` if user does not provide a thematic/semantic search request. For e.g. 'any pasuram' or 'any pasuram from thiruvaimozhi'" | |
| "- use `semantic` if user provides thematic/semantic search request" | |
| "- use `literal` ONLY if user specifically requests for a literal search." | |
| "\n" | |
| f"The collection_name must be one of: {', '.join(allowed_collections)}." | |
| ), | |
| ) | |
| tool_search_web = Tool( | |
| name="search_web", description="Search the web for information", func=search_web | |
| ) | |
| tool_format_scripture_answer = StructuredTool.from_function( | |
| format_scripture_answer, | |
| name="tool_format_scripture_answer", | |
| description=( | |
| """ | |
| Use this tool to generate a custom system prompt based on the scripture title, question, and query_tool_output. | |
| This is especially useful when the user has asked a question about a scripture, and the relevant context has been fetched using the tools like `tool_search_db_by_metadata` or `tool_search_db_by_literal_text` or `tool_semantic_vector_search`. | |
| The generated prompt will guide the assistant to respond using only that scripture’s content, with a clear format including Sanskrit/Tamil verses, English explanations, and source chapters. | |
| Include a santized version of the original native text. Do ensure you dont lose any words from the native text when sanitizing. | |
| """ | |
| ), | |
| ) | |
| tool_get_standardized_azhwar_names = StructuredTool.from_function( | |
| get_standardized_azhwar_names, | |
| name="tool_get_standardized_azhwar_names", | |
| description=( | |
| "Get a list of standardized azhwar names and the prabandhams they have written. " | |
| "Use this tool to standardize the names of the azhwars when the user asks for pasurams written by a specific azhwar." | |
| "Usually this is followed by passing that standardized azhwar_name for a metadata search using the `tool_search_db_by_metadata` tool." | |
| ), | |
| ) | |
| tool_get_standardized_prabandham_names = StructuredTool.from_function( | |
| get_standardized_prabandham_names, | |
| name="tool_get_standardized_prabandham_names", | |
| description=( | |
| "Get a list of standardized prabandham names." | |
| "Use this tool to standardize the names of the prabandhams when the user asks for pasurams from a specific prabandham." | |
| "Usually this is followed by passing that `prabandham_name` for a metadata search using the `tool_search_db_by_metadata` tool." | |
| "if you are passing the prabandham_code, make sure you use metadata field `prabandham` and NOT `prabandham_code` as argument to `tool_search_db_by_metadata` tool." | |
| ), | |
| ) | |
| tool_get_standardized_divya_desam_names = StructuredTool.from_function( | |
| get_standardized_divya_desam_names, | |
| name="tool_get_standardized_divya_desam_names", | |
| description=( | |
| "Get a list of standardized divya desam names. " | |
| "Use this tool to standardize the names of the divya desams when the user asks for pasurams written on a specific divya desam." | |
| "Usually this is followed by passing that standardized divya desam name for a metadata search using the `tool_search_db_by_metadata` tool by using the fiels `divya_desams`." | |
| ), | |
| ) | |