from smolagents import LiteLLMModel from src.settings import Settings from src.utils import InputTokenRateLimiter from smolagents.tools import Tool from litellm import completion import os import re settings = Settings() print(settings.llm_model_id) class FinalAnswerTool(Tool): name = "final_answer" description = """ Takes the agent's computed result and formats the final answer. If the question asks for time rounded to the nearest *thousand hours*, you MUST: 1. First compute total time in hours. 2. THEN divide by FINAL ANSWER BY 1000 to convert to 'thousands of hours'. 3. Round that result to the nearest integer. 4. Output ONLY that integer (e.g., 17), Always output a clean string with ONLY the final answer. STRICT RULES: - Do NOT use Markdown formatting. - Do NOT use bold formatting. - Do NOT surround the answer with **asterisks**. - Do NOT add explanations, units, or extra words. - If the answer is a number, output ONLY the number (e.g., 17000). - Output must be plain ASCII text, no special symbols. """ inputs = { "answer": {"type": "string", "description": "The final, correctly formatted answer string."} } output_type = "string" def forward(self, answer: str) -> str: if not answer or str(answer).strip() == "": return "I am unable to answer" # Fallback string for submission answer = str(answer).strip() match = re.search(r'boxed\{([^}]+)\}', answer) if match: answer = match.group(1) # Remove LaTeX symbols and keep letters, digits, commas answer = re.sub(r'[\$\{\}\\]', '', answer) answer = re.sub(r'[^A-Za-z0-9,\.\-\+/ ]', ' ', answer) answer = " ".join(answer.split()) # Remove extra spaces if not answer: return "I am unable to answer" return answer