File size: 6,159 Bytes
a116972
fd1b271
 
 
 
bc05cd4
 
 
baa2172
bc05cd4
fd1b271
 
bc05cd4
 
 
 
fd1b271
 
 
 
 
 
 
 
 
a1180f7
fd1b271
a1180f7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
be0f52a
c6893be
 
 
bc05cd4
fd1b271
 
 
 
63d1774
 
 
 
 
 
be9dacf
63d1774
 
 
 
 
bbb5184
 
 
ae0db51
bbb5184
 
 
 
 
 
ae0db51
d023803
baa2172
d023803
 
 
 
 
 
 
 
ae0db51
 
 
 
 
 
 
 
 
bc05cd4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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`."
    ),
)