Tools
Unterschiede
diffs ist ein optionales Plugin-Tool mit kurzer integrierter Systemanleitung und einem zugehörigen Skill, der Änderungsinhalte in ein schreibgeschütztes Diff-Artefakt für Agenten umwandelt.
Es akzeptiert entweder:
before- undafter-Text- einen vereinheitlichten
patch
Es kann Folgendes zurückgeben:
- eine Gateway-Viewer-URL für die Canvas-Darstellung
- einen gerenderten Dateipfad (PNG oder PDF) für die Nachrichtenzustellung
- beide Ausgaben in einem Aufruf
Wenn aktiviert, stellt das Plugin eine knappe Nutzungsanleitung im System-Prompt-Bereich voran und stellt außerdem einen ausführlichen Skill für Fälle bereit, in denen der Agent vollständigere Anweisungen benötigt.
Schnellstart
Plugin installieren
openclaw plugins install diffsPlugin aktivieren
{ plugins: { entries: { diffs: { enabled: true, }, }, },}Modus auswählen
Anzeigen
Canvas-zentrierte Abläufe: Agenten rufen diffs mit mode: "view" auf und öffnen details.viewerUrl mit canvas present.
Datei
Chat-Dateizustellung: Agenten rufen diffs mit mode: "file" auf und senden details.filePath mit message unter Verwendung von path oder filePath.
Beides
Kombiniert: Agenten rufen diffs mit mode: "both" auf, um beide Artefakte in einem Aufruf zu erhalten.
Integrierte Systemanleitung deaktivieren
Wenn Sie das Tool diffs aktiviert lassen, aber seine integrierte System-Prompt-Anleitung deaktivieren möchten, setzen Sie plugins.entries.diffs.hooks.allowPromptInjection auf false:
{ plugins: { entries: { diffs: { enabled: true, hooks: { allowPromptInjection: false, }, }, }, },}Dies blockiert den Hook before_prompt_build des diffs-Plugins, während Plugin, Tool und zugehöriger Skill verfügbar bleiben.
Wenn Sie sowohl die Anleitung als auch das Tool deaktivieren möchten, deaktivieren Sie stattdessen das Plugin.
Typischer Agenten-Workflow
diffs aufrufen
Der Agent ruft das Tool diffs mit Eingaben auf.
Details lesen
Der Agent liest details-Felder aus der Antwort.
Präsentieren
Der Agent öffnet entweder details.viewerUrl mit canvas present, sendet details.filePath mit message unter Verwendung von path oder filePath oder führt beides aus.
Eingabebeispiele
Vorher und nachher
{ "before": "# Hello\n\nOne", "after": "# Hello\n\nTwo", "path": "docs/example.md", "mode": "view"}Patch
{ "patch": "diff --git a/src/example.ts b/src/example.ts\n--- a/src/example.ts\n+++ b/src/example.ts\n@@ -1 +1 @@\n-const x = 1;\n+const x = 2;\n", "mode": "both"}Referenz für Tool-Eingaben
Alle Felder sind optional, sofern nicht anders angegeben.
beforestringUrsprünglicher Text. Erforderlich mit after, wenn patch weggelassen wird.
afterstringAktualisierter Text. Erforderlich mit before, wenn patch weggelassen wird.
patchstringVereinheitlichter Diff-Text. Schließt sich gegenseitig mit before und after aus.
pathstringAnzuzeigender Dateiname für den Vorher-und-nachher-Modus.
langstringHinweis zum Überschreiben der Sprache für den Vorher-und-nachher-Modus. Unbekannte Werte und Sprachen außerhalb des Standard-Viewer-Sets fallen auf Nur-Text zurück, sofern das Diff Viewer Language Pack plugin nicht installiert ist.
titlestringÜberschreibung des Viewer-Titels.
mode"view" | "file" | "both"Ausgabemodus. Standardmäßig der Plugin-Standardwert defaults.mode. Veralteter Alias: "image" verhält sich wie "file" und wird aus Gründen der Abwärtskompatibilität weiterhin akzeptiert.
theme"light" | "dark"Viewer-Theme. Standardmäßig der Plugin-Standardwert defaults.theme.
layout"unified" | "split"Diff-Layout. Standardmäßig der Plugin-Standardwert defaults.layout.
expandUnchangedbooleanUnveränderte Abschnitte erweitern, wenn vollständiger Kontext verfügbar ist. Nur eine Option pro Aufruf (kein Plugin-Standardschlüssel).
fileFormat"png" | "pdf"Gerendertes Dateiformat. Standardmäßig der Plugin-Standardwert defaults.fileFormat.
fileQuality"standard" | "hq" | "print"Qualitätsvorgabe für PNG- oder PDF-Rendering.
fileScalenumberÜberschreibung der Geräteskalierung (1-4).
fileMaxWidthnumberMaximale Renderbreite in CSS-Pixeln (640-2400).
ttlSecondsnumberdefault: 1800Artefakt-TTL in Sekunden für Viewer- und eigenständige Dateiausgaben. Maximal 21600.
baseUrlstringÜberschreibung des Ursprungs der Viewer-URL. Überschreibt Plugin-viewerBaseUrl. Muss http oder https sein, ohne Abfrage/Hash.
Legacy-Eingabealiase
Werden aus Gründen der Abwärtskompatibilität weiterhin akzeptiert:
format->fileFormatimageFormat->fileFormatimageQuality->fileQualityimageScale->fileScaleimageMaxWidth->fileMaxWidth
Validierung und Grenzwerte
beforeundafterjeweils maximal 512 KiB.patchmaximal 2 MiB.pathmaximal 2048 Byte.langmaximal 128 Byte.titlemaximal 1024 Byte.- Obergrenze für Patch-Komplexität: maximal 128 Dateien und insgesamt 120000 Zeilen.
patchzusammen mitbeforeoderafterwird abgelehnt.- Sicherheitsgrenzwerte für gerenderte Dateien (gelten für PNG und PDF):
fileQuality: "standard": maximal 8 MP (8.000.000 gerenderte Pixel).fileQuality: "hq": maximal 14 MP (14.000.000 gerenderte Pixel).fileQuality: "print": maximal 24 MP (24.000.000 gerenderte Pixel).- PDF hat außerdem ein Maximum von 50 Seiten.
Syntaxhervorhebung
OpenClaw enthält Syntaxhervorhebung für gängige Quellcode-, Konfigurations- und Dokumentationssprachen:
javascript, typescript, tsx, jsx, json, markdown, yaml, css, html, sh, python, go, rust, java, c, cpp, csharp, php, sql, docker, ruby, swift, kotlin, r, dart, lua, powershell, xml und toml.
Gängige Aliase wie js, ts, bash, md, yml, c++, dockerfile, rb, kt und ps1 werden auf diese Standardsprachen normalisiert.
Installieren Sie das Diff Viewer Language Pack Plugin, um weitere Sprachen hervorzuheben:
openclaw plugins install clawhub:@openclaw/diffs-language-packWenn das Language Pack verfügbar ist, kann OpenClaw deutlich mehr Sprachen hervorheben. Wenn das Pack nicht installiert ist, werden Dateien außerhalb der Standardliste weiterhin als lesbarer Klartext dargestellt. Beispiele sind Astro, Vue, Svelte, MDX, GraphQL, Terraform/HCL, Nix, Clojure, Elixir, Haskell, OCaml, Scala, Zig, Solidity, Verilog/VHDL, Fortran, MATLAB, LaTeX, Mermaid, Sass/Less/SCSS, Nginx, Apache, CSV, dotenv, INI und Diff-Dateien.
Weitere Details finden Sie unter Diffs Language Pack Plugin und den Upstream-Sprach- und Alias-Katalog von Shiki unter Shiki-Sprachen.
Vertrag für Ausgabedetails
Das Tool gibt strukturierte Metadaten unter details zurück.
Viewer fields
Gemeinsame Felder für Modi, die einen Viewer erstellen:
artifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId,sessionId,messageChannel,agentAccountId, sofern verfügbar)
File fields
Dateifelder, wenn PNG oder PDF gerendert wird:
artifactIdexpiresAtfilePathpath(derselbe Wert wiefilePath, für Kompatibilität mit Message-Tools)fileBytesfileFormatfileQualityfileScalefileMaxWidth
Compatibility aliases
Wird für bestehende Aufrufer ebenfalls zurückgegeben:
format(derselbe Wert wiefileFormat)imagePath(derselbe Wert wiefilePath)imageBytes(derselbe Wert wiefileBytes)imageQuality(derselbe Wert wiefileQuality)imageScale(derselbe Wert wiefileScale)imageMaxWidth(derselbe Wert wiefileMaxWidth)
Zusammenfassung des Modusverhaltens:
| Modus | Zurückgegebene Werte |
|---|---|
"view" |
Nur Viewer-Felder. |
"file" |
Nur Dateifelder, kein Viewer-Artefakt. |
"both" |
Viewer-Felder plus Dateifelder. Wenn das Datei-Rendering fehlschlägt, wird der Viewer dennoch mit fileError und dem Alias imageError zurückgegeben. |
Eingeklappte unveränderte Abschnitte
- Der Viewer kann Zeilen wie
N unmodified linesanzeigen. - Erweiterungssteuerelemente in diesen Zeilen sind bedingt und nicht für jede Eingabeart garantiert.
- Erweiterungssteuerelemente erscheinen, wenn der gerenderte Diff erweiterbare Kontextdaten enthält, was typisch für Vorher- und Nachher-Eingaben ist.
- Bei vielen Unified-Patch-Eingaben sind ausgelassene Kontextkörper in den geparsten Patch-Hunks nicht verfügbar, sodass die Zeile ohne Erweiterungssteuerelemente erscheinen kann. Dieses Verhalten ist erwartet.
expandUnchangedgilt nur, wenn erweiterbarer Kontext vorhanden ist.
Plugin-Standardeinstellungen
Legen Sie Plugin-weite Standardeinstellungen in ~/.openclaw/openclaw.json fest:
{ plugins: { entries: { diffs: { enabled: true, config: { defaults: { fontFamily: "Fira Code", fontSize: 15, lineSpacing: 1.6, layout: "unified", showLineNumbers: true, diffIndicators: "bars", wordWrap: true, background: true, theme: "dark", fileFormat: "png", fileQuality: "standard", fileScale: 2, fileMaxWidth: 960, mode: "both", ttlSeconds: 21600, }, }, }, }, },}Unterstützte Standardeinstellungen:
fontFamilyfontSizelineSpacinglayoutshowLineNumbersdiffIndicatorswordWrapbackgroundthemefileFormatfileQualityfileScalefileMaxWidthmodettlSeconds
Explizite Tool-Parameter überschreiben diese Standardeinstellungen.
Konfiguration persistenter Viewer-URLs
viewerBaseUrlstringPlugin-eigener Fallback für zurückgegebene Viewer-Links, wenn ein Tool-Aufruf keine baseUrl übergibt. Muss http oder https sein, ohne Query/Hash.
{ plugins: { entries: { diffs: { enabled: true, config: { viewerBaseUrl: "https://gateway.example.com/openclaw", }, }, }, },}Sicherheitskonfiguration
security.allowRemoteViewerbooleandefault: falsefalse: Nicht-loopback-Anfragen an Viewer-Routen werden abgelehnt. true: Remote-Viewer sind zulässig, wenn der tokenisierte Pfad gültig ist.
{ plugins: { entries: { diffs: { enabled: true, config: { security: { allowRemoteViewer: false, }, }, }, }, },}Artefaktlebenszyklus und Speicherung
- Artefakte werden im temporären Unterordner gespeichert:
$TMPDIR/openclaw-diffs. - Viewer-Artefaktmetadaten enthalten:
- zufällige Artefakt-ID (20 Hex-Zeichen)
- zufälliges Token (48 Hex-Zeichen)
createdAtundexpiresAt- gespeicherter
viewer.html-Pfad
- Die Standard-TTL für Artefakte beträgt 30 Minuten, wenn nichts angegeben ist.
- Die maximal akzeptierte Viewer-TTL beträgt 6 Stunden.
- Die Bereinigung läuft opportunistisch nach der Artefakterstellung.
- Abgelaufene Artefakte werden gelöscht.
- Die Fallback-Bereinigung entfernt veraltete Ordner, die älter als 24 Stunden sind, wenn Metadaten fehlen.
Viewer-URL und Netzwerkverhalten
Viewer-Route:
/plugins/diffs/view/{artifactId}/{token}
Viewer-Assets:
/plugins/diffs/assets/viewer.js/plugins/diffs/assets/viewer-runtime.js/plugins/diffs-language-pack/assets/viewer.js, wenn das Diff eine Sprache aus dem Diff Viewer Language Pack verwendet
Das Viewer-Dokument löst diese Assets relativ zur Viewer-URL auf, sodass ein optionales baseUrl-Pfadpräfix auch für beide Asset-Anfragen beibehalten wird.
Verhalten bei der URL-Erstellung:
- Wenn beim Tool-Aufruf
baseUrlangegeben ist, wird es nach strenger Validierung verwendet. - Andernfalls wird, wenn im Plugin
viewerBaseUrlkonfiguriert ist, dieser Wert verwendet. - Ohne eine der beiden Überschreibungen verwendet die Viewer-URL standardmäßig die Loopback-Adresse
127.0.0.1. - Wenn der Gateway-Bind-Modus
customist undgateway.customBindHostgesetzt ist, wird dieser Host verwendet.
baseUrl-Regeln:
- Muss
http://oderhttps://sein. - Query und Hash werden abgelehnt.
- Origin plus optionaler Basispfad ist erlaubt.
Sicherheitsmodell
Viewer-Härtung
- Standardmäßig nur Loopback.
- Tokenisierte Viewer-Pfade mit strenger ID- und Token-Validierung.
- CSP der Viewer-Antwort:
default-src 'none'- Skripte und Assets nur von self
- kein ausgehendes
connect-src
- Drosselung von Remote-Fehlschlägen, wenn Remote-Zugriff aktiviert ist:
- 40 Fehlschläge pro 60 Sekunden
- 60 Sekunden Sperre (
429 Too Many Requests)
Härtung des Datei-Renderings
- Das Routing von Screenshot-Browseranfragen ist standardmäßig verweigernd.
- Nur lokale Viewer-Assets von
http://127.0.0.1/plugins/diffs/assets/*sind erlaubt. - Externe Netzwerkanfragen werden blockiert.
Browseranforderungen für den Dateimodus
mode: "file" und mode: "both" benötigen einen Chromium-kompatiblen Browser.
Auflösungsreihenfolge:
Konfiguration
browser.executablePath in der OpenClaw-Konfiguration.
Umgebungsvariablen
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
Plattform-Fallback
Fallback für Plattform-Befehls-/Pfaderkennung.
Häufiger Fehlertext:
Diff PNG/PDF rendering requires a Chromium-compatible browser...
Beheben Sie dies, indem Sie Chrome, Chromium, Edge oder Brave installieren oder eine der oben genannten Optionen für den ausführbaren Pfad setzen.
Fehlerbehebung
Eingabevalidierungsfehler
Provide patch or both before and after text.— geben Sie sowohlbeforeals auchafteran oder stellen Siepatchbereit.Provide either patch or before/after input, not both.— mischen Sie die Eingabemodi nicht.Invalid baseUrl: ...— verwenden Sie einehttp(s)-Origin mit optionalem Pfad, ohne Query/Hash.{field} exceeds maximum size (...)— reduzieren Sie die Payload-Größe.- Ablehnung großer Patches — reduzieren Sie die Anzahl der Patch-Dateien oder die Gesamtzahl der Zeilen.
Viewer-Zugänglichkeit
- Die Viewer-URL wird standardmäßig zu
127.0.0.1aufgelöst. - Für Remote-Zugriffsszenarien können Sie entweder:
- im Plugin
viewerBaseUrlsetzen, oder baseUrlpro Tool-Aufruf übergeben, odergateway.bind=customundgateway.customBindHostverwenden
- im Plugin
- Wenn
gateway.trustedProxiesLoopback für einen Same-Host-Proxy enthält (zum Beispiel Tailscale Serve), schlagen rohe Loopback-Viewer-Anfragen ohne weitergeleitete Client-IP-Header absichtlich fail-closed fehl. - Für diese Proxy-Topologie:
- bevorzugen Sie
mode: "file"odermode: "both", wenn Sie nur einen Anhang benötigen, oder - aktivieren Sie bewusst
security.allowRemoteViewerund setzen Sie im PluginviewerBaseUrloder übergeben Sie eine Proxy-/öffentlichebaseUrl, wenn Sie eine teilbare Viewer-URL benötigen
- bevorzugen Sie
- Aktivieren Sie
security.allowRemoteViewernur, wenn Sie externen Viewer-Zugriff beabsichtigen.
Zeile mit unveränderten Zeilen hat keine Aufklappschaltfläche
Dies kann bei Patch-Eingaben passieren, wenn der Patch keinen erweiterbaren Kontext enthält. Das ist erwartet und weist nicht auf einen Viewer-Fehler hin.
Artefakt nicht gefunden
- Artefakt ist wegen TTL abgelaufen.
- Token oder Pfad wurde geändert.
- Bereinigung hat veraltete Daten entfernt.
Operative Leitlinien
- Bevorzugen Sie
mode: "view"für lokale interaktive Reviews im Canvas. - Bevorzugen Sie
mode: "file"für ausgehende Chat-Kanäle, die einen Anhang benötigen. - Lassen Sie
allowRemoteViewerdeaktiviert, sofern Ihre Bereitstellung keine Remote-Viewer-URLs erfordert. - Setzen Sie explizite kurze
ttlSecondsfür sensible Diffs. - Vermeiden Sie es, Secrets in Diff-Eingaben zu senden, wenn dies nicht erforderlich ist.
- Wenn Ihr Kanal Bilder stark komprimiert (zum Beispiel Telegram oder WhatsApp), bevorzugen Sie die PDF-Ausgabe (
fileFormat: "pdf").