Plugin SDK reference
Точки входу Plugin
Кожен plugin експортує об’єкт запису за замовчуванням. SDK надає допоміжну функцію для
кожної форми запису: defineToolPlugin, definePluginEntry,
defineChannelPluginEntry, defineSetupPluginEntry.
Записи пакета
Установлені plugins спрямовують поля package.json openclaw як на вихідні, так і на
зібрані записи:
{ "openclaw": { "extensions": ["./src/index.ts"], "runtimeExtensions": ["./dist/index.js"], "setupEntry": "./src/setup-entry.ts", "runtimeSetupEntry": "./dist/setup-entry.js" }}extensionsіsetupEntry— це вихідні записи, які використовуються для розробки в робочому просторі та в отриманій копії git.runtimeExtensionsіruntimeSetupEntryє пріоритетними для встановлених пакетів: завдяки їм npm-пакети можуть не виконувати компіляцію TypeScript під час виконання.runtimeExtensions, якщо наявний, має відповідатиextensionsза довжиною масиву (записи утворюють пари за позиціями).runtimeSetupEntryпотребуєsetupEntry.- Якщо артефакт
runtimeExtensions/runtimeSetupEntryоголошено, але він відсутній, установлення/виявлення завершується помилкою пакування; OpenClaw не переходить неявно до вихідного коду. Перехід до вихідного коду (нижче) застосовується лише тоді, коли запис середовища виконання взагалі не оголошено. - Якщо встановлений пакет оголошує лише вихідний запис TypeScript, OpenClaw
шукає відповідний зібраний парний файл
dist/*.js(або.mjs/.cjs) і використовує його; інакше він переходить до вихідного коду TypeScript. - Усі шляхи записів мають залишатися в каталозі пакета plugin. Записи
середовища виконання та виведені парні зібрані JS-файли не роблять чинним шлях вихідного коду
extensionsабоsetupEntry, що виходить за межі каталогу.
defineToolPlugin
Імпорт: openclaw/plugin-sdk/tool-plugin
Для plugins, які лише додають інструменти агента. Зберігає вихідний код компактним, виводить типи
конфігурації та параметрів інструментів зі схем TypeBox, обгортає звичайні повернені значення у
формат результатів інструментів OpenClaw та надає статичні метадані, які
openclaw plugins build записує в маніфест plugin (contracts.tools,
configSchema).
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є необов’язковим; якщо його пропустити, використовується строга схема порожнього об’єкта (згенерований маніфест усе одно міститьconfigSchema).executeповертає звичайний рядок або значення, яке можна серіалізувати в JSON; допоміжна функція обгортає його як текстовий результат інструмента зdetails, установленим у початкове (не перетворене на рядок) повернене значення.- Для власних результатів інструментів
openclaw/plugin-sdk/tool-resultsекспортуєtextResultіjsonResult. - Назви інструментів статичні, тому
openclaw plugins buildвиводитьcontracts.toolsз оголошених інструментів без ручного дублювання назв. - Завантаження середовища виконання залишається строгим: установленим plugins усе одно потрібні
openclaw.plugin.jsonіpackage.jsonopenclaw.extensions. OpenClaw ніколи не виконує код plugin, щоб вивести відсутні дані маніфесту.
definePluginEntry
Імпорт: openclaw/plugin-sdk/plugin-entry
Для plugins провайдерів, розширених plugins інструментів, plugins перехоплень і всього, що не є каналом обміну повідомленнями.
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 |
Ні | Схема порожнього об’єкта |
reload |
OpenClawPluginReloadRegistration |
Ні | - |
nodeHostCommands |
OpenClawPluginNodeHostCommand[] |
Ні | - |
securityAuditCollectors |
OpenClawPluginSecurityAuditCollector[] |
Ні | - |
register |
(api: OpenClawPluginApi) => void |
Так | - |
idмає відповідати вашому маніфестуopenclaw.plugin.json.- Зовнішні каталоги сеансів використовують
openclaw/plugin-sdk/session-catalogіapi.registerSessionCatalog({ id, label, list, read, continueSession?, archive? }). Ядро володіє методами Gatewaysessions.catalog.*; провайдери повертають проєкції хоста, сеансу та нормалізованого транскрипту без реєстрації RPC. kindзастаріло: натомість оголосіть ексклюзивний слот ("memory"або"context-engine") у поліkindманіфестуopenclaw.plugin.json.kindзапису середовища виконання залишається лише як сумісний резервний варіант для старіших plugins.configSchemaможе бути функцією для лінивого обчислення. OpenClaw розв’язує та мемоізує схему під час першого доступу, тому ресурсомісткі побудовники схем виконуються лише один раз.- Дескриптор
nodeHostCommandsможе визначатиisAvailable({ config, env }). Поверненняfalseвилучає цю команду та її можливість з оголошення Gateway безголового вузла. 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виконується в кожному режимі, крім"cli-metadata"і"tool-discovery". Зберігайте тут посилання на середовище виконання, зазвичай черезcreatePluginRuntimeStore.registerCliMetadataвиконується для"cli-metadata","discovery"і"full". Використовуйте його як канонічне місце для дескрипторів CLI, якими володіє канал, щоб коренева довідка не спричиняла активації, знімки виявлення містили статичні метадані команд, а звичайна реєстрація CLI залишалася сумісною з повним завантаженням plugin.registerFullвиконується лише для"full"і"tool-discovery". Для"tool-discovery"він виконується замість реєстрації каналу: OpenClaw повністю пропускаєregisterChannel/setRuntimeі викликає лишеregisterFull, тому будь-яка реєстрація провайдера/інструмента, потрібна вашому каналу для автономного виявлення чи виконання інструментів, має міститися там, а не за звичайним налаштуванням каналу.- Реєстрація виявлення не спричиняє активації, але не виконується без імпорту: OpenClaw може
обчислити довірений запис plugin і модуль plugin каналу, щоб побудувати
знімок. Імпорти верхнього рівня не повинні мати побічних ефектів, а сокети,
клієнти, воркери та служби слід розміщувати лише в шляхах
"full". - Як і
definePluginEntry,configSchemaможе бути лінивою фабрикою; OpenClaw мемоізує розв’язану схему під час першого доступу.
Реєстрація CLI:
- Використовуйте
api.registerCli(..., { descriptors: [...] })для кореневих команд CLI, якими володіє plugin і які потрібно завантажувати ліниво без зникнення з кореневого дерева синтаксичного аналізу CLI. Назви дескрипторів мають складатися з літер, цифр, дефісів і підкреслень та починатися з літери або цифри; OpenClaw відхиляє інші форми й вилучає керівні послідовності термінала з описів перед відтворенням довідки. Охопіть кожен корінь команди верхнього рівня, який надає реєстратор. Лишеcommandsзалишається на шляху сумісності з негайним завантаженням. - Використовуйте
api.registerNodeCliFeature(...)для команд функцій спареного вузла, щоб вони розміщувалися підopenclaw nodes(еквівалентregisterCli(registrar, { parentPath: ["nodes"], ... })). - Для інших вкладених команд plugin додайте
parentPathі реєструйте команди в об’єктіprogram, переданому реєстратору; OpenClaw розв’язує його до батьківської команди перед викликом plugin. - Для plugins каналів реєструйте дескриптори CLI з
registerCliMetadataі зосередьтеregisterFullлише на роботі середовища виконання. - Якщо
registerFullтакож реєструє методи RPC Gateway, використовуйте для них префікс, специфічний для plugin. Зарезервовані простори назв адміністрування ядра (config.*,exec.approvals.*,wizard.*,update.*) завжди примусово перетворюються наoperator.admin.
defineSetupPluginEntry
Імпорт: openclaw/plugin-sdk/channel-core
Для полегшеного файлу setup-entry.ts. Повертає лише { plugin } без
підключення середовища виконання або CLI.
export default defineSetupPluginEntry(myChannelPlugin);OpenClaw завантажує це замість повної точки входу, коли канал вимкнено, не налаштовано або ввімкнено відкладене завантаження. Відомості про те, коли це має значення, див. у розділі Налаштування та конфігурація.
Поєднуйте defineSetupPluginEntry(...) з вузькоспеціалізованими сімействами допоміжних засобів налаштування:
| Імпорт | Призначення |
|---|---|
openclaw/plugin-sdk/setup-runtime |
Безпечні для середовища виконання допоміжні засоби налаштування: createSetupTranslator, безпечні для імпорту адаптери виправлень налаштування, виведення приміток пошуку, promptResolvedAllowFrom, splitSetupEntries, делеговані проксі налаштування |
openclaw/plugin-sdk/channel-setup |
Поверхні налаштування необов’язкового встановлення |
openclaw/plugin-sdk/setup-tools |
Допоміжні засоби CLI, архіву й документації для налаштування та встановлення |
Зберігайте важкі SDK, реєстрацію CLI та довготривалі служби середовища виконання в повній точці входу.
Вбудовані канали робочого простору, які розділяють поверхні налаштування й середовища виконання, натомість можуть використовувати
defineBundledChannelSetupEntry(...) з
openclaw/plugin-sdk/channel-entry-contract. Це дає змогу точці входу
налаштування зберігати безпечні для налаштування експорти плагіна й секретів, водночас надаючи сеттер
середовища виконання:
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) => { /* безпечний для налаштування маршрут */ }, }); },});Використовуйте це лише тоді, коли процес налаштування справді потребує легкого сеттера середовища виконання або
безпечної для налаштування поверхні Gateway до завантаження повної точки входу каналу.
registerSetupRuntime виконується лише для завантажень "setup-runtime"; обмежуйте його
маршрутами або методами лише для конфігурації, які мають існувати до відкладеної
повної активації.
Режим реєстрації
api.registrationMode повідомляє плагіну, як його було завантажено:
| Режим | Коли | Що реєструвати |
|---|---|---|
"full" |
Звичайний запуск Gateway | Усе |
"discovery" |
Виявлення можливостей лише для читання | Реєстрація каналу та статичні дескриптори CLI; код точки входу може завантажуватися, але пропускайте сокети, воркери, клієнти та служби |
"tool-discovery" |
Обмежене завантаження для переліку або запуску інструментів певних плагінів | Лише реєстрація можливостей та інструментів; без активації каналу |
"setup-only" |
Вимкнений або неналаштований канал | Лише реєстрація каналу |
"setup-runtime" |
Процес налаштування з доступним середовищем виконання | Реєстрація каналу та лише легке середовище виконання, потрібне до завантаження повної точки входу |
"cli-metadata" |
Коренева довідка / захоплення метаданих CLI | Лише дескриптори CLI |
defineChannelPluginEntry обробляє це розділення автоматично. Якщо для каналу ви безпосередньо використовуєте
definePluginEntry, перевіряйте режим самостійно й пам’ятайте,
що "tool-discovery" пропускає реєстрацію каналу:
register(api) { if ( api.registrationMode === "cli-metadata" || api.registrationMode === "discovery" || api.registrationMode === "full" ) { api.registerCli(/* ... */); if (api.registrationMode === "cli-metadata") return; } if (api.registrationMode === "tool-discovery") { // Реєструйте лише поверхні можливостей (провайдери/інструменти), без каналу. return; } api.registerChannel({ plugin: myPlugin }); if (api.registrationMode !== "full") return; // Важкі реєстрації лише для середовища виконання api.registerService(/* ... */);}Довготривалі служби можуть надсилати невеликі події інвалідації або життєвого циклу через контекст своєї служби:
api.registerService({ id: "index-events", start(ctx) { ctx.gatewayEvents?.emit("changed", { revision: 1 }, { scope: "operator.read" }); },});OpenClaw додає до цього простір імен plugin.<plugin-id>.changed. Назви подій складаються з одного
сегмента в нижньому регістрі, корисне навантаження має бути обмеженим JSON, а область дії має бути
operator.read, operator.write або operator.admin. Емітер існує лише
протягом часу роботи служби та відкликається після зупинки або невдалого запуску. Надавайте перевагу
корисному навантаженню з версією чи інвалідацією, а не повним записам, щоб авторизовані клієнти повторно зчитували
канонічний стан через обмежені за областю дії методи Gateway плагіна.
Режим виявлення створює знімок реєстру без активації. Він усе ще може виконувати точку входу плагіна та об’єкт плагіна каналу, щоб OpenClaw міг зареєструвати можливості каналу й статичні дескриптори CLI. Вважайте виконання модуля в режимі виявлення довіреним, але легким: без мережевих клієнтів, підпроцесів, слухачів, з’єднань із базою даних, фонових воркерів, читання облікових даних або інших активних побічних ефектів середовища виконання на верхньому рівні.
Вважайте "setup-runtime" вікном, у якому поверхні запуску лише для налаштування мають
існувати без повторного входу до повного середовища виконання вбудованого каналу. Доречними є
реєстрація каналу, безпечні для налаштування HTTP-маршрути, безпечні для налаштування методи Gateway
та делеговані допоміжні засоби налаштування. Важкі фонові служби, реєстратори CLI та
ініціалізація SDK провайдерів і клієнтів усе ще належать до "full".
Форми плагінів
OpenClaw класифікує завантажені плагіни за їхньою поведінкою реєстрації:
| Форма | Опис |
|---|---|
| plain-capability | Один тип можливостей (наприклад, лише провайдер) |
| hybrid-capability | Кілька типів можливостей (наприклад, провайдер + мовлення) |
| hook-only | Лише хуки, без можливостей |
| non-capability | Інструменти/команди/служби, але без можливостей |
Щоб переглянути форму плагіна, використовуйте openclaw plugins inspect <id>.
Пов’язані матеріали
- Огляд SDK — API реєстрації та довідник підшляхів
- Допоміжні засоби середовища виконання —
api.runtimeіcreatePluginRuntimeStore - Налаштування та конфігурація — маніфест, точка входу налаштування, відкладене завантаження
- Плагіни каналів — створення об’єкта
ChannelPlugin - Плагіни провайдерів — реєстрація провайдерів і хуки