Automatisierung · Python
Garden Intake
Projektanfragen auf Vollständigkeit prüfen: Welche Themen sind schon erwähnt, und wo muss vor dem Erstgespräch nachgefragt werden?
Was es tut
Liest eine formlose Anfrage, prüft sie gegen zehn fachlich definierte Themen, weist jeden Treffer mit dem auslösenden Stichwort aus und trennt fehlende Themen in kritisch und nicht blockierend. Läuft im Browser, in unter einer Sekunde.
Ausgangslage
Eine Anfrage für einen Privatgarten kommt selten als ausgefülltes Formular. Sie kommt als E-Mail, als Gesprächsnotiz oder als loser Text.
In so einem Text stecken viele planungsrelevante Angaben, aber sie sind über mehrere Absätze verteilt: die Ausrichtung nach Süden unter „Ausgangslage“, der Zeithorizont im ersten Absatz, der Kostenrahmen ganz am Schluss. Und was nicht dasteht, fällt beim Lesen naturgemäß am wenigsten auf – genau das ist aber vor einem Erstgespräch die wichtigere Information.
Die fachliche Checkliste
Zehn Themen, die vor einem Erstgespräch geklärt sein sollten. Jedes ist im Code als kritisch oder nicht blockierend eingestuft:
- Grundstücksgröße
- Vegetation
- Boden
- Exposition
- Leitungen
- Nutzungswünsche
- Budget
- Zeitrahmen
- Rechtliches
- Pflegeaufwand
Ablauf
Version 1 · Python-Werkzeug
läuftEin Skript aus der Python-Standardbibliothek. Es liest die Anfrage, gleicht sie gegen die Checkliste ab und schreibt einen Report als Markdown-Datei. Keine Installation, keine Abhängigkeiten.
Eingabe · intake_beispiel.txt
Projektanfrage – Neugestaltung Privatgarten Grundstücksgröße: ca. 650 m² Wunsch: Neugestaltung des Gartens rund um einen Neubau, Fertigstellung Haus voraussichtlich Frühjahr nächstes Jahr. Ausgangslage: Das Grundstück ist derzeit Baustelle, Erdaushub liegt noch teilweise auf der Fläche. Der Garten ist nach Süden ausgerichtet, angrenzend an ein Nachbargrundstück mit hoher Thujenhecke. Ein alter Walnussbaum soll erhalten bleiben. Wünsche der Familie: - Terrasse direkt am Wohnzimmer, ca. 25-30 m² - Rasenfläche zum Spielen für zwei Kinder - Sichtschutz zur Straße - Wenig Pflegeaufwand - Wassersparend, falls möglich Sonstiges: Ein erstes Konzept mit grober Kostenschätzung wäre hilfreich.
Auszug, gekürzt.
Ausgabe · intake_report.md
## Vorhanden - **Grundstücksgröße/-lage** – gefunden (Stichwörter: m², grundstück) - **Bestand: Vegetation/Bäume** – gefunden (Stichwörter: baum, hecke, walnuss) - **Exposition/Lichtverhältnisse** – gefunden (Stichwörter: süden, osten, ausgerichtet) - **Nutzungswünsche** – gefunden (Stichwörter: terrasse, rasen, spielen, …) - **Budget/Kostenrahmen** – gefunden (Stichwörter: kostenschätzung, kosten) - **Zeitrahmen/Termine** – gefunden (Stichwörter: frühjahr, fertigstellung) - **Pflegeaufwand/Wasserbedarf** – gefunden (Stichwörter: pflegeaufwand, wassersparend) ## Fehlt – kritisch für die weitere Planung - **Bodenbeschaffenheit** - **Unterirdische Infrastruktur (Leitungen)** - **Rechtliche Rahmenbedingungen**
Quellcode ansehen – Checkliste und Prüflogik
# Checkliste: Kategorie -> (Keywords zur Erkennung, kritisch?)
# Die Stichwörter sind bewusst eng gehalten. Ein zu breites Wort (z. B. "garten"
# für die Grundstücksgröße) würde fast jede Anfrage als vollständig ausweisen und
# damit echte Lücken verdecken.
CHECKLIST = {
"Grundstücksgröße/-lage": (["m²", "grundstück"], True),
"Bestand: Vegetation/Bäume": (["baum", "bäume", "hecke", "walnuss", "gehölz"], True),
# "erdaushub" wurde bewusst entfernt: Aushub auf der Fläche sagt nichts über
# die Bodenbeschaffenheit aus. Der Treffer hätte eine offene Frage verdeckt.
"Bodenbeschaffenheit": (["boden", "lehm", "sand", "durchlässig"], True),
"Exposition/Lichtverhältnisse": (["süden", "norden", "osten", "westen", "ausgerichtet", "sonnig", "schatten"], True),
"Unterirdische Infrastruktur (Leitungen)": (["leitung", "kanal", "wasserleitung", "stromleitung", "drainage"], True),
"Nutzungswünsche/Funktionsprogramm": (["terrasse", "rasen", "spielen", "gemüsebeet", "sichtschutz"], False),
"Budget/Kostenrahmen": (["budget", "kostenschätzung", "€", "euro", "kosten"], True),
"Zeitrahmen/Termine": (["frühjahr", "termin", "fertigstellung", "woche", "monat"], False),
"Rechtliche Rahmenbedingungen (Bebauungsplan etc.)": (["bebauungsplan", "widmung", "baubehörde", "auflage"], True),
"Pflegeaufwand/Wasserbedarf": (["pflegeaufwand", "pflegeleicht", "wassersparend", "bewässerung"], False),
}
def check_intake(text: str) -> dict:
text_lower = text.lower()
results = {}
for category, (keywords, critical) in CHECKLIST.items():
found_terms = [kw for kw in keywords if kw in text_lower]
results[category] = {
"gefunden": bool(found_terms),
"treffer": found_terms,
"kritisch": critical,
}
return results
Die Kernlogik ist durch acht kleine Tests abgesichert
(python3 intake_checker.py --selftest), die ohne
zusätzliche Abhängigkeiten laufen. Dieselben Regeln laufen als
JavaScript-Portierung im Browser – dort gegen 14 Testfälle, die Sie
selbst ausführen können.
Version 2 · Oberfläche
läuftDie Auswertung ohne Terminal. Diese Oberfläche ist gebaut und bedienbar: Das Regelwerk wurde nach JavaScript portiert und läuft im Browser des Besuchers – die gezeigten Werte werden dort berechnet, nicht eingetragen. Für dieselbe Anfrage liefert sie dasselbe Ergebnis wie das Python-Skript oben.
| Thema | Status | Beleg im Text |
|---|---|---|
| Grundstücksgröße/-lage | erkannt | m², grundstück |
| Bestand: Vegetation | erkannt | baum, hecke, walnuss |
| Exposition | erkannt | süden, ausgerichtet |
| Nutzungswünsche | erkannt | terrasse, rasen, spielen |
| Budget | erkannt | kostenschätzung |
| Bodenbeschaffenheit | offen | kein Beleg |
| Leitungen im Boden | offen | kein Beleg |
| Rechtliche Rahmen | offen | kein Beleg |
Standbild der laufenden Oberfläche, Auszug aus 10 geprüften Themen. Die Spalte „Beleg im Text“ ist bewusst fester Bestandteil: Ohne sie wäre nicht prüfbar, warum ein Thema als erkannt gilt.
Version 3 · KI-gestützte Rückfragen
aufgezeichnetDie Regeln finden die Lücke. Das Sprachmodell formuliert daraus die Frage, die im Erstgespräch tatsächlich gestellt wird – und nennt dazu, aus welcher Lücke sie stammt.
Diese Stufe ist einmal echt gelaufen: Das Modell hat nicht den Anfragetext bekommen, sondern nur die Liste der offenen Themen aus der Regelprüfung. Die Antwort wurde gegen die Vorgabe validiert und gespeichert. In der Demo steht sie mit Modellname, Datum und Token-Verbrauch daneben, dazu der Prompt und die Validierung im Klartext. Live geschaltet wird sie über eine Serverless-Funktion, in der der API-Schlüssel serverseitig liegt.
Aufgezeichnete Antwort in der Demo ansehen →
Entwurf aus 3 offenen Punkten – noch nicht freigegeben
Entwurf der Oberfläche, nicht bedienbar. Die Zeile „Grundlage“ unter jeder Frage ist der Kern: Man sieht, aus welcher Regel die Frage entstanden ist – nicht nur, dass ein Modell sie erzeugt hat.
Was das Modell ausdrücklich nicht tut
Es entscheidet nicht, ob ein Thema abgedeckt ist. Das bleibt bei der Checkliste. Ein Modell, das selbst einstuft, könnte nicht mehr begründen, warum ein Thema als erkannt gilt – und genau diese Begründung ist der Zweck des Werkzeugs.
Ein Fehler, den die Demo selbst sichtbar gemacht hat
Der Beispieltext erwähnt, dass „Erdaushub noch teilweise auf der
Fläche liegt“. Eine frühere Fassung der Checkliste wertete das Wort
erdaushub als Beleg für das Thema Bodenbeschaffenheit –
fachlich falsch, denn Aushub auf der Fläche sagt nichts über den
anstehenden Boden aus.
Der Treffer hätte eine echte offene Frage als beantwortet erscheinen lassen. Das Stichwort wurde entfernt; das Thema erscheint jetzt korrekt als offener kritischer Punkt.
Auffindbar war der Fehler nur, weil der Report zu jedem Treffer das auslösende Stichwort mitschreibt. Das ist der eigentliche Grund, warum solche Werkzeuge ihre Begründung mitliefern müssen.
Automatisierung
- durchsucht den Text nach hinterlegten Stichwörtern
- ordnet Treffer den Themen zu und nennt das auslösende Wort
- trennt fehlende Themen in kritisch und nicht blockierend
Mensch
- definiert die Checkliste und die Stichwörter
- legt fest, welche Themen kritisch sind
- beurteilt, ob eine erkannte Angabe planerisch ausreicht
- führt die Bestandsaufnahme vor Ort durch
Grenzen
- Stichwortsuche ist keine fachliche Interpretation. Das Skript erkennt Wörter, nicht Bedeutung. Ein Text, der dasselbe Thema mit anderen Begriffen beschreibt, wird nicht erkannt.
- Ein erkanntes Thema heißt nicht, dass die Information vollständig ist. „Süden“ reicht als Wort für einen Treffer, aber nicht für eine Planung.
-
Gesucht wird auch in Wortteilen:
kostenfindet deshalb auch „Kostenschätzung“. Das ist gewollt, kann aber im Einzelfall unerwartet greifen. - Die Prüfung ersetzt keine Bestandsaufnahme vor Ort. Alle fachlichen Entscheidungen bleiben beim Menschen.
- Die Beispielanfrage ist ein Demonstrationstext und enthält keine E-Mail-Adressen, Telefonnummern oder Anschriften.
Dateien
- intake_beispiel.txt Eingabe
- intake_checker.py Logik
- intake_report.md Ausgabe
- rules-garden.js Regelwerk
- tests-garden.js Tests
- case_beschreibung.md Doku
Das Skript nutzt nur die Python-Standardbibliothek, die Browser-Fassung reines JavaScript ohne Bibliotheken. In beiden Fällen: kein Internetzugriff, keine Datenbank. Die vollständigen Dateien sende ich auf Anfrage gerne zu.