From 710c580149c2f2098f90b64a1e6346c4ef84d4ca Mon Sep 17 00:00:00 2001 From: Till Immer Date: Tue, 7 Jul 2026 07:17:14 +0000 Subject: [PATCH] tools/web_search.py aktualisiert --- tools/web_search.py | 98 +++++++++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 43 deletions(-) diff --git a/tools/web_search.py b/tools/web_search.py index 43c638b..0c33172 100644 --- a/tools/web_search.py +++ b/tools/web_search.py @@ -1,66 +1,78 @@ -import requests +import asyncio from datetime import datetime +from ddgs import DDGS + + async def web_search(query: str, max_results: int = 5): """ - Sucht im Internet und gibt aktuelle, relevante Ergebnisse zurück. + Durchsucht das Internet mit DuckDuckGo. """ + try: - # DuckDuckGo (kostenlos, kein API-Key nötig) - url = "https://api.duckduckgo.com/" - params = { - "q": query, - "format": "json", - "no_html": 1, - "skip_disambig": 1 - } - response = requests.get(url, params=params, timeout=8) - data = response.json() + def search(): + with DDGS() as ddgs: + return list( + ddgs.text( + query, + max_results=max_results, + ) + ) - results = [] - for result in data.get("RelatedTopics", [])[:max_results]: - if 'Text' in result and 'FirstURL' in result: - results.append({ - "title": result.get("Text", "")[:150], - "url": result.get("FirstURL", ""), - "snippet": result.get("Text", "")[:300] - }) + results = await asyncio.to_thread(search) if not results: - return "Keine relevanten Suchergebnisse gefunden." + return "Keine Suchergebnisse gefunden." + + output = ( + f"Suchergebnisse für '{query}' " + f"(Stand {datetime.now():%d.%m.%Y %H:%M})\n\n" + ) - output = f"Suchergebnisse für '{query}' (Stand: {datetime.now().strftime('%d.%m.%Y %H:%M')}):\n\n" for i, r in enumerate(results, 1): - output += f"{i}. {r['title']}\n" - output += f" {r['url']}\n" - output += f" {r['snippet']}\n\n" + + title = r.get("title", "Kein Titel") + body = r.get("body", "") + href = r.get("href", "") + + output += ( + f"{i}. {title}\n" + f" {href}\n" + f" {body}\n\n" + ) return output except Exception as e: - return f"Fehler bei der Internetsuche: {str(e)}" + return f"Fehler bei der Websuche: {e}" -# Tool-Beschreibung für MCP / Bedrock web_search_tool = { - "name": "web_search", - "description": "Sucht aktuelle Informationen im Internet. Nutze dies für Nachrichten, Wetter, Fakten, Preise, aktuelle Ereignisse usw.", - "inputSchema": { - "json": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "Die Suchanfrage (z.B. 'Wetter Berlin heute', 'Aktueller Bitcoin Preis', 'Wer ist Bundeskanzler 2026')" + "toolSpec": { + "name": "web_search", + "description": ( + "Durchsucht das Internet nach aktuellen Informationen, " + "Nachrichten, Fakten, Wetter, Preisen und Ereignissen." + ), + "inputSchema": { + "json": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "Suchanfrage" + }, + "max_results": { + "type": "integer", + "description": "Maximale Anzahl Ergebnisse", + "default": 5 + } }, - "max_results": { - "type": "integer", - "description": "Maximale Anzahl Ergebnisse (Standard: 5)", - "default": 5 - } - }, - "required": ["query"] + "required": [ + "query" + ] + } } } } \ No newline at end of file