Support-Agent
Der Support-Agent ist ein zyklischer Agent, der wie ein First-Level-Support
arbeitet: Er ruft alle 5 Minuten ungelesene E-Mails über IMAP ab, sucht die Antwort
über die ProcessCube®-CLI (pc knowledge) und legt eine begründete Antwort
standardmäßig als E-Mail-Entwurf zur Freigabe ab. Mit MAIL_SEND_MODE=send
versendet er sie nach Prüfung der Wissensbasis direkt über SMTP. Findet er keine
belastbare Antwort, startet er mit der Anfrage den Eskalations-Prozess in der Engine.
In Entwicklung. Teil der Preview-Phase (1.2.0-insiders.x). Schnittstellen
und Verhalten können sich vor dem ersten Stable-Release noch ändern.
Der Support-Agent baut — wie die Coding-Agenten — auf der
Agent Runtime auf und nutzt dasselbe Agenten-Image
(Dockerfile.agents, FROM ${RUNTIME_IMAGE}). Es erbt das komplette
OpenClaw-Setup (OpenClaw, Bun, Node, gh, pc, Claude, Codex, Volumes,
Gateway-CMD); ergänzt werden nur Support-spezifische Teile: jq, der
.processcube-Mountpoint, der knowledge-Skill, die Agent-Dateien, Cron und die
Mail-Dependencies. Registriert wird über PC_INSTALL_AGENTS=support-agent nur der
Support-Agent.
Antwort-Gate
Ohne ausreichend belegende Knowledge-Treffer antwortet der Agent nicht inhaltlich, sondern nennt die Dokumentationslücke — statt Details zu ergänzen oder eine Integration zu erfinden. Das gilt auch für normale Chatfragen an den Agenten.
Nur der E-Mail-Polling-Workflow ({ "_poll": true }) startet bei fehlender Antwort
zusätzlich die Eskalation. Nach erfolgreichem Prozessstart legt der Agent eine
Bestätigung an, dass die Anfrage an den Human-Support übergeben wurde — im
Standardmodus ebenfalls als Entwurf.
Ablauf je Zyklus
mail.ts fetch— ungelesene Mails aus$INPUT_MAILBOX(IMAP, peek)- 2–4 Stichworte extrahieren →
pc knowledge search --rerank -o json(cwd =$KNOWLEDGE_DIR); ohne--sourcewerden alle konfigurierten Quellen durchsucht - Gate: keine brauchbaren Treffer → eskalieren. Lokale Treffer werden an der
bm25-Rausch-Grenze (
KNOWLEDGE_RANK_THRESHOLD) gemessen und mitpc knowledge showinhaltlich geprüft; Remote-Treffer lädt der Agent perpc knowledge show <id> --source <source>vollständig nach.source_errorseinzelner Quellen gelten nicht als Fehlschlag der ganzen Suche. - Antwort: je nach
MAIL_SEND_MODEviamail.ts draftodermail.ts send(BetreffAntwort zu <Betreff>, Signatur „Viele Grüße / Ihr Support-Team”) →mail.ts movenach$DONE_MAILBOX - Keine Antwort:
pc engine start-process-model Support-Escalation_Process startEskalation→mail.ts movenach$ESCALATED_MAILBOX
Der Agent liest nicht die INBOX, sondern nur den unter INPUT_MAILBOX
konfigurierten Ordner — sonst würde er auf jede beliebige Mail (Newsletter,
Benachrichtigungen …) reagieren. Bearbeitete Mails wandern nach $DONE_MAILBOX
bzw. $ESCALATED_MAILBOX — das ist Audit-Trail und De-Dup zugleich.
rank ist bei Remote-Treffern nur die Trefferposition und darf nicht mit der
lokalen bm25-Schwelle verglichen werden.
Mail-Server-Setup (einmalig)
Der Transport ist für standardkonforme IMAP4-/SMTP-Server mit direktem TLS oder
STARTTLS ausgelegt. Bei Gmail ist INPUT_MAILBOX typischerweise ein dediziertes
Label, bei anderen IMAP-Servern ein normaler Ordner.
IMAP und SMTP aktivieren
Beim Mail-Provider beide Protokolle freischalten.
Zugangsdaten einrichten
Einen Benutzer bzw. ein App-Passwort für beide Protokolle anlegen. Bei Gmail ist das weiterhin ein 16-stelliges App-Passwort .
Eingangsordner anlegen und Mails dorthin routen
Den Ordner bzw. das Label aus INPUT_MAILBOX anlegen und Support-Mails per Filter
dorthin routen. Bei Gmail-Testmails von externen Absendern zusätzlich
„Nie als Spam einstufen” wählen.
Die Ziel-Ordner aus DONE_MAILBOX und ESCALATED_MAILBOX müssen nicht vorab
existieren — mail.ts move legt sie bei Bedarf an.
Provider mit ausschließlich OAuth2 oder proprietärer API benötigen eine zusätzliche Authentifizierungserweiterung.
Start (lokales Compose)
Das Agenten-Image setzt auf dem Runtime-Image auf. Per Default zieht
docker compose das veröffentlichte
ghcr.io/processcube-io/agent-runtime:latest; alternativ einmalig lokal bauen:
docker compose build # baut/taggt ghcr.io/processcube-io/agent-runtime:latestDann den Support-Agenten starten:
docker network create pc-shared # einmalig (geteilt mit Engine/LowCode)
# .env: OPENCLAW_GATEWAY_TOKEN, MAIL_USER, MAIL_PASSWORD, ENGINE_URL …
docker compose -f docker-compose.support.yml up -d --build
docker compose -f docker-compose.support.yml exec support-agent bash
# Im Container, einmalig:
pc-runtime setup # AI-Backend (Claude-Subscription) anmelden
pc engine login "$ENGINE_URL" --root # PoC: anonymer Root-LoginDie Agenten-Registrierung (pc-runtime agents install) legt den 5-Minuten-Cron
support-agent-poll an.
Isolierte Volumes: Der Support-Container nutzt eigene pc_support_*-Volumes
(getrennt von Runtime- und Coding-Container) und den Gateway-Port 18790.
AI-Backend- und Engine-Login müssen deshalb hier separat gemacht werden;
sie bleiben anschließend über Neustarts erhalten.
Erste Freigabe & manuelles Auslösen
Beim ersten openclaw-CLI-Aufruf im Container fragt das Gateway eine
Geräte-Freigabe an (Scope-Upgrade). Einmalig genehmigen, dann neu starten, damit
das frische Auth-/Codex-Profil greift:
docker compose -f docker-compose.support.yml exec support-agent bash -lc '
openclaw devices list # zeigt die pending Request-ID
openclaw devices approve <request-id> # genehmigen
'
docker compose -f docker-compose.support.yml restart
docker compose -f docker-compose.support.yml exec support-agent pc-runtime doctor --smokeDer Agent läuft alle 5 Minuten automatisch. Sofort auslösen (z. B. nach einer Test-Mail):
docker compose -f docker-compose.support.yml exec support-agent \
openclaw cron run support-agent-pollLiefert das {"reason":"already-running"}, läuft gerade noch ein Zyklus — kurz
warten und erneut auslösen.
Control-UI freigeben
Bei einem frischen OpenClaw-Volume muss der lokale Browser-Origin einmalig freigegeben werden:
docker compose -f docker-compose.support.yml exec support-agent \
openclaw config set gateway.controlUi.allowedOrigins \
'["http://localhost:18790","http://127.0.0.1:18790"]' --strict-json
docker compose -f docker-compose.support.yml restartDanach die UI mit dem Token aus der .env öffnen:
http://localhost:18790/#token=<OPENCLAW_GATEWAY_TOKEN>.
Lokaler Test ohne Container
# im support-agent/-Ordner, einmalig:
bun install
# einen einzelnen Zyklus triggern (so wie der Cron):
node start.mjsE2E-Test mit lokaler Engine
Für den Eskalationstest gibt es ein Compose-Overlay mit eigener Engine. Es seedet
processes/Support-Escalation.bpmn und stellt die Engine dem Agenten unter
http://support-engine:8000 bereit — vom Host zusätzlich unter
http://localhost:8001:
docker network inspect pc-shared >/dev/null 2>&1 || docker network create pc-shared
docker compose -f docker-compose.support.yml \
-f docker-compose.support-engine.yml up -d --buildStatt anonymem Root-Zugriff kann ein expliziter Token verwendet werden — er muss in
der .env des Compose-Projekts stehen, damit Engine (iam__rootAccessToken) und
Agent denselben Wert nutzen:
export ENGINE_ROOT_ACCESS_TOKEN="$(pc engine generate-root-access-token)"
export ENGINE_ALLOW_ANONYMOUS_ROOT_ACCESS=false
docker compose -f docker-compose.support.yml \
-f docker-compose.support-engine.yml up -d --no-buildFür einen einzelnen Poll-Zyklus mit Warten auf das Endergebnis:
docker compose -f docker-compose.support.yml \
-f docker-compose.support-engine.yml exec -T support-agent \
openclaw cron run support-agent-poll --expect-final --timeout 120000Prozessmodelle und Instanzen lassen sich aus dem Agent-Container prüfen:
docker compose -f docker-compose.support.yml \
-f docker-compose.support-engine.yml exec -T support-agent \
pc engine list-process-models
docker compose -f docker-compose.support.yml \
-f docker-compose.support-engine.yml exec -T support-agent \
pc engine list-process-instancesDer Prozess bleibt derzeit an der Aufgabe „Lösung erstellen” als laufende Instanz stehen — damit ist die Übergabe an den Human-Support simuliert. Eine echte Human-Task-Bearbeitung inklusive Rückmeldung ist noch nicht modelliert. Der anonyme Root-Zugang ist nur für lokale Entwicklung vorgesehen.
Eskalations-Start-Token
Prozessmodell-ID, Start-Event-ID und die Form des Start-Tokens richten sich nach
dem Ziel-Prozessmodell. Die Feldnamen sind nicht fest verdrahtet: Der Start-Token
entsteht aus dem jq-Ausdruck in ESCALATION_START_TOKEN_JQ, dem die Anfrage als
Variablen $from, $subject, $body, $messageId und $receivedAt übergeben wird.
# Default — entspricht dem mitgelieferten processes/Support-Escalation.bpmn
ESCALATION_START_TOKEN_JQ={from:$from, subject:$subject, body:$body, messageId:$messageId, receivedAt:$receivedAt}
# Eigenes Prozessmodell mit anderen Feldnamen
ESCALATION_START_TOKEN_JQ={sender:$from, title:$subject, text:$body, channel:"mail"}So lassen sich Felder umbenennen, verschachteln, weglassen oder um Konstanten ergänzen. Der Default entspricht dem bisherigen Verhalten.
Ist der Ausdruck fehlerhaft, bricht die Eskalation ab — der Prozess wird nicht
ohne Start-Token gestartet. In Compose wird die Variable leer durchgereicht
(${ESCALATION_START_TOKEN_JQ:-}), weil ein geschweifter Default die
Compose-Interpolation zerlegen würde; den Default setzt der Agent selbst.
Konfigurationsprüfung bei der Installation
pc-runtime agents install --from-repo . support-agent prüft vor der Registrierung
die gesamte Konfiguration des Agenten — ohne Netzwerkzugriff, allein aus der
Umgebung:
- Mail-Zugang inklusive
GMAIL_*-Fallback - IMAP-/SMTP-Ports mit ihrer TLS-/STARTTLS-Kombination
MAIL_SEND_MODEsamt der beim Versand nötigen Zugangsdaten und Absenderauflösung- die Ordner aus
INPUT_MAILBOX,DONE_MAILBOX,ESCALATED_MAILBOX - die Wissensbasis:
knowledge.config.jsonund die dort per--token-envreferenzierten Umgebungsvariablen - Engine sowie Eskalations-Prozess, Start-Event und Start-Token-Ausdruck
(letzterer wird per
jqprobeweise ausgeführt) DOCS_BASE_URL
Befunde werden gemeldet, brechen die Installation aber nicht ab — eine Fehlkonfiguration soll die Registrierung nicht verhindern:
pc-runtime agents install --from-repo . support-agent # prüfen und melden
pc-runtime agents install --from-repo . support-agent --require-support-config # bei Problemen abbrechen
pc-runtime agents install --from-repo . support-agent --skip-support-config # Prüfung überspringenOhne gesetzten Mail-Zugang entfällt die Prüfung mit einem Hinweis — das ist der
reguläre Fall beim Image-Build (Dockerfile.agents installiert ohne .env);
docker-entrypoint.sh registriert bei jedem Start erneut, dann mit Umgebung.
pc-runtime doctor zeigt dieselben Prüfungen, sobald der support-agent
registriert ist. Den echten IMAP-/SMTP-Verbindungstest macht weiterhin der
Containerstart über SUPPORT_MAIL_CHECK_ON_START.
Cron-Läufe einsehen
Jeder Cron-Lauf ist eine OpenClaw-Session. Die Control-UI zeigt die Sessions und Gesprächsverläufe, aber keine eigene Cron-Run-Tabelle — dafür ist die CLI die verlässliche Ansicht:
docker compose -f docker-compose.support.yml exec -T support-agent \
openclaw cron runs --id support-agent-poll --limit 20 --json
docker compose -f docker-compose.support.yml exec -T support-agent \
openclaw sessions list --agent support-agent --jsonMail-Werkzeug (lib/mail.ts)
| Kommando | Wirkung |
|---|---|
bun lib/mail.ts check | Konfiguration sowie IMAP-/SMTP-Verbindung prüfen; verändert und versendet nichts |
bun lib/mail.ts fetch | ungelesene Mails aus $INPUT_MAILBOX als JSON (peek) |
… draft (JSON via STDIN) | Entwurf in den Drafts-Ordner (Auto-Detect via \Drafts) |
… send (JSON via STDIN) | Mail über den konfigurierten SMTP-Server versenden |
… move --uid <uid> --to <ordner> | Mail verschieben (Ziel wird bei Bedarf angelegt) |
… seen --uid <uid> | als gelesen markieren (im Standardablauf nicht nötig) |
Umgebungsvariablen
| Variable | Default | Beschreibung |
|---|---|---|
MAIL_USER / MAIL_PASSWORD | — | Gemeinsame Zugangsdaten für IMAP/SMTP; GMAIL_* bleibt als Fallback gültig |
MAIL_FROM | Login-Benutzer | Absenderadresse für Entwurf und SMTP |
MAIL_SEND_MODE | draft | draft (Entwurf zur Freigabe) oder send (SMTP-Versand) |
IMAP_HOST / IMAP_PORT | imap.gmail.com / 993 | IMAP-Endpunkt |
IMAP_SECURE / IMAP_STARTTLS | portabhängig | Direktes TLS bzw. STARTTLS |
IMAP_USER / IMAP_PASSWORD | MAIL_* | Optionale separate IMAP-Zugangsdaten |
SMTP_HOST / SMTP_PORT | smtp.gmail.com / 465 | SMTP-Endpunkt |
SMTP_SECURE / SMTP_REQUIRE_TLS | portabhängig / true | Direktes TLS bzw. verpflichtendes STARTTLS |
SMTP_USER / SMTP_PASSWORD | MAIL_* | Optionale separate SMTP-Zugangsdaten |
SUPPORT_MAIL_CHECK_ON_START | true (Support-Compose) | Verbindungstest beim Containerstart |
SUPPORT_MAIL_CHECK_REQUIRED | false | Bei Fehlern den Containerstart abbrechen |
Ordner
| Variable | Default | Beschreibung |
|---|---|---|
INPUT_MAILBOX | Support | IMAP-Eingangsordner bzw. -Label |
DONE_MAILBOX / ESCALATED_MAILBOX | Support/Erledigt / Support/Eskaliert | Ziel nach Bearbeitung |
DRAFTS_MAILBOX | (auto) | Drafts-Ordner; leer = Auto-Detect via \Drafts |
Knowledge und Engine
| Variable | Default | Beschreibung |
|---|---|---|
KNOWLEDGE_DIR | /knowledge | Arbeitsverzeichnis für die pc knowledge-CLI |
KNOWLEDGE_RANK_THRESHOLD | -0.2 | bm25-Rausch-Grenze für lokale Treffer |
ENGINE_URL | http://host.docker.internal:8000 | Ziel-Engine (aus LowCode) |
ENGINE_ROOT_ACCESS_TOKEN | — | expliziter Root-Access-Token; leer = lokaler anonymer Root-PoC |
DOCS_BASE_URL | — | Basis-URL für klickbare Quellenlinks in den Antworten |
ESCALATION_PROCESS / ESCALATION_START_EVENT | Support-Escalation_Process / startEskalation | Prozessmodell-ID und Start-Event-ID der Eskalation |
ESCALATION_START_TOKEN_JQ | {from:$from, subject:$subject, body:$body, messageId:$messageId, receivedAt:$receivedAt} | jq-Ausdruck für den Start-Token — an das Ziel-Prozessmodell anpassen |
Für Quellenlinks in E-Mails etwa DOCS_BASE_URL=https://docs.processcube.io setzen —
produktiv gehört dort die für Kunden erreichbare Docs-URL hin.
PoC-Hinweise: Der Engine-Login wird in /home/node/.processcube persistiert
(eigenes Volume). Der Wissens-Index wird read-write gemountet, weil
pc knowledge die SQLite im WAL-Modus öffnet. KNOWLEDGE_HOST_DIR ist nur der
Host-Pfad, der den Index nach /knowledge mountet — der Agent nutzt keine eigene
SQLite-Anbindung.
Weiterführend
- Knowledge-Anbindung — mehrere lokale, Web- und API-/MCP-Quellen für den Agenten konfigurieren
- Knowledge-Befehle der CLI —
pc knowledgeim Detail - Docker und Kubernetes / k3s — Betrieb