import asyncio import logging try: from ddgs import DDGS except ImportError: from duckduckgo_search import DDGS from axon.models import SearchResult logger = logging.getLogger(__name__) _TIMELIMIT = {"day": "d", "week": "w", "month": "m", "year": "y"} async def search_ddg( query: str, count: int = 10, topic: str = "general", time_range: str | None = None, ) -> list[SearchResult]: timelimit = _TIMELIMIT.get(time_range) if time_range else None def _blocking_search() -> list[dict]: with DDGS() as ddgs: if topic == "news": return list(ddgs.news(query, max_results=count, timelimit=timelimit)) return list(ddgs.text(query, max_results=count, timelimit=timelimit)) try: raw = await asyncio.to_thread(_blocking_search) results = [] for item in raw: url = item.get("href") or item.get("url", "") results.append( SearchResult( title=item.get("title", ""), url=url, content=item.get("body", ""), score=0.5, published_date=item.get("date"), favicon=None, ) ) return results except Exception as exc: logger.error("DuckDuckGo search error: %s", exc) return []