telegram-cli-bot/bot/tools/ddgs_tool.py

107 lines
3.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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