Final_Assignment_Agent / basic_agent.py
SrcLurker's picture
change the models, add tracing.
766d2d7
raw
history blame
4.87 kB
import os
import logging
import sys
import time
import smolagents
# Logs appear to be swallowed.
LOG = logging.getLogger(__name__)
SYSTEM_PROMPT = """
You are a general AI assistant. I will ask you a question. 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.
The current date is April 30, 2025.
Take the time to plan the steps to reach the solution. Show the steps and then execute the steps.
The question is below:
"""
SUFFIX_PROMPT = """
Remember - The FINAL ANSWER must be a string, a number or a comma separated list that is only strings and numbers. No other output is allowed for a FINAL ANSWER! If any other output is provided other than a string, number or comma separated list that contains only strings and numbers, you fail. Don't fail.
"""
class BasicAgent:
def check_results(self, final_answer, agent_memory):
if isinstance(final_answer, str) or isinstance(final_answer, int) or isinstance(final_answer, float):
return True
failure = "FAILED! The final answer must be a string, a number or a comma separated list of strings and numbers."
print(f"Feedback: {failure}")
raise Exception(failure)
def __init__(self):
print("BasicAgent initializing.")
# too big
# self.manager_model_id = "google/gemma-3-27B-it"
# self.manager_model_id = "OpenGVLab/InternVL3-14B"
# self.manager_model_id = "AIDC-AI/Ovis2-34B"
self.manager_model_id = "meta-llama/Llama-3.3-70B-Instruct"
self.manager_model = None
self.code_model_id = "Qwen/Qwen2.5-Coder-32B-Instruct"
self.code_model = None
if not self.manager_model:
self.manager_model = smolagents.HfApiModel(
max_tokens=32000,
temperature=0.3,
model_id=self.manager_model_id,
custom_role_conversions=None,
)
if not self.code_model:
self.code_model = smolagents.HfApiModel(
max_tokens=32000,
temperature=0.3,
model_id=self.code_model_id,
custom_role_conversions=None,
)
print(f"NEW4: BasicAgent {self.manager_model_id=} {self.code_model_id=}")
self.math_agent = smolagents.CodeAgent(
name="date_time_math_agent",
description="Handle date, time and math caclulations",
model=self.code_model,
tools=[],
max_steps=6,
verbosity_level=2,
planning_interval=None,
additional_authorized_imports=["datetime", "time", "calendar"],
)
web_search_tools = [
smolagents.DuckDuckGoSearchTool(),
smolagents.VisitWebpageTool(),
smolagents.FinalAnswerTool()
]
self.web_search_agent = smolagents.CodeAgent(
name="web_search_agent",
description="Search the web",
model=self.code_model,
tools=web_search_tools,
max_steps=6,
verbosity_level=2,
planning_interval=None,
additional_authorized_imports=["duckduckgo_search"],
)
wikipedia_search_tools = [
smolagents.WikipediaSearchTool(),
smolagents.VisitWebpageTool(),
smolagents.FinalAnswerTool()
]
self.wikipedia_search_agent = smolagents.CodeAgent(
name="wikipedia_search_agent",
description="Best search of wikipedia pages",
model=self.code_model,
tools=wikipedia_search_tools,
max_steps=6,
verbosity_level=2,
planning_interval=None,
additional_authorized_imports=["wikipedia-api"],
)
self.manager_agent = smolagents.CodeAgent(
name="manager_agent",
description="Manger of other agents",
tools=[smolagents.FinalAnswerTool()],
model=self.manager_model,
add_base_tools=True,
max_steps=10,
verbosity_level=2,
planning_interval=None,
additional_authorized_imports=["duckduckgo_search", "wikipedia-api"],
managed_agents=[self.web_search_agent, self.wikipedia_search_agent, self.math_agent],
final_answer_checks=[self.check_results],
)
def __call__(self, question: str) -> str:
print(f"Agent received question (first 50 chars): {question[:50]}...")
prompt = f'{SYSTEM_PROMPT}\n\n{question}\n\n {SUFFIX_PROMPT}'
answer = self.manager_agent.run(prompt)
print(f"{answer=}")
return answer