Tools
Відмінності
diffs — це необов’язковий Plugin tool із короткими вбудованими системними вказівками та супровідним skill, який перетворює вміст змін на артефакт diff лише для читання для агентів.
Він приймає або:
- текст
beforeіafter - уніфікований
patch
Він може повернути:
- URL переглядача Gateway для подання на canvas
- шлях до відрендереного файлу (PNG або PDF) для доставлення повідомленням
- обидва виходи за один виклик
Коли ввімкнено, Plugin додає стислі вказівки з використання в простір системного prompt, а також надає детальний skill для випадків, коли агенту потрібні повніші інструкції.
Швидкий старт
Установіть Plugin
openclaw plugins install diffs
Увімкніть Plugin
{
plugins: {
entries: {
diffs: {
enabled: true,
},
},
},
}
Виберіть режим
view
Потоки з пріоритетом canvas: агенти викликають diffs з mode: "view" і відкривають details.viewerUrl через canvas present.
file
Доставлення файлу в чаті: агенти викликають diffs з mode: "file" і надсилають details.filePath через message, використовуючи path або filePath.
both
Комбіновано: агенти викликають diffs з mode: "both", щоб отримати обидва артефакти за один виклик.
Вимкнення вбудованих системних вказівок
Якщо ви хочете залишити tool diffs увімкненим, але вимкнути його вбудовані вказівки системного prompt, установіть plugins.entries.diffs.hooks.allowPromptInjection у false:
{
plugins: {
entries: {
diffs: {
enabled: true,
hooks: {
allowPromptInjection: false,
},
},
},
},
}
Це блокує hook before_prompt_build Plugin diffs, водночас залишаючи Plugin, tool і супровідний skill доступними.
Якщо ви хочете вимкнути і вказівки, і tool, натомість вимкніть Plugin.
Типовий робочий процес агента
Викличте diffs
Агент викликає tool diffs із вхідними даними.
Прочитайте details
Агент читає поля details з відповіді.
Подайте
Агент або відкриває details.viewerUrl через canvas present, надсилає details.filePath через message, використовуючи path або filePath, або робить і те, й інше.
Приклади вхідних даних
До і після
{
"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"
}
Довідник вхідних даних tool
Усі поля необов’язкові, якщо не зазначено інше.
beforestringОригінальний текст. Обов’язково разом із after, коли patch пропущено.
afterstringОновлений текст. Обов’язково разом із before, коли patch пропущено.
patchstringТекст уніфікованого diff. Взаємовиключний із before і after.
pathstringІм’я файлу для показу в режимі до і після.
langstringПідказка перевизначення мови для режиму до і після. Невідомі значення повертаються до простого тексту.
titlestringПеревизначення заголовка переглядача.
mode"view" | "file" | "both"Режим виводу. За замовчуванням використовується типове значення Plugin defaults.mode. Застарілий псевдонім: "image" поводиться як "file" і все ще приймається для зворотної сумісності.
theme"light" | "dark"Тема переглядача. За замовчуванням використовується типове значення Plugin defaults.theme.
layout"unified" | "split"Макет diff. За замовчуванням використовується типове значення Plugin defaults.layout.
expandUnchangedbooleanРозгортати незмінені секції, коли доступний повний контекст. Опція лише для окремого виклику (не ключ типових значень Plugin).
fileFormat"png" | "pdf"Формат відрендереного файлу. За замовчуванням використовується типове значення Plugin defaults.fileFormat.
fileQuality"standard" | "hq" | "print"Набір якості для рендерингу PNG або PDF.
fileScalenumberПеревизначення масштабу пристрою (1-4).
fileMaxWidthnumberМаксимальна ширина рендерингу в CSS-пікселях (640-2400).
ttlSecondsnumberTTL артефакту в секундах для виводів переглядача й автономного файлу. Максимум 21600.
baseUrlstringПеревизначення origin URL переглядача. Перевизначає Plugin viewerBaseUrl. Має бути http або https, без query/hash.
Застарілі псевдоніми вхідних даних
Усе ще приймаються для зворотної сумісності:
format->fileFormatimageFormat->fileFormatimageQuality->fileQualityimageScale->fileScaleimageMaxWidth->fileMaxWidth
Валідація та обмеження
beforeіafterкожен максимум 512 KiB.patchмаксимум 2 MiB.pathмаксимум 2048 байтів.langмаксимум 128 байтів.titleмаксимум 1024 байти.- Обмеження складності patch: максимум 128 файлів і 120000 рядків загалом.
patchразом ізbeforeабоafterвідхиляються.- Обмеження безпеки відрендереного файлу (застосовуються до PNG і PDF):
fileQuality: "standard": максимум 8 MP (8,000,000 відрендерених пікселів).fileQuality: "hq": максимум 14 MP (14,000,000 відрендерених пікселів).fileQuality: "print": максимум 24 MP (24,000,000 відрендерених пікселів).- PDF також має максимум 50 сторінок.
Контракт вихідних details
Tool повертає структуровані метадані в details.
Поля переглядача
Спільні поля для режимів, які створюють переглядач:
artifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId,sessionId,messageChannel,agentAccountId, коли доступно)
Поля файлу
Поля файлу, коли рендериться PNG або PDF:
artifactIdexpiresAtfilePathpath(те саме значення, що йfilePath, для сумісності з message tool)fileBytesfileFormatfileQualityfileScalefileMaxWidth
Псевдоніми сумісності
Також повертаються для наявних викликачів:
format(те саме значення, що йfileFormat)imagePath(те саме значення, що йfilePath)imageBytes(те саме значення, що йfileBytes)imageQuality(те саме значення, що йfileQuality)imageScale(те саме значення, що йfileScale)imageMaxWidth(те саме значення, що йfileMaxWidth)
Підсумок поведінки режимів:
| Режим | Що повертається |
|---|---|
"view" |
Лише поля переглядача. |
"file" |
Лише поля файлу, без артефакту переглядача. |
"both" |
Поля переглядача плюс поля файлу. Якщо рендеринг файлу завершується невдало, переглядач усе одно повертається з fileError і псевдонімом imageError. |
Згорнуті незмінені секції
- Переглядач може показувати рядки на кшталт
N unmodified lines. - Елементи керування розгортанням на цих рядках умовні й не гарантуються для кожного виду вхідних даних.
- Елементи керування розгортанням з’являються, коли відрендерений diff має дані контексту, які можна розгорнути, що типово для вхідних даних до і після.
- Для багатьох вхідних даних уніфікованого patch пропущені тіла контексту недоступні в розібраних фрагментах patch, тому рядок може з’явитися без елементів керування розгортанням. Це очікувана поведінка.
expandUnchangedзастосовується лише коли існує контекст, який можна розгорнути.
Типові значення Plugin
Задайте типові значення на рівні Plugin у ~/.openclaw/openclaw.json:
{
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",
},
},
},
},
},
}
Підтримувані типові значення:
fontFamilyfontSizelineSpacinglayoutshowLineNumbersdiffIndicatorswordWrapbackgroundthemefileFormatfileQualityfileScalefileMaxWidthmode
Явні параметри tool перевизначають ці типові значення.
Конфігурація постійного URL переглядача
viewerBaseUrlstringРезервний варіант, що належить Plugin, для повернених посилань переглядача, коли виклик tool не передає baseUrl. Має бути http або https, без query/hash.
{
plugins: {
entries: {
diffs: {
enabled: true,
config: {
viewerBaseUrl: "https://gateway.example.com/openclaw",
},
},
},
},
}
Конфігурація безпеки
security.allowRemoteViewerbooleanfalse: non-loopback запити до маршрутів переглядача заборонено. true: віддалені переглядачі дозволені, якщо токенізований шлях чинний.
{
plugins: {
entries: {
diffs: {
enabled: true,
config: {
security: {
allowRemoteViewer: false,
},
},
},
},
},
}
Життєвий цикл і зберігання артефактів
- Артефакти зберігаються в тимчасовій підпапці:
$TMPDIR/openclaw-diffs. - Метадані артефакту переглядача містять:
- випадковий ID артефакту (20 hex chars)
- випадковий токен (48 hex chars)
createdAtіexpiresAt- збережений шлях
viewer.html
- Типовий TTL артефакту становить 30 хвилин, якщо не зазначено інше.
- Максимальний прийнятий TTL переглядача становить 6 годин.
- Очищення запускається опортуністично після створення артефакту.
- Прострочені артефакти видаляються.
- Резервне очищення видаляє застарілі папки, старші за 24 години, коли метадані відсутні.
URL переглядача та мережева поведінка
Маршрут переглядача:
/plugins/diffs/view/{artifactId}/{token}
Ресурси переглядача:
/plugins/diffs/assets/viewer.js/plugins/diffs/assets/viewer-runtime.js
Документ переглядача розв’язує ці ресурси відносно URL переглядача, тому необов’язковий префікс шляху baseUrl також зберігається для обох запитів ресурсів.
Поведінка побудови URL:
- Якщо надано
baseUrlвиклику tool, він використовується після суворої валідації. - Інакше, якщо налаштовано Plugin
viewerBaseUrl, використовується він. - Без будь-якого перевизначення URL переглядача за замовчуванням використовує loopback
127.0.0.1. - Якщо режим прив’язування Gateway —
customі встановленоgateway.customBindHost, використовується цей хост.
Правила baseUrl:
- Має бути
http://абоhttps://. - Query і hash відхиляються.
- Дозволено origin плюс необов’язковий базовий шлях.
Модель безпеки
Посилення захисту переглядача
- Лише loopback за замовчуванням.
- Токенізовані шляхи переглядача зі строгою перевіркою ID і токена.
- CSP відповіді переглядача:
default-src 'none'- скрипти й ресурси лише з self
- без вихідного
connect-src
- Обмеження віддалених промахів, коли віддалений доступ увімкнено:
- 40 збоїв за 60 секунд
- 60-секундне блокування (
429 Too Many Requests)
Посилення захисту рендерингу файлів
- Маршрутизація браузерних запитів для знімків екрана за замовчуванням усе забороняє.
- Дозволені лише локальні ресурси переглядача з
http://127.0.0.1/plugins/diffs/assets/*. - Зовнішні мережеві запити заблоковано.
Вимоги браузера для файлового режиму
mode: "file" і mode: "both" потребують Chromium-сумісного браузера.
Порядок визначення:
Конфігурація
browser.executablePath у конфігурації OpenClaw.
Змінні середовища
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
Резервний варіант платформи
Резервне виявлення команди/шляху платформи.
Поширений текст помилки:
Diff PNG/PDF rendering requires a Chromium-compatible browser...
Виправте, встановивши Chrome, Chromium, Edge або Brave, або задавши один із варіантів шляху до виконуваного файла вище.
Усунення несправностей
Помилки перевірки вхідних даних
Provide patch or both before and after text.— додайте іbefore, іafter, або надайтеpatch.Provide either patch or before/after input, not both.— не змішуйте режими введення.Invalid baseUrl: ...— використовуйте джерелоhttp(s)з необов’язковим шляхом, без query/hash.{field} exceeds maximum size (...)— зменште розмір корисного навантаження.- Відхилення великого патча — зменште кількість файлів патча або загальну кількість рядків.
Доступність переглядача
- URL переглядача за замовчуванням розв’язується в
127.0.0.1. - Для сценаріїв віддаленого доступу:
- задайте
viewerBaseUrlPlugin, або - передайте
baseUrlдля кожного виклику інструмента, або - використайте
gateway.bind=customіgateway.customBindHost
- задайте
- Якщо
gateway.trustedProxiesмістить loopback для проксі на тому самому хості (наприклад, Tailscale Serve), необроблені loopback-запити переглядача без перенаправлених заголовків client-IP навмисно завершуються закрито. - Для такої топології проксі:
- надавайте перевагу
mode: "file"абоmode: "both", коли потрібне лише вкладення, або - навмисно ввімкніть
security.allowRemoteViewerі задайтеviewerBaseUrlPlugin або передайте проксі/публічнийbaseUrl, коли потрібен URL переглядача, яким можна поділитися
- надавайте перевагу
- Вмикайте
security.allowRemoteViewerлише тоді, коли вам потрібен зовнішній доступ до переглядача.
У рядку незмінених рядків немає кнопки розгортання
Це може трапитися для введення патча, коли патч не містить розгортного контексту. Це очікувано й не вказує на збій переглядача.
Артефакт не знайдено
- Термін дії артефакта минув через TTL.
- Токен або шлях змінився.
- Очищення видалило застарілі дані.
Операційні рекомендації
- Надавайте перевагу
mode: "view"для локальних інтерактивних рев’ю в canvas. - Надавайте перевагу
mode: "file"для вихідних каналів чату, яким потрібне вкладення. - Тримайте
allowRemoteViewerвимкненим, якщо ваше розгортання не потребує віддалених URL переглядача. - Задавайте явні короткі
ttlSecondsдля чутливих diff. - Не надсилайте секрети у вхідних даних diff, якщо це не потрібно.
- Якщо ваш канал сильно стискає зображення (наприклад, Telegram або WhatsApp), надавайте перевагу виводу PDF (
fileFormat: "pdf").