import tempfile import json import yaml from tqdm import tqdm from smolagents import OpenAIServerModel, PythonInterpreterTool from agents.file_reader import create_file_reader from agents.manager import create_manager from agents.mathematician import create_mathematician from agents.utils import create_utils from agents.web_browser import create_web_agent from questions_api import QuestionsAPI from tools.vision_tools import analyze_image from config import IP_WINDOWS, authorized_libraries model = OpenAIServerModel( model_id="qwen2.5:14b", #model_id="deepseek-r1:14b", # api_base='http://localhost:11435/v1', api_key="ollama") # model_fast = OpenAIServerModel(model_id="qwen2.5:1.5b", # api_base=f"http://{IP_WINDOWS}:11434/v1", # api_key="ollama") # model_light = OpenAIServerModel(model_id="phi3", # api_base="http://localhost:11434/v1", # api_key="ollama") manager_agent = create_manager(model, tools=[analyze_image, PythonInterpreterTool(authorized_imports=authorized_libraries)], agents=[create_file_reader(model), create_web_agent(model), create_utils(model), create_mathematician(model)]) prompt = """ You are a high-level Orchestrator Agent. Your role is to PLAN and DELEGATE. You do NOT have direct access to external tools like web search or wikipedia. I will ask you a question. Report your thoughts, and finish your answer with the following template: FINAL ANSWER: [YOUR FINAL ANSWER] Instructions: - Follow 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. - CRITICAL: When giving the final answer, be extremely concise. If the user asks for a number, provide ONLY the number. If asked for a specific format, strictly follow it without chatting. - IMPORTANT: Before giving the final answer or using a tool, you MUST think step by step. Break down the problem. - If the deduction seems illogical, review it. CRITICAL RULES: 1. **Delegation is Mandatory:** If you need to search the web, find a discography, or look up facts, you MUST use your managed agent named 'web_agent'. 2. **Forbidden Actions:** Do NOT attempt to call functions like 'wikipedia_search', 'google_search', or 'requests.get' directly. You will crash if you try. 3. **Syntax:** To use the web agent, you must generate a tool call for it. Example: `result = web_agent(task="Find the discography of Mercedes Sosa...")` 4. **Team First Approach:** Before writing any Python code, you MUST evaluate if one of your managed agents (e.g., 'becario_windows', 'vision_tool') is capable of handling the task. 5. **Code Execution:** Only write and execute Python code for complex reasoning, data integration, or tasks that no other agent can perform. CODING RULES: 1. **Print to Debug:** You cannot see the value of variables unless you print them. ALWAYS print the head of a dataframe or the result of a calculation to confirm it's correct. 2. **File Paths:** Assume files are in the current directory. Do not invent subfolders. 3. **Persistence:** If you create a plot or a file, you MUST save it to disk (e.g., 'output.png') and tell me the filename. Do not try to use plt.show(). 4. **Libraries:** Use 'pandas' for data and 'requests' for web. Do not use complex scrapers like Selenium. ALWAYS check your `managed_agents` list before acting. If a tool or agent exists for the job, use it. Do not reinvent the wheel. Question: {question_123blabla} Extra info: {extra_info_123blabla} """ answers_file = "answers.yaml" def add_answer_to_yaml(file_path: str, task_id: str, answer: str): with open(file_path, 'r') as f: cur_yaml = yaml.safe_load(f) cur_yaml[task_id] = answer if cur_yaml: with open(file_path,'w') as yamlfile: yaml.safe_dump(cur_yaml, yamlfile) def load_yaml(file_path: str): with open(file_path, 'r') as f: return yaml.safe_load(f) current_answers = load_yaml(answers_file) with tempfile.TemporaryDirectory() as tmpdir: results = [] questions_api = QuestionsAPI(tmpdir) for question in tqdm(questions_api.questions_generator(), total=len(questions_api.questions)): if question["task_id"] in current_answers.keys(): continue extra_info = {} if question["file_name"] != "": extra_info["file_name"] = f"{tmpdir}/{question['file_name']}" formatted_question = prompt.format(question_123blabla=question["question"], extra_info_123blabla=extra_info) response = manager_agent.run(formatted_question, max_steps=30, return_full_result=False) response = str(response) results.append({"task_id": question["task_id"], "submitted_answer": response}) add_answer_to_yaml(file_path=answers_file, task_id=question["task_id"], answer=response) print(questions_api.post_answers(results))