defineToolPlugin、definePluginEntry、defineChannelPluginEntry、defineSetupPluginEntry。
套件進入點
已安裝的外掛會將package.json openclaw 欄位同時指向原始碼與
建置後的進入點:
extensions和setupEntry是原始碼進入點,用於工作區和 git checkout 開發。runtimeExtensions和runtimeSetupEntry是已安裝 套件的首選:它們可讓 npm 套件略過執行階段 TypeScript 編譯。- 若有
runtimeExtensions,其陣列長度必須與extensions相同 (進入點依位置配對)。runtimeSetupEntry需要setupEntry。 - 若宣告了
runtimeExtensions/runtimeSetupEntry成品但 該成品不存在,安裝/探索會因套件封裝錯誤而失敗;OpenClaw 不會 靜默回退至原始碼。下述原始碼回退僅適用於完全未宣告 執行階段進入點的情況。 - 若已安裝的套件僅宣告 TypeScript 原始碼進入點,OpenClaw
會尋找相符的建置後
dist/*.js(或.mjs/.cjs)對應項目並使用它; 否則會回退至 TypeScript 原始碼。 - 所有進入點路徑都必須位於外掛套件目錄內。執行階段
進入點和推斷出的建置後 JavaScript 對應項目,無法讓逸出目錄的
extensions或setupEntry原始碼路徑成為有效路徑。
defineToolPlugin
匯入: openclaw/plugin-sdk/tool-plugin
適用於僅新增代理程式工具的外掛。它可保持原始碼精簡、從 TypeBox 結構描述推斷設定
與工具參數型別、將一般傳回值包裝成
OpenClaw 工具結果格式,並公開靜態中繼資料,供
openclaw plugins build 寫入外掛資訊清單(contracts.tools、
configSchema)。
configSchema為選用;省略時會使用嚴格的空物件結構描述 (產生的資訊清單仍會包含configSchema)。execute會傳回一般字串或可序列化為 JSON 的值;輔助函式會 將其包裝成文字工具結果,並將details設為原始 (未字串化的)傳回值。outputSchema可選擇描述該原始details值,以供 Code Mode 和 Tool Search 使用。目錄呼叫會在執行前拒絕無效的結構描述, 並在傳回最終值前驗證該值。- 若需自訂工具結果,
openclaw/plugin-sdk/tool-results會匯出textResult和jsonResult。 - 工具名稱是靜態的,因此
openclaw plugins build會從已宣告的工具推導出contracts.tools,無須手動重複名稱。 - 執行階段載入仍採嚴格模式:已安裝的外掛仍需要
openclaw.plugin.json和package.jsonopenclaw.extensions。OpenClaw 絕不會執行外掛程式碼來推斷缺少的資訊清單資料。
definePluginEntry
匯入: openclaw/plugin-sdk/plugin-entry
適用於提供者外掛、進階工具外掛、鉤子外掛,以及任何
不是訊息頻道的外掛。
id必須與你的openclaw.plugin.json資訊清單相符。- 外部工作階段目錄使用
openclaw/plugin-sdk/session-catalog和api.registerSessionCatalog({ id, label, list, read, continueSession?, archive? })。 核心擁有sessions.catalog.*閘道方法;提供者會傳回主機、 工作階段和正規化的轉錄內容投影,而不會註冊 RPC。清單提供者應在每個主機 完成時呼叫選用的onHost(host)回呼;傳回的主機陣列仍是必要的最終相容性 快照。 kind已棄用:請改為在openclaw.plugin.json資訊清單的kind欄位中 宣告互斥插槽("memory"或"context-engine")。執行階段進入點的kind僅保留作為 舊版外掛的相容性回退。configSchema可以是用於延遲求值的函式。OpenClaw 會在 第一次存取時解析並記憶該結構描述,因此昂貴的結構描述建構器只會執行 一次。nodeHostCommands描述項可以定義isAvailable({ config, env })。 傳回false會從無頭節點的閘道宣告中省略該命令及其功能。 OpenClaw 會根據節點本機的啟動設定進行評估;命令處理常式在 叫用時仍應驗證可用性。
defineChannelPluginEntry
匯入: openclaw/plugin-sdk/channel-core
使用頻道專用接線包裝 definePluginEntry:它會自動
呼叫 api.registerChannel({ plugin })、公開選用的根說明命令列介面
中繼資料接縫,並根據註冊模式限制 registerFull。
回呼會依每種註冊模式執行(完整表格請見
註冊模式):
setRuntime會在除"cli-metadata"和"tool-discovery"以外的所有模式下執行。請在此儲存執行階段參照,通常透過createPluginRuntimeStore。registerCliMetadata會針對"cli-metadata"、"discovery"和"full"執行。請將其用作頻道所擁有之命令列介面描述項的標準位置, 讓根說明保持非啟用狀態、探索快照包含靜態 命令中繼資料,且一般命令列介面註冊仍與完整 外掛載入相容。registerFull僅針對"full"和"tool-discovery"執行。對於"tool-discovery",它會_取代_頻道註冊執行:OpenClaw 會完全略過registerChannel/setRuntime,並且只呼叫registerFull,因此頻道在獨立工具探索或執行時所需的任何提供者/工具註冊, 都必須放在該處,而不能置於一般頻道設定之後。- 探索註冊不會啟用外掛,但並非不會匯入:OpenClaw 可能會
對受信任的外掛進入點和頻道外掛模組進行求值,以建構
快照。頂層匯入不得產生副作用,並應將通訊端、
用戶端、背景工作程式和服務置於僅限
"full"的路徑之後。 - 與
definePluginEntry相同,configSchema可以是延遲處理的工廠函式;OpenClaw 會在第一次存取時記憶解析後的結構描述。
- 對於你想要延遲載入、但不希望從根命令列介面
剖析樹中消失的外掛自有根命令列介面命令,請使用
api.registerCli(..., { descriptors: [...] })。 描述元名稱必須符合字母、數字、連字號及底線,且以字母或數字開頭; OpenClaw 會拒絕其他格式,並在呈現說明前移除描述中的終端控制序列。 涵蓋註冊器公開的每個頂層命令根。 單獨使用commands時,會維持在積極載入的相容性路徑上。 - 對於配對節點功能命令,請使用
api.registerNodeCliFeature(...),使其 位於openclaw nodes之下(等同於registerCli(registrar, { parentPath: ["nodes"], ... }))。 - 對於其他巢狀外掛命令,請新增
parentPath,並在傳給註冊器的program物件上註冊命令;OpenClaw 會先將其解析為父命令, 再呼叫外掛。 - 對於頻道外掛,請從
registerCliMetadata註冊命令列介面描述元, 並讓registerFull專注於僅限執行階段的工作。 - 如果
registerFull也註冊閘道 RPC 方法,請將其置於 外掛專用前綴下。保留的核心管理命名空間(config.*、exec.approvals.*、wizard.*、update.*)一律會強制轉換為operator.admin。
defineSetupPluginEntry
匯入: openclaw/plugin-sdk/channel-core
用於輕量的 setup-entry.ts 檔案。僅傳回 { plugin },
不包含執行階段或命令列介面接線。
defineSetupPluginEntry(...) 與範圍精簡的設定輔助函式系列搭配使用:
請將大型 SDK、命令列介面註冊及長期運作的執行階段服務保留在
完整進入點中。
將設定與執行階段介面分離的內建工作區頻道,可以改用
openclaw/plugin-sdk/channel-entry-contract 中的
defineBundledChannelSetupEntry(...)。它能讓設定進入點保留設定安全的外掛/密鑰匯出,
同時仍公開執行階段 setter:
registerSetupRuntime 僅會針對 "setup-runtime" 載入執行;請將其
限制為僅限組態的路由,或必須在延遲完整啟用前存在的方法。
註冊模式
api.registrationMode 會告知外掛其載入方式:
defineChannelPluginEntry 會自動處理此分流。如果你直接對頻道使用
definePluginEntry,請自行檢查模式,並記得
"tool-discovery" 會略過頻道註冊:
plugin.<plugin-id>.changed。事件名稱須為單一
小寫片段,承載資料必須是有界的 JSON,而範圍必須為
operator.read、operator.write 或 operator.admin。發射器僅在
服務存續期間存在,並會在停止或啟動失敗後撤銷。請優先使用版本或
失效承載資料,而非完整記錄,讓經授權的用戶端透過外掛的範圍限定
閘道方法重新讀取標準狀態。
探索模式會建立不啟用功能的登錄快照。它仍可能評估外掛進入點及
頻道外掛物件,讓 OpenClaw 能註冊頻道能力及靜態命令列介面描述元。
請將探索期間的模組評估視為可信任但應保持輕量:頂層不得建立網路
用戶端、子程序、監聽器、資料庫連線、背景工作處理器、讀取認證資訊,
或產生其他即時執行階段副作用。
請將 "setup-runtime" 視為設定專用的啟動介面必須存在、但不得重新進入
完整內建頻道執行階段的時段。適合的項目包括頻道註冊、設定安全的 HTTP
路由、設定安全的閘道方法,以及委派設定輔助函式。大型背景服務、
命令列介面註冊器及提供者/用戶端 SDK 啟動程序仍應置於
"full"。
外掛形式
OpenClaw 會依照載入外掛的註冊行為進行分類:
使用
openclaw plugins inspect <id> 查看外掛的形式。