From 21b59cc1d0928dc04dcf5eac24470aaa05013b2d Mon Sep 17 00:00:00 2001 From: tanaka takashi Date: Tue, 23 Jun 2026 18:37:46 +0900 Subject: 基本機能実装 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ollama_web/tools/search.py | 45 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/ollama_web/tools/search.py (limited to 'src/ollama_web/tools/search.py') diff --git a/src/ollama_web/tools/search.py b/src/ollama_web/tools/search.py new file mode 100644 index 0000000..0af2a3e --- /dev/null +++ b/src/ollama_web/tools/search.py @@ -0,0 +1,45 @@ +"""Web search tool backed by DuckDuckGo (ddgs).""" + +from __future__ import annotations + +from ddgs import DDGS + +from ..config import settings + + +def web_search(query: str, max_results: int | None = None) -> list[dict[str, str]]: + """Search the web using DuckDuckGo and return compact result summaries. + + Args: + query: The search query string. + max_results: Maximum number of results to return (default from settings). + + Returns: + A list of dictionaries with keys 'title', 'href' and 'body' for each + result. Returns an empty list if the search fails or no results are found. + """ + if not query or not query.strip(): + return [] + + limit = ( + max_results + if max_results is not None and max_results > 0 + else settings.search_max_results + ) + + results: list[dict[str, str]] = [] + try: + with DDGS() as ddgs: + for item in ddgs.text(query, max_results=limit): + results.append( + { + "title": str(item.get("title", "")).strip(), + "href": str(item.get("href") or item.get("url") or "").strip(), + "body": str(item.get("body") or item.get("snippet") or "").strip(), + } + ) + except Exception: # noqa: BLE001 + # Swallow network/runtime errors so the chat loop can continue. + return [] + + return results[:limit] -- cgit v1.2.3