api.runtime, внедряемому в каждый плагин при регистрации. Используйте эти помощники вместо прямого импорта внутренних модулей хоста.
Channel plugins
Пошаговое руководство, использующее эти помощники в контексте плагинов каналов.
Provider plugins
Пошаговое руководство, использующее эти помощники в контексте плагинов провайдеров.
Загрузка и запись конфигурации
Предпочитайте конфигурацию, которая уже была передана в активный путь вызова, напримерapi.config при регистрации или аргумент cfg в обратных вызовах канала/провайдера. Так один снимок процесса проходит через работу без повторного разбора конфигурации на горячих путях.
Используйте api.runtime.config.current() только когда долгоживущему обработчику нужен текущий снимок процесса и в эту функцию не была передана конфигурация. Возвращаемое значение доступно только для чтения; перед редактированием клонируйте его или используйте помощник мутации.
Фабрики инструментов получают ctx.runtimeConfig и ctx.getRuntimeConfig(). Используйте getter внутри обратного вызова 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(...) являются устаревшими помощниками совместимости под runtime-config-load-write. Они один раз предупреждают во время выполнения и остаются доступными для старых внешних плагинов в течение окна миграции. Встроенные плагины не должны их использовать; защитные проверки границы конфигурации завершаются ошибкой, если код плагина вызывает их или импортирует эти помощники из подпутей SDK плагина.
Для прямого импорта SDK используйте специализированные подпути конфигурации вместо широкого совместимого barrel
openclaw/plugin-sdk/config-runtime: config-contracts для типов, plugin-config-runtime для утверждений уже загруженной конфигурации и поиска точки входа плагина, runtime-config-snapshot для текущих снимков процесса и config-mutation для записей. Тесты встроенных плагинов должны напрямую мокировать эти специализированные подпути вместо мокирования широкого совместимого barrel.
Внутренний runtime-код OpenClaw следует тому же направлению: загрузить конфигурацию один раз на границе CLI, Gateway или процесса, затем передавать это значение дальше. Успешные записи мутаций обновляют снимок runtime процесса и продвигают его внутреннюю ревизию; долгоживущие кэши должны использовать ключ кэша, принадлежащий runtime, вместо локальной сериализации конфигурации. Для долгоживущих runtime-модулей действует сканер с нулевой терпимостью к фоновым вызовам loadConfig(); используйте переданный cfg, request context.getRuntimeConfig() или getRuntimeConfig() на явной границе процесса.
Пути выполнения провайдера и канала должны использовать активный снимок runtime-конфигурации, а не файловый снимок, возвращенный для чтения или редактирования конфигурации. Файловые снимки сохраняют исходные значения, такие как маркеры SecretRef, для UI и записей; обратным вызовам провайдера нужен разрешенный runtime-вид. Когда помощник может быть вызван как с активным исходным снимком, так и с активным runtime-снимком, перед чтением учетных данных направляйте вызов через selectApplicableRuntimeConfig().
Переиспользуемые runtime-утилиты
Используйте входящие фактыbotLoopProtection для входящих сообщений, созданных ботом. Core применяет общий in-memory sliding-window guard до записи сессии и dispatch, не привязывая политику к одному каналу. Guard отслеживает ключи (scopeId, conversationId, participant pair), считает оба направления пары вместе, применяет cooldown после превышения бюджета окна и оппортунистически удаляет неактивные записи.
Плагины каналов, которые раскрывают это поведение операторам, должны предпочитать общую форму channels.defaults.botLoopProtection для базовых бюджетов, а затем накладывать сверху переопределения, специфичные для канала/провайдера. Общая конфигурация использует секунды, потому что она видима пользователю:
enabled:
openclaw/plugin-sdk/pair-loop-guard-runtime напрямую только для пользовательских двухсторонних event loop, которые не проходят через общий inbound reply runner.
Пространства имен runtime
api.runtime.agent
api.runtime.agent
Идентичность агента, каталоги и управление сессиями.Предпочитайте
runEmbeddedAgent(...) — нейтральный помощник для запуска обычного хода агента OpenClaw из кода плагина. Он использует то же разрешение провайдера/модели и выбор agent-harness, что и ответы, запущенные каналом.runEmbeddedPiAgent(...) остается устаревшим совместимым алиасом для существующих плагинов. Новый код должен использовать runEmbeddedAgent(...).resolveThinkingPolicy(...) возвращает поддерживаемые провайдером/моделью уровни thinking и необязательное значение по умолчанию. Плагины провайдеров владеют профилем конкретной модели через свои thinking hooks, поэтому плагины инструментов должны вызывать этот runtime-помощник вместо импорта или дублирования списков провайдеров.normalizeThinkingLevel(...) преобразует пользовательский текст, такой как on, x-high или extra high, в канонический сохраняемый уровень перед проверкой по разрешенной политике.Помощники хранилища сессий находятся в api.runtime.agent.session:getSessionEntry(...), listSessionEntries(...), patchSessionEntry(...) или upsertSessionEntry(...) для рабочих процессов сессий. Эти помощники адресуют сессии по идентичности агента/сессии, чтобы плагины не зависели от устаревшей формы хранилища sessions.json. Используйте preserveActivity: true для патчей только метаданных, которые не должны обновлять активность сессии, и replaceEntry: true только когда обратный вызов возвращает полную запись, а удаленные поля должны остаться удаленными.Для чтения и записи транскриптов импортируйте openclaw/plugin-sdk/session-transcript-runtime и используйте resolveSessionTranscriptIdentity(...), resolveSessionTranscriptTarget(...), readSessionTranscriptEvents(...), appendSessionTranscriptMessageByIdentity(...), publishSessionTranscriptUpdateByIdentity(...) или withSessionTranscriptWriteLock(...) с { agentId, sessionKey, sessionId }. Эти API позволяют плагинам идентифицировать транскрипт, читать его события, добавлять сообщения, публиковать обновления и выполнять связанные операции под той же блокировкой записи транскрипта. Передача sessionFile, использование resolveSessionTranscriptLegacyFileTarget(...) или импорт низкоуровневых appendSessionTranscriptMessage(...) / emitSessionTranscriptUpdate(...) из openclaw/plugin-sdk/agent-harness-runtime устарели; эти пути существуют только для legacy-кода, который уже получает активный артефакт транскрипта.loadSessionStore(...), saveSessionStore(...), updateSessionStore(...), resolveSessionFilePath(...) и resolveAndPersistSessionFile(...) являются устаревшими помощниками совместимости для плагинов, которые все еще намеренно зависят от устаревшей формы всего хранилища или файла транскрипта. Новый код плагина не должен использовать эти помощники, а существующие вызывающие стороны должны мигрировать на помощники записей и помощники идентичности транскриптов.api.runtime.agent.defaults
api.runtime.agent.defaults
Константы модели и провайдера по умолчанию:
api.runtime.llm
api.runtime.llm
Запустите текстовое completion, принадлежащее хосту, без импорта внутренних модулей провайдера или дублирования подготовки модели/аутентификации/base URL OpenClaw.Помощник использует тот же путь подготовки простого completion, что и встроенный runtime OpenClaw, а также принадлежащий хосту снимок runtime-конфигурации. Context engines получают привязанную к сессии возможность
llm.complete, поэтому вызовы модели используют агента активной сессии и не выполняют молчаливый fallback к агенту по умолчанию. Результат включает атрибуцию провайдера/модели/агента, а также нормализованные данные об использовании токенов, кэша и оценочной стоимости, когда они доступны.api.runtime.subagent
api.runtime.subagent
Запуск и управление фоновыми запусками subagent.
deleteSession(...) может удалять сеансы, созданные тем же plugin через api.runtime.subagent.run(...). Удаление произвольных пользовательских или операторских сеансов по-прежнему требует запроса Gateway с областью администратора.api.runtime.nodes
api.runtime.nodes
Выводит список подключенных узлов и вызывает команду хоста узла из кода plugin, загруженного Gateway, или из CLI-команд plugin. Используйте это, когда plugin владеет локальной работой на сопряженном устройстве, например браузером или аудиомостом на другом Mac.Внутри Gateway эта среда выполнения работает внутри процесса. В CLI-командах plugin она вызывает настроенный Gateway через RPC, поэтому команды вроде
openclaw googlemeet recover-tab могут проверять сопряженные узлы из терминала. Команды узлов по-прежнему проходят через обычное сопряжение узлов Gateway, списки разрешенных команд, политики вызова узлов plugin и локальную обработку команд на узле.Plugins, которые предоставляют опасные команды хоста узла, должны зарегистрировать политику вызова узлов с помощью api.registerNodeInvokePolicy(...). Политика выполняется в Gateway после проверок списка разрешенных команд и до пересылки команды на узел, поэтому прямые вызовы node.invoke и высокоуровневые инструменты plugin используют один и тот же путь принудительного применения.api.runtime.tasks.managedFlows
api.runtime.tasks.managedFlows
Привяжите среду выполнения Task Flow к существующему ключу сеанса OpenClaw или доверенному контексту инструмента, затем создавайте Task Flows и управляйте ими без передачи владельца при каждом вызове.Task Flow отслеживает долговечное состояние многошагового рабочего процесса. Это не планировщик:
используйте Cron или Используйте
api.session.workflow.scheduleSessionTurn(...) для будущих
пробуждений, затем используйте managedFlows из запланированного хода, когда этой работе
нужны состояние потока, дочерние задачи, ожидания или отмена.bindSession({ sessionKey, requesterOrigin }), когда у вас уже есть доверенный ключ сеанса OpenClaw из собственного слоя привязки. Не выполняйте привязку из необработанного пользовательского ввода.api.runtime.tts
api.runtime.tts
Синтез речи из текста.Использует базовую конфигурацию
messages.tts и выбор провайдера. Возвращает аудиобуфер PCM и частоту дискретизации.api.runtime.mediaUnderstanding
api.runtime.mediaUnderstanding
Анализ изображений, аудио и видео.Возвращает
{ text: undefined }, когда вывод не создан (например, входные данные пропущены).api.runtime.stt.transcribeAudioFile(...) остается псевдонимом совместимости для api.runtime.mediaUnderstanding.transcribeAudioFile(...).api.runtime.imageGeneration
api.runtime.imageGeneration
Генерация изображений.
api.runtime.webSearch
api.runtime.webSearch
Веб-поиск.
api.runtime.media
api.runtime.media
Низкоуровневые медиаутилиты.
api.runtime.config
api.runtime.config
Текущий снимок конфигурации среды выполнения и транзакционные записи конфигурации. Предпочитайте
конфигурацию, которая уже была передана в активный путь вызова; используйте
current() только когда обработчику напрямую нужен снимок процесса.mutateConfigFile(...) и replaceConfigFile(...) возвращают значение followUp,
например { mode: "restart", requiresRestart: true, reason },
которое фиксирует намерение автора записи, не забирая управление перезапуском у
gateway.api.runtime.system
api.runtime.system
Утилиты системного уровня.
runCommandWithTimeout(...) возвращает захваченные stdout и stderr, необязательные
счетчики усечения, code, signal, killed, termination и
noOutputTimedOut. Результаты тайм-аута и тайм-аута отсутствия вывода сообщают code: 124,
когда дочерний процесс не предоставляет ненулевой код выхода. Выходы по сигналу
без тайм-аута всё еще могут возвращать code: null, поэтому используйте termination и
noOutputTimedOut, чтобы различать причины тайм-аута.api.runtime.events
api.runtime.events
Подписки на события.
api.runtime.logging
api.runtime.logging
Логирование.
api.runtime.modelAuth
api.runtime.modelAuth
Разрешение аутентификации модели и провайдера.
api.runtime.state
api.runtime.state
Разрешение каталога состояния и хранилище ключей на базе SQLite.Хранилища с ключами переживают перезапуски и изолированы идентификатором плагина, привязанным к среде выполнения. Используйте
registerIfAbsent(...) для атомарных заявок дедупликации: он возвращает true, когда ключ отсутствовал или истек и был зарегистрирован, либо false, когда уже существует активное значение без перезаписи его значения, времени создания или TTL. Ограничения: maxEntries на пространство имен, 6 000 активных строк на плагин, JSON-значения меньше 64 КБ и необязательное истечение по TTL. Когда запись превысила бы лимит строк плагина, среда выполнения может вытеснить самые старые активные строки из пространства имен, в которое выполняется запись; соседние пространства имен при этой записи не вытесняются, и запись все равно завершается ошибкой, если пространство имен не может освободить достаточно строк.api.runtime.tools
api.runtime.tools
Фабрики инструментов памяти и CLI.
api.runtime.channel
api.runtime.channel
Вспомогательные функции среды выполнения для конкретного канала (доступны, когда загружен плагин канала).Используйте Доступные вспомогательные функции упоминаний:
api.runtime.channel.media — предпочтительная поверхность для загрузок и хранения медиа канала:saveRemoteMedia(...), когда удаленный URL должен стать медиа OpenClaw. Используйте saveResponseMedia(...), когда плагин уже получил Response с собственной обработкой авторизации, перенаправлений или allowlist. Используйте readRemoteMediaBuffer(...) только когда плагину нужны необработанные байты для проверки, преобразований, расшифровки или повторной загрузки. fetchRemoteMedia(...) остается устаревшим совместимым псевдонимом для readRemoteMediaBuffer(...).api.runtime.channel.mentions — общая поверхность политики входящих упоминаний для встроенных плагинов каналов, которые используют внедрение среды выполнения:buildMentionRegexesmatchesMentionPatternsmatchesMentionWithExplicitimplicitMentionKindWhenresolveInboundMentionDecision
api.runtime.channel.mentions намеренно не предоставляет старые совместимые вспомогательные функции resolveMentionGating*. Предпочитайте нормализованный путь { facts, policy }.Хранение ссылок среды выполнения
ИспользуйтеcreatePluginRuntimeStore, чтобы хранить ссылку среды выполнения для использования вне callback-функции register:
Предпочитайте
pluginId для идентичности runtime-store. Низкоуровневая форма key предназначена для редких случаев, когда одному плагину намеренно нужно больше одного слота среды выполнения.Другие поля api верхнего уровня
Помимо api.runtime, объект API также предоставляет:
Идентификатор Plugin.
Отображаемое имя Plugin.
Текущий снимок конфигурации (активный снимок среды выполнения в памяти, когда доступен).
Конфигурация, специфичная для Plugin, из
plugins.entries.<id>.config.Логгер с областью (
debug, info, warn, error).Текущий режим загрузки;
"setup-runtime" — легковесное окно запуска/настройки перед полной точкой входа.Разрешить путь относительно корня плагина.
Связанные материалы
- Внутреннее устройство Plugin — модель возможностей и реестр
- Точки входа SDK — параметры
definePluginEntry - Обзор SDK — справочник подпутей