- 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
4.6 KiB
KI-Assistent (v1.37) – Einrichtung N8N + Kimi
Der Assistent läuft so: Portal-Chat → N8N-Webhook → Kimi (Moonshot API) mit 6 Portal-Tools → Antwort zurück ins Portal.
Stand: Der Workflow ist auf dem Produktivsystem (hocks.eu) bereits serverseitig eingerichtet und aktiv. Die Datei
assist-workflow.jsonin 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.
1. Architektur des Workflows
Ein einzelner Workflow „Mieterportal – KI-Assistent (Kimi)", Webhook POST mp-assist, drei Nodes:
- Webhook Portal (
n8n-nodes-base.webhook, typeVersion 2, responseModeresponseNode) – produktive URL:http://n8n:5678/webhook/mp-assist(internes Docker-Netznpm_default). – Wichtig: Der Node braucht die PropertywebhookId(gleich der Node-ID) auf Root-Ebene, sonst registriert n8n den Webhook beiresponseMode: responseNodenicht (404 „not registered"). - Assistent (Kimi + Tools) (
n8n-nodes-base.code, typeVersion 2, runOnceForAllItems) – Prüft den Headerx-assist-secretselbst gegen das Shared Secret. – Rufthttps://api.moonshot.ai/v1/chat/completions(Modellkimi-k2.6) perthis.helpers.httpRequestauf, mit OpenAI-kompatiblem Tool-Calling für genau die 6 Portal-Endpunkte unter/api/assist/tools/…(Schleife, max. 6 Runden). – Keintemperature-Parameter senden –kimi-k2.6akzeptiert nurtemperature: 1, sonst 400 „invalid temperature". – KeinURLSearchParamsim Sandbox-Code verwenden – nicht verfügbar; Query-Strings manuell mitencodeURIComponentbauen. – 429 (Rate-Limit) wird abgefangen und als freundliche Meldung zurückgegeben. - Antwort an Portal (
n8n-nodes-base.respondToWebhook, typeVersion 1.1) –respondWith: json, Body={{ { antwort: $json.antwort } }}.
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).
2. Geheimnisse (Platzhalter im Workflow-JSON)
| 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 |
3. Portal-Env auf dem Server
In /opt/mieterportal/portal.env (nur auf dem VPS, gitignored):
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.
4. Kosten
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:
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 | Ursache |
|---|---|
| „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 den Tool-Eintrag aus
dem TOOLS-Array im Code-Node – alle anderen Tools liefern nur Bestands- und Zahlen-Daten.