Sathwik1212 commited on
Commit
0e81ea2
Β·
verified Β·
1 Parent(s): c7ecc27

Update agent.py

Browse files
Files changed (1) hide show
  1. agent.py +137 -129
agent.py CHANGED
@@ -1,129 +1,137 @@
1
- import os
2
- from dotenv import load_dotenv
3
- from langgraph.graph import START, END, StateGraph, MessagesState
4
- from langgraph.prebuilt import ToolNode
5
- from langchain_google_genai import ChatGoogleGenerativeAI
6
- from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
7
- from langchain_core.tools import tool
8
- from langchain_community.tools.tavily_search import TavilySearchResults
9
- from langchain_community.document_loaders import WikipediaLoader, ArxivLoader
10
- from sympy import sympify
11
-
12
- load_dotenv()
13
-
14
- #############################
15
- # TOOLS
16
- #############################
17
-
18
- @tool
19
- def evaluate_math_expression(expr: str) -> str:
20
- """Evaluate a math expression using symbolic math."""
21
- try:
22
- result = sympify(expr)
23
- return str(result.evalf())
24
- except Exception as e:
25
- return f"Math evaluation error: {e}"
26
-
27
- @tool
28
- def search_arxiv(query: str) -> str:
29
- """Search Arxiv for scientific papers related to a query."""
30
- docs = ArxivLoader(query=query, load_max_docs=2).load()
31
- return "\n---\n".join(doc.page_content[:1000] for doc in docs)
32
-
33
- @tool
34
- def search_wikipedia(query: str) -> str:
35
- """Search Wikipedia and return summarized results."""
36
- docs = WikipediaLoader(query=query, load_max_docs=2).load()
37
- return "\n---\n".join(doc.page_content[:500] for doc in docs)
38
-
39
- @tool
40
- def web_search(query: str) -> str:
41
- """Web search using Tavily (3 results)."""
42
- return TavilySearchResults(max_results=3).invoke(query=query)
43
-
44
- #############################
45
- # INITIALIZE TOOLS
46
- #############################
47
-
48
- tools = [
49
- evaluate_math_expression,
50
- search_arxiv,
51
- search_wikipedia,
52
- web_search
53
- ]
54
-
55
- #############################
56
- # SYSTEM MESSAGE
57
- #############################
58
-
59
- sys_msg = SystemMessage(content="""
60
- You are a research assistant agent. Given a question, attempt to:
61
- 1. Identify whether it requires mathematical computation or factual research.
62
- 2. Use the appropriate tool or set of tools.
63
- 3. Answer concisely and correctly.
64
- """)
65
-
66
- #############################
67
- # NODES
68
- #############################
69
-
70
- def classifier_node(state: MessagesState):
71
- question = state['messages'][-1].content.lower()
72
- if any(k in question for k in ["calculate", "what is", "solve", "+", "-", "*", "/"]):
73
- return "math"
74
- return "search"
75
-
76
- def math_node(state: MessagesState):
77
- expr = state['messages'][-1].content
78
- response = evaluate_math_expression.invoke(expr)
79
- return {"messages": state['messages'] + [AIMessage(content=response)]}
80
-
81
- def search_node(state: MessagesState):
82
- query = state['messages'][-1].content
83
- wiki = search_wikipedia.invoke(query)
84
- return {"messages": state['messages'] + [HumanMessage(content=f"Here is some info from Wikipedia:\n{wiki}")]}
85
-
86
- def assistant_node(state: MessagesState):
87
- llm = ChatGoogleGenerativeAI(model="gemini-1.5-flash", temperature=0)
88
- return {"messages": state['messages'] + [llm.invoke(state['messages'])]}
89
-
90
- def answer_validator_node(state: MessagesState):
91
- last_response = state['messages'][-1].content
92
- if "error" in last_response.lower():
93
- return {"messages": state['messages'] + [AIMessage(content="I'm sorry, something went wrong.")]}
94
- return {"messages": state['messages']}
95
-
96
- #############################
97
- # BUILD GRAPH
98
- #############################
99
-
100
- def build_graph():
101
- builder = StateGraph(MessagesState)
102
-
103
- builder.add_node("classifier", classifier_node)
104
- builder.add_node("math", math_node)
105
- builder.add_node("search", search_node)
106
- builder.add_node("assistant", assistant_node)
107
- builder.add_node("validate", answer_validator_node)
108
-
109
- builder.set_entry_point("classifier")
110
- builder.add_edge("math", "validate")
111
- builder.add_edge("search", "assistant")
112
- builder.add_edge("assistant", "validate")
113
- builder.add_edge("validate", END)
114
-
115
- builder.add_conditional_edges("classifier", lambda state: classifier_node(state))
116
-
117
- return builder.compile()
118
-
119
- #############################
120
- # TEST MAIN
121
- #############################
122
-
123
- if __name__ == "__main__":
124
- question = "What is the result of (3^2 + 4^2)?"
125
- graph = build_graph()
126
- messages = [HumanMessage(content=question)]
127
- output = graph.invoke({"messages": messages})
128
- for m in output["messages"]:
129
- m.pretty_print()
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from dotenv import load_dotenv
3
+ from langgraph.graph import START, END, StateGraph, MessagesState
4
+ from langgraph.prebuilt import ToolNode
5
+ from langchain_google_genai import ChatGoogleGenerativeAI
6
+ llm = ChatGoogleGenerativeAI(
7
+ model="gemini-2.0-flash", # Specify your model
8
+ google_api_key=
9
+ )
10
+ from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
11
+ from langchain_core.tools import tool
12
+ from langchain_community.tools.tavily_search import TavilySearchResults
13
+ search = TavilySearchResults(
14
+ max_results=5, # Adjust as needed
15
+ api_key=
16
+ )
17
+ from langchain_community.document_loaders import WikipediaLoader, ArxivLoader
18
+ from sympy import sympify
19
+
20
+ load_dotenv()
21
+
22
+ #############################
23
+ # TOOLS
24
+ #############################
25
+
26
+ @tool
27
+ def evaluate_math_expression(expr: str) -> str:
28
+ """Evaluate a math expression using symbolic math."""
29
+ try:
30
+ result = sympify(expr)
31
+ return str(result.evalf())
32
+ except Exception as e:
33
+ return f"Math evaluation error: {e}"
34
+
35
+ @tool
36
+ def search_arxiv(query: str) -> str:
37
+ """Search Arxiv for scientific papers related to a query."""
38
+ docs = ArxivLoader(query=query, load_max_docs=2).load()
39
+ return "\n---\n".join(doc.page_content[:1000] for doc in docs)
40
+
41
+ @tool
42
+ def search_wikipedia(query: str) -> str:
43
+ """Search Wikipedia and return summarized results."""
44
+ docs = WikipediaLoader(query=query, load_max_docs=2).load()
45
+ return "\n---\n".join(doc.page_content[:500] for doc in docs)
46
+
47
+ @tool
48
+ def web_search(query: str) -> str:
49
+ """Web search using Tavily (3 results)."""
50
+ return TavilySearchResults(max_results=3).invoke(query=query)
51
+
52
+ #############################
53
+ # INITIALIZE TOOLS
54
+ #############################
55
+
56
+ tools = [
57
+ evaluate_math_expression,
58
+ search_arxiv,
59
+ search_wikipedia,
60
+ web_search
61
+ ]
62
+
63
+ #############################
64
+ # SYSTEM MESSAGE
65
+ #############################
66
+
67
+ sys_msg = SystemMessage(content="""
68
+ You are a research assistant agent. Given a question, attempt to:
69
+ 1. Identify whether it requires mathematical computation or factual research.
70
+ 2. Use the appropriate tool or set of tools.
71
+ 3. Answer concisely and correctly.
72
+ """)
73
+
74
+ #############################
75
+ # NODES
76
+ #############################
77
+
78
+ def classifier_node(state: MessagesState):
79
+ question = state['messages'][-1].content.lower()
80
+ if any(k in question for k in ["calculate", "what is", "solve", "+", "-", "*", "/"]):
81
+ return "math"
82
+ return "search"
83
+
84
+ def math_node(state: MessagesState):
85
+ expr = state['messages'][-1].content
86
+ response = evaluate_math_expression.invoke(expr)
87
+ return {"messages": state['messages'] + [AIMessage(content=response)]}
88
+
89
+ def search_node(state: MessagesState):
90
+ query = state['messages'][-1].content
91
+ wiki = search_wikipedia.invoke(query)
92
+ return {"messages": state['messages'] + [HumanMessage(content=f"Here is some info from Wikipedia:\n{wiki}")]}
93
+
94
+ def assistant_node(state: MessagesState):
95
+ llm = ChatGoogleGenerativeAI(model="gemini-1.5-flash", temperature=0)
96
+ return {"messages": state['messages'] + [llm.invoke(state['messages'])]}
97
+
98
+ def answer_validator_node(state: MessagesState):
99
+ last_response = state['messages'][-1].content
100
+ if "error" in last_response.lower():
101
+ return {"messages": state['messages'] + [AIMessage(content="I'm sorry, something went wrong.")]}
102
+ return {"messages": state['messages']}
103
+
104
+ #############################
105
+ # BUILD GRAPH
106
+ #############################
107
+
108
+ def build_graph():
109
+ builder = StateGraph(MessagesState)
110
+
111
+ builder.add_node("classifier", classifier_node)
112
+ builder.add_node("math", math_node)
113
+ builder.add_node("search", search_node)
114
+ builder.add_node("assistant", assistant_node)
115
+ builder.add_node("validate", answer_validator_node)
116
+
117
+ builder.set_entry_point("classifier")
118
+ builder.add_edge("math", "validate")
119
+ builder.add_edge("search", "assistant")
120
+ builder.add_edge("assistant", "validate")
121
+ builder.add_edge("validate", END)
122
+
123
+ builder.add_conditional_edges("classifier", lambda state: classifier_node(state))
124
+
125
+ return builder.compile()
126
+
127
+ #############################
128
+ # TEST MAIN
129
+ #############################
130
+
131
+ if __name__ == "__main__":
132
+ question = "What is the result of (3^2 + 4^2)?"
133
+ graph = build_graph()
134
+ messages = [HumanMessage(content=question)]
135
+ output = graph.invoke({"messages": messages})
136
+ for m in output["messages"]:
137
+ m.pretty_print()