defineToolPlugin, коли
plugin володіє фіксованим списком інструментів і ви хочете, щоб OpenClaw згенерував manifest
metadata, яка зберігає ці інструменти доступними для виявлення без завантаження runtime-коду.
Рекомендований процес:
- Створіть каркас пакета за допомогою
openclaw plugins init. - Напишіть інструменти з
defineToolPlugin. - Зберіть JavaScript.
- Згенеруйте metadata
openclaw.plugin.jsonіpackage.jsonза допомогоюopenclaw plugins build. - Перевірте згенеровану metadata перед публікацією або встановленням.
Вимоги
- Node >= 22.
- Вивід пакета TypeScript ESM.
typeboxдля schemas конфігурації та параметрів інструментів.openclaw >=2026.5.17, перша версія OpenClaw, яка експортуєopenclaw/plugin-sdk/tool-plugin.- Корінь пакета, який може постачати
dist/,openclaw.plugin.jsonіpackage.json.
typebox під час runtime, тому тримайте typebox у
dependencies, а не лише в devDependencies.
Швидкий старт
Створіть новий пакет plugin:src/index.ts: вхідdefineToolPluginз інструментомecho.src/index.test.ts: невеликий тест metadata.tsconfig.json: вивід TypeScript NodeNext уdist/.package.json: scripts, runtime dependencies іopenclaw.extensions: ["./dist/index.js"].openclaw.plugin.json: згенерована manifest metadata для початкового інструмента.
Напишіть інструмент
defineToolPlugin приймає ідентичність plugin, необов’язкову schema конфігурації та
статичний список інструментів. Типи параметрів і конфігурації виводяться зі schemas TypeBox.
Необов’язкові інструменти та factory-інструменти
Установітьoptional: true, коли користувачі мають явно додати інструмент до allowlist перед тим, як його
буде надіслано моделі:
openclaw plugins build записує відповідний запис manifest toolMetadata.<tool>.optional,
щоб OpenClaw міг виявити інструмент без завантаження runtime-коду plugin.
Використовуйте factory, коли інструменту потрібен runtime-контекст інструмента, перш ніж його можна
створити. Factory зберігає metadata статичною, водночас дозволяючи інструменту відмовитися для
конкретного запуску, перевірити стан sandbox або прив’язати runtime helpers.
definePluginEntry напряму, коли
plugin обчислює назви інструментів динамічно або поєднує інструменти з hooks,
сервісами, постачальниками, командами чи іншими runtime-поверхнями.
Значення повернення
defineToolPlugin обгортає звичайні значення повернення у формат tool-result OpenClaw:
- Поверніть рядок, коли модель має побачити саме цей текст.
- Поверніть JSON-сумісне значення, коли ви хочете, щоб модель побачила відформатований JSON,
а OpenClaw зберіг початкове значення в
details.
AgentToolResult або повторно використати
наявну реалізацію api.registerTool. Використовуйте definePluginEntry замість
defineToolPlugin, коли потрібні повністю динамічні інструменти або змішані можливості plugin.
Конфігурація
configSchema є необов’язковою. Якщо ви її пропустите, OpenClaw використає сувору schema порожнього об’єкта,
а згенерований manifest усе одно міститиме configSchema.
configSchema, другий аргумент execute типізується зі
schema:
Згенерована metadata
OpenClaw виявляє встановлені plugin-и з cold metadata. Він має бути здатен прочитати manifest plugin перед імпортом runtime-коду plugin. ТомуdefineToolPlugin
надає статичну metadata, а openclaw plugins build записує цю
metadata у пакет.
Запускайте генератор після зміни id, name, description, config schema,
activation або назв інструментів plugin:
contracts.tools є важливим контрактом виявлення. Він повідомляє OpenClaw, який
plugin володіє кожним інструментом, без завантаження runtime кожного встановленого plugin. Якщо
manifest застарів, інструмент може бути відсутній у виявленні або за помилку реєстрації
може бути помилково звинувачено не той plugin.
Metadata пакета
Для простого процесу tool-pluginopenclaw plugins build узгоджує
package.json з вибраним єдиним runtime-входом:
./dist/index.js, для встановлених пакетів. Source
entries корисні під час розробки в workspace, але опубліковані пакети не повинні
залежати від runtime-завантаження TypeScript.
Перевірка в CI
Використовуйтеplugins build --check, щоб CI падав, коли згенерована metadata застаріла, без
перезапису файлів:
plugins validate перевіряє, що:
openclaw.plugin.jsonіснує та проходить звичайний manifest loader.- Поточний entry експортує metadata
defineToolPlugin. - Згенеровані поля manifest збігаються з entry metadata.
contracts.toolsзбігається з оголошеними назвами інструментів.package.jsonспрямовуєopenclaw.extensionsна вибраний runtime entry.
Локальне встановлення та перевірка
З окремого checkout OpenClaw або встановленого CLI встановіть шлях пакета:Публікація
Публікуйте через ClawHub, коли пакет готовий:Усунення несправностей
plugin entry not found: ./dist/index.js
Вибраний entry file не існує. Запустіть npm run build, потім повторно запустіть
openclaw plugins build --entry ./dist/index.js або
openclaw plugins validate --entry ./dist/index.js.
plugin entry does not expose defineToolPlugin metadata
Entry не експортував значення, створене defineToolPlugin. Перевірте, що
default export модуля є результатом defineToolPlugin(...), або передайте правильний
entry за допомогою --entry.
openclaw.plugin.json generated metadata is stale
Manifest більше не збігається з entry metadata. Запустіть:
openclaw.plugin.json, і package.json.
package.json openclaw.extensions must include ./dist/index.js
Metadata пакета вказує на інший runtime entry. Запустіть
openclaw plugins build --entry ./dist/index.js, щоб генератор узгодив
metadata пакета з entry, який ви маєте намір постачати.
Cannot find package 'typebox'
Зібраний plugin імпортує typebox під час runtime. Тримайте typebox у
dependencies, перевстановіть залежності пакета, перебудуйте та повторно запустіть перевірку.
Інструмент не з’являється після встановлення
Перевірте це по черзі:openclaw plugins inspect <plugin-id> --runtimeopenclaw plugins validate --root <plugin-root> --entry ./dist/index.jsopenclaw.plugin.jsonмаєcontracts.toolsз очікуваними назвами інструментів.package.jsonмаєopenclaw.extensions: ["./dist/index.js"].- Gateway було перезапущено або перезавантажено після встановлення plugin.