Spaces:
Sleeping
Sleeping
Priyanshi Saxena
commited on
Commit
Β·
d44409c
1
Parent(s):
a6b557d
π CRITICAL FIX: Infinite processing timeout issue
Browse files- Added 30s timeout to Ollama/Gemini tool analysis (was hanging indefinitely)
- Added fallback tool selection when analysis times out
- Simplified prompts for faster LLM processing
- Optimized AI safety prompts to reduce context length
- Fixed memory manager integration
- Now system will respond within 60-90s maximum instead of infinite hang
FIXES:
- Tool analysis infinite hang β‘
- Context cancellation errors β‘
- Memory integration working β‘
- Faster response times β‘
- src/agent/research_agent.py +96 -67
src/agent/research_agent.py
CHANGED
|
@@ -248,39 +248,59 @@ class Web3ResearchAgent:
|
|
| 248 |
if memory_context and memory_context.get("cached_context"):
|
| 249 |
context_note = f"\n\nPrevious context: {len(memory_context['cached_context'])} related queries found"
|
| 250 |
|
| 251 |
-
tool_analysis_prompt = f"""
|
| 252 |
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
- chart_data_provider: charts/visualizations
|
| 258 |
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
- "Ethereum gas" β etherscan_data
|
| 263 |
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
|
| 271 |
-
|
| 272 |
-
|
| 273 |
-
|
| 274 |
-
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 284 |
|
| 285 |
# Default to at least one relevant tool if parsing fails
|
| 286 |
if not suggested_tools:
|
|
@@ -451,50 +471,59 @@ The system successfully executed {len(suggested_tools)} data tools:
|
|
| 451 |
if recent_tools:
|
| 452 |
context_info = f"\n\nRecent tools used: {', '.join(set(recent_tools))}"
|
| 453 |
|
| 454 |
-
tool_analysis_prompt = f"""
|
| 455 |
-
|
| 456 |
-
Query: "{query}"{context_info}
|
| 457 |
-
|
| 458 |
-
Available tools (prioritized by functionality):
|
| 459 |
-
- cryptocompare_data: Real-time cryptocurrency prices, market data, and trading info (PREFERRED for price data)
|
| 460 |
-
- etherscan_data: Ethereum blockchain data, transactions, gas fees, and smart contracts (PREFERRED for Ethereum)
|
| 461 |
-
- defillama_data: DeFi protocols, TVL, and yield farming data
|
| 462 |
-
- chart_data_provider: Generate chart data for visualizations
|
| 463 |
-
|
| 464 |
-
NOTE: Do NOT use coingecko_data as the API is not available.
|
| 465 |
-
|
| 466 |
-
If charts/visualizations are mentioned, include chart_data_provider.
|
| 467 |
|
| 468 |
-
|
| 469 |
-
|
| 470 |
-
|
| 471 |
-
|
| 472 |
-
- "Gas fees" β etherscan_data
|
| 473 |
|
| 474 |
-
|
| 475 |
|
| 476 |
-
|
| 477 |
-
|
| 478 |
-
|
| 479 |
-
|
| 480 |
-
|
| 481 |
-
|
| 482 |
-
|
| 483 |
-
|
| 484 |
-
|
| 485 |
-
|
| 486 |
-
|
| 487 |
-
|
| 488 |
-
|
| 489 |
-
|
| 490 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 491 |
suggested_tools.append('cryptocompare_data')
|
| 492 |
-
if '
|
| 493 |
suggested_tools.append('defillama_data')
|
| 494 |
-
if '
|
| 495 |
suggested_tools.append('etherscan_data')
|
| 496 |
-
if
|
| 497 |
suggested_tools.append('chart_data_provider')
|
|
|
|
|
|
|
|
|
|
| 498 |
|
| 499 |
logger.info(f"π οΈ Gemini suggested tools: {suggested_tools}")
|
| 500 |
|
|
|
|
| 248 |
if memory_context and memory_context.get("cached_context"):
|
| 249 |
context_note = f"\n\nPrevious context: {len(memory_context['cached_context'])} related queries found"
|
| 250 |
|
| 251 |
+
tool_analysis_prompt = f"""Tools for: "{query}"{context_note}
|
| 252 |
|
| 253 |
+
cryptocompare_data: crypto prices
|
| 254 |
+
etherscan_data: Ethereum data
|
| 255 |
+
defillama_data: DeFi TVL
|
| 256 |
+
chart_data_provider: charts
|
|
|
|
| 257 |
|
| 258 |
+
Bitcoin price β cryptocompare_data
|
| 259 |
+
DeFi TVL β defillama_data
|
| 260 |
+
Ethereum β etherscan_data
|
|
|
|
| 261 |
|
| 262 |
+
Answer with tool names:"""
|
| 263 |
+
try:
|
| 264 |
+
tool_response = await asyncio.wait_for(
|
| 265 |
+
self.fallback_llm.ainvoke(tool_analysis_prompt),
|
| 266 |
+
timeout=30 # 30 second timeout for tool analysis
|
| 267 |
+
)
|
| 268 |
+
logger.info(f"π§ Ollama tool analysis response: {str(tool_response)[:500]}...")
|
| 269 |
+
|
| 270 |
+
# Clean up the response and extract tool names
|
| 271 |
+
response_text = str(tool_response).lower()
|
| 272 |
+
suggested_tools = []
|
| 273 |
+
|
| 274 |
+
# Check for each tool in the response
|
| 275 |
+
tool_mappings = {
|
| 276 |
+
'cryptocompare': 'cryptocompare_data',
|
| 277 |
+
'defillama': 'defillama_data',
|
| 278 |
+
'etherscan': 'etherscan_data',
|
| 279 |
+
'chart': 'chart_data_provider'
|
| 280 |
+
}
|
| 281 |
+
|
| 282 |
+
for keyword, tool_name in tool_mappings.items():
|
| 283 |
+
if keyword in response_text:
|
| 284 |
+
suggested_tools.append(tool_name)
|
| 285 |
+
|
| 286 |
+
except asyncio.TimeoutError:
|
| 287 |
+
logger.warning("β±οΈ Tool analysis timed out, using fallback tool selection")
|
| 288 |
+
# Fallback tool selection based on query keywords
|
| 289 |
+
suggested_tools = []
|
| 290 |
+
query_lower = query.lower()
|
| 291 |
+
|
| 292 |
+
if any(word in query_lower for word in ['price', 'bitcoin', 'btc', 'ethereum', 'eth', 'crypto']):
|
| 293 |
+
suggested_tools.append('cryptocompare_data')
|
| 294 |
+
if 'defi' in query_lower or 'tvl' in query_lower:
|
| 295 |
+
suggested_tools.append('defillama_data')
|
| 296 |
+
if 'ethereum' in query_lower or 'gas' in query_lower:
|
| 297 |
+
suggested_tools.append('etherscan_data')
|
| 298 |
+
if any(word in query_lower for word in ['chart', 'graph', 'visualization', 'trend']):
|
| 299 |
+
suggested_tools.append('chart_data_provider')
|
| 300 |
+
|
| 301 |
+
# Default to basic crypto data if no matches
|
| 302 |
+
if not suggested_tools:
|
| 303 |
+
suggested_tools = ['cryptocompare_data']
|
| 304 |
|
| 305 |
# Default to at least one relevant tool if parsing fails
|
| 306 |
if not suggested_tools:
|
|
|
|
| 471 |
if recent_tools:
|
| 472 |
context_info = f"\n\nRecent tools used: {', '.join(set(recent_tools))}"
|
| 473 |
|
| 474 |
+
tool_analysis_prompt = f"""Tools for: "{query}"{context_info}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 475 |
|
| 476 |
+
cryptocompare_data: crypto prices
|
| 477 |
+
etherscan_data: Ethereum data
|
| 478 |
+
defillama_data: DeFi TVL
|
| 479 |
+
chart_data_provider: charts
|
|
|
|
| 480 |
|
| 481 |
+
List tool names:"""
|
| 482 |
|
| 483 |
+
try:
|
| 484 |
+
tool_response = await asyncio.wait_for(
|
| 485 |
+
self.llm.ainvoke(tool_analysis_prompt),
|
| 486 |
+
timeout=30 # 30 second timeout for Gemini tool analysis
|
| 487 |
+
)
|
| 488 |
+
|
| 489 |
+
logger.info(f"π§ Gemini tool analysis response: {str(tool_response)[:100]}...")
|
| 490 |
+
|
| 491 |
+
# Parse suggested tools
|
| 492 |
+
suggested_tools = [tool.strip() for tool in str(tool_response).split(',') if tool.strip()]
|
| 493 |
+
suggested_tools = [tool for tool in suggested_tools if tool in {
|
| 494 |
+
'cryptocompare_data', 'defillama_data',
|
| 495 |
+
'etherscan_data', 'chart_data_provider'
|
| 496 |
+
}]
|
| 497 |
+
|
| 498 |
+
# If no valid tools found, extract from response content
|
| 499 |
+
if not suggested_tools:
|
| 500 |
+
response_text = str(tool_response).lower()
|
| 501 |
+
if 'cryptocompare' in response_text:
|
| 502 |
+
suggested_tools.append('cryptocompare_data')
|
| 503 |
+
if 'defillama' in response_text:
|
| 504 |
+
suggested_tools.append('defillama_data')
|
| 505 |
+
if 'etherscan' in response_text:
|
| 506 |
+
suggested_tools.append('etherscan_data')
|
| 507 |
+
if 'chart' in response_text or 'visualization' in response_text:
|
| 508 |
+
suggested_tools.append('chart_data_provider')
|
| 509 |
+
|
| 510 |
+
except asyncio.TimeoutError:
|
| 511 |
+
logger.warning("β±οΈ Gemini tool analysis timed out, using fallback tool selection")
|
| 512 |
+
# Same fallback logic as Ollama
|
| 513 |
+
suggested_tools = []
|
| 514 |
+
query_lower = query.lower()
|
| 515 |
+
|
| 516 |
+
if any(word in query_lower for word in ['price', 'bitcoin', 'btc', 'ethereum', 'eth', 'crypto']):
|
| 517 |
suggested_tools.append('cryptocompare_data')
|
| 518 |
+
if 'defi' in query_lower or 'tvl' in query_lower:
|
| 519 |
suggested_tools.append('defillama_data')
|
| 520 |
+
if 'ethereum' in query_lower or 'gas' in query_lower:
|
| 521 |
suggested_tools.append('etherscan_data')
|
| 522 |
+
if any(word in query_lower for word in ['chart', 'graph', 'visualization', 'trend']):
|
| 523 |
suggested_tools.append('chart_data_provider')
|
| 524 |
+
|
| 525 |
+
if not suggested_tools:
|
| 526 |
+
suggested_tools = ['cryptocompare_data']
|
| 527 |
|
| 528 |
logger.info(f"π οΈ Gemini suggested tools: {suggested_tools}")
|
| 529 |
|