Dies ist das vollständige Begleitprojekt zum Blogbeitrag „Agentic BI für KMU in der Praxis: Ein Schweizer SaaS-Fall mit nao".
Es enthält alles, was nötig ist, um den im Beitrag beschriebenen Aufbau selbst zu reproduzieren:
- vollständiges SQL-Schema (
schema.sql) - deterministisches Seed-Skript (
seed.py) mit über 280'000 realistischen Datensätzen - nao-Konfiguration (
nao_config.yaml) - kanonische Geschäftsregeln (
RULES.md) - vier YAML-Tests (
tests/) - Beispielqueries für den Agenten (
queries/) - lokaler Test-Runner (
run_tests.py) als Pendant zunao test
# 1. DuckDB installieren
pip install duckdb
# 2. Datenbank seeden (deterministisch, Seed=42)
# Alternativ: fertige Demo-DB liegt im Repo (pulscheck.duckdb) → Schritt optional
python seed.py
# 3. Tests gegen die DB validieren (ohne LLM)
pip install pyyaml
python run_tests.pyErwarteter Output: 4/4 passed.
pulscheck-analytics/
├── README.md
├── schema.sql # DuckDB-Schema, 6 Tabellen
├── seed.py # Generator für 280k+ Zeilen
├── verify_tests.py # Verifikationsskript für Erwartungswerte
├── run_tests.py # Lokaler Test-Runner (nao-test-Pendant)
├── pulscheck.duckdb # Fertige Demo-DB (im Repo, via seed.py reproduzierbar)
├── nao_config.yaml # nao-Konfiguration
├── RULES.md # Kanonische Geschäftsregeln (MECE)
├── tests/
│ ├── mrr_end_of_april.yml
│ ├── churn_april.yml
│ ├── package_revenue_q1.yml
│ └── dormant_subscribers.yml
├── queries/
│ ├── mrr_at_date.sql
│ └── dormant_subscribers.sql
├── docs/
│ └── data_model.md # menschenlesbare Schema-Doku
└── agent/
├── mcps/
└── skills/
| Tabelle | Zweck | Zeilen (Seed) |
|---|---|---|
customers |
Stammdaten | 4'200 |
subscriptions |
Abo-Historie (active/paused/churned) | ca. 3'600 |
invoices |
Abrechnung (subscription + response_package) | ca. 55'000 |
response_packages |
Pay-per-Use-Paketkäufe (S/M/XL) | ca. 7'500 |
surveys |
erstellte Befragungen (de/fr/it/en) | ca. 6'300 |
survey_responses |
einzelne ausgefüllte Befragungen | ca. 206'000 |
Vollständige Spaltenbeschreibungen siehe docs/data_model.md.
| Test | Erwartet |
|---|---|
mrr_end_of_april |
MRR = 57'331.32 CHF, 2'868 aktive Subscriptions |
churn_april |
108 gechurnte Kund:innen, 2'158.92 CHF verlorener MRR |
package_revenue_q1 |
Sieger: M (13'699 CHF, 43.6 %), gefolgt von XL (29.1 %), S (27.3 %) |
dormant_subscribers |
2'229 durchgehend aktive Sub-Kund:innen ohne Paketkauf im April |
Diese Werte sind durch den fixen Random-Seed reproduzierbar.
Die nao_config.yaml ist heute auf type: duckdb gestellt, damit das Demo-Setup
ohne externe Datenbank funktioniert. Für ein nao-Setup mit dem offiziellen
nao-core CLI:
pip install nao-core
# .env mit ANTHROPIC_API_KEY befüllen
nao debug
nao sync
nao chat
nao test # in einem zweiten Terminal
nao test server # für die UI auf http://localhost:8765In Produktion wird die DuckDB-Verbindung in nao_config.yaml durch eine
PostgreSQL-Verbindung ersetzt – siehe Kommentarblock in der Datei.
Demo-Code zu Lehrzwecken. Daten sind synthetisch und enthalten keine echten personenbezogenen Informationen.