from smolagents import (CodeAgent, GradioUI, LiteLLMModel, OpenAIServerModel, ChatMessage, ToolCallingAgent) from smolagents.default_tools import (DuckDuckGoSearchTool, VisitWebpageTool, WikipediaSearchTool, PythonInterpreterTool ) import yaml from tools import check_reasoning, ensure_formatting from tools import (download_youtube_video, youtube_frames_to_images, use_vision_model, analyze_frames_with_vision, read_file, download_file_from_url, analyze_csv_file, analyze_excel_file, youtube_transcribe, transcribe_audio) import os from dotenv import load_dotenv import time load_dotenv() # Load prompts from YAML file with open("prompts.yaml", 'r') as stream: prompt_templates = yaml.safe_load(stream) class SlowLiteLLMModel(LiteLLMModel): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def __call__(self, messages, **kwargs) -> ChatMessage: time.sleep(15) # prepend onto whatever messages the Agent built return super().__call__(messages, **kwargs) react_model_name = "gemini/gemini-2.5-flash-lite" react_model = LiteLLMModel(model_id=react_model_name, api_key=os.getenv("GEMINI_KEY"), temperature=0.2 ) search_tool = DuckDuckGoSearchTool() search_tool.name = "search" visit_tool = VisitWebpageTool(max_output_length=500000) visit_tool.name = "open_page" wiki_tool = WikipediaSearchTool(extract_format='HTML') wiki_tool.name = "wiki_search" research_agent = ToolCallingAgent( name="ResearchAgent", description=""" Handles web search and information retrieval. Tools: - search(query: str): Search the web - open_page(url: str): Open a webpage - wiki_search(query: str): Search Wikipedia """, model=react_model, tools=[search_tool, visit_tool, wiki_tool] ) vision_tool = use_vision_model vision_tool.name = "analyze_image" vision_agent = ToolCallingAgent( name="VisionAgent", description=""" Handles image understanding and OCR. Tools: - extract_text(image_path: str): Extract text from image - analyze_image(image_path: str): Analyze image content """, model=react_model, tools=[vision_tool] ) csv_tool = analyze_csv_file csv_tool.name = "analyze_csv" excel_tool = analyze_excel_file excel_tool.name = "analyze_excel" data_agent = ToolCallingAgent( name="DataAgent", description=""" Handles CSV and Excel analysis. Tools: - analyze_csv(file_path: str): Analyze CSV file - analyze_excel(file_path: str): Analyze Excel file """, model=react_model, tools=[csv_tool, excel_tool] ) yt_transcribe_tool = youtube_transcribe yt_transcribe_tool.name = "youtube_transcribe" yt_frames_tool = youtube_frames_to_images yt_frames_tool.name = "youtube_frames" audio_tool = transcribe_audio audio_tool.name = "transcribe_audio" analyze_frame = analyze_frames_with_vision analyze_frame.name = "analyze_frames" media_agent = ToolCallingAgent( name="MediaAgent", description=""" Handles YouTube and audio processing. Tools: - youtube_transcribe(url: str): Get transcript from YouTube - youtube_frames(url: str): Extract frames from downloaded video - transcribe_audio(file_path: str): Convert audio to text - analyze_frames(url: str): Analyze frames from video """, model=react_model, tools=[ yt_transcribe_tool, yt_frames_tool, audio_tool, analyze_frame, ] ) manager_agent = CodeAgent( model=react_model, tools=[ read_file, download_file_from_url, download_youtube_video ], managed_agents=[ research_agent, vision_agent, data_agent, media_agent ], additional_authorized_imports=['os', 'pandas', 'numpy', 'PIL', 'tempfile', 'PIL.Image'], max_steps=20, verbosity_level=1, planning_interval=6, name="Manager", description="The manager of the team, responsible for overseeing and guiding the team's work. Routes tasks to the right specialist agents", #final_answer_checks=[check_reasoning, ensure_formatting], prompt_templates=prompt_templates ) if __name__ == "__main__": GradioUI(manager_agent).launch()