v1.37: KI-Assistent N8N-Workflow fertig eingerichtet; alle Formulare 2-spaltig mit neuem Design

- N8N: Workflow serverseitig in DB eingespielt (Webhook mp-assist, Code-Node mit
  Kimi-Tool-Calling, keine Credentials), E2E live verifiziert
- Formulare: shared FormSection-Komponente (2 gleich breite Spalten, Wide fuer
  Volllbreiten-Felder), 10 Formulare umgebaut, Dialoge verbreitert
- Design: Inter + Sora Fonts, Teal-Akzente, Icons in Sektionskoepfen
This commit is contained in:
2026-10-04 21:30:34 +02:00
parent 9d14d367ee
commit 6eec3ac437
16 changed files with 540 additions and 645 deletions
+59 -26
View File
@@ -2,51 +2,84 @@
Der Assistent läuft so: **Portal-Chat → N8N-Webhook → Kimi (Moonshot API) mit 6 Portal-Tools → Antwort zurück ins Portal.**
## 1. Voraussetzungen
> **Stand: Der Workflow ist auf dem Produktivsystem (hocks.eu) bereits serverseitig eingerichtet und aktiv.**
> Die Datei `assist-workflow.json` in diesem Ordner ist die dokumentierte Referenz-Version.
> Der produktive Workflow wurde direkt in die N8N-Datenbank eingespielt, weil die lokale
> N8N-API in Version 2.x keinen zuverlässigen programmatischen Import erlaubt (401-Problem).
> Bei einem Re-Import auf einem anderen System müssen die drei Platzhalter im Code-Node belegt werden.
- N8N läuft auf dem VPS (Container `n8n`).
- Kimi-API-Key von <https://platform.moonshot.ai> (Aufladung ab ~5 $; Verbrauch des Assistenten liegt typisch unter 5 €/Monat bei 20 Fragen/Tag, Modell `kimi-k2.6`: ~0,4 US-Cent pro Frage).
## 1. Architektur des Workflows
## 2. N8N-Workflow importieren
Ein einzelner Workflow **„Mieterportal – KI-Assistent (Kimi)"**, Webhook `POST mp-assist`, drei Nodes:
1. N8N öffnen → **Workflows → Import from File** → `assist-workflow.json` aus diesem Ordner.
2. Nach dem Import drei Platzhalter anpassen:
1. **Webhook Portal** (`n8n-nodes-base.webhook`, typeVersion 2, responseMode `responseNode`)
– produktive URL: `http://n8n:5678/webhook/mp-assist` (internes Docker-Netz `npm_default`).
– Wichtig: Der Node braucht die Property **`webhookId`** (gleich der Node-ID) auf Root-Ebene,
sonst registriert n8n den Webhook bei `responseMode: responseNode` nicht (404 „not registered").
2. **Assistent (Kimi + Tools)** (`n8n-nodes-base.code`, typeVersion 2, runOnceForAllItems)
– Prüft den Header `x-assist-secret` selbst gegen das Shared Secret.
– Ruft `https://api.moonshot.ai/v1/chat/completions` (Modell `kimi-k2.6`) per
`this.helpers.httpRequest` auf, mit OpenAI-kompatiblem **Tool-Calling** für genau die
6 Portal-Endpunkte unter `/api/assist/tools/…` (Schleife, max. 6 Runden).
– **Kein `temperature`-Parameter** senden – `kimi-k2.6` akzeptiert nur `temperature: 1`,
sonst 400 „invalid temperature".
– **Kein `URLSearchParams`** im Sandbox-Code verwenden – nicht verfügbar; Query-Strings
manuell mit `encodeURIComponent` bauen.
– 429 (Rate-Limit) wird abgefangen und als freundliche Meldung zurückgegeben.
3. **Antwort an Portal** (`n8n-nodes-base.respondToWebhook`, typeVersion 1.1)
– `respondWith: json`, Body `={{ { antwort: $json.antwort } }}`.
| Wo | Was |
|---|---|
| Webhook-Node → Credentials | **Header Auth** anlegen: Name `x-assist-secret`, Wert = `ASSIST_SHARED_SECRET` |
| Kimi-Node → Credentials | **OpenAI API**-Credential anlegen: API Key = Moonshot-Key, Base URL `https://api.moonshot.ai/v1` |
| Alle 6 Tool-Nodes | Im Header `x-assist-key` den Wert `ASSIST_API_KEY` durch das echte Geheimnis ersetzen |
Der langchain-basierte Entwurf (AI-Agent-Node) wurde verworfen: Die `@n8n/n8n-nodes-langchain`-
Nodes liefen auf diesem Server nicht zuverlässig. Der Code-Node-Ansatz hat keine externen
Abhängigkeiten und keine Credentials (alle Geheimnisse als Literale im Code-Node).
3. Workflow **aktivieren** (Toggle oben rechts). Die Webhook-URL steht dann im Webhook-Node, z. B.
`https://n8n.hocks.eu/webhook/mp-assist` – sie wird in Schritt 3 gebraucht.
## 2. Geheimnisse (Platzhalter im Workflow-JSON)
## 3. Portal-Env auf dem Server ergänzen
| Platzhalter im Code-Node | Bedeutung | Wo konfiguriert |
|---|---|---|
| `<ASSIST_SHARED_SECRET>` | Header `x-assist-secret` zwischen Portal und n8n | `portal.env` (ASSIST_SHARED_SECRET) |
| `<ASSIST_KEY>` | Header `x-assist-key` für die 6 Tool-Endpunkte | `portal.env` (ASSIST_API_KEY) |
| `<KIMI_API_KEY>` | Moonshot-API-Key (`sk-…`) | Code-Node, Konstante ganz oben |
In `/opt/mieterportal/portal.env` (Datei auf dem VPS):
## 3. Portal-Env auf dem Server
In `/opt/mieterportal/portal.env` (nur auf dem VPS, gitignored):
```bash
N8N_ASSIST_WEBHOOK=https://n8n.hocks.eu/webhook/mp-assist
N8N_ASSIST_WEBHOOK=http://n8n:5678/webhook/mp-assist
ASSIST_SHARED_SECRET=<langes-zufaelliges-geheimnis-1>
ASSIST_API_KEY=<langes-zufaelliges-geheimnis-2>
```
Danach: `cd /opt/mieterportal && docker compose up -d` (nimmt die neuen Env-Variablen mit).
Danach: `cd /opt/mieterportal && docker compose up -d`.
## 4. Test
## 4. Kosten
Im Portal als Verwaltung: **KI-Assistent** in der Navigation → „Welche Wohnungen stehen leer?“
Der erste Aufruf dauert ggf. 10–30 s (Agent lädt Tools).
Kimi `kimi-k2.6`: ~0,4 US-Cent pro Frage (Systemprompt + Tool-Schleife). Bei 20 Fragen/Tag
typisch unter 5 €/Monat. Aufladung des Moonshot-Kontos ab ~5 $.
## 5. Test
Im Portal als Verwaltung: **KI-Assistent** in der Navigation → „Welche Wohnungen stehen leer?"
Der erste Aufruf dauert ggf. 10–60 s (Tool-Schleife).
Serverseitig direkt testbar:
```bash
docker exec mp-api node -e "fetch('http://n8n:5678/webhook/mp-assist',{method:'POST',headers:{'Content-Type':'application/json','x-assist-secret':'<SECRET1>'},body:JSON.stringify({frage:'Welche Wohnungen stehen leer?',verlauf:[],benutzer:'E2E'})}).then(async r=>console.log(r.status,await r.text()))"
```
## Fehlerbilder
| Fehlermeldung im Chat | Ursache |
| Fehlermeldung | Ursache |
|---|---|
| „noch nicht konfiguriert (N8N_ASSIST_WEBHOOK fehlt)" | Env-Variable fehlt / Container nicht neu gestartet |
| „Assistent antwortet nicht (N8N Status …)" | Webhook-URL falsch, Workflow nicht aktiv, oder Header-Secret passt nicht |
| „Assistent hat keine Antwort geliefert" | N8N liefert kein JSON `{ "antwort": "…" }` – Respond-Node prüfen |
| „braucht zu lange" | Kimi-Timeout > 90 s – Modell/Credential prüfen |
| „not registered" (404) | Workflow nicht aktiv, `webhookId` am Webhook-Node fehlt, oder n8n neu gestartet ohne Outbox-Eintrag |
| „invalid temperature" (400) | `temperature != 1` im Kimi-Payload |
| „Assistent antwortet nicht (N8N Status 500)" | Kimi 429 (Rate-Limit, kurz warten) oder Code-Fehler – Executions in n8n prüfen |
| Antwort „Tool … nicht erreichbar" | Portal-Tool-Endpunkte nicht erreichbar (Netz `npm_default`, `x-assist-key`) |
## Datenschutz-Hinweis
Das Tool `mieter_kontakt` liefert personenbezogene Daten an Kimi (Serverstandort Singapur, Training laut Anbieter-AGB möglich). Wer das vermeiden will, entfernt das Tool einfach aus dem AI-Agenten – alle anderen Tools liefern nur Bestands- und Zahlen-Daten.
Das Tool `mieter_kontakt` liefert personenbezogene Daten an Kimi (Serverstandort Singapur,
Training laut Anbieter-AGB möglich). Wer das vermeiden will, entfernt den Tool-Eintrag aus
dem `TOOLS`-Array im Code-Node – alle anderen Tools liefern nur Bestands- und Zahlen-Daten.
+29 -239
View File
File diff suppressed because one or more lines are too long