Перейти до основного вмісту

Documentation Index

Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt

Use this file to discover all available pages before exploring further.

Кожен plugin експортує типовий об’єкт входу. SDK надає три допоміжні засоби для їх створення. Для встановлених plugins package.json має спрямовувати завантаження runtime на зібраний JavaScript, коли він доступний:
{
  "openclaw": {
    "extensions": ["./src/index.ts"],
    "runtimeExtensions": ["./dist/index.js"],
    "setupEntry": "./src/setup-entry.ts",
    "runtimeSetupEntry": "./dist/setup-entry.js"
  }
}
extensions і setupEntry залишаються чинними вихідними точками входу для розробки в робочому просторі та git checkout. runtimeExtensions і runtimeSetupEntry є бажаними, коли OpenClaw завантажує встановлений пакет, і дають змогу npm-пакетам уникати runtime-компіляції TypeScript. Явні runtime-точки входу обов’язкові: runtimeSetupEntry вимагає setupEntry, а відсутні артефакти runtimeExtensions або runtimeSetupEntry спричиняють помилку встановлення/виявлення замість тихого повернення до вихідного коду. Якщо встановлений пакет оголошує лише вихідну точку входу TypeScript, OpenClaw використає відповідний зібраний peer dist/*.js, коли він існує, а потім повернеться до вихідного TypeScript. Усі шляхи входу мають залишатися всередині каталогу пакета plugin. Runtime-точки входу та виведені зібрані JavaScript peers не роблять вихідний шлях extensions або setupEntry, що виходить назовні, чинним.
Шукаєте покроковий огляд? Див. Channel Plugins або Provider Plugins для покрокових посібників.

definePluginEntry

Імпорт: openclaw/plugin-sdk/plugin-entry Для provider plugins, tool plugins, hook plugins і всього, що не є каналом обміну повідомленнями.
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";

export default definePluginEntry({
  id: "my-plugin",
  name: "My Plugin",
  description: "Short summary",
  register(api) {
    api.registerProvider({
      /* ... */
    });
    api.registerTool({
      /* ... */
    });
  },
});
ПолеТипОбов’язковоТипове значення
idstringТак-
namestringТак-
descriptionstringТак-
kindstringНі-
configSchemaOpenClawPluginConfigSchema | () => OpenClawPluginConfigSchemaНіСхема порожнього об’єкта
register(api: OpenClawPluginApi) => voidТак-
  • id має відповідати вашому маніфесту openclaw.plugin.json.
  • kind призначено для ексклюзивних слотів: "memory" або "context-engine".
  • configSchema може бути функцією для лінивого обчислення.
  • OpenClaw розв’язує та мемоізує цю схему під час першого доступу, тому дорогі побудовники схем виконуються лише один раз.

defineChannelPluginEntry

Імпорт: openclaw/plugin-sdk/channel-core Огортає definePluginEntry проводкою, специфічною для каналів. Автоматично викликає api.registerChannel({ plugin }), відкриває опційний seam метаданих CLI для root-help і обмежує registerFull режимом реєстрації.
import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";

export default defineChannelPluginEntry({
  id: "my-channel",
  name: "My Channel",
  description: "Short summary",
  plugin: myChannelPlugin,
  setRuntime: setMyRuntime,
  registerCliMetadata(api) {
    api.registerCli(/* ... */);
  },
  registerFull(api) {
    api.registerGatewayMethod(/* ... */);
  },
});
ПолеТипОбов’язковоТипове значення
idstringТак-
namestringТак-
descriptionstringТак-
pluginChannelPluginТак-
configSchemaOpenClawPluginConfigSchema | () => OpenClawPluginConfigSchemaНіСхема порожнього об’єкта
setRuntime(runtime: PluginRuntime) => voidНі-
registerCliMetadata(api: OpenClawPluginApi) => voidНі-
registerFull(api: OpenClawPluginApi) => voidНі-
  • setRuntime викликається під час реєстрації, щоб ви могли зберегти посилання на runtime (зазвичай через createPluginRuntimeStore). Він пропускається під час захоплення метаданих CLI.
  • registerCliMetadata виконується під час api.registrationMode === "cli-metadata", api.registrationMode === "discovery" і api.registrationMode === "full". Використовуйте його як канонічне місце для CLI-дескрипторів, якими володіє канал, щоб root help залишався неактивуючим, discovery-знімки містили статичні метадані команд, а звичайна реєстрація команд CLI залишалася сумісною з повним завантаженням plugin.
  • Реєстрація discovery є неактивуючою, але не вільною від імпорту. OpenClaw може обчислювати довірену точку входу plugin і модуль channel plugin для побудови знімка, тому тримайте імпорти верхнього рівня без побічних ефектів і розміщуйте сокети, клієнти, workers та сервіси за шляхами лише для "full".
  • registerFull виконується лише коли api.registrationMode === "full". Він пропускається під час setup-only завантаження.
  • Як і definePluginEntry, configSchema може бути лінивою фабрикою, а OpenClaw мемоізує розв’язану схему під час першого доступу.
  • Для root CLI-команд, якими володіє plugin, віддавайте перевагу api.registerCli(..., { descriptors: [...] }), коли потрібно, щоб команда залишалася ліниво завантажуваною, не зникаючи з дерева розбору root CLI. Для команд функцій paired-node віддавайте перевагу api.registerNodeCliFeature(...), щоб команда потрапляла під openclaw nodes. Для інших вкладених команд plugin додайте parentPath і реєструйте команди на об’єкті program, переданому реєстратору; OpenClaw розв’язує його до батьківської команди перед викликом plugin. Для channel plugins віддавайте перевагу реєстрації цих дескрипторів із registerCliMetadata(...) і тримайте registerFull(...) зосередженим на роботі лише runtime.
  • Якщо registerFull(...) також реєструє gateway RPC-методи, тримайте їх на префіксі, специфічному для plugin. Зарезервовані core admin namespaces (config.*, exec.approvals.*, wizard.*, update.*) завжди примусово переводяться до operator.admin.

defineSetupPluginEntry

Імпорт: openclaw/plugin-sdk/channel-core Для легкого файла setup-entry.ts. Повертає лише { plugin } без runtime або CLI-проводки.
import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";

export default defineSetupPluginEntry(myChannelPlugin);
OpenClaw завантажує це замість повної точки входу, коли канал вимкнено, не налаштовано або коли ввімкнено відкладене завантаження. Див. Setup and Config, щоб дізнатися, коли це важливо. На практиці поєднуйте defineSetupPluginEntry(...) з вузькими сімействами допоміжних засобів setup:
  • openclaw/plugin-sdk/setup-runtime для runtime-безпечних setup-допоміжних засобів, таких як import-safe setup patch adapters, lookup-note output, promptResolvedAllowFrom, splitSetupEntries і делеговані setup proxies
  • openclaw/plugin-sdk/channel-setup для optional-install setup surfaces
  • openclaw/plugin-sdk/setup-tools для setup/install CLI/archive/docs допоміжних засобів
Тримайте важкі SDK, реєстрацію CLI і довгоживучі runtime-сервіси в повній точці входу. Bundled workspace channels, які розділяють setup і runtime surfaces, можуть натомість використовувати defineBundledChannelSetupEntry(...) з openclaw/plugin-sdk/channel-entry-contract. Цей контракт дає setup-точці входу змогу зберігати setup-safe plugin/secrets exports, водночас усе ще відкриваючи runtime setter:
import { defineBundledChannelSetupEntry } from "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",
  },
});
Використовуйте цей bundled contract лише тоді, коли setup flows справді потребують легкого runtime setter до завантаження повної точки входу каналу.

Режим реєстрації

api.registrationMode повідомляє вашому plugin, як його було завантажено:
РежимКолиЩо реєструвати
"full"Звичайний запуск gatewayУсе
"discovery"Виявлення можливостей лише для читанняРеєстрація каналу плюс статичні CLI-дескриптори; код точки входу може завантажуватися, але пропускайте сокети, workers, клієнти й сервіси
"setup-only"Вимкнений/не налаштований каналЛише реєстрація каналу
"setup-runtime"Setup flow із доступним runtimeРеєстрація каналу плюс лише легкий runtime, потрібний до завантаження повної точки входу
"cli-metadata"Захоплення root help / метаданих CLIЛише CLI-дескриптори
defineChannelPluginEntry обробляє цей поділ автоматично. Якщо ви використовуєте definePluginEntry безпосередньо для каналу, перевіряйте режим самостійно:
register(api) {
  if (
    api.registrationMode === "cli-metadata" ||
    api.registrationMode === "discovery" ||
    api.registrationMode === "full"
  ) {
    api.registerCli(/* ... */);
    if (api.registrationMode === "cli-metadata") return;
  }

  api.registerChannel({ plugin: myPlugin });
  if (api.registrationMode !== "full") return;

  // Heavy runtime-only registrations
  api.registerService(/* ... */);
}
Режим discovery будує неактивуючий знімок реєстру. Він усе ще може обчислювати точку входу plugin і об’єкт channel plugin, щоб OpenClaw міг реєструвати можливості каналу та статичні CLI-дескриптори. Сприймайте обчислення модуля в discovery як довірене, але легке: жодних мережевих клієнтів, subprocesses, listeners, підключень до баз даних, background workers, читання облікових даних або інших live runtime побічних ефектів на верхньому рівні. Сприймайте "setup-runtime" як вікно, у якому startup surfaces лише для setup мають існувати без повторного входу в повний bundled channel runtime. Добре підходять реєстрація каналу, setup-safe HTTP routes, setup-safe gateway methods і делеговані setup helpers. Важкі background services, CLI registrars і provider/client SDK bootstraps усе ще належать до "full". Окремо для CLI registrars:
  • використовуйте descriptors, коли реєстратор володіє однією або кількома кореневими командами і ви хочете, щоб OpenClaw ліниво завантажував справжній модуль CLI під час першого виклику
  • переконайтеся, що ці дескриптори охоплюють кожен корінь команди верхнього рівня, який відкриває реєстратор
  • обмежуйте імена команд дескрипторів літерами, цифрами, дефісом і підкресленням, починаючи з літери або цифри; OpenClaw відхиляє імена дескрипторів поза цією формою та видаляє керівні послідовності термінала з описів перед відображенням довідки
  • використовуйте лише commands тільки для шляхів нетерплячої сумісності

Форми Plugin

OpenClaw класифікує завантажені plugins за їхньою поведінкою реєстрації:
ФормаОпис
plain-capabilityОдин тип можливості (наприклад, лише provider)
hybrid-capabilityКілька типів можливостей (наприклад, provider + speech)
hook-onlyЛише хуки, без можливостей
non-capabilityІнструменти/команди/сервіси, але без можливостей
Використовуйте openclaw plugins inspect <id>, щоб побачити форму plugin.

Пов’язане