Hetfield08's picture
Update app.py
0678f1b verified
from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool
import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool
from duckduckgo_search import DDGS
import requests
from bs4 import BeautifulSoup
import time
from Gradio_UI import GradioUI
# Below is an example of a tool that does nothing. Amaze us with your creativity !
@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 ?"
#from datasets import load_dataset
#ds = load_dataset("nfliu/decontextualization")
def get_page_content(page_url):
"""
Obtiene el contenido de una página web
"""
if not page_url or page_url == 'No URL available':
return "No content available - invalid URL"
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(page_url, headers=headers, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
# Eliminar scripts y estilos
for script in soup(["script", "style"]):
script.decompose()
text = soup.get_text()
lines = (line.strip() for line in text.splitlines())
text = ' '.join(chunk for chunk in lines if chunk)
return text[:1000]
except Exception as e:
return f"Error accessing the page: {str(e)}"
@tool
def answer_nfl_question_tool(question: str) -> str:
"""
A tool that answers the user's questions about the NFL rules, tactics and players.
Args:
question: The user's question that agent have to lookup the answer using the DuckDuckGo browser
"""
try:
search_query = f"NFL {question}"
print(f"🔍 Searching DuckDuckGo with query: {search_query}")
with DDGS() as ddgs:
search_results = list(ddgs.text(search_query, max_results=3))
print(f"📊 Found {len(search_results)} results")
if not search_results:
return "❌ No results found for this question."
detailed_results = []
detailed_results.append(f"Search Results for: {search_query}\n")
detailed_results.append("=" * 50 + "\n")
for i, result in enumerate(search_results, 1):
# Verificar que result es un diccionario y tiene las claves necesarias
if not isinstance(result, dict):
continue
page_url = result.get('link') or result.get('url')
if not page_url:
continue
title = result.get('title', 'No title available')
detailed_results.append(f"\nSource {i}: {page_url}\n")
detailed_results.append("-" * 30 + "\n")
detailed_results.append(f"Title: {title}\n")
print(f"📄 Accessing page {i}...")
page_content = get_page_content(page_url)
detailed_results.append(f"Content: {page_content}\n")
time.sleep(1)
return "\n".join(detailed_results)
except Exception as e:
return f"Error during search: {str(e)}"
@tool
def tool_calculator(num1: int, num2: int, operation: str) -> int:
"""
A tool that performs an airthmetic operation on the input two numbers. takes two numbers and an operation as inputs.
Args:
num1: The first number
num2: The second number
operation: The mathematical operation (e.g., 'add', 'subtract', 'multiply', 'divide')
"""
# Validate that inputs are numbers
if not isinstance(num1, (int, float)) or not isinstance(num2, (int, float)):
return "Error: Inputs must be numbers."
# Perform the requested operation
if operation == "add":
return num1 + num2
elif operation == "subtract":
return num1 - num2
elif operation == "multiply":
return num1 * num2
elif operation == "divide":
# Check for division by zero
if num2 == 0:
return "Error: Division by zero is not allowed."
return num1 / num2
else:
return "Error: Invalid operation. Choose from 'add', 'subtract', 'multiply', 'divide'."
@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)}"
final_answer = FinalAnswerTool()
# If the agent does not answer, the model is overloaded, please use another model or the following Hugging Face Endpoint that also contains qwen2.5 coder:
# model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud'
model = HfApiModel(
max_tokens=2096,
temperature=0.5,
model_id='Qwen/Qwen2.5-Coder-32B-Instruct',# it is possible that this model may be overloaded
custom_role_conversions=None,
)
# Import tool from Hub
#image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
with open("prompts.yaml", 'r') as stream:
prompt_templates = yaml.safe_load(stream)
agent = CodeAgent(
model=model,
tools=[final_answer,tool_calculator,answer_nfl_question_tool], ## add your tools here (don't remove final answer)
max_steps=6,
verbosity_level=1,
grammar=None,
planning_interval=None,
name=None,
description=None,
prompt_templates=prompt_templates
)
GradioUI(agent).launch()