#!/usr/bin/env python3 """ DDGS Search Tool - инструмент для поиска в интернете через DuckDuckGo. Бот может использовать этот инструмент автономно, когда пользователю нужна свежая информация из интернета. """ import sys import json import logging from pathlib import Path from typing import List, Dict, Any from bot.tools import BaseTool, ToolResult, register_tool logger = logging.getLogger(__name__) class DDGSTool(BaseTool): """Инструмент поиска через DuckDuckGo.""" name = "ddgs_tool" description = "Поиск информации в интернете через DuckDuckGo. Используется когда нужны свежие данные, новости, факты." category = "search" def __init__(self, tools_dir: str = None): self.tools_dir = Path(tools_dir) if tools_dir else Path(__file__).parent.parent / "tools" self.script_path = self.tools_dir / "ddgs_search.py" def _search_ddgs(self, query: str, max_results: int = 10) -> List[Dict]: """ Выполнить поиск через ddgs. Args: query: Поисковый запрос max_results: Максимальное количество результатов Returns: Список результатов с title, href, body """ try: from ddgs import DDGS except ImportError: logger.error("ddgs library not found. Install: pip install ddgs") return [] try: ddgs = DDGS() results = ddgs.text(query, max_results=max_results) formatted_results = [] for result in results: formatted_result = { "title": result.get("title", ""), "href": result.get("href", ""), "body": result.get("body", "") } formatted_results.append(formatted_result) return formatted_results except Exception as e: logger.error(f"Ошибка DDGS поиска: {e}") return [] async def execute(self, query: str, max_results: int = 10) -> ToolResult: """ Выполнить поиск. Args: query: Поисковый запрос max_results: Максимальное количество результатов (default: 10) """ if not query or not query.strip(): return ToolResult( success=False, error="Пустой поисковый запрос" ) logger.info(f"DDGS поиск: '{query}' (max_results={max_results})") results = self._search_ddgs(query, max_results) if not results: return ToolResult( success=True, data=[], metadata={'message': 'Ничего не найдено', 'query': query} ) return ToolResult( success=True, data=results, metadata={ 'query': query, 'count': len(results), 'max_results': max_results } ) # Автоматическая регистрация при импорте @register_tool class DDGSToolAuto(DDGSTool): """Авто-регистрируемая версия DDGSTool.""" pass