| import os | |
| from smolagents import OpenAIServerModel, ToolCallingAgent | |
| from tools import ( | |
| AudioTranscriberTool, | |
| txt_reader, | |
| pdf_reader, | |
| excel_reader, | |
| math_calculator, | |
| search_engine, | |
| image_analyzer, | |
| YoutubeTranscriberTool, | |
| YoutubeVideoDescriptorTool, | |
| ) | |
| from utils import OPENAI_MODEL_ID | |
| MAIN_PROMPT = """ | |
| You are a general AI assistant. I will ask you a question. Report your thoughts, and finish your answer with the following template: | |
| [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. | |
| Each question will contain the question, the task ID, and if available, a file name. | |
| Key points: | |
| - Do not add any prefix or suffix to YOUR FINAL ANSWER. | |
| - Answer shortly and concisely, following the template strictly. | |
| - Again, YOUR FINAL ANSWER should be a number OR as few words as possible OR a comma separated list of numbers and/or strings. | |
| Example: | |
| [Final Answer: 42] | |
| Good example: "42" | |
| Bad example: "The answer is 42" | |
| """ | |
| class MainAgent: | |
| """Main agent that orchestrates file handling and web search tasks.""" | |
| def __init__(self): | |
| model = OpenAIServerModel(model_id=OPENAI_MODEL_ID, api_key=os.getenv("OPENAI_API_KEY")) | |
| self.agent = ToolCallingAgent( | |
| name="main_agent", | |
| description="An agent that can search the web, visit webpages, perform calculations, and handle files.", | |
| tools=[ | |
| search_engine, | |
| math_calculator, | |
| AudioTranscriberTool(), | |
| txt_reader, | |
| pdf_reader, | |
| excel_reader, | |
| image_analyzer, | |
| YoutubeTranscriberTool(), | |
| YoutubeVideoDescriptorTool(), | |
| ], | |
| max_steps=5, | |
| model=model, | |
| ) | |
| def run(self, question: str, task_id: str, file_name: str | None) -> str: | |
| """Run the agent with the provided question, task ID, and optional file name.""" | |
| query = f"""q: {question} | |
| task_id: {task_id} | |
| {'file_name: ' + file_name if file_name else ''} | |
| """ | |
| return self.agent.run(query) | |