Skip to main content
Справочник по объекту api.runtime, внедряемому в каждый плагин при регистрации. Используйте эти вспомогательные средства вместо прямого импорта внутренних компонентов хоста.

Плагины каналов

Пошаговое руководство по использованию этих вспомогательных средств в контексте плагинов каналов.

Плагины провайдеров

Пошаговое руководство по использованию этих вспомогательных средств в контексте плагинов провайдеров.
api.runtime.version — текущая версия продукта OpenClaw, полученная из общего средства определения версии, поэтому плагины видят то же значение, которое сообщает CLI.

Загрузка и запись конфигурации

Предпочитайте конфигурацию, уже переданную в активный путь вызова, например api.config при регистрации или аргумент cfg в обратных вызовах канала или провайдера. Это позволяет использовать один снимок процесса на протяжении всей операции вместо повторного разбора конфигурации в часто выполняемых путях. Используйте api.runtime.config.current() только тогда, когда долгоживущему обработчику нужен текущий снимок процесса, а конфигурация не была передана этой функции. Возвращаемое значение доступно только для чтения; перед редактированием клонируйте его или используйте вспомогательное средство изменения. Фабрики инструментов получают ctx.runtimeConfig вместе с ctx.getRuntimeConfig(). Используйте функцию получения внутри обратного вызова execute долгоживущего инструмента, если конфигурация может измениться после создания определения инструмента. Сохраняйте изменения с помощью api.runtime.config.mutateConfigFile(...) или api.runtime.config.replaceConfigFile(...). Для каждой записи необходимо выбрать явную политику afterWrite:
  • afterWrite: { mode: "auto" } позволяет планировщику перезагрузки Gateway принять решение.
  • afterWrite: { mode: "restart", reason: "..." } принудительно выполняет чистый перезапуск, когда выполняющий запись компонент знает, что горячая перезагрузка небезопасна.
  • afterWrite: { mode: "none", reason: "..." } подавляет автоматическую перезагрузку или перезапуск только тогда, когда вызывающая сторона отвечает за последующие действия.
Вспомогательные средства изменения возвращают afterWrite вместе с типизированной сводкой followUp, чтобы вызывающие стороны могли журналировать или проверять, запросили ли они перезапуск. Gateway по-прежнему определяет, когда этот перезапуск фактически произойдёт.
api.runtime.config.loadConfig() и api.runtime.config.writeConfigFile(...) устарели. Во время выполнения они однократно выводят предупреждение для каждого плагина и остаются доступными только для старых внешних плагинов в течение периода миграции. Встроенные плагины не должны их использовать: внутренняя проверка границ конфигурации приводит к сбою сборки, если код плагина вызывает их или импортирует эти вспомогательные средства из подпутей SDK плагинов. Вместо них используйте current(), переданный cfg, mutateConfigFile(...) или replaceConfigFile(...).
При прямом импорте из SDK предпочитайте специализированные подпути конфигурации общему совместимому модулю openclaw/plugin-sdk/config-runtime: config-contracts для типов, plugin-config-runtime для проверок уже загруженной конфигурации и поиска точки входа плагина, runtime-config-snapshot для текущих снимков процесса и config-mutation для записи. Тесты встроенных плагинов должны напрямую имитировать эти специализированные подпути вместо общего совместимого модуля. Внутренний код среды выполнения OpenClaw следует тому же подходу: загружает конфигурацию один раз на границе CLI, Gateway или процесса, а затем передаёт это значение дальше. Успешная запись изменений обновляет снимок конфигурации среды выполнения процесса и увеличивает его внутреннюю ревизию; долгоживущие кеши должны использовать ключ кеша, принадлежащий среде выполнения, вместо локальной сериализации конфигурации. Для долгоживущих модулей среды выполнения действует сканер с нулевой терпимостью к фоновым вызовам loadConfig(); используйте переданный cfg, context.getRuntimeConfig() запроса или getRuntimeConfig() на явно заданной границе процесса. Пути выполнения провайдера и канала должны использовать активный снимок конфигурации среды выполнения, а не снимок файла, возвращаемый для чтения или редактирования конфигурации. Снимки файлов сохраняют исходные значения, например маркеры SecretRef, для пользовательского интерфейса и записи; обратным вызовам провайдера требуется разрешённое представление среды выполнения. Если вспомогательное средство может вызываться как с активным исходным снимком, так и с активным снимком среды выполнения, перед чтением учётных данных направляйте вызов через selectApplicableRuntimeConfig().

Повторно используемые утилиты среды выполнения

Используйте входящие факты botLoopProtection для входящих сообщений, созданных ботами. Ядро применяет общую скользящую оконную защиту в памяти до записи сеанса и диспетчеризации, не привязывая политику к одному каналу. Защита отслеживает ключи (scopeId, conversationId, participant pair), совместно подсчитывает оба направления пары, применяет период ожидания после превышения лимита окна и при удобном случае удаляет неактивные записи. Плагины каналов, предоставляющие операторам доступ к этому поведению, должны предпочитать общую структуру channels.defaults.botLoopProtection для базовых лимитов, а затем накладывать поверх неё переопределения, специфичные для канала или провайдера. Общая конфигурация использует секунды, поскольку она предназначена для пользователей:
Передавайте нормализованные данные о паре ботов вместе с разрешённым ходом. Ядро определяет значения по умолчанию, преобразование единиц и семантику enabled:
Используйте openclaw/plugin-sdk/pair-loop-guard-runtime напрямую только для пользовательских двусторонних циклов событий, которые не проходят через общий обработчик входящих ответов.

Пространства имён среды выполнения

Идентификация агента, каталоги и управление сеансами.
runEmbeddedAgent(...) — нейтральное вспомогательное средство для запуска обычного хода агента OpenClaw из кода плагина. Оно использует те же механизмы определения провайдера и модели, а также выбора среды агента, что и ответы, инициированные каналом.runEmbeddedPiAgent(...) сохраняется как устаревший псевдоним совместимости для существующих плагинов. В новом коде следует использовать runEmbeddedAgent(...).resolveThinkingPolicy(...) возвращает поддерживаемые провайдером и моделью уровни рассуждения и необязательное значение по умолчанию. Плагины провайдеров управляют профилем конкретной модели через свои перехватчики рассуждения, поэтому плагины инструментов должны вызывать это вспомогательное средство среды выполнения вместо импорта или дублирования списков провайдера.normalizeThinkingLevel(...) преобразует пользовательский текст, например on, x-high или extra high, в канонический сохраняемый уровень перед его проверкой по определённой политике.Вспомогательные средства хранилища сеансов находятся в api.runtime.agent.session:
Для рабочих процессов сеансов предпочитайте getSessionEntry(...), listSessionEntries(...), patchSessionEntry(...) или upsertSessionEntry(...). Эти вспомогательные средства адресуют сеансы по идентификаторам агента и сеанса, чтобы плагины не зависели от устаревшей структуры хранения sessions.json. Используйте preserveActivity: true для изменений только метаданных, которые не должны обновлять активность сеанса, а replaceEntry: true — только когда обратный вызов возвращает полную запись и удалённые поля должны оставаться удалёнными. Пути диагностики и миграции могут сочетать fallbackEntry, skipMaintenance и requireWriteSuccess для одного атомарного исправления канонического хранилища.createSessionEntry(...) создаёт новую каноническую строку сеанса и расшифровку. Его доверенная поверхность initialEntry намеренно ограничена: непустой agentHarnessId, необязательный modelSelectionLocked: true и необязательный pluginExtensions. Внедрённая среда выполнения принимает только идентификаторы сред, принадлежащих вызывающему плагину через registerAgentHarness(...); это инвариант владения, а не песочница между плагинами внутри одного процесса. Она отклоняет существующую строку; label и spawnedCwd являются отдельными полями создания, а не доверенными изменениями записи.Во время создания блокировка изменений жизненного цикла сеанса удерживается через afterCreate, поэтому новая работа ожидает завершения инициализации, принадлежащей плагину, а наличие ранее допущенной работы приводит к сбою создания. Обратный вызов получает клон созданного состояния. Если он возвращает изменение, оно может содержать только pluginExtensions, а его значение представляет собой полное итоговое поле pluginExtensions. Сбой обратного вызова или окончательного сохранения откатывает неизменённую новую строку и расшифровку; защищённый откат сохраняет строку, изменённую или занятую параллельно. recoverMatchingInitialEntry: true предназначен только для повторной попытки прерванной инициализации, когда сохранённые доверенные поля точно совпадают, а для восстановления требуется, чтобы afterCreate вернул итоговое изменение.Используйте runWithWorkAdmission(...), когда плагин начинает работу с сохранённым сеансом. Обратный вызов отклоняет архивированные или параллельно заменённые сеансы, обеспечивает координацию операций архивирования, сброса и удаления до завершения и получает AbortSignal, который необходимо передать запуску агента. Среда может явно указывать доверенных делегатов выполнения через своё экспериментальное поле регистрации delegatedExecutionPluginIds. Делегаты могут допускать и выполнять только точно соответствующий существующий сеанс с зафиксированной моделью; все изменения сеанса остаются доступны только владельцу среды. См. Плагины среды агента.Плагины обслуживания и исправления могут использовать deleteSessionEntry(...) для одной записи сеанса в заданной области, cleanupSessionLifecycleArtifacts(...) для временных сеансов, принадлежащих жизненному циклу, и resolveSessionStoreBackupPaths(...) перед изменением хранилища. Это узкие поверхности исправления и управления жизненным циклом, а не универсальный API удаления хранилища.resolveStorePath(...) и updateSessionStoreEntry(...) дополняют набор вспомогательных функций для сеансов: resolveStorePath определяет путь к хранилищу сеансов для заданной области, а updateSessionStoreEntry({ storePath, sessionKey, update }) напрямую изменяет одну запись по пути к хранилищу, если вызывающему коду он уже известен.loadTranscriptEventsSync(...) доступна для синхронных процедур doctor и восстановления, которые не могут использовать асинхронную среду выполнения транскриптов. Она возвращает необработанные записи SessionStoreTranscriptEvent. В обычном коде среды выполнения плагина следует предпочитать openclaw/plugin-sdk/session-transcript-runtime.formatSqliteSessionFileMarker(...), parseSqliteSessionFileMarker(...) и sqliteSessionFileMarkerMatchesSession(...) — переходные вспомогательные функции для кода, который всё ещё получает устаревшее поле с именем sessionFile. Разобранный маркер SQLite указывает на активный целевой транскрипт SQLite; это не путь в файловой системе. Новые API должны передавать типизированные данные идентификации сеанса вместо строковых маркеров.Для чтения и записи транскриптов импортируйте openclaw/plugin-sdk/session-transcript-runtime и используйте resolveSessionTranscriptIdentity(...), resolveSessionTranscriptTarget(...), readSessionTranscriptEvents(...), readVisibleSessionTranscriptMessageEntries(...), appendSessionTranscriptMessageByIdentity(...), publishSessionTranscriptUpdateByIdentity(...) или withSessionTranscriptWriteLock(...) совместно с { agentId, sessionKey, sessionId }. Эти API позволяют плагинам идентифицировать транскрипт, читать необработанные события или видимые записи сообщений с учётом безопасных ветвей, добавлять сообщения, публиковать обновления и выполнять связанные операции под одной и той же блокировкой записи транскрипта, не завися от путей к файлам активных транскриптов. readVisibleSessionTranscriptMessageEntries(...) возвращает упорядоченные метаданные чтения; её поле seq не является курсором, с которого можно возобновить чтение.Устаревшие вспомогательные функции для всего хранилища и файлов активных транскриптов больше не экспортируются из SDK плагинов. Используйте вспомогательные функции записей с областью действия для метаданных сеансов и вспомогательные функции идентификации транскриптов для операций с активными транскриптами. Процессы архивирования и поддержки, которым нужны файловые артефакты, должны использовать предназначенные для этого интерфейсы архивирования вместо API среды выполнения активных сеансов.
Константы модели и провайдера по умолчанию:
Выполняйте управляемое хостом дополнение текста, не импортируя внутренние компоненты провайдера и не дублируя подготовку модели, аутентификации и базового URL OpenClaw.
Механизм оркестрации провайдера также может получить настроенный жизненный цикл локальной службы перед отправкой HTTP-запроса:
acquireLocalService(...) — стабильный универсальный контракт SDK службы провайдера. Хост определяет конфигурацию процесса из models.providers.<providerId>.localService; вызывающий код не может передавать команду, аргументы, окружение или политику жизненного цикла. Запуск процесса, проверка готовности, диагностика и политика остановки при простое остаются внутренними функциями хоста.Передавайте точный идентификатор настроенного провайдера и определённый базовый URL запроса. Не заменяйте псевдонимы идентификатором адаптера: разные псевдонимы могут указывать на разные локальные хосты с GPU. Хост отклоняет конечные точки, которые не соответствуют настроенному базовому URL провайдера, за исключением нормализации /v1, используемой адаптерами Ollama и LM Studio. Хост управляет сериализацией запуска, проверками готовности, арендой запросов, обработкой прерывания и завершением работы при простое.Вспомогательная функция использует тот же путь подготовки простого дополнения, что и встроенная среда выполнения OpenClaw, а также принадлежащий хосту снимок конфигурации среды выполнения. Механизмы контекста получают привязанную к сеансу возможность llm.complete, поэтому вызовы модели используют агента активного сеанса и не переходят незаметно к агенту по умолчанию. Результат содержит сведения о провайдере, модели и агенте, а также нормализованные данные об использовании токенов, кеша и расчётной стоимости, если они доступны.
Переопределение модели требует явного разрешения оператора через plugins.entries.<id>.llm.allowModelOverride: true в конфигурации. Используйте plugins.entries.<id>.llm.allowedModels, чтобы ограничить доверенные плагины определёнными каноническими целями provider/model. Дополнения между агентами требуют plugins.entries.<id>.llm.allowAgentIdOverride: true.
Вызывайте другой метод Gateway внутри процесса, сохраняя доверенную идентичность среды выполнения текущего плагина. Это предназначено для встроенных или доверенных официальных плагинов, которые объединяют принадлежащие плагинам возможности Gateway без открытия локального WebSocket-соединения.
Запросы используют область operator.write и не предоставляют область администратора. Вызовы из произвольных внешних плагинов отклоняются. При сбое метода создаётся исключение GatewayClientRequestError с сохранением структурированных details, метаданных повторной попытки и кода ошибки Gateway для процессов восстановления. Используйте isAvailable(), прежде чем выбирать этот путь в инструментах, которые также могут работать в автономных процессах агента.
Запускайте фоновые выполнения субагентов и управляйте ими.
Переопределение модели (provider/model) требует явного разрешения оператора через plugins.entries.<id>.subagent.allowModelOverride: true в конфигурации. Недоверенные плагины по-прежнему могут запускать субагентов, но запросы на переопределение отклоняются.
deleteSession(...) может удалять сеансы, созданные тем же плагином через api.runtime.subagent.run(...). Для удаления произвольных сеансов пользователей или операторов по-прежнему требуется запрос Gateway с областью администратора.
Получайте список подключённых узлов и вызывайте команды узла-хоста из кода плагина, загруженного Gateway, или из CLI-команд плагина. Используйте это, когда плагин управляет локальной работой на сопряжённом устройстве, например мостом браузера или аудио на другом Mac.
nodes.list(...) содержит объявленные каждым подключённым узлом дескрипторы nodePluginTools, если этот узел предоставляет агенту инструменты на основе плагинов или MCP. Эти дескрипторы отражают текущее состояние подключения: Gateway удаляет их при отключении узла, а узел может заменить их через node.pluginTools.update после изменения локального состава плагинов или MCP.Внутри Gateway эта среда выполнения работает в процессе. В CLI-командах плагина она вызывает настроенный Gateway через RPC, поэтому такие команды, как openclaw googlemeet recover-tab, могут проверять сопряжённые узлы из терминала. Команды узлов по-прежнему проходят обычное сопряжение узлов Gateway, списки разрешённых команд, политики вызова узлов плагинами и локальную обработку команд на узлах.Плагины, предоставляющие размещённые на узлах инструменты агента, могут задать agentTool.defaultPlatforms для безопасных команд, которые должны быть разрешены по умолчанию. Не указывайте его, если операторы должны явно разрешить команды с помощью gateway.nodes.allowCommands. Для опасных команд узла-хоста следует зарегистрировать политику вызова узла с помощью api.registerNodeInvokePolicy(...); политика выполняется в Gateway после проверки списка разрешённых команд и до передачи команды узлу, поэтому прямые вызовы node.invoke, размещённые на узлах инструменты плагинов и высокоуровневые инструменты плагинов используют единый путь применения ограничений.
Необязательное поле scopes запрашивает области оператора Gateway для вызова. OpenClaw учитывает его только для встроенных плагинов и доверенных установок официальных плагинов; запросы других плагинов не повышают привилегии вызова. Используйте его только тогда, когда доверенному плагину необходимо вызвать команду узла с более строгой областью Gateway, например operator.admin.
Привязывайте состояние потока задач и выполнения задачи к существующему ключу сеанса OpenClaw или доверенному контексту инструмента.
  • api.runtime.tasks.managedFlows поддерживает изменения: создание, продвижение и отмену потоков задач.
  • api.runtime.tasks.flows и api.runtime.tasks.runs — доступные только для чтения представления DTO для получения списков и проверки состояния; оба предоставляют bindSession(...) / fromToolContext(...), а также get, list, findLatest и resolve.
  • api.runtime.tasks.flow — устаревший псевдоним для managedFlows.
Поток задач отслеживает долговременное состояние многоэтапного рабочего процесса. Это не планировщик: используйте Cron или api.session.workflow.scheduleSessionTurn(...) для будущих пробуждений, а затем вызывайте managedFlows из запланированного хода, когда для этой работы требуется состояние потока, дочерние задачи, ожидание или отмена.
Используйте bindSession({ sessionKey, requesterOrigin }), если у вас уже есть доверенный ключ сеанса OpenClaw из собственного уровня привязки. Не выполняйте привязку на основе необработанного пользовательского ввода.
Синтез речи из текста.
Использует основную конфигурацию messages.tts и выбор провайдера. Возвращает аудиобуфер PCM и частоту дискретизации. textToSpeechStream также доступна для потокового синтеза.
Анализ изображений, аудио и видео.
Возвращает { text: undefined }, если выходные данные не созданы (например, входные данные были пропущены).describeImageFileWithModel(...) описывает уже известное изображение с помощью конкретного провайдера и модели, обходя стандартное определение активной модели, которое использует describeImageFile(...).
api.runtime.stt.transcribeAudioFile(...) сохраняется как псевдоним совместимости для api.runtime.mediaUnderstanding.transcribeAudioFile(...).
Генерация изображений.
Генерация видео с интерфейсом, аналогичным генерации изображений.
Генерация музыки с интерфейсом, аналогичным генерации изображений.
Веб-поиск.
Низкоуровневые утилиты для работы с медиафайлами.
Текущий снимок конфигурации среды выполнения и транзакционная запись конфигурации. Предпочитайте конфигурацию, уже переданную в активный путь вызова; используйте current() только тогда, когда обработчику требуется непосредственно снимок процесса.
mutateConfigFile(...) и replaceConfigFile(...) возвращают значение followUp, например { mode: "restart", requiresRestart: true, reason }, которое фиксирует намерение записывающего компонента, не передавая ему от Gateway управление перезапуском.
Утилиты системного уровня.
runHeartbeatOnce(...) немедленно запускает один цикл Heartbeat в обход обычного таймера объединения. Передайте { heartbeat: { target: "last" } }, чтобы принудительно доставить сообщение в последний активный канал вместо стандартного подавления target: "none".runCommandWithTimeout(...) возвращает перехваченные stdout и stderr, необязательные счётчики усечения, code, signal, killed, termination и noOutputTimedOut. Результаты тайм-аута и тайм-аута отсутствия вывода содержат code: 124, если дочерний процесс не предоставляет ненулевой код завершения. Завершение по сигналу без тайм-аута также может вернуть code: null, поэтому используйте termination и noOutputTimedOut, чтобы различать причины тайм-аута.
Подписки на события.
Ведение журналов.
Определение аутентификации модели и провайдера.
Определение каталога состояния и хранилище по ключам на основе SQLite.
Хранилища по ключам сохраняются после перезапусков и изолируются по идентификатору плагина, привязанному к среде выполнения. Используйте registerIfAbsent(...) для атомарного резервирования при дедупликации: он возвращает true, если ключ отсутствовал или истёк и был зарегистрирован, либо false, если актуальное значение уже существует, не перезаписывая его значение, время создания или TTL. Ограничения: maxEntries на пространство имён, 50,000 актуальных строк на плагин, значения JSON размером менее 64KB и необязательное истечение TTL. По умолчанию запись при достижении любого из ограничений на количество строк удаляет самые старые актуальные строки из записываемого пространства имён; соседние пространства имён при этой записи не вытесняются, а запись всё равно завершается ошибкой, если пространство имён не может освободить достаточно строк. Установите overflowPolicy: "reject-new" для долговременных записей владения, которые нельзя вытеснять: новые ключи завершаются ошибкой при достижении любого ограничения, а существующие ключи по-прежнему можно обновлять.openSyncKeyedStore<T>(...) возвращает хранилище той же структуры с синхронными методами (register, registerIfAbsent, lookup, consume, clear возвращают значения непосредственно, а не промисы) для вызывающих компонентов, которые не могут использовать ожидание.openChannelIngressQueue<TPayload>(...) открывает сохраняемую очередь входящих данных, ограниченную вызывающим плагином, для буферизации входящих событий, которым требуется обработка с гарантией не менее одного раза после перезапусков. Если восстановление устаревшего резервирования использует shouldRecover, также укажите shouldRecoverCorrupt, если повреждённые зарезервированные полезные данные следует поместить в карантин: его не зависящий от полезных данных идентификатор резервирования позволяет плагину сохранить действующую политику владельца и полосы до того, как очередь пометит строку как удалённую.
openKeyedStore, openSyncKeyedStore и openChannelIngressQueue в этом выпуске доступны только встроенным плагинам и доверенным установкам официальных плагинов.
Вспомогательные функции среды выполнения для конкретных каналов (доступны, когда загружен плагин канала). Сгруппированы по назначению:api.runtime.channel.media — предпочтительный интерфейс для загрузки и хранения медиафайлов каналов:
Используйте saveRemoteMedia(...), когда удалённый URL требуется преобразовать в медиафайл OpenClaw. Используйте saveResponseMedia(...), когда плагин уже получил Response с собственной обработкой аутентификации, перенаправлений или списка разрешений. Используйте readRemoteMediaBuffer(...), только когда плагину нужны необработанные байты для проверки, преобразования, расшифровки или повторной отправки. fetchRemoteMedia(...) остаётся устаревшим псевдонимом совместимости для readRemoteMediaBuffer(...).api.runtime.channel.mentions — это общая поверхность политики входящих упоминаний для встроенных плагинов каналов, использующих внедрение среды выполнения:
Доступные вспомогательные функции для упоминаний:
  • buildMentionRegexes
  • matchesMentionPatterns
  • matchesMentionWithExplicit
  • implicitMentionKindWhen
  • resolveInboundMentionDecision
api.runtime.channel.mentions намеренно не предоставляет устаревшие вспомогательные функции совместимости resolveMentionGating*. Предпочитайте нормализованный путь { facts, policy }.Несколько полей в reply, session и inbound содержат относящиеся к отдельным полям примечания @deprecated, указывающие на текущее ядро обработки хода канала или адаптеры исходящих сообщений канала; прежде чем создавать новый код на основе конкретной вспомогательной функции, ознакомьтесь с её встроенной документацией JSDoc.

Хранение ссылок на среду выполнения

Используйте createPluginRuntimeStore, чтобы сохранить ссылку на среду выполнения для использования вне обратного вызова register:
1

Создайте хранилище

2

Подключите к точке входа

3

Получите доступ из других файлов

Для идентификатора хранилища среды выполнения предпочитайте pluginId. Низкоуровневая форма key предназначена для редких случаев, когда одному плагину намеренно требуется более одного слота среды выполнения.

Другие поля верхнего уровня api

Помимо api.runtime, объект API также предоставляет:
string
Идентификатор плагина.
string
Отображаемое имя плагина.
OpenClawConfig
Текущий снимок конфигурации (активный снимок среды выполнения в памяти, если доступен).
Record<string, unknown>
Конфигурация плагина из plugins.entries.<id>.config.
PluginLogger
Регистратор с ограниченной областью действия (debug, info, warn, error).
PluginRegistrationMode
Текущий режим загрузки: "full" (активация в реальном времени), "discovery" / "tool-discovery" (обнаружение возможностей только для чтения), "setup-only" (облегчённая точка входа настройки), "setup-runtime" (процесс настройки, которому также требуется точка входа канала среды выполнения) или "cli-metadata" (сбор метаданных команд CLI).
(string) => string
Разрешает путь относительно корневого каталога плагина.

Связанные материалы