RPC and API
Режим коду
Режим коду — експериментальна функція середовища виконання агентів OpenClaw. За
замовчуванням її вимкнено. Коли ви її вмикаєте, OpenClaw змінює те, що модель
бачить для одного запуску: замість прямого показу кожної ввімкненої схеми
інструмента модель бачить лише exec і wait.
Ця сторінка документує режим коду OpenClaw. Це не режим коду Codex. Ці дві
функції мають спільну назву, але реалізовані різними середовищами виконання та
надають різні контракти exec:
- Codex Code Mode увімкнено для потоків сервера застосунку Codex, якщо
обмежувальна політика інструментів не вимикає нативний режим коду. Він працює
в середовищі програмування Codex, де модель записує команди оболонки через
контракт
exec.command. - Режим коду OpenClaw вимкнено, якщо не налаштовано
tools.codeMode.enabled: true. Він працює в загальному середовищі виконання агентів OpenClaw, де модель записує програми JavaScript або TypeScript через контрактexec.code.
Codex Code Mode і нативний для Codex динамічний пошук інструментів є стабільними
поверхнями середовища Codex. Режим коду OpenClaw — це експериментальний адаптер
поверхні інструментів, яким володіє OpenClaw, для загальних запусків OpenClaw.
Він використовує quickjs-wasi, прихований каталог інструментів OpenClaw і
звичайний виконавець інструментів OpenClaw.
Що це?
Режим коду OpenClaw дає моделі змогу писати невелику програму JavaScript або TypeScript замість прямого вибору з довгого списку інструментів.
Коли режим коду активний:
- Список інструментів, видимий моделі, містить рівно
execіwait. execоцінює згенерований моделлю JavaScript або TypeScript в обмеженому воркері QuickJS-WASI.- Звичайні інструменти OpenClaw приховано з підказки моделі та надано всередині
гостьової програми через
ALL_TOOLSіtools. - Гостьовий код може шукати в прихованому каталозі, описувати інструмент і викликати інструмент через той самий шлях виконання OpenClaw, який використовується звичайними ходами агента.
- Інструменти MCP згруповано в просторі імен
MCP. У режимі коду цей простір імен є єдиним підтримуваним способом викликати інструменти MCP. waitвідновлює призупинений запуск у режимі коду, коли вкладені виклики інструментів усе ще очікують виконання.
Важлива відмінність: режим коду змінює поверхню оркестрації, звернену до моделі. Він не замінює інструменти OpenClaw, інструменти Plugin, інструменти MCP, автентифікацію, політику схвалень, поведінку каналів або вибір моделі.
Чому це добре?
Режим коду спрощує використання великих каталогів інструментів для моделей.
- Менша поверхня підказки: провайдери отримують два керівні інструменти замість десятків або сотень повних схем інструментів.
- Краща оркестрація: модель може використовувати цикли, об’єднання, невеликі перетворення, умовну логіку та паралельні вкладені виклики інструментів в одній комірці коду.
- Нейтральність щодо провайдера: це працює для OpenClaw, Plugin, MCP та клієнтських інструментів без залежності від нативного виконання коду провайдером.
- Наявна політика залишається чинною: вкладені виклики інструментів і далі проходять через політики OpenClaw, схвалення, хуки, контекст сеансу та шляхи аудиту.
- Зрозумілий режим відмови: коли режим коду явно ввімкнено, а середовище виконання недоступне, OpenClaw завершує запуск із закритою відмовою замість повернення до широкого прямого показу інструментів.
Режим коду особливо корисний для агентів із великим увімкненим каталогом інструментів або для робочих процесів, де моделі потрібно багаторазово шукати, поєднувати та викликати інструменти перед створенням відповіді.
Як його ввімкнути
Додайте tools.codeMode.enabled: true до конфігурації агента або середовища
виконання:
{ tools: { codeMode: { enabled: true, }, },}Також приймається скорочена форма:
{ tools: { codeMode: true, },}Режим коду залишається вимкненим, коли tools.codeMode пропущено, має значення
false або є об’єктом без enabled: true.
Коли ви використовуєте ізольованих агентів із налаштованими серверами MCP, також
переконайтеся, що політика інструментів пісочниці дозволяє вбудований Plugin
MCP, наприклад через tools.sandbox.tools.alsoAllow: ["bundle-mcp"]. Див.
Конфігурація - інструменти та власні провайдери.
Використовуйте явні обмеження, коли потрібні жорсткіші межі:
{ tools: { codeMode: { enabled: true, timeoutMs: 10000, memoryLimitBytes: 67108864, maxOutputBytes: 65536, maxSnapshotBytes: 10485760, maxPendingToolCalls: 16, snapshotTtlSeconds: 900, searchDefaultLimit: 8, maxSearchLimit: 50, }, },}Щоб під час налагодження підтвердити форму корисного навантаження моделі, запустіть Gateway із цільовим журналюванням:
OPENCLAW_DEBUG_CODE_MODE=1 \OPENCLAW_DEBUG_MODEL_TRANSPORT=1 \OPENCLAW_DEBUG_MODEL_PAYLOAD=tools \openclaw gatewayКоли режим коду активний, записані в журналі назви інструментів, звернених до
моделі, мають бути exec і wait. Якщо потрібне відредаговане корисне
навантаження провайдера, додайте OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted на
короткий сеанс налагодження.
Технічний огляд
Решта цієї сторінки описує контракт середовища виконання та деталі реалізації. Вона призначена для супровідників, авторів Plugin, які налагоджують показ інструментів, і операторів, що перевіряють розгортання з високим ризиком.
Стан середовища виконання
- Середовище виконання:
quickjs-wasi. - Стан за замовчуванням: вимкнено.
- Стабільність: експериментальна поверхня OpenClaw; Codex Code mode є окремою стабільною поверхнею середовища Codex.
- Цільова поверхня: загальні запуски агентів OpenClaw.
- Позиція щодо безпеки: код моделі є ворожим.
- Обіцянка для користувача: увімкнення режиму коду ніколи безшумно не повертається до широкого прямого показу інструментів.
Область дії
Режим коду відповідає за форму оркестрації, звернену до моделі, для підготовленого запуску. Він не відповідає за вибір моделі, поведінку каналів, автентифікацію, політику інструментів або реалізації інструментів.
Входить до області дії:
- видимі моделі визначення інструментів
execіwait - побудова прихованого каталогу інструментів
- виконання гостьового JavaScript і TypeScript
- середовище виконання воркера QuickJS-WASI
- зворотні виклики хоста для пошуку в каталозі, опису схеми та виклику інструмента
- відновлюваний стан для призупинених гостьових програм
- обмеження виводу, часу очікування, пам’яті, очікуваних викликів і знімків
- телеметрія та проєкція траєкторії для вкладених викликів інструментів
Поза областю дії:
- нативне для провайдера віддалене виконання коду
- семантика виконання оболонки
- зміна наявної авторизації інструментів
- постійні скрипти, написані користувачем
- доступ до менеджера пакетів, файлів, мережі або модулів у гостьовому коді
- пряме повторне використання внутрішніх компонентів Codex Code mode
Інструменти, якими володіє провайдер, як-от віддалені пісочниці Python, залишаються окремими інструментами. Див. Виконання коду.
Терміни
Режим коду — це режим середовища виконання OpenClaw, який приховує звичайні
інструменти моделі та надає лише exec і wait.
Гостьове середовище виконання — це VM JavaScript QuickJS-WASI, яка оцінює код моделі.
Міст хоста — це вузька JSON-сумісна поверхня зворотних викликів із гостьового коду назад в OpenClaw.
Каталог — це обмежений запуском список ефективних інструментів після звичайної політики інструментів і розв’язання Plugin, MCP та клієнтських інструментів.
Вкладений виклик інструмента — це виклик інструмента, зроблений із гостьового коду через міст хоста.
Знімок — це серіалізований стан VM QuickJS-WASI, збережений, щоб wait міг
продовжити призупинений запуск у режимі коду.
Конфігурація
tools.codeMode.enabled — це перемикач активації. Налаштування інших полів
режиму коду не вмикає функцію.
Підтримувані поля:
enabled: булеве значення. За замовчуваннямfalse. Вмикає режим коду лише коли значенняtrue.runtime:"quickjs-wasi". Єдине підтримуване середовище виконання.mode:"only". Надаєexecіwait, приховує звичайні інструменти моделі.languages: масив"javascript"і"typescript". За замовчуванням містить обидві мови.timeoutMs: обмеження за реальним часом для одногоexecабоwait. За замовчуванням10000. Обмеження середовища виконання: від100до60000.memoryLimitBytes: обмеження купи QuickJS. За замовчуванням67108864. Обмеження середовища виконання: від1048576до1073741824.maxOutputBytes: обмеження для повернутого тексту, JSON і журналів. За замовчуванням65536. Обмеження середовища виконання: від1024до10485760.maxSnapshotBytes: обмеження для серіалізованих знімків VM. За замовчуванням10485760. Обмеження середовища виконання: від1024до268435456.maxPendingToolCalls: обмеження для одночасних вкладених викликів інструментів. За замовчуванням16. Обмеження середовища виконання: від1до128.snapshotTtlSeconds: як довго призупинену VM можна відновити. За замовчуванням900. Обмеження середовища виконання: від1до86400.searchDefaultLimit: кількість результатів пошуку в прихованому каталозі за замовчуванням. За замовчуванням8. Середовище виконання обмежує це значення доmaxSearchLimit.maxSearchLimit: максимальна кількість результатів пошуку в прихованому каталозі. За замовчуванням50. Обмеження середовища виконання: від1до50.
Якщо режим коду ввімкнено, але QuickJS-WASI не може завантажитися, OpenClaw завершує цей запуск із закритою відмовою. Він безшумно не показує звичайні інструменти як запасний варіант.
Активація
Режим коду оцінюється після визначення ефективної політики інструментів і перед складанням остаточного запиту до моделі.
Порядок активації:
- Розв’язати агента, модель, провайдера, пісочницю, канал, відправника та політику запуску.
- Побудувати ефективний список інструментів OpenClaw.
- Додати придатні інструменти Plugin, MCP і клієнтські інструменти.
- Застосувати політики дозволу та заборони.
- Якщо
tools.codeMode.enabledмає значення false, продовжити зі звичайним показом інструментів. - Якщо ввімкнено і для запуску активні інструменти, зареєструвати ефективні інструменти в каталозі режиму коду.
- Видалити всі звичайні інструменти зі списку інструментів, видимого моделі.
- Додати
execіwaitрежиму коду.
Запуски, які навмисно не мають інструментів, як-от необроблені виклики моделі,
disableTools або порожній список дозволених, не активують поверхню режиму
коду, навіть якщо конфігурація містить tools.codeMode.enabled: true.
Каталог режиму коду обмежений запуском. Він не повинен пропускати інструменти з іншого агента, сеансу, відправника або запуску.
Інструменти, видимі моделі
Коли режим коду активний, модель бачить рівно ці інструменти верхнього рівня:
execwait
Усі інші ввімкнені інструменти приховано зі списку інструментів, зверненого до моделі, і зареєстровано в каталозі режиму коду.
Модель має використовувати exec для оркестрації інструментів, об’єднання
даних, циклів, паралельних вкладених викликів і структурованих перетворень.
Модель має використовувати wait лише тоді, коли exec повертає відновлюваний
результат waiting.
exec
exec запускає комірку режиму коду та повертає один результат. Вхідний код
генерується моделлю і має вважатися ворожим.
Вхід:
type CodeModeExecInput = { code?: string; command?: string; language?: "javascript" | "typescript";};Правила входу:
- Одне з
codeабоcommandмає бути непорожнім. code— задокументоване поле, звернене до моделі.commandприймається як сумісний з exec псевдонім для політик хуків і довірених переписувань; коли присутні обидва поля, значення мають збігатися.- Зовнішні події хуків
execрежиму коду містятьtoolKind: "code_mode_exec"і містятьtoolInputKind: "javascript" | "typescript", коли мова входу відома, щоб політики могли відрізняти комірки режиму коду від викликівexecу стилі оболонки, які мають таку саму назву інструмента. languageза замовчуванням має значення"javascript".- Якщо
languageмає значення"typescript", OpenClaw транспілює перед оцінюванням. execвідхиляєimport,require, динамічний import і шаблони завантажувача модулів у v1.execне надає звичайну реалізацію оболонкиexecрекурсивно.
Результат:
type CodeModeResult = CodeModeCompletedResult | CodeModeWaitingResult | CodeModeFailedResult; type CodeModeCompletedResult = { status: "completed"; value: unknown; output?: CodeModeOutput[]; telemetry: CodeModeTelemetry;}; type CodeModeWaitingResult = { status: "waiting"; runId: string; reason: "pending_tools" | "yield"; pendingToolCalls?: CodeModePendingToolCall[]; output?: CodeModeOutput[]; telemetry: CodeModeTelemetry;}; type CodeModeFailedResult = { status: "failed"; error: string; code?: CodeModeErrorCode; output?: CodeModeOutput[]; telemetry: CodeModeTelemetry;};exec повертає waiting, коли VM QuickJS призупиняється з відновлюваним
станом, який усе ще потребує видимого моделі продовження. Результат містить
runId для wait. Виклики мосту простору імен, включно з викликами простору
імен MCP, автоматично вичерпуються всередині того самого виклику exec/wait,
поки вони готові, тож компактний блок коду може перевірити $api() і викликати
інструмент MCP без примусу до одного виклику інструмента моделі на кожне
очікування простору імен.
exec повертає completed лише тоді, коли гостьова VM не має незавершеної роботи, а
фінальне значення є JSON-сумісним після виконання адаптера виводу OpenClaw.
wait
wait продовжує призупинену VM режиму коду.
Вхідні дані:
type CodeModeWaitInput = { runId: string;};Вивід є тим самим об’єднанням CodeModeResult, яке повертає exec.
wait існує тому, що вкладені інструменти OpenClaw можуть бути повільними,
інтерактивними, обмеженими схваленням або транслювати часткові оновлення.
Модель не повинна тримати один довгий виклик exec відкритим, поки хост чекає
на зовнішню роботу.
Знімок і відновлення QuickJS-WASI є механізмом відновлення v1:
execвиконує код до завершення, помилки або призупинення.- Під час призупинення OpenClaw створює знімок QuickJS VM і записує очікувану роботу хоста.
- Коли очікувана робота завершується,
waitвідновлює знімок VM. - OpenClaw повторно реєструє callback-и хоста за стабільними іменами.
- OpenClaw передає результати вкладених інструментів у відновлену VM.
- OpenClaw вичерпує очікувані завдання QuickJS.
waitповертаєcompleted,failedабо інший результатwaiting.
Знімки є станом runtime, а не користувацькими артефактами. Вони мають обмеження розміру, строк дії та область, обмежену запуском і сесією, які їх створили.
wait завершується помилкою, коли:
runIdневідомий.- строк дії знімка минув.
- батьківський запуск або сесію було перервано.
- викликач не перебуває в тій самій області запуску/сесії.
- відновлення QuickJS-WASI завершується помилкою.
- відновлення перевищило б налаштовані ліміти.
API гостьового runtime
Гостьовий runtime надає невеликий глобальний API:
declare const ALL_TOOLS: ToolCatalogEntry[];declare const tools: ToolCatalog;declare const MCP: Record<string, unknown>;declare const namespaces: Record<string, unknown>; declare function text(value: unknown): void;declare function json(value: unknown): void;declare function yield_control(reason?: string): Promise<void>;ALL_TOOLS — це компактні метадані для каталогу в межах запуску. За
замовчуванням вони не містять повних схем.
type ToolCatalogEntry = { id: string; name: string; label?: string; description: string; source: "openclaw" | "plugin" | "mcp" | "client"; sourceName?: string;};Повна схема завантажується лише на вимогу:
type ToolCatalogEntryWithSchema = ToolCatalogEntry & { parameters: unknown;};Помічники каталогу:
type ToolCatalog = { search(query: string, options?: { limit?: number }): Promise<ToolCatalogEntry[]>; describe(id: string): Promise<ToolCatalogEntryWithSchema>; call(id: string, input?: unknown): Promise<unknown>; [safeToolName: string]: unknown;};Зручні функції інструментів встановлюються лише для однозначних безпечних імен:
const files = await tools.search("read local file");const fileRead = await tools.describe(files[0].id);const content = await tools.call(fileRead.id, { path: "README.md" }); // If the hidden catalog has an unambiguous `web_search` entry:const hits = await tools.web_search({ query: "OpenClaw code mode" });Записи каталогу MCP не можна викликати через tools.call(...) або зручні
функції в режимі коду. Вони доступні лише через згенерований простір імен MCP.
Файли декларацій у стилі TypeScript доступні через віртуальну поверхню файлів
лише для читання API, тож агенти можуть перевіряти сигнатури MCP без додавання
схем MCP до prompt:
const files = await API.list("mcp");const githubApi = await API.read("mcp/github.d.ts"); const issue = await MCP.github.createIssue({ owner: "openclaw", repo: "openclaw", title: "Investigate gateway logs",}); const snapshot = await MCP.chromeDevtools.takeSnapshot({ output: "markdown" });const resource = await MCP.docs.resources.read({ uri: "memo://one" });const prompt = await MCP.docs.prompts.get({ name: "brief", arguments: { topic: "release" },});API.read("mcp/<server>.d.ts") повертає компактні декларації, виведені з
метаданих інструментів MCP:
type McpToolResult = { content?: unknown[]; structuredContent?: unknown; isError?: boolean; [key: string]: unknown;}; declare namespace MCP.github { /** Return this TypeScript-style API header. */ function $api(toolName?: string, options?: { schema?: boolean }): Promise<McpApiHeader>; /** * Create a GitHub issue. * @param owner Repository owner * @param repo Repository name * @param title Issue title */ function createIssue(input: { owner: string; repo: string; title: string; body?: string; }): Promise<McpToolResult>;}Файли декларацій є віртуальними, а не файлами, записаними в робочу область або
каталог стану. Для кожного виклику exec у режимі коду OpenClaw будує каталог
інструментів у межах запуску, зберігає видимі записи MCP, рендерить
mcp/index.d.ts плюс одну декларацію mcp/<server>.d.ts для кожного видимого
сервера та вводить цю невелику таблицю лише для читання у worker QuickJS.
Гостьовий код бачить лише об’єкт API: API.list(prefix?) повертає метадані
файлів, а API.read(path) повертає вміст вибраної декларації. Невідомі шляхи та
сегменти . / .. відхиляються.
Це не допускає великі схеми MCP до prompt моделі. Агент дізнається, що
віртуальний API існує, з опису інструмента exec, читає лише потрібний файл
декларації, а потім викликає MCP.<server>.<tool>() з одним об’єктним
аргументом. MCP.<server>.$api() залишається доступним як вбудований запасний
варіант, коли агенту потрібна відповідь зі схемою одного інструмента всередині
програми.
Гостьовий runtime не повинен напряму відкривати об’єкти хоста. Вхідні та вихідні дані перетинають міст як JSON-сумісні значення з явними обмеженнями розміру.
Внутрішні простори імен
Внутрішні простори імен дають режиму коду стислий доменний API без додавання
більшої кількості видимих для моделі інструментів. Інтеграція, якою володіє
завантажувач, може зареєструвати простір імен, як-от Issues, Fictions або
Calendar; гостьовий код тоді викликає цей простір імен усередині програми
QuickJS, тоді як OpenClaw усе ще показує моделі лише exec і wait.
Простори імен наразі є внутрішніми. Публічного API простору імен у plugin SDK немає: зовнішнім просторам імен Plugin потрібен контракт, яким володіє завантажувач, щоб ідентичність Plugin, установлені маніфести, стан автентифікації та кешовані дескриптори каталогу не розходилися з інструментами Plugin, які підтримують простір імен. Основний режим коду володіє лише пісочницею, серіалізацією, обмеженням каталогу та диспетчеризацією мосту.
Гостьовий код тоді може використовувати або прямий глобальний об’єкт, або мапу
namespaces:
const open = await Issues.list({ state: "open" });const alsoOpen = await namespaces.Issues.list({ state: "open" });return { count: open.length, alsoCount: alsoOpen.length };Життєвий цикл реєстру
Реєстр просторів імен є локальним для процесу та ключується за id простору імен. Типовий запуск проходить таким шляхом:
- Довірений завантажувач викликає
registerCodeModeNamespaceForPlugin(pluginId, registration). - Режим коду створює прихований
ToolSearchRuntimeдля запуску та читає його каталог у межах запуску. createCodeModeNamespaceRuntime(ctx, catalog)залишає лише реєстрації, у яких усіrequiredToolNamesвидимі та належать тому самомуpluginId.- Кожен видимий простір імен викликає
createScope(ctx)для поточного запуску. Область отримує контекст запуску, як-отagentId,sessionKey,sessionId,runId, конфігурацію та стан переривання. - Дані області серіалізуються у простий дескриптор і вводяться в QuickJS як
прямі глобальні об’єкти та
namespaces.<globalName>. - Гостьові виклики призупиняються через міст worker, визначають шлях простору
імен на хості, зіставляють виклик із оголошеним інструментом каталогу, яким
володіє Plugin, і виконують цей інструмент через
ToolSearchRuntime.call. - OpenClaw автоматично вичерпує готові виклики мосту простору імен усередині
активного виклику інструмента
exec/wait. Якщо робота простору імен усе ще очікує на момент тайм-ауту або гість явно поступається керуванням,waitпізніше відновлює той самий runtime простору імен. - Відкат або видалення Plugin викликає
clearCodeModeNamespacesForPlugin(pluginId), щоб застарілі глобальні об’єкти не пережили невдале завантаження Plugin.
Важливий інваріант: виклики простору імен є викликами інструментів каталогу. Вони
використовують ті самі policy hooks, схвалення, обробку переривання, телеметрію,
проєкцію transcript і поведінку призупинення/відновлення, що й tools.call(...).
Форма реєстрації
Реєструйте простори імен з інтеграції, яка володіє базовими інструментами. Тримайте область малою та відкривайте лише доменні дієслова, які зіставляються з оголошеними інструментами каталогу.
createCodeModeNamespaceTool, registerCodeModeNamespaceForPlugin,} from "../agents/code-mode-namespaces.js"; const pluginId = "github"; registerCodeModeNamespaceForPlugin(pluginId, { id: "github-issues", globalName: "Issues", description: "GitHub issue helpers for the current repository.", requiredToolNames: ["github_list_issues", "github_update_issue"], prompt: "Use Issues.list(params) and Issues.update(number, patch).", createScope: (ctx) => ({ repository: ctx.config, list: createCodeModeNamespaceTool("github_list_issues", ([params]) => params ?? {}), update: createCodeModeNamespaceTool("github_update_issue", ([number, patch]) => ({ number, patch, })), }),});createCodeModeNamespaceTool(toolName, inputMapper) позначає член області як
викличну функцію простору імен. Необов’язковий inputMapper отримує гостьові
аргументи та повертає об’єкт вхідних даних для базового інструмента каталогу. Без
мапера вхідних даних використовується перший гостьовий аргумент або {}, якщо
його пропущено.
Сирі функції хоста відхиляються до запуску гостьового коду:
createScope: () => ({ // Wrong: this bypasses the catalog tool lifecycle and will be rejected. list: async () => githubClient.listIssues(),});Володіння та видимість
Володіння простором імен прив’язане до pluginId викликача реєстрації.
requiredToolNames є одночасно шлюзом видимості та перевіркою володіння:
- кожен потрібний інструмент має існувати в каталозі запуску
- кожен потрібний інструмент має мати
sourceName === pluginId - простір імен приховується, коли будь-який потрібний інструмент відсутній або належить іншому Plugin
- кожен викличний шлях може націлюватися лише на інструмент, названий у
requiredToolNames
Це запобігає тому, щоб інший Plugin відкрив простір імен, зареєструвавши однойменний інструмент. Це також тримає простори імен узгодженими зі звичайною політикою агента: якщо запуск не бачить базові інструменти, він не бачить і простір імен.
Наприклад, простір імен GitHub має жити за розширенням, яким володіє GitHub і яке володіє автентифікацією GitHub, клієнтами REST або GraphQL, обмеженнями швидкості, схваленнями запису та тестами. Основний режим коду не повинен вбудовувати API, специфічні для GitHub, обробку токенів або політику provider.
Правила серіалізації області
createScope(ctx) може повертати простий об’єкт, що містить JSON-сумісні
значення, масиви, вкладені об’єкти та маркери виклику
createCodeModeNamespaceTool(...). Об’єкти хоста ніколи не потрапляють
безпосередньо в QuickJS.
Серіалізатор відхиляє:
- сирі функції
- циклічні графи об’єктів
- небезпечні сегменти шляху:
__proto__,constructor,prototype, порожні ключі або ключі, що містять внутрішній розділювач шляху - значення
globalName, які не є ідентифікаторами JavaScript - конфлікти
globalNameз вбудованими глобальними об’єктами режиму коду, як-отtools,namespaces,text,json,yield_controlабо__openclaw*
Значення, які не можна JSON-серіалізувати, перетворюються на JSON-безпечні запасні значення перед перетином мосту. Бінарні дані, дескриптори, сокети, клієнти та екземпляри класів мають залишатися за звичайними інструментами каталогу.
Prompts
description простору імен і необов’язковий prompt додаються до видимої для
моделі схеми exec лише тоді, коли простір імен видимий для цього запуску.
Використовуйте їх, щоб навчити найменшій корисній поверхні:
{ description: "Fiction production service helpers.", prompt: "Use Fictions.riskAudit(), Fictions.promoteIfReady(id, status), and Fictions.unpaidOver(amount).",}Тримайте prompts про контракт простору імен, а не про налаштування автентифікації, історію реалізації чи непов’язану поведінку Plugin.
Очищення
Namespaces є локальними для процесу реєстраціями. Видаляйте їх, коли Plugin-власник вимкнено, видалено або відкочено:
clearCodeModeNamespacesForPlugin(pluginId);Очищення режиму коду належить Plugin; очищайте реєстрації простору імен Plugin,
коли його життєвий цикл завершується, замість зберігання обробників демонтажу для
кожного простору імен. Тести можуть викликати clearCodeModeNamespacesForTest(),
щоб уникнути витоку реєстрацій між випадками.
Контрольний список тестування
Зміни просторів імен мають покривати межу безпеки та поведінку гостьового коду:
- текст підказки простору імен з'являється лише тоді, коли базові інструменти видимі
- інструменти з такою самою назвою з іншого
sourceNameне відкривають простір імен - необроблені функції області дії відхиляються
- підроблені ідентифікатори просторів імен і підроблені шляхи відхиляються
- викличні шляхи не можуть націлюватися на неоголошені інструменти
- вкладені об'єкти та спільні посилання серіалізуються правильно
- виклики простору імен виконуються через інструменти каталогу й повертають JSON-безпечні деталі
- помилки може перехоплювати гостьовий код
- призупинені виклики простору імен відновлюються через
wait - відкат Plugin очищає реєстрації простору імен, що йому належать
Namespaces доповнюють загальний каталог tools.search / tools.call. Використовуйте
каталог для довільних увімкнених інструментів OpenClaw, Plugin і клієнта; використовуйте MCP для
інструментів MCP; використовуйте інші простори імен для належних Plugin задокументованих доменних API, де
лаконічний код надійніший за повторні пошуки схем.
API виводу
text(value) додає читабельний для людини вивід до масиву output.
json(value) додає структурований елемент виводу після JSON-сумісної
серіалізації.
Кінцеве повернене значення гостьового коду стає value у результаті completed.
Елемент виводу:
type CodeModeOutput = { type: "text"; text: string } | { type: "json"; value: unknown };Правила виводу:
- порядок виводу відповідає викликам гостьового коду
- вивід обмежено
maxOutputBytes - несеріалізовані значення перетворюються на звичайні рядки або помилки
- двійкові значення не підтримуються у v1
- зображення та файли передаються через звичайні інструменти OpenClaw, а не через міст режиму коду
Каталог інструментів
Прихований каталог містить інструменти після ефективної фільтрації політик:
- Основні інструменти OpenClaw.
- Інструменти вбудованих Plugin.
- Інструменти зовнішніх Plugin.
- Інструменти MCP.
- Інструменти, надані клієнтом, для поточного запуску.
Ідентифікатори каталогу стабільні в межах одного запуску й, коли можливо, детерміновані між еквівалентними наборами інструментів.
Рекомендована форма ідентифікатора:
<source>:<owner>:<tool-name>Приклади:
openclaw:core:messageplugin:browser:browser_requestmcp:github:create_issueclient:app:select_fileКаталог не містить керівних інструментів режиму коду:
execwaittool_search_codetool_searchtool_describetool_call
Це запобігає рекурсії та звужує контракт, видимий моделі.
Записи MCP залишаються в каталозі, обмеженому запуском, щоб політика, затвердження, хуки,
телеметрія, проєкція транскрипту й точні ідентифікатори інструментів залишалися спільними зі звичайним
виконанням інструментів. Подання ALL_TOOLS, tools.search(...),
tools.describe(...) і tools.call(...), видимі гостьовому коду, не містять записів MCP. Згенерований
простір імен MCP.<server>.<tool>({ ...input }) зіставляється назад із точним ідентифікатором
каталогу, а потім диспетчеризується через той самий шлях виконавця.
Взаємодія з пошуком інструментів
Режим коду замінює поверхню моделі OpenClaw для пошуку інструментів у запусках, де він активний.
Коли tools.codeMode.enabled дорівнює true і режим коду активується:
- OpenClaw не відкриває
tool_search_code,tool_search,tool_describeабоtool_callяк інструменти, видимі моделі. - Та сама ідея каталогізації переходить усередину гостьового середовища виконання.
- Гостьове середовище виконання отримує компактні метадані
ALL_TOOLSі помічники пошуку, опису та виклику для інструментів не-MCP. - Виклики MCP використовують згенерований простір імен
MCPта його заголовки$api()замістьtools.call(...). - Вкладені виклики диспетчеризуються через той самий шлях виконавця OpenClaw, який використовує пошук інструментів.
Наявна сторінка Пошук інструментів описує компактний
каталожний міст OpenClaw. Режим коду є загальною альтернативою OpenClaw для запусків, які можуть
використовувати exec і wait.
Назви інструментів і колізії
Видимий моделі інструмент exec є інструментом режиму коду. Якщо звичайний інструмент оболонки OpenClaw
exec увімкнено, він прихований від моделі й каталогізується як будь-який
інший інструмент.
Усередині гостьового середовища виконання:
tools.call("openclaw:core:exec", input)може викликати інструмент оболонки exec, якщо політика це дозволяє.tools.exec(...)встановлюється лише тоді, коли запис каталогу оболонки exec має однозначну безпечну назву.- інструмент режиму коду
execніколи не доступний рекурсивно черезtools.
Якщо два інструменти нормалізуються до тієї самої безпечної зручної назви, OpenClaw пропускає
зручну функцію й вимагає tools.call(id, input).
Вкладене виконання інструментів
Кожен вкладений виклик інструмента перетинає міст хоста й повторно входить в OpenClaw.
Вкладене виконання зберігає:
- ідентифікатор активного агента
- ідентифікатор сеансу та ключ сеансу
- контекст відправника й каналу
- політику пісочниці
- політику затверджень
- хуки Plugin
before_tool_call - сигнал переривання
- потокові оновлення, де вони доступні
- події траєкторії та аудиту
Вкладені виклики проєктуються в транскрипт як справжні виклики інструментів, щоб пакети підтримки могли показати, що сталося. Проєкція ідентифікує батьківський виклик інструмента режиму коду та ідентифікатор вкладеного інструмента.
Паралельні вкладені виклики дозволено до maxPendingToolCalls.
Стан середовища виконання
Кожен запуск режиму коду має машину станів:
running: VM виконується або вкладені виклики ще тривають.waiting: знімок VM існує й може бути відновлений черезwait.completed: кінцеве значення повернено; знімок видалено.failed: помилку повернено; знімок видалено.expired: знімок або очікуваний стан перевищив строк зберігання; відновлення неможливе.aborted: батьківський запуск/сеанс скасовано; знімок видалено.
Стан обмежено запуском агента, сеансом та ідентифікатором виклику інструмента. Виклик wait з
іншого запуску або сеансу завершується помилкою.
Сховище знімків обмежене:
- максимальна кількість байтів знімка на запуск
- максимальна кількість активних знімків на процес
- TTL знімка
- очищення після завершення запуску
- очищення під час вимкнення Gateway, де сталість не підтримується
Середовище виконання QuickJS-WASI
OpenClaw завантажує quickjs-wasi як пряму залежність у пакеті-власнику. Середовище
виконання не покладається на транзитивну копію, встановлену для proxy, PAC або інших
непов'язаних залежностей.
Обов'язки середовища виконання:
- компілювати або завантажувати WebAssembly-модуль QuickJS-WASI
- створювати одну ізольовану VM для кожного запуску або відновлення режиму коду
- реєструвати зворотні виклики хоста за стабільними назвами
- встановлювати обмеження пам'яті та переривань
- оцінювати JavaScript
- спорожнювати очікувані завдання
- створювати знімок призупиненого стану VM
- відновлювати знімки для
wait - звільняти дескриптори VM і знімки після термінальних станів
Середовище виконання працює поза головним циклом подій OpenClaw у worker. Нескінченний цикл у гостьовому коді не повинен безстроково блокувати процес Gateway.
TypeScript
Підтримка TypeScript є лише перетворенням джерела:
- прийнятий вхід: один рядок коду TypeScript
- вихід: рядок JavaScript, який оцінюється QuickJS-WASI
- без перевірки типів
- без розв'язання модулів
- без
importабоrequireу v1 - діагностика повертається як результати
failed
Компілятор TypeScript завантажується ліниво лише для комірок TypeScript. Звичайні комірки JavaScript і вимкнений режим коду не завантажують компілятор.
Перетворення має зберігати корисні номери рядків, де це можливо.
Межа безпеки
Код моделі є ворожим. Середовище виконання використовує багаторівневий захист:
- запускати QuickJS-WASI поза головним циклом подій
- завантажувати
quickjs-wasiяк пряму залежність, а не через Codex або транзитивний пакет - без файлової системи, мережі, підпроцесів, імпорту модулів, змінних середовища або глобальних об'єктів хоста в гостьовому коді
- використовувати обмеження пам'яті та переривань QuickJS
- застосовувати таймаут настінного часу батьківського процесу
- застосовувати ліміти виводу, знімків, журналів і очікуваних викликів
- серіалізувати значення мосту хоста через вузький JSON-адаптер
- перетворювати помилки хоста на звичайні помилки гостьового коду, ніколи не на об'єкти realm хоста
- відкидати знімки під час таймауту, переривання, завершення сеансу або закінчення строку дії
- відхиляти рекурсивний доступ до
exec,waitі керівних інструментів пошуку інструментів - запобігати тому, щоб колізії зручних назв затіняли помічники каталогу
Пісочниця є одним шаром безпеки. Операторам усе ще може знадобитися посилення на рівні ОС для розгортань із високим ризиком.
Коди помилок
type CodeModeErrorCode = | "runtime_unavailable" | "invalid_config" | "invalid_input" | "unsupported_language" | "typescript_transform_failed" | "module_access_denied" | "timeout" | "memory_limit_exceeded" | "output_limit_exceeded" | "snapshot_limit_exceeded" | "snapshot_expired" | "snapshot_restore_failed" | "too_many_pending_tool_calls" | "nested_tool_failed" | "aborted" | "internal_error";Помилки, повернені гостьовому коду, є звичайними даними. Екземпляри Error хоста, об'єкти
стека, прототипи та функції хоста не переходять у QuickJS.
Телеметрія
Режим коду повідомляє:
- видимі назви інструментів, надіслані моделі
- розмір прихованого каталогу та розподіл за джерелами
- кількість
execіwait - кількість вкладених пошуків, описів і викликів
- ідентифікатори викликаних вкладених інструментів
- збої через таймаут, пам'ять, знімки та ліміти виводу
- події життєвого циклу знімків
Телеметрія не повинна містити секрети, необроблені значення середовища або нередаговані вхідні дані інструментів поза чинною політикою траєкторії OpenClaw.
Налагодження
Використовуйте цільове журналювання транспорту моделі, коли режим коду поводиться інакше, ніж звичайний запуск інструмента:
OPENCLAW_DEBUG_CODE_MODE=1 \OPENCLAW_DEBUG_MODEL_TRANSPORT=1 \OPENCLAW_DEBUG_MODEL_PAYLOAD=tools \OPENCLAW_DEBUG_SSE=events \openclaw gatewayДля налагодження форми payload використовуйте OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted.
Це журналює обмежений, відредагований JSON-знімок запиту моделі; його слід
використовувати лише під час налагодження, тому що підказки й текст повідомлень усе ще можуть з'являтися.
Для налагодження потоку використовуйте OPENCLAW_DEBUG_SSE=peek, щоб журналювати перші п'ять
відредагованих подій SSE. Режим коду також закривається з помилкою, якщо кінцевий payload провайдера
не містить рівно exec і wait після активації поверхні режиму коду.
Схема реалізації
Одиниці реалізації:
- контракт конфігурації:
tools.codeMode - побудовник каталогу: ефективні інструменти в компактні записи та карту ідентифікаторів
- адаптер поверхні моделі: замінює видимі інструменти на
execіwait - адаптер середовища виконання QuickJS-WASI: завантаження, eval, знімок, відновлення, звільнення
- supervisor worker: таймаут, переривання, ізоляція аварій
- адаптер мосту: JSON-безпечні зворотні виклики хоста та доставка результатів
- адаптер перетворення TypeScript
- сховище знімків: TTL, ліміти розміру, обмеження запуском/сеансом
- проєкція траєкторії для вкладених викликів інструментів
- лічильники телеметрії та діагностика
Реалізація повторно використовує концепції каталогу та виконавця з пошуку інструментів, але
не використовує дочірній процес node:vm як пісочницю.
Контрольний список валідації
Покриття режиму коду має довести:
- вимкнена конфігурація залишає наявну експозицію інструментів без змін
- об’єктна конфігурація без
enabled: trueзалишає режим коду вимкненим - увімкнена конфігурація відкриває моделі лише
execіwait, коли інструменти активні для запуску - сирі запуски без інструментів,
disableToolsі порожні allowlist не запускають примусове застосування payload режиму коду - усі ефективні інструменти не-MCP з’являються в
ALL_TOOLS - заборонені інструменти не з’являються в
ALL_TOOLS tools.search,tools.describeіtools.callпрацюють для інструментів OpenClawAPI.list("mcp")іAPI.read("mcp/<server>.d.ts")відкривають оголошення MCP у стилі TypeScript без виклику мосту/інструмента- простір імен MCP
$api()залишається доступним як вбудований fallback для схем - виклики простору імен MCP працюють для видимих інструментів MCP з одним об’єктним вводом, тоді як
прямі записи каталогу MCP відсутні в
tools.* - керівні інструменти Tool Search приховані і від поверхні моделі, і від прихованого каталогу
- вкладені виклики зберігають поведінку затверджень і хуків
- shell
execприхований від моделі, але його можна викликати за ідентифікатором каталогу, коли це дозволено - рекурсивні
execіwaitрежиму коду не можна викликати з гостьового коду - ввід TypeScript трансформується та оцінюється без завантаження TypeScript на вимкнених шляхах або шляхах лише JavaScript
- доступ до
import,require, файлової системи, мережі та середовища завершується невдачею - нескінченні цикли завершуються за тайм-аутом і не можуть блокувати Gateway
- збої через обмеження пам’яті завершують роботу гостьової VM
- обмеження виводу та snapshot застосовуються для завершених і призупинених викликів
waitвідновлює призупинений snapshot і повертає фінальне значення- прострочені, перервані, неправильні для сеансу та невідомі значення
runIdзавершуються невдачею - відтворення transcript і persistence зберігають керівні виклики режиму коду
- transcript і telemetry чітко показують вкладені виклики інструментів
План E2E-тестування
Запускайте їх як інтеграційні або наскрізні тести під час зміни runtime:
- Запустіть Gateway з
tools.codeMode.enabled: false. - Надішліть хід агента з невеликим прямим набором інструментів.
- Переконайтеся, що видимі для моделі інструменти не змінилися.
- Перезапустіть із
tools.codeMode.enabled: true. - Надішліть хід агента з тестовими інструментами OpenClaw, Plugin, MCP і клієнта.
- Переконайтеся, що видимий для моделі список інструментів точно дорівнює
exec,wait. - У
execпрочитайтеALL_TOOLSі переконайтеся, що ефективні тестові інструменти присутні. - У
execвикличте інструменти OpenClaw/Plugin/клієнта черезtools.search,tools.describeіtools.call. - У
execвикличтеAPI.list("mcp")іAPI.read("mcp/<server>.d.ts")та переконайтеся, що файли оголошень описують видимі інструменти MCP. - У
execвикличте інструменти MCP черезMCP.<server>.<tool>({ ...input })і переконайтеся, що прямі записи каталогу MCP відсутні вALL_TOOLSіtools.*. - Переконайтеся, що заборонені інструменти відсутні та їх не можна викликати за вгаданим ідентифікатором.
- Запустіть вкладений виклик інструмента, який завершується після того, як
execповертаєwaiting. - Викличте
waitі переконайтеся, що відновлена VM отримує результат інструмента. - Переконайтеся, що фінальна відповідь містить вивід, створений після відновлення.
- Переконайтеся, що тайм-аут, переривання та завершення строку дії snapshot очищають стан runtime.
- Експортуйте trajectory і переконайтеся, що вкладені виклики видимі під батьківським викликом режиму коду.
Для змін лише в документації на цій сторінці все одно слід запускати pnpm check:docs.