Michel Mesquita
Running locally
a401e2a
# =====================================================================
# Local AI Agent using smolagents with LiteLLM and Ollama
# =====================================================================
# This application creates a local AI agent that can:
# - Search the web using DuckDuckGo
# - Generate images using Hugging Face's text-to-image model
# - Get current time in different timezones
# - Check if a number is prime
# - And more!
#
# IMPORTANT: This agent requires local execution with Ollama running on port 11434
# Remote models from Hugging Face (like Qwen2.5-Coder or Mistral-7B) are often overloaded
# and may return 'Payment Required' errors or be paused by their providers.
#
# Setup requirements:
# 1. Install Ollama (https://ollama.ai/)
# 2. Pull the llama3.2 model: `ollama pull llama3.2`
# 3. Ensure Ollama is running before starting this application
# 4. Install Python dependencies from requirements.txt
# =====================================================================
from smolagents import CodeAgent, DuckDuckGoSearchTool, load_tool, tool
from smolagents.models import LiteLLMModel
import os
import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool
from Gradio_UI import GradioUI
# =====================================================================
# Tool Definitions
# =====================================================================
# Each tool is defined with the @tool decorator and includes docstrings
# that help the agent understand when and how to use each tool.
# =====================================================================
# Simple example tool that can be customized
@tool
def my_custom_tool(arg1:str, arg2:int)-> str: #it's import to specify the return type
#Keep this format for the description / args / args description but feel free to modify the tool
"""A tool that does nothing yet
Args:
arg1: the first argument
arg2: the second argument
"""
return "What magic will you build ?"
@tool
def get_current_time_in_timezone(timezone: str) -> str:
"""A tool that fetches the current local time in a specified timezone.
Args:
timezone: A string representing a valid timezone (e.g., 'America/New_York').
"""
try:
# Create timezone object
tz = pytz.timezone(timezone)
# Get current time in that timezone
local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
return f"The current local time in {timezone} is: {local_time}"
except Exception as e:
return f"Error fetching time for timezone '{timezone}': {str(e)}"
# Import image generation tool from Hugging Face Hub
# This allows the agent to create images based on text prompts
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
@tool
def generate_image(prompt:str) -> str:
"""Generate image(s) from a text prompt via HF text-to-image.
Args:
prompt: description of the image
"""
return image_generation_tool(prompt)
@tool
def duckduckgo_search(query: str, max_results: int = 5) -> str:
"""Search DuckDuckGo for a query and return the top N results.
Args:
query: The search query string to look up on DuckDuckGo
max_results: Maximum number of search results to return (default is 5)
Returns:
A string containing the search results
"""
searcher = DuckDuckGoSearchTool(max_results=max_results)
return searcher(query)
@tool
def is_prime(number: int) -> bool:
"""
Check if a number is prime using an optimized 6k±1 algorithm.
Args:
number: The integer to check for primality.
Returns:
True if `number` is prime, False otherwise.
"""
# Numbers less than 2 are not prime
if number <= 1:
return False
# 2 and 3 are prime
if number <= 3:
return True
# Eliminate multiples of 2 and 3
if number % 2 == 0 or number % 3 == 0:
return False
# Test 6k ± 1 factors up to sqrt(number)
i = 5
while i * i <= number:
if number % i == 0 or number % (i + 2) == 0:
return False
i += 6
return True
# =====================================================================
# Agent Configuration
# =====================================================================
# The FinalAnswerTool is used to provide final responses to the user
final_answer = FinalAnswerTool()
# IMPORTANT: Remote models are often overloaded or require payment
# Previous attempts to use these models resulted in errors:
# - Qwen/Qwen2.5-Coder-32B-Instruct: "Payment Required" error
# - mistralai/Mistral-7B-Instruct-v0.2: Model was paused
#
# Alternative HF endpoint (if needed):
# model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud'
#
# Instead, we use a local Ollama model which is more reliable:
# Configure LiteLLM to use local Ollama instance
os.environ["LITELLM_OLLAMA_API_BASE"] = "http://localhost:11434"
# Initialize the model with appropriate parameters
model = LiteLLMModel(
model_name="ollama/llama3.2", # Using the locally available Llama3.2 model
max_tokens=1024, # Maximum tokens in the response
temperature=0.7, # Controls randomness (higher = more creative)
model_id="ollama/llama3.2" # Explicitly set model_id to avoid default to Claude
)
# =====================================================================
# Agent Initialization
# =====================================================================
# Initialize the agent with the configured model and tools
agent = CodeAgent(
model=model,
# List of tools available to the agent - add new tools here
tools=[
final_answer, # Required for providing final answers
duckduckgo_search, # Web search capability
get_current_time_in_timezone, # Time-related functions
my_custom_tool, # Example custom tool
generate_image, # Image generation
is_prime # Prime number checker
],
max_steps=6, # Maximum reasoning steps per query
verbosity_level=1, # Controls logging detail
grammar=None, # Optional grammar constraints
planning_interval=None, # How often to plan next steps
name=None,
description=None
# Not specifying prompt_templates will use the default ones from smolagents
)
# =====================================================================
# Launch the Gradio Web Interface
# =====================================================================
# This creates a user-friendly web interface for interacting with the agent
# Accessible at http://127.0.0.1:7860 by default
GradioUI(agent).launch()