sanatan_ai / tools.py
vikramvasudevan's picture
Upload folder using huggingface_hub
baa2172 verified
raw
history blame
6.57 kB
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,
query_by_metadata_field,
query_by_literal_text,
)
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_semantic_vector_search",
description=(
"🚫 Never use this tool if the user asks for a verse number, pasuram number, or any explicit metadata field "
"(like azhwar name, prabandham, divya desam, decade, or chapter). "
"✅ Only use this tool when the query is vague or thematic, e.g. "
"'Which pasurams talk about Krishna's childhood?' or 'Show me verses about compassion'. "
f"The collection_name must be one of: {', '.join(allowed_collections)}."
),
)
tool_search_db_for_literal = StructuredTool.from_function(
query_by_literal_text,
name="tool_search_db_by_literal_text",
description=(
"🚫 Never use this tool by default."
" ✅ Only use this tool if the user explicitly requests a 'literal match', 'exact phrase search', or uses words like 'match exactly', 'find the exact string', 'verbatim', or 'literal text'."
" If the user simply asks for a verse number (e.g., verse 34, pasuram 2.3.5, sahasranamam verse 20), you must NOT use this tool — instead you must use `tool_search_db_by_metadata`."
" Do not fall back to this tool if semantic or metadata search seems difficult or fails — it is reserved strictly for explicit literal match requests."
f" The collection_name must be one of: {', '.join(allowed_collections)}."
),
)
tool_search_db_by_metadata = StructuredTool.from_function(
query_by_metadata_field,
name="tool_search_db_by_metadata",
description=(
"Use this tool **only when the user provides explicit metadata criteria**, such as: azhwar name, pasuram number, verse number, decade, prabandham name, or divya desam name."
" This is not meant for general queries."
f" The collection_name must be one of: {', '.join(allowed_collections)}."
"you must ALWAYS call one of the standardization tools available to get the correct entity name before using this tool."
"If the user asks for a specific azhwar, use `tool_get_standardized_azhwar_names` first."
"If the user asks for a specific prabandham, use `tool_get_standardized_prabandham_names` first."
"If the user mentions a divya desam, use `tool_get_standardized_divya_desam_names` first."
"If you set metadata_search_operator to $in, then metadata_value must always be a list — even if it contains only a single item."
"""🔒 Important:
When using the tool_get_standardized_azhwar_names, tool_get_standardized_divya_desam_names, or any similar standardization tool, you must use the standardized name exactly as returned by the tool — without modifying, reformatting, translating, or simplifying it in any way.
For example, if the tool returns Thirumālirum Solai, you must pass that exact string to tool_search_db_by_metadata. Do not change it to Thirumalirum Solai, Tirumalirumsolai, or anything else.
🔍 This is critical for the search to return results correctly.
🚫 Any deviation will cause the search to fail or miss results."""
),
)
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`."
),
)