search_bot / app /agent /orchestrator.py
pavan10504's picture
Upload 24 files
c7968ae verified
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
}
}