porla
Add functionality to load and execute Python files; refactor test script for output capture
fde6ed4
import os
from IPython.display import Image, display
from langchain_core.messages import SystemMessage
from langchain_openai import AzureChatOpenAI
from langgraph.graph import StateGraph, START, END
from langgraph.prebuilt import tools_condition
from .state import State
from .custom_tool_node import CustomToolNode
from .tools import get_avaiable_tools
class CustomAgent:
def __init__(self):
print("CustomAgent initialized.")
self.graph = build_graph() # Build the state graph for the agent
def __call__(self, question: str, task_id: str) -> str:
print(f"Agent received question (first 50 chars): {question[:50]}...")
system_prompt = SystemMessage(content=get_prompt())
messages = self.graph.invoke({
"messages": [
system_prompt,
{"role": "user", "content": question}
],
"task_id": task_id
})
answer = messages['messages'][-1].content
return answer[14:]
def get_prompt() -> str:
with open("system_prompt.txt", "r", encoding="utf-8") as f:
return f.read()
def build_graph():
"""Builds the state graph for the React agent."""
# Initialize our LLM
llm = AzureChatOpenAI(
azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"), # Corrected variable name
openai_api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
deployment_name=os.getenv("AZURE_OPENAI_DEPLOYMENT"), # Corrected variable name
openai_api_key=os.getenv("AZURE_OPENAI_API_KEY"),
temperature=0.0,
)
avaiable_tools = get_avaiable_tools()
llm_with_tools = llm.bind_tools(avaiable_tools)
def assistant(state: State):
"""Assistant node"""
response = llm_with_tools.invoke(state["messages"])
if response.content == '':
messages = [response] # tool calling message
else:
final_message = response.content
# final_message += f"\n\nTask ID: {state['task_id']}"
messages = [final_message]
return {"messages": messages,
"task_id": state["task_id"]
}
# Initialize the state graph
graph_builder = StateGraph(State)
# Add nodes
# graph_builder.add_node("check_question_reversed", is_question_reversed)
# graph_builder.add_node("reverse_text", reverse_text)
graph_builder.add_node("assistant", assistant)
tools_dict = {tool.name: tool for tool in avaiable_tools}
graph_builder.add_node("tools", CustomToolNode(tools_dict))
# graph_builder.add_edge(START, "check_question_reversed")
# graph_builder.add_conditional_edges(
# "check_question_reversed",
# route_question,
# {
# "question_reversed": "reverse_text",
# "question_not_reversed": "assistant"
# }
# )
# graph_builder.add_edge("reverse_text", "assistant")
graph_builder.add_edge(START, "assistant")
graph_builder.add_conditional_edges(
"assistant",
tools_condition,
)
graph_builder.add_edge("tools", "assistant")
graph_builder.add_edge("assistant", END)
return graph_builder.compile()
if __name__ == "__main__":
# Build the graph
react_graph = build_graph()
# Display the graph visualization
# graph = react_graph.get_graph(xray=True)
# display(Image(graph.draw_mermaid_png(output_file_path='graph.png')))
# Example question to test the agent
# question = "How many studio albums were published by Mercedes Sosa between 2000 and 2009 (included)? You can use the latest 2022 version of english wikipedia."
# question = ".rewsna eht sa \"tfel\" drow eht fo etisoppo eht etirw ,ecnetnes siht dnatsrednu uoy fI"
# question = "Who nominated the only Featured Article on English Wikipedia about a dinosaur that was promoted in November 2016?"
#question = """Examine the video at https://www.youtube.com/watch?v=1htKBjuUWec.\n\nWhat does Teal'c say in response to the question \"Isn't that hot?\""""
# question = """Hi, I was out sick from my classes on Friday, so I'm trying to figure out what I need to study for my Calculus mid-term next week. My friend from class sent me an audio recording of Professor Willowbrook giving out the recommended reading for the test, but my headphones are broken :(\n\nCould you please listen to the recording for me and tell me the page numbers I'm supposed to go over? I've attached a file called Homework.mp3 that has the recording. Please provide just the page numbers as a comma-delimited list. And please provide the list in ascending order."""
# question = """The attached Excel file contains the sales of menu items for a local fast-food chain. What were the total sales that the chain made from food (not including drinks)? Express your answer in USD with two decimal places."""
question = """What is the final numeric output from the attached Python code?"""
task_id = "f918266a-b3e0-4914-865d-4faa564f1aef"
system_prompt = SystemMessage(content=get_prompt())
messages = react_graph.invoke({
"messages": [
system_prompt,
{"role": "user", "content": question}
],
"task_id": task_id
})
for m in messages["messages"]:
m.pretty_print()
answer = messages['messages'][-1].content
print(f"Final Answer: {answer[14:]}")
# Stream the response from the agent
# events = react_graph.stream(
# {"messages": [("user", question)]},
# config={"configurable": {"return_intermediate_steps": True}},
# stream_mode="values"
# )
# for event in events:
# print(event) # Replace `_print_event(event, _printed)` with direct printing
# print("----\n---")