Building plugins
Plugin बनाना
Plugins, core को बदले बिना OpenClaw का विस्तार करते हैं। कोई Plugin मैसेजिंग चैनल, मॉडल प्रदाता, स्थानीय CLI बैकएंड, एजेंट टूल, हुक, मीडिया प्रदाता, या Plugin के स्वामित्व वाली कोई अन्य क्षमता जोड़ सकता है।
आपको OpenClaw रिपॉज़िटरी में कोई बाहरी Plugin जोड़ने की आवश्यकता नहीं है। पैकेज को ClawHub पर प्रकाशित करें और उपयोगकर्ता इसे इस कमांड से इंस्टॉल करते हैं:
openclaw plugins install clawhub:<package-name>लॉन्च बदलाव के दौरान साधारण पैकेज विनिर्देश अब भी npm से इंस्टॉल होते हैं। जब आप
ClawHub रिज़ॉल्यूशन चाहते हैं, तब clawhub: प्रीफ़िक्स का उपयोग करें।
आवश्यकताएँ
- Node 22.22.3+, Node 24.15+, या Node 25.9+, और
npmयाpnpm। - TypeScript ESM मॉड्यूल।
- रिपॉज़िटरी में बंडल किए गए Plugin पर काम करने के लिए, रिपॉज़िटरी क्लोन करें और
pnpm installचलाएँ। स्रोत चेकआउट में Plugin विकास केवल pnpm से होता है, क्योंकि OpenClawextensions/*वर्कस्पेस पैकेजों से बंडल किए गए Plugins खोजता है।
Plugin का स्वरूप चुनें
OpenClaw को किसी मैसेजिंग प्लेटफ़ॉर्म से जोड़ें।
मॉडल, मीडिया, खोज, फ़ेच, वाक् या रीयलटाइम प्रदाता जोड़ें।
OpenClaw मॉडल फ़ॉलबैक के माध्यम से स्थानीय AI CLI चलाएँ।
एजेंट टूल पंजीकृत करें।
त्वरित शुरुआत
एक आवश्यक एजेंट टूल पंजीकृत करके न्यूनतम टूल Plugin बनाएँ। यह सबसे छोटा उपयोगी Plugin स्वरूप है और पैकेज, मैनिफ़ेस्ट, प्रवेश बिंदु और स्थानीय प्रमाण को समाहित करता है।
पैकेज मेटाडेटा बनाएँ
{"name": "@myorg/openclaw-my-plugin","version": "1.0.0","type": "module","dependencies": {"typebox": "1.1.39"},"peerDependencies": {"openclaw": ">=2026.3.24-beta.2"},"openclaw": {"extensions": ["./index.ts"],"compat": {"pluginApi": ">=2026.3.24-beta.2","minGatewayVersion": "2026.3.24-beta.2"},"build": {"openclawVersion": "2026.3.24-beta.2","pluginSdkVersion": "2026.3.24-beta.2"}}}{"id": "my-plugin","name": "My Plugin","description": "Adds a custom tool to OpenClaw","contracts": {"tools": ["my_tool"]},"activation": {"onStartup": true},"configSchema": {"type": "object","additionalProperties": false}}प्रकाशित बाहरी Plugins को रनटाइम प्रविष्टियाँ निर्मित JavaScript फ़ाइलों की ओर निर्देशित करनी चाहिए। प्रवेश बिंदु के पूर्ण अनुबंध के लिए SDK प्रवेश बिंदु देखें।
प्रत्येक Plugin को मैनिफ़ेस्ट चाहिए, भले ही कोई कॉन्फ़िगरेशन न हो। रनटाइम टूल
contracts.tools में होने चाहिए, ताकि OpenClaw प्रत्येक Plugin रनटाइम को
उत्सुकतापूर्वक लोड किए बिना स्वामित्व खोज सके। activation.onStartup
सोच-समझकर सेट करें; यह उदाहरण Gateway के प्रारंभ होने पर लोड होता है।
होस्ट-विश्वसनीय Plugin सतहें भी मैनिफ़ेस्ट-गेटेड होती हैं और इंस्टॉल किए गए
Plugins के लिए स्पष्ट घोषणा आवश्यक होती है: api.registerAgentToolResultMiddleware(...)
को प्रत्येक लक्ष्य रनटाइम contracts.agentToolResultMiddleware में सूचीबद्ध चाहिए,
और api.registerTrustedToolPolicy(...) को प्रत्येक नीति आईडी
contracts.trustedToolPolicies में चाहिए। ये घोषणाएँ इंस्टॉल-समय के
निरीक्षण और रनटाइम पंजीकरण को समन्वित रखती हैं।
प्रत्येक मैनिफ़ेस्ट फ़ील्ड के लिए Plugin मैनिफ़ेस्ट देखें।
टूल पंजीकृत करें
import { Type } from "typebox";import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; export default definePluginEntry({ id: "my-plugin", name: "My Plugin", description: "Adds a custom tool to OpenClaw", register(api) { api.registerTool({ name: "my_tool", description: "Echo one input value", parameters: Type.Object({ input: Type.String() }), outputSchema: Type.Object( { input: Type.String() }, { additionalProperties: false }, ), async execute(_id, params) { const details = { input: params.input }; return { content: [{ type: "text", text: `Got: ${params.input}` }], details, }; }, }); },});गैर-चैनल Plugins के लिए definePluginEntry का उपयोग करें। इसके बजाय चैनल Plugins
openclaw/plugin-sdk/core से defineChannelPluginEntry का उपयोग करते हैं।
रनटाइम का परीक्षण करें
इंस्टॉल किए गए या बाहरी Plugin के लिए, लोड किए गए रनटाइम का निरीक्षण करें:
openclaw plugins inspect my-plugin --runtime --jsonयदि Plugin कोई CLI कमांड पंजीकृत करता है, तो वह कमांड भी चलाएँ और आउटपुट
की पुष्टि करें, उदाहरण के लिए openclaw demo-plugin ping।
इस रिपॉज़िटरी में बंडल किए गए Plugin के लिए, OpenClaw extensions/*
वर्कस्पेस से स्रोत-चेकआउट Plugin पैकेज खोजता है। निकटतम लक्षित
परीक्षण चलाएँ:
pnpm test extensions/my-plugin/pnpm checkपैकेज इंस्टॉल का परीक्षण करें
पैकेज के रूप में तैयार Plugin प्रकाशित करने से पहले, उसी इंस्टॉल स्वरूप का परीक्षण करें
जो उपयोगकर्ताओं को मिलेगा। पहले एक बिल्ड चरण जोड़ें, openclaw.extensions
जैसी रनटाइम प्रविष्टियों को ./dist/index.js जैसे निर्मित JavaScript की ओर निर्देशित करें, और
सुनिश्चित करें कि npm pack में वह dist/ आउटपुट शामिल है। TypeScript स्रोत प्रविष्टियाँ
केवल स्रोत चेकआउट और स्थानीय विकास पथों के लिए हैं।
फिर Plugin पैक करें और npm-pack: के साथ टारबॉल इंस्टॉल करें:
npm pack --pack-destination /tmpopenclaw plugins install npm-pack:/tmp/<plugin-package>.tgz --forceopenclaw plugins inspect my-plugin --runtime --jsonnpm-pack: OpenClaw के प्रबंधित प्रति-Plugin npm प्रोजेक्ट का उपयोग करता है, इसलिए यह
रनटाइम निर्भरता की उन गलतियों को पकड़ता है जिन्हें स्रोत चेकआउट परीक्षण छिपा सकता है। यह
पैकेज और निर्भरता के स्वरूप को प्रमाणित करता है, कैटलॉग से जुड़ा आधिकारिक विश्वास नहीं।
रनटाइम इम्पोर्ट dependencies या optionalDependencies में होने चाहिए;
केवल devDependencies में छोड़ी गई निर्भरताएँ प्रबंधित रनटाइम
प्रोजेक्ट के लिए इंस्टॉल नहीं होंगी।
आधिकारिक या विशेषाधिकार-प्राप्त Plugin व्यवहार के अंतिम प्रमाण के रूप में कच्चे आर्काइव/पथ इंस्टॉल का उपयोग न करें। कच्चे स्रोत स्थानीय डीबगिंग के लिए उपयोगी हैं, लेकिन वे npm या ClawHub इंस्टॉल के समान निर्भरता पथ प्रमाणित नहीं करते। यदि आपका Plugin विश्वसनीय आधिकारिक Plugin स्थिति पर निर्भर करता है, तो कैटलॉग-समर्थित आधिकारिक इंस्टॉल या आधिकारिक विश्वास दर्ज करने वाले प्रकाशित पैकेज पथ के माध्यम से दूसरा प्रमाण जोड़ें। इंस्टॉल-रूट और निर्भरता स्वामित्व के विवरण के लिए Plugin निर्भरता रिज़ॉल्यूशन देखें।
प्रकाशित करें
प्रकाशित करने से पहले पैकेज को सत्यापित करें:
clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-pluginप्रामाणिक ClawHub पैकेज स्निपेट docs/snippets/plugin-publish/ में रहते हैं।
इंस्टॉल करें
प्रकाशित पैकेज को ClawHub के माध्यम से इंस्टॉल करें:
openclaw plugins install clawhub:your-org/your-pluginटूल पंजीकृत करना
टूल आवश्यक या वैकल्पिक हो सकते हैं। Plugin सक्षम होने पर आवश्यक टूल हमेशा उपलब्ध रहते हैं। OpenClaw द्वारा स्वामी Plugin रनटाइम लोड किए जाने से पहले वैकल्पिक टूल के लिए उपयोगकर्ता की स्पष्ट सहमति आवश्यक होती है।
टूल फ़ैक्टरियों को विश्वसनीय रनटाइम संदर्भ मिलता है, जिसमें deliveryContext,
उपलब्ध होने पर सक्रिय प्लेटफ़ॉर्म वार्तालाप के लिए nativeChannelId, और
requesterSenderId शामिल हैं।
register(api) { api.registerTool( { name: "workflow_tool", description: "Run a workflow", parameters: Type.Object({ pipeline: Type.String() }), outputSchema: Type.Object( { pipeline: Type.String() }, { additionalProperties: false }, ), async execute(_id, params) { return { content: [{ type: "text", text: params.pipeline }], details: { pipeline: params.pipeline }, }; }, }, { optional: true }, );}outputSchema वैकल्पिक है। यह कोड मोड और
टूल खोज द्वारा उपयोग किए जाने वाले संरचित details मान का वर्णन करता है। कैटलॉग
कॉल निष्पादन से पहले अमान्य स्कीमा अस्वीकार करते हैं और टूल हुक के बाद अंतिम मान
को सत्यापित करते हैं। स्थिर JSON परिणाम के बिना टूल के लिए इसे छोड़ दें। पूर्ण अनुबंध के लिए
टूल Plugins देखें।
api.registerTool(...) के साथ पंजीकृत प्रत्येक टूल को Plugin मैनिफ़ेस्ट में भी
घोषित करना आवश्यक है:
{ "contracts": { "tools": ["workflow_tool"] }, "toolMetadata": { "workflow_tool": { "optional": true } }}उपयोगकर्ता tools.allow के साथ सहमति देते हैं:
{ tools: { allow: ["workflow_tool"] }, // or ["my-plugin"] for every tool from one plugin}वैकल्पिक टूल नियंत्रित करते हैं कि कोई टूल मॉडल के समक्ष प्रस्तुत किया जाए या नहीं। जब मॉडल द्वारा टूल या हुक चुने जाने के बाद और कार्रवाई चलने से पहले अनुमोदन माँगा जाना चाहिए, तब Plugin अनुमति अनुरोधों का उपयोग करें।
साइड इफ़ेक्ट, असामान्य बाइनरी या ऐसी क्षमताओं के लिए वैकल्पिक टूल का उपयोग करें
जिन्हें डिफ़ॉल्ट रूप से प्रस्तुत नहीं किया जाना चाहिए। टूल नाम core टूल नामों से
टकराने नहीं चाहिए; टकराव छोड़ दिए जाते हैं और Plugin डायग्नोस्टिक्स में रिपोर्ट होते हैं। विकृत
पंजीकरण भी इसी तरह छोड़ दिए और रिपोर्ट किए जाते हैं: अनुपस्थित गैर-रिक्त
name, गैर-फ़ंक्शन execute, या parameters
ऑब्जेक्ट के बिना टूल डिस्क्रिप्टर।
टूल फ़ैक्टरियों को रनटाइम द्वारा दिया गया संदर्भ ऑब्जेक्ट मिलता है। जब किसी टूल को वर्तमान
टर्न के सक्रिय मॉडल के अनुसार लॉग, प्रदर्शन या अनुकूलन करना हो, तब ctx.activeModel
का उपयोग करें; इसमें provider, modelId, और modelRef शामिल हो सकते हैं। इसे
सूचनात्मक रनटाइम मेटाडेटा मानें, स्थानीय ऑपरेटर, इंस्टॉल किए गए Plugin कोड या
संशोधित OpenClaw रनटाइम के विरुद्ध सुरक्षा सीमा नहीं। संवेदनशील स्थानीय टूल के लिए
अब भी स्पष्ट Plugin या ऑपरेटर सहमति आवश्यक होनी चाहिए और सक्रिय-मॉडल मेटाडेटा
अनुपस्थित या अनुपयुक्त होने पर उन्हें सुरक्षित रूप से विफल होना चाहिए।
मैनिफ़ेस्ट स्वामित्व और खोज घोषित करता है; निष्पादन फिर भी लाइव पंजीकृत टूल
कार्यान्वयन को कॉल करता है। toolMetadata.<tool>.optional: true को
api.registerTool(..., { optional: true }) के साथ समन्वित रखें, ताकि OpenClaw उस Plugin रनटाइम को
तब तक लोड न करे जब तक टूल को स्पष्ट रूप से अनुमत सूची में न जोड़ा जाए।
इम्पोर्ट परंपराएँ
केंद्रित SDK उपपथों से इम्पोर्ट करें:
अपने Plugin पैकेज के भीतर, आंतरिक इम्पोर्ट के लिए api.ts और
runtime-api.ts जैसी स्थानीय बैरल फ़ाइलों का उपयोग करें। अपने ही Plugin को किसी
SDK पथ के माध्यम से इम्पोर्ट न करें। प्रदाता-विशिष्ट सहायक प्रदाता पैकेज में ही रहने चाहिए,
जब तक कि सीमा वास्तव में सामान्य न हो।
कस्टम Gateway RPC विधियाँ एक उन्नत प्रवेश बिंदु हैं। उन्हें
Plugin-विशिष्ट प्रीफ़िक्स पर रखें; config.*,
exec.approvals.*, operator.admin.*, wizard.*, और update.* जैसे core व्यवस्थापक नेमस्पेस आरक्षित
रहते हैं और operator.admin में रिज़ॉल्व होते हैं।
openclaw/plugin-sdk/gateway-method-runtime ब्रिज उन Plugin HTTP
रूट के लिए आरक्षित है जो contracts.gatewayMethodDispatch: ["authenticated-request"] घोषित करते हैं।
पूर्ण इम्पोर्ट मैप के लिए Plugin SDK अवलोकन देखें।
प्रस्तुति-पूर्व जाँच-सूची
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
package.json में सही openclaw मेटाडेटा है
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s openclaw.plugin.json मैनिफ़ेस्ट मौजूद और मान्य है OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
प्रवेश बिंदु defineChannelPluginEntry या definePluginEntry का उपयोग करता है
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
सभी इम्पोर्ट केंद्रित plugin-sdk/<subpath> पथों का उपयोग करते हैं
OPENCLAW_DOCS_MARKER:calloutClose: