Plugin SDK reference
Tổng quan về SDK Plugin
SDK Plugin là hợp đồng có kiểu giữa các plugin và lõi. Trang này là tài liệu tham chiếu về nội dung cần nhập và nội dung bạn có thể đăng ký.
Quy ước nhập
Luôn nhập từ một đường dẫn con cụ thể:
Mỗi đường dẫn con là một mô-đun nhỏ, độc lập. Cách này giúp khởi động nhanh và
ngăn các vấn đề về phụ thuộc vòng. Đối với các trình trợ giúp điểm vào/bản dựng
dành riêng cho kênh, ưu tiên 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, hãy 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 OpenClaw sử dụng
plugin-sdk/bundled-channel-config-schema cho các schema kênh đi kèm được giữ
lại. Các bản xuất tương thích đã lỗi thời vẫn còn tại
plugin-sdk/channel-config-schema-legacy; không đường dẫn con schema đi kèm
nào là mẫu cho plugin mới.
Tham chiếu đường dẫn con
SDK Plugin được cung cấp dưới dạng một tập hợp các đường dẫn con có phạm vi hẹp, được nhóm theo lĩnh vực (điểm vào 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 dành riêng cho plugin đi kèm). Để xem toàn bộ danh mục — đã được nhóm và liên kết — hãy xem Các đường dẫn con của SDK Plugin.
Danh mục điểm vào của trình biên dịch nằm trong
scripts/lib/plugin-sdk-entrypoints.json; các bản xuất 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ộ chỉ dành cho 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 bản xuất công khai. Các đường dẫn
con công khai đã lỗi thời, đủ 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 xuất
rộng đã lỗi thời được theo dõi trong
scripts/lib/plugin-sdk-deprecated-barrel-subpaths.json.
API đăng ký
Hàm gọi lại register(api) nhận một đối tượng OpenClawPluginApi có các phương
thức sau:
Đăng ký khả năng
| Phương thức | Nội dung đăng ký |
|---|---|
api.registerProvider(...) |
Suy luận văn bản (LLM) |
api.registerWorkerProvider(...) |
Phiên thuê vòng đời của trình thực thi đám mây |
api.registerModelCatalogProvider(...) |
Các hàng danh mục mô hình để tạo văn bản và phương tiện |
api.registerAgentHarness(...) |
Trình thực thi tác tử gốc thử nghiệm (Codex, Copilot) |
api.registerCliBackend(...) |
Phần phụ trợ suy luận CLI cục bộ |
api.registerChannel(...) |
Kênh nhắn tin |
api.registerEmbeddingProvider(...) |
Nhà cung cấp nhúng véc-tơ có thể tái sử dụng |
api.registerSpeechProvider(...) |
Tổng hợp văn bản thành giọng nói / STT |
api.registerRealtimeTranscriptionProvider(...) |
Phiên âm thời gian thực dạng luồng |
api.registerRealtimeVoiceProvider(...) |
Phiên thoại thời gian thực song công |
api.registerMediaUnderstandingProvider(...) |
Phân tích hình ảnh/âm thanh/video |
api.registerTranscriptSourceProvider(...) |
Nguồn bản chép lời cuộc họp trực tiếp hoặc được nhập |
api.registerImageGenerationProvider(...) |
Tạo hình ảnh |
api.registerMusicGenerationProvider(...) |
Tạo nhạc |
api.registerVideoGenerationProvider(...) |
Tạo video |
api.registerWebFetchProvider(...) |
Nhà cung cấp tìm nạp / thu thập dữ liệu web |
api.registerWebSearchProvider(...) |
Tìm kiếm web |
api.registerCompactionProvider(...) |
Phần phụ trợ Compaction bản chép lời có thể thay thế |
Các nhà cung cấp trình thực thi cũng phải khai báo mã định danh của mình trong contracts.workerProviders.
Lõi lưu bền vững ý định trước khi gọi provision(profile, operationId). Nhà cung cấp xác thực thiết lập 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 phiên thuê khi mã định danh thao tác lặp lại.
Lõi lưu bền vững các thiết lập hồ sơ đã xác thực cùng với phiên thuê và cung cấp ảnh chụp đó 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, không bao giờ dùng trực tiếp dữ liệu khóa, và bao gồm hostKey từ đầu ra cấp phát đáng tin cậy theo đúng định dạng algorithm base64, không có tên máy chủ hoặc chú thích. Lõi ghim hostKey và không bao giờ tin cậy khóa từ lần 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 hiện diện, trình phân giải đó có thẩm quyền quyết định, còn các nhà cung cấp không có trình phân giải này 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ó phiên thuê có thể gia hạn cũng có thể triển khai renew(leaseId).
inspect phải ném lỗi khi gặp thất bại tạm thời hoặc không xác định; chỉ trả về unknown khi sự vắng mặt đã được xác nhận có thẩm quyền. 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 bền vững.
Các nhà cung cấp nhúng được đăng ký bằng api.registerEmbeddingProvider(...)
cũng phải được liệt kê trong contracts.embeddingProviders ở tệp kê khai
plugin. Đây là bề mặt nhúng tổng quát để tạo véc-tơ 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. Điểm nối cũ hơn
api.registerMemoryEmbeddingProvider(...) và
contracts.memoryEmbeddingProviders là cơ chế tương thích đã lỗi thời trong
khi các nhà cung cấp dành riêng cho bộ nhớ hiện có 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ý theo lô trên từng tệp hiện có, trừ khi runtime
của chúng đặt rõ ràng 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à nhiều nguồn
đang bật trong một lệnh gọi batchEmbed(...), trong phạm vi giới hạn lô của máy
chủ. Các bộ điều hợp theo lô tải lên tệp yêu cầu JSONL phải chia 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 phần nhúng 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ụ rộng hơn trên toàn
nguồn.
Công cụ và lệnh
Sử dụng defineToolPlugin 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 plugin hỗn hợp hoặc đăng ký công cụ hoàn toàn động.
| Phương thức | Nội dung đăng ký |
|---|---|
api.registerTool(tool, opts?) |
Công cụ tác tử (bắt buộc hoặc { optional: true }) |
api.registerCommand(def) |
Lệnh tùy chỉnh (bỏ qua LLM) |
api.registerNodeHostCommand(command) |
Lệnh do openclaw node run xử lý; siêu dữ liệu agentTool tùy chọn có thể cung cấp lệnh này dưới dạng công cụ mà tác tử có thể thấy trong khi Node được kết nối |
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ỉ giữ nội dung đó liên quan đến 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 các 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 kiểu 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:
agentPromptGuidance: [ "Global command hint.", { text: "Only show this in the main OpenClaw prompt.", surfaces: ["openclaw_main"] },];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 đã lỗi
thời của openclaw_main. Bỏ qua surfaces khi chủ ý áp dụng hướng dẫn 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 cho
codex_app_server mới được nâng lên làn ưu tiên cao hơn đó. Hướng dẫn chuỗi kiểu
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 để duy trì khả năng 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 tử trong khi Node ấy đang kết nối và chỉ khi command của bộ mô tả nằm trong phạm vi 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 Node mặc định; nếu không, phải 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 đối với 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
| Phương thức | Nội dung đăng ký |
|---|---|
api.registerHook(events, handler, opts?) |
Hook sự kiện |
api.registerHttpRoute(params) |
Điểm cuối HTTP của Gateway |
api.registerGatewayMethod(name, handler) |
Phương thức RPC của Gateway |
api.registerGatewayDiscoveryService(service) |
Bộ quảng bá khám phá Gateway cục bộ |
api.registerCli(registrar, opts?) |
Lệnh con CLI |
api.registerNodeCliFeature(registrar, opts?) |
CLI tính năng Node dưới openclaw nodes |
api.registerService(service) |
Dịch vụ nền |
api.registerInteractiveHandler(registration) |
Trình xử lý tương tác |
api.registerAgentToolResultMiddleware(...) |
Phần mềm trung gian kết quả công cụ trong thời gian chạy |
api.registerMemoryPromptSupplement(builder) |
Phần prompt bổ sung liền kề bộ nhớ |
api.registerMemoryCorpusSupplement(adapter) |
Kho ngữ liệu bổ sung để tìm kiếm/đọc bộ nhớ |
api.registerHostedMediaResolver(resolver) |
Bộ phân giải URL phương tiện được lưu trữ theo kiểu trình duyệt |
api.registerTextTransforms(transforms) |
Các phép viết lại văn bản tương thích prompt/tin nhắn do Plugin sở hữu |
api.registerConfigMigration(migrate) |
Di chuyển cấu hình nhẹ chạy trước khi tải thời gian chạy của Plugin |
api.registerMigrationProvider(provider) |
Trình nhập cho openclaw migrate |
api.registerAutoEnableProbe(probe) |
Bộ thăm dò cấu hình có thể tự động bật Plugin này |
api.registerReload(registration) |
Chính sách tiền tố cấu hình khởi động lại/tải nóng/không làm gì để xử lý tải lại |
api.registerNodeHostCommand(command) |
Trình xử lý lệnh được cung cấp cho các Node đã ghép nối |
api.registerNodeInvokePolicy(policy) |
Chính sách danh sách cho phép/phê duyệt cho các lệnh do Node gọi |
api.registerSecurityAuditCollector(collector) |
Bộ thu thập phát hiện cho openclaw security audit |
Các trình dựng phần bổ sung prompt bộ nhớ nhận ngữ cảnh 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 tử sở hữu phải phân giải bộ lưu trữ đó cho từng lệnh gọi thay vì ghi giữ một đường dẫn toàn cục trong quá trình đăng ký. Nếu cần mã tác tử nhưng bị thiếu trong một thao tác đa tác tử, hãy từ chối theo hướng an toàn thay vì chọn một tác tử tùy ý.
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 tử đầ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ữ nguyên hợp đồng kết quả tương tác của riêng mình.
Hook máy chủ cho các Plugin quy trình làm việc
Hook máy chủ là các điểm nối SDK dành cho những Plugin cần tham gia vào vòng đời máy chủ thay vì chỉ thêm nhà cung cấp, kênh hoặc công cụ. Đây là các hợp đồng dù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.
| Phương thức | Hợp đồng do phương thức sở hữu |
|---|---|
api.session.state.registerSessionExtension(...) |
Trạng thái phiên tương thích JSON do Plugin sở hữu, được chiếu qua các phiên Gateway |
api.session.workflow.enqueueNextTurnInjection(...) |
Ngữ cảnh bền vững, chính xác một lần, được chèn vào lượt tác tử tiếp theo của một phiên |
api.registerTrustedToolPolicy(...) |
Chính sách công cụ tin cậy trước Plugin, được kiểm soát bởi bản kê khai, có thể chặn hoặc viết lại tham số công cụ |
api.registerToolMetadata(...) |
Siêu dữ liệu hiển thị danh mục công cụ mà không thay đổi phần triển khai công cụ |
api.registerCommand(...) |
Các lệnh Plugin có phạm vi; kết quả lệnh có thể đặt continueAgent: true hoặc suppressReply: true; lệnh gốc Discord hỗ trợ descriptionLocalizations |
api.session.controls.registerControlUiDescriptor(...) |
Bộ mô tả đóng góp cho giao diện điều khiển dành cho các bề mặt phiên, công cụ, lượt chạy, cài đặt hoặc thẻ |
api.lifecycle.registerRuntimeLifecycle(...) |
Lệnh gọi lại dọn dẹp tài nguyên thời gian chạy do Plugin sở hữu trên các đường dẫn đặt lại/xóa/tải lại |
api.agent.events.registerAgentEventSubscription(...) |
Đăng ký sự kiện đã được làm sạch cho trạng thái quy trình làm việc và trình giám sát |
api.runContext.setRunContext(...) / getRunContext(...) / clearRunContext(...) |
Trạng thái tạm của Plugin theo từng lượt chạy, được xóa trong vòng đời kết thúc lượt chạy |
api.session.workflow.registerSessionSchedulerJob(...) |
Siêu dữ liệu dọn dẹp cho các công việc bộ lập lịch do Plugin sở hữu; không lập lịch công việc hoặc tạo bản ghi tác vụ |
api.session.workflow.sendSessionAttachment(...) |
Chỉ dành cho gói tích hợp sẵn: phân phối tệp đính kèm qua máy chủ đến tuyến gửi trực tiếp đang hoạt động của phiên |
api.session.workflow.scheduleSessionTurn(...) / unscheduleSessionTurnsByTag(...) |
Chỉ dành cho gói tích hợp sẵn: các lượt phiên được lập lịch dựa trên Cron cùng với việc dọn dẹp theo thẻ |
api.session.controls.registerSessionAction(...) |
Các hành động phiên có kiểu mà máy khách có thể gửi qua Gateway |
Một bộ mô tả surface: "tab" thêm một thẻ thanh bên vào giao diện điều khiển. Bộ mô tả thẻ của các Plugin đang hoạt động được quảng bá 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 tích hợp sẵn 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(...)) để bảng điều khiển hiển thị trong một khung được cô lập. 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 người vận hành đó:
api.session.controls.registerControlUiDescriptor({ surface: "tab", id: "logbook", label: "Logbook", description: "Your day as a timeline, built from screen snapshots.", icon: "sun", group: "control", requiredScopes: ["operator.write"],});Sử dụng các không gian tên được nhóm cho mã Plugin mới:
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(...)
Các phương thức phẳng tương đương vẫn khả dụng dưới dạng bí danh tương thích đã ngừng khuyến nghị cho các Plugin hiện có. Không thêm mã Plugin mới gọi trực tiếp 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à tiện ích theo phạm vi phiên dựa 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 đã lập lịch khi bản thân công việc cần trạng thái Luồng Tác vụ nhiều bước bền vững.
Các hợp đồng chủ ý phân tách 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ụ, phần chèn lượt tiếp theo và các hook thông thường.
- 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. Các chính sách tích hợp sẵn chạy trước; chính sách của Plugin đã cài đặt yêu cầu được bật rõ ràng cùng với mã cục bộ của chúng trongcontracts.trustedToolPolicies, rồi chạy tiếp theo thứ tự tải Plugin. Mã chính sách có phạm vi trong Plugin đăng ký. - Quyền sở hữu lệnh dành riêng chỉ thuộc về các gói tích hợp sẵn. Các Plugin bên ngoài nên sử dụng tên lệnh hoặc bí danh riêng.
allowPromptInjection=falsevô hiệu hóa các hook sửa đổi prompt, bao gồmagent_turn_prepare,before_prompt_build,heartbeat_prompt_contribution, các trường prompt từbefore_agent_startcũ vàenqueueNextTurnInjection.
Ví dụ về các đối tượng sử dụng không thuộc Chế độ Lập kế hoạch:
| Nguyên mẫu Plugin | Hook được sử dụng |
|---|---|
| Quy trình phê duyệt | Phần mở rộng phiên, tiếp tục lệnh, chèn vào lượt tiếp theo, bộ mô tả UI |
| Cổng chính sách ngân sách/không gian làm việc | Chính sách công cụ tin cậy, siêu dữ liệu công cụ, phép chiếu phiên |
| Trình giám sát vòng đời nền | Dọn dẹp vòng đời runtime, đăng ký sự kiện agent, quyền sở hữu/dọn dẹp bộ lập lịch phiên, đóng góp vào lời nhắc Heartbeat, bộ mô tả UI |
| Trình hướng dẫn thiết lập hoặc làm quen | Phần mở rộng phiên, lệnh có phạm vi, bộ mô tả UI điều khiển |
Khi nào nên sử dụng phần mềm trung gian kết quả công cụ
Các Plugin đi kèm và Plugin đã cài đặt được bật rõ ràng có 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 runtime
đưa kết quả đó trở lại mô hình. Đây là điểm nối tin cậy, trung lập với runtime
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 runtime được nhắm đến,
ví dụ ["openclaw", "codex"]. Plugin đã cài đặt nhưng không có hợp đồng đó,
hoặc không được bật rõ ràng, không thể đăng ký phần mềm trung gian này; hãy giữ
các hook Plugin OpenClaw thông thường cho công việc không cần định thời kết quả công cụ
trước mô hình. Đường dẫn đă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 một Plugin quảng bá Gateway đang hoạt động
trên một phương thức truyền tải 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.
api.registerGatewayDiscoveryService({ id: "my-discovery", async advertise(ctx) { const handle = await startMyAdvertiser({ gatewayPort: ctx.gatewayPort, tls: ctx.gatewayTlsEnabled, displayName: ctx.machineDisplayName, }); return { stop: () => handle.stop() }; },});Các Plugin khám phá Gateway không được coi các giá trị TXT được quảng bá là bí mật hoặc thông tin xác thực. Khám phá chỉ là gợi ý định tuyến; xác thực Gateway và ghim TLS vẫn chịu trách nhiệm về độ tin cậy.
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 trình đăng ký sở hữudescriptors: bộ mô tả lệnh tại thời điểm phân tích cú pháp dùng cho 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["nodes"]
Đối với các tính năng Node được ghép cặp, hãy ưu tiên
api.registerNodeCliFeature(registrar, opts?). Đây là một lớp bọc nhỏ quanh
api.registerCli(..., { parentPath: ["nodes"] }) và làm cho các lệnh như
openclaw nodes canvas trở thành 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 đường dẫn 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 mà trình đăng ký đó
công khai.
api.registerCli( async ({ program }) => { const { registerMatrixCli } = await import("./src/cli.js"); registerMatrixCli({ program }); }, { descriptors: [ { name: "matrix", description: "Manage Matrix accounts, verification, devices, and profile state", hasSubcommands: true, }, ], },);Các lệnh lồng nhau nhận lệnh cha đã được phân giải dưới dạng program:
api.registerCli( async ({ program }) => { const { registerNodesCanvasCommands } = await import("./src/cli.js"); registerNodesCanvasCommands(program); }, { parentPath: ["nodes"], descriptors: [ { name: "canvas", description: "Capture or render canvas content from a paired node", hasSubcommands: true, }, ], },);Chỉ sử dụng riêng commands khi bạn 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 ngay đó 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 cấu hình 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ấ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 xạ các mức suy luận của OpenClaw sang cờ mứ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 cho một CLI vốn luôn bật công cụ, hãy khai báo thêmsideQuestionToolMode: "disabled". - Các backend có thể vô hiệu hóa toàn bộ công cụ gốc cho một lần 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 tuplectx.toolAvailability.nativerỗng cùng với danh sách cho phép MCP được cô lập chính xác bởi máy chủ;resolveExecutionArgsphải thực thi cả hai trên argv cuối cùng cho lần chạy mới hoặc tiếp tục. OpenClaw sẽ từ chối an toàn nếu backend không thể thực hiện điều đó.
Để xem hướng dẫn biên soạn toàn trình, hãy xem Plugin backend CLI.
Vị trí độc quyền
| Phương thức | Nội dung đăng ký |
|---|---|
api.registerContextEngine(id, factory) |
Công cụ ngữ cảnh (mỗi lần chỉ có một công cụ hoạt động). Các callback vòng đời nhận runtimeSettings khi máy chủ có thể cung cấp chẩn đoán mô hình/nhà cung cấp/chế độ; các công cụ nghiêm ngặt cũ được thử lại mà không có khóa đó. |
api.registerMemoryCapability(capability) |
Khả năng bộ nhớ hợp nhất |
api.registerMemoryPromptSection(builder) |
Trình tạo phần lời nhắc bộ nhớ |
api.registerMemoryFlushPlan(resolver) |
Trình phân giải kế hoạch xả bộ nhớ |
api.registerMemoryRuntime(runtime) |
Bộ điều hợp runtime bộ nhớ |
Bộ điều hợp embedding bộ nhớ không còn được khuyến nghị
| Phương thức | Nội dung đăng ký |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) |
Bộ điều hợp embedding bộ nhớ cho Plugin đang hoạt động |
registerMemoryCapabilitylà API Plugin bộ nhớ độc quyền được ưu tiên.registerMemoryCapabilitycũng có thể công khaipublicArtifacts.listArtifacts(...)để các Plugin đồng hành có thể sử dụng các tạo tác bộ nhớ đã xuất thông quaopenclaw/plugin-sdk/memory-host-corethay vì truy cập vào bố cục riêng tư của một Plugin bộ nhớ cụ thể.registerMemoryPromptSection,registerMemoryFlushPlanvàregisterMemoryRuntimelà các API Plugin bộ nhớ độc quyền tương thích với hệ thống cũ.MemoryFlushPlan.modelcó thể ghim lượt xả vào một tham chiếuprovider/modelchính xác, chẳng hạnollama/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 giai đoạn chuyển đổi, nhưng quá trình kiểm tra Plugin báo cáo đây là nợ tương thích đối với các Plugin không đi kèm.
Sự kiện và vòng đời
| Phương thức | Chức năng |
|---|---|
api.on(hookName, handler, opts?) |
Hook vòng đời có kiểu |
api.onConversationBindingResolved(handler) |
Callback liên kết cuộc trò chuyện |
Xem Hook Plugin để biết ví dụ, các 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 runtime Plugin, không phải bề mặt chính sách cài đặt
của 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: việc trả về{ block: true }sẽ kết thúc quá trình. 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: việc trả về{ block: false }được xem là không đưa ra quyết định (giống như bỏ quablock), không phải là ghi đè.before_install: việc trả về{ block: true }sẽ kết thúc quá trình. 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: việc trả về{ block: false }được xem là không đưa ra quyết định (giống như bỏ quablock), không phải là ghi đè.reply_dispatch: việc trả về{ handled: true, ... }sẽ kết thúc quá trình. Khi bất kỳ trình xử lý nào nhậ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: việc trả về{ cancel: true }sẽ kết thúc quá trình. 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: việc trả về{ cancel: false }được xem là không đưa ra quyết định (giống như bỏ quacancel), không phải là ghi đè.message_received: sử dụng trường có kiểuthreadIdkhi cần định tuyến luồng/chủ đề đến. Giữmetadatacho dữ liệu bổ sung dành riêng cho kênh.message_sending: ưu tiên sử dụng các trường định tuyến có kiểureplyToId/threadIdtrước khi dự phòng sangmetadatadà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ì phụ thuộc vào các hook nội bộgateway:startup. Cron có thể vẫn đang tải tại thời điểm này.cron_reconciled: xây dựng lại toàn bộ hình 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, kể cảenabled: false, trong khictx.getCron?.()trả về chính xác bộ lập lịch đã được đối soát. Truyềnctx.abortSignalvào công việc hình chiếu bền vững; tín hiệu này sẽ hủy khi ảnh chụp nhanh bộ lập lịch đó bị thay thế hoặc Gateway đóng.cron_changed: quan sát 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 xác nhận, không phải nhật ký thay đổi theo thứ tự.event.nextRunAtMscủa một sự kiện đã lập lịch sẽ không có khi tác vụ không có lần đánh thức tiếp theo; sự kiện đã xóa vẫn mang theo ảnh chụp nhanh của tác vụ đã bị xóa.
Các bộ lập lịch đánh thức bên ngoài nên chống dội hoặc hợp nhất các sự kiện cron_changed,
sau đó đọc lại toàn bộ chế độ xem bền vững từ bộ lập lịch được ghi nhận gần nhất bởi
cron_reconciled. Không tiếp nhận 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 tác nhân 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. Sự kiện này không được phát lại khi chỉ tải nóng lại
Plugin. Các trình xử lý quan sát chạy song song và các lần điều phối không chờ kết quả
có thể chồng lấn, vì vậy bên tiêu thụ không được phụ thuộc vào thứ tự hoàn thành sự kiện.
Giữ OpenClaw làm nguồn dữ liệu chính xác cho việc kiểm tra đến hạn và thực thi.
Để xem một bộ điều hợp chỉ cho phép một lượt chạy với khả năng thay thế bền vững, thử lại/chờ lùi và tắt sạch, hãy xem Hình chiếu cron bên ngoài an toàn.
Các trường của đối tượng API
| Trường | Kiểu | Mô tả |
|---|---|---|
api.id |
string |
Mã định danh Plugin |
api.name |
string |
Tên hiển thị |
api.version |
string? |
Phiên bản Plugin (không bắt buộc) |
api.description |
string? |
Mô tả Plugin (không bắt buộc) |
api.source |
string |
Đường dẫn nguồn của Plugin |
api.rootDir |
string? |
Thư mục gốc của Plugin (không bắt buộc) |
api.config |
OpenClawConfig |
Ảnh chụp nhanh cấu hình hiện tại (ảnh chụp nhanh thời gian chạy trong bộ nhớ đang hoạt động khi có) |
api.pluginConfig |
Record<string, unknown> |
Cấu hình dành riêng cho Plugin từ plugins.entries.<id>.config |
api.runtime |
PluginRuntime |
Các tiện ích thời gian chạy |
api.logger |
PluginLogger |
Bộ ghi nhật ký theo phạm vi (debug, info, warn, error) |
api.registrationMode |
PluginRegistrationMode |
Chế độ tải hiện tại; "setup-runtime" là khoảng khởi động/thiết lập nhẹ trước khi tải mục nhập đầy đủ |
api.resolvePath(input) |
(string) => string |
Phân giải đường dẫn tương đối với thư mục gốc của Plugin |
Quy ước mô-đun nội bộ
Trong Plugin của bạn, hãy sử dụng các tệp barrel cục bộ cho các lệnh nhập nội bộ:
my-plugin/ api.ts # Các nội dung xuất công khai dành cho bên tiêu thụ bên ngoài runtime-api.ts # Các nội dung xuất thời gian chạy chỉ dành cho nội bộ index.ts # Điểm vào của Plugin setup-entry.ts # Điểm vào nhẹ chỉ dành cho thiết lập (không bắt buộc)Các bề mặt công khai của Plugin tích hợp được tải qua facade (api.ts, runtime-api.ts,
index.ts, setup-entry.ts và các tệp mục nhập công khai tương tự) ưu tiên
ảnh chụp nhanh cấu hình thời gian chạy đang hoạt động khi OpenClaw đã chạy. Nếu chưa có
ảnh chụp nhanh thời gian chạy, 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 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 thời gian chạy mà bản cài đặt đóng gói sử dụng cho mã do Plugin sở hữu.
Các Plugin nhà cung cấp có thể cung cấp một barrel hợp đồng cục bộ hẹp dành riêng cho Plugin khi một tiện ích đượ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: ranh giới
api.ts/contract-api.tscông khai cho các tiện ích tiêu đề beta và luồngservice_tiercủa Claude. @openclaw/openai-provider:api.tsxuất các trình dựng nhà cung cấp, tiện ích 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 tiện ích hướng dẫn ban đầu/cấu hình.
Liên quan
Các tùy chọn definePluginEntry và defineChannelPluginEntry.
Tài liệu tham chiếu đầy đủ cho không gian tên api.runtime.
Đóng gói, manifest và lược đồ cấu hình.
Các tiện ích kiểm thử và quy tắc lint.
Di chuyển khỏi các bề mặt không còn được khuyến nghị.
Kiến trúc chuyên sâu và mô hình khả năng.