from tools import ( general_tools, file_agent_tools, data_agent_tools, math_agent_tools, analyze_video_tools, youtube_transcript_tools, google_search, wiki_search, arxiv_search ) from langgraph.prebuilt import create_react_agent from langgraph.checkpoint.memory import MemorySaver from langchain_openai import ChatOpenAI from langgraph_supervisor import create_supervisor llm = ChatOpenAI(model="o4-mini") memory = MemorySaver() with open("system_prompt.txt", "r") as f: prompt = f.read() general_agent = create_react_agent( model=llm, tools=general_tools(), checkpointer=memory, prompt=prompt ) # Create agents file_agent = create_react_agent( model=llm, tools=file_agent_tools(), name="file_reader", prompt="You read files. Use tools to read files." ) math_agent = create_react_agent( model=llm, tools=math_agent_tools(), name="calculator", prompt="You do math. Use tools for all calculations." ) data_agent = create_react_agent( model=llm, tools=data_agent_tools(), name="data_processor", prompt="You process data. Use tools to filter and extract data." ) # Create video analysis agents video_agent = create_react_agent( model=llm, tools=analyze_video_tools(), name="video_analyzer", prompt="""You analyze visual content in videos. Use tools to detect and track objects. The object_detection tool is a general object detection model. Use this for general cases. The analyze_video_content uses both the object detection model and a vision llm to analyze frames with content given a question. Use this for more difficult questions.""" ) transcript_agent = create_react_agent( model=llm, tools=youtube_transcript_tools(), name="transcript_analyzer", prompt="You analyze audio/speech content in videos. Use tools to get transcripts." ) wiki_agent = create_react_agent( model=llm, tools=[wiki_search], name="wiki_analyst", prompt="You search information from wikipedia." ) google_agent = create_react_agent( model=llm, tools=[google_search], name="google_search_analyst", prompt="You search information from google search." ) arxiv_agent = create_react_agent( model=llm, tools=[arxiv_search], name="arxiv_analyst", prompt="You search information from arxiv." ) excel_prompt = """You are a supervisor. You coordinate file_reader, calculator, and data_processor to solve problems step by step. Do not do calculations or file reading yourself, use the tools. Report your thoughts, and finish your answer with the following 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. """ video_analyzer_prompt = """You coordinate video_analyzer and transcript_analyzer to answer questions about YouTube videos. Use video_analyzer for visual questions (objects, people, actions). Use transcript_analyzer for audio questions (what people say). Report your thoughts, and finish your answer with the following 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. """ search_analyzer_prompt = """You coordinate different search agents to answer questions. Report your thoughts, and finish your answer with the following 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. """ # Supervisor excel_supervisor = create_supervisor( [file_agent, math_agent, data_agent], model=llm, prompt=excel_prompt ).compile() # Video supervisor video_supervisor = create_supervisor( [video_agent, transcript_agent], model=llm, prompt=video_analyzer_prompt ).compile() # search supervisor search_supervisor = create_supervisor( [wiki_agent, google_agent, arxiv_agent], model=llm, prompt=search_analyzer_prompt ).compile()