Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -23,6 +23,9 @@ from llama_index.core.memory import ChatMemoryBuffer
|
|
23 |
from llama_index.readers.web import RssReader, SimpleWebPageReader
|
24 |
from llama_index.core import SummaryIndex
|
25 |
|
|
|
|
|
|
|
26 |
import subprocess
|
27 |
subprocess.run(["playwright", "install"])
|
28 |
|
@@ -296,15 +299,14 @@ web_agent = AgentWorkflow.from_tools_or_functions(
|
|
296 |
)
|
297 |
ctx = Context(web_agent)
|
298 |
|
299 |
-
# Async helper to run agent queries
|
300 |
def run_query_sync(query: str):
|
301 |
"""Helper to run async agent.run in sync context."""
|
302 |
return asyncio.get_event_loop().run_until_complete(
|
303 |
web_agent.run(query, ctx=ctx)
|
304 |
)
|
305 |
|
306 |
-
|
307 |
-
|
308 |
async def run_query(query: str):
|
309 |
trace_id = f"agent-run-{uuid.uuid4().hex}"
|
310 |
try:
|
@@ -313,90 +315,51 @@ async def run_query(query: str):
|
|
313 |
session_id="web-agent-session",
|
314 |
user_id=ANON_USER_ID,
|
315 |
):
|
316 |
-
#
|
317 |
-
|
318 |
-
try:
|
319 |
-
stream_queue.get_nowait()
|
320 |
-
except:
|
321 |
-
pass
|
322 |
-
|
323 |
-
# Add initial messages to the queue
|
324 |
-
await stream_queue.put("🤔 Thinking about your question...\n\n")
|
325 |
-
|
326 |
-
# The key is to patch each individual tool function to capture its usage
|
327 |
-
original_functions = {}
|
328 |
|
329 |
-
#
|
330 |
-
|
331 |
-
|
332 |
-
|
333 |
-
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
-
# Log result
|
348 |
-
await stream_queue.put(f"📊 Got result from {tool_name}\n")
|
349 |
-
return result
|
350 |
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
await stream_queue.put("🧠 Planning approach...\n\n")
|
358 |
-
task = asyncio.create_task(web_agent.run(query, ctx=ctx))
|
359 |
-
|
360 |
-
# Stream updates while waiting for completion
|
361 |
-
while not task.done():
|
362 |
-
try:
|
363 |
-
# Check if there's anything in the queue to yield
|
364 |
-
if not stream_queue.empty():
|
365 |
-
chunk = await stream_queue.get()
|
366 |
-
yield chunk
|
367 |
else:
|
368 |
-
|
369 |
-
|
370 |
-
|
371 |
-
yield f"\n⚠️ Error during streaming: {str(e)}\n"
|
372 |
|
373 |
-
# Get the final result
|
374 |
-
try:
|
375 |
-
result = await task
|
376 |
-
final_response = result.response if isinstance(result.response, str) else str(result.response)
|
377 |
-
|
378 |
-
# Yield the final answer
|
379 |
-
yield f"\n\n✅ Final answer: {final_response}"
|
380 |
-
except Exception as e:
|
381 |
-
yield f"\n\n❌ Error getting final result: {str(e)}"
|
382 |
-
|
383 |
-
# Restore original functions
|
384 |
-
for tool in tools:
|
385 |
-
tool_name = tool.metadata.name
|
386 |
-
if tool_name in original_functions:
|
387 |
-
tool.fn = original_functions[tool_name]
|
388 |
except Exception as e:
|
389 |
-
yield f"❌ Error: {str(e)}"
|
390 |
finally:
|
391 |
instrumentor.flush()
|
392 |
|
393 |
-
#
|
394 |
async def gradio_query(user_input, chat_history=None):
|
395 |
history = chat_history or []
|
396 |
history.append({"role": "user", "content": user_input})
|
397 |
|
398 |
# Add initial assistant message
|
399 |
-
history.append({"role": "assistant", "content": "
|
400 |
yield history, history
|
401 |
|
402 |
# Get streaming response
|
|
|
23 |
from llama_index.readers.web import RssReader, SimpleWebPageReader
|
24 |
from llama_index.core import SummaryIndex
|
25 |
|
26 |
+
# Import the event types for streaming
|
27 |
+
from llama_index.core.agent.workflow import AgentStream, ToolCall, ToolCallResult
|
28 |
+
|
29 |
import subprocess
|
30 |
subprocess.run(["playwright", "install"])
|
31 |
|
|
|
299 |
)
|
300 |
ctx = Context(web_agent)
|
301 |
|
302 |
+
# Async helper to run agent queries (kept for compatibility)
|
303 |
def run_query_sync(query: str):
|
304 |
"""Helper to run async agent.run in sync context."""
|
305 |
return asyncio.get_event_loop().run_until_complete(
|
306 |
web_agent.run(query, ctx=ctx)
|
307 |
)
|
308 |
|
309 |
+
# Updated run_query function to use stream_events
|
|
|
310 |
async def run_query(query: str):
|
311 |
trace_id = f"agent-run-{uuid.uuid4().hex}"
|
312 |
try:
|
|
|
315 |
session_id="web-agent-session",
|
316 |
user_id=ANON_USER_ID,
|
317 |
):
|
318 |
+
# Start the handler
|
319 |
+
handler = web_agent.run(query, ctx=ctx)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
320 |
|
321 |
+
# Stream content
|
322 |
+
full_response = ""
|
323 |
+
async for event in handler.stream_events():
|
324 |
+
if isinstance(event, AgentStream):
|
325 |
+
# This is the text being generated
|
326 |
+
if event.delta:
|
327 |
+
yield event.delta
|
328 |
+
elif isinstance(event, ToolCall):
|
329 |
+
# A tool is being called
|
330 |
+
tool_name = event.data.get("name", "unknown tool")
|
331 |
+
yield f"\n\n🔧 Using tool: {tool_name}...\n"
|
332 |
+
elif isinstance(event, ToolCallResult):
|
333 |
+
# Result from a tool call
|
334 |
+
# Try to find the tool name in the event data
|
335 |
+
tool_name = "the tool"
|
336 |
+
if hasattr(event, "parent_id") and event.parent_id:
|
337 |
+
# This might help identify the parent tool call
|
338 |
+
tool_name = f"tool {event.parent_id}"
|
|
|
|
|
|
|
339 |
|
340 |
+
# Get the result from the event data
|
341 |
+
result = event.data.get("result", "")
|
342 |
+
|
343 |
+
# Truncate long results for display
|
344 |
+
if isinstance(result, str) and len(result) > 200:
|
345 |
+
result_preview = result[:200] + "... (truncated)"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
346 |
else:
|
347 |
+
result_preview = str(result)
|
348 |
+
|
349 |
+
yield f"\n📊 Got result from {tool_name}\n"
|
|
|
350 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
351 |
except Exception as e:
|
352 |
+
yield f"\n\n❌ Error: {str(e)}"
|
353 |
finally:
|
354 |
instrumentor.flush()
|
355 |
|
356 |
+
# Updated gradio_query function
|
357 |
async def gradio_query(user_input, chat_history=None):
|
358 |
history = chat_history or []
|
359 |
history.append({"role": "user", "content": user_input})
|
360 |
|
361 |
# Add initial assistant message
|
362 |
+
history.append({"role": "assistant", "content": "Processing..."})
|
363 |
yield history, history
|
364 |
|
365 |
# Get streaming response
|