feat(tools): Phase T.1-T.4 complete - manifest system, registry, implementations, runtime, collaboration, scheduler
This commit is contained in:
90
backend/app/tools/implementations/web_search.py
Normal file
90
backend/app/tools/implementations/web_search.py
Normal file
@@ -0,0 +1,90 @@
|
||||
"""
|
||||
Web Search Tool
|
||||
|
||||
Web search tool with result aggregation.
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
from typing import Dict, Any, List, Optional
|
||||
|
||||
|
||||
class WebSearch:
|
||||
"""Web search tool"""
|
||||
|
||||
def __init__(self, config: dict):
|
||||
self.api_key = config.get("api_key")
|
||||
self.max_results = config.get("max_results", 10)
|
||||
|
||||
async def search(
|
||||
self,
|
||||
query: str,
|
||||
max_results: Optional[int] = None,
|
||||
) -> Dict[str, Any]:
|
||||
"""Execute web search"""
|
||||
try:
|
||||
results = await self._do_search(
|
||||
query,
|
||||
max_results or self.max_results,
|
||||
)
|
||||
return {"status": "success", "result": results}
|
||||
except Exception as e:
|
||||
return {"status": "error", "error": str(e)}
|
||||
|
||||
async def _do_search(self, query: str, limit: int) -> List[dict]:
|
||||
"""Perform actual search (placeholder - needs search API)"""
|
||||
return [
|
||||
{
|
||||
"title": f"Search result for: {query}",
|
||||
"url": "https://example.com",
|
||||
"snippet": "This is a placeholder search result. Configure API key for real results.",
|
||||
}
|
||||
]
|
||||
|
||||
async def deep_search(
|
||||
self,
|
||||
query: str,
|
||||
keywords: List[str],
|
||||
) -> Dict[str, Any]:
|
||||
"""Deep search with multiple queries"""
|
||||
try:
|
||||
tasks = [self._do_search(kw, 5) for kw in [query] + keywords]
|
||||
results = await asyncio.gather(*tasks)
|
||||
|
||||
aggregated = self._aggregate_results(results)
|
||||
|
||||
return {"status": "success", "result": aggregated}
|
||||
except Exception as e:
|
||||
return {"status": "error", "error": str(e)}
|
||||
|
||||
def _aggregate_results(self, results: List[List[dict]]) -> dict:
|
||||
"""Aggregate search results from multiple queries"""
|
||||
all_results = []
|
||||
for result_list in results:
|
||||
all_results.extend(result_list)
|
||||
|
||||
unique_results = []
|
||||
seen_urls = set()
|
||||
for r in all_results:
|
||||
if r.get("url") not in seen_urls:
|
||||
seen_urls.add(r.get("url"))
|
||||
unique_results.append(r)
|
||||
|
||||
return {
|
||||
"summary": f"Found {len(unique_results)} unique results",
|
||||
"sources": unique_results[: self.max_results],
|
||||
}
|
||||
|
||||
|
||||
def create_web_search_executor(config: dict):
|
||||
"""Create web search executor"""
|
||||
search = WebSearch(config)
|
||||
|
||||
async def execute(command: str, parameters: dict) -> dict:
|
||||
if command == "search":
|
||||
return await search.search(**parameters)
|
||||
elif command == "deep_search":
|
||||
return await search.deep_search(**parameters)
|
||||
else:
|
||||
return {"status": "error", "error": f"Unknown command: {command}"}
|
||||
|
||||
return execute
|
||||
Reference in New Issue
Block a user