Spaces:
Sleeping
Sleeping
| from app.agent.analyzer import analyze_query | |
| from app.agent.search import search_web | |
| from app.agent.reasoner import refine_answer | |
| def run_agent(query: str): | |
| try: | |
| analysis = analyze_query(query) | |
| except Exception: | |
| analysis = { | |
| "domain": "unknown", | |
| "entity": query, | |
| "refined_query": query | |
| } | |
| search_response = search_web(analysis["refined_query"]) | |
| # Get Tavily's generated answer and sources | |
| tavily_answer = search_response.get("answer", "") | |
| results = search_response.get("results", []) | |
| sources = [r["url"] for r in results[:3]] | |
| # Optionally refine the answer with Gemini for better formatting | |
| try: | |
| if tavily_answer: | |
| answer = refine_answer(query, tavily_answer) | |
| else: | |
| answer = "I couldn't find a clear answer from the available sources." | |
| except Exception: | |
| # Fallback to Tavily's answer if Gemini refinement fails | |
| answer = tavily_answer or "I encountered an issue while analyzing the information." | |
| return { | |
| "interpreted_query": analysis["refined_query"], | |
| "answer": answer, | |
| "sources": sources | |
| } | |
| def run_agent_stream(query: str): | |
| """Generator that yields streaming events for frontend display""" | |
| yield {"type": "step", "step": "start", "message": f"Received query: {query}"} | |
| # Step 1: Analyze query | |
| yield {"type": "step", "step": "analyzing", "message": "Analyzing query intent..."} | |
| try: | |
| analysis = analyze_query(query) | |
| yield { | |
| "type": "step", | |
| "step": "analyzed", | |
| "message": f"Refined query: {analysis['refined_query']}", | |
| "data": { | |
| "domain": analysis.get('domain', 'unknown'), | |
| "entity": analysis.get('entity', query), | |
| "refined_query": analysis['refined_query'] | |
| } | |
| } | |
| except Exception as e: | |
| yield {"type": "step", "step": "analyzed", "message": f"Query analysis failed, using original query"} | |
| analysis = { | |
| "domain": "unknown", | |
| "entity": query, | |
| "refined_query": query | |
| } | |
| # Step 2: Search web | |
| yield {"type": "step", "step": "searching", "message": "Searching the web..."} | |
| search_response = search_web(analysis["refined_query"]) | |
| tavily_answer = search_response.get("answer", "") | |
| results = search_response.get("results", []) | |
| sources = [r["url"] for r in results] # Get all sources | |
| yield { | |
| "type": "step", | |
| "step": "searched", | |
| "message": f"Found {len(results)} results", | |
| "data": { | |
| "sources": sources, | |
| "raw_answer": tavily_answer | |
| } | |
| } | |
| # Step 3: Refine answer | |
| yield {"type": "step", "step": "refining", "message": "Refining answer with AI..."} | |
| refined_answer = None | |
| refinement_error = None | |
| try: | |
| if tavily_answer: | |
| refined_answer = refine_answer(query, tavily_answer) | |
| # Check if refinement actually changed anything | |
| if refined_answer.strip() == tavily_answer.strip(): | |
| yield {"type": "step", "step": "refined", "message": "Answer refined (no changes needed)"} | |
| else: | |
| yield {"type": "step", "step": "refined", "message": "Answer refined with AI formatting"} | |
| else: | |
| refined_answer = "I couldn't find a clear answer from the available sources." | |
| yield {"type": "step", "step": "refined", "message": "No raw answer to refine"} | |
| except Exception as e: | |
| refinement_error = str(e) | |
| # Use raw Tavily answer as fallback | |
| refined_answer = tavily_answer or "I encountered an issue while analyzing the information." | |
| yield {"type": "step", "step": "refined", "message": f"Using raw Tavily answer (Gemini unavailable)"} | |
| answer = refined_answer | |
| # Final result | |
| yield { | |
| "type": "result", | |
| "data": { | |
| "interpreted_query": analysis["refined_query"], | |
| "answer": answer, | |
| "sources": sources, | |
| "raw_answer": tavily_answer, | |
| "refinement_error": refinement_error | |
| } | |
| } | |