zvl commited on
Commit
d85e8b1
·
verified ·
1 Parent(s): d4d30da

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +112 -44
app.py CHANGED
@@ -1,18 +1,93 @@
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
  from bs4 import BeautifulSoup
8
-
 
9
  from Gradio_UI import GradioUI
10
 
11
- # Below is an example of a tool that does nothing. Amaze us with your creativity !
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  @tool
13
  def scrape_webpage(url: str, tag: str = "p", class_name: str = None) -> dict:
14
  """Extrae contenido de una página web según una etiqueta HTML y clase opcional.
15
-
16
  Args:
17
  url: URL de la página a scrapear.
18
  tag: Etiqueta HTML a extraer (por defecto <p>).
@@ -22,12 +97,12 @@ def scrape_webpage(url: str, tag: str = "p", class_name: str = None) -> dict:
22
  Un diccionario con el contenido extraído.
23
  """
24
  try:
25
- headers = {'User-Agent': 'Mozilla/5.0'}
26
  response = requests.get(url, headers=headers)
27
  response.raise_for_status()
28
 
29
- soup = BeautifulSoup(response.text, 'html.parser')
30
-
31
  if class_name:
32
  elements = soup.find_all(tag, class_=class_name)
33
  else:
@@ -35,7 +110,7 @@ def scrape_webpage(url: str, tag: str = "p", class_name: str = None) -> dict:
35
 
36
  extracted_data = [element.get_text(strip=True) for element in elements]
37
 
38
- return {"url": url, "scraped_data": extracted_data[:20]} # Limita a 10 resultados
39
 
40
  except requests.exceptions.RequestException as e:
41
  return {"error": f"Error al acceder a la URL: {str(e)}"}
@@ -46,7 +121,7 @@ def scrape_webpage(url: str, tag: str = "p", class_name: str = None) -> dict:
46
  @tool
47
  def extract_metadata_from_url(url: str) -> dict:
48
  """Extrae todos los metadatos de una página web.
49
-
50
  Args:
51
  url: La URL de la página web a analizar.
52
 
@@ -54,73 +129,66 @@ def extract_metadata_from_url(url: str) -> dict:
54
  Un diccionario con los metadatos encontrados.
55
  """
56
  try:
57
- # Obtener el contenido de la página
58
- headers = {'User-Agent': 'Mozilla/5.0'}
59
  response = requests.get(url, headers=headers)
60
- response.raise_for_status() # Lanza un error si el request falla
61
 
62
- # Parsear el contenido HTML con BeautifulSoup
63
- soup = BeautifulSoup(response.text, 'html.parser')
64
 
65
- # Extraer los metadatos de la página
66
  metadata = {}
67
- for meta in soup.find_all('meta'):
68
- if 'name' in meta.attrs and 'content' in meta.attrs:
69
- metadata[meta['name']] = meta['content']
70
- elif 'property' in meta.attrs and 'content' in meta.attrs:
71
- metadata[meta['property']] = meta['content']
72
 
73
  return metadata if metadata else {"error": "No se encontraron metadatos en la página."}
74
 
75
  except requests.exceptions.RequestException as e:
76
  return {"error": f"Error al acceder a la URL: {str(e)}"}
77
 
 
78
  @tool
79
  def get_current_time_in_timezone(timezone: str) -> str:
80
- """A tool that fetches the current local time in a specified timezone.
 
81
  Args:
82
- timezone: A string representing a valid timezone (e.g., 'America/New_York').
 
 
 
83
  """
84
  try:
85
- # Create timezone object
86
  tz = pytz.timezone(timezone)
87
- # Get current time in that timezone
88
  local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
89
- return f"The current local time in {timezone} is: {local_time}"
90
  except Exception as e:
91
- return f"Error fetching time for timezone '{timezone}': {str(e)}"
92
 
93
 
94
  final_answer = FinalAnswerTool()
95
 
96
- # 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:
97
- # model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud'
98
-
99
- model = HfApiModel(
100
- max_tokens=2096,
101
- temperature=0.5,
102
- model_id='Qwen/Qwen2.5-Coder-32B-Instruct',# it is possible that this model may be overloaded
103
- custom_role_conversions=None,
104
- )
105
-
106
-
107
  # Import tool from Hub
108
  image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
109
 
110
- with open("prompts.yaml", 'r') as stream:
111
  prompt_templates = yaml.safe_load(stream)
112
-
113
  agent = CodeAgent(
114
  model=model,
115
- tools=[final_answer, extract_metadata_from_url, scrape_webpage], ## add your tools here (don't remove final answer)
 
 
 
 
 
116
  max_steps=6,
117
  verbosity_level=1,
118
  grammar=None,
119
  planning_interval=None,
120
  name=None,
121
  description=None,
122
- prompt_templates=prompt_templates
123
  )
124
 
125
-
126
- GradioUI(agent).launch()
 
1
+ from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool
2
  import datetime
3
  import requests
4
  import pytz
5
  import yaml
6
+ import os
7
+ import nltk
8
  from bs4 import BeautifulSoup
9
+ from nltk.tokenize import sent_tokenize
10
+ from tools.final_answer import FinalAnswerTool
11
  from Gradio_UI import GradioUI
12
 
13
+ # Descargar tokenizer de NLTK si no está disponible
14
+ nltk.download("punkt")
15
+
16
+ # Configurar el modelo de resumen desde Hugging Face en SmolAgents
17
+ model = HfApiModel(
18
+ max_tokens=2096,
19
+ temperature=0.5,
20
+ model_id="facebook/bart-large-cnn", # Modelo de resumen
21
+ custom_role_conversions=None,
22
+ )
23
+
24
+ @tool
25
+ def save_scraped_data_as_markdown(scraped_data: dict, filename: str = None) -> str:
26
+ """Convierte el contenido scrapeado en un archivo Markdown mejor estructurado.
27
+
28
+ Mejoras:
29
+ - Resumen automático del contenido con NLP.
30
+ - Uso de encabezados, listas y negritas en Markdown.
31
+ - Guardado con timestamp para evitar sobrescribir archivos.
32
+
33
+ Args:
34
+ scraped_data: Diccionario con la URL y los datos extraídos.
35
+ filename: Nombre del archivo de salida (si no se da, se genera con timestamp).
36
+
37
+ Returns:
38
+ Mensaje de confirmación o error.
39
+ """
40
+ try:
41
+ url = scraped_data.get("url", "Desconocido")
42
+ content_list = scraped_data.get("scraped_data", [])
43
+
44
+ if not content_list:
45
+ return "No hay datos para guardar en Markdown."
46
+
47
+ # Tokenizar en oraciones
48
+ tokenized_sentences = [sent_tokenize(text) for text in content_list]
49
+ formatted_content = "\n\n".join([" ".join(sentences) for sentences in tokenized_sentences])
50
+
51
+ # Hacer resumen del contenido (limitamos a 1024 tokens por si el texto es muy largo)
52
+ if len(formatted_content.split()) > 100:
53
+ summarized_text = model.query(
54
+ prompt=f"Resume el siguiente texto:\n\n{formatted_content[:1024]}",
55
+ max_length=150,
56
+ min_length=50,
57
+ )
58
+ else:
59
+ summarized_text = formatted_content
60
+
61
+ # Mejorar la estructura Markdown
62
+ markdown_content = f"# Contenido extraído de {url}\n\n"
63
+ markdown_content += f"## Resumen\n\n> {summarized_text}\n\n"
64
+ markdown_content += "## Contenido Completo\n\n"
65
+
66
+ for paragraph in formatted_content.split("\n\n"):
67
+ if len(paragraph.split()) > 10: # Si el párrafo es largo, lo tratamos como sección
68
+ markdown_content += f"### {paragraph[:50]}...\n\n{paragraph}\n\n"
69
+ else:
70
+ markdown_content += f"- **{paragraph}**\n\n"
71
+
72
+ # Generar nombre con timestamp si no se proporciona
73
+ if not filename:
74
+ timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
75
+ filename = f"scraped_{timestamp}.md"
76
+
77
+ # Guardar en un archivo Markdown
78
+ with open(filename, "w", encoding="utf-8") as file:
79
+ file.write(markdown_content)
80
+
81
+ return f"El contenido scrapeado se ha guardado en {filename}"
82
+
83
+ except Exception as e:
84
+ return f"Error al generar el archivo Markdown: {str(e)}"
85
+
86
+
87
  @tool
88
  def scrape_webpage(url: str, tag: str = "p", class_name: str = None) -> dict:
89
  """Extrae contenido de una página web según una etiqueta HTML y clase opcional.
90
+
91
  Args:
92
  url: URL de la página a scrapear.
93
  tag: Etiqueta HTML a extraer (por defecto <p>).
 
97
  Un diccionario con el contenido extraído.
98
  """
99
  try:
100
+ headers = {"User-Agent": "Mozilla/5.0"}
101
  response = requests.get(url, headers=headers)
102
  response.raise_for_status()
103
 
104
+ soup = BeautifulSoup(response.text, "html.parser")
105
+
106
  if class_name:
107
  elements = soup.find_all(tag, class_=class_name)
108
  else:
 
110
 
111
  extracted_data = [element.get_text(strip=True) for element in elements]
112
 
113
+ return {"url": url, "scraped_data": extracted_data[:20]} # Limita a 20 resultados
114
 
115
  except requests.exceptions.RequestException as e:
116
  return {"error": f"Error al acceder a la URL: {str(e)}"}
 
121
  @tool
122
  def extract_metadata_from_url(url: str) -> dict:
123
  """Extrae todos los metadatos de una página web.
124
+
125
  Args:
126
  url: La URL de la página web a analizar.
127
 
 
129
  Un diccionario con los metadatos encontrados.
130
  """
131
  try:
132
+ headers = {"User-Agent": "Mozilla/5.0"}
 
133
  response = requests.get(url, headers=headers)
134
+ response.raise_for_status()
135
 
136
+ soup = BeautifulSoup(response.text, "html.parser")
 
137
 
 
138
  metadata = {}
139
+ for meta in soup.find_all("meta"):
140
+ if "name" in meta.attrs and "content" in meta.attrs:
141
+ metadata[meta["name"]] = meta["content"]
142
+ elif "property" in meta.attrs and "content" in meta.attrs:
143
+ metadata[meta["property"]] = meta["content"]
144
 
145
  return metadata if metadata else {"error": "No se encontraron metadatos en la página."}
146
 
147
  except requests.exceptions.RequestException as e:
148
  return {"error": f"Error al acceder a la URL: {str(e)}"}
149
 
150
+
151
  @tool
152
  def get_current_time_in_timezone(timezone: str) -> str:
153
+ """Devuelve la hora actual en una zona horaria específica.
154
+
155
  Args:
156
+ timezone: Una cadena que representa una zona horaria válida (ej. 'America/New_York').
157
+
158
+ Returns:
159
+ La hora local actual en la zona horaria especificada.
160
  """
161
  try:
 
162
  tz = pytz.timezone(timezone)
 
163
  local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
164
+ return f"La hora local actual en {timezone} es: {local_time}"
165
  except Exception as e:
166
+ return f"Error obteniendo la hora para la zona horaria '{timezone}': {str(e)}"
167
 
168
 
169
  final_answer = FinalAnswerTool()
170
 
 
 
 
 
 
 
 
 
 
 
 
171
  # Import tool from Hub
172
  image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
173
 
174
+ with open("prompts.yaml", "r") as stream:
175
  prompt_templates = yaml.safe_load(stream)
176
+
177
  agent = CodeAgent(
178
  model=model,
179
+ tools=[
180
+ final_answer,
181
+ extract_metadata_from_url,
182
+ scrape_webpage,
183
+ save_scraped_data_as_markdown, # Se añade la nueva herramienta al agente
184
+ ],
185
  max_steps=6,
186
  verbosity_level=1,
187
  grammar=None,
188
  planning_interval=None,
189
  name=None,
190
  description=None,
191
+ prompt_templates=prompt_templates,
192
  )
193
 
194
+ GradioUI(agent).launch()