|
""" |
|
Wikipedia Search Tool for comprehensive background information |
|
""" |
|
from .base_tool import BaseTool |
|
from typing import Optional |
|
|
|
|
|
class WikipediaSearchTool(BaseTool): |
|
"""Search Wikipedia for comprehensive background information""" |
|
|
|
def __init__(self): |
|
super().__init__("Wikipedia", "Search Wikipedia for comprehensive background information and authoritative data") |
|
self.rate_limit_delay = 1.0 |
|
|
|
def search(self, query: str, max_results: int = 3, **kwargs) -> str: |
|
"""Search Wikipedia for comprehensive information""" |
|
self.rate_limit() |
|
|
|
try: |
|
import wikipedia |
|
|
|
|
|
search_results = wikipedia.search(query, results=max_results) |
|
if not search_results: |
|
return f"**Wikipedia Research for: {query}**\n\nNo Wikipedia articles found for: {query}" |
|
|
|
result = f"**Wikipedia Research for: {query}**\n\n" |
|
|
|
for i, search_term in enumerate(search_results[:max_results]): |
|
try: |
|
|
|
page = wikipedia.page(search_term) |
|
summary = page.summary[:800] + "..." if len(page.summary) > 800 else page.summary |
|
|
|
result += f"**Article {i+1}: {page.title}**\n" |
|
result += f"{summary}\n" |
|
result += f"Source: {page.url}\n\n" |
|
|
|
except wikipedia.exceptions.DisambiguationError as e: |
|
|
|
try: |
|
page = wikipedia.page(e.options[0]) |
|
summary = page.summary[:600] + "..." if len(page.summary) > 600 else page.summary |
|
result += f"**Article {i+1}: {page.title}**\n" |
|
result += f"{summary}\n" |
|
result += f"Source: {page.url}\n\n" |
|
except: |
|
result += f"**Article {i+1}:** Multiple options found for '{search_term}'\n\n" |
|
|
|
except wikipedia.exceptions.PageError: |
|
result += f"**Article {i+1}:** Page not found for '{search_term}'\n\n" |
|
|
|
except Exception as e: |
|
result += f"**Article {i+1}:** Error accessing '{search_term}': {str(e)[:50]}...\n\n" |
|
|
|
return result |
|
|
|
except ImportError: |
|
return f"**Wikipedia Research for: {query}**\n\nWikipedia library not available. Please install with: pip install wikipedia\n\n" |
|
except Exception as e: |
|
return self.format_error_response(query, str(e)) |
|
|
|
def should_use_for_query(self, query: str) -> bool: |
|
"""Wikipedia is good for factual, historical, and encyclopedic information""" |
|
encyclopedic_indicators = [ |
|
'what is', 'who is', 'history of', 'definition', 'background', |
|
'overview', 'explain', 'about', 'biography', 'concept' |
|
] |
|
|
|
query_lower = query.lower() |
|
return any(indicator in query_lower for indicator in encyclopedic_indicators) |
|
|
|
def extract_key_info(self, text: str) -> dict: |
|
"""Extract key information from Wikipedia results""" |
|
base_info = super().extract_key_info(text) |
|
|
|
if text: |
|
|
|
base_info.update({ |
|
'has_categories': 'Category:' in text, |
|
'has_references': any(ref in text for ref in ['Retrieved', 'Archived', 'ISBN']), |
|
'is_biographical': any(bio in text.lower() for bio in ['born', 'died', 'biography', 'life']), |
|
'is_historical': any(hist in text.lower() for hist in ['century', 'founded', 'established', 'ancient']), |
|
'article_count': text.count('**Article') |
|
}) |
|
|
|
return base_info |