| | import importlib |
| |
|
| | __all__ = ['WikipediaTool'] |
| |
|
| |
|
| | class WikipediaTool(): |
| | dependencies = ["requests==2.32.3", "beautifulsoup4==4.13.3"] |
| |
|
| | inputSchema = { |
| | "name": "WikipediaTool", |
| | "description": "Searches Wikipedia for a given question and returns a short summary.", |
| | "parameters": { |
| | "type": "object", |
| | "properties": { |
| | "question": { |
| | "type": "string", |
| | "description": "The topic or question to search on Wikipedia.", |
| | } |
| | }, |
| | "required": ["question"], |
| | } |
| | } |
| |
|
| | def run(self, **kwargs): |
| | question = kwargs.get("question") |
| | if not question: |
| | return { |
| | "status": "error", |
| | "message": "Missing required parameter: 'question'", |
| | "output": None |
| | } |
| |
|
| | print(f"Searching Wikipedia for: {question}") |
| |
|
| | requests = importlib.import_module("requests") |
| | bs4 = importlib.import_module("bs4") |
| | BeautifulSoup = bs4.BeautifulSoup |
| |
|
| | search_url = "https://en.wikipedia.org/w/api.php" |
| | search_params = { |
| | "action": "query", |
| | "format": "json", |
| | "list": "search", |
| | "srsearch": question, |
| | "srlimit": 1, |
| | } |
| |
|
| | try: |
| | response = requests.get(search_url, params=search_params) |
| | if response.status_code != 200: |
| | return { |
| | "status": "error", |
| | "message": "Wikipedia API request failed.", |
| | "output": None, |
| | } |
| |
|
| | data = response.json() |
| | search_results = data.get("query", {}).get("search", []) |
| |
|
| | if not search_results: |
| | return { |
| | "status": "error", |
| | "message": "No results found on Wikipedia.", |
| | "output": None, |
| | } |
| |
|
| | top_result = search_results[0]["title"] |
| | page_url = f"https://en.wikipedia.org/wiki/{top_result.replace(' ', '_')}" |
| | print(f"Fetching full content from: {page_url}") |
| |
|
| | html_url = f"https://en.wikipedia.org/api/rest_v1/page/html/{top_result.replace(' ', '_')}" |
| | html_response = requests.get(html_url) |
| |
|
| | if html_response.status_code != 200: |
| | return { |
| | "status": "error", |
| | "message": "Failed to fetch article content.", |
| | "output": None, |
| | } |
| |
|
| | soup = BeautifulSoup(html_response.text, "html.parser") |
| | paragraphs = [p.get_text() for p in soup.find_all("p") if p.get_text()] |
| | full_text = " ".join(paragraphs) |
| | summary = " ".join(full_text.split(". ")[:5]) |
| |
|
| | output_text = f"**{top_result}**\n{summary}...\n[Read more]({page_url})" |
| |
|
| | return { |
| | "status": "success", |
| | "message": "Wikipedia article summary retrieved successfully.", |
| | "output": output_text, |
| | } |
| |
|
| | except Exception as e: |
| | return { |
| | "status": "error", |
| | "message": f"Exception occurred: {str(e)}", |
| | "output": None, |
| | } |
| |
|