Pipeline tải
Khi khởi động, OpenClaw đại thể thực hiện như sau:- khám phá các thư mục gốc Plugin ứng viên
- đọc manifest bundle gốc hoặc tương thích và siêu dữ liệu gói
- từ chối các ứng viên không an toàn
- chuẩn hóa cấu hình Plugin (
plugins.enabled,allow,deny,entries,slots,load.paths) - quyết định trạng thái bật cho từng ứng viên
- tải các mô-đun gốc đã bật: các mô-đun tích hợp sẵn đã được build sử dụng trình tải gốc; mã nguồn TypeScript cục bộ của bên thứ ba sử dụng cơ chế dự phòng Jiti khẩn cấp
- gọi các hook
register(api)gốc và thu thập các đăng ký vào registry Plugin - cung cấp registry cho các bề mặt lệnh/runtime
- điểm vào đã phân giải của ứng viên nằm ngoài thư mục gốc Plugin
- đường dẫn (hoặc thư mục gốc) của ứng viên cho phép mọi người dùng ghi
- đối với Plugin không tích hợp sẵn, quyền sở hữu đường dẫn không khớp với uid hiện tại (hoặc root)
chmod đối với các thư mục tích hợp sẵn cho phép mọi người dùng ghi
(các bản cài đặt npm/toàn cục có thể cung cấp thư mục gói tại 0777) trước khi cổng
kiểm tra lại; kiểm tra quyền sở hữu được bỏ qua hoàn toàn đối với nguồn tích hợp sẵn.
Các ứng viên bị chặn vẫn mang id Plugin trong chẩn đoán được phát ra khi
xác định được id đó (bao gồm các id được phân giải từ manifest bên trong một
thư mục vốn bị từ chối), vì vậy cấu hình tham chiếu đến id đó sẽ thấy một
Plugin bị chặn gắn với cảnh báo an toàn đường dẫn thay vì lỗi “Plugin không xác định”
không liên quan.
Hành vi ưu tiên manifest
Manifest là nguồn chân lý của mặt phẳng điều khiển. OpenClaw sử dụng manifest để:- nhận diện Plugin
- khám phá các kênh/Skills/schema cấu hình hoặc khả năng bundle đã khai báo
- xác thực
plugins.entries.<id>.config - bổ sung nhãn/phần giữ chỗ cho giao diện điều khiển
- hiển thị siêu dữ liệu cài đặt/danh mục
- duy trì các bộ mô tả nhẹ về kích hoạt và thiết lập mà không tải runtime của Plugin
activation và setup vẫn nằm trên mặt phẳng điều khiển.
Chúng chỉ là các bộ mô tả siêu dữ liệu phục vụ lập kế hoạch kích hoạt và khám phá thiết lập;
chúng không thay thế việc đăng ký runtime, register(...) hoặc setupEntry.
Các trình tiêu thụ kích hoạt trực tiếp sử dụng gợi ý về lệnh, kênh và nhà cung cấp trong manifest để
thu hẹp phạm vi tải Plugin trước khi hiện thực hóa registry rộng hơn:
- quá trình tải CLI thu hẹp phạm vi xuống các Plugin sở hữu lệnh chính được yêu cầu
- quá trình thiết lập kênh/phân giải Plugin thu hẹp phạm vi xuống các Plugin sở hữu id kênh được yêu cầu
- quá trình thiết lập/phân giải runtime nhà cung cấp tường minh thu hẹp phạm vi xuống các Plugin sở hữu id nhà cung cấp được yêu cầu
- quá trình lập kế hoạch khởi động Gateway sử dụng
activation.onStartupcho các import khởi động tường minh; các Plugin không có siêu dữ liệu khởi động chỉ được tải thông qua những tác nhân kích hoạt hẹp hơn
activation.* tường minh khỏi cơ chế dự phòng theo quyền sở hữu manifest:
Sự phân tách lý do đó là ranh giới tương thích: siêu dữ liệu Plugin hiện có
tiếp tục hoạt động, trong khi mã mới có thể phát hiện các gợi ý rộng hoặc hành vi dự phòng
mà không thay đổi ngữ nghĩa tải runtime.
Các thao tác tải trước runtime tại thời điểm yêu cầu có phạm vi
all rộng vẫn suy ra
một tập hợp id Plugin hiệu dụng tường minh từ cấu hình, kế hoạch khởi động, các
kênh đã cấu hình, slot và quy tắc tự động bật
(resolveEffectivePluginIds trong src/plugins/effective-plugin-ids.ts). Nếu
tập hợp suy ra đó trống, OpenClaw giữ phạm vi trống thay vì mở rộng đến
mọi Plugin có thể khám phá.
Quá trình khám phá thiết lập ưu tiên các id do bộ mô tả sở hữu như setup.providers và
setup.cliBackends để thu hẹp các Plugin ứng viên trước khi quay về dùng
setup-api cho những Plugin vẫn cần hook runtime ở thời điểm thiết lập. Danh sách
thiết lập nhà cung cấp sử dụng providerAuthChoices trong manifest, các lựa chọn thiết lập
suy ra từ bộ mô tả và siêu dữ liệu danh mục cài đặt mà không tải runtime nhà cung cấp. Giá trị
setup.requiresRuntime: false tường minh là điểm ngắt chỉ dùng bộ mô tả; nếu bỏ qua
requiresRuntime, cơ chế dự phòng API thiết lập cũ được giữ lại để tương thích. Nếu
nhiều Plugin được khám phá cùng tuyên bố sở hữu một nhà cung cấp thiết lập đã chuẩn hóa hoặc
id backend CLI giống nhau, quá trình tra cứu thiết lập sẽ từ chối chủ sở hữu không rõ ràng thay vì dựa vào
thứ tự khám phá. Khi runtime thiết lập thực thi, chẩn đoán registry báo cáo
sự sai lệch giữa setup.providers / setup.cliBackends và các nhà cung cấp hoặc backend CLI
thực tế được setup-api đăng ký mà không chặn các Plugin cũ.
Ranh giới bộ nhớ đệm Plugin
OpenClaw không lưu kết quả khám phá Plugin hoặc dữ liệu registry manifest trực tiếp trong bộ nhớ đệm theo các khoảng thời gian thực. Các bản cài đặt, chỉnh sửa manifest và thay đổi đường dẫn tải phải xuất hiện trong lần đọc siêu dữ liệu tường minh hoặc lần dựng lại snapshot tiếp theo. Trình phân tích tệp manifest duy trì một bộ nhớ đệm chữ ký tệp có giới hạn, được định khóa bằng đường dẫn manifest đã mở cùng với thiết bị/inode, kích thước và mtime/ctime; bộ nhớ đệm đó chỉ tránh phân tích lại các byte không đổi và không được lưu vào bộ nhớ đệm các câu trả lời về khám phá, registry, chủ sở hữu hoặc chính sách. Đường dẫn nhanh siêu dữ liệu an toàn là quyền sở hữu đối tượng tường minh, không phải bộ nhớ đệm ẩn. Các đường dẫn nóng khi khởi động Gateway nên truyềnPluginMetadataSnapshot hiện tại,
PluginLookUpTable đã suy ra hoặc một registry manifest tường minh xuyên suốt chuỗi
lời gọi. Quá trình xác thực cấu hình, tự động bật khi khởi động, bootstrap Plugin và lựa chọn
nhà cung cấp có thể tái sử dụng các đối tượng đó trong khi chúng đại diện cho cấu hình hiện tại và
kho Plugin. Quá trình tra cứu thiết lập vẫn dựng lại siêu dữ liệu manifest theo yêu cầu
trừ khi đường dẫn thiết lập cụ thể nhận một registry manifest tường minh; hãy giữ
cơ chế này làm dự phòng cho đường dẫn ít dùng thay vì thêm các bộ nhớ đệm tra cứu ẩn. Khi
đầu vào thay đổi, hãy dựng lại và thay thế snapshot thay vì sửa đổi snapshot hoặc
giữ các bản sao lịch sử. Các view trên registry Plugin đang hoạt động và những
trình trợ giúp bootstrap kênh tích hợp sẵn phải được tính toán lại từ
registry/thư mục gốc hiện tại. Có thể sử dụng các map tồn tại ngắn hạn trong một lời gọi để loại bỏ công việc trùng lặp hoặc
ngăn tái nhập; chúng không được trở thành bộ nhớ đệm siêu dữ liệu cấp tiến trình.
Đối với quá trình tải Plugin, lớp bộ nhớ đệm bền vững là tải runtime. Lớp này có thể tái sử dụng
trạng thái trình tải khi mã hoặc artifact đã cài đặt thực sự được tải, chẳng hạn như:
PluginLoaderCacheStatevà các registry runtime đang hoạt động tương thích- bộ nhớ đệm jiti/mô-đun và bộ nhớ đệm trình tải bề mặt công khai dùng để tránh import lặp lại cùng một bề mặt runtime
- bộ nhớ đệm hệ thống tệp cho các artifact Plugin đã cài đặt
- các map tồn tại ngắn hạn theo từng lời gọi để chuẩn hóa đường dẫn hoặc phân giải trùng lặp
- kết quả khám phá
- registry manifest trực tiếp
- registry manifest được dựng lại từ chỉ mục Plugin đã cài đặt
- tra cứu chủ sở hữu nhà cung cấp, ngăn mô hình, chính sách nhà cung cấp hoặc siêu dữ liệu artifact công khai
- bất kỳ câu trả lời nào khác suy ra từ manifest mà trong đó manifest, chỉ mục đã cài đặt hoặc đường dẫn tải đã thay đổi phải xuất hiện trong lần đọc siêu dữ liệu tiếp theo
Mô hình registry
Các Plugin đã tải không trực tiếp sửa đổi tùy ý các biến toàn cục của lõi. Chúng đăng ký vào một registry Plugin trung tâm (PluginRegistry trong src/plugins/registry-types.ts),
theo dõi các bản ghi Plugin (danh tính, nguồn, xuất xứ, trạng thái, chẩn đoán)
cùng với các mảng cho mọi khả năng: công cụ, hook cũ và hook có kiểu,
kênh, nhà cung cấp, trình xử lý RPC Gateway, route HTTP, trình đăng ký CLI,
dịch vụ nền, lệnh do Plugin sở hữu và hàng chục nhóm nhà cung cấp có kiểu khác
(giọng nói, embedding, tạo hình ảnh/video/nhạc, tìm nạp/tìm kiếm trên web,
bộ khung tác nhân, thao tác phiên, v.v.).
Sau đó, các tính năng lõi đọc từ registry đó thay vì giao tiếp trực tiếp với
mô-đun Plugin. Điều này giữ quá trình tải theo một chiều:
- mô-đun Plugin -> đăng ký vào registry
- runtime lõi -> sử dụng registry
Callback liên kết cuộc hội thoại
Các Plugin liên kết một cuộc hội thoại có thể phản ứng khi một yêu cầu phê duyệt được giải quyết. Sử dụngapi.onConversationBindingResolved(...) để nhận callback sau khi yêu cầu liên kết
được phê duyệt hoặc từ chối:
status:"approved"hoặc"denied"decision:"allow-once","allow-always"hoặc"deny"binding: liên kết đã phân giải cho các yêu cầu được phê duyệtrequest: bản tóm tắt yêu cầu ban đầu, gợi ý tách liên kết, id người gửi và siêu dữ liệu cuộc hội thoại
Hook runtime của nhà cung cấp
Plugin nhà cung cấp có ba lớp:- Siêu dữ liệu manifest để tra cứu nhanh trước runtime:
setup.providers[].envVars,providerAuthAliases,providerAuthChoicesvàchannelConfigs. - Hook tại thời điểm cấu hình:
catalogcùng vớiapplyConfigDefaults. - Hook runtime: hơn 40 hook tùy chọn bao gồm xác thực, phân giải mô hình, bọc luồng, cấp độ suy luận, chính sách phát lại và endpoint mức sử dụng. Xem Thứ tự hook và cách sử dụng.
setup.providers[].envVars khi nhà cung cấp có thông tin xác thực
dựa trên biến môi trường mà các luồng xác thực/trạng thái/trình chọn mô hình chung cần nhận biết mà không
tải runtime của plugin. Sử dụng manifest providerAuthAliases
khi một mã định danh nhà cung cấp cần tái sử dụng các biến môi trường, hồ sơ xác thực,
cơ chế xác thực dựa trên cấu hình và lựa chọn thiết lập ban đầu bằng khóa API của một mã định danh nhà cung cấp khác. Sử dụng manifest
providerAuthChoices khi các bề mặt CLI về thiết lập ban đầu/lựa chọn xác thực cần biết
mã định danh lựa chọn, nhãn nhóm và cơ chế nối dây xác thực đơn giản bằng một cờ của
nhà cung cấp mà không tải runtime của nhà cung cấp. Giữ
envVars trong runtime của nhà cung cấp cho các gợi ý dành cho người vận hành, chẳng hạn như nhãn thiết lập ban đầu hoặc
các biến thiết lập client-id/client-secret OAuth.
Mô tả việc thiết lập kênh dựa trên biến môi trường và xác thực thông qua
channelConfigs.<id>.schema và các bộ mô tả thiết lập thuộc thành phần sở hữu.
Thứ tự và cách sử dụng hook
Đối với các plugin mô hình/nhà cung cấp, OpenClaw gọi các hook theo thứ tự gần đúng sau. Cột “Khi nào nên sử dụng” là hướng dẫn quyết định nhanh. Các trường nhà cung cấp chỉ dành cho khả năng tương thích mà OpenClaw không còn gọi, chẳng hạn nhưProviderPlugin.capabilities và suppressBuiltInModel, được chủ ý không
liệt kê tại đây.
normalizeModelId, normalizeTransport và normalizeConfig trước tiên kiểm tra
plugin nhà cung cấp khớp, sau đó lần lượt chuyển sang các plugin nhà cung cấp khác có hỗ trợ hook
cho đến khi một plugin thực sự thay đổi id mô hình hoặc phương thức truyền tải/cấu hình. Điều đó giúp
các shim nhà cung cấp dành cho bí danh/tương thích tiếp tục hoạt động mà không yêu cầu bên gọi phải biết
plugin đi kèm nào sở hữu thao tác viết lại. Nếu không có hook nhà cung cấp nào viết lại một mục cấu hình
được hỗ trợ thuộc họ Google, trình chuẩn hóa cấu hình Google đi kèm vẫn áp dụng
thao tác dọn dẹp tương thích đó.
Nếu nhà cung cấp cần một giao thức truyền hoàn toàn tùy chỉnh hoặc trình thực thi yêu cầu tùy chỉnh,
thì đó là một loại tiện ích mở rộng khác. Các hook này dành cho hành vi của nhà cung cấp
vẫn chạy trên vòng lặp suy luận thông thường của OpenClaw.
resolveUsageAuth quyết định OpenClaw nên gọi fetchUsageSnapshot hay
chuyển về cơ chế phân giải thông tin xác thực chung cho các bề mặt mức sử dụng/trạng thái. Trả về
{ token, accountId?, subscriptionType?, rateLimitTier? } khi nhà cung cấp
có thông tin xác thực mức sử dụng (siêu dữ liệu gói tùy chọn được truyền vào
fetchUsageSnapshot), trả về
{ handled: true } khi cơ chế xác thực mức sử dụng do nhà cung cấp sở hữu đã xử lý yêu cầu và
phải ngăn cơ chế dự phòng khóa API/OAuth chung, đồng thời trả về null hoặc undefined
khi nhà cung cấp không xử lý xác thực mức sử dụng.
Khai báo thông tin xác thực của tổ chức hoặc thanh toán trong manifest
providerUsageAuthEnvVars. Điều này cho phép các bề mặt khám phá chung và loại bỏ bí mật
nhận diện chúng mà không biến chúng thành ứng viên xác thực suy luận.
Ví dụ về nhà cung cấp
Ví dụ tích hợp sẵn
Các plugin nhà cung cấp đi kèm kết hợp những hook ở trên để phù hợp với nhu cầu về danh mục, xác thực, tư duy, phát lại và mức sử dụng của từng nhà cung cấp. Tập hợp hook có thẩm quyền nằm cùng mỗi plugin trongextensions/; trang này minh họa các cấu trúc thay vì
sao chép danh sách.
Nhà cung cấp danh mục chuyển tiếp
Nhà cung cấp danh mục chuyển tiếp
OpenRouter, Kilocode, Z.AI, xAI đăng ký
catalog cùng
resolveDynamicModel / prepareDynamicModel để có thể hiển thị các
id mô hình thượng nguồn trước danh mục tĩnh của OpenClaw.Nhà cung cấp điểm cuối OAuth và mức sử dụng
Nhà cung cấp điểm cuối OAuth và mức sử dụng
GitHub Copilot, Gemini CLI, ChatGPT Codex, MiniMax, Xiaomi, z.ai ghép
prepareRuntimeAuth hoặc formatApiKey với resolveUsageAuth +
fetchUsageSnapshot để sở hữu việc trao đổi token và tích hợp /usage.Các họ dọn dẹp phát lại và bản chép lời
Các họ dọn dẹp phát lại và bản chép lời
Các họ dùng chung có tên (
google-gemini, passthrough-gemini,
anthropic-by-model, hybrid-anthropic-openai) cho phép nhà cung cấp chọn áp dụng
chính sách bản chép lời qua buildReplayPolicy thay vì để từng plugin
tự triển khai lại thao tác dọn dẹp.Nhà cung cấp chỉ có danh mục
Nhà cung cấp chỉ có danh mục
byteplus, cloudflare-ai-gateway, huggingface, kimi-coding, nvidia,
qianfan, synthetic, together, venice, vercel-ai-gateway và
volcengine chỉ đăng ký catalog và sử dụng vòng lặp suy luận dùng chung.Trình trợ giúp luồng dành riêng cho Anthropic
Trình trợ giúp luồng dành riêng cho Anthropic
Các header beta,
/fast / serviceTier và context1m nằm trong
bề mặt công khai api.ts / contract-api.ts của plugin Anthropic
(wrapAnthropicProviderStream, resolveAnthropicBetas,
resolveAnthropicFastMode, resolveAnthropicServiceTier) thay vì trong
SDK chung.Trình trợ giúp runtime
Các plugin có thể truy cập một số trình trợ giúp lõi được chọn quaapi.runtime. Đối với TTS:
textToSpeechtrả về payload đầu ra TTS lõi thông thường cho các bề mặt tệp/ghi chú thoại.- Sử dụng cấu hình
messages.ttsvà cơ chế chọn nhà cung cấp của lõi. - Trả về bộ đệm âm thanh PCM + tần số lấy mẫu. Các plugin phải lấy mẫu lại/mã hóa cho nhà cung cấp.
listVoiceslà tùy chọn đối với từng nhà cung cấp. Dùng nó cho trình chọn giọng nói hoặc luồng thiết lập do nhà cung cấp sở hữu.- Lõi truyền thời hạn yêu cầu đã phân giải đến các hook
listVoicescủa nhà cung cấp; cài đặt thời gian chờ riêng của nhà cung cấp có thể ghi đè thời hạn đó. - Danh sách giọng nói có thể bao gồm siêu dữ liệu phong phú hơn như ngôn ngữ, giới tính và thẻ tính cách cho các trình chọn nhận biết nhà cung cấp.
- OpenAI và ElevenLabs hiện hỗ trợ điện thoại. Microsoft thì không.
api.registerSpeechProvider(...).
- Giữ chính sách TTS, cơ chế dự phòng và việc gửi phản hồi trong lõi.
- Dùng nhà cung cấp giọng nói cho hành vi tổng hợp do nhà cung cấp sở hữu.
- Đầu vào Microsoft
edgecũ được chuẩn hóa thành id nhà cung cấpmicrosoft. - Mô hình sở hữu ưu tiên được tổ chức theo công ty: một plugin nhà cung cấp có thể sở hữu nhà cung cấp văn bản, giọng nói, hình ảnh và phương tiện trong tương lai khi OpenClaw bổ sung các hợp đồng năng lực đó.
- Giữ điều phối, cơ chế dự phòng, cấu hình và kết nối kênh trong lõi.
- Giữ hành vi của nhà cung cấp trong plugin nhà cung cấp.
- Việc mở rộng theo hướng bổ sung phải duy trì kiểu rõ ràng: phương thức tùy chọn mới, trường kết quả tùy chọn mới, năng lực tùy chọn mới.
- Việc tạo video đã tuân theo cùng một mẫu:
- lõi sở hữu hợp đồng năng lực và trình trợ giúp runtime
- các plugin nhà cung cấp đăng ký
api.registerVideoGenerationProvider(...) - các plugin tính năng/kênh sử dụng
api.runtime.videoGeneration.*
api.runtime.mediaUnderstanding.*là bề mặt dùng chung được ưu tiên cho khả năng hiểu hình ảnh/âm thanh/video.extractStructuredWithModel(...)là bề mặt hướng đến plugin dành cho việc trích xuất có giới hạn, ưu tiên hình ảnh và do nhà cung cấp sở hữu. Bao gồm ít nhất một đầu vào hình ảnh; đầu vào văn bản là ngữ cảnh bổ sung. Các plugin sản phẩm sở hữu route và schema của chúng, còn OpenClaw sở hữu ranh giới nhà cung cấp/runtime.- Sử dụng cấu hình âm thanh hiểu phương tiện của lõi (
tools.media.audio) và thứ tự dự phòng nhà cung cấp. - Trả về
{ text: undefined }khi không tạo ra đầu ra phiên âm nào (ví dụ: đầu vào bị bỏ qua/không được hỗ trợ).
api.runtime.subagent:
providervàmodellà các giá trị ghi đè tùy chọn cho từng lượt chạy, không phải thay đổi phiên lâu dài.toolsAlsoAllowchấp nhận tên công cụ chính xác, có chủ sở hữu duy nhất, được plugin gọi đăng ký. Tên thuộc lõi và tên không rõ ràng sẽ bị từ chối. Giá trị này được bổ sung vào hồ sơ thông thường, nhưng danh sách cho phép và từ chối của người vận hành vẫn có thẩm quyền.- OpenClaw chỉ tuân theo các trường ghi đè đó đối với bên gọi đáng tin cậy.
- Đối với các lượt chạy dự phòng do plugin sở hữu, người vận hành phải chủ động bật bằng
plugins.entries.<id>.subagent.allowModelOverride: true. - Dùng
plugins.entries.<id>.subagent.allowedModelsđể giới hạn các plugin đáng tin cậy ở những đíchprovider/modelchuẩn cụ thể, hoặc"*"để cho phép rõ ràng mọi đích. - Các lượt chạy tác nhân con của plugin không đáng tin cậy vẫn hoạt động, nhưng yêu cầu ghi đè sẽ bị từ chối thay vì âm thầm chuyển sang cơ chế dự phòng.
- Các phiên tác nhân con do plugin tạo được gắn thẻ bằng id của plugin tạo ra chúng.
api.runtime.subagent.deleteSession(...)dự phòng chỉ có thể xóa các phiên thuộc sở hữu đó; việc xóa phiên tùy ý vẫn yêu cầu một yêu cầu Gateway có phạm vi quản trị viên.
api.registerWebSearchProvider(...).
Ghi chú:
- Giữ cơ chế chọn nhà cung cấp, phân giải thông tin xác thực và ngữ nghĩa yêu cầu dùng chung trong lõi.
- Dùng nhà cung cấp tìm kiếm web cho các phương thức truyền tải tìm kiếm dành riêng cho nhà cung cấp.
api.runtime.webSearch.*là bề mặt dùng chung được ưu tiên cho các plugin tính năng/kênh cần hành vi tìm kiếm mà không phụ thuộc vào trình bao bọc công cụ tác nhân.
api.runtime.imageGeneration
generate(...): tạo hình ảnh bằng chuỗi nhà cung cấp tạo hình ảnh đã cấu hình.listProviders(...): liệt kê các nhà cung cấp tạo hình ảnh hiện có và khả năng của họ.
Các tuyến HTTP của Gateway
Plugin có thể cung cấp các điểm cuối HTTP bằngapi.registerHttpRoute(...).
path: đường dẫn tuyến trên máy chủ HTTP của Gateway.auth: bắt buộc,"gateway"hoặc"plugin". Dùng"gateway"để yêu cầu xác thực Gateway thông thường, hoặc"plugin"để xác thực/xác minh Webhook do Plugin quản lý.match: không bắt buộc."exact"(mặc định) hoặc"prefix".handleUpgrade: trình xử lý không bắt buộc cho các yêu cầu nâng cấp WebSocket trên cùng tuyến.replaceExisting: không bắt buộc. Cho phép cùng một Plugin thay thế đăng ký tuyến hiện có của chính nó.handler: trả vềtruekhi tuyến đã xử lý yêu cầu.
api.registerHttpHandler(...)đã bị loại bỏ và sẽ gây lỗi khi tải Plugin. Thay vào đó, hãy dùngapi.registerHttpRoute(...).- Các tuyến của Plugin phải khai báo
authmột cách tường minh. - Xung đột
path + matchchính xác sẽ bị từ chối trừ khireplaceExisting: true, và một Plugin không thể thay thế tuyến của Plugin khác. - Các tuyến chồng lấn có cấp
authkhác nhau sẽ bị từ chối. Chỉ duy trì các chuỗi chuyển tiếpexact/prefixở cùng một cấp xác thực. - Các tuyến
auth: "plugin"không tự động nhận phạm vi runtime của toán tử. Chúng dành cho việc xác minh Webhook/chữ ký do Plugin quản lý, không phải cho các lệnh gọi trợ giúp Gateway có đặc quyền. - Các tuyến
auth: "gateway"chạy trong phạm vi runtime của yêu cầu Gateway. Bề mặt mặc định (gatewayRuntimeScopeSurface: "write-default") được cố ý giới hạn:- xác thực bearer bằng bí mật dùng chung (
gateway.auth.mode = "token"/"password") và mọi phương thức xác thực không dùng proxy tin cậy đều nhận một phạm vioperator.writeduy nhất, ngay cả khi bên gọi gửix-openclaw-scopes - bên gọi
trusted-proxykhông có tiêu đềx-openclaw-scopestường minh cũng tiếp tục chỉ có bề mặtoperator.writecũ - bên gọi
trusted-proxycó gửix-openclaw-scopessẽ nhận các phạm vi đã khai báo - một tuyến có thể chọn dùng
gatewayRuntimeScopeSurface: "trusted-operator"để luôn tuân theox-openclaw-scopesđối với các chế độ xác thực mang danh tính (chuyển sang tập phạm vi mặc định đầy đủ của CLI khi không có tiêu đề)
- xác thực bearer bằng bí mật dùng chung (
- Các tab Control UI bên ngoài chạy trong sandbox và được hỗ trợ bởi tuyến
auth: "gateway"sử dụng quyền cấp cookie đã ký có thời hạn ngắn, chỉ được tạo bởi quá trình khởi tạo đã xác thực; các tab xác thực bằng Plugin vẫn giữ đường dẫn iframe trực tiếp. Trước khi gắn kết, phần tử cha chạy một phép thăm dò do tuyến sở hữu bên trong cùng sandbox không trong suốt và sẽ từ chối an toàn khi chính sách quyền riêng tư của trình duyệt chặn cookie. Quyền cấp được ràng buộc với Plugin sở hữu, gốc tuyến khớp và thế hệ xác thực hiện tại; tên cookie ngẫu nhiên theo tiến trình ngăn các Gateway đáng tin cậy trên cùng máy chủ ghi đè lẫn nhau, nhưng cookie không bao giờ cô lập các cổng TCP. Vì vậy, tên máy chủ Gateway là một ranh giới thông tin xác thực: không lưu trữ chung các dịch vụ không tin cậy lẫn nhau trên tên máy chủ đó, kể cả trên các cổng khác. Quá trình điều phối tuyến từ chối việc tái sử dụng đối với tuyến lồng nhau thuộc sở hữu của Plugin khác. Vì các phần tử con trong sandbox được xem là khác trang web cho mục đích cookie, quyền cấp chỉ chấp nhậnGETvàHEADvớioperator.read; các thao tác thay đổi dữ liệu và nâng cấp WebSocket vẫn nằm trên các bề mặt được Gateway xác thực tường minh. Cookie này cố ý không thể dùng CHIPS: các trình duyệt hiện tại đưa bit tổ tiên khác trang web vào khóa phân vùng, vì vậy các khung sandbox không trong suốt lồng nhau sẽ mất quyền truy cập vào tài sản của cùng tuyến. Cookie yêu cầu ngữ cảnh bảo mật và quyền của trình duyệt đối với cookie khác trang web, vì vậy các tab bên ngoài xác thực bằng Gateway không khả dụng trên nguồn LAN HTTP thuần túy hoặc khi cookie bên thứ ba bị chặn hoàn toàn; hãy dùng HTTPS/Tailscale Serve hoặc loopback được trình duyệt tin cậy với chính sách cookie tương thích. - Quyền cấp ngăn việc tiết lộ bearer token của Gateway và tái sử dụng tuyến/phạm vi ngoài ý muốn; nó không tạo ra ranh giới bảo mật giữa các Plugin gốc. Mã Plugin gốc và nội dung UI mà mã đó phục vụ vẫn thuộc cùng một ranh giới Plugin trong tiến trình đáng tin cậy.
- Quy tắc thực tế: không được giả định rằng một tuyến Plugin xác thực bằng Gateway mặc nhiên là bề mặt quản trị. Nếu tuyến cần hành vi chỉ dành cho quản trị viên, hãy chọn dùng bề mặt phạm vi
trusted-operator, yêu cầu chế độ xác thực mang danh tính và ghi lại hợp đồng tiêu đềx-openclaw-scopestường minh. - Sau khi khớp tuyến và xác thực, các trình xử lý thông thường tham gia cơ chế tiếp nhận công việc gốc của Gateway. Gateway đang được chuẩn bị hoặc khởi động lại sẽ trả về
503trước khi gọi trình xử lý. Ngoại lệ hẹp là tuyếnauth: "gateway"được manifest cấp quyền và cũng chọn dùng bề mặttrusted-operatordành riêng cho tuyến; tuyến này vẫn có thể truy cập để việc điều phối điều khiển tạm ngưng không bị mắc kẹt, trong khi các tuyến ngang hàng thông thường của cùng Plugin vẫn nằm sau ranh giới tiếp nhận. Quyền sở hữuhandleUpgradecủa WebSocket sử dụng cùng ranh giới tiếp nhận nguyên tử; sau khi trình xử lý chấp nhận socket, vòng đời tiếp theo của socket thuộc sở hữu của Plugin và không được ranh giới này theo dõi.
Đường dẫn nhập Plugin SDK
Khi xây dựng Plugin mới, hãy dùng các đường dẫn con SDK hẹp thay vì barrel gốcopenclaw/plugin-sdk nguyên khối. Các đường dẫn con cốt lõi:
Các Plugin kênh chọn từ một nhóm đường nối hẹp —
channel-setup,
setup-runtime, setup-tools, channel-pairing,
channel-contract, channel-feedback, channel-inbound, channel-outbound,
command-auth, secret-input, webhook-ingress,
channel-targets và channel-actions. Hành vi phê duyệt nên được hợp nhất
trên một hợp đồng approvalCapability thay vì trộn lẫn giữa các trường Plugin
không liên quan. Xem Plugin kênh.
Các trình trợ giúp runtime và cấu hình nằm trong những đường dẫn con *-runtime tập trung tương ứng
(approval-runtime, agent-runtime, lazy-runtime, directory-runtime,
text-runtime, runtime-store, system-event-runtime, heartbeat-runtime,
channel-activity-runtime, v.v.). Ưu tiên config-contracts,
plugin-config-runtime, runtime-config-snapshot và config-mutation
thay vì barrel tương thích config-runtime rộng.
openclaw/plugin-sdk/channel-lifecycle, các facade trợ giúp kênh nhỏ,
openclaw/plugin-sdk/config-runtime và openclaw/plugin-sdk/infra-runtime
là các shim tương thích đã ngừng khuyến nghị dành cho Plugin cũ. Mã mới nên nhập
các thành phần cơ bản tổng quát hẹp hơn.index.js— điểm vào của Plugin đi kèmapi.js— barrel trình trợ giúp/kiểuruntime-api.js— barrel chỉ dành cho runtimesetup-entry.js— điểm vào Plugin thiết lập
openclaw/plugin-sdk/*. Không bao giờ
nhập src/* của gói Plugin khác từ lõi hoặc từ Plugin khác.
Các điểm vào được tải qua facade ưu tiên ảnh chụp nhanh cấu hình runtime đang hoạt động khi có,
sau đó chuyển sang tệp cấu hình đã phân giải trên đĩa.
Các đường dẫn con dành riêng cho khả năng như image-generation, media-understanding
và speech tồn tại vì các Plugin đi kèm hiện đang sử dụng chúng. Chúng không
tự động trở thành hợp đồng bên ngoài được cố định lâu dài — hãy kiểm tra trang tham chiếu
SDK liên quan khi phụ thuộc vào chúng.
Lược đồ công cụ tin nhắn
Plugin nên sở hữu các đóng góp lược đồdescribeMessageTool(...) dành riêng cho kênh
đối với các thành phần cơ bản không phải tin nhắn như phản ứng, trạng thái đọc và thăm dò ý kiến.
Phần trình bày gửi dùng chung nên sử dụng hợp đồng MessagePresentation tổng quát
thay vì các trường nút, thành phần, khối hoặc thẻ gốc của nhà cung cấp.
Xem Trình bày tin nhắn để biết hợp đồng,
quy tắc chuyển tiếp, ánh xạ nhà cung cấp và danh sách kiểm tra dành cho tác giả Plugin.
Các Plugin có khả năng gửi khai báo những gì chúng có thể hiển thị thông qua khả năng tin nhắn:
presentationdành cho các khối trình bày ngữ nghĩa (text,context,divider,chart,table,buttons,select)delivery-pindành cho các yêu cầu phân phối được ghim
Phân giải đích của kênh
Plugin kênh nên sở hữu ngữ nghĩa đích dành riêng cho kênh. Giữ máy chủ gửi đi dùng chung ở dạng tổng quát và sử dụng bề mặt bộ điều hợp nhắn tin cho các quy tắc của nhà cung cấp:messaging.inferTargetChatType({ to })quyết định liệu một đích đã chuẩn hóa có nên được xem làdirect,grouphaychanneltrước khi tra cứu thư mục.messaging.targetResolver.looksLikeId(raw, normalized)cho lõi biết liệu một đầu vào có nên chuyển thẳng sang phân giải giống mã định danh thay vì tìm kiếm thư mục hay không.messaging.targetResolver.reservedLiteralsliệt kê các từ đơn lẻ là tham chiếu kênh/phiên cho nhà cung cấp đó. Quá trình phân giải giữ lại các mục thư mục đã cấu hình trước khi từ chối các giá trị chữ dành riêng, sau đó từ chối an toàn khi không tìm thấy trong thư mục.messaging.targetResolver.resolveTarget(...)là phương án chuyển tiếp của Plugin khi lõi cần bước phân giải cuối cùng thuộc sở hữu của nhà cung cấp sau khi chuẩn hóa hoặc sau khi không tìm thấy trong thư mục.messaging.resolveOutboundSessionRoute(...)sở hữu việc xây dựng tuyến phiên dành riêng cho nhà cung cấp sau khi đích được phân giải.
- Dùng
inferTargetChatTypecho các quyết định phân loại cần diễn ra trước khi tìm kiếm đồng cấp/nhóm. - Dùng
looksLikeIdcho các kiểm tra “xem đây là mã định danh đích tường minh/gốc”. - Dùng
resolveTargetlàm phương án chuyển tiếp chuẩn hóa dành riêng cho nhà cung cấp, không dùng cho tìm kiếm thư mục rộng. - Giữ các mã định danh gốc của nhà cung cấp như mã cuộc trò chuyện, mã luồng, JID, tên định danh và mã phòng
bên trong các giá trị
targethoặc tham số dành riêng cho nhà cung cấp, không đặt trong các trường SDK tổng quát.
Thư mục dựa trên cấu hình
Các Plugin tạo mục thư mục từ cấu hình nên giữ logic đó trong Plugin và tái sử dụng các trình trợ giúp dùng chung từopenclaw/plugin-sdk/directory-runtime.
Sử dụng cách này khi một kênh cần các đồng cấp/nhóm dựa trên cấu hình như:
- đồng cấp tin nhắn trực tiếp do danh sách cho phép điều khiển
- ánh xạ kênh/nhóm đã cấu hình
- phương án chuyển tiếp thư mục tĩnh theo phạm vi tài khoản
directory-runtime chỉ xử lý các thao tác tổng quát:
- lọc truy vấn
- áp dụng giới hạn
- trình trợ giúp loại bỏ trùng lặp/chuẩn hóa
- xây dựng
ChannelDirectoryEntry[]
Danh mục nhà cung cấp
Plugin nhà cung cấp có thể định nghĩa danh mục mô hình để suy luận bằngregisterProvider({ catalog: { run(...) { ... } } }).
catalog.run(...) trả về cùng cấu trúc mà OpenClaw ghi vào
models.providers:
{ provider }cho một mục nhà cung cấp{ providers }cho nhiều mục nhà cung cấp
catalog khi plugin sở hữu các id mô hình dành riêng cho nhà cung cấp, giá trị mặc định của URL cơ sở
hoặc siêu dữ liệu mô hình bị giới hạn bởi xác thực.
catalog.order kiểm soát thời điểm danh mục của plugin được hợp nhất so với các nhà cung cấp ngầm định
tích hợp sẵn của OpenClaw:
simple: các nhà cung cấp sử dụng khóa API thuần túy hoặc được điều khiển bằng biến môi trườngprofile: các nhà cung cấp xuất hiện khi có hồ sơ xác thựcpaired: các nhà cung cấp tổng hợp nhiều mục nhà cung cấp có liên quanlate: lượt cuối, sau các nhà cung cấp ngầm định khác
api.registerModelCatalogProvider({ provider, kinds, staticCatalog, liveCatalog }). Đây là hướng phát triển cho các giao diện danh sách/trợ giúp/trình chọn và hỗ trợ các hàng
text, voice, image_generation, video_generation và music_generation.
Plugin nhà cung cấp vẫn sở hữu các lệnh gọi điểm cuối trực tiếp, trao đổi token và
ánh xạ phản hồi của nhà cung cấp; lõi sở hữu hình dạng hàng chung, nhãn nguồn và
định dạng trợ giúp cho công cụ đa phương tiện. Việc đăng ký nhà cung cấp tạo nội dung đa phương tiện tự động tổng hợp
các hàng danh mục tĩnh từ defaultModel, models và
capabilities.
Khả năng tương thích:
discoveryvẫn hoạt động như một bí danh cũ, nhưng phát cảnh báo ngừng hỗ trợ- nếu cả
catalogvàdiscoveryđều được đăng ký, OpenClaw sử dụngcatalogvà phát cảnh báo augmentModelCatalogđã bị ngừng hỗ trợ; các nhà cung cấp đi kèm nên công bố các hàng bổ sung thông quaregisterModelCatalogProvider
Kiểm tra kênh chỉ đọc
Nếu plugin của bạn đăng ký một kênh, nên triển khaiplugin.config.inspectAccount(cfg, accountId) cùng với resolveAccount(...).
Lý do:
resolveAccount(...)là đường dẫn thời gian chạy. Nó được phép giả định thông tin xác thực đã được hiện thực hóa đầy đủ và có thể dừng ngay khi thiếu bí mật bắt buộc.- Các đường dẫn lệnh chỉ đọc như
openclaw status,openclaw status --all,openclaw channels status,openclaw channels resolvevà các luồng sửa chữa doctor/cấu hình không cần phải hiện thực hóa thông tin xác thực thời gian chạy chỉ để mô tả cấu hình.
inspectAccount(...) được khuyến nghị:
- Chỉ trả về trạng thái tài khoản mang tính mô tả.
- Giữ nguyên
enabledvàconfigured. - Bao gồm các trường nguồn/trạng thái thông tin xác thực khi phù hợp, chẳng hạn như:
tokenSource,tokenStatusbotTokenSource,botTokenStatusappTokenSource,appTokenStatussigningSecretSource,signingSecretStatus
- Bạn không cần trả về giá trị token thô chỉ để báo cáo
tính khả dụng chỉ đọc. Trả về
tokenStatus: "available"(và trường nguồn tương ứng) là đủ cho các lệnh kiểu trạng thái. - Sử dụng
configured_unavailablekhi thông tin xác thực được cấu hình qua SecretRef nhưng không khả dụng trong đường dẫn lệnh hiện tại.
Gói đóng gói
Một thư mục plugin có thể bao gồmpackage.json với openclaw.extensions:
<manifestOrPackageName>/<fileBase> (id manifest được ưu tiên khi
có; nếu không thì dùng tên package.json không có phạm vi).
Nếu plugin của bạn nhập các phụ thuộc npm, hãy cài đặt chúng trong thư mục đó để
node_modules khả dụng (npm install / pnpm install).
Rào chắn bảo mật: mọi mục openclaw.extensions phải nằm trong thư mục plugin
sau khi phân giải liên kết tượng trưng. Các mục thoát khỏi thư mục gói sẽ
bị từ chối.
Lưu ý bảo mật: openclaw plugins install cài đặt các phụ thuộc plugin bằng
npm install --omit=dev --ignore-scripts cục bộ của dự án (không có tập lệnh vòng đời,
không có phụ thuộc phát triển trong thời gian chạy), bỏ qua các thiết lập cài đặt npm toàn cục được kế thừa.
Giữ cây phụ thuộc plugin ở dạng “JS/TS thuần túy” và tránh các gói yêu cầu
bản dựng postinstall.
Tùy chọn: openclaw.setupEntry có thể trỏ đến một mô-đun nhẹ chỉ dùng cho thiết lập.
Khi OpenClaw cần các giao diện thiết lập cho plugin kênh bị tắt, hoặc
khi plugin kênh đã bật nhưng vẫn chưa được cấu hình, nó sẽ tải setupEntry
thay vì mục plugin đầy đủ. Điều này giúp khởi động và thiết lập nhẹ hơn
khi mục plugin chính của bạn cũng kết nối các công cụ, hook hoặc mã khác
chỉ dùng trong thời gian chạy.
Tùy chọn: openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen
có thể đưa plugin kênh vào cùng đường dẫn setupEntry trong giai đoạn khởi động
trước khi lắng nghe của Gateway, ngay cả khi kênh đã được cấu hình.
Chỉ sử dụng tùy chọn này khi setupEntry bao phủ đầy đủ giao diện khởi động phải tồn tại
trước khi Gateway bắt đầu lắng nghe. Trong thực tế, điều này có nghĩa là mục thiết lập
phải đăng ký mọi khả năng do kênh sở hữu mà quá trình khởi động phụ thuộc vào, chẳng hạn như:
- chính việc đăng ký kênh
- mọi tuyến HTTP phải khả dụng trước khi Gateway bắt đầu lắng nghe
- mọi phương thức Gateway, công cụ hoặc dịch vụ phải tồn tại trong cùng khoảng thời gian đó
singleAccountKeysToMovenamedAccountPromotionKeysresolveSingleAccountPromotionTarget(...)
channels.<id>.accounts.* mà không tải mục plugin đầy đủ.
Matrix là ví dụ đi kèm hiện tại: nó chỉ di chuyển các khóa xác thực/khởi tạo vào một
tài khoản được nâng cấp có tên khi các tài khoản có tên đã tồn tại, và có thể giữ nguyên
khóa tài khoản mặc định không chuẩn đã cấu hình thay vì luôn tạo
accounts.default.
Các bộ điều hợp bản vá thiết lập đó duy trì khả năng khám phá giao diện hợp đồng đi kèm theo kiểu tải lười. Thời gian
nhập vẫn nhẹ; giao diện nâng cấp chỉ được tải trong lần sử dụng đầu tiên thay vì
khởi động lại kênh đi kèm khi nhập mô-đun.
Khi các giao diện khởi động đó bao gồm phương thức RPC của Gateway, hãy giữ chúng dưới một
tiền tố dành riêng cho plugin. Các không gian tên quản trị lõi (config.*,
exec.approvals.*, wizard.*, update.*) vẫn được dành riêng và luôn phân giải
thành operator.admin, ngay cả khi plugin yêu cầu phạm vi hẹp hơn.
Ví dụ:
Siêu dữ liệu danh mục kênh
Plugin kênh có thể quảng bá siêu dữ liệu thiết lập/khám phá quaopenclaw.channel và
gợi ý cài đặt qua openclaw.install. Điều này giúp danh mục lõi không chứa dữ liệu.
Ví dụ:
openclaw.channel hữu ích ngoài ví dụ tối thiểu:
detailLabel: nhãn phụ cho các giao diện danh mục/trạng thái phong phú hơndocsLabel: ghi đè văn bản liên kết cho liên kết tài liệupreferOver: các id plugin/kênh có mức ưu tiên thấp hơn mà mục danh mục này nên xếp trênselectionDocsPrefix,selectionDocsOmitLabel,selectionExtras: các điều khiển nội dung cho giao diện lựa chọnmarkdownCapable: đánh dấu kênh có khả năng hỗ trợ Markdown để quyết định định dạng gửi điexposure.configured: ẩn kênh khỏi các giao diện liệt kê kênh đã cấu hình khi được đặt thànhfalseexposure.setup: ẩn kênh khỏi các trình chọn thiết lập/cấu hình tương tác khi được đặt thànhfalseexposure.docs: đánh dấu kênh là nội bộ/riêng tư đối với các giao diện điều hướng tài liệuquickstartAllowFrom: đưa kênh vào luồng bắt đầu nhanh tiêu chuẩnallowFromforceAccountBinding: yêu cầu liên kết tài khoản rõ ràng ngay cả khi chỉ tồn tại một tài khoảnpreferSessionLookupForAnnounceTarget: ưu tiên tra cứu phiên khi phân giải đích thông báo
~/.openclaw/mpm/plugins.json~/.openclaw/mpm/catalog.json~/.openclaw/plugins/catalog.json
OPENCLAW_PLUGIN_CATALOG_PATHS (hoặc OPENCLAW_MPM_CATALOG_PATHS) đến
một hoặc nhiều tệp JSON (phân cách bằng dấu phẩy/dấu chấm phẩy/PATH). Mỗi tệp phải
chứa { "entries": [ { "name": "@scope/pkg", "openclaw": { "channel": {...}, "install": {...} } } ] }. Trình phân tích cú pháp cũng chấp nhận "packages" hoặc "plugins" làm bí danh cũ cho khóa "entries".
Các mục danh mục kênh được tạo và mục danh mục cài đặt nhà cung cấp hiển thị
các dữ kiện nguồn cài đặt đã chuẩn hóa bên cạnh khối openclaw.install thô. Các
dữ kiện đã chuẩn hóa xác định liệu đặc tả npm là phiên bản chính xác hay bộ chọn thả nổi,
liệu có siêu dữ liệu tính toàn vẹn dự kiến hay không và liệu đường dẫn nguồn cục bộ
cũng có khả dụng hay không. Khi biết danh tính danh mục/gói, các
dữ kiện đã chuẩn hóa sẽ cảnh báo nếu tên gói npm đã phân tích lệch khỏi danh tính đó.
Chúng cũng cảnh báo khi defaultChoice không hợp lệ hoặc trỏ đến nguồn
không khả dụng, và khi có siêu dữ liệu tính toàn vẹn npm nhưng không có nguồn npm
hợp lệ. Người sử dụng nên coi installSource là trường tùy chọn bổ sung để
các mục tạo thủ công và shim danh mục không phải tổng hợp trường này.
Điều này cho phép quy trình làm quen và chẩn đoán giải thích trạng thái lớp nguồn mà không
nhập thời gian chạy plugin.
Các mục npm bên ngoài chính thức nên ưu tiên một npmSpec chính xác cùng với
expectedIntegrity. Tên gói trần và dist-tag vẫn hoạt động để
tương thích, nhưng chúng hiển thị cảnh báo lớp nguồn để danh mục có thể chuyển dần
sang các bản cài đặt được ghim và kiểm tra tính toàn vẹn mà không làm hỏng plugin hiện có.
Khi quy trình làm quen cài đặt từ đường dẫn danh mục cục bộ, nó ghi lại một mục
chỉ mục plugin được quản lý với source: "path" và sourcePath
tương đối với không gian làm việc khi có thể. Đường dẫn tải vận hành tuyệt đối vẫn nằm trong
plugins.load.paths; bản ghi cài đặt tránh sao chép các đường dẫn máy trạm cục bộ
vào cấu hình tồn tại lâu dài. Điều này giúp các bản cài đặt phát triển cục bộ hiển thị trong
chẩn đoán lớp nguồn mà không thêm một giao diện tiết lộ đường dẫn hệ thống tệp thô thứ hai.
Bảng SQLite installed_plugin_index được lưu bền là nguồn sự thật về
cài đặt và có thể được làm mới mà không cần tải các mô-đun thời gian chạy plugin.
Ánh xạ installRecords của bảng này được duy trì bền vững ngay cả khi manifest plugin bị thiếu hoặc
không hợp lệ; tải trọng plugins là chế độ xem manifest có thể dựng lại.
Plugin công cụ ngữ cảnh
Plugin công cụ ngữ cảnh sở hữu việc điều phối ngữ cảnh phiên cho quá trình nhập, lắp ráp và Compaction. Đăng ký chúng từ plugin của bạn bằngapi.registerContextEngine(id, factory), sau đó chọn công cụ đang hoạt động bằng
plugins.slots.contextEngine.
Sử dụng tùy chọn này khi plugin của bạn cần thay thế hoặc mở rộng pipeline ngữ cảnh mặc định
thay vì chỉ thêm tìm kiếm bộ nhớ hoặc hook.
ctx cung cấp các giá trị tùy chọn config, agentDir và workspaceDir
để khởi tạo tại thời điểm tạo.
Máy chủ hoàn tất việc chuẩn bị prompt bộ nhớ bất đồng bộ đã đăng ký trước khi gọi
assemble() của một engine không phải loại cũ. buildMemorySystemPromptAddition(...) vẫn
đồng bộ và đọc snapshot bất biến của lượt chạy đó trong khi assemble() đang hoạt động.
Chuyển nguyên trạng ngữ cảnh công cụ và trích dẫn được cung cấp để snapshot
không thể vượt qua ranh giới lượt chạy.
assemble() có thể trả về contextProjection khi harness đang hoạt động có một
luồng backend lâu dài. Bỏ qua trường này đối với phép chiếu theo từng lượt kiểu cũ. Trả về
{ mode: "thread_bootstrap", epoch } khi ngữ cảnh đã lắp ráp cần được
đưa một lần vào luồng backend và tái sử dụng cho đến khi epoch thay đổi. Thay đổi
epoch sau khi ngữ cảnh ngữ nghĩa của engine thay đổi, chẳng hạn sau một lượt
Compaction do engine sở hữu. Máy chủ có thể giữ lại metadata lời gọi công cụ, hình dạng
đầu vào và kết quả công cụ đã biên tập trong phép chiếu khởi tạo luồng để các
luồng backend mới duy trì tính liên tục của công cụ mà không sao chép các
payload thô chứa dữ liệu bí mật.
Nếu engine của bạn không sở hữu thuật toán Compaction, hãy tiếp tục triển khai compact()
và ủy quyền rõ ràng:
Thêm một khả năng mới
Khi một plugin cần hành vi không phù hợp với API hiện tại, đừng bỏ qua hệ thống plugin bằng cách truy cập riêng vào nội bộ. Hãy thêm khả năng còn thiếu. Trình tự được khuyến nghị:- Định nghĩa hợp đồng lõi. Quyết định hành vi dùng chung nào thuộc trách nhiệm của lõi: chính sách, phương án dự phòng, hợp nhất cấu hình, vòng đời, ngữ nghĩa hướng đến kênh và hình dạng helper runtime.
- Thêm các bề mặt đăng ký/runtime plugin có kiểu. Mở rộng
OpenClawPluginApivà/hoặcapi.runtimebằng bề mặt khả năng có kiểu nhỏ nhất nhưng hữu ích. - Kết nối lõi + các bên sử dụng thuộc kênh/tính năng. Các kênh và plugin tính năng nên sử dụng khả năng mới thông qua lõi, thay vì nhập trực tiếp một triển khai của nhà cung cấp.
- Đăng ký các triển khai của nhà cung cấp. Sau đó, các plugin của nhà cung cấp đăng ký backend của chúng với khả năng này.
- Thêm phạm vi kiểm thử hợp đồng. Thêm các kiểm thử để quyền sở hữu và hình dạng đăng ký luôn được thể hiện rõ ràng theo thời gian.
Danh sách kiểm tra khả năng
Khi thêm một khả năng mới, triển khai thường nên đồng thời tác động đến các bề mặt sau:- các kiểu hợp đồng lõi trong
src/<capability>/types.ts - runner/helper runtime lõi trong
src/<capability>/runtime.ts - bề mặt đăng ký API plugin trong
src/plugins/types.ts - kết nối registry plugin trong
src/plugins/registry.ts - phơi bày runtime plugin trong
src/plugins/runtime/*khi các plugin tính năng/kênh cần sử dụng khả năng đó - các helper thu thập/kiểm thử trong
src/test-utils/plugin-registration.ts - các xác nhận quyền sở hữu/hợp đồng trong
src/plugins/contracts/registry.ts - tài liệu dành cho người vận hành/plugin trong
docs/
Mẫu khả năng
Mẫu tối thiểu:src/plugins/contracts/registry.ts cung cấp các phép tra cứu
quyền sở hữu như providerContractPluginIds; các kiểm thử xác nhận danh sách
contracts.videoGenerationProviders của plugin khớp với những gì plugin thực sự đăng ký):
- lõi sở hữu hợp đồng khả năng + cơ chế điều phối
- các plugin của nhà cung cấp sở hữu triển khai dành cho nhà cung cấp
- các plugin tính năng/kênh sử dụng helper runtime
- các kiểm thử hợp đồng giúp quyền sở hữu luôn rõ ràng
Liên quan
- Kiến trúc Plugin — mô hình và hình dạng khả năng công khai
- Các đường dẫn con của Plugin SDK
- Thiết lập Plugin SDK
- Xây dựng plugin