Spaces:
Sleeping
Sleeping
from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool | |
import datetime | |
import requests | |
import pytz | |
import yaml | |
from tools.final_answer import FinalAnswerTool | |
# Import vos outils personnalisés | |
from tools.visit_webpage import VisitWebpageTool | |
from tools.web_search import DuckDuckGoSearchTool | |
from Gradio_UI import GradioUI | |
# Below is an example of a tool that does nothing. Amaze us with your creativity ! | |
def task_manager(action: str, task_id: str = None, description: str = None, priority: str = None) -> str: | |
"""Un outil pour gérer une liste de tâches avec priorités. | |
Args: | |
action: L'action à effectuer ('add', 'list', 'complete', 'delete') | |
task_id: L'identifiant de la tâche (pour complete/delete) | |
description: La description de la tâche (pour add) | |
priority: La priorité de la tâche ('high', 'medium', 'low') (pour add) | |
""" | |
import os | |
import json | |
# Fichier de stockage des tâches | |
tasks_file = "agent_tasks.json" | |
# Charger les tâches existantes | |
if os.path.exists(tasks_file): | |
with open(tasks_file, 'r') as f: | |
try: | |
tasks = json.load(f) | |
except: | |
tasks = [] | |
else: | |
tasks = [] | |
if action == "add" and description: | |
# Générer un ID simple | |
task_id = str(len(tasks) + 1) | |
task = { | |
"id": task_id, | |
"description": description, | |
"priority": priority or "medium", | |
"completed": False | |
} | |
tasks.append(task) | |
with open(tasks_file, 'w') as f: | |
json.dump(tasks, f) | |
return f"Tâche ajoutée avec ID: {task_id}" | |
elif action == "list": | |
if not tasks: | |
return "Aucune tâche trouvée." | |
result = "Liste des tâches:\n" | |
for task in tasks: | |
status = "✓" if task["completed"] else "□" | |
result += f"{status} [{task['id']}] ({task['priority']}) {task['description']}\n" | |
return result | |
elif action == "complete" and task_id: | |
for task in tasks: | |
if task["id"] == task_id: | |
task["completed"] = True | |
with open(tasks_file, 'w') as f: | |
json.dump(tasks, f) | |
return f"Tâche {task_id} marquée comme terminée." | |
return f"Tâche {task_id} non trouvée." | |
elif action == "delete" and task_id: | |
tasks = [task for task in tasks if task["id"] != task_id] | |
with open(tasks_file, 'w') as f: | |
json.dump(tasks, f) | |
return f"Tâche {task_id} supprimée." | |
return "Action non reconnue. Utilisez 'add', 'list', 'complete', ou 'delete'." | |
def timer_tool(action: str, duration: int = None, timer_name: str = "default") -> str: | |
"""Un outil pour gérer des minuteurs et chronomètres. | |
Args: | |
action: L'action à effectuer ('start', 'check', 'stop') | |
duration: Durée en secondes pour le minuteur (uniquement pour 'start') | |
timer_name: Nom du minuteur/chronomètre (optionnel) | |
""" | |
import os | |
import json | |
import time | |
timers_file = "agent_timers.json" | |
# Charger les minuteurs existants | |
if os.path.exists(timers_file): | |
with open(timers_file, 'r') as f: | |
try: | |
timers = json.load(f) | |
except: | |
timers = {} | |
else: | |
timers = {} | |
current_time = time.time() | |
if action == "start": | |
if duration: | |
# C'est un minuteur | |
timers[timer_name] = { | |
"type": "timer", | |
"start_time": current_time, | |
"duration": duration, | |
"end_time": current_time + duration | |
} | |
result = f"Minuteur '{timer_name}' démarré pour {duration} secondes." | |
else: | |
# C'est un chronomètre | |
timers[timer_name] = { | |
"type": "stopwatch", | |
"start_time": current_time | |
} | |
result = f"Chronomètre '{timer_name}' démarré." | |
with open(timers_file, 'w') as f: | |
json.dump(timers, f) | |
return result | |
elif action == "check": | |
if timer_name not in timers: | |
return f"Aucun minuteur/chronomètre nommé '{timer_name}' trouvé." | |
timer = timers[timer_name] | |
if timer["type"] == "timer": | |
remaining = timer["end_time"] - current_time | |
if remaining <= 0: | |
return f"Le minuteur '{timer_name}' est terminé !" | |
else: | |
return f"Il reste {int(remaining)} secondes sur le minuteur '{timer_name}'." | |
else: | |
elapsed = current_time - timer["start_time"] | |
return f"Le chronomètre '{timer_name}' est en cours depuis {int(elapsed)} secondes." | |
elif action == "stop": | |
if timer_name not in timers: | |
return f"Aucun minuteur/chronomètre nommé '{timer_name}' trouvé." | |
timer = timers[timer_name] | |
if timer["type"] == "timer": | |
remaining = timer["end_time"] - current_time | |
if remaining <= 0: | |
message = f"Le minuteur '{timer_name}' était déjà terminé." | |
else: | |
message = f"Le minuteur '{timer_name}' arrêté. Il restait {int(remaining)} secondes." | |
else: | |
elapsed = current_time - timer["start_time"] | |
message = f"Chronomètre '{timer_name}' arrêté après {int(elapsed)} secondes." | |
del timers[timer_name] | |
with open(timers_file, 'w') as f: | |
json.dump(timers, f) | |
return message | |
return "Action non reconnue. Utilisez 'start', 'check', ou 'stop'." | |
def inspiration_generator(mode: str = "quote", theme: str = None, length: str = "medium") -> str: | |
"""Un outil qui génère des phrases inspirantes, des mantras ou des défis créatifs aléatoires. | |
Args: | |
mode: Type de contenu à générer ('quote', 'mantra', 'challenge') | |
theme: Thème optionnel (ex: 'success', 'creativity', 'health') | |
length: Longueur du texte ('short', 'medium', 'long') | |
""" | |
import random | |
# Bases de données de citations par thème | |
quotes = { | |
"success": [ | |
"Le succès n'est pas final, l'échec n'est pas fatal : c'est le courage de continuer qui compte.", | |
"Le succès, c'est d'aller d'échec en échec sans perdre son enthousiasme.", | |
"Le succès semble être lié à l'action. Les gens qui réussissent sont ceux qui bougent.", | |
], | |
"creativity": [ | |
"La créativité, c'est l'intelligence qui s'amuse.", | |
"Tout ce que vous pouvez imaginer est réel.", | |
"La créativité n'attend pas l'inspiration, elle la provoque.", | |
], | |
"health": [ | |
"La santé n'est pas tout, mais sans la santé tout n'est rien.", | |
"Prendre soin de son corps est une nécessité, pas un luxe.", | |
"Votre corps est le temple de votre âme, prenez-en soin.", | |
], | |
"general": [ | |
"Le meilleur moment pour planter un arbre était il y a 20 ans. Le deuxième meilleur moment est maintenant.", | |
"Ne jugez pas chaque jour par ce que vous récoltez, mais par les graines que vous plantez.", | |
"La seule limite à notre réalisation de demain sera nos doutes d'aujourd'hui.", | |
] | |
} | |
# Mantras par thème | |
mantras = { | |
"success": [ | |
"Je suis capable de réussir tout ce que j'entreprends.", | |
"Chaque jour, je me rapproche de mes objectifs.", | |
"Je transforme les obstacles en opportunités." | |
], | |
"creativity": [ | |
"Mon esprit est une source infinie d'idées nouvelles.", | |
"Je vois des possibilités là où d'autres voient des limites.", | |
"Ma créativité s'exprime librement dans tout ce que je fais." | |
], | |
"health": [ | |
"Mon corps est fort, mon esprit est clair.", | |
"Je choisis la santé et le bien-être chaque jour.", | |
"Je respecte et honore mon corps à chaque instant." | |
], | |
"general": [ | |
"Je suis exactement là où je dois être.", | |
"Je suis en paix avec ce qui est, et enthousiaste pour ce qui vient.", | |
"Aujourd'hui, j'accueille toutes les possibilités." | |
] | |
} | |
# Défis créatifs par thème | |
challenges = { | |
"success": [ | |
"Identifiez trois obstacles à votre succès et trouvez une solution pour chacun aujourd'hui.", | |
"Contactez quelqu'un qui a réussi dans votre domaine et demandez-lui son meilleur conseil.", | |
"Définissez trois petites victoires que vous pouvez accomplir aujourd'hui." | |
], | |
"creativity": [ | |
"Créez quelque chose en utilisant uniquement des objets bleus.", | |
"Écrivez une histoire de 50 mots qui commence et finit par le même mot.", | |
"Dessinez votre idée avec votre main non dominante." | |
], | |
"health": [ | |
"Essayez une nouvelle recette saine que vous n'avez jamais préparée auparavant.", | |
"Faites une séance d'exercice de 7 minutes sans équipement.", | |
"Méditez pendant 5 minutes en vous concentrant uniquement sur votre respiration." | |
], | |
"general": [ | |
"Faites quelque chose aujourd'hui que vous remettez à plus tard depuis longtemps.", | |
"Écrivez trois choses pour lesquelles vous êtes reconnaissant(e) et pourquoi.", | |
"Passez une heure sans technologie et notez comment vous vous sentez." | |
] | |
} | |
# Sélectionner la base de données appropriée | |
if mode == "quote": | |
database = quotes | |
elif mode == "mantra": | |
database = mantras | |
elif mode == "challenge": | |
database = challenges | |
else: | |
return "Mode non reconnu. Utilisez 'quote', 'mantra', ou 'challenge'." | |
# Sélectionner le thème | |
if theme and theme in database: | |
selected_theme = theme | |
else: | |
selected_theme = random.choice(list(database.keys())) | |
# Sélectionner le contenu en fonction de la longueur | |
options = database[selected_theme] | |
if length == "short": | |
# Sélectionner le plus court | |
result = min(options, key=len) | |
elif length == "long": | |
# Sélectionner le plus long | |
result = max(options, key=len) | |
else: | |
# Sélectionner aléatoirement | |
result = random.choice(options) | |
return result | |
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, | |
task_manager, | |
timer_tool, | |
inspiration_generator, | |
get_current_time_in_timezone | |
], ## 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() |