Final_Assignment_Template / langgraph_agent.py
José Enrique
langgraph agent
d4bb43c
import os
from typing import List, TypedDict, Annotated, Optional
from langgraph.graph import StateGraph, START, END
from langchain_openai import ChatOpenAI
from langchain_core.messages import AnyMessage, SystemMessage, HumanMessage
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_condition
from tools.searchTools_lg import wiki_search, mini_web_search, arvix_search
class AgentState(TypedDict):
input_file: Optional[str]
messages: Annotated[list[AnyMessage], add_messages]
# add toools:
tools = [
wiki_search,
mini_web_search,
arvix_search,
]
def agent(state:AgentState):
tools_description = """
wiki_search(query: str) -> str:
Search Wikipedia for a query and return maximum 2 results.
Args:
query: The search query.
Search Tavily for a query and return maximum 3 results.
mini_web_search(query: str) -> str:
Args:
query: The search query
arvix_search(query: str) -> str:
Search Arxiv for a query and return maximum 3 result.
Args:
query: The search query.
"""
sys_message = SystemMessage(content=f"""You are a helpful AI agent that can use tools to answer questions.
You can use the following tools:{tools_description}
PLEASE FOLLOW THE INSTRUCTIONS FOR ANSWERING CAREFULLY:
Your answer should follow the template: FINAL ANSWER: [YOUR FINAL ANSWER].
YOUR FINAL ANSWER should be a number OR as few words as possible OR a comma separated list of numbers and/or strings.
If you are asked for a number, don't use comma to write your number neither use units such as $ or percent sign unless specified otherwise.
If you are asked for a string, don't use articles, neither abbreviations (e.g. for cities), and write the digits in plain text unless specified otherwise.
If you are asked for a comma separated list, apply the above rules depending of whether the element to be put in the list is a number or a string.
""")
# LLM model and tools
vision_llm = ChatOpenAI(model="gpt-4o")
llm = ChatOpenAI(model="gpt-4o")
llm_withtools = llm.bind_tools(tools, parallel_tool_calls = False)
return {
"input_file": state["input_file"],
"messages": [llm_withtools.invoke([sys_message]+ state["messages"])]
}
def build_agents():
builder = StateGraph(AgentState)
builder.add_node("agent",agent)
builder.add_node("tools",ToolNode(tools))
builder.add_edge(START, "agent")
builder.add_conditional_edges(
"agent",
tools_condition,
)
builder.add_edge("tools", "agent")
react_graph = builder.compile()
return react_graph