File size: 4,171 Bytes
34d197c
 
 
9b27e1d
34d197c
9d098dd
 
34d197c
 
9d098dd
 
 
9b27e1d
 
9d098dd
 
 
cc9ee3d
34d197c
9d098dd
cc9ee3d
 
 
 
 
9b27e1d
 
 
cc9ee3d
 
9b27e1d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cc9ee3d
 
9d098dd
9b27e1d
 
 
 
 
 
 
 
 
7376a97
cc9ee3d
 
 
 
9d098dd
cc9ee3d
7376a97
 
cc9ee3d
 
7376a97
cc9ee3d
 
 
 
 
9d098dd
7376a97
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cc9ee3d
 
 
 
 
 
7376a97
cc9ee3d
 
7376a97
 
34d197c
cc9ee3d
9b27e1d
 
 
 
cc9ee3d
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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