Final_Assignment_Agent / basic_agent.py
SrcLurker's picture
hit google limits.
7376a97
raw
history blame
4.17 kB
import os
import logging
import sys
import time
import smolagents
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.
"""
class BasicAgent:
def __init__(self, model_id=None):
print("BasicAgent initializing.")
# Logs appear to be swallowed.
LOG.warning("logging BasicAgent initialized.")
# Assume we will use the default model creation
self.model = None
if model_id:
self.model_id = model_id
# Handle the special cases
if model_id.lower() == "google":
self.model_id = "google"
# Use Google gemini free tier
GEM_KEY=os.environ["GOOGLE_API_KEY"]
self.model = smolagents.OpenAIServerModel(
model_id="gemini-2.0-flash",
api_base="https://generativelanguage.googleapis.com/v1beta/openai/",
api_key=GEM_KEY,
temperature=0.3)
elif model_id.lower() == "local":
self.model_id = "Qwen/Qwen3-4B-FP8"
# Run locally.
self.model = smolagents.TransformersModel(
model_id=self.model_id,
max_new_tokens=32000,
temperature=0.3
)
else:
self.model_id = "Qwen/Qwen3-32B"
if not self.model:
self.model = smolagents.HfApiModel(
max_tokens=32000,
temperature=0.3,
model_id=self.model_id,
custom_role_conversions=None,
)
print(f"NEW2: BasicAgent {self.model_id=} {self.model=}")
web_search_tools = [
smolagents.DuckDuckGoSearchTool(),
smolagents.VisitWebpageTool(),
smolagents.FinalAnswerTool()
]
print("BasicAgent making search tool.")
self.web_search_agent = smolagents.CodeAgent(
name="web_search_agent",
description="Search the web",
model=self.model,
tools=web_search_tools,
max_steps=6,
verbosity_level=2,
planning_interval=None,
additional_authorized_imports=["duckduckgo_search"],
)
wiki_search_tools = [
smolagents.WikipediaSearchTool(),
smolagents.VisitWebpageTool(),
smolagents.FinalAnswerTool()
]
self.wiki_search_agent = smolagents.CodeAgent(
name="wikipedia_search_agent",
description="Search wikipedia",
model=self.model,
tools=wiki_search_tools,
max_steps=6,
verbosity_level=2,
planning_interval=None,
additional_authorized_imports=["wikipedia-api"],
)
print("BasicAgent making wikipedia search tool.")
print("BasicAgent making manager.")
self.manager_agent = smolagents.CodeAgent(
name="manager_agent",
description="Manger of other agents",
tools=[smolagents.FinalAnswerTool()],
model=self.model,
max_steps=10,
verbosity_level=2,
planning_interval=None,
additional_authorized_imports=["duckduckgo_search", "wikipedia-api"],
managed_agents=[self.web_search_agent, self.wiki_search_agent])
def __call__(self, question: str) -> str:
# Avoid rate limiting issues
if self.model_id == "google":
time.sleep(1)
print(f"NEW Agent received question (first 50 chars): {question[:50]}...")
prompt = f"{SYSTEM_PROMPT}\n\n{question}"
answer = self.manager_agent.run(prompt)
print(f"NEW {answer=}")
return answer