Це поглиблений архітектурний довідник для системи Plugin в OpenClaw. Практичні посібники починайте з однієї з наведених нижче цільових сторінок.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.
Установлення та використання plugins
Посібник для кінцевих користувачів із додавання, увімкнення та усунення несправностей plugins.
Створення plugins
Навчальний матеріал для першого Plugin із найменшим робочим маніфестом.
Канальні plugins
Створіть Plugin каналу обміну повідомленнями.
Провайдерські plugins
Створіть Plugin провайдера моделі.
Огляд SDK
Довідник з import map та API реєстрації.
Публічна модель можливостей
Можливості — це публічна модель нативних Plugin всередині OpenClaw. Кожен нативний Plugin OpenClaw реєструється для одного або кількох типів можливостей:| Можливість | Метод реєстрації | Приклади plugins |
|---|---|---|
| Текстовий висновок | api.registerProvider(...) | openai, anthropic |
| Бекенд висновку CLI | api.registerCliBackend(...) | openai, anthropic |
| Мовлення | api.registerSpeechProvider(...) | elevenlabs, microsoft |
| Транскрибування в реальному часі | api.registerRealtimeTranscriptionProvider(...) | openai |
| Голос у реальному часі | api.registerRealtimeVoiceProvider(...) | openai |
| Розуміння медіа | api.registerMediaUnderstandingProvider(...) | openai, google |
| Генерація зображень | api.registerImageGenerationProvider(...) | openai, google, fal, minimax |
| Генерація музики | api.registerMusicGenerationProvider(...) | google, minimax |
| Генерація відео | api.registerVideoGenerationProvider(...) | qwen |
| Отримання вебвмісту | api.registerWebFetchProvider(...) | firecrawl |
| Вебпошук | api.registerWebSearchProvider(...) | google |
| Канал / обмін повідомленнями | api.registerChannel(...) | msteams, matrix |
| Виявлення Gateway | api.registerGatewayDiscoveryService(...) | bonjour |
Plugin, який не реєструє жодної можливості, але надає hooks, інструменти, служби виявлення або фонові служби, є застарілим Plugin лише з hooks. Цей шаблон і далі повністю підтримується.
Позиція щодо зовнішньої сумісності
Модель можливостей уже впроваджена в core і сьогодні використовується bundled/нативними plugins, але сумісність зовнішніх plugins потребує суворішої планки, ніж “це експортовано, отже це заморожено.”| Ситуація з Plugin | Рекомендації |
|---|---|
| Наявні зовнішні plugins | Підтримуйте роботу інтеграцій на основі hooks; це базовий рівень сумісності. |
| Нові bundled/нативні plugins | Надавайте перевагу явній реєстрації можливостей замість vendor-specific reach-ins або нових designs лише з hooks. |
| Зовнішні plugins, що впроваджують реєстрацію можливостей | Дозволено, але вважайте допоміжні поверхні для конкретних можливостей такими, що розвиваються, якщо документація не позначає їх стабільними. |
Форми Plugin
OpenClaw класифікує кожен завантажений Plugin у форму на основі його фактичної поведінки реєстрації (а не лише статичних метаданих):plain-capability
plain-capability
Реєструє рівно один тип можливості (наприклад, Plugin лише провайдера, як-от
mistral).hybrid-capability
hybrid-capability
Реєструє кілька типів можливостей (наприклад,
openai володіє текстовим висновком, мовленням, розумінням медіа та генерацією зображень).hook-only
hook-only
Реєструє лише hooks (типізовані або користувацькі), без можливостей, інструментів, команд або служб.
non-capability
non-capability
Реєструє інструменти, команди, служби або маршрути, але без можливостей.
openclaw plugins inspect <id>, щоб побачити форму Plugin та розподіл можливостей. Докладніше див. довідник CLI.
Застарілі hooks
Hookbefore_agent_start і далі підтримується як шлях сумісності для plugins лише з hooks. Застарілі реальні plugins усе ще залежать від нього.
Напрям:
- підтримувати його роботу
- задокументувати його як застарілий
- надавати перевагу
before_model_resolveдля роботи з перевизначенням моделі/провайдера - надавати перевагу
before_prompt_buildдля роботи зі зміною prompt - видаляти лише після зниження реального використання та після того, як покриття fixture доведе безпечність міграції
Сигнали сумісності
Коли ви запускаєтеopenclaw doctor або openclaw plugins inspect <id>, ви можете побачити одну з цих міток:
| Сигнал | Значення |
|---|---|
| config valid | Config успішно розбирається, а plugins розв’язуються |
| compatibility advisory | Plugin використовує підтримуваний, але старіший шаблон (наприклад, hook-only) |
| legacy warning | Plugin використовує before_agent_start, який є deprecated |
| hard error | Config недійсний або Plugin не вдалося завантажити |
hook-only, ні before_agent_start сьогодні не зламають ваш Plugin: hook-only є рекомендаційним сигналом, а before_agent_start лише викликає попередження. Ці сигнали також з’являються в openclaw status --all та openclaw plugins doctor.
Огляд архітектури
Система Plugin в OpenClaw має чотири шари:Маніфест + виявлення
OpenClaw знаходить кандидатні plugins із налаштованих шляхів, коренів workspace, глобальних коренів plugins і bundled plugins. Виявлення спершу читає нативні маніфести
openclaw.plugin.json та підтримувані маніфести bundle.Увімкнення + валідація
Core вирішує, чи виявлений Plugin увімкнений, вимкнений, заблокований або вибраний для ексклюзивного слота, наприклад пам’яті.
Завантаження runtime
Нативні plugins OpenClaw завантажуються in-process і реєструють можливості в центральному реєстрі. Packaged JavaScript завантажується через нативний
require; сторонній локальний source TypeScript є аварійним fallback Jiti. Сумісні bundles нормалізуються в записи реєстру без імпорту runtime-коду.- метадані часу розбору надходять із
registerCli(..., { descriptors: [...] }) - справжній модуль Plugin CLI може залишатися lazy і реєструватися під час першого виклику
- валідація manifest/config має працювати з метаданих manifest/schema без виконання коду Plugin
- виявлення нативних можливостей може завантажувати довірений entry-код Plugin, щоб побудувати неактивувальний snapshot реєстру
- runtime-поведінка нативного Plugin походить зі шляху
register(api)модуля Plugin зapi.registrationMode === "full"
Snapshot метаданих Plugin і таблиця пошуку
Під час запуску Gateway будує одинPluginMetadataSnapshot для поточного snapshot config. Snapshot містить лише метадані: він зберігає індекс встановлених plugins, реєстр маніфестів, діагностику маніфестів, мапи власників, нормалізатор id Plugin і записи маніфестів. Він не містить завантажених модулів Plugin, SDK провайдерів, вмісту пакетів або runtime-експортів.
Валідація config з урахуванням Plugin, автоматичне увімкнення під час запуску та bootstrap Plugin у Gateway споживають цей snapshot замість того, щоб незалежно перебудовувати метадані manifest/index. PluginLookUpTable виводиться з того самого snapshot і додає план Plugin запуску для поточного runtime config.
Після запуску Gateway зберігає поточний snapshot метаданих як замінний runtime-продукт. Повторне runtime-виявлення провайдерів може використовувати цей snapshot замість реконструкції встановленого індексу та реєстру маніфестів для кожного проходу provider-catalog. Snapshot очищається або замінюється під час вимкнення Gateway, змін config/plugin inventory та записів встановленого індексу; callers повертаються до холодного шляху manifest/index, коли немає сумісного поточного snapshot. Перевірки сумісності мають включати корені виявлення Plugin, як-от plugins.load.paths, і типовий agent workspace, тому що workspace plugins є частиною області метаданих.
Snapshot і таблиця пошуку тримають повторювані рішення запуску на швидкому шляху:
- володіння каналами
- відкладений запуск каналів
- id Plugin запуску
- володіння провайдерами та бекендами CLI
- володіння setup provider, alias команди, provider каталогу моделей і контрактом маніфесту
- валідація config schema Plugin і channel config schema
- рішення автоматичного увімкнення під час запуску
PluginLookUpTable. Тепер цей шлях реконструює реєстр на вимогу; надавайте перевагу передаванню поточної lookup table або явного manifest registry через runtime flows, коли caller уже має один із них.
Планування активації
Планування активації є частиною control plane. Callers можуть запитати, які plugins релевантні для конкретної команди, провайдера, каналу, маршруту, agent harness або можливості, перш ніж завантажувати ширші runtime registries. Планувальник зберігає сумісність поточної поведінки маніфесту:- поля
activation.*є явними підказками планувальника providers,channels,commandAliases,setup.providers,contracts.toolsі hooks залишаються fallback володіння з маніфесту- API планувальника лише з id залишається доступним для наявних callers
- API плану повідомляє мітки причин, щоб діагностика могла відрізняти явні підказки від fallback володіння
Plugins каналів і спільний інструмент повідомлень
Plugins каналів не потрібно реєструвати окремий інструмент надсилання/редагування/реакції для звичайних дій чату. OpenClaw зберігає один спільний інструментmessage у core, а plugins каналів володіють специфічним для каналу виявленням і виконанням за ним.
Поточна межа така:
- core володіє спільним хостом інструмента
message, підключенням prompt, обліком сесій/потоків і dispatch виконання - plugins каналів володіють виявленням scoped action, виявленням можливостей і будь-якими специфічними для каналу фрагментами schema
- plugins каналів володіють provider-specific граматикою сесійних розмов, наприклад тим, як conversation ids кодують thread ids або успадковуються від parent conversations
- plugins каналів виконують фінальну дію через свій action adapter
ChannelMessageActionAdapter.describeMessageTool(...). Цей уніфікований discovery call дає plugin змогу повернути свої видимі дії, можливості та внески до schema разом, щоб ці частини не розходилися.
Коли специфічний для каналу параметр message-tool містить media source, як-от локальний шлях або віддалений media URL, plugin також має повертати mediaSourceParams з describeMessageTool(...). Core використовує цей явний список, щоб застосовувати нормалізацію sandbox paths і підказки outbound media-access без жорстко заданих назв параметрів, що належать plugin. Віддавайте перевагу action-scoped maps там, а не одному плоскому списку для всього каналу, щоб media param лише для профілю не нормалізувався на непов’язаних діях, таких як send.
Core передає runtime scope у цей крок discovery. Важливі поля включають:
accountIdcurrentChannelIdcurrentThreadTscurrentMessageIdsessionKeysessionIdagentId- trusted inbound
requesterSenderId
message.
Саме тому зміни маршрутизації embedded-runner все ще є роботою plugin: runner відповідає за передавання поточної ідентичності chat/session у межу plugin discovery, щоб спільний інструмент message показував правильну поверхню, що належить каналу, для поточного turn.
Для channel-owned execution helpers bundled plugins мають тримати execution runtime всередині власних extension modules. Core більше не володіє Discord, Slack, Telegram або WhatsApp message-action runtimes у src/agents/tools. Ми не публікуємо окремі підшляхи plugin-sdk/*-action-runtime, а bundled plugins мають імпортувати власний локальний runtime code напряму зі своїх extension-owned modules.
Така сама межа застосовується до provider-named SDK seams загалом: core не має імпортувати специфічні для каналу convenience barrels для Slack, Discord, Signal, WhatsApp або подібних extensions. Якщо core потрібна поведінка, або споживайте власний barrel bundled plugin api.ts / runtime-api.ts, або підніміть потребу до вузької generic capability у shared SDK.
Bundled plugins дотримуються того самого правила. runtime-api.ts bundled plugin не має повторно експортувати власний branded facade openclaw/plugin-sdk/<plugin-id>. Ці branded facades лишаються compatibility shims для зовнішніх plugins і старіших consumers, але bundled plugins мають використовувати локальні exports плюс вузькі generic SDK subpaths, як-от openclaw/plugin-sdk/channel-policy, openclaw/plugin-sdk/runtime-store або openclaw/plugin-sdk/webhook-ingress. Новий код не має додавати plugin-id-specific SDK facades, якщо compatibility boundary для наявної зовнішньої екосистеми цього не вимагає.
Конкретно для polls є два шляхи виконання:
outbound.sendPoll— спільний baseline для каналів, що відповідають common poll modelactions.handleAction("poll")— бажаний шлях для специфічної для каналу семантики poll або додаткових параметрів poll
Модель володіння можливостями
OpenClaw розглядає native plugin як межу володіння для компанії або функції, а не як довільний набір непов’язаних інтеграцій. Це означає:- company plugin зазвичай має володіти всіма OpenClaw-facing surfaces цієї компанії
- feature plugin зазвичай має володіти повною feature surface, яку він вводить
- канали мають споживати shared core capabilities замість ad hoc повторної реалізації provider behavior
Багатоможливісний постачальник
Багатоможливісний постачальник
openai володіє text inference, speech, realtime voice, media understanding і image generation. google володіє text inference плюс media understanding, image generation і web search. qwen володіє text inference плюс media understanding і video generation.Одноможливісний постачальник
Одноможливісний постачальник
elevenlabs і microsoft володіють speech; firecrawl володіє web-fetch; minimax / mistral / moonshot / zai володіють media-understanding backends.Feature plugin
Feature plugin
voice-call володіє call transport, tools, CLI, routes і Twilio media-stream bridging, але споживає shared speech, realtime transcription і realtime voice capabilities замість прямого імпорту vendor plugins.- OpenAI живе в одному plugin, навіть якщо він охоплює text models, speech, images і майбутнє video
- інший постачальник може зробити те саме для власної surface area
- каналам байдуже, який vendor plugin володіє provider; вони споживають shared capability contract, відкритий core
- plugin = межа володіння
- capability = core contract, який кілька plugins можуть реалізовувати або споживати
Це зберігає володіння явним і водночас уникає core behavior, що залежить від одного постачальника або одноразового plugin-specific code path.
Шарування capability
Використовуйте цю mental model, коли вирішуєте, де має бути код:- Шар core capability
- Шар vendor plugin
- Шар channel/feature plugin
Shared orchestration, policy, fallback, config merge rules, delivery semantics і typed contracts.
- core володіє reply-time TTS policy, fallback order, prefs і channel delivery
openai,elevenlabsіmicrosoftволодіють synthesis implementationsvoice-callспоживає telephony TTS runtime helper
Приклад багатоможливісного company plugin
Company plugin має ззовні відчуватися цілісним. Якщо OpenClaw має shared contracts для models, speech, realtime transcription, realtime voice, media understanding, image generation, video generation, web fetch і web search, постачальник може володіти всіма своїми surfaces в одному місці:- один plugin володіє vendor surface
- core усе ще володіє capability contracts
- channels і feature plugins споживають helpers
api.runtime.*, а не vendor code - contract tests можуть перевіряти, що plugin зареєстрував capabilities, якими заявляє володіння
Приклад capability: video understanding
OpenClaw уже розглядає image/audio/video understanding як одну shared capability. Та сама ownership model застосовується й там:Vendor plugins реєструються
Vendor plugins реєструють
describeImage, transcribeAudio і describeVideo, якщо застосовно.api.registerVideoGenerationProvider(...) щодо нього.
Потрібен конкретний rollout checklist? Див. Capability Cookbook.
Contracts і enforcement
Поверхня plugin API навмисно типізована й централізована вOpenClawPluginApi. Цей contract визначає підтримувані registration points і runtime helpers, на які plugin може покладатися.
Чому це важливо:
- автори plugins отримують один стабільний внутрішній стандарт
- core може відхиляти duplicate ownership, як-от два plugins, що реєструють той самий provider id
- startup може показувати actionable diagnostics для malformed registration
- contract tests можуть забезпечувати bundled-plugin ownership і запобігати silent drift
Примусове застосування реєстрації під час виконання
Примусове застосування реєстрації під час виконання
Реєстр plugin перевіряє реєстрації під час завантаження plugin. Приклади: дубльовані ідентифікатори провайдерів, дубльовані ідентифікатори мовленнєвих провайдерів і некоректно сформовані реєстрації створюють діагностику plugin замість невизначеної поведінки.
Тести контрактів
Тести контрактів
Вбудовані plugins фіксуються в реєстрах контрактів під час тестових запусків, щоб OpenClaw міг явно перевіряти володіння. Наразі це використовується для провайдерів моделей, мовленнєвих провайдерів, провайдерів вебпошуку та володіння вбудованими реєстраціями.
Що належить до контракту
- Добрі контракти
- Погані контракти
- типізовані
- малі
- специфічні для capability
- належать core
- багаторазово використовувані кількома plugins
- придатні для використання каналами/функціями без знання постачальника
Модель виконання
Нативні plugins OpenClaw працюють у процесі разом із Gateway. Вони не ізольовані в пісочниці. Завантажений нативний plugin має ту саму межу довіри на рівні процесу, що й core-код. Сумісні пакети безпечніші за замовчуванням, бо OpenClaw наразі розглядає їх як пакети метаданих/контенту. У поточних випусках це здебільшого означає вбудовані Skills. Використовуйте allowlists і явні шляхи встановлення/завантаження для невбудованих plugins. Розглядайте workspace plugins як код для часу розробки, а не як production-типові значення. Для назв вбудованих workspace-пакетів утримуйте ідентифікатор plugin прив’язаним до npm-назви:@openclaw/<id> за замовчуванням або затверджений типізований суфікс, як-от -provider, -plugin, -speech, -sandbox чи -media-understanding, коли пакет навмисно надає вужчу роль plugin.
Примітка про довіру:
plugins.allow довіряє ідентифікаторам plugin, а не походженню джерела. Workspace plugin з тим самим ідентифікатором, що й вбудований plugin, навмисно затіняє вбудовану копію, коли цей workspace plugin увімкнено/додано до allowlist. Це нормально й корисно для локальної розробки, тестування патчів і hotfixes. Довіра до вбудованого plugin визначається зі знімка джерела — маніфесту й коду на диску під час завантаження — а не з метаданих встановлення. Пошкоджений або підмінений запис встановлення не може непомітно розширити поверхню довіри вбудованого plugin понад те, що заявляє фактичне джерело.Межа експорту
OpenClaw експортує capabilities, а не зручності реалізації. Залишайте реєстрацію capabilities публічною. Скорочуйте експорти допоміжних засобів, що не є контрактами:- допоміжні subpaths, специфічні для вбудованого plugin
- subpaths runtime plumbing, не призначені як публічний API
- зручні допоміжні засоби, специфічні для постачальника
- допоміжні засоби налаштування/onboarding, які є деталями реалізації
plugin-sdk/gateway-runtime, plugin-sdk/security-runtime і plugin-sdk/plugin-config-runtime.