Tools
Các khác biệt
diffs là một công cụ Plugin tùy chọn với hướng dẫn hệ thống tích hợp ngắn gọn và một skill đi kèm, dùng để biến nội dung thay đổi thành một artifact diff chỉ đọc cho agent.
Nó chấp nhận một trong hai dạng:
- văn bản
beforevàafter - một
patchhợp nhất
Nó có thể trả về:
- URL trình xem Gateway để trình bày trên canvas
- đường dẫn tệp đã render (PNG hoặc PDF) để gửi qua tin nhắn
- cả hai đầu ra trong một lần gọi
Khi được bật, Plugin sẽ thêm hướng dẫn sử dụng ngắn gọn vào không gian system-prompt và cũng cung cấp một skill chi tiết cho các trường hợp agent cần hướng dẫn đầy đủ hơn.
Bắt đầu nhanh
Cài đặt Plugin
openclaw plugins install diffs
Bật Plugin
{
plugins: {
entries: {
diffs: {
enabled: true,
},
},
},
}
Chọn một chế độ
view
Luồng ưu tiên canvas: agent gọi diffs với mode: "view" và mở details.viewerUrl bằng canvas present.
file
Gửi tệp trong chat: agent gọi diffs với mode: "file" và gửi details.filePath bằng message, sử dụng path hoặc filePath.
both
Kết hợp: agent gọi diffs với mode: "both" để nhận cả hai artifact trong một lần gọi.
Tắt hướng dẫn hệ thống tích hợp
Nếu bạn muốn giữ công cụ diffs được bật nhưng tắt hướng dẫn system-prompt tích hợp của nó, hãy đặt plugins.entries.diffs.hooks.allowPromptInjection thành false:
{
plugins: {
entries: {
diffs: {
enabled: true,
hooks: {
allowPromptInjection: false,
},
},
},
},
}
Thao tác này chặn hook before_prompt_build của Plugin diffs trong khi vẫn giữ Plugin, công cụ và skill đi kèm khả dụng.
Nếu bạn muốn tắt cả hướng dẫn lẫn công cụ, hãy tắt Plugin thay vào đó.
Quy trình agent điển hình
Gọi diffs
Agent gọi công cụ diffs với đầu vào.
Đọc chi tiết
Agent đọc các trường details từ phản hồi.
Trình bày
Agent mở details.viewerUrl bằng canvas present, gửi details.filePath bằng message sử dụng path hoặc filePath, hoặc thực hiện cả hai.
Ví dụ đầu vào
Trước và sau
{
"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"
}
Tham chiếu đầu vào công cụ
Tất cả các trường đều là tùy chọn trừ khi có ghi chú.
beforestringVăn bản gốc. Bắt buộc cùng với after khi bỏ qua patch.
afterstringVăn bản đã cập nhật. Bắt buộc cùng với before khi bỏ qua patch.
patchstringVăn bản diff hợp nhất. Loại trừ lẫn nhau với before và after.
pathstringTên tệp hiển thị cho chế độ trước và sau.
langstringGợi ý ghi đè ngôn ngữ cho chế độ trước và sau. Giá trị không xác định sẽ quay về văn bản thuần.
titlestringGhi đè tiêu đề trình xem.
mode"view" | "file" | "both"Chế độ đầu ra. Mặc định là giá trị mặc định của Plugin defaults.mode. Bí danh không còn khuyến nghị: "image" hoạt động như "file" và vẫn được chấp nhận để tương thích ngược.
theme"light" | "dark"Giao diện trình xem. Mặc định là giá trị mặc định của Plugin defaults.theme.
layout"unified" | "split"Bố cục diff. Mặc định là giá trị mặc định của Plugin defaults.layout.
expandUnchangedbooleanMở rộng các phần không thay đổi khi có đầy đủ ngữ cảnh. Chỉ là tùy chọn cho từng lần gọi (không phải khóa mặc định của Plugin).
fileFormat"png" | "pdf"Định dạng tệp đã render. Mặc định là giá trị mặc định của Plugin defaults.fileFormat.
fileQuality"standard" | "hq" | "print"Preset chất lượng cho kết xuất PNG hoặc PDF.
fileScalenumberGhi đè tỷ lệ thiết bị (1-4).
fileMaxWidthnumberChiều rộng render tối đa theo pixel CSS (640-2400).
ttlSecondsnumberTTL artifact tính bằng giây cho đầu ra trình xem và tệp độc lập. Tối đa 21600.
baseUrlstringGhi đè origin URL trình xem. Ghi đè viewerBaseUrl của Plugin. Phải là http hoặc https, không có query/hash.
Bí danh đầu vào cũ
Vẫn được chấp nhận để tương thích ngược:
format->fileFormatimageFormat->fileFormatimageQuality->fileQualityimageScale->fileScaleimageMaxWidth->fileMaxWidth
Xác thực và giới hạn
beforevàaftermỗi trường tối đa 512 KiB.patchtối đa 2 MiB.pathtối đa 2048 byte.langtối đa 128 byte.titletối đa 1024 byte.- Giới hạn độ phức tạp của patch: tối đa 128 tệp và tổng cộng 120000 dòng.
patchcùng vớibeforehoặcaftersẽ bị từ chối.- Giới hạn an toàn cho tệp đã render (áp dụng cho PNG và PDF):
fileQuality: "standard": tối đa 8 MP (8.000.000 pixel đã render).fileQuality: "hq": tối đa 14 MP (14.000.000 pixel đã render).fileQuality: "print": tối đa 24 MP (24.000.000 pixel đã render).- PDF cũng có giới hạn tối đa 50 trang.
Hợp đồng chi tiết đầu ra
Công cụ trả về metadata có cấu trúc trong details.
Trường trình xem
Các trường dùng chung cho các chế độ tạo trình xem:
artifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId,sessionId,messageChannel,agentAccountIdkhi có)
Trường tệp
Các trường tệp khi PNG hoặc PDF được render:
artifactIdexpiresAtfilePathpath(cùng giá trị vớifilePath, để tương thích với công cụ message)fileBytesfileFormatfileQualityfileScalefileMaxWidth
Bí danh tương thích
Cũng được trả về cho các caller hiện có:
format(cùng giá trị vớifileFormat)imagePath(cùng giá trị vớifilePath)imageBytes(cùng giá trị vớifileBytes)imageQuality(cùng giá trị vớifileQuality)imageScale(cùng giá trị vớifileScale)imageMaxWidth(cùng giá trị vớifileMaxWidth)
Tóm tắt hành vi chế độ:
| Chế độ | Nội dung được trả về |
|---|---|
"view" |
Chỉ các trường trình xem. |
"file" |
Chỉ các trường tệp, không có artifact trình xem. |
"both" |
Các trường trình xem cộng với các trường tệp. Nếu render tệp thất bại, trình xem vẫn được trả về cùng với bí danh fileError và imageError. |
Các phần không thay đổi được thu gọn
- Trình xem có thể hiển thị các hàng như
N unmodified lines. - Các điều khiển mở rộng trên những hàng đó là có điều kiện và không được bảo đảm cho mọi loại đầu vào.
- Các điều khiển mở rộng xuất hiện khi diff đã render có dữ liệu ngữ cảnh có thể mở rộng, điều này thường gặp với đầu vào trước và sau.
- Với nhiều đầu vào patch hợp nhất, nội dung ngữ cảnh bị bỏ qua không có trong các hunk patch đã phân tích, vì vậy hàng có thể xuất hiện mà không có điều khiển mở rộng. Đây là hành vi dự kiến.
expandUnchangedchỉ áp dụng khi tồn tại ngữ cảnh có thể mở rộng.
Giá trị mặc định của Plugin
Đặt các giá trị mặc định trên toàn Plugin trong ~/.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",
},
},
},
},
},
}
Các giá trị mặc định được hỗ trợ:
fontFamilyfontSizelineSpacinglayoutshowLineNumbersdiffIndicatorswordWrapbackgroundthemefileFormatfileQualityfileScalefileMaxWidthmode
Các tham số công cụ được chỉ định rõ sẽ ghi đè những giá trị mặc định này.
Cấu hình URL trình xem bền vững
viewerBaseUrlstringPhương án dự phòng do Plugin sở hữu cho các liên kết trình xem được trả về khi một lần gọi công cụ không truyền baseUrl. Phải là http hoặc https, không có query/hash.
{
plugins: {
entries: {
diffs: {
enabled: true,
config: {
viewerBaseUrl: "https://gateway.example.com/openclaw",
},
},
},
},
}
Cấu hình bảo mật
security.allowRemoteViewerbooleanfalse: các yêu cầu không phải loopback đến route trình xem bị từ chối. true: trình xem từ xa được cho phép nếu đường dẫn có token hợp lệ.
{
plugins: {
entries: {
diffs: {
enabled: true,
config: {
security: {
allowRemoteViewer: false,
},
},
},
},
},
}
Vòng đời và lưu trữ artifact
- Artifact được lưu dưới thư mục con tạm thời:
$TMPDIR/openclaw-diffs. - Metadata artifact trình xem chứa:
- ID artifact ngẫu nhiên (20 ký tự hex)
- token ngẫu nhiên (48 ký tự hex)
createdAtvàexpiresAt- đường dẫn
viewer.htmlđã lưu
- TTL artifact mặc định là 30 phút khi không được chỉ định.
- TTL trình xem tối đa được chấp nhận là 6 giờ.
- Dọn dẹp chạy theo thời cơ sau khi tạo artifact.
- Artifact hết hạn sẽ bị xóa.
- Dọn dẹp dự phòng xóa các thư mục cũ hơn 24 giờ khi thiếu metadata.
URL trình xem và hành vi mạng
Route trình xem:
/plugins/diffs/view/{artifactId}/{token}
Asset trình xem:
/plugins/diffs/assets/viewer.js/plugins/diffs/assets/viewer-runtime.js
Tài liệu trình xem phân giải các asset đó tương đối với URL trình xem, vì vậy tiền tố đường dẫn baseUrl tùy chọn cũng được giữ lại cho cả các yêu cầu asset.
Hành vi xây dựng URL:
- Nếu
baseUrltrong lần gọi công cụ được cung cấp, nó sẽ được dùng sau khi xác thực nghiêm ngặt. - Ngược lại, nếu
viewerBaseUrlcủa Plugin được cấu hình, nó sẽ được dùng. - Khi không có ghi đè nào, URL trình xem mặc định là loopback
127.0.0.1. - Nếu chế độ bind của Gateway là
customvàgateway.customBindHostđược đặt, host đó sẽ được dùng.
Quy tắc baseUrl:
- Phải là
http://hoặchttps://. - Query và hash bị từ chối.
- Origin cộng với đường dẫn cơ sở tùy chọn được cho phép.
Mô hình bảo mật
Tăng cường bảo mật trình xem
- Mặc định chỉ cho phép loopback.
- Đường dẫn trình xem được token hóa với xác thực ID và token nghiêm ngặt.
- CSP phản hồi của trình xem:
default-src 'none'- script và tài nguyên chỉ từ chính nguồn
- không có
connect-srcđi ra ngoài
- Giới hạn lỗi truy cập từ xa khi quyền truy cập từ xa được bật:
- 40 lỗi trong mỗi 60 giây
- khóa trong 60 giây (
429 Too Many Requests)
Tăng cường bảo mật kết xuất tệp
- Định tuyến yêu cầu của trình duyệt chụp màn hình mặc định là từ chối.
- Chỉ các tài nguyên trình xem cục bộ từ
http://127.0.0.1/plugins/diffs/assets/*được cho phép. - Các yêu cầu mạng bên ngoài bị chặn.
Yêu cầu trình duyệt cho chế độ tệp
mode: "file" và mode: "both" cần trình duyệt tương thích với Chromium.
Thứ tự phân giải:
Cấu hình
browser.executablePath trong cấu hình OpenClaw.
Biến môi trường
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
Dự phòng nền tảng
Phương án dự phòng khám phá lệnh/đường dẫn theo nền tảng.
Văn bản lỗi thường gặp:
Diff PNG/PDF rendering requires a Chromium-compatible browser...
Khắc phục bằng cách cài đặt Chrome, Chromium, Edge hoặc Brave, hoặc đặt một trong các tùy chọn đường dẫn tệp thực thi ở trên.
Khắc phục sự cố
Lỗi xác thực đầu vào
Provide patch or both before and after text.— bao gồm cảbeforevàafter, hoặc cung cấppatch.Provide either patch or before/after input, not both.— không trộn các chế độ đầu vào.Invalid baseUrl: ...— dùng originhttp(s)với đường dẫn tùy chọn, không có query/hash.{field} exceeds maximum size (...)— giảm kích thước payload.- Bản vá lớn bị từ chối — giảm số lượng tệp bản vá hoặc tổng số dòng.
Khả năng truy cập trình xem
- URL trình xem mặc định phân giải tới
127.0.0.1. - Đối với các trường hợp truy cập từ xa, hãy:
- đặt
viewerBaseUrlcủa Plugin, hoặc - truyền
baseUrlcho mỗi lệnh gọi công cụ, hoặc - dùng
gateway.bind=customvàgateway.customBindHost
- đặt
- Nếu
gateway.trustedProxiesbao gồm loopback cho proxy cùng máy chủ (ví dụ Tailscale Serve), các yêu cầu trình xem loopback thô không có header client-IP được chuyển tiếp sẽ bị từ chối đóng theo thiết kế. - Với cấu trúc proxy đó:
- ưu tiên
mode: "file"hoặcmode: "both"khi bạn chỉ cần tệp đính kèm, hoặc - chủ ý bật
security.allowRemoteViewervà đặtviewerBaseUrlcủa Plugin hoặc truyềnbaseUrlproxy/công khai khi bạn cần URL trình xem có thể chia sẻ
- ưu tiên
- Chỉ bật
security.allowRemoteViewerkhi bạn có ý định cho phép truy cập trình xem từ bên ngoài.
Hàng dòng chưa sửa đổi không có nút mở rộng
Điều này có thể xảy ra với đầu vào bản vá khi bản vá không mang ngữ cảnh có thể mở rộng. Đây là hành vi dự kiến và không cho thấy trình xem bị lỗi.
Không tìm thấy artifact
- Artifact đã hết hạn do TTL.
- Token hoặc đường dẫn đã thay đổi.
- Dọn dẹp đã xóa dữ liệu cũ.
Hướng dẫn vận hành
- Ưu tiên
mode: "view"cho đánh giá tương tác cục bộ trong canvas. - Ưu tiên
mode: "file"cho các kênh trò chuyện gửi ra ngoài cần tệp đính kèm. - Giữ
allowRemoteViewertắt trừ khi triển khai của bạn yêu cầu URL trình xem từ xa. - Đặt
ttlSecondsngắn rõ ràng cho các diff nhạy cảm. - Tránh gửi bí mật trong đầu vào diff khi không cần thiết.
- Nếu kênh của bạn nén hình ảnh mạnh (ví dụ Telegram hoặc WhatsApp), hãy ưu tiên đầu ra PDF (
fileFormat: "pdf").