mm1 / src /tools /search.py
TheRealHubertus's picture
Upload 49 files
82372e5 verified
Raw
History Blame Contribute Delete
1.14 kB
from __future__ import annotations
import json
import os
from pathlib import Path
from src.schemas import SourceCandidate
def fixture_sources(fixtures_path: str | Path = "data/fixtures/demo_sources.json") -> list[SourceCandidate]:
data = json.loads(Path(fixtures_path).read_text(encoding="utf-8"))
return [SourceCandidate.from_dict(item) for item in data]
def search_web(query: str, limit: int = 5) -> list[SourceCandidate]:
mock_mode = os.getenv("MOCK_MODE", "false").lower() == "true"
if mock_mode:
return fixture_sources()[:limit]
if os.getenv("DIRECT_SEARCH_ENABLED", "true").lower() != "true":
return []
try:
from duckduckgo_search import DDGS
rows = DDGS().text(query, max_results=limit)
sources = [
SourceCandidate(
title=row.get("title") or "Untitled",
url=row.get("href") or "",
snippet=row.get("body") or "",
source_type="web",
fetch_status="search_only",
)
for row in rows
]
return sources
except Exception:
return []