107 lines
3.5 KiB
Python
107 lines
3.5 KiB
Python
#!/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
|