defineToolPlugin создаёт плагин, который добавляет только инструменты, вызываемые агентом: без
канала, поставщика моделей, обработчика, службы или серверной части настройки. Он создаёт
метаданные манифеста, необходимые OpenClaw для обнаружения инструментов без загрузки
кода среды выполнения плагина.
Для плагинов поставщиков, каналов, обработчиков, служб или плагинов со смешанными возможностями начните с
Создание плагинов, Плагины каналов
или Плагины поставщиков.
Требования
- Node 22.22.3+, Node 24.15+ или Node 25.9+.
- Выходной пакет TypeScript ESM.
typeboxвdependencies(не только вdevDependencies— созданный плагин импортирует его во время выполнения).openclaw >=2026.5.17— первая версия, экспортирующаяopenclaw/plugin-sdk/tool-plugin.- Корень пакета, содержащий
dist/,openclaw.plugin.jsonиpackage.json.
Быстрый старт
plugins init создаёт:
npm run plugin:build запускает npm run build (tsc), а затем
openclaw plugins build --entry ./dist/index.js. npm run plugin:validate
повторно выполняет сборку и запускает openclaw plugins validate --entry ./dist/index.js.
При успешной проверке выводится:
openclaw plugins init <id>:
Написание инструмента
defineToolPlugin принимает идентификационные данные плагина, необязательную схему конфигурации и
статический список инструментов. Типы параметров и конфигурации выводятся из
схем TypeBox.
Необязательные инструменты и фабрики инструментов
Задайтеoptional: true, если пользователи должны явно добавить инструмент в список разрешённых, прежде чем он
будет отправлен модели. openclaw plugins build записывает соответствующую
запись манифеста toolMetadata.<tool>.optional, поэтому OpenClaw может определить, что
инструмент является необязательным, без загрузки кода среды выполнения плагина.
factory, когда для создания инструмента требуется контекст инструмента среды выполнения —
чтобы отказаться от него для конкретного запуска, проверить состояние песочницы или привязать
вспомогательные функции среды выполнения. Метаданные остаются статическими, хотя конкретный инструмент создаётся
во время выполнения.
definePluginEntry
напрямую, когда плагин динамически вычисляет имена инструментов или объединяет инструменты
с обработчиками, службами, поставщиками или командами.
Возвращаемые значения
defineToolPlugin оборачивает обычные возвращаемые значения в формат результата инструмента
OpenClaw:
- Возвращайте строку, если модель должна увидеть именно этот текст.
- Возвращайте JSON-совместимое значение, если модель должна увидеть форматированный JSON,
а OpenClaw — сохранить исходное значение в
details.
AgentToolResult или необходимо повторно использовать
существующую реализацию api.registerTool.
Конфигурация
configSchema является необязательной. Если её опустить, OpenClaw применит строгую схему пустого объекта;
созданный манифест всё равно будет содержать configSchema.
configSchema тип второго аргумента execute выводится из неё:
Созданные метаданные
OpenClaw должен прочитать манифест плагина до импорта кода среды выполнения плагина.defineToolPlugin предоставляет для этого статические метаданные, а
openclaw plugins build записывает их в пакет. Повторно запускайте генератор после
изменения идентификатора, имени, описания, схемы конфигурации, активации или имён
инструментов плагина:
contracts.tools — важный контракт обнаружения: он сообщает OpenClaw, какому
плагину принадлежит каждый инструмент, без загрузки среды выполнения каждого установленного плагина. Из-за
устаревшего манифеста инструмент может отсутствовать при обнаружении либо ошибка регистрации
может быть ошибочно приписана другому плагину.
Метаданные пакета
openclaw plugins build также согласует package.json с выбранной точкой входа
среды выполнения:
./dist/index.js), а не точку входа исходного кода TypeScript.
Точки входа исходного кода работают только при локальной разработке в рабочей области.
Проверка в CI
plugins build --check завершается с ошибкой без перезаписи файлов, если созданные метаданные
устарели:
plugins validate проверяет следующее:
openclaw.plugin.jsonсуществует и проходит обычную загрузку манифеста.- Текущая точка входа экспортирует метаданные
defineToolPlugin. - Поля созданного манифеста соответствуют метаданным точки входа.
contracts.toolsсоответствует объявленным именам инструментов.package.jsonнаправляетopenclaw.extensionsна выбранную точку входа среды выполнения.
Локальная установка и проверка
Из отдельной копии OpenClaw или установленного CLI установите пакет по его пути:Публикация
Когда пакет будет готов, опубликуйте его через ClawHub.clawhub package publish
принимает источник: локальную папку, репозиторий GitHub (owner/repo[@ref]) или
URL tar-архива.
Устранение неполадок
plugin entry not found: ./dist/index.js
Выбранный файл точки входа не существует. Запустите npm run build, затем повторно запустите
openclaw plugins build --entry ./dist/index.js или
openclaw plugins validate --entry ./dist/index.js.
plugin entry does not expose defineToolPlugin metadata
Точка входа не экспортировала значение, созданное defineToolPlugin. Убедитесь, что
экспорт модуля по умолчанию является результатом defineToolPlugin(...), либо передайте
правильную точку входа с помощью --entry.
openclaw.plugin.json generated metadata is stale
Манифест больше не соответствует метаданным точки входа. Выполните:
openclaw.plugin.json, так и package.json.
package.json openclaw.extensions must include ./dist/index.js
Метаданные пакета указывают на другую точку входа среды выполнения. Запустите
openclaw plugins build --entry ./dist/index.js, чтобы генератор согласовал
метаданные пакета с точкой входа, которую вы намерены опубликовать.
Cannot find package 'typebox'
Собранный плагин импортирует 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 был перезапущен или перезагружен после установки плагина.