A1843 commited on
Commit
65a6edf
·
verified ·
1 Parent(s): d232380

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +97 -51
app.py CHANGED
@@ -1,65 +1,111 @@
1
- from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool
2
- import datetime
3
  import requests
4
- import pytz
5
- import yaml
6
- from tools.final_answer import FinalAnswerTool
7
 
8
- 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 my_custom_tool(arg1:str, arg2:int)-> str: # it's important to specify the return type
13
- # Keep this format for the tool description / args description but feel free to modify the tool
14
- """A tool that does nothing yet
15
- Args:
16
- arg1: the first argument
17
- arg2: the second argument
18
  """
19
- return "What magic will you build ?"
 
 
 
 
 
20
 
21
- @tool
22
- def get_current_time_in_timezone(timezone: str) -> str:
23
- """A tool that fetches the current local time in a specified timezone.
24
- Args:
25
- timezone: A string representing a valid timezone (e.g., 'America/New_York').
26
  """
27
- try:
28
- # Create timezone object
29
- tz = pytz.timezone(timezone)
30
- # Get current time in that timezone
31
- local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
32
- return f"The current local time in {timezone} is: {local_time}"
33
- except Exception as e:
34
- return f"Error fetching time for timezone '{timezone}': {str(e)}"
35
 
 
 
 
 
 
36
 
37
- final_answer = FinalAnswerTool()
38
- model = HfApiModel(
39
- max_tokens=2096,
40
- temperature=0.5,
41
- model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
42
- custom_role_conversions=None,
43
- )
 
 
 
 
 
 
 
 
 
 
 
 
44
 
 
 
 
 
 
 
 
 
 
45
 
46
- # Import tool from Hub
47
- image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
48
 
49
- with open("prompts.yaml", 'r') as stream:
50
- prompt_templates = yaml.safe_load(stream)
 
 
 
 
51
 
52
- agent = CodeAgent(
53
- model=model,
54
- tools=[final_answer], # add your tools here (don't remove final_answer)
55
- max_steps=6,
56
- verbosity_level=1,
57
- grammar=None,
58
- planning_interval=None,
59
- name=None,
60
- description=None,
61
- prompt_templates=prompt_templates
62
- )
 
 
 
 
 
 
 
 
 
 
 
 
63
 
 
 
64
 
65
- GradioUI(agent).launch()
 
 
 
 
 
 
 
 
 
1
  import requests
2
+ from bs4 import BeautifulSoup
3
+ from functools import wraps
4
+ from typing import Callable, Any, List, Union
5
 
6
+ class Tool:
7
+ """
8
+ Représente un outil réutilisable pour l'agent.
9
 
10
+ Attributs:
11
+ name (str): Nom descriptif de l'outil.
12
+ description (str): Description détaillée de l'outil.
13
+ func (Callable): La fonction que l'outil exécute.
14
+ arguments (List[str]): Liste des arguments requis par la fonction.
15
+ outputs (Union[str, List[str]]): Description des sorties produites par l'outil.
 
 
16
  """
17
+ def __init__(self, name: str, description: str, func: Callable, arguments: List[str], outputs: Union[str, List[str]]):
18
+ self.name = name
19
+ self.description = description
20
+ self.func = func
21
+ self.arguments = arguments
22
+ self.outputs = outputs
23
 
24
+ def run(self, *args, **kwargs) -> Any:
25
+ """Exécute la fonction associée à l'outil."""
26
+ return self.func(*args, **kwargs)
27
+
28
+ def tool(name: str = None, description: str = "", arguments: List[str] = None, outputs: Union[str, List[str]] = None):
29
  """
30
+ Décorateur pour transformer une fonction en instance de Tool.
 
 
 
 
 
 
 
31
 
32
+ Args:
33
+ name (str): Nom de l'outil. Si None, le nom de la fonction sera utilisé.
34
+ description (str): Description détaillée de l'outil.
35
+ arguments (List[str]): Liste des arguments requis par la fonction.
36
+ outputs (Union[str, List[str]]): Description des sorties produites par l'outil.
37
 
38
+ Returns:
39
+ Callable: Une instance de Tool contenant la fonction décorée.
40
+ """
41
+ def decorator(func: Callable) -> Tool:
42
+ tool_name = name if name is not None else func.__name__
43
+ tool_arguments = arguments if arguments is not None else []
44
+ tool_outputs = outputs if outputs is not None else ""
45
+ @wraps(func)
46
+ def wrapper(*args, **kwargs):
47
+ return func(*args, **kwargs)
48
+ # Retourne une instance de Tool associée à la fonction
49
+ return Tool(
50
+ name=tool_name,
51
+ description=description or func.__doc__,
52
+ func=func,
53
+ arguments=tool_arguments,
54
+ outputs=tool_outputs
55
+ )
56
+ return decorator
57
 
58
+ @tool(
59
+ name="RechercheLegifrance",
60
+ description="Outil pour effectuer une recherche sur Légifrance par mot-clé et extraire le premier résultat.",
61
+ arguments=["query (str)"],
62
+ outputs="dict (contenant 'url' et 'titre')"
63
+ )
64
+ def recherche(query: str) -> dict:
65
+ """
66
+ Recherche sur Légifrance un mot-clé donné.
67
 
68
+ Args:
69
+ query (str): Le mot-clé à rechercher.
70
 
71
+ Returns:
72
+ dict: Dictionnaire contenant l'URL et le titre du premier résultat.
73
+ """
74
+ # URL de base pour la recherche (à adapter selon la structure réelle du site)
75
+ url_search = "https://www.legifrance.gouv.fr/search"
76
+ params = {"query": query}
77
 
78
+ response = requests.get(url_search, params=params)
79
+ if response.status_code != 200:
80
+ raise Exception("Erreur lors de la requête vers Légifrance")
81
+
82
+ soup = BeautifulSoup(response.text, 'html.parser')
83
+ # Analyse du HTML pour trouver le bloc contenant les résultats.
84
+ # Ici, on suppose que chaque résultat se trouve dans une balise <div class="result">
85
+ results = soup.find_all("div", class_="result")
86
+
87
+ if not results:
88
+ return {"url": None, "titre": None}
89
+
90
+ # Extraction du premier résultat
91
+ premier = results[0]
92
+ a_tag = premier.find("a")
93
+ url_result = a_tag.get("href")
94
+ titre = a_tag.get_text(strip=True)
95
+
96
+ # Compléter l'URL si elle est relative
97
+ if url_result and not url_result.startswith("http"):
98
+ url_result = "https://www.legifrance.gouv.fr" + url_result
99
+
100
+ return {"url": url_result, "titre": titre}
101
 
102
+ # On peut maintenant utiliser la fonction décorée comme un outil
103
+ outil_recherche = recherche
104
 
105
+ # Exemple de test :
106
+ if __name__ == "__main__":
107
+ try:
108
+ result = outil_recherche.run("contrat de travail")
109
+ print("Résultat de la recherche :", result)
110
+ except Exception as e:
111
+ print("Erreur :", e)