AgenticAI-RAG / src /agents /search_agent.py
GreymanT's picture
Upload 80 files
8bf4d58 verified
"""Web search agent for online information."""
import logging
from typing import Optional
from src.agents.base_agent import BaseAgent
from src.tools.web_search import get_web_search
logger = logging.getLogger(__name__)
class SearchAgent(BaseAgent):
"""Agent specialized in web search and online information."""
def __init__(self, use_planning: bool = True):
"""Initialize search agent."""
web_search = get_web_search()
tools = [web_search.get_tool_schema()]
super().__init__(
name="search_agent",
description=(
"You are a specialized agent for searching the web and finding "
"online information. You can search the internet to answer questions "
"that require current or external information."
),
tools=tools,
use_memory=True,
use_planning=use_planning,
planning_type="react",
)
# Register tool function (async wrapper)
async def web_search_tool(query: str, max_results: int = 5):
return await web_search.search(query, max_results)
self.add_tool(
tool=web_search.get_tool_schema(),
tool_function=web_search_tool,
)
self.web_search = web_search
async def retrieve_context(self, query: str) -> str:
"""
Retrieve relevant context from web search.
Args:
query: User query
Returns:
Context string from web search results
"""
try:
# Perform web search
search_results = await self.web_search.search(query, max_results=5)
if not search_results.get("success") or not search_results.get("results"):
return "No relevant information found from web search."
# Format results
context_parts = ["Web search results:"]
for i, result in enumerate(search_results["results"], 1):
title = result.get("title", "No title")
url = result.get("url", "")
content = result.get("content", "")[:300] # Truncate
context_parts.append(f"\n[{i}] {title}")
context_parts.append(f"URL: {url}")
context_parts.append(f"Content: {content}...")
return "\n".join(context_parts)
except Exception as e:
logger.error(f"Error retrieving web context: {e}")
return f"Error performing web search: {str(e)}"
async def process(
self,
query: str,
session_id: Optional[str] = None,
context: Optional[str] = None,
) -> dict:
"""
Process query with web search.
Args:
query: User query
session_id: Optional session ID
context: Optional additional context
Returns:
Response dictionary
"""
# Retrieve web context
web_context = await self.retrieve_context(query)
# Combine with provided context
full_context = web_context
if context:
full_context = f"{context}\n\n{web_context}"
# Process using base agent (which will use planning if enabled)
return await super().process(query, session_id, full_context)