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.

Demo öffnen →

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

01Anfrage Freitext aus E-Mail oder Gesprächsnotiz
02Abgleich Stichwortsuche gegen zehn Checklisten-Themen
03Report Erkannt, kritisch offen, nicht blockierend
04Mensch Rückfragen stellen, Bestand vor Ort aufnehmen

Version 1 · Python-Werkzeug

läuft

Ein 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.

Demo öffnen →

Version 2 · Oberfläche

läuft

Die 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.

Demo öffnen →

Garden Intake · Anfrage Fam. R., 3400 Klosterneuburg
10Themen geprüft
7erkannt
3kritisch offen
0geschätzt
ThemaStatusBeleg im Text
Grundstücksgröße/-lageerkannt, grundstück
Bestand: Vegetationerkanntbaum, hecke, walnuss
Expositionerkanntsüden, ausgerichtet
Nutzungswünscheerkanntterrasse, rasen, spielen
Budgeterkanntkostenschätzung
Bodenbeschaffenheitoffenkein Beleg
Leitungen im Bodenoffenkein Beleg
Rechtliche Rahmenoffenkein 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

aufgezeichnet

Die 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 →

01Regelprüfung Checkliste findet drei offene Themen
02Strukturierte Lücken Thema, Einstufung, fehlender Beleg
03Sprachmodell formuliert Rückfragen über eine API
04Mensch prüft, ergänzt, gibt frei
Garden Intake · Rückfragen für das Erstgespräch

Entwurf aus 3 offenen Punkten – noch nicht freigegeben

Liegt für das Grundstück eine Bodenuntersuchung vor, oder ist bekannt, ob der Boden eher lehmig oder durchlässig ist? Grundlage: Thema „Bodenbeschaffenheit“ – kein Beleg im Text
Sind auf der Fläche Leitungen, Kanäle oder Drainagen verlegt, und liegen dazu Pläne vor? Grundlage: Thema „Unterirdische Infrastruktur“ – kein Beleg im Text
Gibt es Vorgaben aus dem Bebauungsplan oder Auflagen der Baubehörde, die die Gestaltung einschränken? Grundlage: Thema „Rechtliche Rahmenbedingungen“ – kein Beleg im Text
Übernehmen Neu formulieren Verwerfen Nichts verlässt das Werkzeug ohne Freigabe.

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: kosten findet 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.