anisseIlluin's picture
Update app.py
d344eb7 verified
from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool
import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool
import numpy as np
from typing import Tuple
from Gradio_UI import GradioUI
# Below is an example of a tool that does nothing. Amaze us with your creativity !
@tool
def get_age_univers(arg1:datetime, arg2:float)-> 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 computes the age of a universe in a given date based on the vacuum energy
Args:
arg1: the date on which we want to compute the age of the univers
arg2: the vacuum energy in GeV
"""
return "The age of the universe is 14 point 5 billion years"
@tool
def compute_vacuum_energy(L: float, N_max: int, hbar: float=1.0545718e-34, c: float=3e8)->float:
"""
Compute the vacuum (zero-point) energy of a scalar field in a 3D box.
Args:
L: Length of the cubic box in meters.
N_max: Maximum mode number in each direction (for cutoff/regularization).
hbar: Reduced Planck constant (default is SI units).
c: Speed of light (default is SI units).
Returns:
float: Total vacuum energy in joules.
"""
energy = 0.0
for nx in range(1, N_max + 1):
for ny in range(1, N_max + 1):
for nz in range(1, N_max + 1):
# Compute magnitude of k-vector
k = np.pi * np.sqrt(nx**2 + ny**2 + nz**2) / L
omega = c * k
energy += 0.5 * hbar * omega
return energy
@tool
def compute_universe_color(age_in_gyr: float) -> Tuple[int, int, int]:
"""
Estimate the average color of the universe based on its age.
Args:
age_in_gyr (float): Age of the universe in billions of years (Gyr).
Returns:
Tuple[int, int, int]: RGB color representing the average color of the universe.
"""
# Clamp age to a plausible range (0 - 20 Gyr)
age = max(0.0, min(age_in_gyr, 20.0))
# Approximate color evolution over time in RGB
# 0 Gyr → blue-white (hot stars), 13.8 Gyr → cosmic latte (pale beige), 20 Gyr → reddish
if age < 1.0:
color = (180, 210, 255) # bright blue-white
elif age < 5.0:
color = (240, 230, 255) # softer white
elif age < 9.0:
color = (255, 240, 220) # yellowish
elif age < 13.0:
color = (255, 230, 210) # pale beige
elif age <= 14.0:
color = (255, 223, 196) # "cosmic latte"
else:
color = (240, 200, 180) # redder with star aging
return color
@tool
def convert_energy(value: float, current_unit: str, target_unit: str) -> float:
"""
Convert an energy value from one unit to another.
Args:
value: The energy value to convert.
current_unit: The unit of the input energy (e.g., 'J', 'eV', 'GeV', 'kcal', 'kWh').
target_unit: The desired output unit.
Returns:
float: The converted energy value in the target unit.
Supported units:
- 'J' : Joules
- 'eV' : Electronvolts
- 'GeV' : Giga-electronvolts
- 'kcal' : Kilocalories
- 'kWh' : Kilowatt-hours
"""
UNIT_EQUIVALENT_IN_JOULES: dict[str, float] = {
'j': 1.0,
'ev': 1.602176634e-19,
'gev': 1.602176634e-10,
'kcal': 4184.0,
'kwh': 3.6e6,
}
current_unit = current_unit.strip().lower()
target_unit = target_unit.strip().lower()
supported_units = list(UNIT_EQUIVALENT_IN_JOULES.keys())
if current_unit not in UNIT_EQUIVALENT_IN_JOULES:
raise ValueError(
f"Unsupported current unit: '{current_unit}'.\n"
f"Supported units are: {', '.join(supported_units)}"
)
if target_unit not in UNIT_EQUIVALENT_IN_JOULES:
raise ValueError(
f"Unsupported target unit: '{target_unit}'.\n"
f"Supported units are: {', '.join(supported_units)}"
)
value_in_joules = value * UNIT_EQUIVALENT_IN_JOULES[current_unit]
converted_value = value_in_joules / UNIT_EQUIVALENT_IN_JOULES[target_unit]
return converted_value
@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, image_generation_tool, get_current_time_in_timezone, get_age_univers, convert_energy, compute_vacuum_energy, compute_universe_color], ## 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()