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() |