Files
Mieterportal/n8n/README-assistent.md
ah-admin 6eec3ac437 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
2026-10-04 21:30:34 +02:00

86 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.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.
## 1. Architektur des Workflows
Ein einzelner Workflow **„Mieterportal – KI-Assistent (Kimi)"**, Webhook `POST mp-assist`, drei Nodes:
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 } }}`.
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):
```bash
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:
```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 | 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.