In 20 Zeilen Python: ein Wetter-Werkzeug für deinen KI-Assistenten
In 20 Zeilen Python: ein Wetter-Werkzeug für deinen KI-Assistenten
Sprachmodelle formulieren gut. Aktuelle Zahlen erfinden sie auch gut, nur stimmen die dann selten. Wetter ist genau so ein Fall: Die Worte kann das Modell liefern, die Werte muss es von woanders holen. Hier ist ein kleines, ehrliches Beispiel, wie man ihm diese Werte besorgt, ohne Schlüssel, ohne Anmeldung, ohne eine Zeile HTML zu parsen.
Die eine Funktion, die du brauchst
Der Plan ist simpel. Stadtname rein, sauberes Markdown raus. Den Zwilling bei regnets.de bekommt man, indem man .md an die Adresse hängt.
import requests
def slug(ort: str) -> str:
# Umlaute aufloesen, klein, Leerzeichen zu Bindestrichen
repl = {"ä": "ae", "ö": "oe", "ü": "ue", "ß": "ss"}
s = ort.strip().lower()
for k, v in repl.items():
s = s.replace(k, v)
return "-".join(s.split())
def wetter(ort: str, zeitraum: str = "") -> str:
"""Liefert die Vorhersage als Markdown. zeitraum: '', 'morgen',
'wochenende', '7-tage', '14-tage' oder ein Datum wie '2026-06-09'."""
pfad = f"/wetter/{slug(ort)}"
if zeitraum:
pfad += f"/{zeitraum}"
r = requests.get(f"https://regnets.de{pfad}.md", timeout=10)
r.raise_for_status()
return r.text
print(wetter("München", "wochenende"))
Aus "München" wird muenchen, aus "Frankfurt am Main" wird frankfurt-am-main. Die erste Zeile der Antwort ist immer eine Zusammenfassung samt Konfidenz. Oft reicht das schon, ohne dass das Modell die ganze Tabelle braucht.
Als Werkzeug ans Modell hängen
Wenn dein Assistent Funktionsaufrufe ("tools") unterstützt, beschreibst du die Funktion einmal und lässt das Modell entscheiden, wann es sie aufruft. Feste Auswahllisten gehören als enum ins Schema, dann hält sich das Modell daran:
tool = {
"name": "wetter",
"description": "Aktuelle Wettervorhersage oder gemessene Vergangenheit "
"fuer einen Ort in Deutschland, Quelle Deutscher Wetterdienst.",
"input_schema": {
"type": "object",
"properties": {
"ort": {"type": "string", "description": "Stadt in Deutschland"},
"zeitraum": {
"type": "string",
"enum": ["", "morgen", "wochenende", "7-tage", "14-tage"],
"description": "leer = heute. Auch ein Datum JJJJ-MM-TT ist erlaubt."
}
},
"required": ["ort"]
}
}
Fragt der Nutzer "Soll ich am Samstag in Konstanz grillen?", ruft das Modell wetter("Konstanz", "wochenende") auf. Den zurückgegebenen Text gibst du als Tool-Ergebnis ins Gespräch zurück, und erst daraus formuliert das Modell seine Antwort. Schematisch:
if block.type == "tool_use": # das Modell will das Werkzeug nutzen
text = wetter(**block.input) # Markdown vom Server holen
nachricht = {"role": "user", "content": [
{"type": "tool_result", "tool_use_id": block.id, "content": text}
]}
# nachricht zurueck ans Modell, das daraus die finale Antwort schreibt
Dass die Vergangenheit dieselbe Funktion bedient (wetter("Konstanz", "2026-05-21") liefert die gemessenen Werte), ist praktisch, wenn jemand fragt, ob es letzte Woche schöner war.
Ein bisschen Anstand
Drei Dinge, die ich mir wünsche und die deinem Tool auch guttun.
Erstens: cachen. Die Vorhersage ändert sich höchstens halbstündlich, der Server muss nicht bei jeder Frage neu antworten. Ein kleiner Cache über ein paar Minuten reicht völlig.
Zweitens: die Quelle nennen. Am Ende jeder Markdown-Seite steht die Bitte um "regnets.de (Daten: DWD)". Die Daten stehen unter CC BY, nutzen ist ausdrücklich erwünscht. Ein Quellenhinweis hält es fair und macht die Antwort deines Assistenten nachvollziehbar.
Drittens: ehrlich bleiben. Die Konfidenzangabe steht nicht zum Spaß da. Wenn dort "unsicher" steht, gib das weiter, statt die Zahl als Gewissheit zu verkaufen. Das ist die ganze Idee hinter der Seite, und sie funktioniert nur, wenn beide Enden mitspielen.
Was als Nächstes kommt
Diese Variante über .md-Adressen funktioniert heute und überall. Der nächste Schritt ist eine offizielle Anbindung als Connector, damit man regnets.de in Claude und ähnlichen Assistenten direkt zuschalten kann, ohne selbst Code zu schreiben. Bis dahin sind die zwanzig Zeilen oben alles, was es braucht.