Plugin SDK reference
Plugin ãšã³ããªãã€ã³ã
ãã¹ãŠã®ãã©ã°ã€ã³ã¯ããã©ã«ãã®ãšã³ããªãªããžã§ã¯ãããšã¯ã¹ããŒãããŸããSDK ã¯ãããããäœæããããã®ãã«ããŒãæäŸããŸãã
ã€ã³ã¹ããŒã«æžã¿ãã©ã°ã€ã³ã§ã¯ãå©çšå¯èœãªå Žåãpackage.json ã§ã©ã³ã¿ã€ã èªã¿èŸŒã¿ããã«ãæžã¿ JavaScript ãæãããã«ããå¿
èŠããããŸãã
{ "openclaw": { "extensions": ["./src/index.ts"], "runtimeExtensions": ["./dist/index.js"], "setupEntry": "./src/setup-entry.ts", "runtimeSetupEntry": "./dist/setup-entry.js" }}extensions ãš setupEntry ã¯ãã¯ãŒã¯ã¹ããŒã¹ããã³ git ãã§ãã¯ã¢ãŠãã§ã®éçºåãã®æå¹ãªãœãŒã¹ãšã³ããªã®ãŸãŸã§ããruntimeExtensions ãš runtimeSetupEntry ã¯ãOpenClaw ãã€ã³ã¹ããŒã«æžã¿ããã±ãŒãžãèªã¿èŸŒããšãã«åªå
ãããnpm ããã±ãŒãžãã©ã³ã¿ã€ã ã§ TypeScript ã³ã³ãã€ã«ãé¿ããããããã«ããŸããæç€ºçãªã©ã³ã¿ã€ã ãšã³ããªã¯å¿
é ã§ããruntimeSetupEntry ã«ã¯ setupEntry ãå¿
èŠã§ãããruntimeExtensions ãŸã㯠runtimeSetupEntry ã®ææç©ãæ¬ ããŠããå Žåã¯ããœãŒã¹ãžæé»ã«ãã©ãŒã«ããã¯ãããã€ã³ã¹ããŒã«ãŸãã¯æ€åºã倱æããŸããã€ã³ã¹ããŒã«æžã¿ããã±ãŒãžã TypeScript ãœãŒã¹ãšã³ããªã ãã宣èšããŠããå ŽåãOpenClaw ã¯äžèŽãããã«ãæžã¿ã® dist/*.js ãã¢ãååšããã°ããã䜿çšãããã®åŸ TypeScript ãœãŒã¹ãžãã©ãŒã«ããã¯ããŸãã
ãã¹ãŠã®ãšã³ããªãã¹ã¯ããã©ã°ã€ã³ããã±ãŒãžãã£ã¬ã¯ããªã®å
éšã«çãŸãå¿
èŠããããŸããã©ã³ã¿ã€ã ãšã³ããªãæšè«ããããã«ãæžã¿ JavaScript ãã¢ã«ãã£ãŠãå€éšãžæãã extensions ãŸã㯠setupEntry ãœãŒã¹ãã¹ãæå¹ã«ãªãããšã¯ãããŸããã
defineToolPlugin
ã€ã³ããŒã: openclaw/plugin-sdk/tool-plugin
ãšãŒãžã§ã³ãããŒã«ã ãã远å ããåçŽãªãã©ã°ã€ã³åãã§ããdefineToolPlugin ã¯ãäœæå
ã®ãœãŒã¹ãå°ããä¿ã¡ãTypeBox ã¹ããŒããã config ãšããŒã«ãã©ã¡ãŒã¿ãŒã®åãæšè«ãããã¬ãŒã³ãªæ»ãå€ã OpenClaw ã®ããŒã«çµæåœ¢åŒã§ã©ããããopenclaw plugins build ããã©ã°ã€ã³ãããã§ã¹ããžæžã蟌ãéçã¡ã¿ããŒã¿ãå
¬éããŸãã
export default defineToolPlugin({ id: "stock-quotes", name: "Stock Quotes", description: "Fetch stock quotes.", configSchema: Type.Object({ apiKey: Type.Optional(Type.String({ description: "API key." })), }), tools: (tool) => [ tool({ name: "quote", label: "Quote", description: "Fetch a quote.", parameters: Type.Object({ symbol: Type.String({ description: "Ticker symbol." }), }), execute: async ({ symbol }, config) => ({ symbol, hasKey: Boolean(config.apiKey) }), }), ],});configSchemaã¯ä»»æã§ããçç¥ããå ŽåãOpenClaw ã¯å³å¯ãªç©ºãªããžã§ã¯ãã¹ããŒãã䜿çšããçæããããããã§ã¹ãã«ã¯åŒãç¶ãconfigSchemaãå«ãŸããŸããexecuteã¯ãã¬ãŒã³ãªæååãŸã㯠JSON ã·ãªã¢ã©ã€ãºå¯èœãªå€ãè¿ããŸãããã«ããŒã¯ãããdetailsä»ãã®ããã¹ãããŒã«çµæãšããŠã©ããããŸãã- ããŒã«åã¯éçã§ãã
openclaw plugins buildã¯å®£èšãããããŒã«ããcontracts.toolsãå°åºãããããäœæè ãååãæäœæ¥ã§éè€ããŠèšè¿°ããå¿ èŠã¯ãããŸããã - ã©ã³ã¿ã€ã èªã¿èŸŒã¿ã¯å³å¯ãªãŸãŸã§ããã€ã³ã¹ããŒã«æžã¿ãã©ã°ã€ã³ã«ã¯åŒãç¶ã
openclaw.plugin.jsonãšpackage.jsonã®openclaw.extensionsãå¿ èŠã§ããOpenClaw ã¯ãäžè¶³ããŠãããããã§ã¹ãããŒã¿ãæšè«ããããã«ãã©ã°ã€ã³ã³ãŒããå®è¡ããŸããã
definePluginEntry
ã€ã³ããŒã: openclaw/plugin-sdk/plugin-entry
ãããã€ããŒãã©ã°ã€ã³ãé«åºŠãªããŒã«ãã©ã°ã€ã³ãããã¯ãã©ã°ã€ã³ãããã³ã¡ãã»ãŒãžã³ã°ãã£ã³ãã«ã§ã¯ãªããã®åãã§ãã
export default definePluginEntry({ id: "my-plugin", name: "My Plugin", description: "Short summary", register(api) { api.registerProvider({ /* ... */ }); api.registerTool({ /* ... */ }); },});| ãã£ãŒã«ã | å | å¿ é | ããã©ã«ã |
|---|---|---|---|
id |
string |
ã¯ã | - |
name |
string |
ã¯ã | - |
description |
string |
ã¯ã | - |
kind |
string |
ããã | - |
configSchema |
OpenClawPluginConfigSchema | () => OpenClawPluginConfigSchema |
ããã | 空ãªããžã§ã¯ãã¹ããŒã |
register |
(api: OpenClawPluginApi) => void |
ã¯ã | - |
idã¯openclaw.plugin.jsonãããã§ã¹ããšäžèŽããŠããå¿ èŠããããŸããkindã¯æä»çã¹ãããçšã§ã:"memory"ãŸãã¯"context-engine"ãconfigSchemaã¯é å»¶è©äŸ¡çšã®é¢æ°ã«ã§ããŸãã- OpenClaw ã¯ååã¢ã¯ã»ã¹æã«ãã®ã¹ããŒãã解決ããŠã¡ã¢åãããããã³ã¹ãã®é«ãã¹ããŒããã«ããŒã¯äžåºŠã ãå®è¡ãããŸãã
defineChannelPluginEntry
ã€ã³ããŒã: openclaw/plugin-sdk/channel-core
definePluginEntry ããã£ã³ãã«åºæã®é
ç·ã§ã©ããããŸããapi.registerChannel({ plugin }) ãèªåçã«åŒã³åºããä»»æã®ã«ãŒããã«ã CLI ã¡ã¿ããŒã¿ã®æ¥åç¹ãå
¬éããç»é²ã¢ãŒãã«åºã¥ã㊠registerFull ãã²ãŒãããŸãã
export default defineChannelPluginEntry({ id: "my-channel", name: "My Channel", description: "Short summary", plugin: myChannelPlugin, setRuntime: setMyRuntime, registerCliMetadata(api) { api.registerCli(/* ... */); }, registerFull(api) { api.registerGatewayMethod(/* ... */); },});| ãã£ãŒã«ã | å | å¿ é | ããã©ã«ã |
|---|---|---|---|
id |
string |
ã¯ã | - |
name |
string |
ã¯ã | - |
description |
string |
ã¯ã | - |
plugin |
ChannelPlugin |
ã¯ã | - |
configSchema |
OpenClawPluginConfigSchema | () => OpenClawPluginConfigSchema |
ããã | 空ãªããžã§ã¯ãã¹ããŒã |
setRuntime |
(runtime: PluginRuntime) => void |
ããã | - |
registerCliMetadata |
(api: OpenClawPluginApi) => void |
ããã | - |
registerFull |
(api: OpenClawPluginApi) => void |
ããã | - |
setRuntimeã¯ç»é²äžã«åŒã³åºããããããã©ã³ã¿ã€ã åç §ãä¿åã§ããŸãïŒéåžžã¯createPluginRuntimeStoreçµç±ïŒãCLI ã¡ã¿ããŒã¿ã®ãã£ããã£äžã¯ã¹ããããããŸããregisterCliMetadataã¯api.registrationMode === "cli-metadata"ãapi.registrationMode === "discovery"ãããã³api.registrationMode === "full"ã®éã«å®è¡ãããŸãã ããããã£ã³ãã«ææã® CLI èšè¿°åã®æšæºçãªå ŽæãšããŠäœ¿çšãããšãã«ãŒããã«ãã¯éã¢ã¯ãã£ãåã®ãŸãŸã«ãªããæ€åºã¹ãããã·ã§ããã«éçã³ãã³ãã¡ã¿ããŒã¿ãå«ãŸããéåžžã® CLI ã³ãã³ãç»é²ã¯å®å šãªãã©ã°ã€ã³èªã¿èŸŒã¿ãšäºææ§ãä¿ã¡ãŸãã- æ€åºç»é²ã¯éã¢ã¯ãã£ãåã§ãããã€ã³ããŒãäžèŠã§ã¯ãããŸãããOpenClaw ã¯ã¹ãããã·ã§ãããæ§ç¯ããããã«ãä¿¡é Œããããã©ã°ã€ã³ãšã³ããªãšãã£ã³ãã«ãã©ã°ã€ã³ã¢ãžã¥ãŒã«ãè©äŸ¡ããå Žåãããããããããã¬ãã«ã®ã€ã³ããŒãã¯å¯äœçšãªãã«ä¿ã¡ããœã±ãããã¯ã©ã€ã¢ã³ããã¯ãŒã«ãŒããµãŒãã¹ã¯
"full"ã®ã¿ã®ãã¹ã®èåŸã«çœ®ããŠãã ããã registerFullã¯api.registrationMode === "full"ã®å Žåã«ã®ã¿å®è¡ãããŸããã»ããã¢ããå°çšèªã¿èŸŒã¿äžã¯ã¹ããããããŸããdefinePluginEntryãšåæ§ã«ãconfigSchemaã¯é å»¶ãã¡ã¯ããªã«ã§ããOpenClaw ã¯ååã¢ã¯ã»ã¹æã«è§£æ±ºæžã¿ã¹ããŒããã¡ã¢åããŸãã- ãã©ã°ã€ã³ææã®ã«ãŒã CLI ã³ãã³ãã§ã¯ãã«ãŒã CLI è§£æããªãŒããæ¶ããã«ã³ãã³ããé
å»¶èªã¿èŸŒã¿ã®ãŸãŸã«ãããå Žåã
api.registerCli(..., { descriptors: [...] })ãåªå ããŠãã ããããã¢ããŒãã®æ©èœã³ãã³ãã§ã¯ãã³ãã³ããopenclaw nodesé äžã«çœ®ãããããã«api.registerNodeCliFeature(...)ãåªå ããŠãã ããããã®ä»ã®ãã¹ãããããã©ã°ã€ã³ã³ãã³ãã§ã¯ãparentPathã远å ããã¬ãžã¹ãã©ã«æž¡ãããprogramãªããžã§ã¯ãã«ã³ãã³ããç»é²ããŠãã ãããOpenClaw ã¯ãã©ã°ã€ã³ãåŒã³åºãåã«ãããã芪ã³ãã³ããžè§£æ±ºããŸãããã£ã³ãã«ãã©ã°ã€ã³ã§ã¯ããããã®èšè¿°åãregisterCliMetadata(...)ããç»é²ããããšãåªå ããregisterFull(...)ã¯ã©ã³ã¿ã€ã å°çšã®äœæ¥ã«éäžãããŠãã ããã registerFull(...)ã Gateway RPC ã¡ãœãããç»é²ããå Žåã¯ããã©ã°ã€ã³åºæã®ãã¬ãã£ãã¯ã¹é äžã«çœ®ããŠãã ãããäºçŽæžã¿ã®ã³ã¢ç®¡çåå空éïŒconfig.*ãexec.approvals.*ãwizard.*ãupdate.*ïŒã¯åžžã«operator.adminã«åŒ·å¶å€æãããŸãã
defineSetupPluginEntry
ã€ã³ããŒã: openclaw/plugin-sdk/channel-core
軜é㪠setup-entry.ts ãã¡ã€ã«åãã§ããã©ã³ã¿ã€ã ã CLI ã®é
ç·ãªãã§ã{ plugin } ã ããè¿ããŸãã
export default defineSetupPluginEntry(myChannelPlugin);ãã£ã³ãã«ãç¡å¹ãæªèšå®ããŸãã¯é å»¶èªã¿èŸŒã¿ãæå¹ãªå ŽåãOpenClaw ã¯å®å šãªãšã³ããªã®ä»£ããã«ãããèªã¿èŸŒã¿ãŸãããããéèŠã«ãªãå Žé¢ã«ã€ããŠã¯ãã»ããã¢ãããšèšå® ãåç §ããŠãã ããã
å®éã«ã¯ãdefineSetupPluginEntry(...) ãçãã»ããã¢ãããã«ããŒãã¡ããªãŒãšçµã¿åãããŸãã
createSetupTranslatorãã€ã³ããŒãå®å šãªã»ããã¢ãããããã¢ããã¿ãŒãlookup-note åºåãpromptResolvedAllowFromãsplitSetupEntriesãå§è²ã»ããã¢ãããããã·ãªã©ãã©ã³ã¿ã€ã å®å šãªã»ããã¢ãããã«ããŒã«ã¯openclaw/plugin-sdk/setup-runtime- ä»»æã€ã³ã¹ããŒã«ã®ã»ããã¢ãããµãŒãã§ã¹ã«ã¯
openclaw/plugin-sdk/channel-setup - ã»ããã¢ãã/ã€ã³ã¹ããŒã« CLI/ã¢ãŒã«ã€ã/docs ãã«ããŒã«ã¯
openclaw/plugin-sdk/setup-tools
éã SDKãCLI ç»é²ãããã³é·å¯¿åœã®ã©ã³ã¿ã€ã ãµãŒãã¹ã¯å®å šãªãšã³ããªã«çœ®ããŠãã ããã
ã»ããã¢ãããµãŒãã§ã¹ãšã©ã³ã¿ã€ã ãµãŒãã§ã¹ãåå²ãããã³ãã«æžã¿ã¯ãŒã¯ã¹ããŒã¹ãã£ã³ãã«ã§ã¯ã代ããã« openclaw/plugin-sdk/channel-entry-contract ã® defineBundledChannelSetupEntry(...) ã䜿çšã§ããŸãããã®å¥çŽã«ãããã»ããã¢ãããšã³ããªã¯ã©ã³ã¿ã€ã ã»ãã¿ãŒãå
¬éããªãããã»ããã¢ããå®å
šãªãã©ã°ã€ã³/ã·ãŒã¯ã¬ããã®ãšã¯ã¹ããŒããç¶æã§ããŸãã
export default defineBundledChannelSetupEntry({ importMetaUrl: import.meta.url, plugin: { specifier: "./channel-plugin-api.js", exportName: "myChannelPlugin", }, runtime: { specifier: "./runtime-api.js", exportName: "setMyChannelRuntime", }, registerSetupRuntime(api) { api.registerHttpRoute({ path: "/my-channel/events", auth: "plugin", handler: async (req, res) => { /* setup-safe route */ }, }); },});ãã®ãã³ãã«æžã¿å¥çŽã¯ãå®å
šãªãã£ã³ãã«ãšã³ããªãèªã¿èŸŒãŸããåã«ãã»ããã¢ãããããŒã軜éãªã©ã³ã¿ã€ã ã»ãã¿ãŒãŸãã¯ã»ããã¢ããå®å
šãª Gateway ãµãŒãã§ã¹ãæ¬åœã«å¿
èŠãšããå Žåã«ã®ã¿äœ¿çšããŠãã ãããregisterSetupRuntime 㯠"setup-runtime" èªã¿èŸŒã¿ã«å¯ŸããŠã®ã¿å®è¡ãããŸããé
å»¶ãããå®å
šãªã¢ã¯ãã£ããŒã·ã§ã³ã®åã«ååšããå¿
èŠããããèšå®å°çšã®ã«ãŒããŸãã¯ã¡ãœããã«éå®ããŠãã ããã
ç»é²ã¢ãŒã
api.registrationMode ã¯ããã©ã°ã€ã³ãã©ã®ããã«èªã¿èŸŒãŸãããã瀺ããŸãã
| ã¢ãŒã | ã¿ã€ãã³ã° | ç»é²ãããã® |
|---|---|---|
"full" |
éåžžã® Gateway èµ·å | ãã¹ãŠ |
"discovery" |
èªã¿åãå°çšã®æ©èœæ€åº | ãã£ãã«ç»é²ãšéç CLI èšè¿°åããšã³ããªã³ãŒãã¯èªã¿èŸŒãŸããå Žåããããããœã±ãããã¯ãŒã«ãŒãã¯ã©ã€ã¢ã³ãããµãŒãã¹ã¯ã¹ããããã |
"setup-only" |
ç¡å¹åæžã¿/æªèšå®ã®ãã£ãã« | ãã£ãã«ç»é²ã®ã¿ |
"setup-runtime" |
ã©ã³ã¿ã€ã ãå©çšå¯èœãªã»ããã¢ãããã㌠| ãã£ãã«ç»é²ãšãå®å šãªãšã³ããªãèªã¿èŸŒãŸããåã«å¿ èŠãªè»œéã©ã³ã¿ã€ã ã®ã¿ |
"cli-metadata" |
ã«ãŒããã«ã / CLI ã¡ã¿ããŒã¿ååŸ | CLI èšè¿°åã®ã¿ |
defineChannelPluginEntry ã¯ãã®åå²ãèªåçã«åŠçããŸãããã£ãã«ã§
definePluginEntry ãçŽæ¥äœ¿ãå Žåã¯ãèªåã§ã¢ãŒãã確èªããŠãã ããã
register(api) { if ( api.registrationMode === "cli-metadata" || api.registrationMode === "discovery" || api.registrationMode === "full" ) { api.registerCli(/* ... */); if (api.registrationMode === "cli-metadata") return; } api.registerChannel({ plugin: myPlugin }); if (api.registrationMode !== "full") return; // Heavy runtime-only registrations api.registerService(/* ... */);}æ€åºã¢ãŒãã¯ãæå¹åããªãã¬ãžã¹ããªã¹ãããã·ã§ãããæ§ç¯ããŸããOpenClaw ããã£ãã«æ©èœãšéç CLI èšè¿°åãç»é²ã§ããããã«ãPlugin ãšã³ããªãšãã£ãã« Plugin ãªããžã§ã¯ããè©äŸ¡ããå ŽåããããŸããæ€åºæã®ã¢ãžã¥ãŒã«è©äŸ¡ã¯ä¿¡é Œã§ããã軜éãªãã®ãšããŠæ±ã£ãŠãã ããããããã¬ãã«ã§ã¯ããããã¯ãŒã¯ã¯ã©ã€ã¢ã³ãããµãããã»ã¹ããªã¹ããŒãããŒã¿ããŒã¹æ¥ç¶ãããã¯ã°ã©ãŠã³ãã¯ãŒã«ãŒãèªèšŒæ å ±ã®èªã¿åãããã®ä»ã®ã©ã€ãã©ã³ã¿ã€ã å¯äœçšãå®è¡ããªãã§ãã ããã
"setup-runtime" ã¯ãå®å
šãªãã³ãã«æžã¿ãã£ãã«ã©ã³ã¿ã€ã ã«å床å
¥ãããšãªããã»ããã¢ããå°çšã®èµ·åãµãŒãã§ã¹ãååšããå¿
èŠãããæéãšããŠæ±ã£ãŠãã ãããé©ããŠããã®ã¯ããã£ãã«ç»é²ãã»ããã¢ããã«å®å
šãª HTTP ã«ãŒããã»ããã¢ããã«å®å
šãª Gateway ã¡ãœãããå§è²ãããã»ããã¢ãããã«ããŒã§ããéãããã¯ã°ã©ãŠã³ããµãŒãã¹ãCLI ã¬ãžã¹ãã©ããããã€ããŒ/ã¯ã©ã€ã¢ã³ã SDK ã®ããŒãã¹ãã©ããã¯ãåŒãç¶ã "full" ã«å±ããŸãã
CLI ã¬ãžã¹ãã©ã«ã€ããŠã¯ãç¹ã«æ¬¡ã®ç¹ã«æ³šæããŠãã ããã
- ã¬ãžã¹ãã©ã 1 ã€ä»¥äžã®ã«ãŒãã³ãã³ããææããæåã®åŒã³åºãæã« OpenClaw ã«å®éã® CLI ã¢ãžã¥ãŒã«ãé
å»¶èªã¿èŸŒã¿ããããå Žåã¯ã
descriptorsã䜿ã - ãããã®èšè¿°åããã¬ãžã¹ãã©ã«ãã£ãŠå ¬éããããã¹ãŠã®ãããã¬ãã«ã³ãã³ãã«ãŒããç¶²çŸ ããŠããããšã確èªãã
- èšè¿°åã®ã³ãã³ãåã¯ãæåãæ°åããã€ãã³ãã¢ã³ããŒã¹ã³ã¢ã«éå®ããæåãŸãã¯æ°åã§å§ãããOpenClaw ã¯ãã®åœ¢ã«åããªãèšè¿°ååãæåŠãããã«ããæç»ããåã«èª¬æãã端æ«å¶åŸ¡ã·ãŒã±ã³ã¹ãåãé€ã
- åã®ãããªäºæãã¹ã§ã®ã¿ã
commandsåç¬ã䜿ã
Plugin ã®åœ¢ç¶
OpenClaw ã¯ãèªã¿èŸŒãŸãã Plugin ãç»é²åäœã«ãã£ãŠåé¡ããŸãã
| åœ¢ç¶ | 説æ |
|---|---|
| plain-capability | 1 çš®é¡ã®æ©èœã¿ã€ãïŒäŸ: ãããã€ããŒã®ã¿ïŒ |
| hybrid-capability | è€æ°ã®æ©èœã¿ã€ãïŒäŸ: ãããã€ã㌠+ é³å£°ïŒ |
| hook-only | ããã¯ã®ã¿ãæ©èœãªã |
| non-capability | ããŒã«/ã³ãã³ã/ãµãŒãã¹ã¯ãããæ©èœãªã |
Plugin ã®åœ¢ç¶ã確èªããã«ã¯ãopenclaw plugins inspect <id> ã䜿ããŸãã
é¢é£
- SDK æŠèŠ - ç»é² API ãšãµããã¹ãªãã¡ã¬ã³ã¹
- ã©ã³ã¿ã€ã ãã«ã㌠-
api.runtimeãšcreatePluginRuntimeStore - ã»ããã¢ãããšèšå® - ãããã§ã¹ããã»ããã¢ãããšã³ããªãé å»¶èªã¿èŸŒã¿
- ãã£ãã« Plugin -
ChannelPluginãªããžã§ã¯ãã®æ§ç¯ - ãããã€ã㌠Plugin - ãããã€ããŒç»é²ãšããã¯