docs/docs/de/tools/diffs.md
2026-05-02 06:50:45 +00:00

18 KiB

read_when sidebarTitle summary title x-i18n
Sie möchten, dass Agenten Code- oder Markdown-Änderungen als Diffs anzeigen
Sie möchten eine Canvas-fähige Viewer-URL oder eine gerenderte Diff-Datei
Sie benötigen kontrollierte, temporäre Diff-Artefakte mit sicheren Standardeinstellungen
Diffs Schreibgeschützter Diff-Viewer und Dateirenderer für Agenten (optionales Plugin-Tool) Unterschiede
generated_at model provider source_hash source_path workflow
2026-05-02T06:47:17Z gpt-5.5 openai 935f19ce45ff9a91d2c87c70603ce39b0f27f3fe58e52d809f25000a0c1ae82f tools/diffs.md 16

diffs ist ein optionales Plugin-Tool mit kurzer integrierter Systemanleitung und einer begleitenden Skill, die Änderungsinhalte in ein schreibgeschütztes Diff-Artefakt für Agenten umwandelt.

Es akzeptiert entweder:

  • Text für before und after
  • einen vereinheitlichten patch

Es kann 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 dem System-Prompt-Bereich eine knappe Nutzungsanleitung voran und stellt außerdem eine ausführliche Skill für Fälle bereit, in denen der Agent vollständigere Anweisungen benötigt.

Schnellstart

```bash openclaw plugins install diffs ``` ```json5 { plugins: { entries: { diffs: { enabled: true, }, }, }, } ``` Canvas-zentrierte Abläufe: Agenten rufen `diffs` mit `mode: "view"` auf und öffnen `details.viewerUrl` mit `canvas present`. Chat-Dateizustellung: Agenten rufen `diffs` mit `mode: "file"` auf und senden `details.filePath` mit `message` unter Verwendung von `path` oder `filePath`. 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,
        },
      },
    },
  },
}

Dadurch wird der Hook before_prompt_build des diffs-Plugins blockiert, während Plugin, Tool und begleitende Skill verfügbar bleiben.

Wenn Sie sowohl die Anleitung als auch das Tool deaktivieren möchten, deaktivieren Sie stattdessen das Plugin.

Typischer Agenten-Workflow

Der Agent ruft das Tool `diffs` mit Eingabe auf. Der Agent liest die Felder aus `details` aus der Antwort. 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

```json { "before": "# Hello\n\nOne", "after": "# Hello\n\nTwo", "path": "docs/example.md", "mode": "view" } ``` ```json { "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.

Ursprünglicher Text. Erforderlich mit `after`, wenn `patch` weggelassen wird. Aktualisierter Text. Erforderlich mit `before`, wenn `patch` weggelassen wird. Vereinheitlichter Diff-Text. Gegenseitig ausgeschlossen mit `before` und `after`. Anzuzeigender Dateiname für den Vorher-Nachher-Modus. Hinweis zur Sprachüberschreibung für den Vorher-Nachher-Modus. Unbekannte Werte fallen auf Nur-Text zurück. Überschreibung des Viewer-Titels. 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. Viewer-Theme. Standardmäßig der Plugin-Standardwert `defaults.theme`. Diff-Layout. Standardmäßig der Plugin-Standardwert `defaults.layout`. Unveränderte Abschnitte erweitern, wenn vollständiger Kontext verfügbar ist. Nur Option pro Aufruf (kein Plugin-Standardschlüssel). Gerendertes Dateiformat. Standardmäßig der Plugin-Standardwert `defaults.fileFormat`. Qualitätsvorgabe für PNG- oder PDF-Rendering. Überschreibung der Geräteskalierung (`1`-`4`). Maximale Renderbreite in CSS-Pixeln (`640`-`2400`). Artefakt-TTL in Sekunden für Viewer- und eigenständige Dateiausgaben. Maximal 21600. Überschreibung des Viewer-URL-Ursprungs. Überschreibt Plugin `viewerBaseUrl`. Muss `http` oder `https` sein, ohne Query/Hash. Aus Gründen der Abwärtskompatibilität weiterhin akzeptiert:
- `format` -> `fileFormat`
- `imageFormat` -> `fileFormat`
- `imageQuality` -> `fileQuality`
- `imageScale` -> `fileScale`
- `imageMaxWidth` -> `fileMaxWidth`
- `before` und `after` jeweils maximal 512 KiB. - `patch` maximal 2 MiB. - `path` maximal 2048 Byte. - `lang` maximal 128 Byte. - `title` maximal 1024 Byte. - Obergrenze für Patch-Komplexität: maximal 128 Dateien und insgesamt 120000 Zeilen. - `patch` zusammen mit `before` oder `after` wird abgelehnt. - Sicherheitslimits 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.

Vertrag für Ausgabedetails

Das Tool gibt strukturierte Metadaten unter details zurück.

Gemeinsame Felder für Modi, die einen Viewer erstellen:
- `artifactId`
- `viewerUrl`
- `viewerPath`
- `title`
- `expiresAt`
- `inputKind`
- `fileCount`
- `mode`
- `context` (`agentId`, `sessionId`, `messageChannel`, `agentAccountId`, sofern verfügbar)
Dateifelder, wenn PNG oder PDF gerendert wird:
- `artifactId`
- `expiresAt`
- `filePath`
- `path` (derselbe Wert wie `filePath`, für Kompatibilität mit dem Nachrichtentool)
- `fileBytes`
- `fileFormat`
- `fileQuality`
- `fileScale`
- `fileMaxWidth`
Für bestehende Aufrufer ebenfalls zurückgegeben:
- `format` (derselbe Wert wie `fileFormat`)
- `imagePath` (derselbe Wert wie `filePath`)
- `imageBytes` (derselbe Wert wie `fileBytes`)
- `imageQuality` (derselbe Wert wie `fileQuality`)
- `imageScale` (derselbe Wert wie `fileScale`)
- `imageMaxWidth` (derselbe Wert wie `fileMaxWidth`)

Zusammenfassung des Modusverhaltens:

Modus Was zurückgegeben wird
"view" Nur Viewer-Felder.
"file" Nur Dateifelder, kein Viewer-Artefakt.
"both" Viewer-Felder plus Dateifelder. Wenn das Datei-Rendering fehlschlägt, wird der Viewer weiterhin mit dem Alias fileError und imageError zurückgegeben.

Eingeklappte unveränderte Abschnitte

  • Der Viewer kann Zeilen wie N unmodified lines anzeigen.
  • Erweiterungssteuerelemente in diesen Zeilen sind bedingt und nicht für jede Eingabeart garantiert.
  • Erweiterungssteuerelemente erscheinen, wenn der gerenderte Diff erweiterbare Kontextdaten enthält, was für Vorher-Nachher-Eingaben typisch ist.
  • Bei vielen vereinheitlichten Patch-Eingaben sind ausgelassene Kontextkörper in den geparsten Patch-Hunks nicht verfügbar, sodass die Zeile ohne Erweiterungssteuerelemente erscheinen kann. Dies ist erwartetes Verhalten.
  • expandUnchanged gilt 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",
          },
        },
      },
    },
  },
}

Unterstützte Standardeinstellungen:

  • fontFamily
  • fontSize
  • lineSpacing
  • layout
  • showLineNumbers
  • diffIndicators
  • wordWrap
  • background
  • theme
  • fileFormat
  • fileQuality
  • fileScale
  • fileMaxWidth
  • mode

Explizite Tool-Parameter überschreiben diese Standardeinstellungen.

Persistente Viewer-URL-Konfiguration

Plugin-eigener Fallback für zurückgegebene Viewer-Links, wenn ein Tool-Aufruf kein `baseUrl` übergibt. Muss `http` oder `https` sein, ohne Query/Hash.
{
  plugins: {
    entries: {
      diffs: {
        enabled: true,
        config: {
          viewerBaseUrl: "https://gateway.example.com/openclaw",
        },
      },
    },
  },
}

Sicherheitskonfiguration

`false`: Nicht-loopback-Anfragen an Viewer-Routen werden verweigert. `true`: Remote-Viewer sind erlaubt, wenn der tokenisierte Pfad gültig ist.
{
  plugins: {
    entries: {
      diffs: {
        enabled: true,
        config: {
          security: {
            allowRemoteViewer: false,
          },
        },
      },
    },
  },
}

Artefakt-Lebenszyklus 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)
    • createdAt und expiresAt
    • gespeicherter Pfad viewer.html
  • Die Standard-Artefakt-TTL beträgt 30 Minuten, wenn nicht angegeben.
  • Die maximal akzeptierte Viewer-TTL beträgt 6 Stunden.
  • Die Bereinigung wird nach der Artefakterstellung opportunistisch ausgeführt.
  • 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

Das Viewer-Dokument löst diese Assets relativ zur Viewer-URL auf, sodass ein optionales baseUrl-Pfadpräfix auch für beide Asset-Anfragen erhalten bleibt.

Verhalten bei der URL-Erstellung:

  • Wenn baseUrl im Tool-Aufruf angegeben ist, wird es nach strenger Validierung verwendet.
  • Andernfalls wird, wenn Plugin viewerBaseUrl konfiguriert ist, dieser Wert verwendet.
  • Ohne eine der beiden Überschreibungen verwendet die Viewer-URL standardmäßig loopback 127.0.0.1.
  • Wenn der Gateway-Bindemodus custom ist und gateway.customBindHost gesetzt ist, wird dieser Host verwendet.

baseUrl-Regeln:

  • Muss http:// oder https:// sein.
  • Query und Hash werden abgelehnt.
  • Ursprung plus optionaler Basispfad ist erlaubt.

Sicherheitsmodell

- Standardmäßig nur Loopback. - Tokenisierte Viewer-Pfade mit strenger ID- und Token-Validierung. - CSP für Viewer-Antworten: - `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`) - Das Request-Routing des Screenshot-Browsers ist standardmäßig ablehnend. - Nur lokale Viewer-Assets aus `http://127.0.0.1/plugins/diffs/assets/*` sind zulässig. - Externe Netzwerkanfragen werden blockiert.

Browser-Anforderungen für den Dateimodus

mode: "file" und mode: "both" benötigen einen Chromium-kompatiblen Browser.

Auflösungsreihenfolge:

`browser.executablePath` in der OpenClaw-Konfiguration. - `OPENCLAW_BROWSER_EXECUTABLE_PATH` - `BROWSER_EXECUTABLE_PATH` - `PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH` Fallback für die Erkennung von Plattformbefehl/-pfad.

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 festlegen.

Fehlerbehebung

- `Provide patch or both before and after text.` — geben Sie sowohl `before` als auch `after` an oder stellen Sie `patch` bereit. - `Provide either patch or before/after input, not both.` — mischen Sie keine Eingabemodi. - `Invalid baseUrl: ...` — verwenden Sie einen `http(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. - Die Viewer-URL wird standardmäßig zu `127.0.0.1` aufgelöst. - Für Szenarien mit Remote-Zugriff gilt entweder: - setzen Sie Plugin `viewerBaseUrl`, oder - übergeben Sie `baseUrl` pro Tool-Aufruf, oder - verwenden Sie `gateway.bind=custom` und `gateway.customBindHost` - Wenn `gateway.trustedProxies` Loopback für einen Proxy auf demselben Host enthält (zum Beispiel Tailscale Serve), schlagen rohe Loopback-Viewer-Anfragen ohne weitergeleitete Client-IP-Header konstruktionsbedingt geschlossen fehl. - Für diese Proxy-Topologie: - bevorzugen Sie `mode: "file"` oder `mode: "both"`, wenn Sie nur einen Anhang benötigen, oder - aktivieren Sie bewusst `security.allowRemoteViewer` und setzen Sie Plugin `viewerBaseUrl` oder übergeben Sie eine Proxy-/öffentliche `baseUrl`, wenn Sie eine teilbare Viewer-URL benötigen - Aktivieren Sie `security.allowRemoteViewer` nur, wenn Sie externen Viewer-Zugriff beabsichtigen. Dies kann bei Patch-Eingaben passieren, wenn der Patch keinen erweiterbaren Kontext enthält. Dies ist erwartet und weist nicht auf einen Viewer-Fehler hin. - Artefakt ist aufgrund von TTL abgelaufen. - Token oder Pfad wurde geändert. - Bereinigung hat veraltete Daten entfernt.

Betriebliche Hinweise

  • 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 allowRemoteViewer deaktiviert, sofern Ihre Bereitstellung keine Remote-Viewer-URLs erfordert.
  • Legen Sie explizit kurze ttlSeconds für sensible Diffs fest.
  • 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 PDF-Ausgabe (fileFormat: "pdf").
Diff-Rendering-Engine powered by [Diffs](https://diffs.com).

Verwandt