sccastillo commited on
Commit
14e4f2c
·
1 Parent(s): e8fb55a

web_search

Browse files
Files changed (2) hide show
  1. README.md +10 -1
  2. test_web_search.py +221 -0
README.md CHANGED
@@ -33,4 +33,13 @@ uvicorn app:app \
33
  --log-level info \
34
  --access-log \
35
  --log-config logging.conf
36
- ```
 
 
 
 
 
 
 
 
 
 
33
  --log-level info \
34
  --access-log \
35
  --log-config logging.conf
36
+ ```
37
+
38
+
39
+ push to hf
40
+ ```bash
41
+ git push hf main
42
+
43
+ git remote add hf https://sccastillo:{HF_TOKEN}f_gzcAxmNibbphDjSUOqYEzmuMczxKiYyzMX@huggingface.co/spaces/sccastillo/sciresearch
44
+ ```
45
+
test_web_search.py ADDED
@@ -0,0 +1,221 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Script mínimo de test para probar web_search_preview de LangGraph con OpenAI
4
+ """
5
+
6
+ import os
7
+ import asyncio
8
+ import logging
9
+ from datetime import datetime
10
+ from dotenv import load_dotenv
11
+ from langgraph.prebuilt import create_react_agent
12
+
13
+ # Configurar logging
14
+ logging.basicConfig(
15
+ level=logging.INFO,
16
+ format='%(asctime)s - %(levelname)s - %(message)s'
17
+ )
18
+ logger = logging.getLogger("WebSearchTest")
19
+
20
+ def setup_environment():
21
+ """Configurar variables de entorno"""
22
+ load_dotenv()
23
+
24
+ api_key = os.getenv("OPENAI_API_KEY")
25
+ if not api_key:
26
+ logger.error("❌ OPENAI_API_KEY no encontrada en variables de entorno")
27
+ logger.info("💡 Asegúrate de tener un archivo .env con: OPENAI_API_KEY=tu_api_key")
28
+ return False
29
+
30
+ logger.info("✅ API Key de OpenAI configurada correctamente")
31
+ return True
32
+
33
+ def test_web_search_sync():
34
+ """Test síncrono básico de web_search_preview"""
35
+ logger.info("🔍 Iniciando test síncrono de web_search_preview...")
36
+
37
+ try:
38
+ # Crear el agente con web_search_preview
39
+ agent = create_react_agent(
40
+ model="openai:gpt-4o-mini",
41
+ tools=[{"type": "web_search_preview"}]
42
+ )
43
+
44
+ logger.info("✅ Agente creado exitosamente")
45
+
46
+ # Hacer una consulta de test
47
+ test_query = "What are the latest news about artificial intelligence today?"
48
+ logger.info(f"📝 Enviando consulta: {test_query}")
49
+
50
+ start_time = datetime.now()
51
+
52
+ response = agent.invoke({
53
+ "messages": [test_query]
54
+ })
55
+
56
+ end_time = datetime.now()
57
+ duration = (end_time - start_time).total_seconds()
58
+
59
+ logger.info(f"⏱️ Respuesta recibida en {duration:.2f} segundos")
60
+ logger.info("📄 Respuesta del agente:")
61
+ logger.info("-" * 50)
62
+
63
+ # Mostrar la respuesta
64
+ if hasattr(response, 'messages') and response.messages:
65
+ for i, message in enumerate(response.messages):
66
+ logger.info(f"Mensaje {i+1}: {message.content[:500]}...")
67
+ else:
68
+ logger.info(f"Respuesta: {str(response)[:500]}...")
69
+
70
+ logger.info("-" * 50)
71
+ logger.info("✅ Test síncrono completado exitosamente")
72
+ return True
73
+
74
+ except Exception as e:
75
+ logger.error(f"❌ Error en test síncrono: {str(e)}")
76
+ logger.error(f"Tipo de error: {type(e).__name__}")
77
+ return False
78
+
79
+ async def test_web_search_async():
80
+ """Test asíncrono de web_search_preview"""
81
+ logger.info("🔍 Iniciando test asíncrono de web_search_preview...")
82
+
83
+ try:
84
+ # Crear el agente con web_search_preview
85
+ agent = create_react_agent(
86
+ model="openai:gpt-4o-mini",
87
+ tools=[{"type": "web_search_preview"}]
88
+ )
89
+
90
+ logger.info("✅ Agente asíncrono creado exitosamente")
91
+
92
+ # Hacer una consulta de test
93
+ test_query = "What are the current technology trends in 2024?"
94
+ logger.info(f"📝 Enviando consulta asíncrona: {test_query}")
95
+
96
+ start_time = datetime.now()
97
+
98
+ response = await agent.ainvoke({
99
+ "messages": [test_query]
100
+ })
101
+
102
+ end_time = datetime.now()
103
+ duration = (end_time - start_time).total_seconds()
104
+
105
+ logger.info(f"⏱️ Respuesta asíncrona recibida en {duration:.2f} segundos")
106
+ logger.info("📄 Respuesta del agente asíncrono:")
107
+ logger.info("-" * 50)
108
+
109
+ # Mostrar la respuesta
110
+ if hasattr(response, 'messages') and response.messages:
111
+ for i, message in enumerate(response.messages):
112
+ logger.info(f"Mensaje {i+1}: {message.content[:500]}...")
113
+ else:
114
+ logger.info(f"Respuesta: {str(response)[:500]}...")
115
+
116
+ logger.info("-" * 50)
117
+ logger.info("✅ Test asíncrono completado exitosamente")
118
+ return True
119
+
120
+ except Exception as e:
121
+ logger.error(f"❌ Error en test asíncrono: {str(e)}")
122
+ logger.error(f"Tipo de error: {type(e).__name__}")
123
+ return False
124
+
125
+ def test_web_search_multiple_queries():
126
+ """Test con múltiples consultas para verificar consistencia"""
127
+ logger.info("🔍 Iniciando test con múltiples consultas...")
128
+
129
+ queries = [
130
+ "What is the weather today?",
131
+ "Latest news about Python programming",
132
+ "Current stock market trends"
133
+ ]
134
+
135
+ try:
136
+ agent = create_react_agent(
137
+ model="openai:gpt-4o-mini",
138
+ tools=[{"type": "web_search_preview"}]
139
+ )
140
+
141
+ successful_queries = 0
142
+
143
+ for i, query in enumerate(queries, 1):
144
+ logger.info(f"📝 Consulta {i}/{len(queries)}: {query}")
145
+
146
+ try:
147
+ response = agent.invoke({"messages": [query]})
148
+ logger.info(f"✅ Consulta {i} exitosa")
149
+ successful_queries += 1
150
+
151
+ except Exception as e:
152
+ logger.error(f"❌ Error en consulta {i}: {str(e)}")
153
+
154
+ success_rate = (successful_queries / len(queries)) * 100
155
+ logger.info(f"📊 Tasa de éxito: {successful_queries}/{len(queries)} ({success_rate:.1f}%)")
156
+
157
+ return success_rate > 50 # Considerar exitoso si > 50% de consultas funcionan
158
+
159
+ except Exception as e:
160
+ logger.error(f"❌ Error en test múltiple: {str(e)}")
161
+ return False
162
+
163
+ async def main():
164
+ """Función principal que ejecuta todos los tests"""
165
+ logger.info("=" * 60)
166
+ logger.info("🚀 INICIANDO TESTS DE WEB_SEARCH_PREVIEW")
167
+ logger.info("=" * 60)
168
+
169
+ # 1. Verificar configuración
170
+ if not setup_environment():
171
+ logger.error("❌ Configuración fallida. Abortando tests.")
172
+ return
173
+
174
+ test_results = {}
175
+
176
+ # 2. Test síncrono
177
+ logger.info("\n" + "=" * 40)
178
+ logger.info("TEST 1: Web Search Síncrono")
179
+ logger.info("=" * 40)
180
+ test_results['sync'] = test_web_search_sync()
181
+
182
+ # 3. Test asíncrono
183
+ logger.info("\n" + "=" * 40)
184
+ logger.info("TEST 2: Web Search Asíncrono")
185
+ logger.info("=" * 40)
186
+ test_results['async'] = await test_web_search_async()
187
+
188
+ # 4. Test múltiples consultas
189
+ logger.info("\n" + "=" * 40)
190
+ logger.info("TEST 3: Múltiples Consultas")
191
+ logger.info("=" * 40)
192
+ test_results['multiple'] = test_web_search_multiple_queries()
193
+
194
+ # 5. Resumen final
195
+ logger.info("\n" + "=" * 60)
196
+ logger.info("📊 RESUMEN DE RESULTADOS")
197
+ logger.info("=" * 60)
198
+
199
+ for test_name, result in test_results.items():
200
+ status = "✅ EXITOSO" if result else "❌ FALLIDO"
201
+ logger.info(f"{test_name.upper():20}: {status}")
202
+
203
+ successful_tests = sum(test_results.values())
204
+ total_tests = len(test_results)
205
+ success_rate = (successful_tests / total_tests) * 100
206
+
207
+ logger.info(f"\nTasa de éxito general: {successful_tests}/{total_tests} ({success_rate:.1f}%)")
208
+
209
+ if success_rate >= 100:
210
+ logger.info("🎉 ¡Todos los tests pasaron! web_search_preview está funcionando correctamente")
211
+ elif success_rate >= 50:
212
+ logger.info("⚠️ Algunos tests fallaron, pero la funcionalidad básica parece funcionar")
213
+ else:
214
+ logger.info("❌ La mayoría de tests fallaron. Revisa la configuración y conexión")
215
+
216
+ if __name__ == "__main__":
217
+ print("🔧 Script de Test para web_search_preview de LangGraph")
218
+ print("=" * 60)
219
+
220
+ # Ejecutar tests
221
+ asyncio.run(main())