Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -9,14 +9,271 @@ from Gradio_UI import GradioUI
|
|
| 9 |
|
| 10 |
# Below is an example of a tool that does nothing. Amaze us with your creativity !
|
| 11 |
@tool
|
| 12 |
-
def
|
| 13 |
-
|
| 14 |
-
|
| 15 |
Args:
|
| 16 |
-
|
| 17 |
-
|
|
|
|
|
|
|
| 18 |
"""
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
|
| 21 |
@tool
|
| 22 |
def get_current_time_in_timezone(timezone: str) -> str:
|
|
@@ -55,7 +312,13 @@ with open("prompts.yaml", 'r') as stream:
|
|
| 55 |
|
| 56 |
agent = CodeAgent(
|
| 57 |
model=model,
|
| 58 |
-
tools=[
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
max_steps=6,
|
| 60 |
verbosity_level=1,
|
| 61 |
grammar=None,
|
|
|
|
| 9 |
|
| 10 |
# Below is an example of a tool that does nothing. Amaze us with your creativity !
|
| 11 |
@tool
|
| 12 |
+
def task_manager(action: str, task_id: str = None, description: str = None, priority: str = None) -> str:
|
| 13 |
+
"""Un outil pour gérer une liste de tâches avec priorités.
|
| 14 |
+
|
| 15 |
Args:
|
| 16 |
+
action: L'action à effectuer ('add', 'list', 'complete', 'delete')
|
| 17 |
+
task_id: L'identifiant de la tâche (pour complete/delete)
|
| 18 |
+
description: La description de la tâche (pour add)
|
| 19 |
+
priority: La priorité de la tâche ('high', 'medium', 'low') (pour add)
|
| 20 |
"""
|
| 21 |
+
import os
|
| 22 |
+
import json
|
| 23 |
+
|
| 24 |
+
# Fichier de stockage des tâches
|
| 25 |
+
tasks_file = "agent_tasks.json"
|
| 26 |
+
|
| 27 |
+
# Charger les tâches existantes
|
| 28 |
+
if os.path.exists(tasks_file):
|
| 29 |
+
with open(tasks_file, 'r') as f:
|
| 30 |
+
try:
|
| 31 |
+
tasks = json.load(f)
|
| 32 |
+
except:
|
| 33 |
+
tasks = []
|
| 34 |
+
else:
|
| 35 |
+
tasks = []
|
| 36 |
+
|
| 37 |
+
if action == "add" and description:
|
| 38 |
+
# Générer un ID simple
|
| 39 |
+
task_id = str(len(tasks) + 1)
|
| 40 |
+
task = {
|
| 41 |
+
"id": task_id,
|
| 42 |
+
"description": description,
|
| 43 |
+
"priority": priority or "medium",
|
| 44 |
+
"completed": False
|
| 45 |
+
}
|
| 46 |
+
tasks.append(task)
|
| 47 |
+
with open(tasks_file, 'w') as f:
|
| 48 |
+
json.dump(tasks, f)
|
| 49 |
+
return f"Tâche ajoutée avec ID: {task_id}"
|
| 50 |
+
|
| 51 |
+
elif action == "list":
|
| 52 |
+
if not tasks:
|
| 53 |
+
return "Aucune tâche trouvée."
|
| 54 |
+
|
| 55 |
+
result = "Liste des tâches:\n"
|
| 56 |
+
for task in tasks:
|
| 57 |
+
status = "✓" if task["completed"] else "□"
|
| 58 |
+
result += f"{status} [{task['id']}] ({task['priority']}) {task['description']}\n"
|
| 59 |
+
return result
|
| 60 |
+
|
| 61 |
+
elif action == "complete" and task_id:
|
| 62 |
+
for task in tasks:
|
| 63 |
+
if task["id"] == task_id:
|
| 64 |
+
task["completed"] = True
|
| 65 |
+
with open(tasks_file, 'w') as f:
|
| 66 |
+
json.dump(tasks, f)
|
| 67 |
+
return f"Tâche {task_id} marquée comme terminée."
|
| 68 |
+
return f"Tâche {task_id} non trouvée."
|
| 69 |
+
|
| 70 |
+
elif action == "delete" and task_id:
|
| 71 |
+
tasks = [task for task in tasks if task["id"] != task_id]
|
| 72 |
+
with open(tasks_file, 'w') as f:
|
| 73 |
+
json.dump(tasks, f)
|
| 74 |
+
return f"Tâche {task_id} supprimée."
|
| 75 |
+
|
| 76 |
+
return "Action non reconnue. Utilisez 'add', 'list', 'complete', ou 'delete'."
|
| 77 |
+
|
| 78 |
+
@tool
|
| 79 |
+
def timer_tool(action: str, duration: int = None, timer_name: str = "default") -> str:
|
| 80 |
+
"""Un outil pour gérer des minuteurs et chronomètres.
|
| 81 |
+
|
| 82 |
+
Args:
|
| 83 |
+
action: L'action à effectuer ('start', 'check', 'stop')
|
| 84 |
+
duration: Durée en secondes pour le minuteur (uniquement pour 'start')
|
| 85 |
+
timer_name: Nom du minuteur/chronomètre (optionnel)
|
| 86 |
+
"""
|
| 87 |
+
import os
|
| 88 |
+
import json
|
| 89 |
+
import time
|
| 90 |
+
|
| 91 |
+
timers_file = "agent_timers.json"
|
| 92 |
+
|
| 93 |
+
# Charger les minuteurs existants
|
| 94 |
+
if os.path.exists(timers_file):
|
| 95 |
+
with open(timers_file, 'r') as f:
|
| 96 |
+
try:
|
| 97 |
+
timers = json.load(f)
|
| 98 |
+
except:
|
| 99 |
+
timers = {}
|
| 100 |
+
else:
|
| 101 |
+
timers = {}
|
| 102 |
+
|
| 103 |
+
current_time = time.time()
|
| 104 |
+
|
| 105 |
+
if action == "start":
|
| 106 |
+
if duration:
|
| 107 |
+
# C'est un minuteur
|
| 108 |
+
timers[timer_name] = {
|
| 109 |
+
"type": "timer",
|
| 110 |
+
"start_time": current_time,
|
| 111 |
+
"duration": duration,
|
| 112 |
+
"end_time": current_time + duration
|
| 113 |
+
}
|
| 114 |
+
result = f"Minuteur '{timer_name}' démarré pour {duration} secondes."
|
| 115 |
+
else:
|
| 116 |
+
# C'est un chronomètre
|
| 117 |
+
timers[timer_name] = {
|
| 118 |
+
"type": "stopwatch",
|
| 119 |
+
"start_time": current_time
|
| 120 |
+
}
|
| 121 |
+
result = f"Chronomètre '{timer_name}' démarré."
|
| 122 |
+
|
| 123 |
+
with open(timers_file, 'w') as f:
|
| 124 |
+
json.dump(timers, f)
|
| 125 |
+
return result
|
| 126 |
+
|
| 127 |
+
elif action == "check":
|
| 128 |
+
if timer_name not in timers:
|
| 129 |
+
return f"Aucun minuteur/chronomètre nommé '{timer_name}' trouvé."
|
| 130 |
+
|
| 131 |
+
timer = timers[timer_name]
|
| 132 |
+
if timer["type"] == "timer":
|
| 133 |
+
remaining = timer["end_time"] - current_time
|
| 134 |
+
if remaining <= 0:
|
| 135 |
+
return f"Le minuteur '{timer_name}' est terminé !"
|
| 136 |
+
else:
|
| 137 |
+
return f"Il reste {int(remaining)} secondes sur le minuteur '{timer_name}'."
|
| 138 |
+
else:
|
| 139 |
+
elapsed = current_time - timer["start_time"]
|
| 140 |
+
return f"Le chronomètre '{timer_name}' est en cours depuis {int(elapsed)} secondes."
|
| 141 |
+
|
| 142 |
+
elif action == "stop":
|
| 143 |
+
if timer_name not in timers:
|
| 144 |
+
return f"Aucun minuteur/chronomètre nommé '{timer_name}' trouvé."
|
| 145 |
+
|
| 146 |
+
timer = timers[timer_name]
|
| 147 |
+
if timer["type"] == "timer":
|
| 148 |
+
remaining = timer["end_time"] - current_time
|
| 149 |
+
if remaining <= 0:
|
| 150 |
+
message = f"Le minuteur '{timer_name}' était déjà terminé."
|
| 151 |
+
else:
|
| 152 |
+
message = f"Le minuteur '{timer_name}' arrêté. Il restait {int(remaining)} secondes."
|
| 153 |
+
else:
|
| 154 |
+
elapsed = current_time - timer["start_time"]
|
| 155 |
+
message = f"Chronomètre '{timer_name}' arrêté après {int(elapsed)} secondes."
|
| 156 |
+
|
| 157 |
+
del timers[timer_name]
|
| 158 |
+
with open(timers_file, 'w') as f:
|
| 159 |
+
json.dump(timers, f)
|
| 160 |
+
return message
|
| 161 |
+
|
| 162 |
+
return "Action non reconnue. Utilisez 'start', 'check', ou 'stop'."
|
| 163 |
+
|
| 164 |
+
@tool
|
| 165 |
+
def inspiration_generator(mode: str = "quote", theme: str = None, length: str = "medium") -> str:
|
| 166 |
+
"""Un outil qui génère des phrases inspirantes, des mantras ou des défis créatifs aléatoires.
|
| 167 |
+
|
| 168 |
+
Args:
|
| 169 |
+
mode: Type de contenu à générer ('quote', 'mantra', 'challenge')
|
| 170 |
+
theme: Thème optionnel (ex: 'success', 'creativity', 'health')
|
| 171 |
+
length: Longueur du texte ('short', 'medium', 'long')
|
| 172 |
+
"""
|
| 173 |
+
import random
|
| 174 |
+
|
| 175 |
+
# Bases de données de citations par thème
|
| 176 |
+
quotes = {
|
| 177 |
+
"success": [
|
| 178 |
+
"Le succès n'est pas final, l'échec n'est pas fatal : c'est le courage de continuer qui compte.",
|
| 179 |
+
"Le succès, c'est d'aller d'échec en échec sans perdre son enthousiasme.",
|
| 180 |
+
"Le succès semble être lié à l'action. Les gens qui réussissent sont ceux qui bougent.",
|
| 181 |
+
],
|
| 182 |
+
"creativity": [
|
| 183 |
+
"La créativité, c'est l'intelligence qui s'amuse.",
|
| 184 |
+
"Tout ce que vous pouvez imaginer est réel.",
|
| 185 |
+
"La créativité n'attend pas l'inspiration, elle la provoque.",
|
| 186 |
+
],
|
| 187 |
+
"health": [
|
| 188 |
+
"La santé n'est pas tout, mais sans la santé tout n'est rien.",
|
| 189 |
+
"Prendre soin de son corps est une nécessité, pas un luxe.",
|
| 190 |
+
"Votre corps est le temple de votre âme, prenez-en soin.",
|
| 191 |
+
],
|
| 192 |
+
"general": [
|
| 193 |
+
"Le meilleur moment pour planter un arbre était il y a 20 ans. Le deuxième meilleur moment est maintenant.",
|
| 194 |
+
"Ne jugez pas chaque jour par ce que vous récoltez, mais par les graines que vous plantez.",
|
| 195 |
+
"La seule limite à notre réalisation de demain sera nos doutes d'aujourd'hui.",
|
| 196 |
+
]
|
| 197 |
+
}
|
| 198 |
+
|
| 199 |
+
# Mantras par thème
|
| 200 |
+
mantras = {
|
| 201 |
+
"success": [
|
| 202 |
+
"Je suis capable de réussir tout ce que j'entreprends.",
|
| 203 |
+
"Chaque jour, je me rapproche de mes objectifs.",
|
| 204 |
+
"Je transforme les obstacles en opportunités."
|
| 205 |
+
],
|
| 206 |
+
"creativity": [
|
| 207 |
+
"Mon esprit est une source infinie d'idées nouvelles.",
|
| 208 |
+
"Je vois des possibilités là où d'autres voient des limites.",
|
| 209 |
+
"Ma créativité s'exprime librement dans tout ce que je fais."
|
| 210 |
+
],
|
| 211 |
+
"health": [
|
| 212 |
+
"Mon corps est fort, mon esprit est clair.",
|
| 213 |
+
"Je choisis la santé et le bien-être chaque jour.",
|
| 214 |
+
"Je respecte et honore mon corps à chaque instant."
|
| 215 |
+
],
|
| 216 |
+
"general": [
|
| 217 |
+
"Je suis exactement là où je dois être.",
|
| 218 |
+
"Je suis en paix avec ce qui est, et enthousiaste pour ce qui vient.",
|
| 219 |
+
"Aujourd'hui, j'accueille toutes les possibilités."
|
| 220 |
+
]
|
| 221 |
+
}
|
| 222 |
+
|
| 223 |
+
# Défis créatifs par thème
|
| 224 |
+
challenges = {
|
| 225 |
+
"success": [
|
| 226 |
+
"Identifiez trois obstacles à votre succès et trouvez une solution pour chacun aujourd'hui.",
|
| 227 |
+
"Contactez quelqu'un qui a réussi dans votre domaine et demandez-lui son meilleur conseil.",
|
| 228 |
+
"Définissez trois petites victoires que vous pouvez accomplir aujourd'hui."
|
| 229 |
+
],
|
| 230 |
+
"creativity": [
|
| 231 |
+
"Créez quelque chose en utilisant uniquement des objets bleus.",
|
| 232 |
+
"Écrivez une histoire de 50 mots qui commence et finit par le même mot.",
|
| 233 |
+
"Dessinez votre idée avec votre main non dominante."
|
| 234 |
+
],
|
| 235 |
+
"health": [
|
| 236 |
+
"Essayez une nouvelle recette saine que vous n'avez jamais préparée auparavant.",
|
| 237 |
+
"Faites une séance d'exercice de 7 minutes sans équipement.",
|
| 238 |
+
"Méditez pendant 5 minutes en vous concentrant uniquement sur votre respiration."
|
| 239 |
+
],
|
| 240 |
+
"general": [
|
| 241 |
+
"Faites quelque chose aujourd'hui que vous remettez à plus tard depuis longtemps.",
|
| 242 |
+
"Écrivez trois choses pour lesquelles vous êtes reconnaissant(e) et pourquoi.",
|
| 243 |
+
"Passez une heure sans technologie et notez comment vous vous sentez."
|
| 244 |
+
]
|
| 245 |
+
}
|
| 246 |
+
|
| 247 |
+
# Sélectionner la base de données appropriée
|
| 248 |
+
if mode == "quote":
|
| 249 |
+
database = quotes
|
| 250 |
+
elif mode == "mantra":
|
| 251 |
+
database = mantras
|
| 252 |
+
elif mode == "challenge":
|
| 253 |
+
database = challenges
|
| 254 |
+
else:
|
| 255 |
+
return "Mode non reconnu. Utilisez 'quote', 'mantra', ou 'challenge'."
|
| 256 |
+
|
| 257 |
+
# Sélectionner le thème
|
| 258 |
+
if theme and theme in database:
|
| 259 |
+
selected_theme = theme
|
| 260 |
+
else:
|
| 261 |
+
selected_theme = random.choice(list(database.keys()))
|
| 262 |
+
|
| 263 |
+
# Sélectionner le contenu en fonction de la longueur
|
| 264 |
+
options = database[selected_theme]
|
| 265 |
+
|
| 266 |
+
if length == "short":
|
| 267 |
+
# Sélectionner le plus court
|
| 268 |
+
result = min(options, key=len)
|
| 269 |
+
elif length == "long":
|
| 270 |
+
# Sélectionner le plus long
|
| 271 |
+
result = max(options, key=len)
|
| 272 |
+
else:
|
| 273 |
+
# Sélectionner aléatoirement
|
| 274 |
+
result = random.choice(options)
|
| 275 |
+
|
| 276 |
+
return result
|
| 277 |
|
| 278 |
@tool
|
| 279 |
def get_current_time_in_timezone(timezone: str) -> str:
|
|
|
|
| 312 |
|
| 313 |
agent = CodeAgent(
|
| 314 |
model=model,
|
| 315 |
+
tools=[
|
| 316 |
+
final_answer,
|
| 317 |
+
task_manager,
|
| 318 |
+
timer_tool,
|
| 319 |
+
inspiration_generator,
|
| 320 |
+
get_current_time_in_timezone
|
| 321 |
+
], ## add your tools here (don't remove final answer)
|
| 322 |
max_steps=6,
|
| 323 |
verbosity_level=1,
|
| 324 |
grammar=None,
|