chore(i18n): refresh de translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-15 19:55:37 +00:00
parent 33a137e83f
commit db04fca532
9 changed files with 1730 additions and 1495 deletions

View File

@ -2,25 +2,25 @@
read_when:
- Matrix in OpenClaw einrichten
- Matrix-E2EE und Verifizierung konfigurieren
summary: Status des Matrix-Supports, Einrichtung und Konfigurationsbeispiele
summary: Matrix-Unterstützungsstatus, Einrichtung und Konfigurationsbeispiele
title: Matrix
x-i18n:
generated_at: "2026-04-15T06:21:25Z"
generated_at: "2026-04-15T19:41:41Z"
model: gpt-5.4
provider: openai
source_hash: 631f6fdcfebc23136c1a66b04851a25c047535d13cceba5650b8b421bc3afcf8
source_hash: bd730bb9d0c8a548ee48b20931b3222e9aa1e6e95f1390b0c236645e03f3576d
source_path: channels/matrix.md
workflow: 15
---
# Matrix
Matrix ist ein gebündeltes Kanal-Plugin für OpenClaw.
Es verwendet das offizielle `matrix-js-sdk` und unterstützt Direktnachrichten, Räume, Threads, Medien, Reaktionen, Umfragen, Standort und E2EE.
Matrix ist ein gebündeltes Channel-Plugin für OpenClaw.
Es verwendet das offizielle `matrix-js-sdk` und unterstützt DMs, Räume, Threads, Medien, Reaktionen, Umfragen, Standort und E2EE.
## Gebündeltes Plugin
Matrix wird in aktuellen OpenClaw-Releases als gebündeltes Plugin mitgeliefert, daher
Matrix wird in aktuellen OpenClaw-Releases als gebündeltes Plugin ausgeliefert, daher
benötigen normale paketierte Builds keine separate Installation.
Wenn du einen älteren Build oder eine benutzerdefinierte Installation verwendest, die Matrix ausschließt, installiere
@ -43,14 +43,14 @@ Siehe [Plugins](/de/tools/plugin) für Plugin-Verhalten und Installationsregeln.
## Einrichtung
1. Stelle sicher, dass das Matrix-Plugin verfügbar ist.
- Aktuelle paketierte OpenClaw-Releases enthalten es bereits.
- Ältere/benutzerdefinierte Installationen können es mit den obigen Befehlen manuell hinzufügen.
- Aktuelle paketierte OpenClaw-Releases enthalten es bereits gebündelt.
- Ältere/benutzerdefinierte Installationen können es manuell mit den obigen Befehlen hinzufügen.
2. Erstelle ein Matrix-Konto auf deinem Homeserver.
3. Konfiguriere `channels.matrix` mit entweder:
- `homeserver` + `accessToken`, oder
- `homeserver` + `userId` + `password`.
4. Starte das Gateway neu.
5. Starte eine Direktnachricht mit dem Bot oder lade ihn in einen Raum ein.
5. Starte eine DM mit dem Bot oder lade ihn in einen Raum ein.
- Neue Matrix-Einladungen funktionieren nur, wenn `channels.matrix.autoJoin` sie zulässt.
Interaktive Einrichtungswege:
@ -64,24 +64,24 @@ Der Matrix-Assistent fragt nach:
- Homeserver-URL
- Authentifizierungsmethode: Access Token oder Passwort
- Benutzer-ID (nur Passwort-Authentifizierung)
- optionalem Gerätenamen
- Benutzer-ID (nur bei Passwort-Authentifizierung)
- optionaler Gerätename
- ob E2EE aktiviert werden soll
- ob Raumzugriff und automatisches Beitreten bei Einladungen konfiguriert werden sollen
- ob Raumzugriff und automatisches Beitreten zu Einladungen konfiguriert werden sollen
Wichtige Verhaltensweisen des Assistenten:
- Wenn Matrix-Authentifizierungs-Umgebungsvariablen bereits vorhanden sind und für dieses Konto noch keine Authentifizierung in der Konfiguration gespeichert ist, bietet der Assistent eine Umgebungsvariablen-Verknüpfung an, damit die Authentifizierung in Umgebungsvariablen bleiben kann.
- Kontonamen werden zur Konto-ID normalisiert. Zum Beispiel wird aus `Ops Bot` `ops-bot`.
- Einträge in der DM-Allowlist akzeptieren `@user:server` direkt; Anzeigenamen funktionieren nur, wenn die Live-Verzeichnissuche genau eine Übereinstimmung findet.
- Einträge in der Raum-Allowlist akzeptieren Raum-IDs und Aliasse direkt. Bevorzuge `!room:server` oder `#alias:server`; nicht aufgelöste Namen werden zur Laufzeit von der Allowlist-Auflösung ignoriert.
- Im Allowlist-Modus für automatisches Beitreten bei Einladungen nur stabile Einladungsziele verwenden: `!roomId:server`, `#alias:server` oder `*`. Einfache Raumnamen werden abgelehnt.
- Wenn Matrix-Auth-Umgebungsvariablen bereits vorhanden sind und für dieses Konto noch keine Authentifizierung in der Konfiguration gespeichert ist, bietet der Assistent eine Umgebungsvariablen-Verknüpfung an, um die Authentifizierung in Umgebungsvariablen zu belassen.
- Kontonamen werden zur Konto-ID normalisiert. Zum Beispiel wird `Ops Bot` zu `ops-bot`.
- DM-Allowlist-Einträge akzeptieren `@user:server` direkt; Anzeigenamen funktionieren nur, wenn die Live-Verzeichnissuche genau einen Treffer findet.
- Raum-Allowlist-Einträge akzeptieren Raum-IDs und Aliase direkt. Bevorzuge `!room:server` oder `#alias:server`; nicht aufgelöste Namen werden zur Laufzeit von der Allowlist-Auflösung ignoriert.
- Im Allowlist-Modus für automatisches Beitreten zu Einladungen nur stabile Einladungsziele verwenden: `!roomId:server`, `#alias:server` oder `*`. Einfache Raumnamen werden abgelehnt.
- Um Raumnamen vor dem Speichern aufzulösen, verwende `openclaw channels resolve --channel matrix "Project Room"`.
<Warning>
`channels.matrix.autoJoin` ist standardmäßig auf `off` gesetzt.
Wenn du es nicht setzt, tritt der Bot eingeladenen Räumen oder neuen DM-artigen Einladungen nicht bei, daher erscheint er nicht in neuen Gruppen oder eingeladenen DMs, außer du trittst zuerst manuell bei.
Wenn du es nicht setzt, tritt der Bot eingeladenen Räumen oder neuen DM-ähnlichen Einladungen nicht bei und erscheint daher nicht in neuen Gruppen oder eingeladenen DMs, es sei denn, du trittst zuerst manuell bei.
Setze `autoJoin: "allowlist"` zusammen mit `autoJoinAllowlist`, um einzuschränken, welche Einladungen akzeptiert werden, oder setze `autoJoin: "always"`, wenn er jeder Einladung beitreten soll.
@ -133,7 +133,7 @@ Minimale tokenbasierte Einrichtung:
}
```
Passwortbasierte Einrichtung (Token wird nach der Anmeldung zwischengespeichert):
Passwortbasierte Einrichtung (Token wird nach dem Login zwischengespeichert):
```json5
{
@ -151,9 +151,9 @@ Passwortbasierte Einrichtung (Token wird nach der Anmeldung zwischengespeichert)
Matrix speichert zwischengespeicherte Anmeldedaten in `~/.openclaw/credentials/matrix/`.
Das Standardkonto verwendet `credentials.json`; benannte Konten verwenden `credentials-<account>.json`.
Wenn dort zwischengespeicherte Anmeldedaten vorhanden sind, behandelt OpenClaw Matrix für Einrichtung, Doctor und Kanalstatus-Erkennung als konfiguriert, auch wenn die aktuelle Authentifizierung nicht direkt in der Konfiguration gesetzt ist.
Wenn dort zwischengespeicherte Anmeldedaten vorhanden sind, behandelt OpenClaw Matrix für Setup, doctor und Channel-Status-Erkennung als konfiguriert, auch wenn die aktuelle Authentifizierung nicht direkt in der Konfiguration gesetzt ist.
Entsprechende Umgebungsvariablen (werden verwendet, wenn der Konfigurationsschlüssel nicht gesetzt ist):
Äquivalente Umgebungsvariablen (werden verwendet, wenn der Konfigurationsschlüssel nicht gesetzt ist):
- `MATRIX_HOMESERVER`
- `MATRIX_ACCESS_TOKEN`
@ -162,7 +162,7 @@ Entsprechende Umgebungsvariablen (werden verwendet, wenn der Konfigurationsschl
- `MATRIX_DEVICE_ID`
- `MATRIX_DEVICE_NAME`
Für Nicht-Standardkonten verwende kontobezogene Umgebungsvariablen:
Für Nicht-Standardkonten verwende kontoabhängige Umgebungsvariablen:
- `MATRIX_<ACCOUNT_ID>_HOMESERVER`
- `MATRIX_<ACCOUNT_ID>_ACCESS_TOKEN`
@ -181,10 +181,10 @@ Für die normalisierte Konto-ID `ops-bot` verwende:
- `MATRIX_OPS_X2D_BOT_HOMESERVER`
- `MATRIX_OPS_X2D_BOT_ACCESS_TOKEN`
Matrix maskiert Satzzeichen in Konto-IDs, damit kontobezogene Umgebungsvariablen kollisionsfrei bleiben.
Zum Beispiel wird `-` zu `_X2D_`, sodass `ops-prod` auf `MATRIX_OPS_X2D_PROD_*` abgebildet wird.
Matrix maskiert Satzzeichen in Konto-IDs, damit kontoabhängige Umgebungsvariablen kollisionsfrei bleiben.
Zum Beispiel wird `-` zu `_X2D_`, daher wird `ops-prod` zu `MATRIX_OPS_X2D_PROD_*`.
Der interaktive Assistent bietet die Umgebungsvariablen-Verknüpfung nur an, wenn diese Authentifizierungs-Umgebungsvariablen bereits vorhanden sind und für das ausgewählte Konto noch keine Matrix-Authentifizierung in der Konfiguration gespeichert ist.
Der interaktive Assistent bietet die Umgebungsvariablen-Verknüpfung nur an, wenn diese Auth-Umgebungsvariablen bereits vorhanden sind und für das ausgewählte Konto noch keine Matrix-Authentifizierung in der Konfiguration gespeichert ist.
## Konfigurationsbeispiel
@ -223,17 +223,18 @@ Dies ist eine praktische Basiskonfiguration mit DM-Pairing, Raum-Allowlist und a
}
```
`autoJoin` gilt für alle Matrix-Einladungen, einschließlich DM-artiger Einladungen. OpenClaw kann einen eingeladenen
Raum zum Zeitpunkt der Einladung nicht zuverlässig als DM oder Gruppe klassifizieren, daher laufen alle Einladungen zuerst über `autoJoin`.
`dm.policy` gilt, nachdem der Bot beigetreten ist und der Raum als DM klassifiziert wurde.
`autoJoin` gilt für alle Matrix-Einladungen, einschließlich DM-ähnlicher Einladungen. OpenClaw kann einen
eingeladenen Raum zum Zeitpunkt der Einladung nicht zuverlässig als DM oder Gruppe
klassifizieren, daher laufen alle Einladungen zuerst über `autoJoin`.
`dm.policy` wird angewendet, nachdem der Bot beigetreten ist und der Raum als DM klassifiziert wurde.
## Streaming-Vorschauen
Reply-Streaming für Matrix ist optional.
Setze `channels.matrix.streaming` auf `"partial"`, wenn OpenClaw eine einzelne Live-Vorschau
der Antwort senden, diese Vorschau während der Textgenerierung durch das Modell direkt bearbeiten und sie dann
abschließen soll, sobald die Antwort fertig ist:
Setze `channels.matrix.streaming` auf `"partial"`, wenn OpenClaw eine einzelne Live-Vorschau-Antwort senden,
diese Vorschau während der Textgenerierung durch das Modell an Ort und Stelle bearbeiten und sie dann abschließen soll, wenn die
Antwort fertig ist:
```json5
{
@ -246,37 +247,37 @@ abschließen soll, sobald die Antwort fertig ist:
```
- `streaming: "off"` ist die Standardeinstellung. OpenClaw wartet auf die endgültige Antwort und sendet sie einmal.
- `streaming: "partial"` erstellt eine bearbeitbare Vorschau-Nachricht für den aktuellen Assistant-Block unter Verwendung normaler Matrix-Textnachrichten. Dadurch bleibt das ältere Benachrichtigungsverhalten von Matrix mit Vorschau zuerst erhalten, sodass Standard-Clients möglicherweise beim ersten gestreamten Vorschautext statt beim fertigen Block benachrichtigen.
- `streaming: "quiet"` erstellt eine bearbeitbare stille Vorschau-Mitteilung für den aktuellen Assistant-Block. Verwende dies nur, wenn du zusätzlich Empfänger-Push-Regeln für abgeschlossene Vorschau-Bearbeitungen konfigurierst.
- `blockStreaming: true` aktiviert separate Matrix-Fortschrittsnachrichten. Wenn Vorschau-Streaming aktiviert ist, behält Matrix den Live-Entwurf für den aktuellen Block bei und belässt abgeschlossene Blöcke als separate Nachrichten.
- Wenn Vorschau-Streaming aktiviert ist und `blockStreaming` deaktiviert ist, bearbeitet Matrix den Live-Entwurf direkt und schließt dasselbe Ereignis ab, wenn der Block oder Turn beendet ist.
- Wenn die Vorschau nicht mehr in ein einzelnes Matrix-Ereignis passt, beendet OpenClaw das Vorschau-Streaming und greift auf normale endgültige Zustellung zurück.
- `streaming: "partial"` erstellt eine bearbeitbare Vorschau-Nachricht für den aktuellen Assistentenblock mit normalen Matrix-Textnachrichten. Dadurch bleibt das ältere benachrichtigungsorientierte Vorschau-zuerst-Verhalten von Matrix erhalten, sodass Standard-Clients möglicherweise beim ersten gestreamten Vorschautext statt beim fertigen Block benachrichtigen.
- `streaming: "quiet"` erstellt einen bearbeitbaren unauffälligen Vorschauhinweis für den aktuellen Assistentenblock. Verwende dies nur, wenn du zusätzlich Push-Regeln für Empfänger für abgeschlossene Vorschau-Bearbeitungen konfigurierst.
- `blockStreaming: true` aktiviert separate Matrix-Fortschrittsnachrichten. Wenn Vorschau-Streaming aktiviert ist, behält Matrix den Live-Entwurf für den aktuellen Block bei und lässt abgeschlossene Blöcke als separate Nachrichten bestehen.
- Wenn Vorschau-Streaming aktiviert und `blockStreaming` deaktiviert ist, bearbeitet Matrix den Live-Entwurf an Ort und Stelle und schließt dasselbe Ereignis ab, wenn der Block oder Turn endet.
- Wenn die Vorschau nicht mehr in ein einzelnes Matrix-Ereignis passt, beendet OpenClaw das Vorschau-Streaming und fällt auf normale endgültige Zustellung zurück.
- Medienantworten senden Anhänge weiterhin normal. Wenn eine veraltete Vorschau nicht mehr sicher wiederverwendet werden kann, entfernt OpenClaw sie vor dem Senden der endgültigen Medienantwort.
- Vorschau-Bearbeitungen verursachen zusätzliche Matrix-API-Aufrufe. Lasse Streaming deaktiviert, wenn du das konservativste Verhalten bei Ratenbegrenzungen möchtest.
- Vorschau-Bearbeitungen verursachen zusätzliche Matrix-API-Aufrufe. Lasse Streaming deaktiviert, wenn du das konservativste Rate-Limit-Verhalten möchtest.
`blockStreaming` aktiviert Entwurfsvorschauen nicht von selbst.
Verwende `streaming: "partial"` oder `streaming: "quiet"` für Vorschau-Bearbeitungen; füge dann `blockStreaming: true` nur hinzu, wenn abgeschlossene Assistant-Blöcke zusätzlich als separate Fortschrittsnachrichten sichtbar bleiben sollen.
Verwende `streaming: "partial"` oder `streaming: "quiet"` für Vorschau-Bearbeitungen; füge dann `blockStreaming: true` nur hinzu, wenn du außerdem möchtest, dass abgeschlossene Assistentenblöcke als separate Fortschrittsnachrichten sichtbar bleiben.
Wenn du Standard-Matrix-Benachrichtigungen ohne benutzerdefinierte Push-Regeln benötigst, verwende `streaming: "partial"` für Vorschau-zuerst-Verhalten oder lasse `streaming` für reine Endzustellung deaktiviert. Mit `streaming: "off"`:
Wenn du Matrix-Standardbenachrichtigungen ohne benutzerdefinierte Push-Regeln benötigst, verwende `streaming: "partial"` für Vorschau-zuerst-Verhalten oder lasse `streaming` deaktiviert, um nur endgültige Zustellung zu erhalten. Mit `streaming: "off"`:
- `blockStreaming: true` sendet jeden abgeschlossenen Block als normale benachrichtigende Matrix-Nachricht.
- `blockStreaming: false` sendet nur die endgültige abgeschlossene Antwort als normale benachrichtigende Matrix-Nachricht.
### Selbst gehostete Push-Regeln für stille abgeschlossene Vorschauen
### Selbstgehostete Push-Regeln für unauffällige abgeschlossene Vorschauen
Wenn du deine eigene Matrix-Infrastruktur betreibst und stille Vorschauen erst dann benachrichtigen sollen, wenn ein Block oder die
Wenn du deine eigene Matrix-Infrastruktur betreibst und unauffällige Vorschauen nur dann benachrichtigen sollen, wenn ein Block oder eine
endgültige Antwort abgeschlossen ist, setze `streaming: "quiet"` und füge eine benutzerspezifische Push-Regel für abgeschlossene Vorschau-Bearbeitungen hinzu.
Dies ist normalerweise eine Einrichtung pro Empfängerbenutzer, keine globale Konfigurationsänderung am Homeserver:
Dies ist normalerweise eine Einrichtung pro Empfängerbenutzer, keine globale Konfigurationsänderung des Homeservers:
Kurzübersicht vor dem Start:
Kurzübersicht, bevor du beginnst:
- Empfängerbenutzer = die Person, die die Benachrichtigung erhalten soll
- Bot-Benutzer = das OpenClaw-Matrix-Konto, das die Antwort sendet
- verwende für die folgenden API-Aufrufe das Access Token des Empfängerbenutzers
- gleiche `sender` in der Push-Regel mit der vollständigen MXID des Bot-Benutzers ab
1. Konfiguriere OpenClaw für stille Vorschauen:
1. Konfiguriere OpenClaw so, dass unauffällige Vorschauen verwendet werden:
```json5
{
@ -288,13 +289,13 @@ Kurzübersicht vor dem Start:
}
```
2. Stelle sicher, dass das Empfängerkonto bereits normale Matrix-Push-Benachrichtigungen erhält. Regeln für stille Vorschauen
2. Stelle sicher, dass das Empfängerkonto bereits normale Matrix-Push-Benachrichtigungen erhält. Regeln für unauffällige Vorschauen
funktionieren nur, wenn dieser Benutzer bereits funktionierende Pusher/Geräte hat.
3. Besorge das Access Token des Empfängerbenutzers.
3. Hole das Access Token des Empfängerbenutzers.
- Verwende das Token des empfangenden Benutzers, nicht das Token des Bots.
- Ein vorhandenes Client-Sitzungstoken wiederzuverwenden ist normalerweise am einfachsten.
- Wenn du ein neues Token erstellen musst, kannst du dich über die standardmäßige Matrix Client-Server-API anmelden:
- Die Wiederverwendung eines vorhandenen Client-Sitzungstokens ist normalerweise am einfachsten.
- Wenn du ein neues Token erzeugen musst, kannst du dich über die Standard-Matrix-Client-Server-API anmelden:
```bash
curl -sS -X POST \
@ -310,7 +311,7 @@ curl -sS -X POST \
}'
```
4. Prüfe, ob das Empfängerkonto bereits Pusher hat:
4. Verifiziere, dass das Empfängerkonto bereits Pusher hat:
```bash
curl -sS \
@ -318,10 +319,10 @@ curl -sS \
"https://matrix.example.org/_matrix/client/v3/pushers"
```
Wenn dies keine aktiven Pusher/Geräte zurückgibt, behebe zuerst die normalen Matrix-Benachrichtigungen, bevor du die
unten stehende OpenClaw-Regel hinzufügst.
Wenn dies keine aktiven Pusher/Geräte zurückgibt, behebe zuerst normale Matrix-Benachrichtigungen, bevor du die
untenstehende OpenClaw-Regel hinzufügst.
OpenClaw markiert abgeschlossene textbasierte Vorschau-Bearbeitungen mit:
OpenClaw markiert abgeschlossene Vorschau-Bearbeitungen nur mit Text mit:
```json
{
@ -361,23 +362,23 @@ curl -sS -X PUT \
Ersetze diese Werte, bevor du den Befehl ausführst:
- `https://matrix.example.org`: deine Homeserver-Basis-URL
- `https://matrix.example.org`: die Basis-URL deines Homeservers
- `$USER_ACCESS_TOKEN`: das Access Token des empfangenden Benutzers
- `openclaw-finalized-preview-botname`: eine für diesen Bot bei diesem empfangenden Benutzer eindeutige Regel-ID
- `openclaw-finalized-preview-botname`: eine Regel-ID, die für diesen Bot bei diesem empfangenden Benutzer eindeutig ist
- `@bot:example.org`: die MXID deines OpenClaw-Matrix-Bots, nicht die MXID des empfangenden Benutzers
Wichtig für Setups mit mehreren Bots:
- Push-Regeln werden über `ruleId` identifiziert. Wenn `PUT` erneut mit derselben Regel-ID ausgeführt wird, wird genau diese Regel aktualisiert.
- Wenn ein empfangender Benutzer für mehrere OpenClaw-Matrix-Bot-Konten Benachrichtigungen erhalten soll, erstelle eine Regel pro Bot mit jeweils einer eindeutigen Regel-ID für jede `sender`-Übereinstimmung.
- Push-Regeln werden über `ruleId` referenziert. Ein erneutes `PUT` mit derselben Regel-ID aktualisiert diese eine Regel.
- Wenn ein empfangender Benutzer für mehrere OpenClaw-Matrix-Bot-Konten benachrichtigt werden soll, erstelle eine Regel pro Bot mit einer eindeutigen Regel-ID für jede `sender`-Übereinstimmung.
- Ein einfaches Muster ist `openclaw-finalized-preview-<botname>`, zum Beispiel `openclaw-finalized-preview-ops` oder `openclaw-finalized-preview-support`.
Die Regel wird anhand des Ereignis-Absenders ausgewertet:
Die Regel wird gegen den Ereignisabsender ausgewertet:
- authentifiziere dich mit dem Token des empfangenden Benutzers
- gleiche `sender` mit der MXID des OpenClaw-Bots ab
6. Prüfe, ob die Regel vorhanden ist:
6. Verifiziere, dass die Regel existiert:
```bash
curl -sS \
@ -385,8 +386,8 @@ curl -sS \
"https://matrix.example.org/_matrix/client/v3/pushrules/global/override/openclaw-finalized-preview-botname"
```
7. Teste eine gestreamte Antwort. Im stillen Modus sollte der Raum eine stille Entwurfs-Vorschau anzeigen, und die endgültige
direkte Bearbeitung sollte benachrichtigen, sobald der Block oder Turn abgeschlossen ist.
7. Teste eine gestreamte Antwort. Im leisen Modus sollte der Raum eine leise Entwurfsvorschau anzeigen und die endgültige
Bearbeitung an Ort und Stelle sollte benachrichtigen, sobald der Block oder Turn abgeschlossen ist.
Wenn du die Regel später entfernen musst, lösche dieselbe Regel-ID mit dem Token des empfangenden Benutzers:
@ -398,9 +399,9 @@ curl -sS -X DELETE \
Hinweise:
- Erstelle die Regel mit dem Access Token des empfangenden Benutzers, nicht mit dem des Bots.
- Neue benutzerdefinierte `override`-Regeln werden vor den standardmäßigen Unterdrückungsregeln eingefügt, daher ist kein zusätzlicher Ordnungsparameter erforderlich.
- Dies betrifft nur reine Text-Vorschau-Bearbeitungen, die OpenClaw sicher direkt abschließen kann. Medien-Fallbacks und Fallbacks für veraltete Vorschauen verwenden weiterhin die normale Matrix-Zustellung.
- Erstelle die Regel mit dem Access Token des empfangenden Benutzers, nicht mit dem Token des Bots.
- Neue benutzerdefinierte `override`-Regeln werden vor den standardmäßigen Unterdrückungsregeln eingefügt, daher ist kein zusätzlicher Reihenfolgeparameter erforderlich.
- Dies betrifft nur Vorschau-Bearbeitungen nur mit Text, die OpenClaw sicher an Ort und Stelle abschließen kann. Medien-Fallbacks und Fallbacks für veraltete Vorschauen verwenden weiterhin die normale Matrix-Zustellung.
- Wenn `GET /_matrix/client/v3/pushers` keine Pusher anzeigt, hat der Benutzer für dieses Konto/Gerät noch keine funktionierende Matrix-Push-Zustellung.
#### Synapse
@ -409,14 +410,14 @@ Für Synapse reicht die obige Einrichtung normalerweise bereits aus:
- Es ist keine spezielle Änderung an `homeserver.yaml` für abgeschlossene OpenClaw-Vorschau-Benachrichtigungen erforderlich.
- Wenn deine Synapse-Bereitstellung bereits normale Matrix-Push-Benachrichtigungen sendet, sind das Benutzertoken und der obige `pushrules`-Aufruf der wichtigste Einrichtungsschritt.
- Wenn du Synapse hinter einem Reverse Proxy oder mit Workern betreibst, stelle sicher, dass `/_matrix/client/.../pushrules/` Synapse korrekt erreicht.
- Wenn du Synapse-Worker verwendest, stelle sicher, dass die Pusher fehlerfrei laufen. Die Push-Zustellung wird vom Hauptprozess oder von `synapse.app.pusher` / konfigurierten Pusher-Workern übernommen.
- Wenn du Synapse hinter einem Reverse-Proxy oder mit Workern betreibst, stelle sicher, dass `/_matrix/client/.../pushrules/` Synapse korrekt erreicht.
- Wenn du Synapse-Worker betreibst, stelle sicher, dass die Pusher fehlerfrei arbeiten. Die Push-Zustellung wird vom Hauptprozess oder von `synapse.app.pusher` / konfigurierten Pusher-Workern übernommen.
#### Tuwunel
Für Tuwunel verwende denselben Einrichtungsablauf und denselben `push-rule`-API-Aufruf wie oben gezeigt:
Für Tuwunel verwende denselben Einrichtungsablauf und denselben oben gezeigten `pushrules`-API-Aufruf:
- Für den Marker der abgeschlossenen Vorschau selbst ist keine Tuwunel-spezifische Konfiguration erforderlich.
- Für die Markierung der abgeschlossenen Vorschau selbst ist keine Tuwunel-spezifische Konfiguration erforderlich.
- Wenn normale Matrix-Benachrichtigungen für diesen Benutzer bereits funktionieren, sind das Benutzertoken und der obige `pushrules`-Aufruf der wichtigste Einrichtungsschritt.
- Wenn Benachrichtigungen zu verschwinden scheinen, während der Benutzer auf einem anderen Gerät aktiv ist, prüfe, ob `suppress_push_when_active` aktiviert ist. Tuwunel hat diese Option in Tuwunel 1.4.2 am 12. September 2025 hinzugefügt, und sie kann Pushes an andere Geräte absichtlich unterdrücken, während ein Gerät aktiv ist.
@ -424,7 +425,7 @@ Für Tuwunel verwende denselben Einrichtungsablauf und denselben `push-rule`-API
Standardmäßig werden Matrix-Nachrichten von anderen konfigurierten OpenClaw-Matrix-Konten ignoriert.
Verwende `allowBots`, wenn du absichtlich Matrix-Verkehr zwischen Agents erlauben möchtest:
Verwende `allowBots`, wenn du absichtlich Matrix-Verkehr zwischen Agents möchtest:
```json5
{
@ -442,16 +443,16 @@ Verwende `allowBots`, wenn du absichtlich Matrix-Verkehr zwischen Agents erlaube
```
- `allowBots: true` akzeptiert Nachrichten von anderen konfigurierten Matrix-Bot-Konten in erlaubten Räumen und DMs.
- `allowBots: "mentions"` akzeptiert diese Nachrichten in Räumen nur dann, wenn dieser Bot darin sichtbar erwähnt wird. DMs sind weiterhin erlaubt.
- `allowBots: "mentions"` akzeptiert diese Nachrichten in Räumen nur dann, wenn sie diesen Bot sichtbar erwähnen. DMs sind weiterhin erlaubt.
- `groups.<room>.allowBots` überschreibt die Einstellung auf Kontoebene für einen einzelnen Raum.
- OpenClaw ignoriert weiterhin Nachrichten von derselben Matrix-Benutzer-ID, um Selbstantwort-Schleifen zu vermeiden.
- Matrix stellt hier kein natives Bot-Flag bereit; OpenClaw behandelt „von Bot verfasst“ als „von einem anderen konfigurierten Matrix-Konto auf diesem OpenClaw-Gateway gesendet“.
- OpenClaw ignoriert weiterhin Nachrichten von derselben Matrix-Benutzer-ID, um Schleifen durch Selbstantworten zu vermeiden.
- Matrix bietet hier kein natives Bot-Flag; OpenClaw behandelt „von Bots verfasst“ als „von einem anderen konfigurierten Matrix-Konto auf diesem OpenClaw-Gateway gesendet“.
Verwende strikte Raum-Allowlists und Erwähnungsanforderungen, wenn du Bot-zu-Bot-Verkehr in gemeinsam genutzten Räumen aktivierst.
Verwende strikte Raum-Allowlists und Erwähnungspflichten, wenn du Bot-zu-Bot-Verkehr in gemeinsam genutzten Räumen aktivierst.
## Verschlüsselung und Verifizierung
In verschlüsselten (E2EE-)Räumen verwenden ausgehende Bildereignisse `thumbnail_file`, sodass Bildvorschauen zusammen mit dem vollständigen Anhang verschlüsselt werden. Unverschlüsselte Räume verwenden weiterhin einfaches `thumbnail_url`. Es ist keine Konfiguration erforderlich — das Plugin erkennt den E2EE-Status automatisch.
In verschlüsselten (E2EE-)Räumen verwenden ausgehende Bildereignisse `thumbnail_file`, sodass Bildvorschauen zusammen mit dem vollständigen Anhang verschlüsselt werden. Unverschlüsselte Räume verwenden weiterhin einfaches `thumbnail_url`. Keine Konfiguration erforderlich — das Plugin erkennt den E2EE-Status automatisch.
Verschlüsselung aktivieren:
@ -475,13 +476,13 @@ Verifizierungsstatus prüfen:
openclaw matrix verify status
```
Ausführlicher Status (vollständige Diagnose):
Ausführlicher Status (vollständige Diagnosen):
```bash
openclaw matrix verify status --verbose
```
Den gespeicherten Recovery Key in maschinenlesbarer Ausgabe einschließen:
Den gespeicherten Wiederherstellungsschlüssel in maschinenlesbarer Ausgabe einbeziehen:
```bash
openclaw matrix verify status --include-recovery-key --json
@ -493,19 +494,19 @@ Cross-Signing- und Verifizierungsstatus initialisieren:
openclaw matrix verify bootstrap
```
Ausführliche Bootstrap-Diagnose:
Ausführliche Bootstrap-Diagnosen:
```bash
openclaw matrix verify bootstrap --verbose
```
Vor dem Bootstrap eine neue Cross-Signing-Identität erzwingen:
Vor dem Bootstrap ein vollständiges Zurücksetzen der Cross-Signing-Identität erzwingen:
```bash
openclaw matrix verify bootstrap --force-reset-cross-signing
```
Dieses Gerät mit einem Recovery Key verifizieren:
Dieses Gerät mit einem Wiederherstellungsschlüssel verifizieren:
```bash
openclaw matrix verify device "<your-recovery-key>"
@ -517,25 +518,25 @@ Ausführliche Details zur Geräteverifizierung:
openclaw matrix verify device "<your-recovery-key>" --verbose
```
Zustand des Raumschlüssel-Backups prüfen:
Integrität des Raumschlüssel-Backups prüfen:
```bash
openclaw matrix verify backup status
```
Ausführliche Diagnose zum Zustand des Backups:
Ausführliche Diagnosen zur Backup-Integrität:
```bash
openclaw matrix verify backup status --verbose
```
Raumschlüssel aus einem Server-Backup wiederherstellen:
Raumschlüssel aus dem Server-Backup wiederherstellen:
```bash
openclaw matrix verify backup restore
```
Ausführliche Diagnose zur Wiederherstellung:
Ausführliche Diagnosen zur Wiederherstellung:
```bash
openclaw matrix verify backup restore --verbose
@ -549,12 +550,12 @@ zukünftige Kaltstarts den neuen Backup-Schlüssel laden können:
openclaw matrix verify backup reset --yes
```
Alle `verify`-Befehle sind standardmäßig kompakt (einschließlich stiller interner SDK-Protokollierung) und zeigen nur mit `--verbose` detaillierte Diagnosen an.
Verwende `--json` für vollständige maschinenlesbare Ausgabe bei der Skripterstellung.
Alle `verify`-Befehle sind standardmäßig knapp gehalten (einschließlich stiller interner SDK-Protokollierung) und zeigen ausführliche Diagnosen nur mit `--verbose`.
Verwende `--json` für vollständige maschinenlesbare Ausgabe in Skripten.
In Setups mit mehreren Konten verwenden Matrix-CLI-Befehle implizit das standardmäßige Matrix-Konto, sofern du nicht `--account <id>` übergibst.
Wenn du mehrere benannte Konten konfigurierst, setze zuerst `channels.matrix.defaultAccount`, andernfalls werden diese impliziten CLI-Operationen angehalten und verlangen, dass du ein Konto explizit auswählst.
Verwende `--account`, wenn Verifizierungs- oder Geräteoperationen gezielt auf ein benanntes Konto angewendet werden sollen:
In Multi-Account-Setups verwenden Matrix-CLI-Befehle implizit das Matrix-Standardkonto, sofern du nicht `--account <id>` übergibst.
Wenn du mehrere benannte Konten konfigurierst, setze zuerst `channels.matrix.defaultAccount`, sonst werden diese impliziten CLI-Operationen angehalten und fordern dich auf, ein Konto explizit auszuwählen.
Verwende `--account`, wann immer Verifizierungs- oder Geräteoperationen ausdrücklich auf ein benanntes Konto zielen sollen:
```bash
openclaw matrix verify status --account assistant
@ -562,18 +563,18 @@ openclaw matrix verify backup restore --account assistant
openclaw matrix devices list --account assistant
```
Wenn Verschlüsselung für ein benanntes Konto deaktiviert oder nicht verfügbar ist, zeigen Matrix-Warnungen und Verifizierungsfehler auf den Konfigurationsschlüssel dieses Kontos, zum Beispiel `channels.matrix.accounts.assistant.encryption`.
Wenn Verschlüsselung für ein benanntes Konto deaktiviert oder nicht verfügbar ist, verweisen Matrix-Warnungen und Verifizierungsfehler auf den Konfigurationsschlüssel dieses Kontos, zum Beispiel `channels.matrix.accounts.assistant.encryption`.
### Was „verifiziert“ bedeutet
OpenClaw behandelt dieses Matrix-Gerät nur dann als verifiziert, wenn es durch deine eigene Cross-Signing-Identität verifiziert wurde.
In der Praxis zeigt `openclaw matrix verify status --verbose` drei Vertrauenssignale an:
- `Locally trusted`: Dieses Gerät wird nur vom aktuellen Client als vertrauenswürdig eingestuft
- `Locally trusted`: Dieses Gerät ist nur durch den aktuellen Client als vertrauenswürdig markiert
- `Cross-signing verified`: Das SDK meldet das Gerät als durch Cross-Signing verifiziert
- `Signed by owner`: Das Gerät ist mit deinem eigenen Self-Signing-Schlüssel signiert
`Verified by owner` wird nur dann zu `yes`, wenn Cross-Signing-Verifizierung oder Signierung durch den Eigentümer vorhanden ist.
`Verified by owner` wird nur dann zu `yes`, wenn Cross-Signing-Verifizierung oder Owner-Signing vorhanden ist.
Lokales Vertrauen allein reicht nicht aus, damit OpenClaw das Gerät als vollständig verifiziert behandelt.
### Was Bootstrap macht
@ -581,24 +582,23 @@ Lokales Vertrauen allein reicht nicht aus, damit OpenClaw das Gerät als vollst
`openclaw matrix verify bootstrap` ist der Reparatur- und Einrichtungsbefehl für verschlüsselte Matrix-Konten.
Er führt der Reihe nach Folgendes aus:
- initialisiert Secret Storage und verwendet nach Möglichkeit einen vorhandenen Recovery Key erneut
- initialisiert den Secret Storage und verwendet nach Möglichkeit einen vorhandenen Wiederherstellungsschlüssel erneut
- initialisiert Cross-Signing und lädt fehlende öffentliche Cross-Signing-Schlüssel hoch
- versucht, das aktuelle Gerät zu markieren und per Cross-Signing zu signieren
- erstellt ein neues serverseitiges Raumschlüssel-Backup, falls noch keines vorhanden ist
- erstellt ein neues serverseitiges Raumschlüssel-Backup, falls noch keines existiert
Wenn der Homeserver interaktive Authentifizierung zum Hochladen von Cross-Signing-Schlüsseln verlangt, versucht OpenClaw das Hochladen zuerst ohne Authentifizierung, dann mit `m.login.dummy` und anschließend mit `m.login.password`, wenn `channels.matrix.password` konfiguriert ist.
Verwende `--force-reset-cross-signing` nur, wenn du die aktuelle Cross-Signing-Identität absichtlich verwerfen und eine neue erstellen möchtest.
Verwende `--force-reset-cross-signing` nur, wenn du absichtlich die aktuelle Cross-Signing-Identität verwerfen und eine neue erstellen möchtest.
Wenn du das aktuelle Raumschlüssel-Backup absichtlich verwerfen und eine neue
Backup-Basis für zukünftige Nachrichten erstellen möchtest, verwende `openclaw matrix verify backup reset --yes`.
Tu dies nur, wenn du akzeptierst, dass nicht wiederherstellbarer alter verschlüsselter Verlauf
nicht verfügbar bleibt und dass OpenClaw den Secret Storage möglicherweise neu erstellt, wenn das aktuelle Backup-Geheimnis
nicht sicher geladen werden kann.
Wenn du absichtlich das aktuelle Raumschlüssel-Backup verwerfen und eine neue
Backup-Basis für zukünftige Nachrichten starten möchtest, verwende `openclaw matrix verify backup reset --yes`.
Tue dies nur, wenn du akzeptierst, dass nicht wiederherstellbarer alter verschlüsselter Verlauf
weiterhin nicht verfügbar bleibt und dass OpenClaw den Secret Storage möglicherweise neu erstellt, wenn das aktuelle Backup-Secret nicht sicher geladen werden kann.
### Neue Backup-Basis
Wenn du die Funktion für zukünftige verschlüsselte Nachrichten erhalten und den Verlust nicht wiederherstellbaren alten Verlaufs akzeptieren möchtest, führe diese Befehle in dieser Reihenfolge aus:
Wenn du sicherstellen möchtest, dass zukünftige verschlüsselte Nachrichten weiterhin funktionieren, und akzeptierst, nicht wiederherstellbaren alten Verlauf zu verlieren, führe diese Befehle in dieser Reihenfolge aus:
```bash
openclaw matrix verify backup reset --yes
@ -606,24 +606,25 @@ openclaw matrix verify backup status --verbose
openclaw matrix verify status
```
Füge zu jedem Befehl `--account <id>` hinzu, wenn du gezielt ein benanntes Matrix-Konto ansprechen möchtest.
Füge `--account <id>` zu jedem Befehl hinzu, wenn du explizit ein benanntes Matrix-Konto ansprechen möchtest.
### Verhalten beim Start
### Startverhalten
Wenn `encryption: true` gesetzt ist, verwendet Matrix standardmäßig `startupVerification` mit dem Wert `"if-unverified"`.
Beim Start fordert Matrix, wenn dieses Gerät noch nicht verifiziert ist, die Selbstverifizierung in einem anderen Matrix-Client an,
überspringt doppelte Anfragen, solange bereits eine aussteht, und wendet vor einem erneuten Versuch nach Neustarts eine lokale Abkühlzeit an.
Fehlgeschlagene Anfrageversuche werden standardmäßig früher erneut versucht als erfolgreich erstellte Anfragen.
Beim Start fordert Matrix, falls dieses Gerät noch nicht verifiziert ist, in einem anderen Matrix-Client zur Selbstverifizierung auf,
überspringt doppelte Anforderungen, solange bereits eine aussteht, und verwendet vor einem erneuten Versuch nach Neustarts eine lokale Abklingzeit.
Fehlgeschlagene Anforderungsversuche werden standardmäßig früher erneut versucht als eine erfolgreiche Erstellung der Anforderung.
Setze `startupVerification: "off"`, um automatische Anfragen beim Start zu deaktivieren, oder passe `startupVerificationCooldownHours`
an, wenn du ein kürzeres oder längeres Wiederholungsfenster möchtest.
Beim Start wird außerdem automatisch ein konservativer Crypto-Bootstrap-Durchlauf ausgeführt.
Dieser Durchlauf versucht zuerst, den aktuellen Secret Storage und die aktuelle Cross-Signing-Identität wiederzuverwenden, und vermeidet ein Zurücksetzen von Cross-Signing, es sei denn, du führst explizit einen Bootstrap-Reparaturablauf aus.
Dieser Durchlauf versucht zuerst, den aktuellen Secret Storage und die aktuelle Cross-Signing-Identität wiederzuverwenden, und vermeidet ein Zurücksetzen von Cross-Signing, sofern du nicht ausdrücklich einen Bootstrap-Reparaturablauf ausführst.
Wenn beim Start ein defekter Bootstrap-Zustand gefunden wird und `channels.matrix.password` konfiguriert ist, kann OpenClaw einen strengeren Reparaturpfad versuchen.
Wenn beim Start dennoch ein fehlerhafter Bootstrap-Status erkannt wird, kann OpenClaw einen abgesicherten Reparaturpfad versuchen, selbst wenn `channels.matrix.password` nicht konfiguriert ist.
Wenn der Homeserver für diese Reparatur passwortbasierte UIA verlangt, protokolliert OpenClaw eine Warnung und hält den Start weiterhin nicht fatal, anstatt den Bot abzubrechen.
Wenn das aktuelle Gerät bereits vom Eigentümer signiert ist, bewahrt OpenClaw diese Identität, anstatt sie automatisch zurückzusetzen.
Siehe [Matrix migration](/de/install/migrating-matrix) für den vollständigen Upgrade-Ablauf, Einschränkungen, Recovery-Befehle und häufige Migrationsmeldungen.
Siehe [Matrix migration](/de/install/migrating-matrix) für den vollständigen Upgrade-Ablauf, Grenzen, Wiederherstellungsbefehle und häufige Migrationsmeldungen.
### Verifizierungshinweise
@ -631,46 +632,46 @@ Matrix veröffentlicht Hinweise zum Lebenszyklus der Verifizierung direkt im str
Dazu gehören:
- Hinweise zu Verifizierungsanfragen
- Hinweise darauf, dass die Verifizierung bereit ist (mit explizitem Hinweis „Per Emoji verifizieren“)
- Hinweise zur Verifizierungsbereitschaft (mit ausdrücklichem Hinweis „Per Emoji verifizieren“)
- Hinweise zum Start und Abschluss der Verifizierung
- SAS-Details (Emoji und Dezimalwerte), wenn verfügbar
- SAS-Details (Emoji und Dezimalzahl), wenn verfügbar
Eingehende Verifizierungsanfragen von einem anderen Matrix-Client werden von OpenClaw nachverfolgt und automatisch akzeptiert.
Bei Selbstverifizierungsabläufen startet OpenClaw außerdem automatisch den SAS-Ablauf, sobald die Emoji-Verifizierung verfügbar wird, und bestätigt die eigene Seite.
Bei Verifizierungsanfragen von einem anderen Matrix-Benutzer/Gerät akzeptiert OpenClaw die Anfrage automatisch und wartet dann darauf, dass der SAS-Ablauf normal fortgesetzt wird.
Du musst die Emoji- oder dezimalen SAS-Werte in deinem Matrix-Client weiterhin vergleichen und dort „Sie stimmen überein“ bestätigen, um die Verifizierung abzuschließen.
Eingehende Verifizierungsanfragen von einem anderen Matrix-Client werden von OpenClaw nachverfolgt und automatisch angenommen.
Bei Selbstverifizierungsabläufen startet OpenClaw den SAS-Ablauf auch automatisch, sobald die Emoji-Verifizierung verfügbar wird, und bestätigt die eigene Seite.
Bei Verifizierungsanfragen von einem anderen Matrix-Benutzer/-Gerät nimmt OpenClaw die Anfrage automatisch an und wartet dann darauf, dass der SAS-Ablauf normal fortgesetzt wird.
Du musst die Emoji- oder dezimale SAS dennoch in deinem Matrix-Client vergleichen und dort „Sie stimmen überein“ bestätigen, um die Verifizierung abzuschließen.
OpenClaw akzeptiert selbst initiierte doppelte Abläufe nicht blind automatisch. Beim Start wird das Erstellen einer neuen Anfrage übersprungen, wenn bereits eine Selbstverifizierungsanfrage aussteht.
OpenClaw akzeptiert selbst initiierte doppelte Abläufe nicht blind automatisch. Beim Start wird keine neue Anfrage erstellt, wenn bereits eine Selbstverifizierungsanfrage aussteht.
Hinweise des Verifizierungsprotokolls/Systems werden nicht an die Agent-Chat-Pipeline weitergeleitet und erzeugen daher kein `NO_REPLY`.
Hinweise zum Verifizierungsprotokoll/System werden nicht an die Agent-Chat-Pipeline weitergeleitet und erzeugen daher kein `NO_REPLY`.
### Gerätehygiene
Alte von OpenClaw verwaltete Matrix-Geräte können sich im Konto ansammeln und die Vertrauensbewertung in verschlüsselten Räumen schwerer nachvollziehbar machen.
Alte, von OpenClaw verwaltete Matrix-Geräte können sich im Konto ansammeln und das Vertrauen in verschlüsselten Räumen schwerer nachvollziehbar machen.
Liste sie auf mit:
```bash
openclaw matrix devices list
```
Entferne veraltete von OpenClaw verwaltete Geräte mit:
Entferne veraltete, von OpenClaw verwaltete Geräte mit:
```bash
openclaw matrix devices prune-stale
```
### Krypto-Speicher
### Crypto-Store
Matrix-E2EE verwendet den offiziellen Rust-Kryptopfad von `matrix-js-sdk` in Node, mit `fake-indexeddb` als IndexedDB-Shim. Der Kryptozustand wird in einer Snapshot-Datei (`crypto-idb-snapshot.json`) gespeichert und beim Start wiederhergestellt. Die Snapshot-Datei ist sensibler Laufzeitzustand und wird mit restriktiven Dateiberechtigungen gespeichert.
Matrix-E2EE verwendet den offiziellen Rust-Crypto-Pfad von `matrix-js-sdk` in Node, mit `fake-indexeddb` als IndexedDB-Shim. Der Crypto-Status wird in einer Snapshot-Datei (`crypto-idb-snapshot.json`) gespeichert und beim Start wiederhergestellt. Die Snapshot-Datei ist sensibler Laufzeitstatus und wird mit restriktiven Dateiberechtigungen gespeichert.
Der verschlüsselte Laufzeitzustand befindet sich unter kontospezifischen, benutzerspezifischen Token-Hash-Wurzeln in
Verschlüsselter Laufzeitstatus liegt unter roots pro Konto und Benutzer mit Token-Hash in
`~/.openclaw/matrix/accounts/<account>/<homeserver>__<user>/<token-hash>/`.
Dieses Verzeichnis enthält den Sync-Speicher (`bot-storage.json`), den Krypto-Speicher (`crypto/`),
die Recovery-Key-Datei (`recovery-key.json`), den IndexedDB-Snapshot (`crypto-idb-snapshot.json`),
Thread-Bindungen (`thread-bindings.json`) und den Startverifizierungszustand (`startup-verification.json`).
Dieses Verzeichnis enthält den Sync-Store (`bot-storage.json`), den Crypto-Store (`crypto/`),
die Wiederherstellungsschlüssel-Datei (`recovery-key.json`), den IndexedDB-Snapshot (`crypto-idb-snapshot.json`),
Thread-Bindings (`thread-bindings.json`) und den Status der Startverifizierung (`startup-verification.json`).
Wenn sich das Token ändert, die Kontoidentität aber gleich bleibt, verwendet OpenClaw die beste vorhandene
Wurzel für dieses Tupel aus Konto/Homeserver/Benutzer erneut, sodass der bisherige Sync-Zustand, Krypto-Zustand, Thread-Bindungen
und Startverifizierungszustand weiterhin sichtbar bleiben.
Root für dieses Konto-/Homeserver-/Benutzer-Tupel wieder, sodass vorheriger Sync-Status, Crypto-Status, Thread-Bindings
und Startverifizierungsstatus sichtbar bleiben.
## Profilverwaltung
@ -681,37 +682,37 @@ openclaw matrix profile set --name "OpenClaw Assistant"
openclaw matrix profile set --avatar-url https://cdn.example.org/avatar.png
```
Füge `--account <id>` hinzu, wenn du gezielt ein benanntes Matrix-Konto ansprechen möchtest.
Füge `--account <id>` hinzu, wenn du explizit ein benanntes Matrix-Konto ansprechen möchtest.
Matrix akzeptiert `mxc://`-Avatar-URLs direkt. Wenn du eine `http://`- oder `https://`-Avatar-URL übergibst, lädt OpenClaw sie zuerst zu Matrix hoch und speichert die aufgelöste `mxc://`-URL zurück in `channels.matrix.avatarUrl` (oder in die ausgewählte Kontoüberschreibung).
Matrix akzeptiert `mxc://`-Avatar-URLs direkt. Wenn du eine `http://`- oder `https://`-Avatar-URL übergibst, lädt OpenClaw sie zuerst zu Matrix hoch und speichert die aufgelöste `mxc://`-URL zurück in `channels.matrix.avatarUrl` (oder in den ausgewählten Konto-Override).
## Threads
Matrix unterstützt native Matrix-Threads sowohl für automatische Antworten als auch für Sendevorgänge von Message-Tools.
Matrix unterstützt native Matrix-Threads sowohl für automatische Antworten als auch für Sendungen über Message-Tools.
- `dm.sessionScope: "per-user"` (Standard) hält das Routing von Matrix-DMs absenderbezogen, sodass mehrere DM-Räume eine Sitzung gemeinsam nutzen können, wenn sie zum selben Gegenüber aufgelöst werden.
- `dm.sessionScope: "per-room"` isoliert jeden Matrix-DM-Raum in seinen eigenen Sitzungsschlüssel, verwendet aber weiterhin normale DM-Authentifizierung und Allowlist-Prüfungen.
- Explizite Matrix-Konversationsbindungen haben weiterhin Vorrang vor `dm.sessionScope`, sodass gebundene Räume und Threads ihre gewählte Zielsitzung beibehalten.
- `threadReplies: "off"` hält Antworten auf oberster Ebene und belässt eingehende Thread-Nachrichten in der übergeordneten Sitzung.
- `dm.sessionScope: "per-user"` (Standard) hält das DM-Routing in Matrix absenderspezifisch, sodass mehrere DM-Räume eine Sitzung gemeinsam nutzen können, wenn sie zum selben Peer aufgelöst werden.
- `dm.sessionScope: "per-room"` isoliert jeden Matrix-DM-Raum in seinen eigenen Sitzungsschlüssel und verwendet dabei weiterhin normale DM-Authentifizierungs- und Allowlist-Prüfungen.
- Explizite Matrix-Konversations-Bindings haben weiterhin Vorrang vor `dm.sessionScope`, sodass gebundene Räume und Threads ihre gewählte Zielsitzung beibehalten.
- `threadReplies: "off"` hält Antworten auf der obersten Ebene und behält eingehende Thread-Nachrichten in der übergeordneten Sitzung.
- `threadReplies: "inbound"` antwortet innerhalb eines Threads nur dann, wenn die eingehende Nachricht bereits in diesem Thread war.
- `threadReplies: "always"` hält Raumantworten in einem Thread mit Wurzel in der auslösenden Nachricht und leitet diese Konversation ab der ersten auslösenden Nachricht über die passende threadspezifische Sitzung.
- `dm.threadReplies` überschreibt die Einstellung der obersten Ebene nur für DMs. Du kannst zum Beispiel Raum-Threads isoliert halten und DMs flach belassen.
- `threadReplies: "always"` hält Raumantworten in einem Thread mit der auslösenden Nachricht als Wurzel und leitet diese Konversation ab der ersten auslösenden Nachricht über die passende threadbezogene Sitzung.
- `dm.threadReplies` überschreibt die Einstellung auf oberster Ebene nur für DMs. So kannst du zum Beispiel Raum-Threads isoliert halten und DMs flach halten.
- Eingehende Thread-Nachrichten enthalten die Thread-Wurzel-Nachricht als zusätzlichen Agent-Kontext.
- Sendevorgänge von Message-Tools übernehmen automatisch den aktuellen Matrix-Thread, wenn das Ziel derselbe Raum oder dasselbe DM-Benutzerziel ist, es sei denn, eine explizite `threadId` wird angegeben.
- Dieselbe sitzungsbezogene Wiederverwendung eines DM-Benutzerziels greift nur, wenn die aktuellen Sitzungsmetadaten dasselbe DM-Gegenüber auf demselben Matrix-Konto belegen; andernfalls greift OpenClaw auf normales benutzerbezogenes Routing zurück.
- Wenn OpenClaw erkennt, dass ein Matrix-DM-Raum mit einem anderen DM-Raum in derselben gemeinsamen Matrix-DM-Sitzung kollidiert, veröffentlicht es einmalig ein `m.notice` in diesem Raum mit dem `/focus`-Ausweg, wenn Thread-Bindungen aktiviert sind und dem Hinweis `dm.sessionScope`.
- Laufzeit-Thread-Bindungen werden für Matrix unterstützt. `/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age` und threadgebundenes `/acp spawn` funktionieren in Matrix-Räumen und DMs.
- `/focus` auf oberster Ebene in einem Matrix-Raum/DM erstellt einen neuen Matrix-Thread und bindet ihn an die Zielsitzung, wenn `threadBindings.spawnSubagentSessions=true`.
- Wenn `/focus` oder `/acp spawn --thread here` innerhalb eines vorhandenen Matrix-Threads ausgeführt wird, bindet es stattdessen diesen aktuellen Thread.
- Sendungen über Message-Tools übernehmen den aktuellen Matrix-Thread automatisch, wenn das Ziel derselbe Raum oder dasselbe DM-Benutzerziel ist, sofern kein explizites `threadId` angegeben wird.
- Die Wiederverwendung desselben sitzungsbezogenen DM-Benutzerziels greift nur, wenn die Metadaten der aktuellen Sitzung denselben DM-Peer im selben Matrix-Konto nachweisen; andernfalls fällt OpenClaw auf normales benutzerbezogenes Routing zurück.
- Wenn OpenClaw erkennt, dass ein Matrix-DM-Raum mit einem anderen DM-Raum in derselben gemeinsamen Matrix-DM-Sitzung kollidiert, veröffentlicht es in diesem Raum einmalig ein `m.notice` mit dem `/focus`-Ausweg, wenn Thread-Bindings aktiviert sind, sowie dem Hinweis `dm.sessionScope`.
- Laufzeit-Thread-Bindings werden für Matrix unterstützt. `/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age` und threadgebundenes `/acp spawn` funktionieren in Matrix-Räumen und DMs.
- `/focus` auf oberster Ebene in Matrix-Räumen/DMs erstellt einen neuen Matrix-Thread und bindet ihn an die Zielsitzung, wenn `threadBindings.spawnSubagentSessions=true`.
- Wenn `/focus` oder `/acp spawn --thread here` innerhalb eines vorhandenen Matrix-Threads ausgeführt wird, bindet dies stattdessen diesen aktuellen Thread.
## ACP-Konversationsbindungen
## ACP-Konversations-Bindings
Matrix-Räume, DMs und vorhandene Matrix-Threads können in dauerhafte ACP-Arbeitsbereiche umgewandelt werden, ohne die Chat-Oberfläche zu ändern.
Schneller Operator-Ablauf:
- Führe `/acp spawn codex --bind here` innerhalb der Matrix-DM, des Raums oder des vorhandenen Threads aus, den du weiterverwenden möchtest.
- In einer Matrix-DM oder einem Raum auf oberster Ebene bleibt die aktuelle DM bzw. der aktuelle Raum die Chat-Oberfläche und zukünftige Nachrichten werden an die erzeugte ACP-Sitzung geleitet.
- In einer Matrix-DM oder einem Matrix-Raum auf oberster Ebene bleibt die aktuelle DM/der aktuelle Raum die Chat-Oberfläche, und zukünftige Nachrichten werden an die erzeugte ACP-Sitzung weitergeleitet.
- Innerhalb eines vorhandenen Matrix-Threads bindet `--bind here` diesen aktuellen Thread an Ort und Stelle.
- `/new` und `/reset` setzen dieselbe gebundene ACP-Sitzung an Ort und Stelle zurück.
- `/acp close` schließt die ACP-Sitzung und entfernt die Bindung.
@ -721,9 +722,9 @@ Hinweise:
- `--bind here` erstellt keinen untergeordneten Matrix-Thread.
- `threadBindings.spawnAcpSessions` ist nur für `/acp spawn --thread auto|here` erforderlich, wenn OpenClaw einen untergeordneten Matrix-Thread erstellen oder binden muss.
### Konfiguration von Thread-Bindungen
### Thread-Binding-Konfiguration
Matrix übernimmt globale Standardwerte aus `session.threadBindings` und unterstützt außerdem kanalbezogene Überschreibungen:
Matrix übernimmt globale Standardwerte aus `session.threadBindings` und unterstützt außerdem kanalbezogene Overrides:
- `threadBindings.enabled`
- `threadBindings.idleHours`
@ -733,33 +734,33 @@ Matrix übernimmt globale Standardwerte aus `session.threadBindings` und unterst
Threadgebundene Spawn-Flags für Matrix sind optional:
- Setze `threadBindings.spawnSubagentSessions: true`, um zu erlauben, dass `/focus` auf oberster Ebene neue Matrix-Threads erstellt und bindet.
- Setze `threadBindings.spawnAcpSessions: true`, um zu erlauben, dass `/acp spawn --thread auto|here` ACP-Sitzungen an Matrix-Threads bindet.
- Setze `threadBindings.spawnSubagentSessions: true`, um zuzulassen, dass `/focus` auf oberster Ebene neue Matrix-Threads erstellt und bindet.
- Setze `threadBindings.spawnAcpSessions: true`, um zuzulassen, dass `/acp spawn --thread auto|here` ACP-Sitzungen an Matrix-Threads bindet.
## Reaktionen
Matrix unterstützt ausgehende Reaktionsaktionen, eingehende Reaktionsbenachrichtigungen und eingehende Bestätigungsreaktionen.
- Ausgehende Reaktions-Tools werden durch `channels["matrix"].actions.reactions` gesteuert.
- `react` fügt eine Reaktion zu einem bestimmten Matrix-Ereignis hinzu.
- Tooling für ausgehende Reaktionen wird durch `channels["matrix"].actions.reactions` gesteuert.
- `react` fügt einem bestimmten Matrix-Ereignis eine Reaktion hinzu.
- `reactions` listet die aktuelle Reaktionszusammenfassung für ein bestimmtes Matrix-Ereignis auf.
- `emoji=""` entfernt die eigenen Reaktionen des Bot-Kontos auf dieses Ereignis.
- `remove: true` entfernt nur die angegebene Emoji-Reaktion des Bot-Kontos.
- `emoji=""` entfernt die eigenen Reaktionen des Bot-Kontos auf diesem Ereignis.
- `remove: true` entfernt nur die angegebene Emoji-Reaktion vom Bot-Konto.
Der Geltungsbereich von Bestätigungsreaktionen wird in dieser Reihenfolge aufgelöst:
Der Geltungsbereich für Bestätigungsreaktionen wird in dieser Reihenfolge aufgelöst:
- `channels["matrix"].accounts.<accountId>.ackReaction`
- `channels["matrix"].ackReaction`
- `messages.ackReaction`
- Emoji-Fallback der Agent-Identität
Der Geltungsbereich der Bestätigungsreaktion wird in dieser Reihenfolge aufgelöst:
Der Geltungsbereich von Bestätigungsreaktionen wird in dieser Reihenfolge aufgelöst:
- `channels["matrix"].accounts.<accountId>.ackReactionScope`
- `channels["matrix"].ackReactionScope`
- `messages.ackReactionScope`
Der Modus für Reaktionsbenachrichtigungen wird in dieser Reihenfolge aufgelöst:
Der Benachrichtigungsmodus für Reaktionen wird in dieser Reihenfolge aufgelöst:
- `channels["matrix"].accounts.<accountId>.reactionNotifications`
- `channels["matrix"].reactionNotifications`
@ -767,28 +768,28 @@ Der Modus für Reaktionsbenachrichtigungen wird in dieser Reihenfolge aufgelöst
Verhalten:
- `reactionNotifications: "own"` leitet hinzugefügte `m.reaction`-Ereignisse weiter, wenn sie auf von Bots verfasste Matrix-Nachrichten zielen.
- `reactionNotifications: "off"` deaktiviert Reaktionssystemereignisse.
- Das Entfernen von Reaktionen wird nicht in Systemereignisse umgewandelt, weil Matrix diese als Redactions und nicht als eigenständige `m.reaction`-Entfernungen darstellt.
- `reactionNotifications: "own"` leitet hinzugefügte `m.reaction`-Ereignisse weiter, wenn sie sich auf vom Bot verfasste Matrix-Nachrichten beziehen.
- `reactionNotifications: "off"` deaktiviert Reaktions-Systemereignisse.
- Das Entfernen von Reaktionen wird nicht zu Systemereignissen synthetisiert, da Matrix diese als Redaktionen und nicht als eigenständige Entfernungen von `m.reaction` darstellt.
## Verlaufskontext
## Verlaufs-Kontext
- `channels.matrix.historyLimit` steuert, wie viele aktuelle Raumnachrichten als `InboundHistory` einbezogen werden, wenn eine Matrix-Raumnachricht den Agent auslöst. Fällt auf `messages.groupChat.historyLimit` zurück; wenn beide nicht gesetzt sind, ist der effektive Standardwert `0`. Setze `0`, um dies zu deaktivieren.
- Der Verlauf von Matrix-Räumen gilt nur für Räume. DMs verwenden weiterhin den normalen Sitzungsverlauf.
- Der Verlauf von Matrix-Räumen ist nur raumbezogen. DMs verwenden weiterhin den normalen Sitzungsverlauf.
- Der Verlauf von Matrix-Räumen ist nur für ausstehende Nachrichten: OpenClaw puffert Raumnachrichten, die noch keine Antwort ausgelöst haben, und erstellt dann einen Snapshot dieses Fensters, wenn eine Erwähnung oder ein anderer Auslöser eintrifft.
- Die aktuelle Auslösernachricht wird nicht in `InboundHistory` aufgenommen; sie bleibt für diesen Turn im Hauptteil der eingehenden Nachricht.
- Wiederholungen desselben Matrix-Ereignisses verwenden den ursprünglichen Verlaufs-Snapshot wieder, anstatt zu neueren Raumnachrichten weiterzuwandern.
- Die aktuelle auslösende Nachricht ist nicht in `InboundHistory` enthalten; sie bleibt für diesen Turn im Hauptteil der eingehenden Nachricht.
- Wiederholungsversuche desselben Matrix-Ereignisses verwenden den ursprünglichen Verlaufs-Snapshot wieder, anstatt auf neuere Raumnachrichten weiterzudriften.
## Kontextsichtigkeit
## Kontextsichtbarkeit
Matrix unterstützt die gemeinsame Steuerung `contextVisibility` für ergänzenden Raumkontext wie abgerufenen Antworttext, Thread-Wurzeln und ausstehenden Verlauf.
- `contextVisibility: "all"` ist die Standardeinstellung. Ergänzender Kontext bleibt wie empfangen erhalten.
- `contextVisibility: "allowlist"` filtert ergänzenden Kontext auf Absender, die durch die aktiven Allowlist-Prüfungen für Raum/Benutzer erlaubt sind.
- `contextVisibility: "allowlist_quote"` verhält sich wie `allowlist`, behält aber dennoch ein explizites zitiertes Reply bei.
- `contextVisibility: "all"` ist der Standard. Ergänzender Kontext bleibt wie empfangen erhalten.
- `contextVisibility: "allowlist"` filtert ergänzenden Kontext auf Absender, die durch die aktiven Raum-/Benutzer-Allowlist-Prüfungen zugelassen sind.
- `contextVisibility: "allowlist_quote"` verhält sich wie `allowlist`, behält aber dennoch eine explizit zitierte Antwort bei.
Diese Einstellung beeinflusst die Sichtbarkeit des ergänzenden Kontexts, nicht, ob die eingehende Nachricht selbst eine Antwort auslösen darf.
Die Autorisierung des Auslösers stammt weiterhin aus `groupPolicy`, `groups`, `groupAllowFrom` und den Einstellungen für DM-Richtlinien.
Diese Einstellung beeinflusst die Sichtbarkeit ergänzenden Kontexts, nicht ob die eingehende Nachricht selbst eine Antwort auslösen kann.
Die Autorisierung von Auslösern kommt weiterhin von `groupPolicy`, `groups`, `groupAllowFrom` und den DM-Richtlinieneinstellungen.
## DM- und Raumrichtlinie
@ -813,7 +814,7 @@ Die Autorisierung des Auslösers stammt weiterhin aus `groupPolicy`, `groups`, `
}
```
Siehe [Groups](/de/channels/groups) für Verhalten bei Erwähnungsgating und Allowlists.
Siehe [Groups](/de/channels/groups) für Erwähnungs-Gating und Allowlist-Verhalten.
Pairing-Beispiel für Matrix-DMs:
@ -822,13 +823,13 @@ openclaw pairing list matrix
openclaw pairing approve matrix <CODE>
```
Wenn ein nicht genehmigter Matrix-Benutzer dir vor der Freigabe weiterhin Nachrichten sendet, verwendet OpenClaw denselben ausstehenden Pairing-Code erneut und kann nach einer kurzen Abkühlzeit erneut eine Erinnerungsantwort senden, anstatt einen neuen Code zu erzeugen.
Wenn ein nicht genehmigter Matrix-Benutzer dich vor der Genehmigung weiter anschreibt, verwendet OpenClaw denselben ausstehenden Pairing-Code erneut und kann nach einer kurzen Abklingzeit erneut eine Erinnerung senden, statt einen neuen Code zu erzeugen.
Siehe [Pairing](/de/channels/pairing) für den gemeinsamen DM-Pairing-Ablauf und das Speicherlayout.
## Reparatur direkter Räume
Wenn der Direktnachrichtenstatus nicht mehr synchron ist, kann OpenClaw veraltete `m.direct`-Zuordnungen haben, die auf alte Einzelräume statt auf die aktuelle DM zeigen. Prüfe die aktuelle Zuordnung für ein Gegenüber mit:
Wenn der Status von Direktnachrichten nicht synchron ist, kann OpenClaw veraltete `m.direct`-Zuordnungen haben, die auf alte Einzelräume statt auf die aktive DM zeigen. Prüfe die aktuelle Zuordnung für einen Peer mit:
```bash
openclaw matrix direct inspect --user-id @alice:example.org
@ -843,15 +844,15 @@ openclaw matrix direct repair --user-id @alice:example.org
Der Reparaturablauf:
- bevorzugt eine strikte 1:1-DM, die bereits in `m.direct` zugeordnet ist
- greift andernfalls auf eine aktuell beigetretene strikte 1:1-DM mit diesem Benutzer zurück
- erstellt einen neuen Direkt-Raum und schreibt `m.direct` neu, wenn keine funktionsfähige DM existiert
- fällt auf eine aktuell beigetretene strikte 1:1-DM mit diesem Benutzer zurück
- erstellt einen neuen Direkt-Raum und schreibt `m.direct` neu, wenn keine gesunde DM existiert
Der Reparaturablauf löscht alte Räume nicht automatisch. Er wählt nur die funktionsfähige DM aus und aktualisiert die Zuordnung, sodass neue Matrix-Sendevorgänge, Verifizierungshinweise und andere Direktnachrichtenabläufe wieder den richtigen Raum ansteuern.
Der Reparaturablauf löscht alte Räume nicht automatisch. Er wählt nur die gesunde DM aus und aktualisiert die Zuordnung, damit neue Matrix-Sendungen, Verifizierungshinweise und andere Direktnachrichtenabläufe wieder den richtigen Raum ansprechen.
## Exec-Genehmigungen
Matrix kann als nativer Genehmigungs-Client für ein Matrix-Konto fungieren. Die nativen
Routing-Regler für DMs/Kanäle befinden sich weiterhin unter der Konfiguration für Exec-Genehmigungen:
DM-/Channel-Routing-Schalter befinden sich weiterhin unter der Exec-Genehmigungskonfiguration:
- `channels.matrix.execApprovals.enabled`
- `channels.matrix.execApprovals.approvers` (optional; fällt auf `channels.matrix.dm.allowFrom` zurück)
@ -859,38 +860,38 @@ Routing-Regler für DMs/Kanäle befinden sich weiterhin unter der Konfiguration
- `channels.matrix.execApprovals.agentFilter`
- `channels.matrix.execApprovals.sessionFilter`
Genehmigende Personen müssen Matrix-Benutzer-IDs wie `@owner:example.org` sein. Matrix aktiviert native Genehmigungen automatisch, wenn `enabled` nicht gesetzt oder `"auto"` ist und mindestens eine genehmigende Person aufgelöst werden kann. Exec-Genehmigungen verwenden zuerst `execApprovals.approvers` und können auf `channels.matrix.dm.allowFrom` zurückfallen. Plugin-Genehmigungen autorisieren über `channels.matrix.dm.allowFrom`. Setze `enabled: false`, um Matrix explizit als nativen Genehmigungs-Client zu deaktivieren. Genehmigungsanfragen fallen andernfalls auf andere konfigurierte Genehmigungswege oder die Fallback-Richtlinie für Genehmigungen zurück.
Genehmiger müssen Matrix-Benutzer-IDs wie `@owner:example.org` sein. Matrix aktiviert native Genehmigungen automatisch, wenn `enabled` nicht gesetzt ist oder `"auto"` lautet und mindestens ein Genehmiger aufgelöst werden kann. Exec-Genehmigungen verwenden zuerst `execApprovals.approvers` und können auf `channels.matrix.dm.allowFrom` zurückfallen. Plugin-Genehmigungen autorisieren über `channels.matrix.dm.allowFrom`. Setze `enabled: false`, um Matrix ausdrücklich als nativen Genehmigungs-Client zu deaktivieren. Andernfalls fallen Genehmigungsanfragen auf andere konfigurierte Genehmigungsrouten oder die Genehmigungs-Fallback-Richtlinie zurück.
Das native Matrix-Routing unterstützt beide Genehmigungsarten:
Matrix-native Weiterleitung unterstützt beide Genehmigungsarten:
- `channels.matrix.execApprovals.*` steuert den nativen DM-/Kanal-Fanout-Modus für Matrix-Genehmigungsaufforderungen.
- Exec-Genehmigungen verwenden die Menge genehmigender Personen aus `execApprovals.approvers` oder `channels.matrix.dm.allowFrom`.
- `channels.matrix.execApprovals.*` steuert den nativen DM-/Channel-Fanout-Modus für Matrix-Genehmigungsaufforderungen.
- Exec-Genehmigungen verwenden die Menge der Exec-Genehmiger aus `execApprovals.approvers` oder `channels.matrix.dm.allowFrom`.
- Plugin-Genehmigungen verwenden die DM-Allowlist von Matrix aus `channels.matrix.dm.allowFrom`.
- Matrix-Reaktionskürzel und Nachrichtenaktualisierungen gelten sowohl für Exec- als auch für Plugin-Genehmigungen.
Zustellungsregeln:
Zustellregeln:
- `target: "dm"` sendet Genehmigungsaufforderungen an DMs der genehmigenden Personen
- `target: "dm"` sendet Genehmigungsaufforderungen an Genehmiger-DMs
- `target: "channel"` sendet die Aufforderung zurück an den auslösenden Matrix-Raum oder die auslösende DM
- `target: "both"` sendet an DMs der genehmigenden Personen und an den auslösenden Matrix-Raum oder die auslösende DM
- `target: "both"` sendet an Genehmiger-DMs und an den auslösenden Matrix-Raum oder die auslösende DM
Matrix-Genehmigungsaufforderungen setzen Reaktionskürzel auf der primären Genehmigungsnachricht:
Matrix-Genehmigungsaufforderungen initialisieren Reaktionskürzel auf der primären Genehmigungsnachricht:
- `✅` = einmal erlauben
- `❌` = ablehnen
- `♾️` = immer erlauben, wenn diese Entscheidung durch die effektive Exec-Richtlinie erlaubt ist
- `♾️` = immer erlauben, wenn diese Entscheidung durch die effektive Exec-Richtlinie zulässig ist
Genehmigende Personen können auf diese Nachricht reagieren oder die Fallback-Slash-Befehle verwenden: `/approve <id> allow-once`, `/approve <id> allow-always` oder `/approve <id> deny`.
Genehmiger können auf diese Nachricht reagieren oder die Fallback-Slash-Befehle verwenden: `/approve <id> allow-once`, `/approve <id> allow-always` oder `/approve <id> deny`.
Nur aufgelöste genehmigende Personen können genehmigen oder ablehnen. Bei Exec-Genehmigungen enthält die Kanalzustellung den Befehlstext, aktiviere also `channel` oder `both` nur in vertrauenswürdigen Räumen.
Nur aufgelöste Genehmiger können genehmigen oder ablehnen. Bei Exec-Genehmigungen enthält die Channel-Zustellung den Befehlstext, daher solltest du `channel` oder `both` nur in vertrauenswürdigen Räumen aktivieren.
Kontobezogene Überschreibung:
Kontoabhängiger Override:
- `channels.matrix.accounts.<account>.execApprovals`
Verwandte Dokumentation: [Exec approvals](/de/tools/exec-approvals)
## Mehrere Konten
## Multi-Account
```json5
{
@ -921,21 +922,21 @@ Verwandte Dokumentation: [Exec approvals](/de/tools/exec-approvals)
```
Werte auf oberster Ebene unter `channels.matrix` dienen als Standardwerte für benannte Konten, sofern ein Konto sie nicht überschreibt.
Du kannst geerbte Raumeinträge mit `groups.<room>.account` auf ein bestimmtes Matrix-Konto beschränken.
Einträge ohne `account` bleiben für alle Matrix-Konten gemeinsam, und Einträge mit `account: "default"` funktionieren weiterhin, wenn das Standardkonto direkt auf oberster Ebene unter `channels.matrix.*` konfiguriert ist.
Teilweise gemeinsam genutzte Authentifizierungs-Standardwerte erzeugen für sich genommen kein separates implizites Standardkonto. OpenClaw synthetisiert das oberste Konto `default` nur dann, wenn dieses Standardkonto aktuelle Authentifizierung hat (`homeserver` plus `accessToken` oder `homeserver` plus `userId` und `password`); benannte Konten können weiterhin auffindbar bleiben, wenn `homeserver` plus `userId` später durch zwischengespeicherte Anmeldedaten zur Authentifizierung ausreichen.
Wenn Matrix bereits genau ein benanntes Konto hat oder `defaultAccount` auf einen vorhandenen Schlüssel eines benannten Kontos verweist, bewahrt die Reparatur-/Einrichtungs-Hochstufung von Einzelkonto zu Mehrkonten dieses Konto, anstatt einen neuen `accounts.default`-Eintrag zu erstellen. Nur Matrix-Authentifizierungs-/Bootstrap-Schlüssel werden in dieses hochgestufte Konto verschoben; gemeinsam genutzte Zustellungsrichtlinien-Schlüssel bleiben auf oberster Ebene.
Setze `defaultAccount`, wenn OpenClaw für implizites Routing, Probing und CLI-Operationen ein benanntes Matrix-Konto bevorzugen soll.
Du kannst geerbte Raumeinträge mit `groups.<room>.account` auf ein einzelnes Matrix-Konto begrenzen.
Einträge ohne `account` bleiben über alle Matrix-Konten hinweg gemeinsam genutzt, und Einträge mit `account: "default"` funktionieren weiterhin, wenn das Standardkonto direkt auf oberster Ebene unter `channels.matrix.*` konfiguriert ist.
Partielle gemeinsame Auth-Standardwerte erzeugen für sich genommen kein separates implizites Standardkonto. OpenClaw synthetisiert das Standardkonto auf oberster Ebene `default` nur dann, wenn dieses Standardkonto aktuelle Auth-Daten hat (`homeserver` plus `accessToken` oder `homeserver` plus `userId` und `password`); benannte Konten können weiterhin über `homeserver` plus `userId` erkennbar bleiben, wenn zwischengespeicherte Anmeldedaten die Authentifizierung später erfüllen.
Wenn Matrix bereits genau ein benanntes Konto hat oder `defaultAccount` auf einen vorhandenen benannten Kontoschlüssel zeigt, bewahrt die Reparatur-/Einrichtungs-Hochstufung von Einzelkonto zu Multi-Account dieses Konto, anstatt einen neuen `accounts.default`-Eintrag zu erstellen. Nur Matrix-Authentifizierungs-/Bootstrap-Schlüssel werden in dieses hochgestufte Konto verschoben; gemeinsame Zustellungsrichtlinien-Schlüssel bleiben auf oberster Ebene.
Setze `defaultAccount`, wenn OpenClaw ein benanntes Matrix-Konto für implizites Routing, Sondierung und CLI-Operationen bevorzugen soll.
Wenn mehrere Matrix-Konten konfiguriert sind und eine Konto-ID `default` ist, verwendet OpenClaw dieses Konto implizit, auch wenn `defaultAccount` nicht gesetzt ist.
Wenn du mehrere benannte Konten konfigurierst, setze `defaultAccount` oder übergib `--account <id>` für CLI-Befehle, die auf impliziter Kontoauswahl basieren.
Wenn du mehrere benannte Konten konfigurierst, setze `defaultAccount` oder übergib `--account <id>` für CLI-Befehle, die auf impliziter Kontoauswahl beruhen.
Übergib `--account <id>` an `openclaw matrix verify ...` und `openclaw matrix devices ...`, wenn du diese implizite Auswahl für einen einzelnen Befehl überschreiben möchtest.
Siehe [Configuration reference](/de/gateway/configuration-reference#multi-account-all-channels) für das gemeinsame Muster für mehrere Konten.
Siehe [Configuration reference](/de/gateway/configuration-reference#multi-account-all-channels) für das gemeinsame Multi-Account-Muster.
## Private/LAN-Homeserver
Standardmäßig blockiert OpenClaw private/interne Matrix-Homeserver zum Schutz vor SSRF, sofern du
nicht explizit pro Konto zustimmst.
Standardmäßig blockiert OpenClaw private/interne Matrix-Homeserver zum SSRF-Schutz, sofern du
nicht explizit pro Konto optierst.
Wenn dein Homeserver auf localhost, einer LAN-/Tailscale-IP oder einem internen Hostnamen läuft, aktiviere
`network.dangerouslyAllowPrivateNetwork` für dieses Matrix-Konto:
@ -964,10 +965,10 @@ openclaw matrix account add \
--access-token syt_ops_xxx
```
Diese Zustimmung erlaubt nur vertrauenswürdige private/interne Ziele. Öffentliche Homeserver im Klartext wie
Dieses Opt-in erlaubt nur vertrauenswürdige private/interne Ziele. Öffentliche unverschlüsselte Homeserver wie
`http://matrix.example.org:8008` bleiben blockiert. Bevorzuge nach Möglichkeit `https://`.
## Matrix-Datenverkehr über einen Proxy leiten
## Matrix-Verkehr über einen Proxy leiten
Wenn deine Matrix-Bereitstellung einen expliziten ausgehenden HTTP(S)-Proxy benötigt, setze `channels.matrix.proxy`:
@ -984,11 +985,11 @@ Wenn deine Matrix-Bereitstellung einen expliziten ausgehenden HTTP(S)-Proxy ben
```
Benannte Konten können den Standardwert auf oberster Ebene mit `channels.matrix.accounts.<id>.proxy` überschreiben.
OpenClaw verwendet dieselbe Proxy-Einstellung für Matrix-Laufzeitdatenverkehr und Prüfungen des Kontostatus.
OpenClaw verwendet dieselbe Proxy-Einstellung für Laufzeit-Matrix-Verkehr und Konto-Status-Sondierungen.
## Zielauflösung
Matrix akzeptiert überall dort diese Zielformen, wo OpenClaw nach einem Raum- oder Benutzerziel fragt:
Matrix akzeptiert diese Zielformen überall dort, wo OpenClaw nach einem Raum- oder Benutzerziel fragt:
- Benutzer: `@user:server`, `user:@user:server` oder `matrix:user:@user:server`
- Räume: `!room:server`, `room:!room:server` oder `matrix:room:!room:server`
@ -997,72 +998,72 @@ Matrix akzeptiert überall dort diese Zielformen, wo OpenClaw nach einem Raum- o
Die Live-Verzeichnissuche verwendet das angemeldete Matrix-Konto:
- Benutzersuchen fragen das Matrix-Benutzerverzeichnis auf diesem Homeserver ab.
- Raumsuchen akzeptieren explizite Raum-IDs und Aliasse direkt und greifen dann auf die Suche in beigetretenen Raumnamen für dieses Konto zurück.
- Die Suche nach Namen beigetretener Räume erfolgt nach bestem Bemühen. Wenn ein Raumname nicht zu einer ID oder einem Alias aufgelöst werden kann, wird er bei der Laufzeit-Auflösung von Allowlists ignoriert.
- Raumsuchen akzeptieren explizite Raum-IDs und Aliasse direkt und fallen dann auf die Suche nach beigetretenen Raumnamen für dieses Konto zurück.
- Die Suche nach Namen beigetretener Räume erfolgt nach bestem Bemühen. Wenn ein Raumname nicht zu einer ID oder einem Alias aufgelöst werden kann, wird er bei der Laufzeit-Allowlist-Auflösung ignoriert.
## Konfigurationsreferenz
- `enabled`: den Kanal aktivieren oder deaktivieren.
- `enabled`: den Channel aktivieren oder deaktivieren.
- `name`: optionales Label für das Konto.
- `defaultAccount`: bevorzugte Konto-ID, wenn mehrere Matrix-Konten konfiguriert sind.
- `homeserver`: Homeserver-URL, zum Beispiel `https://matrix.example.org`.
- `network.dangerouslyAllowPrivateNetwork`: diesem Matrix-Konto erlauben, sich mit privaten/internen Homeservern zu verbinden. Aktiviere dies, wenn der Homeserver zu `localhost`, einer LAN-/Tailscale-IP oder einem internen Host wie `matrix-synapse` aufgelöst wird.
- `proxy`: optionale HTTP(S)-Proxy-URL für Matrix-Datenverkehr. Benannte Konten können den Standardwert auf oberster Ebene mit ihrem eigenen `proxy` überschreiben.
- `network.dangerouslyAllowPrivateNetwork`: erlaubt diesem Matrix-Konto, sich mit privaten/internen Homeservern zu verbinden. Aktiviere dies, wenn der Homeserver zu `localhost`, einer LAN-/Tailscale-IP oder einem internen Host wie `matrix-synapse` aufgelöst wird.
- `proxy`: optionale HTTP(S)-Proxy-URL für Matrix-Verkehr. Benannte Konten können den Standardwert auf oberster Ebene mit ihrem eigenen `proxy` überschreiben.
- `userId`: vollständige Matrix-Benutzer-ID, zum Beispiel `@bot:example.org`.
- `accessToken`: Access Token für tokenbasierte Authentifizierung. Klartextwerte und SecretRef-Werte werden für `channels.matrix.accessToken` und `channels.matrix.accounts.<id>.accessToken` über env-/file-/exec-Provider unterstützt. Siehe [Secrets Management](/de/gateway/secrets).
- `password`: Passwort für passwortbasierte Anmeldung. Klartextwerte und SecretRef-Werte werden unterstützt.
- `deviceId`: explizite Matrix-Geräte-ID.
- `deviceName`: Anzeigename des Geräts für die Passwortanmeldung.
- `avatarUrl`: gespeicherte Self-Avatar-URL für Profilsynchronisierung und Aktualisierungen über `profile set`.
- `initialSyncLimit`: maximale Anzahl an Ereignissen, die während der Startsynchronisierung abgerufen werden.
- `deviceName`: Anzeigename des Geräts für Passwort-Login.
- `avatarUrl`: gespeicherte Selbst-Avatar-URL für Profilsynchronisierung und `profile set`-Aktualisierungen.
- `initialSyncLimit`: maximale Anzahl von Ereignissen, die während der Start-Synchronisierung abgerufen werden.
- `encryption`: E2EE aktivieren.
- `allowlistOnly`: wenn `true`, wird die Raumrichtlinie `open` auf `allowlist` hochgestuft und alle aktiven DM-Richtlinien außer `disabled` (einschließlich `pairing` und `open`) werden auf `allowlist` erzwungen. Hat keinen Einfluss auf `disabled`-Richtlinien.
- `allowBots`: Nachrichten von anderen konfigurierten OpenClaw-Matrix-Konten zulassen (`true` oder `"mentions"`).
- `allowlistOnly`: wenn `true`, wird die Raumrichtlinie `open` auf `allowlist` hochgestuft und alle aktiven DM-Richtlinien außer `disabled` (einschließlich `pairing` und `open`) werden zu `allowlist` gezwungen. Wirkt sich nicht auf `disabled`-Richtlinien aus.
- `allowBots`: Nachrichten von anderen konfigurierten OpenClaw-Matrix-Konten erlauben (`true` oder `"mentions"`).
- `groupPolicy`: `open`, `allowlist` oder `disabled`.
- `contextVisibility`: Sichtbarkeitsmodus für ergänzenden Raumkontext (`all`, `allowlist`, `allowlist_quote`).
- `groupAllowFrom`: Allowlist von Benutzer-IDs für Raumdatenverkehr. Einträge sollten vollständige Matrix-Benutzer-IDs sein; nicht aufgelöste Namen werden zur Laufzeit ignoriert.
- `historyLimit`: maximale Anzahl an Raumnachrichten, die als Verlaufskontext für Gruppen einbezogen werden. Fällt auf `messages.groupChat.historyLimit` zurück; wenn beide nicht gesetzt sind, ist der effektive Standardwert `0`. Setze `0`, um dies zu deaktivieren.
- `groupAllowFrom`: Allowlist von Benutzer-IDs für Raumverkehr. Einträge sollten vollständige Matrix-Benutzer-IDs sein; nicht aufgelöste Namen werden zur Laufzeit ignoriert.
- `historyLimit`: maximale Anzahl von Raumnachrichten, die als Gruppenverlaufs-Kontext einbezogen werden. Fällt auf `messages.groupChat.historyLimit` zurück; wenn beide nicht gesetzt sind, ist der effektive Standardwert `0`. Setze `0`, um dies zu deaktivieren.
- `replyToMode`: `off`, `first`, `all` oder `batched`.
- `markdown`: optionale Markdown-Rendering-Konfiguration für ausgehenden Matrix-Text.
- `streaming`: `off` (Standard), `"partial"`, `"quiet"`, `true` oder `false`. `"partial"` und `true` aktivieren Vorschau-zuerst-Entwurfsaktualisierungen mit normalen Matrix-Textnachrichten. `"quiet"` verwendet nicht benachrichtigende Vorschau-Hinweise für selbstgehostete Push-Regel-Setups. `false` ist gleichbedeutend mit `"off"`.
- `blockStreaming`: `true` aktiviert separate Fortschrittsnachrichten für abgeschlossene Assistant-Blöcke, während das Streaming von Entwurfsvorschauen aktiv ist.
- `streaming`: `off` (Standard), `"partial"`, `"quiet"`, `true` oder `false`. `"partial"` und `true` aktivieren Vorschau-zuerst-Entwurfsaktualisierungen mit normalen Matrix-Textnachrichten. `"quiet"` verwendet nicht benachrichtigende Vorschauhinweise für selbstgehostete Push-Regel-Setups. `false` entspricht `"off"`.
- `blockStreaming`: `true` aktiviert separate Fortschrittsnachrichten für abgeschlossene Assistentenblöcke, während Entwurfsvorschau-Streaming aktiv ist.
- `threadReplies`: `off`, `inbound` oder `always`.
- `threadBindings`: kanalbezogene Überschreibungen für threadgebundenes Sitzungsrouting und dessen Lebenszyklus.
- `startupVerification`: automatischer Modus für Selbstverifizierungsanfragen beim Start (`if-unverified`, `off`).
- `startupVerificationCooldownHours`: Abkühlzeit vor dem erneuten Versuch automatischer Selbstverifizierungsanfragen beim Start.
- `textChunkLimit`: Chunk-Größe für ausgehende Nachrichten in Zeichen (gilt, wenn `chunkMode` auf `length` gesetzt ist).
- `chunkMode`: `length` teilt Nachrichten nach Zeichenanzahl; `newline` teilt an Zeilengrenzen.
- `responsePrefix`: optionale Zeichenfolge, die allen ausgehenden Antworten für diesen Kanal vorangestellt wird.
- `ackReaction`: optionale Überschreibung der Bestätigungsreaktion für diesen Kanal/dieses Konto.
- `ackReactionScope`: optionale Überschreibung des Geltungsbereichs der Bestätigungsreaktion (`group-mentions`, `group-all`, `direct`, `all`, `none`, `off`).
- `threadBindings`: kanalbezogene Overrides für threadgebundenes Sitzungsrouting und Lebenszyklus.
- `startupVerification`: Modus für automatische Selbstverifizierungsanforderungen beim Start (`if-unverified`, `off`).
- `startupVerificationCooldownHours`: Abklingzeit vor einem erneuten Versuch automatischer Start-Verifizierungsanforderungen.
- `textChunkLimit`: Größe ausgehender Nachrichten-Chunks in Zeichen (gilt, wenn `chunkMode` `length` ist).
- `chunkMode`: `length` teilt Nachrichten nach Zeichenzahl; `newline` teilt an Zeilengrenzen.
- `responsePrefix`: optionale Zeichenfolge, die allen ausgehenden Antworten für diesen Channel vorangestellt wird.
- `ackReaction`: optionaler Override für Bestätigungsreaktionen für diesen Channel/dieses Konto.
- `ackReactionScope`: optionaler Override für den Geltungsbereich von Bestätigungsreaktionen (`group-mentions`, `group-all`, `direct`, `all`, `none`, `off`).
- `reactionNotifications`: Modus für eingehende Reaktionsbenachrichtigungen (`own`, `off`).
- `mediaMaxMb`: Obergrenze für Mediengröße in MB für ausgehende Sendungen und eingehende Medienverarbeitung.
- `autoJoin`: Richtlinie für automatisches Beitreten bei Einladungen (`always`, `allowlist`, `off`). Standard: `off`. Gilt für alle Matrix-Einladungen, einschließlich DM-artiger Einladungen.
- `autoJoinAllowlist`: Räume/Aliasse, die erlaubt sind, wenn `autoJoin` auf `allowlist` gesetzt ist. Alias-Einträge werden während der Einladungsverarbeitung in Raum-IDs aufgelöst; OpenClaw vertraut nicht auf Alias-Zustände, die vom eingeladenen Raum behauptet werden.
- `mediaMaxMb`: Größenlimit für Medien in MB für ausgehende Sendungen und eingehende Medienverarbeitung.
- `autoJoin`: Richtlinie für automatisches Beitreten zu Einladungen (`always`, `allowlist`, `off`). Standard: `off`. Gilt für alle Matrix-Einladungen, einschließlich DM-ähnlicher Einladungen.
- `autoJoinAllowlist`: Räume/Aliasse, die erlaubt sind, wenn `autoJoin` auf `allowlist` gesetzt ist. Alias-Einträge werden während der Einladungsverarbeitung zu Raum-IDs aufgelöst; OpenClaw vertraut keinem Alias-Status, den der eingeladene Raum behauptet.
- `dm`: DM-Richtlinienblock (`enabled`, `policy`, `allowFrom`, `sessionScope`, `threadReplies`).
- `dm.policy`: steuert den DM-Zugriff, nachdem OpenClaw dem Raum beigetreten ist und ihn als DM klassifiziert hat. Dies ändert nicht, ob einer Einladung automatisch beigetreten wird.
- `dm.allowFrom`: Einträge sollten vollständige Matrix-Benutzer-IDs sein, außer du hast sie bereits über eine Live-Verzeichnissuche aufgelöst.
- `dm.sessionScope`: `per-user` (Standard) oder `per-room`. Verwende `per-room`, wenn jeder Matrix-DM-Raum einen getrennten Kontext behalten soll, auch wenn das Gegenüber gleich ist.
- `dm.threadReplies`: Überschreibung der Thread-Richtlinie nur für DMs (`off`, `inbound`, `always`). Überschreibt die Einstellung `threadReplies` auf oberster Ebene sowohl für die Platzierung von Antworten als auch für die Sitzungsisolation in DMs.
- `dm.policy`: steuert den DM-Zugriff, nachdem OpenClaw dem Raum beigetreten ist und ihn als DM klassifiziert hat. Ändert nicht, ob einer Einladung automatisch beigetreten wird.
- `dm.allowFrom`: Einträge sollten vollständige Matrix-Benutzer-IDs sein, es sei denn, du hast sie bereits über die Live-Verzeichnissuche aufgelöst.
- `dm.sessionScope`: `per-user` (Standard) oder `per-room`. Verwende `per-room`, wenn du möchtest, dass jeder Matrix-DM-Raum einen getrennten Kontext behält, selbst wenn der Peer derselbe ist.
- `dm.threadReplies`: DM-spezifischer Override für Thread-Richtlinien (`off`, `inbound`, `always`). Überschreibt die Einstellung `threadReplies` auf oberster Ebene sowohl für die Platzierung von Antworten als auch für die Sitzungsisolierung in DMs.
- `execApprovals`: Matrix-native Zustellung von Exec-Genehmigungen (`enabled`, `approvers`, `target`, `agentFilter`, `sessionFilter`).
- `execApprovals.approvers`: Matrix-Benutzer-IDs, die Exec-Anfragen genehmigen dürfen. Optional, wenn `dm.allowFrom` die genehmigenden Personen bereits identifiziert.
- `execApprovals.approvers`: Matrix-Benutzer-IDs, die Exec-Anfragen genehmigen dürfen. Optional, wenn `dm.allowFrom` die Genehmiger bereits identifiziert.
- `execApprovals.target`: `dm | channel | both` (Standard: `dm`).
- `accounts`: benannte kontobezogene Überschreibungen. Werte auf oberster Ebene unter `channels.matrix` dienen als Standardwerte für diese Einträge.
- `groups`: richtlinienbezogene Zuordnung pro Raum. Bevorzuge Raum-IDs oder Aliasse; nicht aufgelöste Raumnamen werden zur Laufzeit ignoriert. Sitzungs-/Gruppenidentität verwendet nach der Auflösung die stabile Raum-ID.
- `groups.<room>.account`: beschränkt einen geerbten Raumeintrag in Setups mit mehreren Konten auf ein bestimmtes Matrix-Konto.
- `groups.<room>.allowBots`: Überschreibung auf Raumebene für von konfigurierten Bots gesendete Nachrichten (`true` oder `"mentions"`).
- `accounts`: benannte kontoabhängige Overrides. Werte auf oberster Ebene unter `channels.matrix` dienen als Standardwerte für diese Einträge.
- `groups`: raumbezogene Richtlinienzuordnung. Bevorzuge Raum-IDs oder Aliasse; nicht aufgelöste Raumnamen werden zur Laufzeit ignoriert. Sitzungs-/Gruppenidentität verwendet nach der Auflösung die stabile Raum-ID.
- `groups.<room>.account`: beschränkt einen geerbten Raumeintrag in Multi-Account-Setups auf ein bestimmtes Matrix-Konto.
- `groups.<room>.allowBots`: raumbezogener Override für Absender aus konfigurierten Bots (`true` oder `"mentions"`).
- `groups.<room>.users`: absenderbezogene Allowlist pro Raum.
- `groups.<room>.tools`: Überschreibungen zum Zulassen/Ablehnen von Tools pro Raum.
- `groups.<room>.autoReply`: Überschreibung des Erwähnungsgatings auf Raumebene. `true` deaktiviert Erwähnungsanforderungen für diesen Raum; `false` erzwingt sie wieder.
- `groups.<room>.skills`: optionaler Skills-Filter auf Raumebene.
- `groups.<room>.systemPrompt`: optionales Snippet für den System Prompt auf Raumebene.
- `rooms`: veralteter Alias für `groups`.
- `groups.<room>.tools`: raumbezogene Tool-Allow-/Deny-Overrides.
- `groups.<room>.autoReply`: raumbezogener Override für Erwähnungs-Gating. `true` deaktiviert Erwähnungspflichten für diesen Raum; `false` erzwingt sie wieder.
- `groups.<room>.skills`: optionaler raumbezogener Skills-Filter.
- `groups.<room>.systemPrompt`: optionaler raumbezogener System-Prompt-Ausschnitt.
- `rooms`: Legacy-Alias für `groups`.
- `actions`: Tool-Gating pro Aktion (`messages`, `reactions`, `pins`, `profile`, `memberInfo`, `channelInfo`, `verification`).
## Verwandt
- [Channels Overview](/de/channels) — alle unterstützten Kanäle
- [Channels Overview](/de/channels) — alle unterstützten Channels
- [Pairing](/de/channels/pairing) — DM-Authentifizierung und Pairing-Ablauf
- [Groups](/de/channels/groups) — Verhalten in Gruppenchats und Erwähnungsgating
- [Groups](/de/channels/groups) — Verhalten in Gruppenchats und Erwähnungs-Gating
- [Channel Routing](/de/channels/channel-routing) — Sitzungsrouting für Nachrichten
- [Security](/de/gateway/security) — Zugriffsmodell und Härtung

View File

@ -1,106 +1,101 @@
---
read_when:
- Bearbeiten von Systemprompt-Text, Tool-Liste oder Zeit-/Heartbeat-Abschnitten
- Bearbeiten von Systemaufforderungstext, Werkzeugliste oder Zeit-/Heartbeat-Abschnitten
- Ändern des Workspace-Bootstraps oder des Verhaltens bei der Skills-Injektion
summary: Was der OpenClaw-Systemprompt enthält und wie er zusammengesetzt wird
title: Systemprompt
summary: Was die OpenClaw-Systemaufforderung enthält und wie sie zusammengestellt wird
title: Systemaufforderung
x-i18n:
generated_at: "2026-04-12T06:16:42Z"
generated_at: "2026-04-15T19:41:36Z"
model: gpt-5.4
provider: openai
source_hash: 057f01aac51f7737b5223f61f5d55e552d9011232aebb130426e269d8f6c257f
source_hash: c740e4646bc4980567338237bfb55126af0df72499ca00a48e4848d9a3608ab4
source_path: concepts/system-prompt.md
workflow: 15
---
# Systemprompt
# Systemaufforderung
OpenClaw erstellt für jeden Agentenlauf einen benutzerdefinierten Systemprompt. Der Prompt ist **OpenClaw-eigen** und verwendet nicht den Standardprompt von pi-coding-agent.
OpenClaw erstellt für jeden Agentenlauf eine benutzerdefinierte Systemaufforderung. Die Aufforderung wird **von OpenClaw verwaltet** und verwendet nicht die Standardaufforderung von pi-coding-agent.
Der Prompt wird von OpenClaw zusammengestellt und in jeden Agentenlauf injiziert.
Die Aufforderung wird von OpenClaw zusammengestellt und in jeden Agentenlauf eingefügt.
Provider-Plugins können cachefähige Prompt-Hinweise beisteuern, ohne den
vollständigen OpenClaw-eigenen Prompt zu ersetzen. Die Provider-Laufzeit kann:
Provider-Plugins können cache-fähige Prompt-Hinweise beisteuern, ohne die
vollständige von OpenClaw verwaltete Aufforderung zu ersetzen. Die Provider-Laufzeit kann:
- eine kleine Menge benannter Kernabschnitte ersetzen (`interaction_style`,
`tool_call_style`, `execution_bias`)
- ein **stabiles Präfix** oberhalb der Prompt-Cache-Grenze injizieren
- ein **dynamisches Suffix** unterhalb der Prompt-Cache-Grenze injizieren
- ein **stabiles Präfix** oberhalb der Prompt-Cache-Grenze einfügen
- ein **dynamisches Suffix** unterhalb der Prompt-Cache-Grenze einfügen
Verwende provider-eigene Beiträge für modellspezifische Abstimmung nach
Modellfamilie. Behalte die ältere Prompt-Mutation per
`before_prompt_build` für Kompatibilität oder wirklich globale
Prompt-Änderungen bei, nicht für normales Provider-Verhalten.
Verwenden Sie provider-eigene Beiträge für modellfamilien-spezifische Abstimmung. Behalten Sie die veraltete
`before_prompt_build`-Prompt-Mutation für Kompatibilität oder wirklich globale Prompt-Änderungen bei,
nicht für normales Provider-Verhalten.
## Struktur
Der Prompt ist absichtlich kompakt und verwendet feste Abschnitte:
Die Aufforderung ist bewusst kompakt und verwendet feste Abschnitte:
- **Tooling**: Erinnerung an die strukturierte Tool-Quelle der Wahrheit sowie Hinweise zur Tool-Nutzung zur Laufzeit.
- **Safety**: kurze Guardrail-Erinnerung, um machtsuchendes Verhalten oder das Umgehen von Aufsicht zu vermeiden.
- **Skills** (wenn verfügbar): erklärt dem Modell, wie Skill-Anweisungen bei Bedarf geladen werden.
- **OpenClaw Self-Update**: wie die Konfiguration sicher mit
`config.schema.lookup` geprüft, mit `config.patch` gepatcht, die vollständige
Konfiguration mit `config.apply` ersetzt und `update.run` nur auf
ausdrücklichen Benutzerwunsch ausgeführt wird. Das nur für Owner verfügbare
`gateway`-Tool verweigert außerdem das Umschreiben von
`tools.exec.ask` / `tools.exec.security`, einschließlich älterer
`tools.bash.*`-Aliase, die auf diese geschützten Exec-Pfade normalisiert werden.
- **Tooling**: Erinnerung an die Quelle der Wahrheit für strukturierte Tools plus Laufzeithinweise zur Tool-Nutzung.
- **Safety**: kurze Guardrail-Erinnerung, um machtsuchendes Verhalten oder die Umgehung von Aufsicht zu vermeiden.
- **Skills** (wenn verfügbar): erklärt dem Modell, wie es Skill-Anweisungen bei Bedarf lädt.
- **OpenClaw Self-Update**: wie Konfiguration sicher mit
`config.schema.lookup` geprüft, Konfiguration mit `config.patch` gepatcht, die vollständige
Konfiguration mit `config.apply` ersetzt und `update.run` nur auf ausdrückliche
Benutzeranfrage ausgeführt wird. Das ausschließlich für Eigentümer verfügbare `gateway`-Tool verweigert auch das Umschreiben von
`tools.exec.ask` / `tools.exec.security`, einschließlich veralteter `tools.bash.*`-
Aliasse, die zu diesen geschützten Exec-Pfaden normalisiert werden.
- **Workspace**: Arbeitsverzeichnis (`agents.defaults.workspace`).
- **Documentation**: lokaler Pfad zur OpenClaw-Dokumentation (Repository oder npm-Paket) und wann sie gelesen werden sollte.
- **Workspace Files (injected)**: zeigt an, dass Bootstrap-Dateien unten eingefügt sind.
- **Sandbox** (wenn aktiviert): zeigt eine sandboxed Laufzeit, Sandbox-Pfade und ob erhöhtes `exec` verfügbar ist.
- **Sandbox** (wenn aktiviert): zeigt die sandboxed Laufzeit, Sandbox-Pfade und ob erhöhte Exec-Rechte verfügbar sind.
- **Current Date & Time**: benutzerlokale Zeit, Zeitzone und Zeitformat.
- **Reply Tags**: optionale Reply-Tag-Syntax für unterstützte Provider.
- **Heartbeats**: Heartbeat-Prompt und Bestätigungsverhalten, wenn Heartbeats für den Standardagenten aktiviert sind.
- **Runtime**: Host, Betriebssystem, Node, Modell, Repo-Root (wenn erkannt), Thinking-Level (eine Zeile).
- **Reasoning**: aktuelle Sichtbarkeitsebene + Hinweis auf den Schalter `/reasoning`.
- **Heartbeats**: Heartbeat-Aufforderung und Bestätigungsverhalten, wenn Heartbeats für den Standardagenten aktiviert sind.
- **Runtime**: Host, Betriebssystem, Node, Modell, Repository-Wurzel (wenn erkannt), Denkstufe (eine Zeile).
- **Reasoning**: aktuelle Sichtbarkeitsstufe + Hinweis auf Umschaltung mit /reasoning.
Der Abschnitt Tooling enthält außerdem Laufzeithinweise für lang laufende Arbeit:
- verwende `cron` für spätere Nachverfolgung (`check back later`, Erinnerungen, wiederkehrende Arbeit)
statt `exec`-Sleep-Schleifen, `yieldMs`-Verzögerungstricks oder wiederholtem
`process`-Polling
- verwende `exec` / `process` nur für Befehle, die jetzt starten und im
- verwenden Sie Cron für spätere Nachverfolgung (`check back later`, Erinnerungen, wiederkehrende Arbeit)
statt `exec`-Sleep-Schleifen, `yieldMs`-Verzögerungstricks oder wiederholtem `process`-
Polling
- verwenden Sie `exec` / `process` nur für Befehle, die jetzt starten und im
Hintergrund weiterlaufen
- wenn automatisches Aufwecken bei Abschluss aktiviert ist, starte den Befehl
einmal und verlasse dich auf den pushbasierten Aufweckpfad, wenn er Ausgabe
erzeugt oder fehlschlägt
- verwende `process` für Logs, Status, Eingaben oder Eingriffe, wenn du einen
laufenden Befehl prüfen musst
- wenn die Aufgabe größer ist, bevorzuge `sessions_spawn`; der Abschluss von
Sub-Agenten ist pushbasiert und wird dem Anfragenden automatisch angekündigt
- frage nicht in einer Schleife `subagents list` / `sessions_list` ab, nur um
auf den Abschluss zu warten
- wenn automatisches Abschluss-Aufwecken aktiviert ist, starten Sie den Befehl einmal und verlassen Sie sich auf
den push-basierten Aufweckpfad, wenn er Ausgabe erzeugt oder fehlschlägt
- verwenden Sie `process` für Protokolle, Status, Eingaben oder Eingriffe, wenn Sie
einen laufenden Befehl prüfen müssen
- wenn die Aufgabe größer ist, bevorzugen Sie `sessions_spawn`; der Abschluss von Sub-Agenten ist
push-basiert und wird automatisch an den Anfragenden zurückgemeldet
- pollen Sie `subagents list` / `sessions_list` nicht in einer Schleife, nur um auf
den Abschluss zu warten
Wenn das experimentelle Tool `update_plan` aktiviert ist, weist Tooling das
Modell außerdem an, es nur für nicht triviale mehrstufige Arbeit zu verwenden,
genau einen Schritt als `in_progress` zu halten und nicht nach jedem Update den
gesamten Plan zu wiederholen.
Modell außerdem an, es nur für nicht triviale mehrstufige Arbeit zu verwenden, genau einen
Schritt mit `in_progress` beizubehalten und nicht nach jeder Aktualisierung den gesamten Plan zu wiederholen.
Safety-Guardrails im Systemprompt sind beratend. Sie lenken das Modellverhalten, setzen aber keine Richtlinien durch. Verwende Tool-Richtlinien, Exec-Genehmigungen, Sandboxing und Channel-Allowlists für harte Durchsetzung; Operatoren können diese absichtlich deaktivieren.
Safety-Guardrails in der Systemaufforderung sind hinweisend. Sie leiten das Modellverhalten an, erzwingen aber keine Richtlinie. Verwenden Sie Tool-Richtlinien, Exec-Genehmigungen, Sandboxing und Kanal-Allowlists für harte Durchsetzung; Betreiber können diese absichtlich deaktivieren.
Auf Channels mit nativen Genehmigungskarten/-schaltflächen weist der Laufzeitprompt den
Agenten jetzt an, sich zuerst auf diese native Genehmigungs-UI zu verlassen. Er
sollte einen manuellen Befehl `/approve` nur dann einfügen, wenn das
Tool-Ergebnis angibt, dass Chat-Genehmigungen nicht verfügbar sind oder eine
Auf Kanälen mit nativen Genehmigungskarten/-schaltflächen weist die Laufzeitaufforderung den
Agenten jetzt an, sich zuerst auf diese native Genehmigungs-UI zu verlassen. Sie sollte nur einen manuellen
`/approve`-Befehl enthalten, wenn das Tool-Ergebnis angibt, dass Chat-Genehmigungen nicht verfügbar sind oder
manuelle Genehmigung der einzige Weg ist.
## Prompt-Modi
OpenClaw kann kleinere Systemprompts für Sub-Agenten rendern. Die Laufzeit setzt
für jeden Lauf einen `promptMode` (keine benutzerseitige Konfiguration):
OpenClaw kann kleinere Systemaufforderungen für Sub-Agenten rendern. Die Laufzeit setzt für jeden Lauf einen
`promptMode` (keine benutzerseitige Konfiguration):
- `full` (Standard): enthält alle obigen Abschnitte.
- `minimal`: wird für Sub-Agenten verwendet; lässt **Skills**, **Memory Recall**, **OpenClaw
Self-Update**, **Model Aliases**, **User Identity**, **Reply Tags**,
**Messaging**, **Silent Replies** und **Heartbeats** weg. Tooling, **Safety**,
Workspace, Sandbox, Current Date & Time (wenn bekannt), Runtime und injizierter
Workspace, Sandbox, Current Date & Time (wenn bekannt), Runtime und eingefügter
Kontext bleiben verfügbar.
- `none`: gibt nur die grundlegende Identitätszeile zurück.
- `none`: gibt nur die Zeile mit der Basisidentität zurück.
Wenn `promptMode=minimal` gilt, werden zusätzlich injizierte Prompts als **Subagent
Context** statt als **Group Chat Context** bezeichnet.
Wenn `promptMode=minimal`, werden zusätzlich eingefügte Prompts als **Subagent
Context** statt als **Group Chat Context** beschriftet.
## Workspace-Bootstrap-Injektion
@ -113,52 +108,50 @@ Bootstrap-Dateien werden gekürzt und unter **Project Context** angehängt, dami
- `USER.md`
- `HEARTBEAT.md`
- `BOOTSTRAP.md` (nur in brandneuen Workspaces)
- `MEMORY.md`, wenn vorhanden, andernfalls `memory.md` als Fallback in Kleinschreibung
- `MEMORY.md`, wenn vorhanden, andernfalls `memory.md` als Fallback in Kleinbuchstaben
Alle diese Dateien werden bei jedem Turn **in das Kontextfenster injiziert**, sofern
keine dateispezifische Bedingung greift. `HEARTBEAT.md` wird bei normalen Läufen
weggelassen, wenn Heartbeats für den Standardagenten deaktiviert sind oder
`agents.defaults.heartbeat.includeSystemPromptSection` false ist. Halte injizierte
Dateien knapp insbesondere `MEMORY.md`, das mit der Zeit wachsen und zu
unerwartet hoher Kontextnutzung sowie häufigerer Kompaktierung führen kann.
Alle diese Dateien werden bei jeder Runde **in das Kontextfenster eingefügt**, sofern
keine dateispezifische Sperre gilt. `HEARTBEAT.md` wird bei normalen Läufen weggelassen, wenn
Heartbeats für den Standardagenten deaktiviert sind oder
`agents.defaults.heartbeat.includeSystemPromptSection` false ist. Halten Sie eingefügte
Dateien kurz — insbesondere `MEMORY.md`, das mit der Zeit wachsen und zu
unerwartet hoher Kontextnutzung und häufigerer Compaction führen kann.
> **Hinweis:** Tägliche Dateien `memory/*.md` sind **kein** Teil des normalen Bootstrap-
> Project Context. Bei normalen Turns wird auf sie bei Bedarf über die Tools
> `memory_search` und `memory_get` zugegriffen, sodass sie nicht gegen das
> Kontextfenster zählen, sofern das Modell sie nicht explizit liest. Bloße
> Turns mit `/new` und `/reset` sind die Ausnahme: Die Laufzeit kann aktuelle
> tägliche Memory-Dateien als einmaligen Startup-Kontextblock für diesen ersten Turn
> voranstellen.
> **Hinweis:** Tägliche Dateien in `memory/*.md` sind **nicht** Teil des normalen Bootstrap-
> Project Context. Bei gewöhnlichen Runden werden sie bei Bedarf über die
> Tools `memory_search` und `memory_get` abgerufen, sodass sie nicht gegen das
> Kontextfenster zählen, es sei denn, das Modell liest sie ausdrücklich. Reine `/new`- und
> `/reset`-Runden sind die Ausnahme: Die Laufzeit kann aktuelle tägliche Speicherinhalte
> als einmaligen Startup-Kontextblock für diese erste Runde voranstellen.
Große Dateien werden mit einem Marker gekürzt. Die maximale Größe pro Datei wird durch
`agents.defaults.bootstrapMaxChars` gesteuert (Standard: 20000). Der insgesamt
injizierte Bootstrap-Inhalt über alle Dateien hinweg ist durch
`agents.defaults.bootstrapTotalMaxChars` begrenzt
(Standard: 150000). Fehlende Dateien injizieren einen kurzen Marker für fehlende Dateien. Wenn Kürzung
auftritt, kann OpenClaw einen Warnblock in Project Context injizieren; dies wird mit
`agents.defaults.bootstrapPromptTruncationWarning` gesteuert (`off`, `once`, `always`;
Große Dateien werden mit einer Markierung gekürzt. Die maximale Größe pro Datei wird durch
`agents.defaults.bootstrapMaxChars` gesteuert (Standard: 20000). Der insgesamt eingefügte Bootstrap-
Inhalt über alle Dateien hinweg ist durch `agents.defaults.bootstrapTotalMaxChars`
begrenzt (Standard: 150000). Fehlende Dateien fügen eine kurze Markierung für fehlende Dateien ein. Wenn eine Kürzung
auftritt, kann OpenClaw einen Warnblock in Project Context einfügen; dies wird gesteuert durch
`agents.defaults.bootstrapPromptTruncationWarning` (`off`, `once`, `always`;
Standard: `once`).
Sub-Agent-Sitzungen injizieren nur `AGENTS.md` und `TOOLS.md` (andere Bootstrap-Dateien
werden herausgefiltert, um den Sub-Agent-Kontext klein zu halten).
Sub-Agenten-Sitzungen fügen nur `AGENTS.md` und `TOOLS.md` ein (andere Bootstrap-Dateien
werden herausgefiltert, um den Sub-Agenten-Kontext klein zu halten).
Interne Hooks können diesen Schritt über `agent:bootstrap` abfangen, um die
injizierten Bootstrap-Dateien zu verändern oder zu ersetzen (zum Beispiel `SOUL.md` durch eine alternative Persona auszutauschen).
Interne Hooks können diesen Schritt über `agent:bootstrap` abfangen, um
die eingefügten Bootstrap-Dateien zu verändern oder zu ersetzen (zum Beispiel `SOUL.md` gegen eine alternative Persona auszutauschen).
Wenn du den Agenten weniger generisch klingen lassen möchtest, beginne mit dem
Wenn Sie möchten, dass der Agent weniger generisch klingt, beginnen Sie mit dem
[SOUL.md Personality Guide](/de/concepts/soul).
Um zu prüfen, wie viel jede injizierte Datei beiträgt (roh vs. injiziert, Kürzung sowie Tool-Schema-Overhead), verwende `/context list` oder `/context detail`. Siehe [Context](/de/concepts/context).
Um zu prüfen, wie viel jede eingefügte Datei beiträgt (roh vs. eingefügt, Kürzung, plus Tool-Schema-Overhead), verwenden Sie `/context list` oder `/context detail`. Siehe [Context](/de/concepts/context).
## Zeitverarbeitung
## Zeitbehandlung
Der Systemprompt enthält einen eigenen Abschnitt **Current Date & Time**, wenn die
Benutzerzeitzone bekannt ist. Um den Prompt cache-stabil zu halten, enthält er
jetzt nur noch die **Zeitzone** (keine dynamische Uhrzeit und kein Zeitformat).
Die Systemaufforderung enthält einen eigenen Abschnitt **Current Date & Time**, wenn die
Benutzerzeitzone bekannt ist. Um den Prompt cache-stabil zu halten, enthält sie jetzt nur noch die
**Zeitzone** (keine dynamische Uhrzeit oder Zeitformat).
Verwende `session_status`, wenn der Agent die aktuelle Zeit benötigt; die
Statuskarte enthält eine Zeitstempelzeile. Dasselbe Tool kann optional auch ein
modellspezifisches Override pro Sitzung setzen (`model=default` entfernt es).
Verwenden Sie `session_status`, wenn der Agent die aktuelle Uhrzeit benötigt; die Statuskarte
enthält eine Zeitstempelzeile. Dasselbe Tool kann optional eine Modellüberschreibung pro Sitzung
setzen (`model=default` löscht sie).
Konfiguration mit:
@ -169,14 +162,14 @@ Siehe [Date & Time](/de/date-time) für vollständige Verhaltensdetails.
## Skills
Wenn geeignete Skills vorhanden sind, injiziert OpenClaw eine kompakte **Liste verfügbarer Skills**
(`formatSkillsForPrompt`), die für jeden Skill den **Dateipfad** enthält. Der
Prompt weist das Modell an, `read` zu verwenden, um die SKILL.md am aufgeführten
Ort zu laden (Workspace, verwaltet oder gebündelt). Wenn keine geeigneten Skills
vorhanden sind, wird der Abschnitt Skills weggelassen.
Wenn infrage kommende Skills vorhanden sind, fügt OpenClaw eine kompakte **Liste verfügbarer Skills**
(`formatSkillsForPrompt`) ein, die für jeden Skill den **Dateipfad** enthält. Die
Aufforderung weist das Modell an, `read` zu verwenden, um die SKILL.md am angegebenen
Ort zu laden (Workspace, verwaltet oder gebündelt). Wenn keine infrage kommenden Skills vorhanden sind, wird der
Skills-Abschnitt weggelassen.
Zur Eignung gehören Skill-Metadaten-Bedingungen, Prüfungen der Laufzeitumgebung/-konfiguration
sowie die effektive Skill-Allowlist des Agenten, wenn `agents.defaults.skills` oder
Die Eignung umfasst Skill-Metadaten-Sperren, Laufzeitumgebungs-/Konfigurationsprüfungen
und die effektive Agenten-Skill-Allowlist, wenn `agents.defaults.skills` oder
`agents.list[].skills` konfiguriert ist.
```
@ -189,13 +182,26 @@ sowie die effektive Skill-Allowlist des Agenten, wenn `agents.defaults.skills` o
</available_skills>
```
So bleibt der Basisprompt klein und ermöglicht dennoch eine gezielte Skill-Nutzung.
Dadurch bleibt die Basisprompt klein und ermöglicht trotzdem gezielte Skill-Nutzung.
Das Budget für die Skills-Liste gehört dem Skills-Subsystem:
- Globaler Standard: `skills.limits.maxSkillsPromptChars`
- Überschreibung pro Agent: `agents.list[].skillsLimits.maxSkillsPromptChars`
Generische begrenzte Laufzeitauszüge verwenden eine andere Oberfläche:
- `agents.defaults.contextLimits.*`
- `agents.list[].contextLimits.*`
Diese Trennung hält die Größenbemessung für Skills getrennt von der Größenbemessung für Laufzeit-Lesen/Injektion,
wie etwa `memory_get`, Live-Tool-Ergebnissen und Aktualisierungen von AGENTS.md nach Compaction.
## Dokumentation
Wenn verfügbar, enthält der Systemprompt einen Abschnitt **Documentation**, der auf das
lokale OpenClaw-Dokumentationsverzeichnis verweist (entweder `docs/` im Repo-Workspace oder die gebündelte npm-
Paketdokumentation) und außerdem den öffentlichen Spiegel, das Quell-Repository, die
Community auf Discord sowie ClawHub ([https://clawhub.ai](https://clawhub.ai)) zur Entdeckung von Skills nennt. Der Prompt weist das Modell an, zuerst die lokale Dokumentation
für OpenClaw-Verhalten, Befehle, Konfiguration oder Architektur zu konsultieren und
nach Möglichkeit selbst `openclaw status` auszuführen (den Benutzer nur zu fragen, wenn kein Zugriff besteht).
Wenn verfügbar, enthält die Systemaufforderung einen Abschnitt **Documentation**, der auf das
lokale OpenClaw-Dokumentationsverzeichnis verweist (entweder `docs/` im Repository-Workspace oder die gebündelte npm-
Paketdokumentation) und außerdem den öffentlichen Mirror, das Quell-Repository, die Community-Discord und
ClawHub ([https://clawhub.ai](https://clawhub.ai)) zur Skills-Entdeckung erwähnt. Die Aufforderung weist das Modell an, zuerst lokale Dokumentation zu konsultieren
für OpenClaw-Verhalten, Befehle, Konfiguration oder Architektur, und
`openclaw status` nach Möglichkeit selbst auszuführen (den Benutzer nur zu fragen, wenn kein Zugriff besteht).

File diff suppressed because it is too large Load Diff

View File

@ -4,49 +4,48 @@ read_when:
- Sie möchten OpenClaw mit einer Messaging-Plattform verbinden.
- Sie müssen die Adapter-Oberfläche von ChannelPlugin verstehen.
sidebarTitle: Channel Plugins
summary: Schritt-für-Schritt-Anleitung zum Erstellen eines Messaging-Channel-Plugins für OpenClaw
summary: Schritt-für-Schritt-Anleitung zum Erstellen eines Messaging-Channel-Plugin für OpenClaw
title: Erstellen von Channel-Plugins
x-i18n:
generated_at: "2026-04-15T06:21:28Z"
generated_at: "2026-04-15T19:41:39Z"
model: gpt-5.4
provider: openai
source_hash: a7f4c746fe3163a8880e14c433f4db4a1475535d91716a53fb879551d8d62f65
source_hash: 80e47e61d1e47738361692522b79aff276544446c58a7b41afe5296635dfad4b
source_path: plugins/sdk-channel-plugins.md
workflow: 15
---
# Erstellen von Channel-Plugins
Diese Anleitung führt Sie durch das Erstellen eines Channel-Plugins, das OpenClaw mit einer Messaging-Plattform verbindet. Am Ende haben Sie einen funktionierenden Channel mit DM-Sicherheit, Pairing, Antwort-Threading und ausgehender Nachrichtenübermittlung.
Diese Anleitung führt Sie durch das Erstellen eines Channel-Plugin, das OpenClaw mit einer Messaging-Plattform verbindet. Am Ende haben Sie einen funktionierenden Channel mit DM-Sicherheit, Pairing, Antwort-Threading und ausgehenden Nachrichten.
<Info>
Wenn Sie bisher noch kein OpenClaw-Plugin erstellt haben, lesen Sie zuerst
[Erste Schritte](/de/plugins/building-plugins) für die grundlegende
Paketstruktur und die Manifest-Einrichtung.
Wenn Sie noch nie zuvor ein OpenClaw-Plugin erstellt haben, lesen Sie zuerst
[Erste Schritte](/de/plugins/building-plugins) für die grundlegende Paketstruktur
und die Manifest-Einrichtung.
</Info>
## So funktionieren Channel-Plugins
Channel-Plugins benötigen keine eigenen Send/Edit/React-Tools. OpenClaw behält ein
gemeinsam genutztes `message`-Tool im Core. Ihr Plugin ist zuständig für:
Channel-Plugins benötigen keine eigenen Senden-/Bearbeiten-/Reagieren-Tools. OpenClaw verwaltet ein gemeinsames `message`-Tool im Core. Ihr Plugin ist verantwortlich für:
- **Konfiguration**Account-Auflösung und Einrichtungsassistent
- **Konfiguration**Kontenauflösung und Einrichtungsassistent
- **Sicherheit** — DM-Richtlinie und Zulassungslisten
- **Pairing** — DM-Genehmigungsablauf
- **Sitzungsgrammatik** — wie anbieterspezifische Konversations-IDs auf Basis-Chats, Thread-IDs und Parent-Fallbacks abgebildet werden
- **Ausgehend** — Senden von Text, Medien und Umfragen an die Plattform
- **Threading** — wie Antworten in Threads organisiert werden
Der Core ist zuständig für das gemeinsam genutzte Message-Tool, die Prompt-Verdrahtung, die äußere Sitzungs-Schlüsselstruktur, generische `:thread:`-Buchführung und Dispatch.
Der Core verwaltet das gemeinsame Message-Tool, die Prompt-Verdrahtung, die äußere Sitzungs-Schlüsselstruktur, generisches `:thread:`-Bookkeeping und die Verteilung.
Wenn Ihr Channel `message`-Tool-Parameter hinzufügt, die Medienquellen transportieren, stellen Sie diese Parameternamen über `describeMessageTool(...).mediaSourceParams` bereit. Der Core verwendet diese explizite Liste für die Normalisierung von Sandbox-Pfaden und die Richtlinie für ausgehenden Medienzugriff, sodass Plugins keine Shared-Core-Sonderfälle für anbieterspezifische Avatar-, Anhangs- oder Titelbild-Parameter benötigen.
Geben Sie vorzugsweise eine aktionsbezogene Zuordnung zurück, etwa
`{ "set-profile": ["avatarUrl", "avatarPath"] }`, damit nicht zusammenhängende Aktionen nicht die Medienargumente einer anderen Aktion übernehmen. Ein flaches Array funktioniert weiterhin für Parameter, die absichtlich über alle bereitgestellten Aktionen hinweg gemeinsam genutzt werden.
Wenn Ihr Channel Message-Tool-Parameter hinzufügt, die Medienquellen transportieren, stellen Sie diese Parameternamen über `describeMessageTool(...).mediaSourceParams` bereit. Der Core verwendet diese explizite Liste für die Sandbox-Pfad-Normalisierung und die Richtlinie für ausgehenden Medienzugriff, sodass Plugins keine Shared-Core-Sonderfälle für anbieterspezifische Avatar-, Anhangs- oder Titelbild-Parameter benötigen.
Bevorzugen Sie die Rückgabe einer aktionsbezogenen Map wie
`{ "set-profile": ["avatarUrl", "avatarPath"] }`, damit nicht verwandte Aktionen nicht die Medienargumente einer anderen Aktion übernehmen. Ein flaches Array funktioniert weiterhin für Parameter, die absichtlich über alle bereitgestellten Aktionen hinweg gemeinsam genutzt werden.
Wenn Ihre Plattform zusätzlichen Geltungsbereich in Konversations-IDs speichert, belassen Sie diese Analyse im Plugin mit `messaging.resolveSessionConversation(...)`. Dies ist der kanonische Hook, um `rawId` auf die Basis-Konversations-ID, eine optionale Thread-ID, eine explizite `baseConversationId` und beliebige `parentConversationCandidates` abzubilden.
Wenn Sie `parentConversationCandidates` zurückgeben, halten Sie sie in der Reihenfolge vom spezifischsten Parent bis zur breitesten/Basis-Konversation.
Wenn Ihre Plattform zusätzlichen Geltungsbereich innerhalb von Konversations-IDs speichert, behalten Sie dieses Parsing im Plugin mit `messaging.resolveSessionConversation(...)`. Das ist der kanonische Hook für das Mapping von `rawId` auf die Basis-Konversations-ID, optionale Thread-ID, explizite `baseConversationId` und beliebige `parentConversationCandidates`.
Wenn Sie `parentConversationCandidates` zurückgeben, halten Sie sie in der Reihenfolge vom engsten Parent bis zur breitesten/Basis-Konversation.
Gebündelte Plugins, die dieselbe Analyse benötigen, bevor die Channel-Registry startet, können außerdem eine Top-Level-Datei `session-key-api.ts` mit einem passenden Export `resolveSessionConversation(...)` bereitstellen. Der Core verwendet diese Bootstrap-sichere Oberfläche nur dann, wenn die Runtime-Plugin-Registry noch nicht verfügbar ist.
Gebündelte Plugins, die dasselbe Parsing benötigen, bevor die Channel-Registry startet, können außerdem eine Datei `session-key-api.ts` auf oberster Ebene mit einem passenden Export `resolveSessionConversation(...)` bereitstellen. Der Core verwendet diese bootstrap-sichere Oberfläche nur dann, wenn die Runtime-Plugin-Registry noch nicht verfügbar ist.
`messaging.resolveParentConversationCandidates(...)` bleibt als Legacy-Kompatibilitäts-Fallback verfügbar, wenn ein Plugin nur Parent-Fallbacks zusätzlich zur generischen/rohen ID benötigt. Wenn beide Hooks vorhanden sind, verwendet der Core zuerst `resolveSessionConversation(...).parentConversationCandidates` und greift nur auf `resolveParentConversationCandidates(...)` zurück, wenn der kanonische Hook diese auslässt.
@ -54,37 +53,37 @@ Gebündelte Plugins, die dieselbe Analyse benötigen, bevor die Channel-Registry
Die meisten Channel-Plugins benötigen keinen Genehmigungs-spezifischen Code.
- Der Core ist zuständig für `/approve` im selben Chat, gemeinsam genutzte Payloads für Genehmigungs-Buttons und generische Fallback-Zustellung.
- Bevorzugen Sie ein einzelnes `approvalCapability`-Objekt auf dem Channel-Plugin, wenn der Channel Genehmigungs-spezifisches Verhalten benötigt.
- `ChannelPlugin.approvals` wurde entfernt. Legen Sie Fakten zu Genehmigungszustellung/nativer Unterstützung/Rendering/Auth in `approvalCapability` ab.
- `plugin.auth` dient nur für Login/Logout; der Core liest aus diesem Objekt keine Genehmigungs-Auth-Hooks mehr.
- `approvalCapability.authorizeActorAction` und `approvalCapability.getActionAvailabilityState` sind die kanonische Schnittstelle für Genehmigungs-Auth.
- Verwenden Sie `approvalCapability.getActionAvailabilityState` für die Verfügbarkeit von Genehmigungs-Auth bei Genehmigungen im selben Chat.
- Wenn Ihr Channel native Exec-Genehmigungen bereitstellt, verwenden Sie `approvalCapability.getExecInitiatingSurfaceState` für den Zustand der auslösenden Oberfläche/des nativen Clients, wenn dieser sich von der Genehmigungs-Auth im selben Chat unterscheidet. Der Core verwendet diesen exec-spezifischen Hook, um zwischen `enabled` und `disabled` zu unterscheiden, zu entscheiden, ob der auslösende Channel native Exec-Genehmigungen unterstützt, und den Channel in Hinweisen für native Client-Fallbacks einzubeziehen. `createApproverRestrictedNativeApprovalCapability(...)` füllt dies für den häufigen Fall aus.
- Der Core verwaltet `/approve` im selben Chat, gemeinsame Payloads für Genehmigungs-Schaltflächen und generische Fallback-Zustellung.
- Bevorzugen Sie ein einzelnes `approvalCapability`-Objekt im Channel-Plugin, wenn der Channel Genehmigungs-spezifisches Verhalten benötigt.
- `ChannelPlugin.approvals` wurde entfernt. Legen Sie Fakten zu Genehmigungszustellung/nativem Rendering/Auth unter `approvalCapability` ab.
- `plugin.auth` ist nur für Login/Logout; der Core liest aus diesem Objekt keine Auth-Hooks für Genehmigungen mehr.
- `approvalCapability.authorizeActorAction` und `approvalCapability.getActionAvailabilityState` sind die kanonische Nahtstelle für Genehmigungs-Auth.
- Verwenden Sie `approvalCapability.getActionAvailabilityState` für die Verfügbarkeit der Genehmigungs-Auth im selben Chat.
- Wenn Ihr Channel native Exec-Genehmigungen bereitstellt, verwenden Sie `approvalCapability.getExecInitiatingSurfaceState` für den Status der auslösenden Oberfläche/des nativen Clients, wenn dieser sich von der Genehmigungs-Auth im selben Chat unterscheidet. Der Core verwendet diesen Exec-spezifischen Hook, um zwischen `enabled` und `disabled` zu unterscheiden, zu entscheiden, ob der auslösende Channel native Exec-Genehmigungen unterstützt, und den Channel in die Fallback-Hinweise für native Clients aufzunehmen. `createApproverRestrictedNativeApprovalCapability(...)` füllt dies für den häufigen Fall aus.
- Verwenden Sie `outbound.shouldSuppressLocalPayloadPrompt` oder `outbound.beforeDeliverPayload` für Channel-spezifisches Payload-Lifecycle-Verhalten, etwa das Ausblenden doppelter lokaler Genehmigungs-Prompts oder das Senden von Tippindikatoren vor der Zustellung.
- Verwenden Sie `approvalCapability.delivery` nur für natives Genehmigungs-Routing oder die Unterdrückung von Fallbacks.
- Verwenden Sie `approvalCapability.nativeRuntime` für Channel-eigene Fakten zu nativen Genehmigungen. Halten Sie diese auf Hot-Path-Channel-Entrypoints lazy mit `createLazyChannelApprovalNativeRuntimeAdapter(...)`, das Ihr Runtime-Modul bei Bedarf importieren kann, während der Core dennoch den Genehmigungs-Lifecycle zusammenstellen kann.
- Verwenden Sie `approvalCapability.render` nur dann, wenn ein Channel wirklich benutzerdefinierte Genehmigungs-Payloads statt des gemeinsam genutzten Renderers benötigt.
- Verwenden Sie `approvalCapability.describeExecApprovalSetup`, wenn der Channel in der Antwort für den deaktivierten Pfad die genauen Konfigurationsschalter erläutern soll, die zum Aktivieren nativer Exec-Genehmigungen erforderlich sind. Der Hook erhält `{ channel, channelLabel, accountId }`; Channels mit benannten Accounts sollten accountbezogene Pfade wie `channels.<channel>.accounts.<id>.execApprovals.*` statt Top-Level-Standards rendern.
- Wenn ein Channel aus vorhandener Konfiguration stabile owner-ähnliche DM-Identitäten ableiten kann, verwenden Sie `createResolvedApproverActionAuthAdapter` aus `openclaw/plugin-sdk/approval-runtime`, um `/approve` im selben Chat einzuschränken, ohne Genehmigungs-spezifische Core-Logik hinzuzufügen.
- Wenn ein Channel native Genehmigungszustellung benötigt, halten Sie den Channel-Code auf Zielnormalisierung plus Fakten zu Transport/Präsentation fokussiert. Verwenden Sie `createChannelExecApprovalProfile`, `createChannelNativeOriginTargetResolver`, `createChannelApproverDmTargetResolver` und `createApproverRestrictedNativeApprovalCapability` aus `openclaw/plugin-sdk/approval-runtime`. Legen Sie die Channel-spezifischen Fakten hinter `approvalCapability.nativeRuntime`, idealerweise über `createChannelApprovalNativeRuntimeAdapter(...)` oder `createLazyChannelApprovalNativeRuntimeAdapter(...)`, damit der Core den Handler zusammensetzen und Request-Filterung, Routing, Deduplizierung, Ablauf, Gateway-Abonnement und Hinweise zu anderweitiger Weiterleitung übernehmen kann. `nativeRuntime` ist in einige kleinere Schnittstellen aufgeteilt:
- `availability` — ob der Account konfiguriert ist und ob eine Anfrage behandelt werden sollte
- `presentation`Abbildung des gemeinsam genutzten View-Models für Genehmigungen auf ausstehende/aufgelöste/abgelaufene native Payloads oder endgültige Aktionen
- `transport`Vorbereitung von Zielen sowie Senden/Aktualisieren/Löschen nativer Genehmigungsnachrichten
- `interactions` — optionale Hooks zum Binden/Lösen/Löschen von Aktionen für native Buttons oder Reaktionen
- Verwenden Sie `approvalCapability.nativeRuntime` für Channel-eigene Fakten zu nativen Genehmigungen. Halten Sie dies auf heißen Channel-Einstiegspunkten lazy mit `createLazyChannelApprovalNativeRuntimeAdapter(...)`, das Ihr Runtime-Modul bei Bedarf importieren kann, während der Core weiterhin den Genehmigungs-Lifecycle zusammenstellen kann.
- Verwenden Sie `approvalCapability.render` nur, wenn ein Channel wirklich benutzerdefinierte Genehmigungs-Payloads statt des gemeinsamen Renderers benötigt.
- Verwenden Sie `approvalCapability.describeExecApprovalSetup`, wenn der Channel in der Antwort auf den deaktivierten Pfad die genauen Konfigurationsschalter erläutern soll, die zum Aktivieren nativer Exec-Genehmigungen erforderlich sind. Der Hook erhält `{ channel, channelLabel, accountId }`; Channels mit benannten Konten sollten konto-spezifische Pfade wie `channels.<channel>.accounts.<id>.execApprovals.*` anstelle von Standardwerten auf oberster Ebene rendern.
- Wenn ein Channel stabile DM-Identitäten mit owner-ähnlichem Charakter aus der vorhandenen Konfiguration ableiten kann, verwenden Sie `createResolvedApproverActionAuthAdapter` aus `openclaw/plugin-sdk/approval-runtime`, um `/approve` im selben Chat einzuschränken, ohne Genehmigungs-spezifische Core-Logik hinzuzufügen.
- Wenn ein Channel native Genehmigungszustellung benötigt, halten Sie den Channel-Code auf Ziel-Normalisierung plus Transport-/Präsentationsfakten fokussiert. Verwenden Sie `createChannelExecApprovalProfile`, `createChannelNativeOriginTargetResolver`, `createChannelApproverDmTargetResolver` und `createApproverRestrictedNativeApprovalCapability` aus `openclaw/plugin-sdk/approval-runtime`. Legen Sie die Channel-spezifischen Fakten hinter `approvalCapability.nativeRuntime`, idealerweise über `createChannelApprovalNativeRuntimeAdapter(...)` oder `createLazyChannelApprovalNativeRuntimeAdapter(...)`, sodass der Core den Handler zusammenstellen und Anforderungsfilterung, Routing, Deduplizierung, Ablauf, Gateway-Abonnement und Hinweise auf anderweitiges Routing verwalten kann. `nativeRuntime` ist in einige kleinere Nahtstellen aufgeteilt:
- `availability` — ob das Konto konfiguriert ist und ob eine Anforderung verarbeitet werden soll
- `presentation`das gemeinsame Genehmigungs-View-Model in ausstehende/aufgelöste/abgelaufene native Payloads oder abschließende Aktionen abbilden
- `transport`Ziele vorbereiten sowie native Genehmigungsnachrichten senden/aktualisieren/löschen
- `interactions` — optionale Hooks zum Binden/Entbinden/Löschen von Aktionen für native Schaltflächen oder Reaktionen
- `observe` — optionale Hooks für Zustellungsdiagnostik
- Wenn der Channel Runtime-eigene Objekte wie einen Client, Token, eine Bolt-App oder einen Webhook-Empfänger benötigt, registrieren Sie diese über `openclaw/plugin-sdk/channel-runtime-context`. Die generische Runtime-Context-Registry ermöglicht dem Core, fähigkeitsgesteuerte Handler aus dem Startzustand des Channels zu bootstrappen, ohne Genehmigungs-spezifischen Wrapper-Klebstoff hinzuzufügen.
- Greifen Sie nur dann zu den Low-Level-Funktionen `createChannelApprovalHandler` oder `createChannelNativeApprovalRuntime`, wenn die fähigkeitsgesteuerte Schnittstelle noch nicht aussagekräftig genug ist.
- Native Genehmigungs-Channels müssen sowohl `accountId` als auch `approvalKind` durch diese Hilfsfunktionen leiten. `accountId` hält die Multi-Account-Genehmigungsrichtlinie auf den richtigen Bot-Account begrenzt, und `approvalKind` stellt Exec- vs. Plugin-Genehmigungsverhalten dem Channel zur Verfügung, ohne fest codierte Verzweigungen im Core.
- Der Core ist jetzt auch für Hinweise zur erneuten Weiterleitung von Genehmigungen zuständig. Channel-Plugins sollten daher keine eigenen Follow-up-Nachrichten wie „Genehmigung ging an DMs / einen anderen Channel“ aus `createChannelNativeApprovalRuntime` senden; stattdessen sollten sie präzises Routing für Ursprung + Approver-DM über die gemeinsam genutzten Hilfsfunktionen für Genehmigungs-Fähigkeiten bereitstellen und den Core die tatsächlichen Zustellungen aggregieren lassen, bevor irgendein Hinweis in den auslösenden Chat gepostet wird.
- Behalten Sie die Art der zugestellten Genehmigungs-ID Ende-zu-Ende bei. Native Clients sollten Exec- vs. Plugin-Genehmigungsrouting nicht anhand Channel-lokalen Zustands erraten oder umschreiben.
- Verschiedene Arten von Genehmigungen können absichtlich unterschiedliche native Oberflächen bereitstellen.
- Wenn der Channel Runtime-eigene Objekte wie einen Client, Token, eine Bolt-App oder einen Webhook-Empfänger benötigt, registrieren Sie sie über `openclaw/plugin-sdk/channel-runtime-context`. Die generische Runtime-Context-Registry erlaubt es dem Core, fähigkeitsgesteuerte Handler aus dem Startzustand des Channels zu bootstrappen, ohne Genehmigungs-spezifischen Wrapper-Kleber hinzuzufügen.
- Greifen Sie nur dann zu den Low-Level-Funktionen `createChannelApprovalHandler` oder `createChannelNativeApprovalRuntime`, wenn die fähigkeitsgesteuerte Nahtstelle noch nicht ausdrucksstark genug ist.
- Native Genehmigungs-Channels müssen sowohl `accountId` als auch `approvalKind` durch diese Hilfsfunktionen routen. `accountId` hält die Multi-Account-Genehmigungsrichtlinie auf das richtige Bot-Konto beschränkt, und `approvalKind` hält das Verhalten für Exec- vs. Plugin-Genehmigungen für den Channel verfügbar, ohne fest codierte Verzweigungen im Core.
- Der Core verwaltet jetzt auch Hinweise zur Umleitung von Genehmigungen. Channel-Plugins sollten keine eigenen Folge-Nachrichten wie „Genehmigung ging an DMs / einen anderen Channel“ aus `createChannelNativeApprovalRuntime` senden; stattdessen sollten sie korrektes Ursprungs- und Approver-DM-Routing über die gemeinsamen Hilfsfunktionen für Genehmigungsfähigkeiten bereitstellen und den Core tatsächliche Zustellungen aggregieren lassen, bevor ein Hinweis zurück in den auslösenden Chat gesendet wird.
- Behalten Sie die Art der zugestellten Genehmigungs-ID durchgängig bei. Native Clients sollten Exec- vs. Plugin-Genehmigungsrouting nicht anhand Channel-lokalen Zustands erraten oder umschreiben.
- Unterschiedliche Genehmigungsarten können absichtlich unterschiedliche native Oberflächen bereitstellen.
Aktuelle gebündelte Beispiele:
- Slack hält natives Genehmigungsrouting sowohl für Exec- als auch für Plugin-IDs verfügbar.
- Matrix behält dasselbe native DM-/Channel-Routing und dieselbe Reaktions-UX für Exec- und Plugin-Genehmigungen bei, während sich Auth weiterhin je nach Genehmigungsart unterscheiden kann.
- Matrix behält dasselbe native DM-/Channel-Routing und dieselbe Reaktions-UX für Exec- und Plugin-Genehmigungen bei, während Auth je nach Genehmigungsart trotzdem unterschiedlich sein darf.
- `createApproverRestrictedNativeApprovalAdapter` existiert weiterhin als Kompatibilitäts-Wrapper, aber neuer Code sollte den Capability-Builder bevorzugen und `approvalCapability` im Plugin bereitstellen.
Für Hot-Path-Channel-Entrypoints sollten Sie die schmaleren Runtime-Unterpfade bevorzugen, wenn Sie nur einen Teil dieser Familie benötigen:
Für heiße Channel-Einstiegspunkte bevorzugen Sie die schmaleren Runtime-Subpaths, wenn Sie nur einen Teil dieser Familie benötigen:
- `openclaw/plugin-sdk/approval-auth-runtime`
- `openclaw/plugin-sdk/approval-client-runtime`
@ -96,38 +95,36 @@ Für Hot-Path-Channel-Entrypoints sollten Sie die schmaleren Runtime-Unterpfade
- `openclaw/plugin-sdk/approval-reply-runtime`
- `openclaw/plugin-sdk/channel-runtime-context`
Ebenso sollten Sie `openclaw/plugin-sdk/setup-runtime`,
Bevorzugen Sie ebenso `openclaw/plugin-sdk/setup-runtime`,
`openclaw/plugin-sdk/setup-adapter-runtime`,
`openclaw/plugin-sdk/reply-runtime`,
`openclaw/plugin-sdk/reply-dispatch-runtime`,
`openclaw/plugin-sdk/reply-reference` und
`openclaw/plugin-sdk/reply-chunking` bevorzugen, wenn Sie die breitere übergreifende Oberfläche nicht benötigen.
`openclaw/plugin-sdk/reply-chunking`, wenn Sie die breitere übergreifende Oberfläche nicht benötigen.
Speziell für das Setup gilt:
Speziell für das Setup:
- `openclaw/plugin-sdk/setup-runtime` deckt die Runtime-sicheren Setup-Hilfen ab:
import-sichere Setup-Patch-Adapter (`createPatchedAccountSetupAdapter`,
- `openclaw/plugin-sdk/setup-runtime` umfasst die runtime-sicheren Setup-Hilfsfunktionen:
importsichere Setup-Patch-Adapter (`createPatchedAccountSetupAdapter`,
`createEnvPatchedAccountSetupAdapter`,
`createSetupInputPresenceValidator`), Ausgabe von Lookup-Hinweisen,
`promptResolvedAllowFrom`, `splitSetupEntries` und die delegierten
Setup-Proxy-Builder
- `openclaw/plugin-sdk/setup-adapter-runtime` ist die schmale env-bewusste Adapter-Schnittstelle
für `createEnvPatchedAccountSetupAdapter`
- `openclaw/plugin-sdk/channel-setup` deckt die Setup-Builder für optionale Installationen
plus einige Setup-sichere Primitive ab:
- `openclaw/plugin-sdk/setup-adapter-runtime` ist die schmale env-bewusste Adapter-Nahtstelle für `createEnvPatchedAccountSetupAdapter`
- `openclaw/plugin-sdk/channel-setup` umfasst die Builder für optionales Setup bei Installation plus einige setup-sichere Primitive:
`createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`,
Wenn Ihr Channel env-gesteuertes Setup oder Auth unterstützt und generische Startup-/Konfigurationsabläufe diese Env-Namen vor dem Laden der Runtime kennen sollen, deklarieren Sie sie im Plugin-Manifest mit `channelEnvVars`. Behalten Sie Runtime-`envVars` des Channels oder lokale Konstanten nur für operatorseitigen Text.
Wenn Ihr Channel env-gesteuertes Setup oder Auth unterstützt und generische Start-/Konfigurationsabläufe diese env-Namen vor dem Laden der Runtime kennen sollen, deklarieren Sie sie im Plugin-Manifest mit `channelEnvVars`. Behalten Sie Channel-Runtime-`envVars` oder lokale Konstanten nur für operatorseitige Texte bei.
`createOptionalChannelSetupWizard`, `DEFAULT_ACCOUNT_ID`,
`createTopLevelChannelDmPolicy`, `setSetupChannelEnabled` und
`splitSetupEntries`
- verwenden Sie die breitere Schnittstelle `openclaw/plugin-sdk/setup` nur dann, wenn Sie auch die schwergewichtigeren gemeinsam genutzten Setup-/Konfigurationshilfen benötigen, wie etwa
- verwenden Sie die breitere Nahtstelle `openclaw/plugin-sdk/setup` nur dann, wenn Sie auch die schwergewichtigeren gemeinsamen Setup-/Konfigurationshilfen benötigen, etwa
`moveSingleAccountChannelSectionToDefaultAccount(...)`
Wenn Ihr Channel in Setup-Oberflächen nur „installieren Sie zuerst dieses Plugin“ anzeigen möchte, bevorzugen Sie `createOptionalChannelSetupSurface(...)`. Der generierte Adapter/Assistent schlägt bei Konfigurationsschreibvorgängen und Finalisierung sicher fehl und verwendet dieselbe Meldung „Installation erforderlich“ für Validierung, Finalisierung und Text mit Docs-Link erneut.
Wenn Ihr Channel in Setup-Oberflächen nur „Dieses Plugin zuerst installieren“ bewerben möchte, bevorzugen Sie `createOptionalChannelSetupSurface(...)`. Der generierte Adapter/Assistent schlägt bei Konfigurationsschreibvorgängen und Finalisierung geschlossen fehl und verwendet dieselbe Meldung zur erforderlichen Installation über Validierung, Finalisierung und Docs-Link-Text hinweg wieder.
Für andere Hot-Path-Channel-Pfade sollten Sie schmale Hilfsfunktionen gegenüber breiteren Legacy-Oberflächen bevorzugen:
Für andere heiße Channel-Pfade bevorzugen Sie die schmalen Hilfsfunktionen gegenüber breiteren Legacy-Oberflächen:
- `openclaw/plugin-sdk/account-core`,
`openclaw/plugin-sdk/account-id`,
@ -135,45 +132,46 @@ Für andere Hot-Path-Channel-Pfade sollten Sie schmale Hilfsfunktionen gegenübe
`openclaw/plugin-sdk/account-helpers` für Multi-Account-Konfiguration und
Default-Account-Fallback
- `openclaw/plugin-sdk/inbound-envelope` und
`openclaw/plugin-sdk/inbound-reply-dispatch` für das Routing/die Envelope eingehender Nachrichten und
Record-and-Dispatch-Verdrahtung
- `openclaw/plugin-sdk/messaging-targets` für Zielanalyse/-abgleich
`openclaw/plugin-sdk/inbound-reply-dispatch` für eingehendes Routing/Umschlagformat und
Wiring für Aufzeichnen und Verteilen
- `openclaw/plugin-sdk/messaging-targets` für Ziel-Parsing/-Matching
- `openclaw/plugin-sdk/outbound-media` und
`openclaw/plugin-sdk/outbound-runtime` für Medienladen plus ausgehende
Identitäts-/Sende-Delegates
- `openclaw/plugin-sdk/thread-bindings-runtime` für den Lifecycle von Thread-Bindings
und die Adapter-Registrierung
- `openclaw/plugin-sdk/agent-media-payload` nur dann, wenn weiterhin ein Legacy-Layout
für Agent-/Medien-Payload-Felder erforderlich ist
- `openclaw/plugin-sdk/telegram-command-config` für die Normalisierung benutzerdefinierter Telegram-Befehle,
Duplikat-/Konfliktvalidierung und einen fallback-stabilen Vertrag für die Befehlskonfiguration
und Adapter-Registrierung
- `openclaw/plugin-sdk/agent-media-payload` nur dann, wenn weiterhin ein Legacy-Agent-/Medien-
Payload-Feldlayout erforderlich ist
- `openclaw/plugin-sdk/telegram-command-config` für Telegram-Benutzerdefinierte-Befehls-
Normalisierung, Validierung von Duplikaten/Konflikten und einen fallback-stabilen
Command-Konfigurationsvertrag
Channels nur mit Auth können normalerweise beim Standardpfad bleiben: Der Core verarbeitet Genehmigungen, und das Plugin stellt nur Outbound-/Auth-Fähigkeiten bereit. Native Genehmigungs-Channels wie Matrix, Slack, Telegram und benutzerdefinierte Chat-Transporte sollten die gemeinsam genutzten nativen Hilfsfunktionen verwenden, statt ihren eigenen Genehmigungs-Lifecycle zu implementieren.
Auth-only-Channels können in der Regel beim Standardpfad aufhören: Der Core verwaltet Genehmigungen, und das Plugin stellt nur Outbound-/Auth-Fähigkeiten bereit. Native Genehmigungs-Channels wie Matrix, Slack, Telegram und benutzerdefinierte Chat-Transporte sollten die gemeinsamen nativen Hilfsfunktionen verwenden, anstatt ihren eigenen Genehmigungs-Lifecycle zu implementieren.
## Richtlinie für eingehende Erwähnungen
Halten Sie die Verarbeitung eingehender Erwähnungen in zwei Schichten getrennt:
Halten Sie die Verarbeitung eingehender Erwähnungen in zwei Ebenen getrennt:
- plugin-eigene Evidenzerfassung
- gemeinsam genutzte Richtlinienauswertung
- Plugin-eigene Faktenermittlung
- gemeinsame Richtlinienauswertung
Verwenden Sie `openclaw/plugin-sdk/channel-inbound` für die gemeinsam genutzte Schicht.
Verwenden Sie `openclaw/plugin-sdk/channel-inbound` für die gemeinsame Ebene.
Gut geeignet für plugin-lokale Logik:
Gut geeignet für Plugin-lokale Logik:
- Erkennung von Antworten an den Bot
- Erkennung von Antworten auf den Bot
- Erkennung von Zitaten des Bots
- Prüfungen zur Thread-Beteiligung
- Ausschlüsse von Service-/Systemnachrichten
- plattformnative Caches, die benötigt werden, um die Beteiligung des Bots nachzuweisen
Gut geeignet für die gemeinsam genutzte Hilfsfunktion:
Gut geeignet für die gemeinsame Hilfsfunktion:
- `requireMention`
- explizites Erwähnungsergebnis
- Zulassungsliste für implizite Erwähnungen
- Command-Bypass
- endgültige Skip-Entscheidung
- endgültige Entscheidung zum Überspringen
Bevorzugter Ablauf:
@ -218,7 +216,7 @@ const decision = resolveInboundMentionDecision({
if (decision.shouldSkip) return;
```
`api.runtime.channel.mentions` stellt dieselben gemeinsam genutzten Hilfsfunktionen für Erwähnungen für gebündelte Channel-Plugins bereit, die bereits von Runtime-Injection abhängen:
`api.runtime.channel.mentions` stellt dieselben gemeinsamen Hilfsfunktionen für Erwähnungen für gebündelte Channel-Plugins bereit, die bereits von Runtime-Injection abhängen:
- `buildMentionRegexes`
- `matchesMentionPatterns`
@ -227,16 +225,17 @@ if (decision.shouldSkip) return;
- `resolveInboundMentionDecision`
Die älteren Hilfsfunktionen `resolveMentionGating*` bleiben auf
`openclaw/plugin-sdk/channel-inbound` nur als Kompatibilitätsexporte erhalten. Neuer Code sollte `resolveInboundMentionDecision({ facts, policy })` verwenden.
`openclaw/plugin-sdk/channel-inbound` nur als Kompatibilitäts-Exporte erhalten. Neuer Code sollte `resolveInboundMentionDecision({ facts, policy })` verwenden.
## Schritt-für-Schritt-Anleitung
<Steps>
<a id="step-1-package-and-manifest"></a>
<Step title="Paket und Manifest">
Erstellen Sie die Standarddateien des Plugins. Das Feld `channel` in `package.json`
macht dies zu einem Channel-Plugin. Die vollständige Oberfläche der Paketmetadaten
finden Sie unter [Plugin-Setup und Konfiguration](/de/plugins/sdk-setup#openclaw-channel):
Erstellen Sie die Standard-Plugin-Dateien. Das Feld `channel` in `package.json`
macht dies zu einem Channel-Plugin. Die vollständige Oberfläche für
Paketmetadaten finden Sie unter
[Plugin-Setup und Konfiguration](/de/plugins/sdk-setup#openclaw-channel):
<CodeGroup>
```json package.json
@ -286,7 +285,7 @@ Die älteren Hilfsfunktionen `resolveMentionGating*` bleiben auf
</Step>
<Step title="Das Channel-Plugin-Objekt erstellen">
Das Interface `ChannelPlugin` hat viele optionale Adapter-Oberflächen. Beginnen Sie mit
Die Schnittstelle `ChannelPlugin` hat viele optionale Adapter-Oberflächen. Beginnen Sie mit
dem Minimum — `id` und `setup` — und fügen Sie nach Bedarf Adapter hinzu.
Erstellen Sie `src/channel.ts`:
@ -382,24 +381,24 @@ Die älteren Hilfsfunktionen `resolveMentionGating*` bleiben auf
});
```
<Accordion title="Was `createChatChannelPlugin` für Sie erledigt">
Statt Low-Level-Adapter-Interfaces manuell zu implementieren, übergeben Sie
<Accordion title="Was createChatChannelPlugin für Sie übernimmt">
Statt Low-Level-Adapter-Schnittstellen manuell zu implementieren, übergeben Sie
deklarative Optionen, und der Builder setzt sie zusammen:
| Option | Was verdrahtet wird |
| --- | --- |
| `security.dm` | Bereichsbezogener DM-Sicherheits-Resolver aus Konfigurationsfeldern |
| `security.dm` | Scoped-DM-Sicherheits-Resolver aus Konfigurationsfeldern |
| `pairing.text` | Textbasierter DM-Pairing-Ablauf mit Codeaustausch |
| `threading` | Reply-to-Modus-Resolver (fest, accountbezogen oder benutzerdefiniert) |
| `threading` | Resolver für Reply-to-Modus (fest, konto-spezifisch oder benutzerdefiniert) |
| `outbound.attachedResults` | Sendefunktionen, die Ergebnis-Metadaten zurückgeben (Nachrichten-IDs) |
Sie können statt der deklarativen Optionen auch rohe Adapter-Objekte übergeben,
wenn Sie die vollständige Kontrolle benötigen.
wenn Sie vollständige Kontrolle benötigen.
</Accordion>
</Step>
<Step title="Den Entry-Point verdrahten">
<Step title="Den Einstiegspunkt verdrahten">
Erstellen Sie `index.ts`:
```typescript index.ts
@ -437,18 +436,19 @@ Die älteren Hilfsfunktionen `resolveMentionGating*` bleiben auf
Legen Sie Channel-eigene CLI-Deskriptoren in `registerCliMetadata(...)` ab, damit OpenClaw
sie in der Root-Hilfe anzeigen kann, ohne die vollständige Channel-Runtime zu aktivieren,
während normale vollständige Ladevorgänge dieselben Deskriptoren weiterhin für die echte
Befehlsregistrierung übernehmen. Behalten Sie `registerFull(...)` für reine Runtime-Arbeit.
während normale vollständige Ladevorgänge dieselben Deskriptoren weiterhin für die echte Command-
Registrierung übernehmen. Behalten Sie `registerFull(...)` für reine Runtime-Arbeiten.
Wenn `registerFull(...)` Gateway-RPC-Methoden registriert, verwenden Sie ein
pluginspezifisches Präfix. Core-Admin-Namespaces (`config.*`,
Plugin-spezifisches Präfix. Core-Admin-Namespaces (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) bleiben reserviert und werden immer
zu `operator.admin` aufgelöst.
`defineChannelPluginEntry` übernimmt die Aufteilung des Registrierungsmodus automatisch. Alle
Optionen finden Sie unter [Entry-Points](/de/plugins/sdk-entrypoints#definechannelpluginentry).
`defineChannelPluginEntry` übernimmt die Aufteilung nach Registrierungsmodus automatisch. Siehe
[Einstiegspunkte](/de/plugins/sdk-entrypoints#definechannelpluginentry) für alle
Optionen.
</Step>
<Step title="Einen Setup-Entry hinzufügen">
<Step title="Einen Setup-Eintrag hinzufügen">
Erstellen Sie `setup-entry.ts` für leichtgewichtiges Laden während des Onboardings:
```typescript setup-entry.ts
@ -458,16 +458,21 @@ Die älteren Hilfsfunktionen `resolveMentionGating*` bleiben auf
export default defineSetupPluginEntry(acmeChatPlugin);
```
OpenClaw lädt diesen statt des vollständigen Entry-Points, wenn der Channel deaktiviert
oder nicht konfiguriert ist. So wird verhindert, dass während Setup-Abläufen schwergewichtiger Runtime-Code geladen wird.
OpenClaw lädt dies anstelle des vollständigen Einstiegspunkts, wenn der Channel deaktiviert
oder nicht konfiguriert ist. Dadurch wird vermieden, während Setup-Abläufen schweren Runtime-Code zu laden.
Details finden Sie unter [Setup und Konfiguration](/de/plugins/sdk-setup#setup-entry).
Gebündelte Workspace-Channels, die setup-sichere Exporte in Sidecar-
Module aufteilen, können `defineBundledChannelSetupEntry(...)` aus
`openclaw/plugin-sdk/channel-entry-contract` verwenden, wenn sie zusätzlich einen
expliziten Runtime-Setter zur Setup-Zeit benötigen.
</Step>
<Step title="Eingehende Nachrichten verarbeiten">
Ihr Plugin muss Nachrichten von der Plattform empfangen und an
OpenClaw weiterleiten. Das typische Muster ist ein Webhook, der die Anfrage überprüft und
sie über den Inbound-Handler Ihres Channels weiterleitet:
OpenClaw weiterleiten. Das typische Muster ist ein Webhook, der die Anfrage verifiziert und
sie über den Inbound-Handler Ihres Channels verteilt:
```typescript
registerFull(api) {
@ -491,15 +496,15 @@ Die älteren Hilfsfunktionen `resolveMentionGating*` bleiben auf
```
<Note>
Die Verarbeitung eingehender Nachrichten ist channelspezifisch. Jedes Channel-Plugin besitzt
seine eigene Inbound-Pipeline. Sehen Sie sich gebündelte Channel-Plugins
(zum Beispiel das Plugin-Paket für Microsoft Teams oder Google Chat) für reale Muster an.
Die Verarbeitung eingehender Nachrichten ist Channel-spezifisch. Jedes Channel-Plugin besitzt
seine eigene Inbound-Pipeline. Schauen Sie sich gebündelte Channel-Plugins an
(zum Beispiel das Microsoft Teams- oder Google Chat-Plugin-Paket) für echte Muster.
</Note>
</Step>
<a id="step-6-test"></a>
<Step title="Testen">
<Step title="Test">
Schreiben Sie colocated Tests in `src/channel.test.ts`:
```typescript src/channel.test.ts
@ -538,7 +543,7 @@ Schreiben Sie colocated Tests in `src/channel.test.ts`:
pnpm test -- <bundled-plugin-root>/acme-chat/
```
Für gemeinsam genutzte Test-Hilfsfunktionen siehe [Testing](/de/plugins/sdk-testing).
Für gemeinsame Test-Hilfsfunktionen siehe [Testing](/de/plugins/sdk-testing).
</Step>
</Steps>
@ -560,11 +565,11 @@ Schreiben Sie colocated Tests in `src/channel.test.ts`:
└── runtime.ts # Runtime-Store (falls erforderlich)
```
## Erweiterte Themen
## Fortgeschrittene Themen
<CardGroup cols={2}>
<Card title="Threading-Optionen" icon="git-branch" href="/de/plugins/sdk-entrypoints#registration-mode">
Feste, accountbezogene oder benutzerdefinierte Antwortmodi
Feste, konto-spezifische oder benutzerdefinierte Antwortmodi
</Card>
<Card title="Integration des Message-Tools" icon="puzzle" href="/de/plugins/architecture#channel-plugins-and-the-shared-message-tool">
describeMessageTool und Action-Erkennung
@ -578,15 +583,15 @@ Schreiben Sie colocated Tests in `src/channel.test.ts`:
</CardGroup>
<Note>
Einige gebündelte Helper-Schnittstellen existieren weiterhin für die Pflege gebündelter Plugins und
Kompatibilität. Sie sind nicht das empfohlene Muster für neue Channel-Plugins;
bevorzugen Sie die generischen Unterpfade channel/setup/reply/runtime aus der gemeinsamen SDK-
Oberfläche, es sei denn, Sie pflegen diese gebündelte Plugin-Familie direkt.
Einige gebündelte Helper-Nahtstellen existieren weiterhin für die Wartung und
Kompatibilität gebündelter Plugins. Sie sind nicht das empfohlene Muster für neue Channel-Plugins;
bevorzugen Sie die generischen Channel-/Setup-/Reply-/Runtime-Subpaths aus der gemeinsamen SDK-
Oberfläche, es sei denn, Sie warten direkt diese gebündelte Plugin-Familie.
</Note>
## Nächste Schritte
- [Provider-Plugins](/de/plugins/sdk-provider-plugins) — wenn Ihr Plugin auch Modelle bereitstellt
- [SDK-Überblick](/de/plugins/sdk-overview) — vollständige Importreferenz für Unterpfade
- [SDK-Testing](/de/plugins/sdk-testing) — Test-Utilities und Vertragstests
- [Plugin-Manifest](/de/plugins/manifest) — vollständiges Manifestschema
- [SDK-Überblick](/de/plugins/sdk-overview) — vollständige Referenz für Subpath-Importe
- [SDK Testing](/de/plugins/sdk-testing) — Test-Utilities und Vertragstests
- [Plugin-Manifest](/de/plugins/manifest) — vollständiges Manifest-Schema

View File

@ -1,28 +1,27 @@
---
read_when:
- Sie benötigen die genaue Typsignatur von definePluginEntry oder defineChannelPluginEntry
- Sie möchten den Registrierungsmodus verstehen (vollständig vs. Setup vs. CLI-Metadaten)
- Sie schlagen Optionen für Einstiegspunkte nach
- Sie benötigen die genaue Typsignatur von definePluginEntry oder defineChannelPluginEntry.
- Sie möchten den Registrierungsmodus verstehen (vollständig vs. Einrichtung vs. CLI-Metadaten).
- Sie schlagen Einstiegspunktoptionen nach.
sidebarTitle: Entry Points
summary: Referenz für definePluginEntry, defineChannelPluginEntry und defineSetupPluginEntry
title: Plugin-Einstiegspunkte
x-i18n:
generated_at: "2026-04-05T12:51:09Z"
generated_at: "2026-04-15T19:41:40Z"
model: gpt-5.4
provider: openai
source_hash: 799dbfe71e681dd8ba929a7a631dfe745c3c5c69530126fea2f9c137b120f51f
source_hash: aabca25bc9b8ff1b5bb4852bafe83640ffeba006ea6b6a8eff4e2c37a10f1fe4
source_path: plugins/sdk-entrypoints.md
workflow: 15
---
# Plugin-Einstiegspunkte
Jedes Plugin exportiert ein Standard-Einstiegsobjekt. Das SDK bietet drei Hilfsfunktionen
zu seiner Erstellung.
Jedes Plugin exportiert ein Standard-Einstiegsobjekt. Das SDK bietet drei Hilfsfunktionen, um diese zu erstellen.
<Tip>
**Suchen Sie nach einer Schritt-für-Schritt-Anleitung?** Unter [Channel Plugins](/plugins/sdk-channel-plugins)
oder [Provider Plugins](/plugins/sdk-provider-plugins) finden Sie Anleitungen mit einzelnen Schritten.
**Suchen Sie nach einer Schritt-für-Schritt-Anleitung?** Siehe [Kanal-Plugins](/de/plugins/sdk-channel-plugins)
oder [Provider-Plugins](/de/plugins/sdk-provider-plugins) für Schritt-für-Schritt-Anleitungen.
</Tip>
## `definePluginEntry`
@ -50,28 +49,27 @@ export default definePluginEntry({
});
```
| Feld | Typ | Erforderlich | Standard |
| Feld | Typ | Erforderlich | Standardwert |
| -------------- | ---------------------------------------------------------------- | ------------ | ------------------- |
| `id` | `string` | Ja | — |
| `name` | `string` | Ja | — |
| `description` | `string` | Ja | — |
| `kind` | `string` | Nein | — |
| `configSchema` | `OpenClawPluginConfigSchema \| () => OpenClawPluginConfigSchema` | Nein | Schema für leeres Objekt |
| `configSchema` | `OpenClawPluginConfigSchema \| () => OpenClawPluginConfigSchema` | Nein | Leeres Objektschema |
| `register` | `(api: OpenClawPluginApi) => void` | Ja | — |
- `id` muss mit Ihrem `openclaw.plugin.json`-Manifest übereinstimmen.
- `kind` ist für exklusive Slots: `"memory"` oder `"context-engine"`.
- `kind` ist für exklusive Slots gedacht: `"memory"` oder `"context-engine"`.
- `configSchema` kann eine Funktion zur verzögerten Auswertung sein.
- OpenClaw löst dieses Schema beim ersten Zugriff auf und memoisiert es, sodass aufwendige Schema-
Builder nur einmal ausgeführt werden.
- OpenClaw löst dieses Schema beim ersten Zugriff auf und memoisiert es, sodass aufwendige Schema-Builder nur einmal ausgeführt werden.
## `defineChannelPluginEntry`
**Import:** `openclaw/plugin-sdk/channel-core`
Kapselt `definePluginEntry` mit kanalspezifischer Verdrahtung. Ruft automatisch
`api.registerChannel({ plugin })` auf, stellt eine optionale CLI-Metadaten-Nahtstelle
für die Root-Hilfe bereit und steuert `registerFull` über den Registrierungsmodus.
Umschließt `definePluginEntry` mit kanalspezifischer Verdrahtung. Ruft automatisch
`api.registerChannel({ plugin })` auf, stellt einen optionalen CLI-Metadaten-Einstiegspunkt
für die Root-Hilfe bereit und steuert `registerFull` anhand des Registrierungsmodus.
```typescript
import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";
@ -91,35 +89,36 @@ export default defineChannelPluginEntry({
});
```
| Feld | Typ | Erforderlich | Standard |
| Feld | Typ | Erforderlich | Standardwert |
| --------------------- | ---------------------------------------------------------------- | ------------ | ------------------- |
| `id` | `string` | Ja | — |
| `name` | `string` | Ja | — |
| `description` | `string` | Ja | — |
| `plugin` | `ChannelPlugin` | Ja | — |
| `configSchema` | `OpenClawPluginConfigSchema \| () => OpenClawPluginConfigSchema` | Nein | Schema für leeres Objekt |
| `configSchema` | `OpenClawPluginConfigSchema \| () => OpenClawPluginConfigSchema` | Nein | Leeres Objektschema |
| `setRuntime` | `(runtime: PluginRuntime) => void` | Nein | — |
| `registerCliMetadata` | `(api: OpenClawPluginApi) => void` | Nein | — |
| `registerFull` | `(api: OpenClawPluginApi) => void` | Nein | — |
- `setRuntime` wird während der Registrierung aufgerufen, damit Sie die Runtime-Referenz speichern können
(typischerweise über `createPluginRuntimeStore`). Während der Erfassung von CLI-Metadaten
wird dies übersprungen.
- `setRuntime` wird bei der Registrierung aufgerufen, damit Sie die Runtime-Referenz speichern können
(typischerweise über `createPluginRuntimeStore`). Beim Erfassen von CLI-Metadaten
wird es übersprungen.
- `registerCliMetadata` wird sowohl bei `api.registrationMode === "cli-metadata"`
als auch bei `api.registrationMode === "full"` ausgeführt.
Verwenden Sie dies als maßgeblichen Ort für dem Kanal gehörende CLI-Deskriptoren, damit die Root-Hilfe
nicht aktivierend bleibt, während die normale Registrierung von CLI-Befehlen mit vollständigen Plugin-Ladevorgängen
kompatibel bleibt.
- `registerFull` wird nur ausgeführt, wenn `api.registrationMode === "full"` gilt. Es wird
beim reinen Setup-Laden übersprungen.
Verwenden Sie es als die kanonische Stelle für kanal-eigene CLI-Deskriptoren, damit die Root-Hilfe
nicht aktivierend bleibt, während die normale CLI-Befehlsregistrierung mit
vollständigen Plugin-Ladevorgängen kompatibel bleibt.
- `registerFull` wird nur ausgeführt, wenn `api.registrationMode === "full"` ist. Bei
reinen Setup-Ladevorgängen wird es übersprungen.
- Wie bei `definePluginEntry` kann `configSchema` eine Lazy-Factory sein, und OpenClaw
memoisiert das aufgelöste Schema beim ersten Zugriff.
- Für Root-CLI-Befehle, die dem Plugin gehören, bevorzugen Sie `api.registerCli(..., { descriptors: [...] })`,
wenn der Befehl lazy-loaded bleiben soll, ohne aus dem Root-CLI-Parsebaum zu verschwinden.
Bei Channel-Plugins sollten diese Deskriptoren bevorzugt aus `registerCliMetadata(...)`
registriert werden, und `registerFull(...)` sollte sich auf reine Laufzeitarbeit konzentrieren.
- Wenn `registerFull(...)` auch Gateway-RPC-Methoden registriert, behalten Sie diese unter einem
pluginspezifischen Präfix. Reservierte Kern-Admin-Namespaces (`config.*`,
- Für Plugin-eigene Root-CLI-Befehle sollten Sie `api.registerCli(..., { descriptors: [...] })`
bevorzugen, wenn der Befehl lazy-loaded bleiben soll, ohne aus dem
Root-CLI-Parse-Baum zu verschwinden. Bei Kanal-Plugins sollten Sie diese Deskriptoren
vorzugsweise aus `registerCliMetadata(...)` registrieren und `registerFull(...)` auf
Arbeiten beschränken, die nur zur Laufzeit nötig sind.
- Wenn `registerFull(...)` auch Gateway-RPC-Methoden registriert, halten Sie diese unter einem
pluginspezifischen Präfix. Reservierte Core-Admin-Namespaces (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) werden immer zu
`operator.admin` umgewandelt.
@ -136,33 +135,58 @@ import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";
export default defineSetupPluginEntry(myChannelPlugin);
```
OpenClaw lädt dies anstelle des vollständigen Einstiegspunkts, wenn ein Kanal deaktiviert,
nicht konfiguriert ist oder wenn verzögertes Laden aktiviert ist. Unter
[Setup and Config](/plugins/sdk-setup#setup-entry) finden Sie Informationen dazu, wann das wichtig ist.
OpenClaw lädt dies anstelle des vollständigen Einstiegs, wenn ein Kanal deaktiviert,
nicht konfiguriert ist oder wenn verzögertes Laden aktiviert ist. Siehe
[Setup und Konfiguration](/de/plugins/sdk-setup#setup-entry), wann dies wichtig ist.
In der Praxis kombinieren Sie `defineSetupPluginEntry(...)` mit den schmalen Setup-Hilfsfamilien:
- `openclaw/plugin-sdk/setup-runtime` für laufzeitsichere Setup-Hilfen wie
import-sichere Setup-Patch-Adapter, Ausgabe von Lookup-Hinweisen,
- `openclaw/plugin-sdk/setup-runtime` für runtime-sichere Setup-Helfer wie
importsichere Setup-Patch-Adapter, Ausgabe von Lookup-Hinweisen,
`promptResolvedAllowFrom`, `splitSetupEntries` und delegierte Setup-Proxys
- `openclaw/plugin-sdk/channel-setup` für optionale Installations-Setup-Oberflächen
- `openclaw/plugin-sdk/setup-tools` für Setup-/Installations-CLI-/Archiv-/Dokumentationshilfen
- `openclaw/plugin-sdk/setup-tools` für Setup-/Installations-CLI-/Archiv-/Dokumentations-Helfer
Behalten Sie schwere SDKs, CLI-Registrierung und langlebige Laufzeitdienste im vollständigen
Einstiegspunkt.
Behalten Sie schwere SDKs, CLI-Registrierung und langlebige Runtime-Dienste im vollständigen
Einstieg.
Gebündelte Workspace-Kanäle, die Setup- und Runtime-Oberflächen aufteilen, können stattdessen
`defineBundledChannelSetupEntry(...)` aus
`openclaw/plugin-sdk/channel-entry-contract` verwenden. Dieser Vertrag ermöglicht es dem
Setup-Einstieg, setupsichere Plugin-/Secret-Exporte beizubehalten und gleichzeitig einen
Runtime-Setter bereitzustellen:
```typescript
import { defineBundledChannelSetupEntry } from "openclaw/plugin-sdk/channel-entry-contract";
export default defineBundledChannelSetupEntry({
importMetaUrl: import.meta.url,
plugin: {
specifier: "./channel-plugin-api.js",
exportName: "myChannelPlugin",
},
runtime: {
specifier: "./runtime-api.js",
exportName: "setMyChannelRuntime",
},
});
```
Verwenden Sie diesen gebündelten Vertrag nur dann, wenn Setup-Flows wirklich einen leichtgewichtigen Runtime-Setter
benötigen, bevor der vollständige Kanaleinstieg geladen wird.
## Registrierungsmodus
`api.registrationMode` zeigt Ihrem Plugin, wie es geladen wurde:
`api.registrationMode` teilt Ihrem Plugin mit, wie es geladen wurde:
| Modus | Wann | Was registriert werden soll |
| ----------------- | ---------------------------------- | --------------------------------------------------------------------------------------- |
| `"full"` | Normaler Gateway-Start | Alles |
| `"setup-only"` | Deaktivierter/nicht konfigurierter Kanal | Nur Kanalregistrierung |
| `"setup-runtime"` | Setup-Ablauf mit verfügbarer Runtime | Kanalregistrierung plus nur die schlanke Runtime, die vor dem Laden des vollständigen Einstiegspunkts benötigt wird |
| `"cli-metadata"` | Root-Hilfe / Erfassung von CLI-Metadaten | Nur CLI-Deskriptoren |
| Modus | Wann | Was registriert werden soll |
| ----------------- | --------------------------------- | -------------------------------------------------------------------------------------------- |
| `"full"` | Normaler Gateway-Start | Alles |
| `"setup-only"` | Deaktivierter/nicht konfigurierter Kanal | Nur Kanalregistrierung |
| `"setup-runtime"` | Setup-Flow mit verfügbarer Runtime | Kanalregistrierung plus nur die leichtgewichtige Runtime, die vor dem Laden des vollständigen Einstiegs benötigt wird |
| `"cli-metadata"` | Root-Hilfe / Erfassung von CLI-Metadaten | Nur CLI-Deskriptoren |
`defineChannelPluginEntry` übernimmt diese Aufteilung automatisch. Wenn Sie
`defineChannelPluginEntry` behandelt diese Aufteilung automatisch. Wenn Sie
`definePluginEntry` direkt für einen Kanal verwenden, prüfen Sie den Modus selbst:
```typescript
@ -175,24 +199,24 @@ register(api) {
api.registerChannel({ plugin: myPlugin });
if (api.registrationMode !== "full") return;
// Schwere Registrierungen nur für die Laufzeit
// Schwere Registrierungen nur zur Laufzeit
api.registerService(/* ... */);
}
```
Behandeln Sie `"setup-runtime"` als das Fenster, in dem reine Setup-Startoberflächen
vorhanden sein müssen, ohne die vollständige gebündelte Kanal-Runtime erneut zu betreten. Geeignet sind
Behandeln Sie `"setup-runtime"` als das Zeitfenster, in dem Setup-only-Startoberflächen
vorhanden sein müssen, ohne die vollständige gebündelte Kanal-Runtime erneut zu betreten. Geeignete Anwendungsfälle sind
Kanalregistrierung, setupsichere HTTP-Routen, setupsichere Gateway-Methoden und
delegierte Setup-Hilfen. Schwere Hintergrunddienste, CLI-Registrierer und
delegierte Setup-Helfer. Schwere Hintergrunddienste, CLI-Registrare und
Provider-/Client-SDK-Bootstraps gehören weiterhin in `"full"`.
Speziell für CLI-Registrierer gilt:
Speziell für CLI-Registrare gilt:
- verwenden Sie `descriptors`, wenn der Registrierer einen oder mehrere Root-Befehle besitzt und Sie
möchten, dass OpenClaw das echte CLI-Modul beim ersten Aufruf lazy lädt
- stellen Sie sicher, dass diese Deskriptoren jeden Top-Level-Befehlsstamm abdecken, der vom
Registrierer bereitgestellt wird
- verwenden Sie `commands` allein nur für eager-kompatible Pfade
- verwenden Sie `descriptors`, wenn der Registrar einen oder mehrere Root-Befehle besitzt und Sie
möchten, dass OpenClaw das eigentliche CLI-Modul beim ersten Aufruf lazy-loaded
- stellen Sie sicher, dass diese Deskriptoren jeden Top-Level-Befehls-Root abdecken, der vom
Registrar bereitgestellt wird
- verwenden Sie nur `commands` für eager Kompatibilitätspfade
## Plugin-Formen
@ -200,17 +224,17 @@ OpenClaw klassifiziert geladene Plugins nach ihrem Registrierungsverhalten:
| Form | Beschreibung |
| ------------------- | ------------------------------------------------- |
| **plain-capability** | Ein Funktionstyp (z. B. nur Provider) |
| **hybrid-capability** | Mehrere Funktionstypen (z. B. Provider + Speech) |
| **hook-only** | Nur Hooks, keine Funktionen |
| **non-capability** | Tools/Befehle/Dienste, aber keine Funktionen |
| **plain-capability** | Ein Fähigkeitstyp (z. B. nur Provider) |
| **hybrid-capability** | Mehrere Fähigkeitstypen (z. B. Provider + Sprache) |
| **hook-only** | Nur Hooks, keine Fähigkeiten |
| **non-capability** | Tools/Befehle/Dienste, aber keine Fähigkeiten |
Verwenden Sie `openclaw plugins inspect <id>`, um die Form eines Plugins anzuzeigen.
## Verwandt
- [SDK-Überblick](/plugins/sdk-overview) — Registrierungs-API und Subpfad-Referenz
- [Runtime-Hilfen](/plugins/sdk-runtime) — `api.runtime` und `createPluginRuntimeStore`
- [Setup und Konfiguration](/plugins/sdk-setup) — Manifest, Setup-Einstiegspunkt, verzögertes Laden
- [Channel Plugins](/plugins/sdk-channel-plugins) — das `ChannelPlugin`-Objekt erstellen
- [Provider Plugins](/plugins/sdk-provider-plugins) — Provider-Registrierung und Hooks
- [SDK-Überblick](/de/plugins/sdk-overview) — Registrierungs-API und Subpath-Referenz
- [Runtime-Helfer](/de/plugins/sdk-runtime) — `api.runtime` und `createPluginRuntimeStore`
- [Setup und Konfiguration](/de/plugins/sdk-setup) — Manifest, Setup-Einstieg, verzögertes Laden
- [Kanal-Plugins](/de/plugins/sdk-channel-plugins) — Erstellen des `ChannelPlugin`-Objekts
- [Provider-Plugins](/de/plugins/sdk-provider-plugins) — Provider-Registrierung und Hooks

View File

@ -1,29 +1,28 @@
---
read_when:
- Sie müssen Core-Hilfsfunktionen aus einem Plugin aufrufen (TTS, STT, Bildgenerierung, Websuche, Subagent)
- Sie müssen Core-Helfer aus einem Plugin aufrufen (TTS, STT, Bildgenerierung, Websuche, Subagent)
- Sie möchten verstehen, was `api.runtime` bereitstellt
- Sie greifen aus Plugin-Code auf Konfigurations-, Agenten- oder Medien-Hilfsfunktionen zu
- Sie greifen aus Plugin-Code auf Konfigurations-, Agent- oder Medien-Helfer zu
sidebarTitle: Runtime Helpers
summary: api.runtime -- die injizierten Laufzeit-Hilfsfunktionen, die Plugins zur Verfügung stehen
title: Plugin-Laufzeit-Hilfsfunktionen
summary: api.runtime -- die injizierten Runtime-Helfer, die Plugins zur Verfügung stehen
title: Plugin-Runtime-Helfer
x-i18n:
generated_at: "2026-04-11T02:46:50Z"
generated_at: "2026-04-15T19:41:34Z"
model: gpt-5.4
provider: openai
source_hash: fbf8a6ecd970300f784b8aca20eed40ba12c83107abd27385bfdc3347d2544be
source_hash: c77a6e9cd48c84affa17dce684bbd0e072c8b63485e4a5d569f3793a4ea4f9c8
source_path: plugins/sdk-runtime.md
workflow: 15
---
# Plugin-Laufzeit-Hilfsfunktionen
# Plugin-Runtime-Helfer
Referenz für das `api.runtime`-Objekt, das jedem Plugin bei der
Registrierung injiziert wird. Verwenden Sie diese Hilfsfunktionen, anstatt Host-Interna direkt zu importieren.
Referenz für das `api.runtime`-Objekt, das bei der Registrierung in jedes Plugin injiziert wird. Verwenden Sie diese Helfer, anstatt Host-Interna direkt zu importieren.
<Tip>
**Suchen Sie eine Schritt-für-Schritt-Anleitung?** Unter [Kanal-Plugins](/de/plugins/sdk-channel-plugins)
oder [Provider-Plugins](/de/plugins/sdk-provider-plugins) finden Sie Anleitungen
mit diesen Hilfsfunktionen im Kontext.
**Suchen Sie nach einer Schritt-für-Schritt-Anleitung?** Siehe [Channel-Plugins](/de/plugins/sdk-channel-plugins)
oder [Provider-Plugins](/de/plugins/sdk-provider-plugins) für Schritt-für-Schritt-Anleitungen,
die diese Helfer im Kontext zeigen.
</Tip>
```typescript
@ -32,32 +31,32 @@ register(api) {
}
```
## Laufzeit-Namespaces
## Runtime-Namespaces
### `api.runtime.agent`
Agentenidentität, Verzeichnisse und Sitzungsverwaltung.
Agent-Identität, Verzeichnisse und Sitzungsverwaltung.
```typescript
// Arbeitsverzeichnis des Agenten auflösen
const agentDir = api.runtime.agent.resolveAgentDir(cfg);
// Agenten-Workspace auflösen
// Agent-Workspace auflösen
const workspaceDir = api.runtime.agent.resolveAgentWorkspaceDir(cfg);
// Agentenidentität abrufen
// Agent-Identität abrufen
const identity = api.runtime.agent.resolveAgentIdentity(cfg);
// Standard-Thinking-Stufe abrufen
// Standard-Thinkinglevel abrufen
const thinking = api.runtime.agent.resolveThinkingDefault(cfg, provider, model);
// Agenten-Zeitlimit abrufen
// Agent-Timeout abrufen
const timeoutMs = api.runtime.agent.resolveAgentTimeoutMs(cfg);
// Sicherstellen, dass der Workspace existiert
await api.runtime.agent.ensureAgentWorkspace(cfg);
// Einen eingebetteten Agentenzug ausführen
// Einen eingebetteten Agent-Durchlauf ausführen
const agentDir = api.runtime.agent.resolveAgentDir(cfg);
const result = await api.runtime.agent.runEmbeddedAgent({
sessionId: "my-plugin:task-1",
@ -69,13 +68,11 @@ const result = await api.runtime.agent.runEmbeddedAgent({
});
```
`runEmbeddedAgent(...)` ist die neutrale Hilfsfunktion zum Starten eines normalen OpenClaw-
Agentenzugs aus Plugin-Code. Sie verwendet dieselbe Auflösung von Provider/Modell und
dieselbe Auswahl des Agent-Harness wie kanalgetriggerte Antworten.
`runEmbeddedAgent(...)` ist der neutrale Helfer zum Starten eines normalen OpenClaw-Agent-Durchlaufs aus Plugin-Code. Er verwendet dieselbe Provider-/Modellauflösung und dieselbe Agent-Harness-Auswahl wie kanalgetriggerte Antworten.
`runEmbeddedPiAgent(...)` bleibt als Kompatibilitätsalias bestehen.
`runEmbeddedPiAgent(...)` bleibt als Kompatibilitätsalias erhalten.
**Hilfsfunktionen für den Sitzungsspeicher** befinden sich unter `api.runtime.agent.session`:
**Sitzungsspeicher-Helfer** befinden sich unter `api.runtime.agent.session`:
```typescript
const storePath = api.runtime.agent.session.resolveStorePath(cfg);
@ -107,7 +104,7 @@ const { runId } = await api.runtime.subagent.run({
deliver: false,
});
// Auf den Abschluss warten
// Auf Abschluss warten
const result = await api.runtime.subagent.waitForRun({ runId, timeoutMs: 30000 });
// Sitzungsnachrichten lesen
@ -123,15 +120,14 @@ await api.runtime.subagent.deleteSession({
```
<Warning>
Modellüberschreibungen (`provider`/`model`) erfordern ein Opt-in des Operators über
Modellüberschreibungen (`provider`/`model`) erfordern eine ausdrückliche Freigabe durch den Operator über
`plugins.entries.<id>.subagent.allowModelOverride: true` in der Konfiguration.
Nicht vertrauenswürdige Plugins können weiterhin Subagents ausführen, aber Überschreibungsanfragen werden abgelehnt.
</Warning>
### `api.runtime.taskFlow`
Eine Task-Flow-Laufzeit an einen vorhandenen OpenClaw-Sitzungsschlüssel oder einen vertrauenswürdigen Tool-
Kontext binden und dann Task Flows erstellen und verwalten, ohne bei jedem Aufruf einen Owner zu übergeben.
Eine TaskFlow-Runtime an einen vorhandenen OpenClaw-Sitzungsschlüssel oder einen vertrauenswürdigen Tool-Kontext binden und dann TaskFlows erstellen und verwalten, ohne bei jedem Aufruf einen Eigentümer zu übergeben.
```typescript
const taskFlow = api.runtime.taskFlow.fromToolContext(ctx);
@ -158,9 +154,7 @@ const waiting = taskFlow.setWaiting({
});
```
Verwenden Sie `bindSession({ sessionKey, requesterOrigin })`, wenn Sie bereits einen
vertrauenswürdigen OpenClaw-Sitzungsschlüssel aus Ihrer eigenen Bindungsschicht haben. Binden Sie nicht aus roher
Benutzereingabe.
Verwenden Sie `bindSession({ sessionKey, requesterOrigin })`, wenn Sie bereits einen vertrauenswürdigen OpenClaw-Sitzungsschlüssel aus Ihrer eigenen Bindungsschicht haben. Binden Sie nicht aus rohen Benutzereingaben.
### `api.runtime.tts`
@ -186,8 +180,7 @@ const voices = await api.runtime.tts.listVoices({
});
```
Verwendet die Core-Konfiguration `messages.tts` und die Providerauswahl. Gibt einen PCM-Audio-
Puffer + Samplerate zurück.
Verwendet die Core-Konfiguration `messages.tts` und die Providerauswahl. Gibt einen PCM-Audiopuffer plus Abtastrate zurück.
### `api.runtime.mediaUnderstanding`
@ -205,7 +198,7 @@ const image = await api.runtime.mediaUnderstanding.describeImageFile({
const { text } = await api.runtime.mediaUnderstanding.transcribeAudioFile({
filePath: "/tmp/inbound-audio.ogg",
cfg: api.config,
mime: "audio/ogg", // optional, wenn MIME nicht abgeleitet werden kann
mime: "audio/ogg", // optional, wenn der MIME-Typ nicht abgeleitet werden kann
});
// Ein Video beschreiben
@ -221,11 +214,11 @@ const result = await api.runtime.mediaUnderstanding.runFile({
});
```
Gibt `{ text: undefined }` zurück, wenn keine Ausgabe erzeugt wird (z. B. bei übersprungener Eingabe).
Gibt `{ text: undefined }` zurück, wenn keine Ausgabe erzeugt wird (z. B. bei übersprungenen Eingaben).
<Info>
`api.runtime.stt.transcribeAudioFile(...)` bleibt als Kompatibilitätsalias
für `api.runtime.mediaUnderstanding.transcribeAudioFile(...)` bestehen.
`api.runtime.stt.transcribeAudioFile(...)` bleibt als Kompatibilitätsalias für
`api.runtime.mediaUnderstanding.transcribeAudioFile(...)` erhalten.
</Info>
### `api.runtime.imageGeneration`
@ -256,7 +249,7 @@ const result = await api.runtime.webSearch.search({
### `api.runtime.media`
Low-Level-Medien-Hilfsfunktionen.
Low-Level-Medienwerkzeuge.
```typescript
const webMedia = await api.runtime.media.loadWebMedia(url);
@ -278,7 +271,7 @@ await api.runtime.config.writeConfigFile(cfg);
### `api.runtime.system`
Hilfsfunktionen auf Systemebene.
Dienstprogramme auf Systemebene.
```typescript
await api.runtime.system.enqueueSystemEvent(event);
@ -302,7 +295,7 @@ api.runtime.events.onSessionTranscriptUpdate((update) => {
### `api.runtime.logging`
Logging.
Protokollierung.
```typescript
const verbose = api.runtime.logging.shouldLogVerbose();
@ -311,7 +304,7 @@ const childLogger = api.runtime.logging.getChildLogger({ plugin: "my-plugin" },
### `api.runtime.modelAuth`
Auflösung von Modell- und Provider-Auth.
Auflösung der Authentifizierung für Modell und Provider.
```typescript
const auth = await api.runtime.modelAuth.getApiKeyForModel({ model, cfg });
@ -323,7 +316,7 @@ const providerAuth = await api.runtime.modelAuth.resolveApiKeyForProvider({
### `api.runtime.state`
Auflösung des State-Verzeichnisses.
Auflösung des Statusverzeichnisses.
```typescript
const stateDir = api.runtime.state.resolveStateDir();
@ -331,7 +324,7 @@ const stateDir = api.runtime.state.resolveStateDir();
### `api.runtime.tools`
Factories und CLI für Memory-Tools.
Active Memory-Toolfabriken und CLI.
```typescript
const getTool = api.runtime.tools.createMemoryGetTool(/* ... */);
@ -341,10 +334,9 @@ api.runtime.tools.registerMemoryCli(/* ... */);
### `api.runtime.channel`
Kanalspezifische Laufzeit-Hilfsfunktionen (verfügbar, wenn ein Kanal-Plugin geladen ist).
Kanalspezifische Runtime-Helfer (verfügbar, wenn ein Channel-Plugin geladen ist).
`api.runtime.channel.mentions` ist die gemeinsame Oberfläche für die Mention-Richtlinie bei eingehenden Nachrichten für
gebündelte Kanal-Plugins, die Laufzeitinjektion verwenden:
`api.runtime.channel.mentions` ist die gemeinsame Oberfläche für die Erwähnungsrichtlinie bei eingehenden Nachrichten für gebündelte Channel-Plugins, die Runtime-Injektion verwenden:
```typescript
const mentionMatch = api.runtime.channel.mentions.matchesMentionWithExplicit(text, {
@ -371,7 +363,7 @@ const decision = api.runtime.channel.mentions.resolveInboundMentionDecision({
});
```
Verfügbare Mention-Hilfsfunktionen:
Verfügbare Erwähnungshelfer:
- `buildMentionRegexes`
- `matchesMentionPatterns`
@ -379,20 +371,20 @@ Verfügbare Mention-Hilfsfunktionen:
- `implicitMentionKindWhen`
- `resolveInboundMentionDecision`
`api.runtime.channel.mentions` stellt absichtlich nicht die älteren
Kompatibilitäts-Hilfsfunktionen `resolveMentionGating*` bereit. Bevorzugen Sie den normalisierten
Pfad `{ facts, policy }`.
`api.runtime.channel.mentions` stellt die älteren Kompatibilitätshelfer `resolveMentionGating*` absichtlich nicht bereit. Bevorzugen Sie den normalisierten Pfad `{ facts, policy }`.
## Laufzeitreferenzen speichern
## Runtime-Referenzen speichern
Verwenden Sie `createPluginRuntimeStore`, um die Laufzeitreferenz für die Nutzung außerhalb
des `register`-Callbacks zu speichern:
Verwenden Sie `createPluginRuntimeStore`, um die Runtime-Referenz zur Verwendung außerhalb des Callbacks `register` zu speichern:
```typescript
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
import type { PluginRuntime } from "openclaw/plugin-sdk/runtime-store";
const store = createPluginRuntimeStore<PluginRuntime>("my-plugin runtime not initialized");
const store = createPluginRuntimeStore<PluginRuntime>({
pluginId: "my-plugin",
errorMessage: "my-plugin runtime not initialized",
});
// In Ihrem Einstiegspunkt
export default defineChannelPluginEntry({
@ -405,7 +397,7 @@ export default defineChannelPluginEntry({
// In anderen Dateien
export function getRuntime() {
return store.getRuntime(); // wirft einen Fehler, wenn nicht initialisiert
return store.getRuntime(); // löst einen Fehler aus, wenn nicht initialisiert
}
export function tryGetRuntime() {
@ -413,22 +405,24 @@ export function tryGetRuntime() {
}
```
Bevorzugen Sie `pluginId` für die Identität des Runtime-Store. Die Low-Level-Form `key` ist für ungewöhnliche Fälle gedacht, in denen ein Plugin absichtlich mehr als einen Runtime-Slot benötigt.
## Andere Top-Level-Felder in `api`
Zusätzlich zu `api.runtime` stellt das API-Objekt außerdem Folgendes bereit:
Zusätzlich zu `api.runtime` stellt das API-Objekt auch Folgendes bereit:
| Feld | Typ | Beschreibung |
| ------------------------ | ------------------------- | ------------------------------------------------------------------------------------------- |
| `api.id` | `string` | Plugin-ID |
| `api.name` | `string` | Anzeigename des Plugins |
| `api.config` | `OpenClawConfig` | Aktueller Konfigurations-Snapshot (aktiver In-Memory-Laufzeit-Snapshot, wenn verfügbar) |
| `api.pluginConfig` | `Record<string, unknown>` | Pluginspezifische Konfiguration aus `plugins.entries.<id>.config` |
| `api.logger` | `PluginLogger` | Bereichsspezifischer Logger (`debug`, `info`, `warn`, `error`) |
| `api.config` | `OpenClawConfig` | Aktueller Konfigurations-Snapshot (aktiver In-Memory-Runtime-Snapshot, wenn verfügbar) |
| `api.pluginConfig` | `Record<string, unknown>` | Plugin-spezifische Konfiguration aus `plugins.entries.<id>.config` |
| `api.logger` | `PluginLogger` | Bereichsbezogener Logger (`debug`, `info`, `warn`, `error`) |
| `api.registrationMode` | `PluginRegistrationMode` | Aktueller Lademodus; `"setup-runtime"` ist das leichtgewichtige Startup-/Setup-Fenster vor dem vollständigen Entry |
| `api.resolvePath(input)` | `(string) => string` | Einen Pfad relativ zum Plugin-Root auflösen |
## Verwandt
- [SDK Overview](/de/plugins/sdk-overview) -- Referenz für Subpaths
- [SDK Entry Points](/de/plugins/sdk-entrypoints) -- Optionen für `definePluginEntry`
- [Plugin Internals](/de/plugins/architecture) -- Fähigkeitsmodell und Registry
- [SDK-Überblick](/de/plugins/sdk-overview) -- Subpath-Referenz
- [SDK-Einstiegspunkte](/de/plugins/sdk-entrypoints) -- Optionen für `definePluginEntry`
- [Plugin-Interna](/de/plugins/architecture) -- Fähigkeitsmodell und Registry

View File

@ -1,35 +1,35 @@
---
read_when:
- Sie fügen einem Plugin einen Setup-Assistenten hinzu
- Sie müssen den Unterschied zwischen setup-entry.ts und index.ts verstehen
- Sie definieren Plugin-Konfigurationsschemas oder openclaw-Metadaten in package.json
- Du fügst einem Plugin einen Einrichtungsassistenten hinzu.
- Du musst `setup-entry.ts` im Vergleich zu `index.ts` verstehen.
- Du definierst Plugin-Konfigurationsschemata oder `package.json`-`openclaw`-Metadaten.
sidebarTitle: Setup and Config
summary: Setup-Assistenten, setup-entry.ts, Konfigurationsschemas und package.json-Metadaten
title: Plugin-Setup und Konfiguration
summary: Einrichtungsassistenten, setup-entry.ts, Konfigurationsschemata und package.json-Metadaten
title: Plugin-Einrichtung und -Konfiguration
x-i18n:
generated_at: "2026-04-06T03:10:48Z"
generated_at: "2026-04-15T19:42:33Z"
model: gpt-5.4
provider: openai
source_hash: eac2586516d27bcd94cc4c259fe6274c792b3f9938c7ddd6dbf04a6dbb988dc9
source_hash: ddf28e25e381a4a38ac478e531586f59612e1a278732597375f87c2eeefc521b
source_path: plugins/sdk-setup.md
workflow: 15
---
# Plugin-Setup und Konfiguration
# Plugin-Einrichtung und -Konfiguration
Referenz für Plugin-Paketierung (`package.json`-Metadaten), Manifeste
(`openclaw.plugin.json`), Setup-Einträge und Konfigurationsschemas.
(`openclaw.plugin.json`), Setup-Einstiegspunkte und Konfigurationsschemata.
<Tip>
**Suchen Sie nach einer Schritt-für-Schritt-Anleitung?** Die How-to-Anleitungen behandeln Paketierung im Kontext:
[Kanal-Plugins](/de/plugins/sdk-channel-plugins#step-1-package-and-manifest) und
[Provider-Plugins](/de/plugins/sdk-provider-plugins#step-1-package-and-manifest).
**Suchst du nach einer Schritt-für-Schritt-Anleitung?** Die How-to-Guides behandeln die Paketierung im Kontext:
[Channel Plugins](/de/plugins/sdk-channel-plugins#step-1-package-and-manifest) und
[Provider Plugins](/de/plugins/sdk-provider-plugins#step-1-package-and-manifest).
</Tip>
## Paketmetadaten
## Paket-Metadaten
Ihre `package.json` benötigt ein Feld `openclaw`, das dem Plugin-System mitteilt, was
Ihr Plugin bereitstellt:
Deine `package.json` benötigt ein `openclaw`-Feld, das dem Plugin-System mitteilt,
was dein Plugin bereitstellt:
**Kanal-Plugin:**
@ -50,7 +50,7 @@ Ihr Plugin bereitstellt:
}
```
**Provider-Plugin / ClawHub-Veröffentlichungsbaseline:**
**Provider Plugin / ClawHub-Veröffentlichungsbasis:**
```json openclaw-clawhub-package.json
{
@ -71,47 +71,47 @@ Ihr Plugin bereitstellt:
}
```
Wenn Sie das Plugin extern auf ClawHub veröffentlichen, sind diese Felder `compat` und `build`
erforderlich. Die kanonischen Snippets für die Veröffentlichung finden Sie in
Wenn du das Plugin extern auf ClawHub veröffentlichst, sind diese `compat`- und `build`-
Felder erforderlich. Die kanonischen Veröffentlichungs-Snippets befinden sich in
`docs/snippets/plugin-publish/`.
### `openclaw`-Felder
| Feld | Typ | Beschreibung |
| ------------ | ---------- | -------------------------------------------------------------------------------------------------------- |
| `extensions` | `string[]` | Einstiegspunktdateien (relativ zum Paketstamm) |
| `setupEntry` | `string` | Leichtgewichtiger Einstiegspunkt nur für Setup (optional) |
| `channel` | `object` | Metadaten des Kanalkatalogs für Setup, Picker, Quickstart- und Statusoberflächen |
| `providers` | `string[]` | Provider-IDs, die von diesem Plugin registriert werden |
| Feld | Typ | Beschreibung |
| ------------ | ---------- | ------------------------------------------------------------------------------------------------------ |
| `extensions` | `string[]` | Einstiegspunktdateien (relativ zum Paketstamm) |
| `setupEntry` | `string` | Leichtgewichtiger, nur für das Setup verwendeter Einstiegspunkt (optional) |
| `channel` | `object` | Kanal-Katalogmetadaten für Setup-, Auswahl-, Schnellstart- und Status-Oberflächen |
| `providers` | `string[]` | Provider-IDs, die von diesem Plugin registriert werden |
| `install` | `object` | Installationshinweise: `npmSpec`, `localPath`, `defaultChoice`, `minHostVersion`, `allowInvalidConfigRecovery` |
| `startup` | `object` | Flags für das Startverhalten |
| `startup` | `object` | Flags für das Startverhalten |
### `openclaw.channel`
`openclaw.channel` sind kostengünstige Paketmetadaten für Kanalerkennung und Setup-
Oberflächen, bevor die Laufzeit geladen wird.
`openclaw.channel` sind kostengünstige Paket-Metadaten für die Kanalerkennung und
Setup-Oberflächen, bevor die Laufzeit geladen wird.
| Feld | Typ | Bedeutung |
| -------------------------------------- | ---------- | -------------------------------------------------------------------------------- |
| `id` | `string` | Kanonische Kanal-ID. |
| `label` | `string` | Primäre Kanalbezeichnung. |
| `selectionLabel` | `string` | Bezeichnung für Picker/Setup, wenn sie sich von `label` unterscheiden soll. |
| `detailLabel` | `string` | Sekundäre Detailbezeichnung für umfangreichere Kanalkataloge und Statusoberflächen. |
| `docsPath` | `string` | Docs-Pfad für Setup- und Auswahllinks. |
| `docsLabel` | `string` | Überschreibungsbezeichnung für Docs-Links, wenn sie sich von der Kanal-ID unterscheiden soll. |
| `blurb` | `string` | Kurze Beschreibung für Onboarding/Katalog. |
| `order` | `number` | Sortierreihenfolge in Kanalkatalogen. |
| `aliases` | `string[]` | Zusätzliche Lookup-Aliasse für die Kanalauswahl. |
| `preferOver` | `string[]` | Plugin-/Kanal-IDs mit niedrigerer Priorität, die dieser Kanal übertreffen soll. |
| `systemImage` | `string` | Optionaler Symbol-/Systembildname für Kanal-UI-Kataloge. |
| `selectionDocsPrefix` | `string` | Präfixtext vor Docs-Links in Auswahloberflächen. |
| `selectionDocsOmitLabel` | `boolean` | Zeigt den Docs-Pfad direkt anstelle eines beschrifteten Docs-Links im Auswahltext. |
| `selectionExtras` | `string[]` | Zusätzliche kurze Zeichenfolgen, die im Auswahltext angehängt werden. |
| `markdownCapable` | `boolean` | Markiert den Kanal als markdownfähig für Entscheidungen zur ausgehenden Formatierung. |
| `exposure` | `object` | Steuerung der Kanalsichtbarkeit für Setup, konfigurierte Listen und Docs-Oberflächen. |
| `quickstartAllowFrom` | `boolean` | Meldet diesen Kanal für den standardmäßigen Quickstart-`allowFrom`-Setup-Ablauf an. |
| `forceAccountBinding` | `boolean` | Erzwingt explizites Account-Binding, selbst wenn nur ein Konto existiert. |
| `preferSessionLookupForAnnounceTarget` | `boolean` | Bevorzugt Session-Lookup beim Auflösen von Ankündigungszielen für diesen Kanal. |
| Feld | Typ | Bedeutung |
| -------------------------------------- | ---------- | ------------------------------------------------------------------------------ |
| `id` | `string` | Kanonische Kanal-ID. |
| `label` | `string` | Primäre Kanalbezeichnung. |
| `selectionLabel` | `string` | Bezeichnung für Auswahl/Setup, wenn sie sich von `label` unterscheiden soll. |
| `detailLabel` | `string` | Sekundäre Detailbezeichnung für umfangreichere Kanalkataloge und Statusansichten. |
| `docsPath` | `string` | Dokumentationspfad für Setup- und Auswahllinks. |
| `docsLabel` | `string` | Überschriebene Bezeichnung für Dokumentationslinks, wenn sie sich von der Kanal-ID unterscheiden soll. |
| `blurb` | `string` | Kurze Beschreibung für Onboarding/Katalog. |
| `order` | `number` | Sortierreihenfolge in Kanalkatalogen. |
| `aliases` | `string[]` | Zusätzliche Suchaliase für die Kanalauswahl. |
| `preferOver` | `string[]` | IDs von Plugins/Kanälen mit niedrigerer Priorität, die von diesem Kanal übertroffen werden sollen. |
| `systemImage` | `string` | Optionaler Symbol-/Systembildname für Kanal-UI-Kataloge. |
| `selectionDocsPrefix` | `string` | Präfixtext vor Dokumentationslinks in Auswahloberflächen. |
| `selectionDocsOmitLabel` | `boolean` | Zeigt den Dokumentationspfad direkt anstelle eines beschrifteten Dokumentationslinks im Auswahltext an. |
| `selectionExtras` | `string[]` | Zusätzliche kurze Zeichenfolgen, die im Auswahltext angehängt werden. |
| `markdownCapable` | `boolean` | Kennzeichnet den Kanal als Markdown-fähig für Entscheidungen zur ausgehenden Formatierung. |
| `exposure` | `object` | Sichtbarkeitssteuerung des Kanals für Setup-, konfigurierte Listen- und Dokumentationsoberflächen. |
| `quickstartAllowFrom` | `boolean` | Nimmt diesen Kanal in den standardmäßigen Schnellstart-`allowFrom`-Setup-Ablauf auf. |
| `forceAccountBinding` | `boolean` | Erzwingt explizite Kontobindung, selbst wenn nur ein Konto vorhanden ist. |
| `preferSessionLookupForAnnounceTarget` | `boolean` | Bevorzugt die Sitzungssuche beim Auflösen von Ankündigungszielen für diesen Kanal. |
Beispiel:
@ -145,37 +145,37 @@ Beispiel:
`exposure` unterstützt:
- `configured`: schließt den Kanal in Oberflächen für konfigurierte/statusartige Listen ein
- `setup`: schließt den Kanal in interaktive Setup-/Konfigurations-Picker ein
- `docs`: markiert den Kanal als öffentlich sichtbar in Docs-/Navigationsoberflächen
- `configured`: nimmt den Kanal in konfigurierte/statusartige Listenoberflächen auf
- `setup`: nimmt den Kanal in interaktive Setup-/Konfigurationsauswahlen auf
- `docs`: markiert den Kanal als öffentlich sichtbar in Dokumentations-/Navigationsoberflächen
`showConfigured` und `showInSetup` werden weiterhin als veraltete Aliasse unterstützt. Bevorzugen Sie
`showConfigured` und `showInSetup` werden weiterhin als Legacy-Aliase unterstützt. Bevorzuge
`exposure`.
### `openclaw.install`
`openclaw.install` sind Paketmetadaten, keine Manifestmetadaten.
`openclaw.install` sind Paket-Metadaten, keine Manifest-Metadaten.
| Feld | Typ | Bedeutung |
| ---------------------------- | -------------------- | -------------------------------------------------------------------------------- |
| `npmSpec` | `string` | Kanonische npm-Spezifikation für Installations-/Aktualisierungsabläufe. |
| `localPath` | `string` | Lokaler Entwicklungs- oder gebündelter Installationspfad. |
| `defaultChoice` | `"npm"` \| `"local"` | Bevorzugte Installationsquelle, wenn beide verfügbar sind. |
| `minHostVersion` | `string` | Mindestunterstützte OpenClaw-Version in der Form `>=x.y.z`. |
| `allowInvalidConfigRecovery` | `boolean` | Ermöglicht Reinstallationsabläufen für gebündelte Plugins die Wiederherstellung nach bestimmten veralteten Konfigurationsfehlern. |
| Feld | Typ | Bedeutung |
| ---------------------------- | -------------------- | ------------------------------------------------------------------------------- |
| `npmSpec` | `string` | Kanonische npm-Spezifikation für Installations-/Update-Abläufe. |
| `localPath` | `string` | Lokaler Entwicklungs- oder gebündelter Installationspfad. |
| `defaultChoice` | `"npm"` \| `"local"` | Bevorzugte Installationsquelle, wenn beide verfügbar sind. |
| `minHostVersion` | `string` | Minimal unterstützte OpenClaw-Version im Format `>=x.y.z`. |
| `allowInvalidConfigRecovery` | `boolean` | Ermöglicht es Neuinstallationsabläufen gebündelter Plugins, sich von bestimmten Fehlern mit veralteter Konfiguration zu erholen. |
Wenn `minHostVersion` gesetzt ist, erzwingen sowohl Installation als auch das Laden der Manifest-
Registry diese. Ältere Hosts überspringen das Plugin; ungültige Versionszeichenfolgen werden abgelehnt.
Wenn `minHostVersion` gesetzt ist, erzwingen sowohl die Installation als auch das Laden der Manifest-Registry
diese Angabe. Ältere Hosts überspringen das Plugin; ungültige Versionszeichenfolgen werden abgelehnt.
`allowInvalidConfigRecovery` ist keine allgemeine Umgehung für fehlerhafte Konfigurationen. Es ist
nur für eng gefasste Wiederherstellung gebündelter Plugins gedacht, damit Reinstallation/Setup bekannte Upgrade-
Überbleibsel wie einen fehlenden Pfad zu einem gebündelten Plugin oder einen veralteten Eintrag `channels.<id>`
für dasselbe Plugin reparieren können. Wenn die Konfiguration aus anderen Gründen fehlerhaft ist,
schlägt die Installation weiterhin fehlgeschlossen fehl und weist den Operator an, `openclaw doctor --fix` auszuführen.
nur für die gezielte Wiederherstellung gebündelter Plugins gedacht, damit Neuinstallation/Setup bekannte
Upgrade-Überbleibsel reparieren können, wie einen fehlenden gebündelten Plugin-Pfad oder einen veralteten
`channels.<id>`-Eintrag für genau dieses Plugin. Wenn die Konfiguration aus anderen Gründen fehlerhaft ist,
schlägt die Installation weiterhin sicher fehl und weist den Operator an, `openclaw doctor --fix` auszuführen.
### Verzögertes vollständiges Laden
### Aufgeschobenes vollständiges Laden
Kanal-Plugins können sich mit Folgendem für verzögertes Laden anmelden:
Kanal-Plugins können sich mit Folgendem für aufgeschobenes Laden entscheiden:
```json
{
@ -189,26 +189,26 @@ Kanal-Plugins können sich mit Folgendem für verzögertes Laden anmelden:
}
```
Wenn dies aktiviert ist, lädt OpenClaw in der Startphase vor `listen`
nur `setupEntry`, selbst für bereits konfigurierte Kanäle. Der vollständige Einstiegspunkt wird geladen, nachdem das
Gateway mit dem Lauschen begonnen hat.
Wenn dies aktiviert ist, lädt OpenClaw in der Startphase vor `listen` nur `setupEntry`,
selbst für bereits konfigurierte Kanäle. Der vollständige Einstiegspunkt wird geladen, nachdem das
Gateway begonnen hat zu lauschen.
<Warning>
Aktivieren Sie verzögertes Laden nur dann, wenn Ihr `setupEntry` alles registriert, was das
Gateway benötigt, bevor es mit dem Lauschen beginnt (Kanalregistrierung, HTTP-Routen,
Gateway-Methoden). Wenn der vollständige Einstiegspunkt erforderliche Startfähigkeiten besitzt, behalten Sie
das Standardverhalten bei.
Aktiviere aufgeschobenes Laden nur, wenn dein `setupEntry` alles registriert, was das
Gateway benötigt, bevor es beginnt zu lauschen (Kanalregistrierung, HTTP-Routen,
Gateway-Methoden). Wenn der vollständige Einstiegspunkt erforderliche Startfähigkeiten besitzt,
behalte das Standardverhalten bei.
</Warning>
Wenn Ihr Setup-/Voll-Einstiegspunkt Gateway-RPC-Methoden registriert, behalten Sie sie auf einem
plugin-spezifischen Präfix. Reservierte Admin-Namespaces des Kerns (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) bleiben im Besitz des Kerns und werden immer zu
`operator.admin` aufgelöst.
Wenn dein Setup-/vollständiger Einstiegspunkt Gateway-RPC-Methoden registriert, halte sie auf einem
Plugin-spezifischen Präfix. Reservierte Core-Admin-Namespaces (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) bleiben im Besitz des Core und werden immer
zu `operator.admin` aufgelöst.
## Plugin-Manifest
Jedes native Plugin muss ein `openclaw.plugin.json` im Paketstamm mitliefern.
OpenClaw verwendet dies, um Konfiguration zu validieren, ohne Plugin-Code auszuführen.
Jedes native Plugin muss im Paketstamm ein `openclaw.plugin.json` enthalten.
OpenClaw verwendet dies, um die Konfiguration zu validieren, ohne Plugin-Code auszuführen.
```json
{
@ -228,7 +228,7 @@ OpenClaw verwendet dies, um Konfiguration zu validieren, ohne Plugin-Code auszuf
}
```
Für Kanal-Plugins fügen Sie `kind` und `channels` hinzu:
Für Kanal-Plugins füge `kind` und `channels` hinzu:
```json
{
@ -243,7 +243,7 @@ Für Kanal-Plugins fügen Sie `kind` und `channels` hinzu:
}
```
Selbst Plugins ohne Konfiguration müssen ein Schema mitliefern. Ein leeres Schema ist gültig:
Selbst Plugins ohne Konfiguration müssen ein Schema enthalten. Ein leeres Schema ist gültig:
```json
{
@ -255,24 +255,24 @@ Selbst Plugins ohne Konfiguration müssen ein Schema mitliefern. Ein leeres Sche
}
```
Die vollständige Schemareferenz finden Sie unter [Plugin Manifest](/de/plugins/manifest).
Siehe [Plugin Manifest](/de/plugins/manifest) für die vollständige Schemareferenz.
## ClawHub-Veröffentlichung
Für Plugin-Pakete verwenden Sie den paketspezifischen ClawHub-Befehl:
Verwende für Plugin-Pakete den paket-spezifischen ClawHub-Befehl:
```bash
clawhub package publish your-org/your-plugin --dry-run
clawhub package publish your-org/your-plugin
```
Der veraltete Alias für die Veröffentlichung nur von Skills ist für Skills gedacht. Plugin-Pakete sollten
Der ältere, nur auf Skills bezogene Veröffentlichungsalias ist für Skills. Plugin-Pakete sollten
immer `clawhub package publish` verwenden.
## Setup-Eintrag
## Setup-Einstiegspunkt
Die Datei `setup-entry.ts` ist eine leichtgewichtige Alternative zu `index.ts`, die
OpenClaw lädt, wenn es nur Setup-Oberflächen benötigt (Onboarding, Konfigurationsreparatur,
OpenClaw lädt, wenn nur Setup-Oberflächen benötigt werden (Onboarding, Konfigurationsreparatur,
Inspektion deaktivierter Kanäle).
```typescript
@ -283,75 +283,82 @@ import { myChannelPlugin } from "./src/channel.js";
export default defineSetupPluginEntry(myChannelPlugin);
```
Dadurch wird vermieden, während Setup-Abläufen schweren Laufzeitcode zu laden (Kryptobibliotheken, CLI-Registrierungen,
Hintergrunddienste).
Dadurch wird vermieden, schwere Laufzeitkomponenten (Kryptobibliotheken, CLI-Registrierungen,
Hintergrunddienste) während Setup-Abläufen zu laden.
**Wann OpenClaw `setupEntry` statt des vollständigen Einstiegspunkts verwendet:**
Gebündelte Workspace-Kanäle, die setup-sichere Exporte in Sidecar-Modulen behalten, können
`defineBundledChannelSetupEntry(...)` aus
`openclaw/plugin-sdk/channel-entry-contract` anstelle von
`defineSetupPluginEntry(...)` verwenden. Dieser gebündelte Vertrag unterstützt auch einen optionalen
`runtime`-Export, damit die Laufzeitverdrahtung zur Setup-Zeit leichtgewichtig und explizit bleiben kann.
**Wann OpenClaw `setupEntry` anstelle des vollständigen Einstiegspunkts verwendet:**
- Der Kanal ist deaktiviert, benötigt aber Setup-/Onboarding-Oberflächen
- Der Kanal ist aktiviert, aber nicht konfiguriert
- Verzögertes Laden ist aktiviert (`deferConfiguredChannelFullLoadUntilAfterListen`)
- Aufgeschobenes Laden ist aktiviert (`deferConfiguredChannelFullLoadUntilAfterListen`)
**Was `setupEntry` registrieren muss:**
- Das Kanal-Plugin-Objekt (über `defineSetupPluginEntry`)
- Alle HTTP-Routen, die vor dem Gateway-`listen` erforderlich sind
- Alle HTTP-Routen, die vor dem Lauschen des Gateways erforderlich sind
- Alle Gateway-Methoden, die beim Start benötigt werden
Diese Gateway-Methoden beim Start sollten weiterhin reservierte Admin-
Namespaces des Kerns wie `config.*` oder `update.*` vermeiden.
Diese Gateway-Methoden für den Start sollten weiterhin reservierte Core-Admin-
Namespaces wie `config.*` oder `update.*` vermeiden.
**Was `setupEntry` NICHT enthalten sollte:**
- CLI-Registrierungen
- Hintergrunddienste
- Schwere Laufzeitimporte (Krypto, SDKs)
- Schwere Laufzeitimporte (Kryptografie, SDKs)
- Gateway-Methoden, die erst nach dem Start benötigt werden
### Enge Importe von Setup-Hilfen
### Schmale Importe für Setup-Hilfsfunktionen
Für heiße Pfade nur für Setup bevorzugen Sie die engen Helper-Seams für Setup gegenüber der breiteren
übergeordneten `plugin-sdk/setup`-Oberfläche, wenn Sie nur einen Teil der Setup-Oberfläche benötigen:
Für reine Setup-Hotpaths solltest du die schmalen Hilfsseams für das Setup dem breiteren
`plugin-sdk/setup`-Umbrella vorziehen, wenn du nur einen Teil der Setup-Oberfläche benötigst:
| Importpfad | Verwenden Sie ihn für | Wichtige Exporte |
| --------------------------------- | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `plugin-sdk/setup-runtime` | laufzeitsichere Setup-Hilfen, die in `setupEntry` / beim verzögerten Kanalstart verfügbar bleiben | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
| `plugin-sdk/setup-adapter-runtime` | umgebungsbewusste Account-Setup-Adapter | `createEnvPatchedAccountSetupAdapter` |
| `plugin-sdk/setup-tools` | CLI-/Archiv-/Docs-Hilfen für Setup/Installation | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
| Importpfad | Verwende ihn für | Wichtige Exporte |
| --------------------------------- | ---------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `plugin-sdk/setup-runtime` | Laufzeit-Hilfsfunktionen zur Setup-Zeit, die in `setupEntry` / beim aufgeschobenen Kanalstart verfügbar bleiben | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
| `plugin-sdk/setup-adapter-runtime` | umgebungsbewusste Account-Setup-Adapter | `createEnvPatchedAccountSetupAdapter` |
| `plugin-sdk/setup-tools` | CLI-/Archiv-/Dokumentations-Hilfsfunktionen für Setup/Installation | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
Verwenden Sie die breitere Naht `plugin-sdk/setup`, wenn Sie die vollständige gemeinsame Setup-
Werkzeugkiste möchten, einschließlich Hilfen für Konfigurations-Patches wie
Verwende den breiteren `plugin-sdk/setup`-Seam, wenn du die vollständige gemeinsame Setup-
Werkzeugkiste haben möchtest, einschließlich Hilfsfunktionen zum Patchen der Konfiguration wie
`moveSingleAccountChannelSectionToDefaultAccount(...)`.
Die Setup-Patch-Adapter bleiben beim Import für den Hot Path sicher. Ihr gebündeltes
Lookup der Vertragsoberfläche für Single-Account-Promotion ist lazy, sodass das Importieren von
`plugin-sdk/setup-runtime` die Discovery der gebündelten Vertragsoberfläche nicht eager lädt, bevor der Adapter tatsächlich verwendet wird.
Die Setup-Patch-Adapter bleiben beim Import hotpath-sicher. Ihr gebündeltes Nachschlagen der
Vertragsoberfläche für die Promotion eines Einzelkontos erfolgt lazy, sodass der Import von
`plugin-sdk/setup-runtime` die Erkennung gebündelter Vertragsoberflächen nicht vorzeitig lädt,
bevor der Adapter tatsächlich verwendet wird.
### Kanal-eigene Single-Account-Promotion
### Kanal-eigene Einzelkonto-Promotion
Wenn ein Kanal von einer Top-Level-Konfiguration für ein einzelnes Konto auf
`channels.<id>.accounts.*` aktualisiert wird, verschiebt das standardmäßige gemeinsame Verhalten die
hochgestuften kontobezogenen Werte nach `accounts.default`.
Wenn ein Kanal von einer Konfiguration auf oberster Ebene für ein Einzelkonto auf
`channels.<id>.accounts.*` umstellt, verschiebt das standardmäßige gemeinsame Verhalten die
promoteten konto-spezifischen Werte in `accounts.default`.
Gebündelte Kanäle können diese Promotion über ihre Setup-
Vertragsoberfläche eingrenzen oder überschreiben:
Gebündelte Kanäle können diese Promotion über ihre Setup-Vertragsoberfläche eingrenzen oder
überschreiben:
- `singleAccountKeysToMove`: zusätzliche Top-Level-Schlüssel, die in das
hochgestufte Konto verschoben werden sollen
- `singleAccountKeysToMove`: zusätzliche Schlüssel auf oberster Ebene, die in das
promotete Konto verschoben werden sollen
- `namedAccountPromotionKeys`: wenn bereits benannte Konten existieren, werden nur diese
Schlüssel in das hochgestufte Konto verschoben; gemeinsame Richtlinien-/Zustellungsschlüssel bleiben im
Kanalstamm
- `resolveSingleAccountPromotionTarget(...)`: wählt aus, welches vorhandene Konto
hochgestufte Werte erhält
Schlüssel in das promotete Konto verschoben; gemeinsame Richtlinien-/Zustellungsschlüssel
bleiben auf der Kanalwurzelebene
- `resolveSingleAccountPromotionTarget(...)`: wählt aus, welches vorhandene Konto die
promoteten Werte erhält
Matrix ist das aktuelle gebündelte Beispiel. Wenn genau ein benanntes Matrix-Konto
bereits existiert oder wenn `defaultAccount` auf einen vorhandenen nichtkanonischen Schlüssel
wie `Ops` zeigt, bewahrt die Promotion dieses Konto, statt einen neuen Eintrag
`accounts.default` zu erzeugen.
Matrix ist das aktuelle gebündelte Beispiel. Wenn bereits genau ein benanntes Matrix-Konto
existiert oder wenn `defaultAccount` auf einen vorhandenen nicht-kanonischen Schlüssel wie
`Ops` zeigt, bewahrt die Promotion dieses Konto, anstatt einen neuen Eintrag
`accounts.default` zu erstellen.
## Konfigurationsschema
Die Plugin-Konfiguration wird gegen das JSON-Schema in Ihrem Manifest validiert. Benutzer
Die Plugin-Konfiguration wird gegen das JSON-Schema in deinem Manifest validiert. Benutzer
konfigurieren Plugins über:
```json5
@ -368,9 +375,9 @@ konfigurieren Plugins über:
}
```
Ihr Plugin erhält diese Konfiguration während der Registrierung als `api.pluginConfig`.
Dein Plugin erhält diese Konfiguration während der Registrierung als `api.pluginConfig`.
Für kanalspezifische Konfiguration verwenden Sie stattdessen den Kanal-Konfigurationsabschnitt:
Verwende für kanal-spezifische Konfiguration stattdessen den Kanal-Konfigurationsabschnitt:
```json5
{
@ -383,10 +390,10 @@ Für kanalspezifische Konfiguration verwenden Sie stattdessen den Kanal-Konfigur
}
```
### Kanal-Konfigurationsschemas erstellen
### Kanal-Konfigurationsschemata erstellen
Verwenden Sie `buildChannelConfigSchema` aus `openclaw/plugin-sdk/core`, um ein
Zod-Schema in den Wrapper `ChannelConfigSchema` zu konvertieren, den OpenClaw validiert:
Verwende `buildChannelConfigSchema` aus `openclaw/plugin-sdk/core`, um ein
Zod-Schema in den `ChannelConfigSchema`-Wrapper umzuwandeln, den OpenClaw validiert:
```typescript
import { z } from "zod";
@ -402,10 +409,10 @@ const accountSchema = z.object({
const configSchema = buildChannelConfigSchema(accountSchema);
```
## Setup-Assistenten
## Einrichtungsassistenten
Kanal-Plugins können interaktive Setup-Assistenten für `openclaw onboard` bereitstellen.
Der Assistent ist ein Objekt `ChannelSetupWizard` auf dem `ChannelPlugin`:
Kanal-Plugins können interaktive Einrichtungsassistenten für `openclaw onboard` bereitstellen.
Der Assistent ist ein `ChannelSetupWizard`-Objekt auf dem `ChannelPlugin`:
```typescript
import type { ChannelSetupWizard } from "openclaw/plugin-sdk/channel-setup";
@ -440,20 +447,21 @@ const setupWizard: ChannelSetupWizard = {
Der Typ `ChannelSetupWizard` unterstützt `credentials`, `textInputs`,
`dmPolicy`, `allowFrom`, `groupAccess`, `prepare`, `finalize` und mehr.
Vollständige Beispiele finden Sie in gebündelten Plugin-Paketen (zum Beispiel im Discord-Plugin `src/channel.setup.ts`).
Siehe die gebündelten Plugin-Pakete (zum Beispiel das Discord-Plugin `src/channel.setup.ts`) für
vollständige Beispiele.
Für Abfragen der DM-Allowlist, die nur den Standardablauf
`note -> prompt -> parse -> merge -> patch` benötigen, bevorzugen Sie die gemeinsamen Setup-
Hilfen aus `openclaw/plugin-sdk/setup`: `createPromptParsedAllowFromForAccount(...)`,
Für DM-Allowlist-Abfragen, die nur den Standardablauf
`note -> prompt -> parse -> merge -> patch` benötigen, solltest du die gemeinsamen Setup-
Hilfsfunktionen aus `openclaw/plugin-sdk/setup` bevorzugen: `createPromptParsedAllowFromForAccount(...)`,
`createTopLevelChannelParsedAllowFromPrompt(...)` und
`createNestedChannelParsedAllowFromPrompt(...)`.
Für Statusblöcke des Kanal-Setups, die sich nur durch Bezeichnungen, Werte und optionale
zusätzliche Zeilen unterscheiden, bevorzugen Sie `createStandardChannelSetupStatus(...)` aus
`openclaw/plugin-sdk/setup`, statt in jedem Plugin dasselbe `status`-Objekt
von Hand zu erstellen.
Für Kanal-Setup-Statusblöcke, die sich nur in Bezeichnungen, Bewertungen und optionalen
zusätzlichen Zeilen unterscheiden, solltest du `createStandardChannelSetupStatus(...)` aus
`openclaw/plugin-sdk/setup` bevorzugen, anstatt in jedem Plugin dasselbe `status`-Objekt
von Hand zu bauen.
Für optionale Setup-Oberflächen, die nur in bestimmten Kontexten erscheinen sollen, verwenden Sie
Für optionale Setup-Oberflächen, die nur in bestimmten Kontexten erscheinen sollen, verwende
`createOptionalChannelSetupSurface` aus `openclaw/plugin-sdk/channel-setup`:
```typescript
@ -468,52 +476,52 @@ const setupSurface = createOptionalChannelSetupSurface({
// Returns { setupAdapter, setupWizard }
```
`plugin-sdk/channel-setup` exportiert auch die Low-Level-Builder
`plugin-sdk/channel-setup` stellt außerdem die Low-Level-Builder
`createOptionalChannelSetupAdapter(...)` und
`createOptionalChannelSetupWizard(...)`, wenn Sie nur eine Hälfte
dieser Oberfläche für optionale Installation benötigen.
`createOptionalChannelSetupWizard(...)` bereit, wenn du nur eine Hälfte
dieser optionalen Installationsoberfläche benötigst.
Der erzeugte optionale Adapter/Assistent schlägt bei echten Konfigurationsschreibvorgängen fehlgeschlossen fehl. Er
verwendet eine einzige Meldung „Installation erforderlich“ über `validateInput`,
`applyAccountConfig` und `finalize` hinweg wieder und hängt einen Docs-Link an, wenn `docsPath`
Der generierte optionale Adapter/Assistent schlägt bei echten Konfigurationsschreibvorgängen sicher fehl. Sie
verwenden dieselbe Meldung „Installation erforderlich“ in `validateInput`,
`applyAccountConfig` und `finalize` wieder und hängen einen Dokumentationslink an, wenn `docsPath`
gesetzt ist.
Für binär gestützte Setup-UIs bevorzugen Sie die gemeinsamen delegierten Hilfen, statt
denselben Binär-/Status-Klebstoff in jeden Kanal zu kopieren:
Für binärgestützte Setup-UIs solltest du die gemeinsamen delegierten Hilfsfunktionen bevorzugen,
anstatt dieselbe Binär-/Status-Logik in jeden Kanal zu kopieren:
- `createDetectedBinaryStatus(...)` für Statusblöcke, die sich nur nach Bezeichnungen,
Hinweisen, Werten und Binärerkennung unterscheiden
Hinweisen, Bewertungen und Binärerkennung unterscheiden
- `createCliPathTextInput(...)` für pfadgestützte Texteingaben
- `createDelegatedSetupWizardStatusResolvers(...)`,
`createDelegatedPrepare(...)`, `createDelegatedFinalize(...)` und
`createDelegatedResolveConfigured(...)`, wenn `setupEntry` lazy an einen
schwereren vollständigen Assistenten weiterleiten muss
- `createDelegatedTextInputShouldPrompt(...)`, wenn `setupEntry` nur die Entscheidung
`textInputs[*].shouldPrompt` delegieren muss
`createDelegatedResolveConfigured(...)`, wenn `setupEntry` lazy an
einen schwergewichtigeren vollständigen Assistenten weiterleiten muss
- `createDelegatedTextInputShouldPrompt(...)`, wenn `setupEntry` nur eine
`textInputs[*].shouldPrompt`-Entscheidung delegieren muss
## Veröffentlichen und installieren
**Externe Plugins:** auf [ClawHub](/de/tools/clawhub) oder npm veröffentlichen, dann installieren:
**Externe Plugins:** Veröffentliche sie auf [ClawHub](/de/tools/clawhub) oder npm und installiere sie dann:
```bash
openclaw plugins install @myorg/openclaw-my-plugin
```
OpenClaw versucht zuerst ClawHub und fällt automatisch auf npm zurück. Sie können ClawHub auch
OpenClaw versucht zuerst ClawHub und greift automatisch auf npm zurück. Du kannst ClawHub auch
explizit erzwingen:
```bash
openclaw plugins install clawhub:@myorg/openclaw-my-plugin # nur ClawHub
```
Es gibt keine passende Überschreibung `npm:`. Verwenden Sie die normale npm-Paketspezifikation, wenn Sie
nach dem ClawHub-Fallback den npm-Pfad wünschen:
Es gibt kein entsprechendes `npm:`-Override. Verwende die normale npm-Paketspezifikation, wenn du
nach dem ClawHub-Fallback den npm-Pfad verwenden möchtest:
```bash
openclaw plugins install @myorg/openclaw-my-plugin
```
**Plugins im Repository:** Platzieren Sie sie unter dem Workspace-Baum für gebündelte Plugins, dann werden sie beim Build automatisch
**Plugins im Repository:** Lege sie unter dem gebündelten Plugin-Workspace-Baum ab; dann werden sie beim Build automatisch
erkannt.
**Benutzer können installieren:**
@ -523,13 +531,13 @@ openclaw plugins install <package-name>
```
<Info>
Für Installationen aus npm führt `openclaw plugins install`
`npm install --ignore-scripts` aus (keine Lifecycle-Skripte). Halten Sie die Abhängigkeits-
Bäume von Plugins bei reinem JS/TS und vermeiden Sie Pakete, die `postinstall`-Builds erfordern.
Für Installationen aus npm-Quellen führt `openclaw plugins install`
`npm install --ignore-scripts` aus (keine Lifecycle-Skripte). Halte die Abhängigkeitsbäume von Plugins
rein in JS/TS und vermeide Pakete, die `postinstall`-Builds erfordern.
</Info>
## Verwandt
- [SDK Entry Points](/de/plugins/sdk-entrypoints) -- `definePluginEntry` und `defineChannelPluginEntry`
- [Plugin Manifest](/de/plugins/manifest) -- vollständige Manifest-Schemareferenz
- [Building Plugins](/de/plugins/building-plugins) -- Schritt-für-Schritt-Anleitung für den Einstieg
- [Plugin Manifest](/de/plugins/manifest) -- vollständige Referenz des Manifestschemas
- [Building Plugins](/de/plugins/building-plugins) -- Schritt-für-Schritt-Einstiegsanleitung

View File

@ -1,36 +1,36 @@
---
read_when:
- Sie schreiben Tests für ein Plugin
- Sie benötigen Testhilfen aus dem Plugin SDK
- Sie möchten Vertragstests für gebündelte Plugins verstehen
- Sie schreiben Tests für ein Plugin.
- Sie benötigen Testhilfsprogramme aus dem Plugin SDK.
- Sie möchten Vertragstests für gebündelte Plugins verstehen.
sidebarTitle: Testing
summary: Testhilfen und Muster für OpenClaw-Plugins
summary: Testhilfsprogramme und Muster für OpenClaw-Plugins
title: Plugin-Tests
x-i18n:
generated_at: "2026-04-05T12:51:55Z"
generated_at: "2026-04-15T19:41:34Z"
model: gpt-5.4
provider: openai
source_hash: 2e95ed58ed180feadad17bb5138bd09e3b45f1f3ecdff4e2fba4874bb80099fe
source_hash: 2f75bd3f3b5ba34b05786e0dd96d493c36db73a1d258998bf589e27e45c0bd09
source_path: plugins/sdk-testing.md
workflow: 15
---
# Plugin-Tests
Referenz für Testhilfen, Muster und Lint-Durchsetzung für OpenClaw-
Referenz für Testhilfsprogramme, Muster und Lint-Durchsetzung für OpenClaw-
Plugins.
<Tip>
**Sie suchen nach Testbeispielen?** Die Schritt-für-Schritt-Leitfäden enthalten ausgearbeitete Testbeispiele:
[Kanal-Plugin-Tests](/plugins/sdk-channel-plugins#step-6-test) und
[Provider-Plugin-Tests](/plugins/sdk-provider-plugins#step-6-test).
**Suchen Sie nach Testbeispielen?** Die Schritt-für-Schritt-Anleitungen enthalten ausgearbeitete Testbeispiele:
[Tests für Channel-Plugins](/de/plugins/sdk-channel-plugins#step-6-test) und
[Tests für Provider-Plugins](/de/plugins/sdk-provider-plugins#step-6-test).
</Tip>
## Testhilfen
## Testhilfsprogramme
**Import:** `openclaw/plugin-sdk/testing`
Der Testing-Subpfad exportiert eine gezielte Menge von Hilfsfunktionen für Plugin-Autorinnen und -Autoren:
Der Testing-Subpath exportiert einen eingeschränkten Satz von Hilfsfunktionen für Plugin-Autorinnen und -Autoren:
```typescript
import {
@ -42,15 +42,15 @@ import {
### Verfügbare Exporte
| Export | Zweck |
| -------------------------------------- | ------------------------------------------------------- |
| Export | Zweck |
| -------------------------------------- | ------------------------------------------------------ |
| `installCommonResolveTargetErrorCases` | Gemeinsame Testfälle für die Fehlerbehandlung bei der Zielauflösung |
| `shouldAckReaction` | Prüfen, ob ein Kanal eine Ack-Reaktion hinzufügen sollte |
| `removeAckReactionAfterReply` | Ack-Reaktion nach der Zustellung einer Antwort entfernen |
| `shouldAckReaction` | Prüfen, ob ein Channel eine Ack-Reaktion hinzufügen sollte |
| `removeAckReactionAfterReply` | Ack-Reaktion nach der Zustellung der Antwort entfernen |
### Typen
Der Testing-Subpfad exportiert auch Typen erneut, die in Testdateien nützlich sind:
Der Testing-Subpath exportiert außerdem Typen erneut, die in Testdateien nützlich sind:
```typescript
import type {
@ -65,8 +65,7 @@ import type {
## Zielauflösung testen
Verwenden Sie `installCommonResolveTargetErrorCases`, um Standardfehlerfälle für
die Zielauflösung von Kanälen hinzuzufügen:
Verwenden Sie `installCommonResolveTargetErrorCases`, um Standardfehlerfälle für die Channel-Zielauflösung hinzuzufügen:
```typescript
import { describe } from "vitest";
@ -75,13 +74,13 @@ import { installCommonResolveTargetErrorCases } from "openclaw/plugin-sdk/testin
describe("my-channel target resolution", () => {
installCommonResolveTargetErrorCases({
resolveTarget: ({ to, mode, allowFrom }) => {
// Zielauflösungslogik Ihres Kanals
// Your channel's target resolution logic
return myChannelResolveTarget({ to, mode, allowFrom });
},
implicitAllowFrom: ["user1", "user2"],
});
// Kanalspezifische Testfälle hinzufügen
// Add channel-specific test cases
it("should resolve @username targets", () => {
// ...
});
@ -90,7 +89,7 @@ describe("my-channel target resolution", () => {
## Testmuster
### Unit-Tests für ein Kanal-Plugin
### Unit-Tests für ein Channel-Plugin
```typescript
import { describe, it, expect, vi } from "vitest";
@ -120,7 +119,7 @@ describe("my-channel plugin", () => {
const inspection = myPlugin.setup.inspectAccount(cfg, undefined);
expect(inspection.configured).toBe(true);
expect(inspection.tokenStatus).toBe("available");
// Kein Token-Wert wird offengelegt
// No token value exposed
expect(inspection).not.toHaveProperty("token");
});
});
@ -135,7 +134,7 @@ describe("my-provider plugin", () => {
it("should resolve dynamic models", () => {
const model = myProvider.resolveDynamicModel({
modelId: "custom-model-v2",
// ... Kontext
// ... context
});
expect(model.id).toBe("custom-model-v2");
@ -146,7 +145,7 @@ describe("my-provider plugin", () => {
it("should return catalog when API key is available", async () => {
const result = await myProvider.catalog.run({
resolveProviderApiKey: () => ({ apiKey: "test-key" }),
// ... Kontext
// ... context
});
expect(result?.provider?.models).toHaveLength(2);
@ -156,49 +155,52 @@ describe("my-provider plugin", () => {
### Die Plugin-Laufzeit mocken
Für Code, der `createPluginRuntimeStore` verwendet, sollten Sie die Laufzeit in Tests mocken:
Für Code, der `createPluginRuntimeStore` verwendet, mocken Sie die Laufzeit in Tests:
```typescript
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
import type { PluginRuntime } from "openclaw/plugin-sdk/runtime-store";
const store = createPluginRuntimeStore<PluginRuntime>("test runtime not set");
const store = createPluginRuntimeStore<PluginRuntime>({
pluginId: "test-plugin",
errorMessage: "test runtime not set",
});
// Im Test-Setup
// In test setup
const mockRuntime = {
agent: {
resolveAgentDir: vi.fn().mockReturnValue("/tmp/agent"),
// ... weitere Mocks
// ... other mocks
},
config: {
loadConfig: vi.fn(),
writeConfigFile: vi.fn(),
},
// ... weitere Namespaces
// ... other namespaces
} as unknown as PluginRuntime;
store.setRuntime(mockRuntime);
// Nach den Tests
// After tests
store.clearRuntime();
```
### Mit instanzspezifischen Stubs testen
Bevorzugen Sie instanzspezifische Stubs gegenüber Prototyp-Mutation:
Bevorzugen Sie instanzspezifische Stubs statt Prototyp-Mutation:
```typescript
// Bevorzugt: instanzspezifischer Stub
// Preferred: per-instance stub
const client = new MyChannelClient();
client.sendMessage = vi.fn().mockResolvedValue({ id: "msg-1" });
// Vermeiden: Prototyp-Mutation
// Avoid: prototype mutation
// MyChannelClient.prototype.sendMessage = vi.fn();
```
## Vertragstests (Plugins im Repository)
Gebündelte Plugins haben Vertragstests, die die Besitzerschaft der Registrierung verifizieren:
Gebündelte Plugins haben Vertragstests, die die Besitzverhältnisse bei der Registrierung überprüfen:
```bash
pnpm test -- src/plugins/contracts/
@ -207,7 +209,7 @@ pnpm test -- src/plugins/contracts/
Diese Tests prüfen:
- Welche Plugins welche Provider registrieren
- Welche Plugins welche Speech-Provider registrieren
- Welche Plugins welche Sprach-Provider registrieren
- Korrektheit der Registrierungsform
- Einhaltung des Laufzeitvertrags
@ -229,42 +231,42 @@ pnpm test -- src/plugins/contracts/runtime.contract.test.ts
## Lint-Durchsetzung (Plugins im Repository)
Drei Regeln werden durch `pnpm check` für Plugins im Repository erzwungen:
Drei Regeln werden durch `pnpm check` für Plugins im Repository durchgesetzt:
1. **Keine monolithischen Root-Imports** -- Das Root-Barrel `openclaw/plugin-sdk` wird abgelehnt
2. **Keine direkten `src/`-Imports** -- Plugins dürfen `../../src/` nicht direkt importieren
3. **Keine Selbstimporte** -- Plugins dürfen ihren eigenen Subpfad `plugin-sdk/<name>` nicht importieren
1. **Keine monolithischen Root-Importe** -- die Root-Barrel-Datei `openclaw/plugin-sdk` wird abgelehnt
2. **Keine direkten `src/`-Importe** -- Plugins dürfen `../../src/` nicht direkt importieren
3. **Keine Selbstimporte** -- Plugins dürfen nicht ihren eigenen Subpath `plugin-sdk/<name>` importieren
Externe Plugins unterliegen diesen Lint-Regeln nicht, aber es wird empfohlen,
denselben Mustern zu folgen.
Externe Plugins unterliegen diesen Lint-Regeln nicht, aber es wird empfohlen, dieselben
Muster zu befolgen.
## Testkonfiguration
OpenClaw verwendet Vitest mit V8-Coverage-Schwellenwerten. Für Plugin-Tests:
```bash
# Alle Tests ausführen
# Run all tests
pnpm test
# Tests für ein bestimmtes Plugin ausführen
# Run specific plugin tests
pnpm test -- <bundled-plugin-root>/my-channel/src/channel.test.ts
# Mit einem Filter für einen bestimmten Testnamen ausführen
# Run with a specific test name filter
pnpm test -- <bundled-plugin-root>/my-channel/ -t "resolves account"
# Mit Coverage ausführen
# Run with coverage
pnpm test:coverage
```
Wenn lokale Läufe zu Speicherdruck führen:
Wenn lokale Ausführungen zu Speicherdruck führen:
```bash
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test
```
## Verwandt
## Verwandte Themen
- [SDK-Überblick](/plugins/sdk-overview) -- Importkonventionen
- [SDK-Kanal-Plugins](/plugins/sdk-channel-plugins) -- Schnittstelle für Kanal-Plugins
- [SDK-Provider-Plugins](/plugins/sdk-provider-plugins) -- Hooks für Provider-Plugins
- [Plugins erstellen](/plugins/building-plugins) -- Einstiegsleitfaden
- [SDK Overview](/de/plugins/sdk-overview) -- Importkonventionen
- [SDK Channel Plugins](/de/plugins/sdk-channel-plugins) -- Channel-Plugin-Schnittstelle
- [SDK Provider Plugins](/de/plugins/sdk-provider-plugins) -- Provider-Plugin-Hooks
- [Building Plugins](/de/plugins/building-plugins) -- Leitfaden für den Einstieg

View File

@ -1,14 +1,14 @@
---
read_when:
- Erklärung von Token-Nutzung, Kosten oder Kontextfenstern
- Debuggen von Kontextwachstum oder Kompaktierungsverhalten
summary: Wie OpenClaw Prompt-Kontext erstellt und Token-Nutzung + Kosten meldet
- Kontextwachstum oder Compaction-Verhalten debuggen
summary: Wie OpenClaw Prompt-Kontext erstellt und Token-Nutzung sowie Kosten meldet
title: Token-Nutzung und Kosten
x-i18n:
generated_at: "2026-04-12T06:16:41Z"
generated_at: "2026-04-15T19:41:57Z"
model: gpt-5.4
provider: openai
source_hash: f8c856549cd28b8364a640e6fa9ec26aa736895c7a993e96cbe85838e7df2dfb
source_hash: 9a706d3df8b2ea1136b3535d216c6b358e43aee2a31a4759824385e1345e6fe5
source_path: reference/token-use.md
workflow: 15
---
@ -16,16 +16,19 @@ x-i18n:
# Token-Nutzung und Kosten
OpenClaw erfasst **Token**, nicht Zeichen. Token sind modellspezifisch, aber die meisten
Modelle im OpenAI-Stil haben im Durchschnitt etwa 4 Zeichen pro Token bei englischem Text.
OpenAI-ähnlichen Modelle haben im Durchschnitt etwa 4 Zeichen pro Token für englischen Text.
## Wie der System-Prompt erstellt wird
OpenClaw setzt bei jedem Lauf seinen eigenen System-Prompt zusammen. Er enthält:
OpenClaw setzt seinen eigenen System-Prompt bei jeder Ausführung zusammen. Er enthält:
- Tool-Liste + kurze Beschreibungen
- Skills-Liste (nur Metadaten; Anweisungen werden bei Bedarf mit `read` geladen)
- Skills-Liste (nur Metadaten; Anweisungen werden bei Bedarf mit `read` geladen).
Der kompakte Skills-Block ist durch `skills.limits.maxSkillsPromptChars`
begrenzt, mit optionaler agentenspezifischer Überschreibung unter
`agents.list[].skillsLimits.maxSkillsPromptChars`.
- Anweisungen zur Selbstaktualisierung
- Workspace- + Bootstrap-Dateien (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md`, wenn neu, sowie `MEMORY.md`, wenn vorhanden, oder `memory.md` als Fallback in Kleinbuchstaben). Große Dateien werden durch `agents.defaults.bootstrapMaxChars` abgeschnitten (Standard: 20000), und die gesamte Bootstrap-Injektion ist durch `agents.defaults.bootstrapTotalMaxChars` begrenzt (Standard: 150000). Tägliche Dateien in `memory/*.md` sind nicht Teil des normalen Bootstrap-Prompts; sie bleiben bei normalen Turns bedarfsbasiert über Speicher-Tools verfügbar, aber bei reinem `/new` und `/reset` kann ein einmaliger Startkontext-Block mit aktuellem täglichem Speicher für diesen ersten Turn vorangestellt werden. Dieses Startpräliminarium wird durch `agents.defaults.startupContext` gesteuert.
- Workspace- und Bootstrap-Dateien (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md`, wenn neu, sowie `MEMORY.md`, wenn vorhanden, oder `memory.md` als Fallback in Kleinbuchstaben). Große Dateien werden durch `agents.defaults.bootstrapMaxChars` abgeschnitten (Standard: 12000), und die gesamte Bootstrap-Injektion ist durch `agents.defaults.bootstrapTotalMaxChars` begrenzt (Standard: 60000). Tägliche Dateien in `memory/*.md` sind nicht Teil des normalen Bootstrap-Prompts; sie bleiben in normalen Turns bei Bedarf über Memory-Tools verfügbar, aber ein einfaches `/new` und `/reset` kann für den ersten Turn einen einmaligen Startup-Kontextblock mit aktuellem täglichem Memory voranstellen. Dieses Startup-Präludium wird durch `agents.defaults.startupContext` gesteuert.
- Zeit (UTC + Benutzerzeitzone)
- Antwort-Tags + Heartbeat-Verhalten
- Laufzeitmetadaten (Host/OS/Modell/Thinking)
@ -37,88 +40,104 @@ Die vollständige Aufschlüsselung finden Sie unter [System Prompt](/de/concepts
Alles, was das Modell erhält, zählt zum Kontextlimit:
- System-Prompt (alle oben aufgeführten Abschnitte)
- Gesprächsverlauf (Benutzer- + Assistenten-Nachrichten)
- Gesprächsverlauf (Benutzer- und Assistentennachrichten)
- Tool-Aufrufe und Tool-Ergebnisse
- Anhänge/Transkripte (Bilder, Audio, Dateien)
- Kompaktierungszusammenfassungen und Artefakte des Beschneidens
- Provider-Wrapper oder Safety-Header (nicht sichtbar, aber dennoch mitgezählt)
- Compaction-Zusammenfassungen und Pruning-Artefakte
- Provider-Wrapper oder Sicherheits-Header (nicht sichtbar, werden aber trotzdem mitgezählt)
Bei Bildern skaliert OpenClaw Bild-Payloads aus Transkripten/Tools vor Provider-Aufrufen herunter.
Verwenden Sie `agents.defaults.imageMaxDimensionPx` (Standard: `1200`), um dies anzupassen:
Einige laufzeitintensive Bereiche haben eigene explizite Begrenzungen:
- Niedrigere Werte reduzieren in der Regel die Vision-Token-Nutzung und die Payload-Größe.
- `agents.defaults.contextLimits.memoryGetMaxChars`
- `agents.defaults.contextLimits.memoryGetDefaultLines`
- `agents.defaults.contextLimits.toolResultMaxChars`
- `agents.defaults.contextLimits.postCompactionMaxChars`
Agentenspezifische Überschreibungen befinden sich unter `agents.list[].contextLimits`. Diese Regler sind
für begrenzte Laufzeitauszüge und injizierte laufzeiteigene Blöcke gedacht. Sie sind
getrennt von Bootstrap-Limits, Startup-Kontext-Limits und Skills-Prompt-
Limits.
Bei Bildern skaliert OpenClaw Transkript-/Tool-Bild-Payloads vor Provider-Aufrufen herunter.
Verwenden Sie `agents.defaults.imageMaxDimensionPx` (Standard: `1200`), um dies abzustimmen:
- Niedrigere Werte reduzieren normalerweise die Vision-Token-Nutzung und die Payload-Größe.
- Höhere Werte bewahren mehr visuelle Details für OCR-/UI-lastige Screenshots.
Für eine praktische Aufschlüsselung (pro injizierter Datei, Tools, Skills und System-Prompt-Größe) verwenden Sie `/context list` oder `/context detail`. Siehe [Context](/de/concepts/context).
Für eine praktische Aufschlüsselung (pro injizierter Datei, Tools, Skills und Größe des System-Prompts) verwenden Sie `/context list` oder `/context detail`. Siehe [Context](/de/concepts/context).
## So sehen Sie die aktuelle Token-Nutzung
Verwenden Sie diese Befehle im Chat:
- `/status`**statuskarte mit vielen Emojis** mit dem Sitzungsmodell, der Kontextnutzung,
den Eingabe-/Ausgabe-Token der letzten Antwort und den **geschätzten Kosten** (nur API-Schlüssel).
- `/usage off|tokens|full` → hängt an jede Antwort eine **Nutzungsfußzeile pro Antwort** an.
- Wird pro Sitzung beibehalten (gespeichert als `responseUsage`).
den Input-/Output-Token der letzten Antwort und den **geschätzten Kosten** (nur API-Schlüssel).
- `/usage off|tokens|full` → hängt an jede Antwort eine **Nutzungs-Fußzeile pro Antwort** an.
- Bleibt pro Sitzung bestehen (gespeichert als `responseUsage`).
- OAuth-Authentifizierung **blendet Kosten aus** (nur Token).
- `/usage cost` → zeigt eine lokale Kostenzusammenfassung aus OpenClaw-Sitzungsprotokollen an.
Weitere Oberflächen:
- **TUI/Web TUI:** `/status` + `/usage` werden unterstützt.
- **TUI/Web TUI:** `/status` und `/usage` werden unterstützt.
- **CLI:** `openclaw status --usage` und `openclaw channels list` zeigen
normalisierte Provider-Quota-Fenster (`X% left`, keine Kosten pro Antwort).
normalisierte Provider-Quotenfenster an (`X% left`, nicht Kosten pro Antwort).
Aktuelle Provider mit Nutzungsfenster: Anthropic, GitHub Copilot, Gemini CLI,
OpenAI Codex, MiniMax, Xiaomi und z.ai.
Nutzungsoberflächen normalisieren vor der Anzeige gängige feldnative Aliase von Providern.
Für OpenAI-Familie-Responses-Datenverkehr umfasst das sowohl `input_tokens` /
Nutzungsoberflächen normalisieren vor der Anzeige gängige providernative Feldaliase.
Für OpenAI-Family-Responses-Traffic umfasst dies sowohl `input_tokens` /
`output_tokens` als auch `prompt_tokens` / `completion_tokens`, sodass transportspezifische
Feldnamen `/status`, `/usage` oder Sitzungszusammenfassungen nicht verändern.
Auch die JSON-Nutzung von Gemini CLI wird normalisiert: Der Antworttext stammt aus `response`, und
Feldnamen `/status`, `/usage` oder Sitzungszusammenfassungen nicht ändern.
Auch die JSON-Nutzung von Gemini CLI wird normalisiert: Antworttext kommt aus `response`, und
`stats.cached` wird auf `cacheRead` abgebildet, wobei `stats.input_tokens - stats.cached`
verwendet wird, wenn die CLI kein explizites Feld `stats.input` ausgibt.
Für nativen OpenAI-Familie-Responses-Datenverkehr werden WebSocket-/SSE-Nutzungsaliase
auf die gleiche Weise normalisiert, und Summen greifen auf normalisierte Eingabe + Ausgabe zurück, wenn
verwendet wird, wenn die CLI kein explizites Feld `stats.input` bereitstellt.
Für nativen OpenAI-Family-Responses-Traffic werden WebSocket-/SSE-Nutzungsaliase
auf dieselbe Weise normalisiert, und Summen greifen auf normalisierte Input- + Output-Werte zurück, wenn
`total_tokens` fehlt oder `0` ist.
Wenn der aktuelle Sitzungssnapshot spärlich ist, können `/status` und `session_status`
auch Token-/Cache-Zähler und die aktive Laufzeit-Modellbezeichnung aus dem zuletzt verwendeten Transkript-Nutzungsprotokoll wiederherstellen. Bereits vorhandene Live-Werte ungleich null haben weiterhin Vorrang vor Transkript-Fallback-Werten, und größere promptorientierte
Wenn der aktuelle Sitzungssnapshot nur spärlich ist, können `/status` und `session_status`
außerdem Token-/Cache-Zähler und das aktive Laufzeitmodell-Label aus dem
aktuellsten Nutzungsprotokoll des Transkripts wiederherstellen. Vorhandene von null verschiedene Live-Werte
haben weiterhin Vorrang vor Transkript-Fallback-Werten, und größere promptorientierte
Transkript-Summen können gewinnen, wenn gespeicherte Summen fehlen oder kleiner sind.
Die Nutzungsautorisierung für Provider-Quota-Fenster stammt, sofern verfügbar, aus providerspezifischen Hooks; andernfalls greift OpenClaw auf passende OAuth-/API-Schlüssel-Anmeldedaten aus Auth-Profilen, Umgebungsvariablen oder der Konfiguration zurück.
Die Nutzungsauthentifizierung für Provider-Quotenfenster stammt aus providerspezifischen Hooks, wenn
verfügbar; andernfalls greift OpenClaw auf passende OAuth-/API-Key-Zugangsdaten
aus Auth-Profilen, der Umgebung oder der Konfiguration zurück.
## Kostenschätzung (wenn angezeigt)
Kosten werden anhand Ihrer Modell-Preis-Konfiguration geschätzt:
Die Kosten werden anhand Ihrer Modellpreis-Konfiguration geschätzt:
```
models.providers.<provider>.models[].cost
```
Dies sind **USD pro 1 Mio. Token** für `input`, `output`, `cacheRead` und
`cacheWrite`. Wenn Preisdaten fehlen, zeigt OpenClaw nur Token an. OAuth-Token
zeigen niemals Dollar-Kosten an.
`cacheWrite`. Wenn die Preisangaben fehlen, zeigt OpenClaw nur Token an. OAuth-Token
zeigen niemals Dollarkosten an.
## Auswirkungen von Cache-TTL und Beschneidung
## Auswirkungen von Cache-TTL und Pruning
Provider-Prompt-Caching gilt nur innerhalb des Cache-TTL-Fensters. OpenClaw kann
optional **Cache-TTL-Beschneidung** ausführen: Es beschneidet die Sitzung, sobald die Cache-TTL
optional **Cache-TTL-Pruning** ausführen: Es beschneidet die Sitzung, sobald die Cache-TTL
abgelaufen ist, und setzt dann das Cache-Fenster zurück, sodass nachfolgende Anfragen den
frisch gecachten Kontext erneut verwenden können, anstatt den gesamten Verlauf neu zu cachen. Dadurch bleiben die
Cache-Schreibkosten niedriger, wenn eine Sitzung länger als die TTL inaktiv bleibt.
frisch gecachten Kontext wiederverwenden können, anstatt den vollständigen Verlauf erneut zu cachen.
Dadurch bleiben die Cache-Schreibkosten niedriger, wenn eine Sitzung nach Ablauf der TTL untätig wird.
Konfigurieren Sie dies in der [Gateway-Konfiguration](/de/gateway/configuration) und lesen Sie die
Konfigurieren Sie dies in [Gateway configuration](/de/gateway/configuration) und lesen Sie die
Verhaltensdetails unter [Session pruning](/de/concepts/session-pruning).
Heartbeat kann den Cache über Leerlaufphasen hinweg **warm** halten. Wenn Ihre Modell-Cache-TTL
`1h` beträgt, kann das Setzen des Heartbeat-Intervalls knapp darunter (z. B. `55m`) verhindern,
dass der gesamte Prompt erneut gecacht werden muss, was Cache-Schreibkosten reduziert.
Heartbeat kann den Cache über Leerlaufphasen hinweg **warm** halten. Wenn die Cache-TTL
Ihres Modells `1h` beträgt, kann das Setzen des Heartbeat-Intervalls knapp darunter (z. B. `55m`)
verhindern, dass der vollständige Prompt erneut gecacht werden muss, wodurch sich Cache-Schreibkosten verringern.
In Multi-Agent-Setups können Sie eine gemeinsame Modellkonfiguration beibehalten und das Cache-Verhalten
In Multi-Agent-Setups können Sie eine gemeinsam genutzte Modellkonfiguration beibehalten und das Cache-Verhalten
pro Agent mit `agents.list[].params.cacheRetention` abstimmen.
Eine vollständige Anleitung zu allen Stellschrauben finden Sie unter [Prompt Caching](/de/reference/prompt-caching).
Eine vollständige Anleitung zu allen Reglern finden Sie unter [Prompt Caching](/de/reference/prompt-caching).
Bei der Preisgestaltung der Anthropic API sind Cache-Lesevorgänge deutlich günstiger als Eingabe-Token,
während Cache-Schreibvorgänge mit einem höheren Multiplikator berechnet werden. Die aktuellen Tarife und TTL-Multiplikatoren finden Sie in der Anthropic-Dokumentation zur Prompt-Caching-Preisgestaltung:
Bei den Anthropic-API-Preisen sind Cache-Lesevorgänge deutlich günstiger als Input-
Token, während Cache-Schreibvorgänge mit einem höheren Multiplikator abgerechnet werden. Die aktuellen Preise und TTL-Multiplikatoren finden Sie in der Anthropic-Dokumentation zur Preisgestaltung für Prompt-Caching:
[https://docs.anthropic.com/docs/build-with-claude/prompt-caching](https://docs.anthropic.com/docs/build-with-claude/prompt-caching)
### Beispiel: 1h-Cache mit Heartbeat warm halten
@ -136,7 +155,7 @@ agents:
every: "55m"
```
### Beispiel: gemischter Datenverkehr mit Cache-Strategie pro Agent
### Beispiel: gemischter Traffic mit agentenspezifischer Cache-Strategie
```yaml
agents:
@ -146,24 +165,24 @@ agents:
models:
"anthropic/claude-opus-4-6":
params:
cacheRetention: "long" # Standardbasis für die meisten Agents
cacheRetention: "long" # default baseline for most agents
list:
- id: "research"
default: true
heartbeat:
every: "55m" # langen Cache für tiefe Sitzungen warm halten
every: "55m" # keep long cache warm for deep sessions
- id: "alerts"
params:
cacheRetention: "none" # Cache-Schreibvorgänge für burstartige Benachrichtigungen vermeiden
cacheRetention: "none" # avoid cache writes for bursty notifications
```
`agents.list[].params` wird über die `params` des ausgewählten Modells zusammengeführt, sodass Sie
nur `cacheRetention` überschreiben und andere Modellstandards unverändert erben können.
`agents.list[].params` wird über `params` des ausgewählten Modells zusammengeführt, sodass Sie
nur `cacheRetention` überschreiben und andere Modellstandards unverändert übernehmen können.
### Beispiel: Anthropic-1M-Kontext-Beta-Header aktivieren
Das 1M-Kontextfenster von Anthropic ist derzeit per Beta-Gating geschützt. OpenClaw kann den
erforderlichen Wert für `anthropic-beta` einfügen, wenn Sie `context1m` bei unterstützten Opus-
Das 1M-Kontextfenster von Anthropic ist derzeit beta-gesteuert. OpenClaw kann den
erforderlichen Wert für `anthropic-beta` injizieren, wenn Sie `context1m` bei unterstützten Opus-
oder Sonnet-Modellen aktivieren.
```yaml
@ -175,22 +194,22 @@ agents:
context1m: true
```
Dies wird auf den Beta-Header `context-1m-2025-08-07` von Anthropic abgebildet.
Dies wird dem Beta-Header `context-1m-2025-08-07` von Anthropic zugeordnet.
Dies gilt nur, wenn `context1m: true` für diesen Modelleintrag gesetzt ist.
Voraussetzung: Die Anmeldedaten müssen für die Nutzung von Langkontext berechtigt sein. Ist dies nicht der Fall,
Voraussetzung: Die Zugangsdaten müssen für die Nutzung mit langem Kontext berechtigt sein. Andernfalls
antwortet Anthropic für diese Anfrage mit einem providerseitigen Rate-Limit-Fehler.
Wenn Sie Anthropic mit OAuth-/Abonnement-Token (`sk-ant-oat-*`) authentifizieren,
überspringt OpenClaw den Beta-Header `context-1m-*`, da Anthropic diese Kombination derzeit
Wenn Sie Anthropic mit OAuth-/Subscription-Token (`sk-ant-oat-*`) authentifizieren,
überspringt OpenClaw den Beta-Header `context-1m-*`, weil Anthropic diese Kombination derzeit
mit HTTP 401 ablehnt.
## Tipps zur Reduzierung von Token-Druck
## Tipps zur Reduzierung des Token-Drucks
- Verwenden Sie `/compact`, um lange Sitzungen zusammenzufassen.
- Kürzen Sie große Tool-Ausgaben in Ihren Workflows.
- Senken Sie `agents.defaults.imageMaxDimensionPx` bei screenshotlastigen Sitzungen.
- Reduzieren Sie `agents.defaults.imageMaxDimensionPx` für screenshotlastige Sitzungen.
- Halten Sie Skill-Beschreibungen kurz (die Skills-Liste wird in den Prompt injiziert).
- Bevorzugen Sie kleinere Modelle für ausführliche, explorative Arbeit.