На этой странице
На этой странице
Building plugins
Создание плагинов бэкенда CLI
Плагины серверной части CLI позволяют OpenClaw вызывать локальный CLI ИИ в качестве серверной части для текстового инференса. Серверная часть отображается как префикс провайдера в ссылках на модели:
Используйте серверную часть CLI, если интеграция с вышестоящей системой уже доступна в виде локальной команды, если CLI управляет локальным состоянием входа или как резервный вариант, когда API провайдеров недоступны.
За что отвечает плагин
Плагин серверной части CLI имеет три контракта:
| Контракт | Файл | Назначение |
|---|---|---|
| Точка входа пакета | package.json |
Указывает OpenClaw на модуль среды выполнения плагина |
| Владение манифестом | openclaw.plugin.json |
Объявляет идентификатор серверной части до загрузки среды выполнения |
| Регистрация среды выполнения | index.ts |
Вызывает api.registerCliBackend(...) со значениями команды по умолчанию |
Манифест представляет собой метаданные обнаружения: он не запускает CLI и не регистрирует
поведение среды выполнения. Поведение среды выполнения начинается, когда точка входа плагина вызывает
api.registerCliBackend(...).
Минимальный плагин серверной части
Создайте метаданные пакета
Опубликованные пакеты должны включать собранные файлы среды выполнения JavaScript. Если точкой входа
исходного кода служит ./src/index.ts, добавьте openclaw.runtimeExtensions, указывающий на
соответствующий собранный файл JavaScript. См. раздел Точки входа.
Объявите владение серверной частью
cliBackends — это список владения средой выполнения; он позволяет OpenClaw автоматически загружать
плагин, когда в конфигурации или при выборе модели упоминается acme-cli/....
setup.cliBackends — это поверхность настройки, основанная прежде всего на дескрипторах. Добавьте её, если
обнаружение моделей, первоначальная настройка или состояние должны распознавать серверную часть
без загрузки среды выполнения плагина. Используйте requiresRuntime: false, только если
для настройки достаточно этих статических дескрипторов.
Зарегистрируйте серверную часть
Идентификатор серверной части должен соответствовать записи cliBackends в манифесте.
Зарегистрированная config является лишь значением по умолчанию; пользовательская конфигурация в
agents.defaults.cliBackends.acme-cli объединяется с ней во время выполнения и имеет приоритет.
Структура конфигурации
CliBackendConfig описывает, как OpenClaw должен запускать CLI и разбирать его вывод:
| Поле | Назначение |
|---|---|
command |
Имя исполняемого файла или абсолютный путь к команде |
args |
Базовый набор аргументов для новых запусков |
resumeArgs |
Альтернативный набор аргументов для возобновлённых сеансов; поддерживает {sessionId} |
output / resumeOutput |
Парсер: json, jsonl или text |
jsonlDialect |
Диалект событий JSONL: claude-stream-json или gemini-stream-json |
liveSession |
Режим долгоживущего процесса CLI (claude-stdio) |
input |
Способ передачи запроса: arg или stdin |
maxPromptArgChars |
Максимальная длина запроса в режиме arg до перехода на стандартный ввод |
env / clearEnv |
Дополнительные переменные среды для добавления или имена переменных, удаляемых перед запуском |
modelArg |
Флаг, используемый перед идентификатором модели |
modelAliases |
Сопоставление идентификаторов моделей OpenClaw с нативными идентификаторами CLI |
sessionArg / sessionArgs |
Способ передачи идентификатора сеанса |
sessionMode |
always, existing или none |
sessionIdFields |
Поля JSON, которые OpenClaw считывает из вывода CLI |
systemPromptArg / systemPromptFileArg |
Способ передачи системного запроса |
systemPromptFileConfigArg / systemPromptFileConfigKey |
Способ передачи переопределения конфигурации для файла системного запроса (например, -c) |
systemPromptMode |
append или replace |
systemPromptWhen |
first, always или never |
imageArg / imageMode |
Флаг пути к изображению и способ передачи нескольких изображений (repeat или list) |
imagePathScope |
Место хранения подготовленных файлов изображений до передачи: temp или workspace |
serialize |
Сохранять порядок запусков одной серверной части |
reseedFromRawTranscriptWhenUncompacted |
Включить ограниченное повторное заполнение из необработанной расшифровки перед Compaction для безопасного сброса сеансов |
reliability.outputLimits |
Максимальное число символов/строк необработанного JSONL, сохраняемых для одного текущего обращения к CLI (серверные части с активными сеансами) |
reliability.watchdog |
Настройка тайм-аута при отсутствии вывода отдельно для новых и возобновлённых запусков |
Предпочитайте минимальную статическую конфигурацию, соответствующую CLI. Добавляйте обратные вызовы плагина только для поведения, которое действительно относится к серверной части.
Расширенные хуки серверной части
CliBackendPlugin также может определять:
| Хук | Назначение |
|---|---|
normalizeConfig(config, context) |
Перезаписать устаревшую пользовательскую конфигурацию после объединения |
resolveExecutionArgs(ctx) |
Добавить флаги уровня запроса, например интенсивность рассуждений или изоляцию побочных вопросов |
prepareExecution(ctx) |
Создать временные мосты аутентификации, конфигурации или среды перед запуском |
transformSystemPrompt(ctx) |
Применить окончательное преобразование системного запроса для конкретного CLI |
textTransforms |
Двунаправленные замены в запросах и выводе |
defaultAuthProfileId |
Предпочесть определённый профиль аутентификации OpenClaw |
authEpochMode |
Определить, как изменения аутентификации делают сохранённые сеансы CLI недействительными |
nativeToolMode |
Объявить, отсутствуют ли нативные инструменты, всегда ли они включены или могут выбираться хостом |
sideQuestionToolMode |
Объявить отключённые нативные инструменты для побочных вопросов /btw |
bundleMcp / bundleMcpMode |
Включить мост инструментов MCP OpenClaw через обратную петлю |
ownsNativeCompaction |
Серверная часть самостоятельно выполняет Compaction — OpenClaw откладывает её |
runtimeArtifact |
Ограничить средство запуска сценария полным деревом его комплектного пакета |
Эти хуки должны оставаться в ведении провайдера. Не добавляйте специфичные для CLI ветви в ядро, если поведение можно выразить через хук серверной части.
prepareExecution(ctx) получает ctx.contextTokenBudget — эффективный лимит токенов,
выбранный для запуска. Серверные части, самостоятельно выполняющие нативную Compaction, могут преобразовать этот
бюджет в свой контракт запуска CLI.
runtimeArtifact принадлежит плагину и не может быть переопределён пользователем. Он проверяется
только тогда, когда рабочий цикл инференса создаёт или повторно проверяет подтверждённые полномочия настройки;
обычные запуски CLI не требуют его. Бэкенд без этого объявления не может
создавать подтверждённые полномочия настройки CLI. Объявление bundled-package-tree указывает
точного владельца package.json и требует, чтобы точкой входа пакета была
команда. OpenClaw хеширует ограниченное полное дерево установленного пакета, включая
вложенные зависимости, и блокирует выполнение при перенаправляющих символических ссылках,
запускателях за пределами объявленного пакета, объявлениях обязательных внешних
зависимостей, слишком больших деревьях и неизвестных скриптах. Объявляйте это только тогда, когда
дерево содержит полную реализацию инференса; необязательные интеграции инструментов
не делают внешний граф реализации безопасным.
Если тот же бэкенд также поставляет самодостаточный нативный исполняемый файл, перечислите его
канонические базовые имена в nativeExecutableNames. Другие нативные команды остаются
неподтверждёнными, даже когда пользователь переопределяет команду бэкенда.
ctx.executionMode имеет значение "agent" для обычных циклов и "side-question" для
эфемерных вызовов /btw. Используйте его, когда CLI требуются другие одноразовые флаги,
например для отключения нативных инструментов, сохранения сеанса или возобновления работы
для BTW. Если у бэкенда обычно есть nativeToolMode: "always-on", но его
аргументы командной строки для побочного вопроса надёжно отключают эти инструменты, также задайте
sideQuestionToolMode: "disabled"; иначе OpenClaw блокирует выполнение, когда для BTW
требуется запуск CLI без инструментов.
Задавайте nativeToolMode: "selectable" только тогда, когда resolveExecutionArgs может отключить
все нативные инструменты бэкенда для отдельного запуска. Для таких ограниченных запусков
ctx.toolAvailability.native является пустым кортежем, а
ctx.toolAvailability.mcp — точным списком разрешённых MCP с изоляцией на стороне хоста. Хук
должен заменять конфликтующие флаги инструментов и возвращать аргументы командной строки, обеспечивающие оба значения;
OpenClaw вызывает его один раз с окончательными аргументами нового или возобновляемого запуска и блокирует выполнение, если
бэкенд не может обеспечить соблюдение ограничения. Имена MCP в этом контексте можно
безопасно подтверждать автоматически только потому, что хост уже ограничил создаваемую конфигурацию MCP
этими серверами и инструментами.
ownsNativeCompaction: отказ от Compaction OpenClaw
Если ваш бэкенд запускает агента, который выполняет Compaction собственной расшифровки, задайте
ownsNativeCompaction: true, чтобы защитный суммаризатор OpenClaw никогда не запускался
для его сеансов: жизненный цикл Compaction CLI ничего не делает, и
цикл продолжается. claude-cli объявляет это, поскольку Claude Code выполняет Compaction
внутренне, без конечной точки среды выполнения. Сеансы нативной среды выполнения, такие как Codex,
вместо этого продолжают направляться к конечной точке Compaction своей среды выполнения.
Объявляйте это, только если выполняются все следующие условия, иначе отложенный сеанс с превышенным бюджетом может остаться за пределами бюджета или устареть (OpenClaw больше не восстанавливает его):
- бэкенд надёжно выполняет Compaction или ограничивает собственную расшифровку по мере приближения к пределу контекстного окна;
- он сохраняет возобновляемый сеанс, чтобы состояние после Compaction сохранялось между циклами
(например,
--resume/--session-id); - это не сеанс Compaction нативной среды выполнения: соответствующие сеансы
agentHarnessIdвместо этого направляются к конечной точке среды выполнения.
Мост инструментов MCP
По умолчанию бэкенды CLI не получают инструменты OpenClaw. Если CLI может использовать конфигурацию MCP, включите эту возможность явно:
Поддерживаемые режимы моста:
| Режим | Применение |
|---|---|
claude-config-file |
CLI, принимающие файл конфигурации MCP |
codex-config-overrides |
CLI, принимающие переопределения конфигурации в аргументах командной строки |
gemini-system-settings |
CLI, считывающие настройки MCP из каталога системных настроек |
Включайте мост только тогда, когда CLI действительно может его использовать. Если у CLI есть
собственный встроенный слой инструментов, который нельзя отключить, задайте nativeToolMode: "always-on", чтобы OpenClaw мог блокировать выполнение, когда вызывающей стороне требуется отсутствие нативных
инструментов. Если CLI может отключить все нативные инструменты для отдельного запуска, используйте "selectable" с
контрактом resolveExecutionArgs, описанным выше.
Пользовательская конфигурация
Пользователи могут переопределить любое значение бэкенда по умолчанию:
Документируйте минимальное переопределение, которое, вероятнее всего, потребуется пользователям, — обычно только
command, когда исполняемый файл находится за пределами PATH.
Проверка
Для встроенных плагинов добавьте целевой тест построителя и регистрации настройки, затем запустите целевой набор тестов плагина:
Для локальных или установленных плагинов проверьте обнаружение и один реальный запуск модели:
Если бэкенд поддерживает изображения или MCP, добавьте проверочный запуск, подтверждающий эти пути с реальным CLI. Не полагайтесь на статическую проверку поведения запросов, изображений, MCP или возобновления сеанса.
Контрольный список
Связанные материалы
- Бэкенды CLI — пользовательская конфигурация и поведение среды выполнения
- Создание плагинов — основы пакетов и манифестов
- Обзор SDK плагинов — справочник по API регистрации
- Манифест плагина —
cliBackendsи дескрипторы настройки - Среда выполнения агента — полноценные внешние среды выполнения агентов