Plugin SDK reference
Манифест плагина
На этой странице описывается нативный манифест плагина OpenClaw, openclaw.plugin.json. О совместимых структурах пакетов (Codex, Claude, Cursor) см. в разделе Пакеты плагинов.
Совместимые форматы пакетов используют собственные файлы манифестов:
- Пакет Codex:
.codex-plugin/plugin.json - Пакет Claude:
.claude-plugin/plugin.jsonили стандартная структура компонентов Claude без манифеста - Пакет Cursor:
.cursor-plugin/plugin.json
OpenClaw автоматически обнаруживает эти структуры, но не проверяет их по приведённой ниже схеме openclaw.plugin.json. Если структура совместимого пакета соответствует требованиям среды выполнения OpenClaw, система считывает метаданные пакета, объявленные корневые каталоги Skills, корневые каталоги команд Claude, значения Claude settings.json по умолчанию, значения LSP Claude по умолчанию и поддерживаемые наборы хуков.
Каждый нативный плагин OpenClaw должен содержать openclaw.plugin.json в корневом каталоге плагина. OpenClaw считывает его для проверки конфигурации без выполнения кода плагина. Отсутствующий или недопустимый манифест блокирует проверку конфигурации и считается ошибкой плагина.
Полное руководство по системе плагинов см. в разделе Плагины, а описание нативной модели возможностей и актуальные рекомендации по внешней совместимости — в разделе Модель возможностей.
Назначение этого файла
openclaw.plugin.json — это метаданные, которые OpenClaw считывает до загрузки кода плагина. Всё их содержимое должно допускать быстрый анализ без запуска среды выполнения плагина.
Используйте его для:
- идентификации плагина, проверки конфигурации и подсказок в интерфейсе конфигурации
- метаданных аутентификации, первоначальной настройки и конфигурирования (псевдоним, автоматическое включение, переменные окружения провайдера, варианты аутентификации)
- подсказок по активации для поверхностей плоскости управления
- указания принадлежности сокращённых имён семейств моделей
- статических снимков принадлежности возможностей (
contracts) - метаданных средства запуска QA, доступных для анализа общему хосту
openclaw qa - специфичных для канала метаданных конфигурации, объединяемых с каталогом и поверхностями проверки
Не используйте его для: регистрации поведения среды выполнения, объявления точек входа кода или метаданных установки npm. Они должны находиться в коде плагина и package.json.
Минимальный пример
{ "id": "voice-call", "configSchema": { "type": "object", "additionalProperties": false, "properties": {} }}Расширенный пример
{ "id": "openrouter", "name": "OpenRouter", "description": "Плагин провайдера OpenRouter", "version": "1.0.0", "providers": ["openrouter"], "modelSupport": { "modelPrefixes": ["router-"] }, "modelIdNormalization": { "providers": { "openrouter": { "prefixWhenBare": "openrouter" } } }, "providerEndpoints": [ { "endpointClass": "openrouter", "hostSuffixes": ["openrouter.ai"] } ], "providerRequest": { "providers": { "openrouter": { "family": "openrouter" } } }, "cliBackends": ["openrouter-cli"], "syntheticAuthRefs": ["openrouter-cli"], "setup": { "providers": [ { "id": "openrouter", "envVars": ["OPENROUTER_API_KEY"] } ] }, "providerAuthAliases": { "openrouter-coding": "openrouter" }, "channelEnvVars": { "openrouter-chatops": ["OPENROUTER_CHATOPS_TOKEN"] }, "providerAuthChoices": [ { "provider": "openrouter", "method": "api-key", "choiceId": "openrouter-api-key", "choiceLabel": "Ключ API OpenRouter", "groupId": "openrouter", "groupLabel": "OpenRouter", "optionKey": "openrouterApiKey", "cliFlag": "--openrouter-api-key", "cliOption": "--openrouter-api-key <key>", "cliDescription": "Ключ API OpenRouter", "onboardingScopes": ["text-inference"] } ], "uiHints": { "apiKey": { "label": "Ключ API", "placeholder": "sk-or-v1-...", "sensitive": true } }, "configSchema": { "type": "object", "additionalProperties": false, "properties": { "apiKey": { "type": "string" } } }}Справочник полей верхнего уровня
| Поле | Обязательно | Тип | Что означает |
|---|---|---|---|
id |
Да | string |
Канонический идентификатор плагина. Этот идентификатор используется в plugins.entries.<id>. |
configSchema |
Да | object |
Встроенная JSON Schema для конфигурации этого плагина. |
requiresPlugins |
Нет | string[] |
Идентификаторы плагинов, которые также должны быть установлены, чтобы этот плагин действовал. При обнаружении плагин остаётся доступным для загрузки, но выводится предупреждение, если какой-либо обязательный плагин отсутствует. |
enabledByDefault |
Нет | true |
Помечает встроенный плагин как включённый по умолчанию. Не указывайте это поле или задайте любое значение, отличное от true, чтобы плагин оставался отключённым по умолчанию. |
enabledByDefaultOnPlatforms |
Нет | string[] |
Помечает встроенный плагин как включённый по умолчанию только на перечисленных платформах Node.js, например ["darwin"]. Явная конфигурация по-прежнему имеет приоритет. |
legacyPluginIds |
Нет | string[] |
Устаревшие идентификаторы, которые нормализуются в этот канонический идентификатор плагина. |
autoEnableWhenConfiguredProviders |
Нет | string[] |
Идентификаторы провайдеров, при упоминании которых в данных аутентификации, конфигурации или ссылках на модели этот плагин должен включаться автоматически. |
kind |
Нет | PluginKind | PluginKind[] |
Объявляет один или несколько взаимоисключающих типов плагинов ("memory", "context-engine"), используемых в plugins.slots.*. Плагин, которому принадлежат оба слота, объявляет оба типа в одном массиве. |
channels |
Нет | string[] |
Идентификаторы каналов, принадлежащих этому плагину. Используются для обнаружения и проверки конфигурации. |
providers |
Нет | string[] |
Идентификаторы провайдеров, принадлежащих этому плагину. |
providerCatalogEntry |
Нет | string |
Путь к облегчённому модулю каталога провайдеров относительно корня плагина для метаданных каталога провайдеров в области манифеста, которые можно загрузить без активации полной среды выполнения плагина. |
modelSupport |
Нет | object |
Принадлежащие манифесту метаданные сокращённых обозначений семейств моделей, используемые для автоматической загрузки плагина до запуска среды выполнения. |
modelCatalog |
Нет | object |
Декларативные метаданные каталога моделей для провайдеров, принадлежащих этому плагину. Это контракт плоскости управления для будущего предоставления списков только для чтения, первоначальной настройки, средств выбора моделей, псевдонимов и подавления без загрузки среды выполнения плагина. |
modelPricing |
Нет | object |
Принадлежащая провайдеру политика внешнего поиска цен. Используйте её, чтобы исключить локальные или самостоятельно размещённые провайдеры из удалённых каталогов цен либо сопоставить ссылки на провайдеров с идентификаторами каталогов OpenRouter/LiteLLM без жёсткого кодирования идентификаторов провайдеров в ядре. |
modelIdNormalization |
Нет | object |
Принадлежащая провайдеру очистка псевдонимов или префиксов идентификаторов моделей, которая должна выполняться до загрузки среды выполнения провайдера. |
providerEndpoints |
Нет | object[] |
Принадлежащие манифесту метаданные хоста конечной точки или baseUrl для маршрутов провайдера, которые ядро должно классифицировать до загрузки среды выполнения провайдера. |
providerRequest |
Нет | object |
Легковесные метаданные семейства провайдеров и совместимости запросов, используемые общей политикой запросов до загрузки среды выполнения провайдера. |
secretProviderIntegrations |
Нет | Record<string, object> |
Декларативные предустановки исполняемых провайдеров SecretRef, которые интерфейсы настройки или установки могут предлагать без жёсткого кодирования интеграций для конкретных провайдеров в ядре. |
cliBackends |
Нет | string[] |
Идентификаторы серверных частей логического вывода CLI, принадлежащих этому плагину. Используются для автоматической активации при запуске на основе явных ссылок в конфигурации. |
syntheticAuthRefs |
Нет | string[] |
Ссылки на провайдеры или серверные части CLI, для которых во время холодного обнаружения моделей до загрузки среды выполнения следует проверять принадлежащий плагину обработчик синтетической аутентификации. |
nonSecretAuthMarkers |
Нет | string[] |
Принадлежащие встроенному плагину значения-заполнители ключей API, представляющие несекретное локальное состояние, состояние OAuth или состояние учётных данных из окружения. |
commandAliases |
Нет | object[] |
Имена команд, принадлежащих этому плагину, для которых до загрузки среды выполнения должна формироваться диагностика конфигурации и CLI с учётом плагина. |
providerAuthEnvVars |
Нет | Record<string, string[]> |
Устаревшие метаданные переменных окружения для совместимого поиска данных аутентификации и статуса провайдера. Для новых плагинов предпочтительно использовать setup.providers[].envVars; OpenClaw продолжает читать эти данные в течение периода устаревания. |
providerUsageAuthEnvVars |
Нет | Record<string, string[]> |
Учётные данные провайдера, используемые только для данных об использовании и выставлении счетов. OpenClaw использует эти имена для обнаружения данных об использовании и удаления секретов, но никогда не использует их для аутентификации логического вывода. |
providerAuthAliases |
Нет | Record<string, string> |
Идентификаторы провайдеров, которые должны повторно использовать другой идентификатор провайдера для поиска данных аутентификации, например провайдер программирования, использующий общий ключ API базового провайдера и его профили аутентификации. |
channelEnvVars |
Нет | Record<string, string[]> |
Легковесные метаданные переменных окружения канала, которые OpenClaw может проверять без загрузки кода плагина. Используйте их для управляемой переменными окружения настройки канала или интерфейсов аутентификации, которые должны быть доступны общим вспомогательным средствам запуска и конфигурации. |
providerAuthChoices |
Нет | object[] |
Легковесные метаданные выбора способа аутентификации для средств выбора при первоначальной настройке, определения предпочтительного провайдера и простой привязки флагов CLI. |
activation |
Нет | object |
Легковесные метаданные планировщика активации для загрузки, запускаемой при старте, обращении к провайдеру, команде, каналу, маршруту или возможности. Только метаданные; фактическое поведение по-прежнему принадлежит среде выполнения плагина. |
setup |
Нет | object |
Легковесные дескрипторы настройки и первоначальной настройки, которые механизмы обнаружения и интерфейсы настройки могут проверять без загрузки среды выполнения плагина. |
qaRunners |
Нет | object[] |
Легковесные дескрипторы средства запуска QA, используемые общим хостом openclaw qa до загрузки среды выполнения плагина. |
contracts |
Нет | object |
Статический снимок владения возможностями для внешних обработчиков аутентификации, векторных представлений, речи, транскрибирования в реальном времени, голосового взаимодействия в реальном времени, распознавания медиаданных, генерации изображений, видео и музыки, веб-загрузки, веб-поиска, рабочих провайдеров, извлечения содержимого документов и веб-страниц, а также владения инструментами. |
configContracts |
Нет | object |
Определяемое манифестом поведение конфигурации, используемое универсальными вспомогательными средствами ядра: обнаружение опасных флагов, цели миграции SecretRef и сужение путей устаревшей конфигурации. См. справочник по configContracts. |
mediaUnderstandingProviderMetadata |
Нет | Record<string, object> |
Недорогие настройки распознавания медиаданных по умолчанию для идентификаторов провайдеров, объявленных в contracts.mediaUnderstandingProviders. |
imageGenerationProviderMetadata |
Нет | Record<string, object> |
Недорогие метаданные аутентификации для генерации изображений для идентификаторов провайдеров, объявленных в contracts.imageGenerationProviders, включая принадлежащие провайдеру псевдонимы аутентификации и проверки базового URL. |
videoGenerationProviderMetadata |
Нет | Record<string, object> |
Недорогие метаданные аутентификации для генерации видео для идентификаторов провайдеров, объявленных в contracts.videoGenerationProviders, включая принадлежащие провайдеру псевдонимы аутентификации и проверки базового URL. |
musicGenerationProviderMetadata |
Нет | Record<string, object> |
Недорогие метаданные аутентификации для генерации музыки для идентификаторов провайдеров, объявленных в contracts.musicGenerationProviders, включая принадлежащие провайдеру псевдонимы аутентификации и проверки базового URL. |
toolMetadata |
Нет | Record<string, object> |
Недорогие метаданные доступности для принадлежащих плагину инструментов, объявленных в contracts.tools. Используйте их, если инструмент не должен загружать среду выполнения без подтверждающих данных в конфигурации, переменных среды или данных аутентификации. |
channelConfigs |
Нет | Record<string, object> |
Принадлежащие манифесту метаданные конфигурации канала, объединяемые с поверхностями обнаружения и проверки до загрузки среды выполнения. |
skills |
Нет | string[] |
Загружаемые каталоги Skills, пути к которым указываются относительно корня плагина. |
name |
Нет | string |
Удобочитаемое имя плагина. |
description |
Нет | string |
Краткое описание, отображаемое в интерфейсах плагина. |
catalog |
Нет | object |
Необязательные подсказки по представлению в интерфейсах каталога плагинов. Эти метаданные не устанавливают и не включают плагин, а также не предоставляют ему доверие. |
icon |
Нет | string |
URL-адрес изображения по протоколу HTTPS для карточек магазина или каталога. ClawHub принимает любой допустимый URL-адрес https:// и использует значок плагина по умолчанию, если значение отсутствует или недопустимо. |
version |
Нет | string |
Информационная версия плагина. |
uiHints |
Нет | Record<string, object> |
Метки интерфейса, заполнители и указания на конфиденциальность полей конфигурации. |
Справочник по каталогу
catalog предоставляет браузерам плагинов необязательные подсказки по отображению. Хосты могут игнорировать эти подсказки. Они никогда не устанавливают и не включают плагин, а также не изменяют его поведение во время выполнения или уровень доверия.
{ "catalog": { "featured": true, "order": 10 }}| Поле | Тип | Значение |
|---|---|---|
featured |
boolean |
Следует ли выделять этот плагин в интерфейсах каталога. |
order |
number |
Подсказка по порядку отображения отобранных плагинов по возрастанию; меньшие значения отображаются раньше. |
Справочник по метаданным провайдера генерации
Поля метаданных провайдера генерации описывают статические признаки аутентификации для провайдеров, объявленных в соответствующем списке contracts.*GenerationProviders. OpenClaw считывает эти поля до загрузки среды выполнения провайдера, чтобы основные инструменты могли определить доступность провайдера генерации без импорта каждого плагина провайдера.
Используйте эти поля только для простых декларативных фактов. Транспорт, преобразования запросов, обновление токенов, проверка учётных данных и фактическое поведение генерации остаются в среде выполнения плагина.
{ "contracts": { "imageGenerationProviders": ["example-image"] }, "imageGenerationProviderMetadata": { "example-image": { "aliases": ["example-image-oauth"], "authProviders": ["example-image"], "configSignals": [ { "rootPath": "plugins.entries.example-image.config", "overlayPath": "image", "mode": { "path": "mode", "default": "local", "allowed": ["local"] }, "requiredAny": ["workflow", "workflowPath"], "required": ["promptNodeId"] } ], "authSignals": [ { "provider": "example-image" }, { "provider": "example-image-oauth", "providerBaseUrl": { "provider": "example-image", "defaultBaseUrl": "https://api.example.com/v1", "allowedBaseUrls": ["https://api.example.com/v1"] } } ] } }}Каждая запись метаданных поддерживает:
| Поле | Обязательно | Тип | Значение |
|---|---|---|---|
aliases |
Нет | string[] |
Дополнительные идентификаторы провайдеров, которые следует учитывать как статические псевдонимы аутентификации для провайдера генерации. |
authProviders |
Нет | string[] |
Идентификаторы провайдеров, настроенные профили аутентификации которых следует учитывать как аутентификацию для этого провайдера генерации. |
configSignals |
Нет | object[] |
Простые признаки доступности только на основе конфигурации для локальных или самостоятельно размещённых провайдеров, настраиваемых без профилей аутентификации или переменных среды. |
authSignals |
Нет | object[] |
Явные признаки аутентификации. Если они указаны, то заменяют стандартный набор признаков из идентификатора провайдера, aliases и authProviders. |
referenceAudioInputs |
Нет | boolean |
Только для генерации видео. Задайте true, если провайдер принимает эталонные аудиоресурсы; в противном случае video_generate скрывает параметры эталонного аудио. |
Каждая запись configSignals поддерживает:
| Поле | Обязательно | Тип | Значение |
|---|---|---|---|
rootPath |
Да | string |
Путь с точечной нотацией к объекту конфигурации, принадлежащему плагину, который нужно проверить, например plugins.entries.example.config. |
overlayPath |
Нет | string |
Путь с точечной нотацией внутри корневой конфигурации, объект которого должен накладываться на корневой объект перед оценкой признака. Используйте его для конфигурации конкретной возможности, например image, video или music. |
overlayMapPath |
Нет | string |
Путь с точечной нотацией внутри корневой конфигурации, каждое объектное значение которого должно накладываться на корневой объект. Используйте его для карт именованных учётных записей, таких как accounts, где достаточно любой настроенной учётной записи. |
required |
Нет | string[] |
Пути с точечной нотацией внутри результирующей конфигурации, которые должны содержать настроенные значения. Строки должны быть непустыми; объекты и массивы не должны быть пустыми. |
requiredAny |
Нет | string[] |
Пути с точечной нотацией внутри результирующей конфигурации, среди которых хотя бы один должен содержать настроенное значение. |
mode |
Нет | object |
Необязательное строковое условие режима внутри результирующей конфигурации. Используйте его, когда доступность только на основе конфигурации применима лишь к одному режиму. |
Каждое условие mode поддерживает:
| Поле | Обязательно | Тип | Значение |
|---|---|---|---|
path |
Нет | string |
Путь с точечной нотацией внутри результирующей конфигурации. По умолчанию — mode. |
default |
Нет | string |
Значение режима, используемое, если путь отсутствует в конфигурации. |
allowed |
Нет | string[] |
Если указано, признак срабатывает только тогда, когда результирующий режим соответствует одному из этих значений. |
disallowed |
Нет | string[] |
Если указано, признак не срабатывает, когда результирующий режим соответствует одному из этих значений. |
Каждая запись authSignals поддерживает:
| Поле | Обязательно | Тип | Значение |
|---|---|---|---|
provider |
Да | string |
Идентификатор провайдера, проверяемый в настроенных профилях аутентификации. |
providerBaseUrl |
Нет | object |
Необязательное условие, при котором признак учитывается только тогда, когда указанный настроенный провайдер использует разрешённый базовый URL. Используйте его, если псевдоним аутентификации допустим только для определённых API. |
Каждое условие providerBaseUrl поддерживает:
| Поле | Обязательно | Тип | Значение |
|---|---|---|---|
provider |
Да | string |
Идентификатор конфигурации провайдера, в котором следует проверить baseUrl. |
defaultBaseUrl |
Нет | string |
Базовый URL, который следует использовать, если baseUrl отсутствует в конфигурации провайдера. |
allowedBaseUrls |
Да | string[] |
Разрешённые базовые URL для этого признака аутентификации. Признак игнорируется, если настроенный или стандартный базовый URL не совпадает ни с одним из этих нормализованных значений. |
Справочник по метаданным инструментов
toolMetadata использует те же структуры configSignals и authSignals, что и метаданные провайдера генерации, с ключами по имени инструмента. contracts.tools объявляет принадлежность. toolMetadata объявляет простое свидетельство доступности, чтобы OpenClaw мог не импортировать среду выполнения плагина лишь для того, чтобы фабрика его инструмента вернула null.
{ "setup": { "providers": [ { "id": "example", "envVars": ["EXAMPLE_API_KEY"] } ] }, "contracts": { "tools": ["example_search"] }, "toolMetadata": { "example_search": { "authSignals": [ { "provider": "example" } ], "configSignals": [ { "rootPath": "plugins.entries.example.config", "overlayPath": "search", "required": ["apiKey"] } ] } }}Записи toolMetadata также принимают optional (помечает инструмент как необязательный для активации плагина) и replaySafe (помечает выполнение инструмента как допускающее безопасный повтор после незавершённого хода модели) в дополнение к общим полям configSignals/authSignals, описанным выше.
Если у инструмента нет toolMetadata, OpenClaw сохраняет существующее поведение и загружает плагин-владелец, когда контракт инструмента соответствует политике. Для инструментов на критическом пути, фабрика которых зависит от аутентификации или конфигурации, авторам плагинов следует объявлять toolMetadata, а не заставлять ядро импортировать среду выполнения для запроса.
Справочник по providerAuthChoices
Каждая запись providerAuthChoices описывает один вариант первоначальной настройки или аутентификации. OpenClaw считывает её до загрузки среды выполнения провайдера. Списки настройки провайдеров используют эти варианты из манифеста, варианты настройки, полученные из дескрипторов, и метаданные каталога установки без загрузки среды выполнения провайдера.
| Поле | Обязательно | Тип | Значение |
|---|---|---|---|
provider |
Да | string |
Идентификатор провайдера, которому принадлежит этот вариант. |
method |
Да | string |
Идентификатор метода аутентификации, которому передаётся управление. |
choiceId |
Да | string |
Стабильный идентификатор варианта аутентификации, используемый при первоначальной настройке и в сценариях CLI. |
choiceLabel |
Нет | string |
Метка, отображаемая пользователю. Если она не задана, OpenClaw использует choiceId. |
choiceHint |
Нет | string |
Краткий вспомогательный текст для средства выбора. |
assistantPriority |
Нет | number |
В интерактивных средствах выбора под управлением ассистента меньшие значения отображаются раньше. |
assistantVisibility |
Нет | "visible" | "manual-only" |
Скрывает вариант из средств выбора ассистента, сохраняя возможность выбрать его вручную через CLI. |
deprecatedChoiceIds |
Нет | string[] |
Устаревшие идентификаторы вариантов, с которых следует перенаправлять пользователей на этот вариант-замену. |
groupId |
Нет | string |
Необязательный идентификатор группы для объединения связанных вариантов. |
groupLabel |
Нет | string |
Отображаемая пользователю метка этой группы. |
groupHint |
Нет | string |
Краткий вспомогательный текст для группы. |
onboardingFeatured |
Нет | boolean |
Показывает эту группу на уровне рекомендуемых вариантов интерактивного средства выбора первоначальной настройки перед пунктом "More...". |
optionKey |
Нет | string |
Внутренний ключ параметра для простых сценариев аутентификации с одним флагом. |
cliFlag |
Нет | string |
Имя флага CLI, например --openrouter-api-key. |
cliOption |
Нет | string |
Полная форма параметра CLI, например --openrouter-api-key <key>. |
cliDescription |
Нет | string |
Описание, используемое в справке CLI. |
appGuidedSecret |
Нет | boolean |
Для настройки под управлением приложения достаточно одного вставленного секрета и параметров провайдера по умолчанию. |
appGuidedDiscovery |
Нет | boolean |
Соответствующий метод аутентификации среды выполнения отвечает за локальное обнаружение только для чтения через appGuidedSetup. |
appGuidedAuth |
Нет | "oauth" | "device-code" |
Интерактивный вход, управляемый провайдером, который нативные клиенты настройки могут отображать универсальным образом. |
onboardingScopes |
Нет | Array<"text-inference" | "image-generation" | "music-generation"> |
Определяет, в каких интерфейсах первоначальной настройки должен отображаться этот вариант. Если значение не задано, по умолчанию используется ["text-inference"]. |
Когда appGuidedDiscovery имеет значение true, соответствующий метод аутентификации провайдера должен предоставлять
appGuidedSetup.detect и appGuidedSetup.prepare. Обнаружение должно выполняться
только для чтения: без входа, получения модели, скачивания или записи конфигурации. На этапе подготовки
точно выбранная модель проверяется повторно и возвращается предложение конфигурации; OpenClaw проверяет это
предложение в рабочем режиме изолированно и применяет его только после успешной проверки.
Справочник commandAliases
Используйте commandAliases, когда плагину принадлежит имя команды среды выполнения, которое пользователи могут по ошибке указать в plugins.allow или попытаться выполнить как корневую команду CLI. OpenClaw использует эти метаданные для диагностики, не импортируя код среды выполнения плагина.
{ "commandAliases": [ { "name": "dreaming", "kind": "runtime-slash", "cliCommand": "memory" } ]}| Поле | Обязательно | Тип | Значение |
|---|---|---|---|
name |
Да | string |
Имя команды, принадлежащей этому плагину. |
kind |
Нет | "runtime-slash" |
Указывает, что псевдоним является слеш-командой чата, а не корневой командой CLI. |
cliCommand |
Нет | string |
Связанная корневая команда CLI, которую следует предложить для операций CLI, если такая команда существует. |
Справочник activation
Используйте activation, когда плагин может без существенных затрат объявить, при каких событиях плоскости управления его следует включать в план активации и загрузки.
Этот блок представляет собой метаданные планировщика, а не API жизненного цикла. Он не регистрирует поведение среды выполнения, не заменяет register(...) и не гарантирует, что код плагина уже выполнялся. Планировщик активации использует эти поля для сужения списка плагинов-кандидатов, прежде чем прибегнуть к существующим метаданным владения из манифеста, таким как providers, channels, commandAliases, setup.providers, contracts.tools и хуки.
Отдавайте предпочтение наиболее узким метаданным, которые уже описывают владение. Используйте providers, channels, commandAliases, дескрипторы настройки или contracts, когда эти поля выражают соответствующую связь. Используйте activation для дополнительных подсказок планировщику, которые невозможно представить этими полями владения. Используйте cliBackends верхнего уровня для псевдонимов среды выполнения CLI, таких как claude-cli, my-cli или google-gemini-cli; activation.onAgentHarnesses предназначен только для идентификаторов встроенных сред агента, для которых ещё не предусмотрено поле владения.
Каждый плагин должен явно задавать activation.onStartup. Устанавливайте значение true только в том случае, если плагин должен выполняться во время запуска Gateway. Устанавливайте значение false, когда плагин неактивен при запуске и должен загружаться только по более узким триггерам. Отсутствие onStartup больше не приводит к неявной загрузке плагина при запуске; используйте явные метаданные активации для запуска, канала, конфигурации, среды агента, памяти или других более узких триггеров активации.
{ "activation": { "onStartup": false, "onProviders": ["openai"], "onCommands": ["models"], "onChannels": ["web"], "onRoutes": ["gateway-webhook"], "onConfigPaths": ["browser"], "onCapabilities": ["provider", "tool"] }}| Поле | Обязательно | Тип | Значение |
|---|---|---|---|
onStartup |
Нет | boolean |
Явная активация при запуске Gateway. Каждый плагин должен задавать это значение. true импортирует плагин во время запуска; false сохраняет отложенную загрузку при запуске, если загрузка не требуется из-за другого совпавшего триггера. |
onProviders |
Нет | string[] |
Идентификаторы провайдеров, при которых этот плагин следует включать в планы активации и загрузки. |
onAgentHarnesses |
Нет | string[] |
Идентификаторы сред выполнения встроенного агента, при которых этот плагин следует включать в планы активации и загрузки. Для псевдонимов серверной части CLI используйте cliBackends верхнего уровня. |
onCommands |
Нет | string[] |
Идентификаторы команд, при которых этот плагин следует включать в планы активации и загрузки. |
onChannels |
Нет | string[] |
Идентификаторы каналов, при которых этот плагин следует включать в планы активации и загрузки. |
onRoutes |
Нет | string[] |
Виды маршрутов, при которых этот плагин следует включать в планы активации и загрузки. |
onConfigPaths |
Нет | string[] |
Пути конфигурации относительно корня, при наличии которых этот плагин следует включать в планы запуска и загрузки, если они не отключены явно. |
onCapabilities |
Нет | Array<"provider" | "channel" | "tool" | "hook"> |
Общие подсказки о возможностях, используемые при планировании активации плоскости управления. По возможности отдавайте предпочтение более узким полям. |
Текущие активные потребители:
- Планирование запуска Gateway использует
activation.onStartupдля явного импорта при запуске. - Планирование CLI, инициированное командой, использует в качестве резервного варианта устаревшие
commandAliases[].cliCommandилиcommandAliases[].name. - Планирование запуска среды выполнения агента использует
activation.onAgentHarnessesдля встроенных тестовых обвязок и верхнеуровневыйcliBackends[]для псевдонимов среды выполнения CLI. - Планирование настройки или канала, инициированное каналом, использует в качестве резервного варианта устаревшее владение
channels[], когда отсутствуют явные метаданные активации канала. - Планирование плагинов при запуске использует
activation.onConfigPathsдля корневых поверхностей конфигурации, не относящихся к каналам, например блокаbrowserвстроенного плагина браузера. - Планирование настройки или среды выполнения, инициированное провайдером, использует в качестве резервного варианта устаревшее владение
providers[]и верхнеуровневое владениеcliBackends[], когда отсутствуют явные метаданные активации провайдера.
Диагностика планировщика может различать явные указания активации и резервное определение по владению из манифеста. Например, activation-command-hint означает, что совпал activation.onCommands, а manifest-command-alias — что планировщик вместо этого использовал владение commandAliases. Эти метки причин предназначены для диагностики хоста и тестов; авторам плагинов следует продолжать указывать метаданные, которые лучше всего описывают владение.
Справочник qaRunners
Используйте qaRunners, когда плагин предоставляет один или несколько транспортных обработчиков под
общим корнем openclaw qa. Эти метаданные должны оставаться легковесными и статическими; среда
выполнения плагина по-прежнему отвечает за фактическую регистрацию CLI через легковесную
поверхность runtime-api.ts, которая экспортирует соответствующие qaRunnerCliRegistrations. Необязательный
adapterFactory предоставляет транспорт общим сценариям контроля качества, не
изменяя обработчик зарегистрированной команды.
{ "qaRunners": [ { "commandName": "matrix", "description": "Запустить рабочий сценарий контроля качества Matrix на базе Docker с одноразовым домашним сервером" } ]}| Поле | Обязательно | Тип | Значение |
|---|---|---|---|
commandName |
Да | string |
Подкоманда, подключённая под openclaw qa, например matrix. |
description |
Нет | string |
Резервный текст справки, используемый, когда общему хосту нужна команда-заглушка. |
Идентификатор adapterFactory должен совпадать с commandName. Не экспортируйте регистрации
для команд, отсутствующих в манифесте.
Справочник setup
Используйте setup, когда поверхностям настройки и первоначальной подготовки нужны легковесные метаданные, принадлежащие плагину, до загрузки среды выполнения.
{ "setup": { "providers": [ { "id": "openai", "authMethods": ["api-key"], "envVars": ["OPENAI_API_KEY"], "authEvidence": [ { "type": "local-file-with-env", "fileEnvVar": "OPENAI_CREDENTIALS_FILE", "requiresAllEnv": ["OPENAI_PROJECT"], "credentialMarker": "openai-local-credentials", "source": "локальные учётные данные openai" } ] } ], "cliBackends": ["openai-cli"], "configMigrations": ["legacy-openai-auth"], "requiresRuntime": false }}Верхнеуровневый cliBackends остаётся допустимым и продолжает описывать серверные части логического вывода CLI. setup.cliBackends — это поверхность дескрипторов для настройки, предназначенная для потоков уровня управления и настройки, которые должны использовать только метаданные.
При наличии setup.providers и setup.cliBackends являются предпочтительной поверхностью поиска на основе дескрипторов для обнаружения настройки. Если дескриптор лишь сужает выбор плагина-кандидата, а настройке всё ещё нужны более функциональные перехватчики среды выполнения на этапе настройки, задайте requiresRuntime: true и оставьте setup-api в качестве резервного пути выполнения.
OpenClaw также включает setup.providers[].envVars в общие операции поиска аутентификации провайдеров и переменных среды. providerAuthEnvVars продолжает поддерживаться через адаптер совместимости в течение периода прекращения поддержки, однако сторонние плагины, которые всё ещё его используют, получают диагностическое сообщение манифеста. Новым плагинам следует помещать метаданные переменных среды для настройки и состояния в setup.providers[].envVars.
Используйте providerUsageAuthEnvVars, когда учётные данные уровня оплаты или организации должны активировать resolveUsageAuth, не становясь учётными данными для логического вывода. Эти имена добавляются в блокировку dotenv рабочей области, удаление из дочерних процессов ACP, фильтрацию секретов песочницы и общую очистку секретов. Среда выполнения провайдера по-прежнему считывает и классифицирует значение внутри resolveUsageAuth.
OpenClaw также может формировать простые варианты настройки из setup.providers[].authMethods, когда запись настройки недоступна или когда setup.requiresRuntime: false объявляет среду выполнения настройки ненужной. Явные записи providerAuthChoices остаются предпочтительными для пользовательских меток, флагов CLI, области первоначальной подготовки и метаданных ассистента.
Задавайте requiresRuntime: false только тогда, когда этих дескрипторов достаточно для поверхности настройки. OpenClaw рассматривает явный false как контракт, основанный только на дескрипторах, и не будет выполнять setup-api или openclaw.setupEntry для поиска настройки. Если плагин, использующий только дескрипторы, всё же предоставляет одну из этих записей среды выполнения настройки, OpenClaw сообщает дополнительное диагностическое сообщение и продолжает её игнорировать. Если requiresRuntime не указан, сохраняется устаревшее резервное поведение, чтобы существующие плагины, добавившие дескрипторы без этого флага, не перестали работать.
Поскольку поиск настройки может выполнять принадлежащий плагину код setup-api, нормализованные значения setup.providers[].id и setup.cliBackends[] должны оставаться уникальными среди обнаруженных плагинов. При неоднозначном владении операция завершается отказом вместо выбора победителя на основе порядка обнаружения.
При выполнении среды настройки диагностика реестра настройки сообщает о расхождении дескрипторов, если setup-api регистрирует провайдера или серверную часть CLI, не объявленную дескрипторами манифеста, либо если дескриптору не соответствует регистрация среды выполнения. Эти диагностические сообщения являются дополнительными и не приводят к отклонению устаревших плагинов.
Справочник setup.providers
| Поле | Обязательно | Тип | Значение |
|---|---|---|---|
id |
Да | string |
Идентификатор провайдера, предоставляемый во время настройки или первоначальной подготовки. Нормализованные идентификаторы должны быть глобально уникальными. |
authMethods |
Нет | string[] |
Идентификаторы методов настройки или аутентификации, поддерживаемых этим провайдером без загрузки полной среды выполнения. |
envVars |
Нет | string[] |
Переменные среды, которые общие поверхности настройки и состояния могут проверять до загрузки среды выполнения плагина. |
authEvidence |
Нет | object[] |
Легковесные локальные проверки признаков аутентификации для провайдеров, способных проходить аутентификацию по несекретным маркерам. |
authEvidence предназначен для принадлежащих провайдеру маркеров локальных учётных данных, которые можно проверить без загрузки кода среды выполнения. Эти проверки должны оставаться легковесными и локальными: без сетевых вызовов, чтения связки ключей или диспетчера секретов, команд оболочки и запросов к API провайдера.
Поддерживаемые записи признаков:
| Поле | Обязательно | Тип | Значение |
|---|---|---|---|
type |
Да | string |
В настоящее время local-file-with-env. |
fileEnvVar |
Нет | string |
Переменная среды, содержащая явный путь к файлу учётных данных. |
fallbackPaths |
Нет | string[] |
Пути к локальным файлам учётных данных, проверяемые при отсутствии или пустом значении fileEnvVar. Поддерживает ${HOME} и ${APPDATA}. |
requiresAnyEnv |
Нет | string[] |
Для действительности признака хотя бы одна из перечисленных переменных среды должна быть непустой. |
requiresAllEnv |
Нет | string[] |
Для действительности признака каждая из перечисленных переменных среды должна быть непустой. |
credentialMarker |
Да | string |
Несекретный маркер, возвращаемый при наличии признака. |
source |
Нет | string |
Отображаемая пользователю метка источника для вывода аутентификации или состояния. |
Поля setup
| Поле | Обязательно | Тип | Значение |
|---|---|---|---|
providers |
Нет | object[] |
Дескрипторы настройки провайдеров, предоставляемые во время настройки и первоначальной подготовки. |
cliBackends |
Нет | string[] |
Идентификаторы серверных частей этапа настройки, используемые для поиска настройки на основе дескрипторов. Нормализованные идентификаторы должны быть глобально уникальными. |
configMigrations |
Нет | string[] |
Идентификаторы миграций конфигурации, принадлежащие поверхности настройки этого плагина. |
requiresRuntime |
Нет | boolean |
Требуется ли настройке выполнение setup-api после поиска по дескрипторам. |
Справочник uiHints
uiHints — это сопоставление имён полей конфигурации с небольшими подсказками по отображению. Ключи могут использовать точки для вложенных полей конфигурации, однако ни один сегмент пути не может быть __proto__, constructor или prototype; настройка отклоняет такие имена.
{ "uiHints": { "apiKey": { "label": "Ключ API", "help": "Используется для запросов OpenRouter", "placeholder": "sk-or-v1-...", "sensitive": true } }}Каждая подсказка поля может включать:
| Поле | Тип | Значение |
|---|---|---|
label |
string |
Отображаемая пользователю метка поля. |
help |
string |
Краткий вспомогательный текст. |
tags |
string[] |
Необязательные теги интерфейса. |
advanced |
boolean |
Помечает поле как расширенное. |
sensitive |
boolean |
Помечает поле как секретное или конфиденциальное. |
placeholder |
string |
Текст-заполнитель для полей формы. |
Справочник contracts
Используйте contracts только для статических метаданных владения возможностями, которые OpenClaw может прочитать без импорта среды выполнения плагина.
{ "contracts": { "agentToolResultMiddleware": ["openclaw", "codex"], "trustedToolPolicies": ["workflow-budget"], "externalAuthProviders": ["acme-ai"], "embeddingProviders": ["openai-compatible"], "speechProviders": ["openai"], "realtimeTranscriptionProviders": ["openai"], "realtimeVoiceProviders": ["openai"], "memoryEmbeddingProviders": ["local"], "mediaUnderstandingProviders": ["openai"], "imageGenerationProviders": ["openai"], "videoGenerationProviders": ["qwen"], "musicGenerationProviders": ["stability-audio"], "documentExtractors": ["example-docs"], "webContentExtractors": ["firecrawl"], "webFetchProviders": ["firecrawl"], "webSearchProviders": ["gemini"], "workerProviders": ["example-worker"], "usageProviders": ["acme-ai"], "migrationProviders": ["hermes"], "gatewayMethodDispatch": ["authenticated-request"], "tools": ["firecrawl_search", "firecrawl_scrape"] }}Каждый список необязателен:
| Поле | Тип | Что означает |
|---|---|---|
embeddedExtensionFactories |
string[] |
Идентификаторы фабрик расширений сервера приложений Codex, в настоящее время codex-app-server. |
agentToolResultMiddleware |
string[] |
Идентификаторы сред выполнения, для которых этот плагин может регистрировать промежуточное ПО для результатов инструментов. |
trustedToolPolicies |
string[] |
Локальные для плагина идентификаторы доверенных политик перед выполнением инструментов, которые может регистрировать установленный плагин. Встроенные плагины могут регистрировать политики без этого поля. |
externalAuthProviders |
string[] |
Идентификаторы провайдеров, внешняя точка подключения профиля аутентификации которых принадлежит этому плагину. |
embeddingProviders |
string[] |
Идентификаторы провайдеров векторных представлений общего назначения, принадлежащих этому плагину и предназначенных для многократного использования векторных представлений, включая память. |
speechProviders |
string[] |
Идентификаторы провайдеров речи, принадлежащих этому плагину. |
realtimeTranscriptionProviders |
string[] |
Идентификаторы провайдеров транскрибирования в реальном времени, принадлежащих этому плагину. |
realtimeVoiceProviders |
string[] |
Идентификаторы провайдеров голосовой связи в реальном времени, принадлежащих этому плагину. |
memoryEmbeddingProviders |
string[] |
Устаревшие идентификаторы провайдеров векторных представлений специально для памяти, принадлежащих этому плагину. |
mediaUnderstandingProviders |
string[] |
Идентификаторы провайдеров анализа мультимедиа, принадлежащих этому плагину. |
transcriptSourceProviders |
string[] |
Идентификаторы провайдеров источников расшифровок, принадлежащих этому плагину. |
documentExtractors |
string[] |
Идентификаторы провайдеров извлечения содержимого документов (например, PDF), принадлежащих этому плагину. |
imageGenerationProviders |
string[] |
Идентификаторы провайдеров генерации изображений, принадлежащих этому плагину. |
videoGenerationProviders |
string[] |
Идентификаторы провайдеров генерации видео, принадлежащих этому плагину. |
musicGenerationProviders |
string[] |
Идентификаторы провайдеров генерации музыки, принадлежащих этому плагину. |
webContentExtractors |
string[] |
Идентификаторы провайдеров извлечения содержимого веб-страниц, принадлежащих этому плагину. |
webFetchProviders |
string[] |
Идентификаторы провайдеров получения веб-ресурсов, принадлежащих этому плагину. |
webSearchProviders |
string[] |
Идентификаторы провайдеров веб-поиска, принадлежащих этому плагину. |
workerProviders |
string[] |
Идентификаторы провайдеров облачных рабочих сред, принадлежащих этому плагину и предназначенных для подготовки ресурсов и жизненного цикла аренды на основе профиля. |
usageProviders |
string[] |
Идентификаторы провайдеров, точки подключения аутентификации использования и снимков использования которых принадлежат этому плагину. |
migrationProviders |
string[] |
Идентификаторы провайдеров импорта, принадлежащих этому плагину для openclaw migrate. |
gatewayMethodDispatch |
string[] |
Зарезервированное разрешение для аутентифицированных HTTP-маршрутов плагина, которые вызывают методы Gateway внутри процесса. |
tools |
string[] |
Имена инструментов агента, принадлежащих этому плагину. |
contracts.embeddedExtensionFactories сохраняется для встроенных фабрик расширений, предназначенных только для сервера приложений Codex. Встроенные преобразования результатов инструментов вместо этого должны объявлять contracts.agentToolResultMiddleware и регистрироваться с помощью api.registerAgentToolResultMiddleware(...). Установленные плагины могут использовать ту же точку подключения промежуточного ПО только при явном включении и только для сред выполнения, объявленных ими в contracts.agentToolResultMiddleware.
Установленные плагины, которым требуется уровень доверенной хостом политики перед выполнением инструментов, должны объявить каждый регистрируемый локальный идентификатор в contracts.trustedToolPolicies и быть явно включены. Встроенные плагины сохраняют существующий путь доверенных политик, но установленные плагины с необъявленными идентификаторами политик отклоняются до регистрации. Идентификаторы политик ограничены областью регистрирующего плагина, поэтому два плагина могут объявить и зарегистрировать workflow-budget; один плагин не может дважды зарегистрировать один и тот же локальный идентификатор.
Регистрации среды выполнения api.registerTool(...) должны соответствовать contracts.tools. При обнаружении инструментов этот список используется, чтобы загружать только те среды выполнения плагинов, которым могут принадлежать запрошенные инструменты.
Плагины провайдеров, реализующие resolveExternalAuthProfiles, должны объявлять contracts.externalAuthProviders; необъявленные точки подключения внешней аутентификации игнорируются.
Плагины провайдеров, реализующие одновременно resolveUsageAuth и fetchUsageSnapshot, должны объявлять каждый автоматически обнаруживаемый идентификатор провайдера в contracts.usageProviders. Механизм обнаружения использования читает этот контракт до загрузки кода среды выполнения, а затем проверяет обе точки подключения после загрузки только объявленных владельцев.
Провайдеры векторных представлений общего назначения должны объявлять contracts.embeddingProviders для каждого адаптера, зарегистрированного с помощью api.registerEmbeddingProvider(...). Используйте общий контракт для многократно используемой генерации векторов, включая провайдеров, используемых поиском по памяти. contracts.memoryEmbeddingProviders — устаревшая совместимость, относящаяся только к памяти; она сохраняется лишь на время миграции существующих провайдеров на общую точку подключения провайдера векторных представлений.
Провайдеры рабочих сред должны объявлять каждый идентификатор api.registerWorkerProvider(...) в contracts.workerProviders. Ядро сохраняет долгосрочное намерение перед вызовом provision; провайдеры проверяют свои настройки до внешнего выделения ресурсов, а повторные вызовы с тем же идентификатором операции должны использовать ту же аренду. Ядро также сохраняет этот проверенный снимок настроек и передаёт его вместе с leaseId в inspect({ leaseId, profile }) и destroy({ leaseId, profile }), в том числе после изменения или удаления именованного профиля. Уничтожение идемпотентно, проверка возвращает закрытое объединение состояний active / destroyed / unknown, а материал закрытого ключа SSH указывается только через SecretRef. Подготовленные конечные точки SSH также должны содержать открытый hostKey из доверенного результата подготовки ресурсов в точности как algorithm base64, без имени хоста или комментария, чтобы ядро могло закрепить хост перед подключением. Провайдеры, создающие динамические ссылки на удостоверения, могут реализовать авторитетный resolveSshIdentity({ leaseId, profile, keyRef }); для провайдеров без него используется универсальный механизм разрешения секретов ядра. Авторитетный unknown переводит активную локальную запись в состояние потерянной связи; после сохранённого запроса на уничтожение он подтверждает удаление ресурсов.
contracts.gatewayMethodDispatch в настоящее время принимает "authenticated-request". Это механизм контроля чистоты API для нативных HTTP-маршрутов плагинов, которые намеренно вызывают методы плоскости управления Gateway внутри процесса, а не песочница для защиты от вредоносных нативных плагинов. Используйте его только для тщательно проверенных встроенных или операторских поверхностей, которым уже требуется HTTP-аутентификация Gateway. Маршрут с таким разрешением остаётся доступным, пока приём корневых операций Gateway закрыт, только если он также объявляет auth: "gateway" и специфический для маршрута gatewayRuntimeScopeSurface: "trusted-operator"; обычные соседние маршруты того же плагина остаются за границей приёма операций. Это сохраняет доступность состояния приостановки и возобновления, не предоставляя всему плагину обход механизма приёма. Ограничивайте разбор и формирование ответа за пределами диспетчеризации; содержательная работа или работа с изменением состояния должна выполняться через диспетчеризацию методов Gateway, которая отвечает за приём и контроль областей доступа.
Справочник configContracts
Используйте configContracts для принадлежащего манифесту поведения конфигурации, которое требуется универсальным вспомогательным средствам ядра без импорта среды выполнения плагина: обнаружения опасных флагов, целей миграции SecretRef и сужения устаревших путей конфигурации.
{ "configContracts": { "compatibilityMigrationPaths": ["legacyProvider"], "compatibilityRuntimePaths": ["legacyProvider.webhook"], "dangerousFlags": [ { "path": "accounts.*.allowUnverifiedSenders", "equals": true } ], "secretInputs": { "bundledDefaultEnabled": false, "paths": [ { "path": "apiKey", "expected": "string" } ] } }}| Поле | Обязательно | Тип | Что означает |
|---|---|---|---|
compatibilityMigrationPaths |
Нет | string[] |
Пути конфигурации относительно корня, указывающие, что могут применяться миграции совместимости этого плагина во время настройки. Позволяет универсальному чтению конфигурации среды выполнения пропускать все поверхности настройки плагинов, если конфигурация никогда не ссылается на плагин. |
compatibilityRuntimePaths |
Нет | string[] |
Пути совместимости относительно корня, которые этот плагин может обслуживать во время выполнения до полной активации его кода. Используйте их для устаревших поверхностей, которые должны сужать наборы встроенных кандидатов без импорта среды выполнения каждого совместимого плагина. |
dangerousFlags |
Нет | object[] |
Литералы конфигурации, которые openclaw doctor должен помечать как небезопасные или опасные при включении. См. ниже. |
secretInputs |
Нет | object |
Пути конфигурации в plugins.entries.<id>.config, которые реестр целей миграции и аудита SecretRef должен рассматривать как строки, содержащие секреты. См. ниже. |
Каждая запись dangerousFlags поддерживает:
| Поле | Обязательно | Тип | Что означает |
|---|---|---|---|
path |
Да | string |
Разделённый точками путь конфигурации относительно plugins.entries.<id>.config. Поддерживает подстановочные знаки * для сегментов карт и массивов. |
equals |
Да | string | number | boolean | null |
Точный литерал, обозначающий это значение конфигурации как опасное. |
secretInputs поддерживает:
| Поле | Обязательно | Тип | Что означает |
|---|---|---|---|
bundledDefaultEnabled |
Нет | boolean |
Переопределяет включение по умолчанию для встроенного плагина при определении активности этой поверхности SecretRef. Используйте это, если плагин встроен, но поверхность должна оставаться неактивной до явного включения в конфигурации. |
paths |
Да | object[] |
Пути конфигурации в форме секретов, каждый с path (разделённый точками, относительно plugins.entries.<id>.config, поддерживает подстановочные знаки *) и необязательным expected (в настоящее время только "string"). |
Справочник mediaUnderstandingProviderMetadata
Используйте mediaUnderstandingProviderMetadata, если у провайдера распознавания медиаданных есть модели по умолчанию, приоритет автоматического резервного выбора аутентификации или встроенная поддержка документов, необходимые общим вспомогательным средствам ядра до загрузки среды выполнения. Ключи также должны быть объявлены в contracts.mediaUnderstandingProviders.
{ "contracts": { "mediaUnderstandingProviders": ["example"] }, "mediaUnderstandingProviderMetadata": { "example": { "capabilities": ["image", "audio"], "defaultModels": { "image": "example-vision-latest", "audio": "example-transcribe-latest" }, "autoPriority": { "image": 40 }, "nativeDocumentInputs": ["pdf"], "documentModels": { "pdf": { "textExtraction": "example-doc-text-latest", "image": "example-doc-vision-latest" } } } }}Каждая запись провайдера может содержать:
| Поле | Тип | Что означает |
|---|---|---|
capabilities |
("image" | "audio" | "video")[] |
Возможности обработки медиаданных, предоставляемые этим провайдером. |
defaultModels |
Record<string, string> |
Сопоставление возможностей с моделями по умолчанию, используемое, когда модель не указана в конфигурации. |
autoPriority |
Record<string, number> |
Меньшие числа располагаются раньше при автоматическом резервном выборе провайдера на основе учётных данных. |
nativeDocumentInputs |
"pdf"[] |
Типы документов, для которых провайдер поддерживает встроенный ввод. |
documentModels |
{ pdf?: { textExtraction?: string; image?: string | false } } |
Переопределения моделей для каждого типа документа. Установите image: false, чтобы отключить извлечение на основе изображений для этого типа документа. |
Справочник channelConfigs
Используйте channelConfigs, если плагину канала нужны легковесные метаданные конфигурации до загрузки среды выполнения. Обнаружение настроек и состояния канала только для чтения может напрямую использовать эти метаданные для настроенных внешних каналов, когда запись настройки отсутствует или когда setup.requiresRuntime: false указывает, что среда выполнения настройки не требуется.
channelConfigs — это метаданные манифеста плагина, а не новый раздел пользовательской конфигурации верхнего уровня. Пользователи по-прежнему настраивают экземпляры каналов в channels.<channel-id>. OpenClaw считывает метаданные манифеста, чтобы определить, какой плагин владеет настроенным каналом, до выполнения кода среды выполнения плагина.
Для плагина канала configSchema и channelConfigs описывают разные пути:
configSchemaпроверяетplugins.entries.<plugin-id>.configchannelConfigs.<channel-id>.schemaпроверяетchannels.<channel-id>
Невстроенные плагины, объявляющие channels[], также должны объявлять соответствующие записи channelConfigs. Без них OpenClaw всё равно может загрузить плагин, но схема конфигурации холодного пути, настройка и поверхности Control UI не смогут определить форму параметров, принадлежащих каналу, пока не выполнится среда выполнения плагина.
channelConfigs.<channel-id>.commands.nativeCommandsAutoEnabled и nativeSkillsAutoEnabled могут объявлять статические значения auto по умолчанию для проверок конфигурации команд, выполняемых до загрузки среды выполнения канала. Встроенные каналы также могут публиковать те же значения по умолчанию через package.json#openclaw.channel.commands вместе с другими принадлежащими пакету метаданными каталога каналов.
{ "channelConfigs": { "matrix": { "schema": { "type": "object", "additionalProperties": false, "properties": { "homeserverUrl": { "type": "string" } } }, "uiHints": { "homeserverUrl": { "label": "URL домашнего сервера", "placeholder": "https://matrix.example.com" } }, "label": "Matrix", "description": "Подключение к домашнему серверу Matrix", "commands": { "nativeCommandsAutoEnabled": true, "nativeSkillsAutoEnabled": true }, "preferOver": ["matrix-legacy"] } }}Каждая запись канала может содержать:
| Поле | Тип | Что означает |
|---|---|---|
schema |
object |
JSON Schema для channels.<id>. Обязательна для каждой объявленной записи конфигурации канала. |
uiHints |
Record<string, object> |
Необязательные метки интерфейса, заполнители и указания на конфиденциальность для этого раздела конфигурации канала. |
label |
string |
Метка канала, добавляемая в интерфейсы выбора и просмотра, когда метаданные среды выполнения ещё не готовы. |
description |
string |
Краткое описание канала для интерфейсов просмотра и каталога. |
commands |
object |
Статические значения автоматических настроек по умолчанию для нативных команд и нативных навыков, используемые при проверке конфигурации до запуска среды выполнения. |
preferOver |
string[] |
Идентификаторы устаревших или менее приоритетных плагинов, которые этот канал должен опережать в интерфейсах выбора. |
Замена другого плагина канала
Используйте preferOver, если ваш плагин является предпочтительным владельцем идентификатора канала, который также может предоставляться другим плагином. Типичные случаи: переименованный идентификатор плагина, автономный плагин, заменяющий встроенный, или поддерживаемый форк, сохраняющий тот же идентификатор канала для совместимости конфигурации.
{ "id": "acme-chat", "channels": ["chat"], "channelConfigs": { "chat": { "schema": { "type": "object", "additionalProperties": false, "properties": { "webhookUrl": { "type": "string" } } }, "preferOver": ["chat"] } }}Когда настроен channels.chat, OpenClaw учитывает как идентификатор канала, так и идентификатор предпочтительного плагина. Если менее приоритетный плагин был выбран только потому, что он встроен или включён по умолчанию, OpenClaw отключает его в фактической конфигурации среды выполнения, чтобы каналом и его инструментами владел один плагин. Явный выбор пользователя по-прежнему имеет приоритет: если пользователь явно включает оба плагина (через plugins.allow или содержательную конфигурацию plugins.entries), OpenClaw сохраняет этот выбор и сообщает диагностические сведения о дублировании каналов и инструментов вместо скрытого изменения запрошенного набора плагинов.
Ограничивайте область действия preferOver идентификаторами плагинов, которые действительно могут предоставлять тот же канал. Это не общее поле приоритета, и оно не переименовывает ключи пользовательской конфигурации.
Справочник modelSupport
Используйте modelSupport, если OpenClaw должен определять ваш плагин провайдера по сокращённым идентификаторам моделей, таким как gpt-5.6-sol или claude-sonnet-4.6, до загрузки среды выполнения плагина.
{ "modelSupport": { "modelPrefixes": ["gpt-", "o1", "o3", "o4"], "modelPatterns": ["^computer-use-preview"] }}OpenClaw применяет следующий порядок приоритета:
- явные ссылки
provider/modelиспользуют метаданные манифеста владельцаproviders modelPatternsимеют приоритет надmodelPrefixes- если совпадают один невстроенный и один встроенный плагин, побеждает невстроенный
- оставшаяся неоднозначность игнорируется, пока пользователь или конфигурация не укажет провайдера
Поля:
| Поле | Тип | Что означает |
|---|---|---|
modelPrefixes |
string[] |
Префиксы, сопоставляемые с сокращёнными идентификаторами моделей с помощью startsWith. |
modelPatterns |
string[] |
Исходные регулярные выражения, сопоставляемые с сокращёнными идентификаторами моделей после удаления суффикса профиля. |
Записи modelPatterns компилируются через compileSafeRegex, который отклоняет шаблоны с вложенным повторением (например, (a+)+$). Шаблоны, не прошедшие проверку безопасности, без уведомления пропускаются, как и синтаксически недопустимые регулярные выражения. Используйте простые шаблоны и избегайте вложенных квантификаторов.
Справочник modelCatalog
Используйте modelCatalog, если OpenClaw должен знать метаданные моделей провайдера до загрузки среды выполнения плагина. Это принадлежащий манифесту источник фиксированных строк каталога, псевдонимов провайдеров, правил подавления и режима обнаружения. Обновление во время выполнения по-прежнему относится к коду среды выполнения провайдера, но манифест сообщает ядру, когда требуется среда выполнения.
{ "providers": ["openai"], "modelCatalog": { "providers": { "openai": { "baseUrl": "https://api.openai.com/v1", "api": "openai-responses", "models": [ { "id": "gpt-5.4", "name": "GPT-5.4", "input": ["text", "image"], "reasoning": true, "contextWindow": 256000, "maxTokens": 128000, "cost": { "input": 1.25, "output": 10, "cacheRead": 0.125 }, "status": "available", "tags": ["default"] } ] } }, "aliases": { "azure-openai-responses": { "provider": "openai", "api": "azure-openai-responses" } }, "suppressions": [ { "provider": "azure-openai-responses", "model": "gpt-5.3-codex-spark", "reason": "недоступно в Azure OpenAI Responses" } ], "discovery": { "openai": "static" } }}Поля верхнего уровня:
| Поле | Тип | Что означает |
|---|---|---|
providers |
Record<string, object> |
Строки каталога для идентификаторов провайдеров, принадлежащих этому плагину. Ключи также должны присутствовать в верхнеуровневом providers. |
aliases |
Record<string, object> |
Псевдонимы провайдеров, которые должны разрешаться в принадлежащего плагину провайдера при планировании каталога или подавления. |
suppressions |
object[] |
Строки моделей из другого источника, которые этот плагин подавляет по причине, связанной с конкретным провайдером. |
discovery |
Record<string, "static" | "refreshable" | "runtime"> |
Можно ли прочитать каталог провайдера из метаданных манифеста, обновить его в кэше или для этого требуется среда выполнения. |
runtimeAugment |
boolean |
Устанавливайте значение true только тогда, когда среда выполнения провайдера должна дополнить строки каталога после планирования манифеста и конфигурации. |
aliases участвует в поиске владельца провайдера при планировании каталога моделей. Целевые объекты псевдонимов должны быть верхнеуровневыми провайдерами, принадлежащими тому же плагину. Когда отфильтрованный по провайдеру список использует псевдоним, OpenClaw может прочитать манифест владельца и применить переопределения API и базового URL для псевдонима без загрузки среды выполнения провайдера. Псевдонимы не расширяют неотфильтрованные списки каталога; в общих списках выводятся только строки канонического провайдера-владельца.
suppressions заменяет прежний перехватчик среды выполнения провайдера suppressBuiltInModel. Записи подавления учитываются только тогда, когда провайдер принадлежит плагину или объявлен как ключ modelCatalog.aliases, указывающий на принадлежащего плагину провайдера. Перехватчики подавления среды выполнения больше не вызываются при разрешении модели.
Поля провайдера:
| Поле | Тип | Что означает |
|---|---|---|
baseUrl |
string |
Необязательный базовый URL по умолчанию для моделей в каталоге этого провайдера. |
api |
ModelApi |
Необязательный адаптер API по умолчанию для моделей в каталоге этого провайдера. |
headers |
Record<string, string> |
Необязательные статические заголовки, применяемые к каталогу этого провайдера. |
defaultUtilityModel |
string |
Необязательный рекомендуемый провайдером идентификатор небольшой модели для коротких внутренних служебных задач (заголовков, описания хода выполнения). Используется, когда agents.defaults.utilityModel не задано и этот провайдер обслуживает основную модель агента. |
models |
object[] |
Обязательные строки моделей. Строки без id игнорируются. |
Поля модели:
| Поле | Тип | Что означает |
|---|---|---|
id |
string |
Локальный для провайдера идентификатор модели без префикса provider/. |
name |
string |
Необязательное отображаемое имя. |
api |
ModelApi |
Необязательное переопределение API для конкретной модели. |
baseUrl |
string |
Необязательное переопределение базового URL для конкретной модели. |
headers |
Record<string, string> |
Необязательные статические заголовки для конкретной модели. |
input |
Array<"text" | "image" | "document"> |
Модальности, принимаемые моделью. Остальные значения автоматически отбрасываются. |
reasoning |
boolean |
Предоставляет ли модель возможности рассуждения. |
contextWindow |
number |
Собственное окно контекста провайдера. |
contextTokens |
number |
Необязательное эффективное ограничение контекста среды выполнения, если оно отличается от contextWindow. |
maxTokens |
number |
Максимальное количество выходных токенов, если оно известно. |
thinkingLevelMap |
Record<string, string | null> |
Необязательные переопределения идентификатора модели или параметров для каждого уровня рассуждения. |
cost |
object |
Необязательная стоимость в долларах США за миллион токенов, включая необязательное tieredPricing. |
compat |
object |
Необязательные флаги совместимости, соответствующие совместимости конфигурации моделей OpenClaw. |
mediaInput |
object |
Необязательная конфигурация ввода для каждой модальности; в настоящее время поддерживаются только изображения. |
status |
"available" | "preview" | "deprecated" | "disabled" |
Статус отображения в списке. Подавляйте только тогда, когда строка вообще не должна отображаться. |
statusReason |
string |
Необязательная причина, отображаемая при статусе недоступности. |
replaces |
string[] |
Более старые локальные для провайдера идентификаторы моделей, заменяемые этой моделью. |
replacedBy |
string |
Локальный для провайдера идентификатор модели-замены для устаревших строк. |
tags |
string[] |
Стабильные теги, используемые средствами выбора и фильтрами. |
Поля подавления:
| Поле | Тип | Что означает |
|---|---|---|
provider |
string |
Идентификатор провайдера для подавляемой вышестоящей строки. Провайдер должен принадлежать этому плагину или быть объявлен как принадлежащий ему псевдоним. |
model |
string |
Локальный для провайдера идентификатор подавляемой модели. |
reason |
string |
Необязательное сообщение, отображаемое при прямом запросе подавленной строки. |
when.baseUrlHosts |
string[] |
Необязательный список хостов эффективных базовых URL провайдера, необходимых для применения подавления. |
when.providerConfigApiIn |
string[] |
Необязательный список точных значений api конфигурации провайдера, необходимых для применения подавления. |
Не помещайте данные, доступные только в среде выполнения, в modelCatalog. Используйте static только тогда, когда строки манифеста достаточно полны, чтобы списки с фильтрацией по провайдеру и средства выбора могли пропустить обнаружение реестра и среды выполнения. Используйте refreshable, когда строки манифеста являются полезными доступными для отображения начальными или дополнительными данными, но обновление или кэш позднее могут добавить дополнительные строки; обновляемые строки сами по себе не являются авторитетным источником. Используйте runtime, когда OpenClaw должен загрузить среду выполнения провайдера, чтобы получить список.
Справочник по modelIdNormalization
Используйте modelIdNormalization для недорогой очистки идентификаторов моделей, принадлежащих провайдеру, которую необходимо выполнить до загрузки среды выполнения провайдера. Это позволяет хранить псевдонимы, такие как сокращённые имена моделей, устаревшие локальные для провайдера идентификаторы и правила префиксов прокси, в манифесте плагина-владельца, а не в основных таблицах выбора моделей.
{ "providers": ["anthropic", "openrouter"], "modelIdNormalization": { "providers": { "anthropic": { "aliases": { "sonnet-4.6": "claude-sonnet-4-6" } }, "openrouter": { "prefixWhenBare": "openrouter" } } }}Поля провайдера:
| Поле | Тип | Что означает |
|---|---|---|
aliases |
Record<string,string> |
Не учитывающие регистр псевдонимы точных идентификаторов моделей. Значения возвращаются в исходном написании. |
stripPrefixes |
string[] |
Префиксы, удаляемые перед поиском псевдонима; полезны для устранения устаревшего дублирования провайдера и модели. |
prefixWhenBare |
string |
Префикс, добавляемый, если нормализованный идентификатор модели ещё не содержит /. |
prefixWhenBareAfterAliasStartsWith |
object[] |
Условные правила добавления префикса к идентификатору без префикса после поиска псевдонима, индексированные по modelPrefix и prefix. |
Справочник по providerEndpoints
Используйте providerEndpoints для классификации конечных точек, которую общая политика запросов должна знать до загрузки среды выполнения провайдера. Основная система по-прежнему определяет значение каждого endpointClass; манифесты плагинов определяют метаданные хостов и базовых URL.
Официально вынесенные во внешние пакеты плагины провайдеров исключены из основной поставки, поэтому
их манифесты недоступны до установки. Их providerEndpoints также необходимо
дублировать в scripts/lib/official-external-provider-catalog.json, чтобы
классификация конечных точек продолжала работать без плагина; соответствие копии
проверяется контрактным тестом.
Поля конечной точки:
| Поле | Тип | Что означает |
|---|---|---|
endpointClass |
string |
Известный класс конечных точек ядра, например openrouter, moonshot-native или google-vertex. |
hosts |
string[] |
Точные имена хостов, сопоставляемые с классом конечных точек. |
hostSuffixes |
string[] |
Суффиксы хостов, сопоставляемые с классом конечных точек. Добавьте префикс ., чтобы сопоставлять только по суффиксу домена. |
baseUrls |
string[] |
Точные нормализованные базовые URL-адреса HTTP(S), сопоставляемые с классом конечных точек. |
googleVertexRegion |
string |
Статический регион Google Vertex для точных глобальных хостов. |
googleVertexRegionHostSuffix |
string |
Суффикс, удаляемый из совпавших хостов для получения префикса региона Google Vertex. |
Справочник providerRequest
Используйте providerRequest для недорогих метаданных совместимости запросов, необходимых универсальной политике запросов без загрузки среды выполнения провайдера. Перезапись полезной нагрузки, зависящую от поведения, оставляйте в хуках среды выполнения провайдера или общих вспомогательных компонентах семейства провайдеров.
{ "providerRequest": { "providers": { "vllm": { "family": "vllm", "openAICompletions": { "supportsStreamingUsage": true } } } }}Поля провайдера:
| Поле | Тип | Что означает |
|---|---|---|
family |
string |
Метка семейства провайдеров, используемая универсальными механизмами принятия решений о совместимости запросов и диагностики. |
compatibilityFamily |
"moonshot" |
Необязательная категория совместимости семейства провайдеров для общих вспомогательных компонентов запросов. |
openAICompletions |
object |
Флаги запросов завершения, совместимых с OpenAI; в настоящее время — supportsStreamingUsage. |
Справочник secretProviderIntegrations
Используйте secretProviderIntegrations, когда плагин может предоставлять многократно используемый предустановленный exec-провайдер SecretRef. OpenClaw считывает эти метаданные до загрузки среды выполнения плагина, сохраняет сведения о принадлежности плагину в secrets.providers.<alias>.pluginIntegration, а фактическое разрешение секрета оставляет среде выполнения SecretRef. Предустановки доступны только для встроенных плагинов и установленных плагинов, обнаруженных в управляемых корневых каталогах установки плагинов, например установленных через git и ClawHub.
{ "secretProviderIntegrations": { "secret-store": { "providerAlias": "team-secrets", "displayName": "Team secrets", "source": "exec", "command": "${node}", "args": ["./bin/resolve-secrets.mjs"] } }}Ключ карты — идентификатор интеграции. Если providerAlias опущен, OpenClaw использует идентификатор интеграции в качестве псевдонима провайдера SecretRef. Псевдонимы провайдеров должны соответствовать обычному шаблону псевдонимов провайдеров SecretRef, например team-secrets или onepassword-work.
Когда оператор выбирает предустановку, OpenClaw записывает ссылку на провайдера следующего вида:
{ "secrets": { "providers": { "team-secrets": { "source": "exec", "pluginIntegration": { "pluginId": "acme-secrets", "integrationId": "secret-store" } } } }}При запуске или перезагрузке OpenClaw разрешает этот провайдер, загружая текущие метаданные манифеста плагина, проверяя, что владеющий им плагин установлен и активен, и формируя команду exec из манифеста. Отключение или удаление плагина отзывает провайдер для активных SecretRef. Операторы, которым нужна автономная конфигурация exec, по-прежнему могут напрямую задавать вручную провайдеры command/args.
В настоящее время поддерживаются только предустановки source: "exec". command должен иметь значение ${node}, а args[0] должен быть относительным от корня плагина скриптом разрешения ./. При запуске или перезагрузке OpenClaw преобразует его в текущий исполняемый файл Node и абсолютный путь к скрипту внутри плагина. Параметры Node, такие как --require, --import, --loader, --env-file, --eval и --print, не входят в контракт предустановок манифеста. Операторы, которым нужны команды не на Node, могут напрямую настроить автономные провайдеры exec вручную.
OpenClaw формирует trustedDirs для предустановок манифеста из корня плагина, а для предустановок ${node} — также из каталога текущего исполняемого файла Node. Указанные в манифесте trustedDirs игнорируются. Другие параметры провайдера exec, такие как timeoutMs, noOutputTimeoutMs, maxOutputBytes, jsonOnly, env, passEnv и allowInsecurePath, передаются в обычную конфигурацию exec-провайдера SecretRef.
Справочник modelPricing
Используйте modelPricing, когда провайдеру требуется управлять ценообразованием на уровне управляющей плоскости до загрузки среды выполнения. Кэш цен Gateway считывает эти метаданные без импорта кода среды выполнения провайдера.
{ "providers": ["ollama", "openrouter"], "modelPricing": { "providers": { "ollama": { "external": false }, "openrouter": { "openRouter": { "passthroughProviderModel": true }, "liteLLM": false } } }}Поля провайдера:
| Поле | Тип | Что означает |
|---|---|---|
external |
boolean |
Задайте false для локальных или самостоятельно размещённых провайдеров, которые никогда не должны получать цены OpenRouter или LiteLLM. |
openRouter |
false | object |
Сопоставление для поиска цен OpenRouter. false отключает поиск в OpenRouter для этого провайдера. |
liteLLM |
false | object |
Сопоставление для поиска цен LiteLLM. false отключает поиск в LiteLLM для этого провайдера. |
Поля источника:
| Поле | Тип | Что означает |
|---|---|---|
provider |
string |
Идентификатор провайдера во внешнем каталоге, если он отличается от идентификатора провайдера OpenClaw, например z-ai для провайдера zai. |
passthroughProviderModel |
boolean |
Интерпретировать идентификаторы моделей, содержащие косую черту, как вложенные ссылки вида провайдер/модель; полезно для прокси-провайдеров, таких как OpenRouter. |
modelIdTransforms |
"version-dots"[] |
Дополнительные варианты идентификаторов моделей во внешнем каталоге. version-dots проверяет идентификаторы версий с точками, например claude-opus-4.6. |
Индекс провайдеров OpenClaw
Индекс провайдеров OpenClaw — это принадлежащие OpenClaw предварительные метаданные для провайдеров, плагины которых ещё могут быть не установлены. Он не является частью манифеста плагина. Манифесты плагинов остаются авторитетным источником сведений об установленных плагинах. Индекс провайдеров — это внутренний резервный контракт, который будущие интерфейсы устанавливаемых провайдеров и выбора моделей перед установкой будут использовать, когда плагин провайдера не установлен.
Порядок приоритета источников каталога:
- Пользовательская конфигурация.
- Манифест установленного плагина
modelCatalog. - Кэш каталога моделей, полученный при явном обновлении.
- Предварительные строки Индекса провайдеров OpenClaw.
Индекс провайдеров не должен содержать секреты, состояние включения, хуки среды выполнения или актуальные данные моделей, относящиеся к конкретной учётной записи. Его предварительные каталоги используют ту же структуру строки провайдера modelCatalog, что и манифесты плагинов, но должны ограничиваться стабильными отображаемыми метаданными, если только поля адаптера среды выполнения, такие как api, baseUrl, цены или флаги совместимости, намеренно не синхронизируются с манифестом установленного плагина. Провайдеры с динамическим обнаружением /models должны записывать обновлённые строки через явный путь кэша каталога моделей, а не вызывать API провайдера при обычном выводе списка или первоначальной настройке.
Записи Индекса провайдеров также могут содержать метаданные устанавливаемого плагина для провайдеров, чей плагин был вынесен из ядра или ещё не установлен по иной причине. Эти метаданные соответствуют шаблону каталога каналов: имени пакета, спецификации установки npm, ожидаемой целостности и простых меток вариантов аутентификации достаточно для отображения устанавливаемого варианта настройки. После установки плагина его манифест получает приоритет, а запись Индекса провайдеров для этого провайдера игнорируется.
openclaw doctor --fix переносит небольшой закрытый набор устаревших ключей возможностей верхнего уровня манифеста в contracts.*: speechProviders, mediaUnderstandingProviders, imageGenerationProviders и tools. Ни они, ни какие-либо другие списки возможностей больше не считываются как поля верхнего уровня манифеста; при обычной загрузке манифеста они распознаются только внутри contracts.
Манифест и package.json
Эти два файла выполняют разные задачи:
| Файл | Для чего использовать |
|---|---|
openclaw.plugin.json |
Обнаружение, проверка конфигурации, метаданные вариантов аутентификации и подсказки интерфейса, которые должны быть доступны до запуска кода плагина |
package.json |
Метаданные npm, установка зависимостей и блок openclaw, используемый для точек входа, условий установки, настройки или метаданных каталога |
Если неизвестно, где должны находиться метаданные, используйте следующее правило:
- если OpenClaw должен знать их до загрузки кода плагина, поместите их в
openclaw.plugin.json - если они относятся к упаковке, файлам точек входа или поведению установки npm, поместите их в
package.json
Поля package.json, влияющие на обнаружение
Некоторые метаданные плагина, необходимые до запуска среды выполнения, намеренно находятся в package.json внутри блока openclaw, а не в openclaw.plugin.json. openclaw.bundle и openclaw.bundle.json не являются контрактами плагинов OpenClaw; нативные плагины должны использовать openclaw.plugin.json вместе с поддерживаемыми полями package.json#openclaw, перечисленными ниже.
Важные примеры:
| Поле | Что означает |
|---|---|
openclaw.extensions |
Объявляет нативные точки входа плагина. Они должны находиться внутри каталога пакета плагина. |
openclaw.runtimeExtensions |
Объявляет точки входа в собранную среду выполнения JavaScript для установленных пакетов. Они должны находиться внутри каталога пакета плагина. |
openclaw.setupEntry |
Облегчённая точка входа только для настройки, используемая при первоначальной настройке, отложенном запуске канала и обнаружении состояния канала/SecretRef в режиме только для чтения. Она должна находиться внутри каталога пакета плагина. |
openclaw.runtimeSetupEntry |
Объявляет точку входа в собранный модуль настройки JavaScript для установленных пакетов. Требует setupEntry, должна существовать и находиться внутри каталога пакета плагина. |
openclaw.channel |
Легковесные метаданные каталога каналов, такие как метки, пути к документации, псевдонимы и текст вариантов выбора. |
openclaw.channel.commands |
Статические метаданные автоматических значений по умолчанию для нативных команд и нативных Skills, используемые в конфигурации, аудите и интерфейсах списков команд до загрузки среды выполнения канала. |
openclaw.channel.configuredState |
Метаданные легковесной проверки настроенного состояния, позволяющей без загрузки полной среды выполнения канала ответить на вопрос «существует ли уже настройка только через переменные окружения?». |
openclaw.channel.persistedAuthState |
Метаданные легковесной проверки сохранённой аутентификации, позволяющей без загрузки полной среды выполнения канала ответить на вопрос «выполнен ли уже где-либо вход?». |
openclaw.install.clawhubSpec / openclaw.install.npmSpec / openclaw.install.localPath |
Подсказки по установке и обновлению встроенных и опубликованных отдельно плагинов. |
openclaw.install.defaultChoice |
Предпочтительный способ установки при наличии нескольких источников установки. |
openclaw.install.minHostVersion |
Минимальная поддерживаемая версия хоста OpenClaw, заданная нижней границей semver, например >=2026.3.22 или >=2026.5.1-beta.1. |
openclaw.compat.pluginApi |
Минимальный диапазон API плагинов OpenClaw, требуемый этим пакетом, заданный нижней границей semver, например >=2026.5.27. |
openclaw.install.expectedIntegrity |
Ожидаемая строка целостности npm dist, например sha512-...; процессы установки и обновления сверяют с ней полученный артефакт. |
openclaw.install.allowInvalidConfigRecovery |
Разрешает узкий сценарий восстановления путём повторной установки встроенного плагина при недопустимой конфигурации. |
openclaw.install.requiredPlatformPackages |
Псевдонимы пакетов npm, которые должны быть установлены, если их платформенные ограничения в lock-файле соответствуют текущему хосту. |
openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen |
Позволяет интерфейсам канала среды настройки загружаться до начала прослушивания, а затем откладывает загрузку полного настроенного плагина канала до активации после начала прослушивания. |
Метаданные манифеста определяют, какие варианты провайдеров, каналов и настройки отображаются при первоначальной настройке до загрузки среды выполнения. package.json#openclaw.install указывает первоначальной настройке, как получить или включить этот плагин, когда пользователь выбирает один из таких вариантов. Не переносите подсказки по установке в openclaw.plugin.json.
openclaw.install.minHostVersion проверяется при установке и загрузке реестра манифестов для источников невстроенных плагинов. Недопустимые значения отклоняются; более новые, но допустимые значения приводят к пропуску внешних плагинов на старых хостах. Предполагается, что встроенные плагины из исходного кода имеют ту же версию, что и рабочая копия хоста.
openclaw.install.requiredPlatformPackages предназначен для пакетов npm, предоставляющих необходимые нативные двоичные файлы через необязательные платформенные псевдонимы. Укажите простое имя пакета npm для каждого поддерживаемого платформенного псевдонима. При установке через npm OpenClaw проверяет только объявленный псевдоним, ограничения которого в lock-файле соответствуют текущему хосту. Если npm сообщает об успехе, но не устанавливает этот псевдоним, OpenClaw повторяет попытку один раз с чистым кэшем и откатывает установку, если псевдоним по-прежнему отсутствует.
openclaw.compat.pluginApi проверяется во время установки пакета для источников невстроенных плагинов. Используйте его для указания нижней границы API SDK/среды выполнения плагинов OpenClaw, на основе которой был собран пакет. Она может быть строже, чем minHostVersion, если пакету плагина требуется более новый API, но для других процессов необходимо сохранить более низкую подсказку по установке. Официальная синхронизация выпусков OpenClaw по умолчанию повышает существующие нижние границы API официальных плагинов до версии выпуска OpenClaw, однако выпуски только плагинов могут сохранять более низкую границу, если пакет намеренно поддерживает старые хосты. Не используйте только версию пакета в качестве контракта совместимости. peerDependencies.openclaw остаётся метаданными пакета npm; OpenClaw использует контракт openclaw.compat.pluginApi для принятия решений о совместимости при установке.
Официальные метаданные установки по требованию должны использовать clawhubSpec, если плагин опубликован в ClawHub; первоначальная настройка считает его предпочтительным удалённым источником и записывает сведения об артефакте ClawHub после установки. npmSpec остаётся резервным вариантом совместимости для пакетов, которые ещё не перенесены в ClawHub.
Точная фиксация версии npm уже задаётся в npmSpec, например "npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3". Официальные записи внешнего каталога должны сочетать точные спецификации с expectedIntegrity, чтобы процессы обновления завершались с ошибкой, если полученный артефакт npm больше не соответствует зафиксированному выпуску. Интерактивная первоначальная настройка для совместимости по-прежнему предлагает доверенные спецификации npm из реестра, включая простые имена пакетов и dist-теги. Диагностика каталога может различать точные, плавающие, закреплённые по целостности, не имеющие данных о целостности, содержащие несовпадение имени пакета и недопустимые источники выбора по умолчанию. Она также предупреждает, если присутствует expectedIntegrity, но отсутствует допустимый источник npm, который можно закрепить. Если присутствует expectedIntegrity, процессы установки и обновления проверяют его; если он отсутствует, результат разрешения через реестр записывается без закрепления по целостности.
Плагины каналов должны предоставлять openclaw.setupEntry, если проверкам состояния, списка каналов или SecretRef необходимо выявлять настроенные учётные записи без загрузки полной среды выполнения. Точка входа настройки должна предоставлять метаданные канала, а также безопасные для настройки адаптеры конфигурации, состояния и секретов; сетевые клиенты, слушатели Gateway и транспортные среды выполнения следует оставить в основной точке входа расширения.
Поля точек входа среды выполнения не отменяют проверок границ пакета для полей точек входа исходного кода. Например, openclaw.runtimeExtensions не может сделать загружаемым путь openclaw.extensions, выходящий за границы пакета.
openclaw.install.allowInvalidConfigRecovery намеренно имеет узкую область применения. Он не позволяет устанавливать произвольные пакеты с нарушенной конфигурацией. Сейчас он лишь позволяет процессам установки восстанавливаться после определённых сбоев обновления устаревших встроенных плагинов, например при отсутствии пути к встроенному плагину или наличии устаревшей записи channels.<id> для того же встроенного плагина. Несвязанные ошибки конфигурации по-прежнему блокируют установку и направляют операторов к openclaw doctor --fix.
openclaw.channel.persistedAuthState — это метаданные пакета для небольшого модуля проверки:
{ "openclaw": { "channel": { "id": "whatsapp", "persistedAuthState": { "specifier": "./auth-presence", "exportName": "hasAnyWhatsAppAuth" } } }}Используйте их, когда настройке, doctor, состоянию или потокам проверки наличия в режиме только для чтения требуется дешёвая проверка аутентификации с ответом «да/нет» до загрузки полного плагина канала. Сохранённое состояние аутентификации не является настроенным состоянием канала: не используйте эти метаданные для автоматического включения плагинов, исправления зависимостей среды выполнения или определения необходимости загрузки среды выполнения канала. Целевой экспорт должен быть небольшой функцией, которая только читает сохранённое состояние; не направляйте его через полный публичный модуль среды выполнения канала.
openclaw.channel.configuredState поддерживает быстрые проверки настроенности. Если переменных окружения достаточно, предпочитайте декларативные метаданные окружения:
{ "openclaw": { "channel": { "id": "telegram", "configuredState": { "env": { "allOf": ["TELEGRAM_BOT_TOKEN"] } } } }}Используйте env.allOf, когда требуются все перечисленные переменные, и env.anyOf, когда достаточно любой одной непустой переменной. Если небольшой проверке вне среды выполнения требуется больше, чем метаданные окружения, используйте specifier вместе с exportName, как показано для persistedAuthState; при наличии env OpenClaw использует его без загрузки этого модуля. Если проверке требуется полное разрешение конфигурации или настоящая среда выполнения канала, оставьте эту логику в обработчике config.hasConfiguredState плагина.
Приоритет обнаружения (повторяющиеся идентификаторы плагинов)
OpenClaw обнаруживает плагины в трёх корневых каталогах, проверяемых в следующем порядке: встроенные плагины, поставляемые с OpenClaw, глобальный корневой каталог установки (~/.openclaw/extensions) и корневой каталог текущего рабочего пространства (<workspace>/.openclaw/extensions), а также все явные записи plugins.load.paths.
Если результаты двух обнаружений имеют одинаковый id, сохраняется только манифест с наивысшим приоритетом; дубликаты с более низким приоритетом отбрасываются, а не загружаются рядом с ним. Приоритет от высшего к низшему:
- Выбранный конфигурацией — путь, явно закреплённый в
plugins.entries.<id> - Глобальная установка, соответствующая отслеживаемой записи установки — плагин, установленный через
openclaw plugin install/openclaw plugin update, который система отслеживания установок OpenClaw распознаёт для того же идентификатора, даже если этот идентификатор также принадлежит встроенному плагину - Встроенный — плагины, поставляемые с OpenClaw
- Рабочее пространство — плагины, обнаруженные относительно текущего рабочего пространства
- Любой другой обнаруженный кандидат
Следствия:
- Ответвлённая или устаревшая копия встроенного плагина, находящаяся без отслеживания в рабочем пространстве или глобальном корневом каталоге, не затенит встроенную сборку.
- Чтобы переопределить встроенный плагин, либо выполните
openclaw plugin installдля этого идентификатора, чтобы отслеживаемая глобальная установка получила приоритет над встроенной копией, либо закрепите конкретный путь черезplugins.entries.<id>, чтобы он победил благодаря приоритету выбранного конфигурацией варианта. - Отбрасывание дубликатов записывается в журнал, чтобы Doctor и диагностика запуска могли указать на отброшенную копию.
- Переопределения дубликатов, выбранные конфигурацией, описываются в диагностике как явные переопределения, но предупреждение всё равно выводится, чтобы устаревшие ответвления и случайные затенения оставались заметными.
Требования JSON Schema
- Каждый плагин должен поставляться с JSON Schema, даже если он не принимает конфигурацию.
- Допускается пустая схема (например,
{ "type": "object", "additionalProperties": false }). - Схемы проверяются при чтении и записи конфигурации, а не во время выполнения.
- При расширении или создании форка встроенного плагина с новыми ключами конфигурации одновременно обновите
openclaw.plugin.jsonconfigSchemaэтого плагина. Схемы встроенных плагинов строгие, поэтому добавлениеplugins.entries.<id>.config.myNewKeyв пользовательскую конфигурацию без добавленияmyNewKeyвconfigSchema.propertiesбудет отклонено до загрузки среды выполнения плагина.
Пример расширения схемы:
{ "configSchema": { "type": "object", "additionalProperties": false, "properties": { "myNewKey": { "type": "string" } } }}Поведение при проверке
- Неизвестные ключи
channels.*считаются ошибками, если идентификатор канала не объявлен в манифесте плагина. Если тот же идентификатор также присутствует вplugins.allow,plugins.entriesилиplugins.installs(упомянутый в конфигурации плагин, который в данный момент невозможно обнаружить), OpenClaw вместо этого понижает уровень проблемы до предупреждения. - Ссылки на неизвестные идентификаторы плагинов в
plugins.entries.<id>,plugins.allowиplugins.denyсчитаются предупреждениями («устаревшая запись конфигурации проигнорирована»), а не ошибками, поэтому обновления и удалённые или переименованные плагины не блокируют запуск Gateway. - Ссылка на неизвестный идентификатор плагина в
plugins.slots.memoryсчитается ошибкой, за исключением известного официального внешнего плагинаmemory-lancedb, для которого вместо этого выдаётся предупреждение. - Если плагин установлен, но его манифест или схема повреждены либо отсутствуют, проверка завершается ошибкой, а Doctor сообщает об ошибке плагина.
- Если конфигурация плагина существует, но плагин отключён, конфигурация сохраняется, а в Doctor и журналах отображается предупреждение.
Полную схему plugins.* см. в справочнике по конфигурации.
Примечания
- Манифест обязателен для нативных плагинов OpenClaw, включая загружаемые из локальной файловой системы. Среда выполнения по-прежнему загружает модуль плагина отдельно; манифест используется только для обнаружения и проверки.
- Нативные манифесты разбираются как JSON5, поэтому допускаются комментарии, завершающие запятые и ключи без кавычек, если итоговое значение остаётся объектом.
- Загрузчик манифестов считывает только документированные поля манифеста. Не используйте нестандартные ключи верхнего уровня.
channels,providers,cliBackendsиskillsможно не указывать, если они не нужны плагину.providerCatalogEntryдолжен оставаться легковесным и не должен импортировать обширный код среды выполнения; используйте его для статических метаданных каталога провайдера или узкоспециализированных дескрипторов обнаружения, а не для выполнения во время обработки запросов.- Взаимоисключающие типы плагинов выбираются через
plugins.slots.*:kind: "memory"черезplugins.slots.memory(по умолчаниюmemory-core),kind: "context-engine"черезplugins.slots.contextEngine(по умолчаниюlegacy). - Объявляйте взаимоисключающий тип плагина в этом манифесте.
OpenClawPluginDefinition.kindв точке входа среды выполнения устарел и сохраняется только как резервный механизм совместимости со старыми плагинами. - Метаданные переменных среды (
setup.providers[].envVars, устаревшийproviderAuthEnvVarsиchannelEnvVars) носят исключительно декларативный характер. Состояние, аудит, проверка доставки Cron и другие поверхности только для чтения по-прежнему применяют политику доверия к плагину и его фактической активации, прежде чем считать переменную среды настроенной. - Метаданные мастера среды выполнения, для которых требуется код провайдера, описаны в разделе Перехватчики среды выполнения провайдера.
- Если плагин зависит от нативных модулей, документируйте этапы сборки и все требования к списку разрешений менеджера пакетов (например, pnpm
allow-build-scripts+pnpm rebuild <package>).