Trang này dành cho tác giả plugin sử dụng
openclaw/plugin-sdk/* bên trong
OpenClaw. Đối với ứng dụng bên ngoài, tập lệnh, bảng điều khiển, tác vụ CI và tiện ích mở rộng IDE
muốn chạy tác tử thông qua Gateway, hãy sử dụng
Tích hợp Gateway cho ứng dụng bên ngoài.Quy ước import
Luôn import từ một đường dẫn con cụ thể:openclaw/plugin-sdk/channel-core; dành openclaw/plugin-sdk/core cho
bề mặt tổng quát rộng hơn và các trình trợ giúp dùng chung như
buildChannelConfigSchema.
Đối với cấu hình kênh, công bố JSON Schema do kênh sở hữu thông qua
openclaw.plugin.json#channelConfigs. Đường dẫn con plugin-sdk/channel-config-schema
dành cho các thành phần nguyên thủy của schema dùng chung và trình tạo tổng quát. Các plugin đi kèm của
OpenClaw sử dụng plugin-sdk/bundled-channel-config-schema cho các schema
kênh đi kèm được duy trì. Đường dẫn con schema đi kèm đó không phải là mẫu cho
các plugin mới.
Tham chiếu đường dẫn con
Plugin SDK được cung cấp dưới dạng một tập hợp các đường dẫn con phạm vi hẹp được nhóm theo khu vực (mục nhập plugin, kênh, nhà cung cấp, xác thực, runtime, khả năng, bộ nhớ và các trình trợ giúp plugin đi kèm được dành riêng). Để xem toàn bộ danh mục — đã được nhóm và liên kết — hãy xem Đường dẫn con của Plugin SDK. Danh mục điểm vào của trình biên dịch nằm trongscripts/lib/plugin-sdk-entrypoints.json; các export của gói được tạo từ
tập con công khai sau khi loại trừ các đường dẫn con kiểm thử/nội bộ cục bộ của kho mã được liệt kê trong
scripts/lib/plugin-sdk-private-local-only-subpaths.json. Chạy
pnpm plugin-sdk:surface để kiểm tra số lượng export công khai. Các đường dẫn con công khai
đã ngừng khuyến nghị, đủ cũ và không được mã sản xuất của tiện ích mở rộng đi kèm sử dụng, được
theo dõi trong scripts/lib/plugin-sdk-deprecated-public-subpaths.json; các barrel tái export rộng
đã ngừng khuyến nghị được theo dõi trong
scripts/lib/plugin-sdk-deprecated-barrel-subpaths.json.
API đăng ký
Hàm callbackregister(api) nhận một đối tượng OpenClawPluginApi có các
phương thức sau:
Các plugin cung cấp bề mặt trò chuyện nhóm bên ngoài cho một phiên có thể đăng ký
nhà cung cấp duy nhất trên toàn tiến trình được export bởi
openclaw/plugin-sdk/session-discussion. Phương thức info({ sessionKey }) của nó
báo cáo cuộc thảo luận đang không khả dụng, sẵn sàng mở hay đã mở;
open({ sessionKey }) tạo hoặc phân giải cuộc thảo luận và trả về các URL nhúng
và bên ngoài của cuộc thảo luận. Việc đăng ký nhà cung cấp khác sẽ thay thế nhà cung cấp hiện tại.
Đăng ký khả năng
Các nhà cung cấp worker cũng phải khai báo mã định danh của mình trong
contracts.workerProviders.
Lõi lưu giữ ý định bền vững trước provision(profile, operationId). Nhà cung cấp xác thực cài đặt trước khi phân bổ bên ngoài và ném WorkerProviderError khi hồ sơ bị từ chối vĩnh viễn. provision phải tiếp nhận cùng một lease khi mã định danh thao tác lặp lại.
Lõi lưu giữ cài đặt hồ sơ đã xác thực cùng lease và cung cấp ảnh chụp nhanh đó cho destroy({ leaseId, profile }), vốn phải có tính lũy đẳng, và inspect({ leaseId, profile }), vốn trả về active, destroyed hoặc unknown. Điều này cho phép nhà cung cấp định tuyến các lệnh gọi vòng đời sau khi gateway khởi động lại hoặc hồ sơ có tên bị xóa. Các điểm cuối SSH sử dụng SecretRef cho keyRef, tuyệt đối không dùng trực tiếp nội dung khóa, và bao gồm hostKey từ đầu ra cấp phát đáng tin cậy dưới dạng chính xác là algorithm base64, không có tên máy chủ hoặc chú thích. Lõi ghim hostKey và tuyệt đối không tin tưởng khóa từ kết nối đầu tiên. Nhà cung cấp tạo keyRef động có thể triển khai resolveSshIdentity({ leaseId, profile, keyRef }); khi có mặt, trình phân giải đó có thẩm quyền, còn nhà cung cấp không có trình phân giải này sẽ sử dụng trình phân giải bí mật tổng quát đã cấu hình.
Các nhà cung cấp có lease có thể gia hạn cũng có thể triển khai renew(leaseId).
inspect phải ném lỗi khi gặp lỗi tạm thời hoặc không xác định; chỉ trả về unknown khi chắc chắn không tồn tại. Lõi đánh dấu một bản ghi cục bộ đang hoạt động là mồ côi hoặc coi sự vắng mặt đó là hoàn tất tháo dỡ sau một yêu cầu hủy đã được lưu giữ.
Các nhà cung cấp embedding được đăng ký bằng api.registerEmbeddingProvider(...) cũng phải
được liệt kê trong contracts.embeddingProviders trong manifest plugin. Đây
là bề mặt embedding tổng quát để tạo vectơ có thể tái sử dụng. Tìm kiếm bộ nhớ
có thể sử dụng bề mặt nhà cung cấp tổng quát này. Bề mặt cũ hơn
api.registerMemoryEmbeddingProvider(...) và
contracts.memoryEmbeddingProviders là lớp tương thích đã ngừng khuyến nghị trong khi
các nhà cung cấp dành riêng cho bộ nhớ hiện có thực hiện chuyển đổi.
Các nhà cung cấp dành riêng cho bộ nhớ vẫn cung cấp batchEmbed(...) runtime sẽ tiếp tục dùng
hợp đồng xử lý hàng loạt theo từng tệp hiện có, trừ khi runtime của chúng đặt rõ
sourceWideBatchEmbed: true. Cơ chế chọn tham gia này cho phép máy chủ bộ nhớ gửi các đoạn
từ nhiều tệp bộ nhớ đã thay đổi và các nguồn được bật trong một lệnh gọi batchEmbed(...),
tối đa bằng giới hạn lô của máy chủ. Các bộ chuyển đổi lô tải lên tệp yêu cầu JSONL phải
chia nhỏ các tác vụ của nhà cung cấp trước khi đạt giới hạn kích thước tải lên cũng như giới hạn số lượng
yêu cầu. Nhà cung cấp phải trả về một embedding cho mỗi đoạn đầu vào theo cùng thứ tự với
batch.chunks; bỏ cờ này khi nhà cung cấp yêu cầu các lô cục bộ theo tệp hoặc
không thể duy trì thứ tự đầu vào trong một tác vụ lớn hơn trên toàn nguồn.
Công cụ và lệnh
Sử dụngdefineToolPlugin cho các plugin đơn giản chỉ có công cụ
với tên công cụ cố định. Sử dụng trực tiếp api.registerTool(...) cho các plugin hỗn hợp
hoặc đăng ký công cụ hoàn toàn động.
Các lệnh plugin có thể đặt
agentPromptGuidance khi tác tử cần một gợi ý định tuyến ngắn
do lệnh sở hữu. Chỉ để văn bản đó nói về chính lệnh; không thêm
chính sách dành riêng cho nhà cung cấp hoặc plugin vào trình tạo lời nhắc của lõi.
Các mục hướng dẫn có thể là chuỗi cũ, áp dụng cho mọi bề mặt lời nhắc, hoặc
các mục có cấu trúc:
surfaces có cấu trúc có thể bao gồm openclaw_main, codex_app_server,
cli_backend, acp_backend hoặc subagent. pi_main vẫn là bí danh
đã ngừng khuyến nghị của openclaw_main. Bỏ qua surfaces đối với hướng dẫn có chủ đích áp dụng cho mọi bề mặt. Không
truyền mảng surfaces rỗng; mảng này bị từ chối để việc vô tình mất phạm vi
không biến thành văn bản lời nhắc toàn cục.
Chỉ dẫn dành cho nhà phát triển của máy chủ ứng dụng Codex gốc nghiêm ngặt hơn các bề mặt lời nhắc
khác: chỉ hướng dẫn được giới hạn phạm vi rõ ràng ở codex_app_server mới được nâng lên
làn có mức ưu tiên cao hơn đó. Hướng dẫn chuỗi cũ và hướng dẫn có cấu trúc không giới hạn
phạm vi vẫn khả dụng cho các bề mặt lời nhắc không phải Codex nhằm đảm bảo tính tương thích.
Các lệnh trên máy chủ Node chạy trên máy chủ Node đã kết nối, không chạy bên trong tiến trình
Gateway. Nếu có agentTool, Node sẽ công bố một bộ mô tả sau khi
kết nối Gateway thành công; Gateway chỉ cung cấp bộ mô tả đó cho các lượt chạy của tác nhân khi
Node đang kết nối và chỉ khi command của bộ mô tả nằm trong
bề mặt lệnh đã được phê duyệt của Node. Đặt agentTool.defaultPlatforms để đưa một
lệnh không nguy hiểm vào danh sách cho phép lệnh mặc định của Node; nếu không, cần có
gateway.nodes.allowCommands rõ ràng hoặc một chính sách gọi Node. agentTool.name
phải an toàn cho nhà cung cấp: bắt đầu bằng một chữ cái, chỉ sử dụng chữ cái, chữ số,
dấu gạch dưới hoặc dấu gạch nối và không vượt quá 64 ký tự. Các công cụ Node dựa trên MCP
có thể đặt siêu dữ liệu agentTool.mcp để các bề mặt danh mục và tìm kiếm công cụ có thể hiển thị
danh tính máy chủ/công cụ MCP từ xa, nhưng việc thực thi vẫn đi qua
lệnh Node đã được quảng bá.
Hạ tầng
Công việc Webhook sau khi xác nhận
Các tuyến Webhook xác nhận yêu cầu trước khi xử lý xong phải chuyển công việc tách rời đó sang gốc tiếp nhận được theo dõi riêng:runDetachedWebhookWork(...) một cách đồng bộ trong khi yêu cầu HTTP vẫn đang
được tiếp nhận. Trình trợ giúp lập tức dành riêng một gốc độc lập, sau đó khởi động
hàm gọi lại trong vi tác vụ tiếp theo để trình xử lý yêu cầu có thể ghi
xác nhận trước. Promise được trả về tiếp nhận kết quả của hàm gọi lại; bên gọi
vẫn chịu trách nhiệm xử lý việc từ chối. Cách này giúp công việc trong hàng đợi sau xác nhận được tiếp nhận và khiến
quá trình rút cạn khi khởi động lại hoặc tạm ngưng phải chờ công việc đó. Các trình xử lý chờ toàn bộ quá trình xử lý
hoàn tất trước khi trả về không cần trình trợ giúp này.
Kết nối MCP theo phạm vi bên yêu cầu
Giữ danh tính máy chủ MCP ở trạng thái tĩnh (tên, bộ lọc công cụ) trongmcp.servers hoặc
một bản kê khai gói. Có thể đăng ký thêm một trình phân giải kết nối để mỗi
bên yêu cầu tin nhắn đáng tin cậy có phương thức vận chuyển riêng:
- Ngữ cảnh trình phân giải chỉ mang danh tính máy chủ đáng tin cậy (
requesterSenderId,agentAccountId/messageChanneltùy chọn). Có thể bổ sung thêm các trường đáng tin cậy trong tương lai (ví dụ ngữ cảnh người dùng cron/tác nhân phụ) theo cách cộng thêm. - Mỗi Plugin sở hữu một tên máy chủ: một
registerMcpServerConnectionResolvertrùng lặp cho cùngserverNametừ một Plugin khác sẽ bị từ chối kèm chẩn đoán lỗi (lần đăng ký đầu tiên thắng), do đó quyền sở hữu kết nối không bao giờ phụ thuộc vào thứ tự tải Plugin. - Tên công cụ được suy ra từ toàn bộ tập hợp máy chủ đã khai báo để việc phân giải một phần không bao giờ làm thay đổi tên máy chủ an toàn giữa các bên yêu cầu hoặc các lượt. Lõi không xác minh rằng các điểm cuối của những bên yêu cầu khác nhau cung cấp lược đồ công cụ giống hệt nhau; một trình phân giải phải trỏ mọi bên yêu cầu đến cùng một dịch vụ logic, nếu không các lược đồ công cụ (và độ ổn định của bộ nhớ đệm lời nhắc) sẽ khác nhau theo từng bên yêu cầu.
- Các lượt chạy không có
requesterSenderIdđáng tin cậy (cron, tác nhân phụ, Heartbeat, Gateway công khai) không bao giờ khởi tạo các máy chủ theo phạm vi bên yêu cầu. Không có kết nối dự phòng dùng chung. resolvebị giới hạn ở 10 giây cho mỗi máy chủ; nếu hết thời gian chờ hoặc phát sinh ngoại lệ thì máy chủ đó bị bỏ qua trong lượt chạy mà không làm MCP tĩnh thất bại.- Các kết nối đã phân giải được xác thực lại tối đa mỗi 5 phút cho mỗi bên yêu cầu:
việc xoay vòng sẽ dựng lại phương thức vận chuyển với thông tin xác thực mới, còn kết quả
nullsẽ thu hồi kết nối đó (thời gian chạy trong bộ nhớ đệm bị hủy ngay cả giữa phiên). Vì vậy, thông tin xác thực đã bị thu hồi hoặc xoay vòng có thể tiếp tục được sử dụng trong tối đa 5 phút. headersđã phân giải không bao giờ được ghi nhật ký hoặc lưu bền vững; lõi chỉ giữ một bản tóm lược có khóa, tạm thời trong bộ nhớ (HMAC cục bộ theo tiến trình) để phát hiện việc xoay vòng thông tin xác thực, đồng thời đăng ký các giá trị thông tin xác thực trong tiêu đề/URL đã phân giải với sổ đăng ký biên tập nhật ký/thu thập gỡ lỗi.- Các máy chủ theo phạm vi bên yêu cầu không tạo chế độ xem MCP App: một chế độ xem tồn tại lâu hơn lượt chạy đã xác thực bên yêu cầu và ranh giới chế độ xem của Gateway không có danh tính bên yêu cầu, vì vậy bản xem trước ứng dụng vẫn đóng khi lỗi đối với các máy chủ này. Kết quả công cụ không bị ảnh hưởng.
- Các máy chủ tĩnh không có trình phân giải vẫn giữ vòng đời theo phạm vi phiên hiện có.
- Quy tắc phân phối của bộ kiểm thử: các máy chủ theo phạm vi bên yêu cầu không bao giờ đi vào
cấu hình máy khách MCP gốc của bộ kiểm thử (luồng Codex
mcp_servers, CLI-c mcp_servers=…hoặc bất kỳ phép chiếu MCP dùng chung theo phiên nào khác). Thay vào đó, các bộ kiểm thử phân phối chúng dưới dạng công cụ theo phạm vi lượt chạy:- Trình chạy nhúng: thời gian chạy MCP của phiên + công cụ gói (tĩnh + theo phạm vi).
- Máy chủ ứng dụng Codex: công cụ động qua
materializeRequesterScopedMcpToolsForHarnessRun(chỉ theo phạm vi; các máy chủ tĩnh vẫn dùng máy khách MCP gốc của Codex).
- Thông số kỹ thuật của công cụ theo phạm vi ổn định trong phiên sau lần phân giải thành công đầu tiên trong phiên đó, vì vậy các bộ kiểm thử dùng chung luồng (Codex) không xoay vòng luồng khi người gửi thay đổi. Trước khi bất kỳ bên yêu cầu nào được phân giải, không có thông số kỹ thuật theo phạm vi nào được quảng bá.
- Các bên yêu cầu chưa được xác thực trên một bộ kiểm thử dùng chung luồng vẫn thấy các công cụ theo phạm vi đã được quảng bá; việc gọi một công cụ sẽ trả về lỗi công cụ chưa kết nối rõ ràng cho bên yêu cầu đó. OpenClaw không bao giờ chuyển sang dùng thông tin xác thực của bên yêu cầu khác.
agentId,
agentSessionKey và sandboxed tùy chọn. Các lệnh gọi search
và get của phần bổ sung kho ngữ liệu bộ nhớ nhận ngữ cảnh agentId và sandboxed tùy chọn. Các Plugin có
bộ lưu trữ do tác nhân sở hữu nên phân giải bộ lưu trữ đó cho từng lệnh gọi thay vì
ghi lại một đường dẫn toàn cục trong quá trình đăng ký. Nếu cần ID tác nhân nhưng
bị thiếu trong một thao tác đa tác nhân, hãy đóng khi lỗi thay vì chọn một
tác nhân tùy ý.
Sử dụng registerMemoryPromptPreparation(...) khi văn bản lời nhắc phụ thuộc vào trạng thái
Plugin bất đồng bộ. Hàm gọi lại chạy một lần trước mỗi lời nhắc tác nhân đầy đủ và nhận
cùng ngữ cảnh công cụ, tác nhân, phiên và sandbox như các trình tạo lời nhắc bộ nhớ
đồng bộ. Xác thực phiên bản chủ sở hữu bộ lưu trữ hiện tại trước khi tải trạng thái
đã lưu bền vững, sau đó chỉ trả về các dòng dành cho lượt chạy đó. OpenClaw đóng băng các dòng này và
chuyển kết quả bất biến cho quá trình hợp thành lời nhắc đồng bộ. Giữ việc lưu bền vững,
thay thế nguyên tử và xóa khi loại bỏ chủ sở hữu bên trong Plugin sở hữu; không
thăm dò hoặc đọc tệp từ trình tạo lời nhắc.
Các trình xử lý tương tác của Telegram có thể trả về { submitText } để định tuyến văn bản qua
đường dẫn tác nhân đầu vào thông thường của Telegram sau khi trình xử lý thành công. OpenClaw giữ lại
nút gọi lại khi chính sách đầu vào bỏ qua văn bản hoặc quá trình xử lý thất bại, để
người dùng có thể thử lại sau khi điều kiện chặn thay đổi. Trường kết quả này
dành riêng cho Telegram; các kênh khác giữ hợp đồng kết quả tương tác riêng.
Hook máy chủ cho các Plugin quy trình làm việc
Hook máy chủ là các đường nối SDK dành cho những Plugin cần tham gia vào vòng đời của máy chủ thay vì chỉ thêm nhà cung cấp, kênh hoặc công cụ. Chúng là các hợp đồng chung; Chế độ Lập kế hoạch có thể sử dụng chúng, cũng như các quy trình phê duyệt, cổng chính sách không gian làm việc, trình giám sát nền, trình hướng dẫn thiết lập và các Plugin đồng hành giao diện người dùng.
Bộ mô tả
surface: "tab" thêm một thẻ thanh bên vào Control UI. Bộ mô tả thẻ của các
Plugin đang hoạt động được thông báo cho máy khách bảng điều khiển trong lời chào của Gateway
(controlUiTabs), vì vậy thẻ chỉ xuất hiện khi Plugin được bật.
Các Plugin đi kèm có thể cung cấp một chế độ xem bảng điều khiển hạng nhất cho thẻ của mình; các
Plugin khác có thể đặt path thành một tuyến HTTP của Plugin (xem
api.registerHttpRoute(...)) mà bảng điều khiển kết xuất trong một khung sandbox.
icon là gợi ý tên biểu tượng bảng điều khiển, group chọn phần thanh bên
(control hoặc agent), order sắp xếp giữa các thẻ Plugin, và requiredScopes
ẩn thẻ khỏi các kết nối không có những phạm vi vận hành đó:
Đối với thẻ bên ngoài được Gateway bảo vệ, hãy đăng ký bộ mô tả path dưới một
tuyến HTTP auth: "gateway" của cùng Plugin. Sau khi khởi tạo đã xác thực, trình duyệt nhận được một
quyền cấp HttpOnly ngắn hạn, giới hạn trong Plugin và gốc tuyến đó, để
khung sandbox có thể tải mà không sao chép bearer token của Gateway vào URL
hoặc JavaScript. Thành phần cha đã xác thực gia hạn quyền cấp khi thẻ bên ngoài
đang hoạt động và trước khi gắn thẻ sau khi điều hướng hoặc tiếp tục trình duyệt. Thành phần này cũng
thăm dò quyền cấp từ cùng sandbox opaque trước khi gắn, vì vậy các chế độ
quyền riêng tư của trình duyệt chặn cookie sẽ đóng an toàn bằng một bảng điều khiển không khả dụng.
Quyền cấp cho khung chỉ chấp nhận GET và HEAD và luôn mang
operator.read; requiredScopes kiểm soát khả năng hiển thị của thẻ nhưng không bao giờ mở rộng
quyền cấp cookie. Các thao tác thay đổi vẫn nằm trên các bề mặt cha được xác thực rõ ràng qua Gateway hoặc
các bề mặt bearer. Các thẻ bên ngoài yêu cầu HTTPS/Tailscale Serve hoặc một
nguồn loopback được trình duyệt tin cậy; HTTP thuần trên máy chủ LAN sẽ hiển thị
lỗi ngữ cảnh bảo mật thay vì gắn một bảng điều khiển không thể xác thực.
Việc chặn hoàn toàn cookie của bên thứ ba cũng khiến các thẻ được Gateway bảo vệ không khả dụng.
Cũng như mọi bề mặt Plugin gốc, khung vẫn nằm trong ranh giới tin cậy của
Plugin đã cài đặt; OpenClaw không coi các Plugin đã cài đặt là những chủ thể
bảo mật trình duyệt được cách ly lẫn nhau.
Quyền cấp cookie sử dụng ranh giới tên máy chủ của trình duyệt, không phải ranh giới cổng. Không
đồng lưu trữ các dịch vụ không tin cậy lẫn nhau trên tên máy chủ Gateway, kể cả trên các
cổng khác.
Các thẻ dựa trên cơ chế xác thực do Plugin quản lý vẫn giữ hành vi iframe trực tiếp và không
yêu cầu hoặc cần quyền cấp Gateway này.
api.session.state.registerSessionExtension(...)api.session.workflow.enqueueNextTurnInjection(...)api.session.workflow.registerSessionSchedulerJob(...)api.session.workflow.sendSessionAttachment(...)api.session.workflow.scheduleSessionTurn(...)api.session.workflow.unscheduleSessionTurnsByTag(...)api.session.controls.registerSessionAction(...)api.session.controls.registerControlUiDescriptor(...)api.agent.events.registerAgentEventSubscription(...)api.agent.events.emitAgentEvent(...)api.runContext.setRunContext(...)/getRunContext(...)/clearRunContext(...)api.lifecycle.registerRuntimeLifecycle(...)
api.registerSessionExtension, api.enqueueNextTurnInjection,
api.registerControlUiDescriptor, api.registerRuntimeLifecycle,
api.registerAgentEventSubscription, api.emitAgentEvent,
api.setRunContext, api.getRunContext, api.clearRunContext,
api.registerSessionSchedulerJob, api.registerSessionAction,
api.sendSessionAttachment, api.scheduleSessionTurn hoặc
api.unscheduleSessionTurnsByTag.
scheduleSessionTurn(...) là một tiện ích theo phạm vi phiên trên bộ lập lịch
Cron của Gateway. Cron sở hữu thời điểm và tạo bản ghi tác vụ nền khi
lượt chạy; Plugin SDK chỉ giới hạn phiên đích, cách đặt tên do Plugin sở hữu
và việc dọn dẹp. Sử dụng api.runtime.tasks.managedFlows bên trong lượt
được lập lịch khi bản thân công việc cần trạng thái Task Flow nhiều bước bền vững.
Các hợp đồng chủ ý phân chia thẩm quyền:
- Các Plugin bên ngoài có thể sở hữu phần mở rộng phiên, bộ mô tả giao diện người dùng, lệnh, siêu dữ liệu công cụ, nội dung chèn vào lượt tiếp theo và các hook thông thường.
- Các chính sách công cụ tin cậy chạy trước các hook
before_tool_callthông thường và được máy chủ tin cậy. Chính sách đi kèm chạy trước; chính sách từ Plugin đã cài đặt yêu cầu bật rõ ràng cùng với các ID cục bộ của chúng trongcontracts.trustedToolPolicies, rồi chạy tiếp theo thứ tự tải Plugin. ID chính sách được giới hạn trong Plugin đăng ký. - Quyền sở hữu lệnh dành riêng chỉ dành cho Plugin đi kèm. Các Plugin bên ngoài nên dùng tên lệnh hoặc bí danh riêng.
allowPromptInjection=falsevô hiệu hóa các hook thay đổi prompt, bao gồmagent_turn_prepare,before_prompt_build,heartbeat_prompt_contributionvàenqueueNextTurnInjection.
Các không gian tên quản trị lõi dành riêng (
config.*, exec.approvals.*, wizard.*,
update.*) luôn giữ nguyên operator.admin, ngay cả khi một Plugin cố gắng gán
phạm vi phương thức Gateway hẹp hơn. Nên dùng tiền tố dành riêng cho Plugin đối với
các phương thức do Plugin sở hữu.Khi nào nên sử dụng middleware kết quả công cụ
Khi nào nên sử dụng middleware kết quả công cụ
Các Plugin đi kèm và Plugin đã cài đặt được bật rõ ràng với hợp đồng
manifest phù hợp có thể sử dụng
api.registerAgentToolResultMiddleware(...) khi
cần viết lại kết quả công cụ sau khi thực thi và trước khi môi trường thời gian chạy
đưa kết quả đó trở lại mô hình. Đây là đường nối trung lập với môi trường thời gian chạy đáng tin cậy
dành cho các bộ rút gọn đầu ra bất đồng bộ như tokenjuice.Plugin phải khai báo contracts.agentToolResultMiddleware cho từng
môi trường thời gian chạy được nhắm đến, ví dụ ["openclaw", "codex"]. Plugin đã cài đặt không có
hợp đồng đó hoặc không được bật rõ ràng thì không thể đăng ký middleware này; hãy giữ
các hook Plugin OpenClaw thông thường cho công việc không cần thời điểm kết quả công cụ
trước mô hình. Luồng đăng ký factory phần mở rộng cũ
chỉ dành cho trình chạy nhúng đã bị loại bỏ.Đăng ký khám phá Gateway
api.registerGatewayDiscoveryService(...) cho phép Plugin quảng bá
Gateway đang hoạt động trên một giao thức khám phá cục bộ như mDNS/Bonjour. OpenClaw gọi
dịch vụ trong quá trình khởi động Gateway khi tính năng khám phá cục bộ được bật, truyền
các cổng Gateway hiện tại và dữ liệu gợi ý TXT không bí mật, đồng thời gọi trình xử lý
stop được trả về trong quá trình tắt Gateway.
Siêu dữ liệu đăng ký CLI
api.registerCli(registrar, opts?) chấp nhận hai loại siêu dữ liệu lệnh:
commands: tên lệnh rõ ràng do thành phần đăng ký sở hữudescriptors: bộ mô tả lệnh tại thời điểm phân tích cú pháp, được dùng cho phần trợ giúp CLI, định tuyến và đăng ký CLI Plugin theo kiểu tải lườiparentPath: đường dẫn lệnh cha tùy chọn cho các nhóm lệnh lồng nhau, chẳng hạn như["nodes"]
api.registerNodeCliFeature(registrar, opts?). Đây là một trình bao nhỏ quanh
api.registerCli(..., { parentPath: ["nodes"] }) và làm cho các lệnh như
openclaw nodes canvas trở thành những tính năng Node rõ ràng do Plugin sở hữu.
Nếu muốn một lệnh Plugin tiếp tục được tải lười trong luồng CLI gốc thông thường,
hãy cung cấp descriptors bao phủ mọi gốc lệnh cấp cao nhất được thành phần
đăng ký đó cung cấp.
program:
commands khi không cần đăng ký CLI gốc theo kiểu tải lười.
Đường dẫn tương thích tải sớm đó vẫn được hỗ trợ, nhưng không cài đặt
các phần giữ chỗ dựa trên bộ mô tả để tải lười tại thời điểm phân tích cú pháp.
Đăng ký backend CLI
api.registerCliBackend(...) cho phép một plugin sở hữu cấu hình mặc định cho một
backend CLI AI cục bộ như claude-cli hoặc my-cli.
idcủa backend trở thành tiền tố nhà cung cấp trong các tham chiếu mô hình nhưmy-cli/gpt-5.configcủa backend sử dụng cùng cấu trúc vớiagents.defaults.cliBackends.<id>.- Cấu hình người dùng vẫn được ưu tiên. OpenClaw hợp nhất
agents.defaults.cliBackends.<id>lên trên giá trị mặc định của plugin trước khi chạy CLI. - Sử dụng
normalizeConfigkhi backend cần viết lại để tương thích sau khi hợp nhất (ví dụ: chuẩn hóa các cấu trúc cờ cũ). - Sử dụng
resolveExecutionArgsđể viết lại argv theo phạm vi yêu cầu thuộc về phương ngữ CLI, chẳng hạn như ánh xạ các mức suy luận của OpenClaw sang một cờ nỗ lực gốc. Hook nhậnctx.executionMode; sử dụng"side-question"để thêm các cờ cô lập gốc của backend cho các lệnh gọi/btwtạm thời. Nếu các cờ đó vô hiệu hóa công cụ gốc một cách đáng tin cậy đối với một CLI vốn luôn bật công cụ, hãy khai báo cảsideQuestionToolMode: "disabled". - Sử dụng
prepareExecutioncho môi trường khởi chạy do backend sở hữu hoặc các cầu nối xác thực/cấu hình tạm thời.ctx.contextTokenBudgetcủa nó là giới hạn token có hiệu lực được chọn cho lượt chạy, để các backend Compaction gốc có thể căn chỉnh ngưỡng riêng mà không cần các nhánh lõi dành riêng cho nhà cung cấp. - Các backend có thể vô hiệu hóa toàn bộ công cụ gốc cho một lượt chạy cụ thể có thể khai báo
nativeToolMode: "selectable". Các lệnh gọi bị hạn chế truyền một bộctx.toolAvailability.nativerỗng cùng với danh sách cho phép MCP được cô lập chính xác khỏi máy chủ;resolveExecutionArgsphải thực thi cả hai trên argv mới hoặc tiếp tục cuối cùng. OpenClaw từ chối thực thi theo nguyên tắc đóng an toàn nếu backend không thể làm vậy.
Khe độc quyền
Bộ điều hợp embedding bộ nhớ không còn được khuyến nghị
registerMemoryCapabilitylà API độc quyền của plugin bộ nhớ.registerMemoryCapabilitycũng có thể cung cấppublicArtifacts.listArtifacts(...)cho các lượt xuất do máy chủ quản lý. Các plugin đồng hành liệt kê những tạo tác đã khai báo đó vẫn sử dụnglistActiveMemoryPublicArtifacts(...)từ facadeopenclaw/plugin-sdk/memory-host-coređược giữ lại cho đến khi có API công khai dành riêng cho bên sử dụng; chúng không được truy cập vào bố cục riêng tư của plugin khác.MemoryFlushPlan.modelcó thể ghim lượt đẩy dữ liệu vào một tham chiếuprovider/modelchính xác, chẳng hạn nhưollama/qwen3:8b, mà không kế thừa chuỗi dự phòng đang hoạt động.registerMemoryEmbeddingProviderkhông còn được khuyến nghị. Các nhà cung cấp embedding mới nên sử dụngapi.registerEmbeddingProvider(...)vàcontracts.embeddingProviders.- Các nhà cung cấp dành riêng cho bộ nhớ hiện có tiếp tục hoạt động trong thời gian chuyển đổi, nhưng quá trình kiểm tra plugin báo cáo điều này là khoản nợ tương thích đối với các plugin không được đóng gói kèm.
Sự kiện và vòng đời
Xem Hook của plugin để biết ví dụ, tên hook phổ biến và ngữ nghĩa
bảo vệ.
Ngữ nghĩa quyết định của hook
before_install là hook vòng đời của runtime plugin, không phải bề mặt chính sách
cài đặt dành cho người vận hành. Sử dụng security.installPolicy khi quyết định cho phép/chặn phải
bao phủ các đường dẫn cài đặt hoặc cập nhật dựa trên CLI và Gateway.
before_tool_call: trả về{ block: true }là kết thúc. Sau khi bất kỳ trình xử lý nào đặt giá trị này, các trình xử lý có mức ưu tiên thấp hơn sẽ bị bỏ qua.before_tool_call: trả về{ block: false }được xem là không có quyết định (tương tự như bỏ quablock), không phải là ghi đè.before_install: trả về{ block: true }là kết thúc. Sau khi bất kỳ trình xử lý nào đặt giá trị này, các trình xử lý có mức ưu tiên thấp hơn sẽ bị bỏ qua.before_install: trả về{ block: false }được xem là không có quyết định (tương tự như bỏ quablock), không phải là ghi đè.reply_dispatch: trả về{ handled: true, ... }là kết thúc. Sau khi bất kỳ trình xử lý nào nhận quyền điều phối, các trình xử lý có mức ưu tiên thấp hơn và đường dẫn điều phối mô hình mặc định sẽ bị bỏ qua.message_sending: trả về{ cancel: true }là kết thúc. Sau khi bất kỳ trình xử lý nào đặt giá trị này, các trình xử lý có mức ưu tiên thấp hơn sẽ bị bỏ qua.message_sending: trả về{ cancel: false }được xem là không có quyết định (tương tự như bỏ quacancel), không phải là ghi đè.message_received: sử dụng trườngthreadIdcó kiểu khi cần định tuyến luồng/chủ đề đến. Giữmetadatacho các dữ liệu bổ sung dành riêng cho kênh.message_sending: sử dụng các trường định tuyếnreplyToId/threadIdcó kiểu trước khi chuyển sang dự phòngmetadatadành riêng cho kênh.gateway_start: sử dụngctx.config,ctx.workspaceDirvàctx.getCron?.()cho trạng thái khởi động do gateway sở hữu thay vì dựa vào các hookgateway:startupnội bộ. Cron vẫn có thể đang tải tại thời điểm này.cron_reconciled: xây dựng lại toàn bộ phép chiếu cron bên ngoài sau khi khởi động hoặc tải lại bộ lập lịch. Nó bao gồmreasonvà trạng tháienabledcó hiệu lực, bao gồmenabled: false, trong khictx.getCron?.()trả về chính xác bộ lập lịch đã được đối soát. Truyềnctx.abortSignalvào tác vụ chiếu bền vững; tác vụ sẽ hủy khi ảnh chụp nhanh của bộ lập lịch đó bị thay thế hoặc Gateway đóng.cron_changed: theo dõi các thay đổi vòng đời cron do gateway sở hữu. Các sự kiệnscheduledvàremovedlà gợi ý đối soát sau khi commit, không phải nhật ký thay đổi được sắp thứ tự.event.nextRunAtMscủa một sự kiện đã lên lịch sẽ không có khi tác vụ không có lần đánh thức tiếp theo; một sự kiện đã bị xóa vẫn mang theo ảnh chụp nhanh của tác vụ đã xóa.
cron_changed,
sau đó đọc lại toàn bộ chế độ xem bền vững từ bộ lập lịch được
cron_reconciled ghi lại gần nhất. Không sử dụng bộ lập lịch từ ngữ cảnh cron_changed: một
gợi ý tách rời từ bộ lập lịch cũ hơn có thể chồng lấn với lần tải lại sau đó.
Sử dụng cron_reconciled làm trình kích hoạt ảnh chụp nhanh đầy đủ cho trạng thái bền vững được tải khi
Gateway khởi động hoặc khi thay thế bộ lập lịch. Trình kích hoạt này không được phát lại đối với một lần
tải nóng chỉ dành cho plugin. Các trình xử lý theo dõi chạy song song và các lượt
điều phối không chờ kết quả có thể chồng lấn, vì vậy bên sử dụng không được phụ thuộc vào thứ tự hoàn thành sự kiện.
Giữ OpenClaw làm nguồn sự thật cho việc kiểm tra đến hạn và thực thi.
Để xem bộ điều hợp chỉ chạy một phiên tại một thời điểm với khả năng thay thế bền vững, thử lại/lùi thời gian và
tắt sạch, hãy xem Phép chiếu cron bên ngoài an toàn.
Các trường của đối tượng API
Quy ước mô-đun nội bộ
Trong plugin, sử dụng các tệp barrel cục bộ cho các lượt nhập nội bộ:api.ts, runtime-api.ts,
index.ts, setup-entry.ts và các tệp điểm vào công khai tương tự) ưu tiên
ảnh chụp nhanh cấu hình runtime đang hoạt động khi OpenClaw đã chạy. Nếu chưa có
ảnh chụp nhanh runtime, chúng sẽ dự phòng sang tệp cấu hình đã phân giải trên ổ đĩa.
Các facade của plugin tích hợp đã đóng gói nên được tải thông qua các trình tải
facade plugin của OpenClaw; việc nhập trực tiếp từ dist/extensions/... sẽ bỏ qua các bước kiểm tra manifest
và sidecar runtime mà bản cài đặt đóng gói sử dụng cho mã thuộc sở hữu của plugin.
Các plugin nhà cung cấp có thể cung cấp một barrel hợp đồng hẹp, cục bộ cho plugin khi một
trình trợ giúp được chủ ý thiết kế riêng cho nhà cung cấp và chưa phù hợp với một đường dẫn con SDK
dùng chung. Các ví dụ tích hợp:
- Anthropic: điểm nối công khai
api.ts/contract-api.tsdành cho tiêu đề beta của Claude và các trình trợ giúp luồngservice_tier. @openclaw/openai-provider:api.tsxuất các trình dựng nhà cung cấp, trình trợ giúp mô hình mặc định và trình dựng nhà cung cấp thời gian thực.@openclaw/openrouter-provider:api.tsxuất trình dựng nhà cung cấp cùng các trình trợ giúp thiết lập ban đầu/cấu hình.
Liên quan
Điểm vào
Các tùy chọn
definePluginEntry và defineChannelPluginEntry.Trình trợ giúp runtime
Tài liệu tham chiếu đầy đủ về không gian tên
api.runtime.Thiết lập và cấu hình
Đóng gói, manifest và lược đồ cấu hình.
Kiểm thử
Tiện ích kiểm thử và quy tắc lint.
Di chuyển SDK
Di chuyển khỏi các bề mặt không còn được khuyến nghị.
Nội bộ plugin
Kiến trúc chuyên sâu và mô hình năng lực.