defineToolPlugin, когда
плагин владеет фиксированным списком инструментов и вы хотите, чтобы OpenClaw сгенерировал
метаданные манифеста, которые сохраняют эти инструменты доступными для обнаружения без загрузки runtime-кода.
Рекомендуемый процесс:
- Создайте каркас пакета с помощью
openclaw plugins init. - Напишите инструменты с
defineToolPlugin. - Соберите JavaScript.
- Сгенерируйте метаданные
openclaw.plugin.jsonиpackage.jsonс помощьюopenclaw plugins build. - Проверьте сгенерированные метаданные перед публикацией или установкой.
Требования
- Node >= 22.
- Вывод пакета TypeScript ESM.
typeboxдля схем конфигурации и параметров инструментов.openclaw >=2026.5.17, первая версия OpenClaw, которая экспортируетopenclaw/plugin-sdk/tool-plugin.- Корень пакета, который может поставлять
dist/,openclaw.plugin.jsonиpackage.json.
typebox во время выполнения, поэтому держите typebox в
dependencies, а не только в devDependencies.
Быстрый старт
Создайте новый пакет плагина:src/index.ts: entrydefineToolPluginс инструментомecho.src/index.test.ts: небольшой тест метаданных.tsconfig.json: вывод TypeScript NodeNext вdist/.package.json: скрипты, runtime-зависимости иopenclaw.extensions: ["./dist/index.js"].openclaw.plugin.json: сгенерированные метаданные манифеста для начального инструмента.
Написание инструмента
defineToolPlugin принимает идентификацию плагина, необязательную схему конфигурации и
статический список инструментов. Типы параметров и конфигурации выводятся из схем TypeBox.
Необязательные и фабричные инструменты
Установитеoptional: true, когда пользователи должны явно добавить инструмент в allowlist, прежде чем он
будет отправлен модели:
openclaw plugins build записывает соответствующую запись манифеста toolMetadata.<tool>.optional,
чтобы OpenClaw мог обнаружить инструмент без загрузки runtime-кода плагина.
Используйте factory, когда инструменту нужен runtime-контекст инструмента, прежде чем его можно будет
создать. Фабрика сохраняет метаданные статическими, позволяя инструменту отказаться от конкретного запуска,
проверить состояние sandbox или привязать runtime-помощники.
definePluginEntry напрямую, когда
плагин вычисляет имена инструментов динамически или объединяет инструменты с hook,
сервисами, поставщиками, командами или другими runtime-поверхностями.
Возвращаемые значения
defineToolPlugin оборачивает простые возвращаемые значения в формат результата инструмента OpenClaw:
- Верните строку, когда модель должна увидеть именно этот текст.
- Верните JSON-совместимое значение, когда вы хотите, чтобы модель увидела форматированный JSON,
а OpenClaw сохранил исходное значение в
details.
AgentToolResult или повторно использовать
существующую реализацию api.registerTool. Используйте definePluginEntry вместо
defineToolPlugin, когда вам нужны полностью динамические инструменты или смешанные возможности
плагина.
Конфигурация
configSchema необязательна. Если вы ее опустите, OpenClaw использует строгую схему пустого объекта,
и сгенерированный манифест все равно будет включать configSchema.
configSchema, второй аргумент execute типизируется на основе
схемы:
Сгенерированные метаданные
OpenClaw обнаруживает установленные плагины по холодным метаданным. Он должен уметь читать манифест плагина до импорта runtime-кода плагина. ПоэтомуdefineToolPlugin
предоставляет статические метаданные, а openclaw plugins build записывает эти
метаданные в пакет.
Запускайте генератор после изменения id, имени, описания, схемы конфигурации,
активации или имен инструментов плагина:
contracts.tools — важный контракт обнаружения. Он сообщает OpenClaw, какой
плагин владеет каждым инструментом, без загрузки runtime-кода каждого установленного плагина. Если
манифест устарел, инструмент может отсутствовать при обнаружении или неправильный плагин
может быть указан как причина ошибки регистрации.
Метаданные пакета
Для простого процесса tool-pluginopenclaw plugins build выравнивает
package.json с выбранной единственной runtime-точкой входа:
./dist/index.js, для установленных пакетов. Исходные
entry полезны при разработке в workspace, но опубликованные пакеты не должны
зависеть от runtime-загрузки TypeScript.
Проверка в CI
Используйтеplugins build --check, чтобы CI падал, когда сгенерированные метаданные устарели, без
перезаписи файлов:
plugins validate проверяет, что:
openclaw.plugin.jsonсуществует и проходит обычный загрузчик манифеста.- Текущая entry экспортирует метаданные
defineToolPlugin. - Сгенерированные поля манифеста соответствуют метаданным entry.
contracts.toolsсоответствует объявленным именам инструментов.package.jsonуказываетopenclaw.extensionsна выбранную runtime-entry.
Локальная установка и проверка
Из отдельного checkout OpenClaw или установленного CLI установите путь пакета:Публикация
Публикуйте через ClawHub, когда пакет готов:Устранение неполадок
plugin entry not found: ./dist/index.js
Выбранный entry-файл не существует. Запустите 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
Манифест больше не соответствует метаданным entry. Запустите:
openclaw.plugin.json, так и package.json.
package.json openclaw.extensions must include ./dist/index.js
Метаданные пакета указывают на другую runtime-entry. Запустите
openclaw plugins build --entry ./dist/index.js, чтобы генератор выровнял
метаданные пакета с entry, которую вы собираетесь поставлять.
Cannot find package 'typebox'
Собранный плагин импортирует typebox во время выполнения. Держите typebox в
dependencies, переустановите зависимости пакета, пересоберите и повторно выполните проверку.
Инструмент не появляется после установки
Проверьте следующее по порядку:openclaw plugins inspect <plugin-id> --runtimeopenclaw plugins validate --root <plugin-root> --entry ./dist/index.js- В
openclaw.plugin.jsonестьcontracts.toolsс ожидаемыми именами инструментов. - В
package.jsonестьopenclaw.extensions: ["./dist/index.js"]. - Gateway был перезапущен или перезагружен после установки плагина.