Перейти к основному содержанию
Обвязка агента — это низкоуровневый исполнитель для одного подготовленного хода агента OpenClaw. Это не провайдер модели, не канал и не реестр инструментов. Ментальную модель для пользователей см. в средах выполнения агентов. Используйте эту поверхность только для встроенных или доверенных нативных plugins. Контракт пока экспериментальный, потому что типы параметров намеренно отражают текущий встроенный runner.

Когда использовать обвязку

Регистрируйте обвязку агента, когда у семейства моделей есть собственная нативная среда выполнения сеанса, а обычный транспорт провайдера OpenClaw является неверной абстракцией. Примеры:
  • нативный сервер coding-agent, который владеет тредами и Compaction
  • локальный CLI или daemon, который должен стримить нативные события планирования, рассуждений и инструментов
  • среда выполнения модели, которой нужен собственный resume id в дополнение к транскрипту сеанса OpenClaw
Не регистрируйте обвязку только для добавления нового API LLM. Для обычных HTTP- или WebSocket API моделей создайте provider plugin.

Чем по-прежнему владеет ядро

До выбора обвязки OpenClaw уже определил:
  • провайдера и модель
  • состояние runtime-аутентификации
  • уровень thinking и бюджет контекста
  • файл транскрипта/сеанса OpenClaw
  • рабочую область, sandbox и политику инструментов
  • callback-и ответа канала и callback-и стриминга
  • политику fallback модели и live-переключения модели
Такое разделение намеренное. Обвязка выполняет подготовленную попытку; она не выбирает провайдеров, не заменяет доставку канала и не переключает модели незаметно. Подготовленная попытка также включает params.runtimePlan — принадлежащий OpenClaw набор политик для runtime-решений, которые должны оставаться общими для OpenClaw и нативных обвязок:
  • runtimePlan.tools.normalize(...) и runtimePlan.tools.logDiagnostics(...) для политики схем инструментов с учетом провайдера
  • runtimePlan.transcript.resolvePolicy(...) для очистки транскрипта и политики исправления вызовов инструментов
  • runtimePlan.delivery.isSilentPayload(...) для общей обработки NO_REPLY и подавления доставки медиа
  • runtimePlan.outcome.classifyRunResult(...) для классификации fallback модели
  • runtimePlan.observability для разрешенных метаданных провайдера/модели/обвязки
Обвязки могут использовать план для решений, которые должны совпадать с поведением OpenClaw, но должны по-прежнему считать его состоянием попытки, принадлежащим host-у. Не изменяйте его и не используйте для переключения провайдеров/моделей внутри хода.

Регистрация обвязки

Импорт: openclaw/plugin-sdk/agent-harness
import type { AgentHarness } from "openclaw/plugin-sdk/agent-harness";
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";

const myHarness: AgentHarness = {
  id: "my-harness",
  label: "My native agent harness",

  supports(ctx) {
    return ctx.provider === "my-provider"
      ? { supported: true, priority: 100 }
      : { supported: false };
  },

  async runAttempt(params) {
    // Start or resume your native thread.
    // Use params.prompt, params.tools, params.images, params.onPartialReply,
    // params.onAgentEvent, and the other prepared attempt fields.
    return await runMyNativeTurn(params);
  },
};

export default definePluginEntry({
  id: "my-native-agent",
  name: "My Native Agent",
  description: "Runs selected models through a native agent daemon.",
  register(api) {
    api.registerAgentHarness(myHarness);
  },
});

Политика выбора

OpenClaw выбирает обвязку после разрешения провайдера/модели:
  1. Побеждает политика среды выполнения уровня модели.
  2. Затем применяется политика среды выполнения уровня провайдера.
  3. auto запрашивает у зарегистрированных обвязок, поддерживают ли они разрешенную пару провайдер/модель.
  4. Если ни одна зарегистрированная обвязка не подходит, OpenClaw использует встроенную среду выполнения.
Сбои обвязки Plugin отображаются как сбои запуска. В режиме auto встроенный fallback используется только когда ни одна зарегистрированная обвязка Plugin не поддерживает разрешенную пару провайдер/модель. После того как обвязка Plugin заявила запуск, OpenClaw не переигрывает тот же ход через другую среду выполнения, потому что это может изменить семантику аутентификации/runtime или продублировать побочные эффекты. Пины среды выполнения на уровне всего сеанса и всего агента игнорируются выбором. Это включает устаревшие значения сеанса agentHarnessId, agents.defaults.agentRuntime, agents.list[].agentRuntime и OPENCLAW_AGENT_RUNTIME. /status показывает эффективную среду выполнения, выбранную из маршрута провайдера/модели. Если выбранная обвязка неожиданна, включите debug-логирование agents/harness и проверьте структурированную запись Gateway agent harness selected. Она включает id выбранной обвязки, причину выбора, политику runtime/fallback и, в режиме auto, результат поддержки каждого кандидата Plugin. Встроенный Plugin Codex регистрирует codex как id своей обвязки. Ядро трактует это как обычный id обвязки Plugin; специфичные для Codex alias-ы должны находиться в Plugin или конфигурации оператора, а не в общем селекторе среды выполнения.

Сочетание провайдера и обвязки

Большинство обвязок также должны регистрировать провайдера. Провайдер делает ref-ы моделей, статус аутентификации, метаданные моделей и выбор /model видимыми для остальной части OpenClaw. Затем обвязка заявляет этот провайдер в supports(...). Встроенный Plugin Codex следует этому шаблону:
  • предпочтительные пользовательские ref-ы моделей: openai/gpt-5.5
  • совместимые ref-ы: устаревшие ref-ы codex/gpt-* остаются принимаемыми, но новые конфиги не должны использовать их как обычные ref-ы провайдера/модели
  • id обвязки: codex
  • auth: синтетическая доступность провайдера, потому что обвязка Codex владеет нативным логином/сеансом Codex
  • запрос app-server: OpenClaw отправляет в Codex bare model id и позволяет обвязке общаться с нативным протоколом app-server
Plugin Codex является добавочным. Обычные ref-ы агентов openai/gpt-* на официальном провайдере OpenAI по умолчанию выбирают обвязку Codex. Более старые ref-ы codex/gpt-* по-прежнему выбирают провайдера и обвязку Codex для совместимости. Настройку оператора, примеры префиксов моделей и конфиги только для Codex см. в Codex Harness. OpenClaw требует Codex app-server 0.125.0 или новее. Plugin Codex проверяет handshake инициализации app-server и блокирует более старые или неверсированные серверы, чтобы OpenClaw запускался только на поверхности протокола, с которой был протестирован. Нижняя граница 0.125.0 включает поддержку payload нативного MCP hook, появившуюся в Codex 0.124.0, при этом закрепляя OpenClaw на более новой протестированной стабильной линии.

Middleware результатов инструментов

Встроенные plugins и явно включенные установленные plugins с подходящими контрактами manifest могут подключать runtime-neutral middleware результатов инструментов через api.registerAgentToolResultMiddleware(...), когда их manifest объявляет целевые id сред выполнения в contracts.agentToolResultMiddleware. Эта доверенная граница предназначена для async-преобразований результатов инструментов, которые должны выполняться до того, как OpenClaw или Codex передаст вывод инструмента обратно в модель. Устаревшие встроенные plugins по-прежнему могут использовать api.registerCodexAppServerExtensionFactory(...) для middleware только Codex app-server, но новые преобразования результатов должны использовать runtime-neutral API. Hook api.registerEmbeddedExtensionFactory(...), работавший только для embedded-runner, был удален; встроенные преобразования результатов инструментов должны использовать runtime-neutral middleware.

Классификация терминального исхода

Нативные обвязки, которые владеют собственной проекцией протокола, могут использовать classifyAgentHarnessTerminalOutcome(...) из openclaw/plugin-sdk/agent-harness-runtime, когда завершенный ход не произвел видимого текста assistant. Helper возвращает empty, reasoning-only или planning-only, чтобы политика fallback OpenClaw могла решить, нужно ли повторить попытку на другой модели. planning-only требует явного поля planText обвязки; OpenClaw не выводит его из prose assistant. Helper намеренно не классифицирует ошибки prompt, выполняющиеся ходы и намеренные тихие ответы, такие как NO_REPLY.

Побочные эффекты завершения агента

Нативные обвязки должны вызывать runAgentEndSideEffects(...) из openclaw/plugin-sdk/agent-harness-runtime после финализации попытки. Он dispatch-ит переносимый hook agent_end и research capture OpenClaw без задержки интерактивных ответов. Используйте awaitAgentEndSideEffects(...) для локальных неинтерактивных запусков, где попытка не должна завершаться, пока эти побочные эффекты не закончатся. Оба helper-а принимают тот же payload { event, ctx }, что и runAgentHarnessAgentEndHook(...); их сбои не изменяют результат завершенной попытки.

Пользовательский ввод и поверхности инструментов

Нативные обвязки, которые предоставляют runtime-level запрос пользовательского ввода, должны использовать helper-ы пользовательского ввода из openclaw/plugin-sdk/agent-harness-runtime, чтобы форматировать prompt, доставлять его через блокирующий путь ответа OpenClaw и нормализовать ответы choice/free-form обратно в нативную форму ответа среды выполнения. Helper сохраняет единообразное представление канала/TUI, пока каждая обвязка сохраняет собственный парсинг протокола и жизненный цикл pending-request. Нативные обвязки, которым нужна похожая на PI компактная маршрутизация инструментов, должны использовать createAgentHarnessToolSurfaceRuntime(...) из openclaw/plugin-sdk/agent-harness-tool-runtime. Он владеет выбором управления tool-search/code-mode, lean defaults локальной модели, фильтрацией схем, совместимой с runtime, выполнением скрытого catalog, directory hydration и очисткой catalog. Обвязки по-прежнему владеют своей SDK-specific конвертацией инструментов и native execution callback.

Режим нативной обвязки Codex

Встроенная обвязка codex — это нативный режим Codex для встроенных ходов агента OpenClaw. Сначала включите встроенный Plugin codex и добавьте codex в plugins.allow, если ваш конфиг использует ограничительный allowlist. Конфиги нативного app-server должны использовать openai/gpt-*; ходы агентов OpenAI выбирают обвязку Codex по умолчанию. Устаревшие маршруты ref-ов моделей Codex следует исправлять с помощью openclaw doctor --fix, а устаревшие ref-ы моделей codex/* остаются alias-ами совместимости для нативной обвязки. Когда этот режим работает, Codex владеет нативным thread id, поведением resume, Compaction и выполнением app-server. OpenClaw по-прежнему владеет каналом чата, видимым зеркалом транскрипта, политикой инструментов, approvals, доставкой медиа и выбором сеанса. Используйте provider/model agentRuntime.id: "codex", когда нужно доказать, что только путь Codex app-server может заявить запуск. Явные runtime-ы Plugin fail closed; сбои выбора Codex app-server и сбои runtime не повторяются через другую среду выполнения.

Строгость среды выполнения

По умолчанию OpenClaw использует runtime policy провайдера/модели auto: зарегистрированные обвязки Plugin могут заявить пару провайдер/модель, а встроенная среда выполнения обрабатывает ход, когда совпадений нет. Ref-ы агентов OpenAI на официальном провайдере OpenAI по умолчанию используют Codex. Используйте явную среду выполнения Plugin для провайдера/модели, например agentRuntime.id: "codex", когда отсутствие выбора обвязки должно приводить к сбою, а не к маршрутизации через встроенную среду выполнения. Сбои выбранной обвязки Plugin всегда завершаются жесткой ошибкой. Это не блокирует явный provider/model agentRuntime.id: "openclaw". Для embedded-запусков только Codex:
{
  "models": {
    "providers": {
      "openai": {
        "agentRuntime": {
          "id": "codex"
        }
      }
    }
  },
  "agents": {
    "defaults": {
      "model": "openai/gpt-5.5"
    }
  }
}
Если вам нужен CLI backend для одной канонической модели, задайте runtime в этой записи модели:
{
  "agents": {
    "defaults": {
      "model": "anthropic/claude-opus-4-8",
      "models": {
        "anthropic/claude-opus-4-8": {
          "agentRuntime": {
            "id": "claude-cli"
          }
        }
      }
    }
  }
}
Переопределения для отдельных агентов используют ту же форму уровня модели:
{
  "agents": {
    "list": [
      {
        "id": "codex-only",
        "model": "openai/gpt-5.5",
        "models": {
          "openai/gpt-5.5": {
            "agentRuntime": { "id": "codex" }
          }
        }
      }
    ]
  }
}
Устаревшие примеры runtime уровня всего агента, подобные этому, игнорируются:
{
  "agents": {
    "defaults": {
      "agentRuntime": {
        "id": "codex"
      }
    }
  }
}
При явном runtime Plugin сеанс завершается с ошибкой на раннем этапе, если запрошенная обвязка не зарегистрирована, не поддерживает разрешенного провайдера/модель или завершается с ошибкой до создания побочных эффектов хода. Это сделано намеренно для развертываний только с Codex и для live-тестов, которые должны доказать, что путь app-server Codex действительно используется. Этот параметр управляет только встроенной обвязкой агента. Он не отключает маршрутизацию моделей для изображений, видео, музыки, TTS, PDF или других специфичных для провайдера моделей.

Нативные сеансы и зеркало транскрипта

Обвязка может хранить нативный id сеанса, id треда или токен возобновления на стороне демона. Держите эту привязку явно связанной с сеансом OpenClaw и продолжайте зеркалировать видимый пользователю вывод ассистента/инструментов в транскрипт OpenClaw. Транскрипт OpenClaw остается слоем совместимости для:
  • истории сеанса, видимой в канале
  • поиска и индексирования транскриптов
  • переключения обратно на встроенную обвязку OpenClaw на последующем ходе
  • общего поведения /new, /reset и удаления сеансов
Если ваша обвязка хранит боковую привязку, реализуйте reset(...), чтобы OpenClaw мог очистить ее при сбросе соответствующего сеанса OpenClaw.

Результаты инструментов и медиа

Ядро формирует список инструментов OpenClaw и передает его в подготовленную попытку. Когда обвязка выполняет динамический вызов инструмента, возвращайте результат инструмента обратно через форму результата обвязки, а не отправляйте медиа в канал самостоятельно. Это сохраняет вывод текста, изображений, видео, музыки, TTS, подтверждений и инструментов обмена сообщениями на том же пути доставки, что и запуски на базе OpenClaw.

Текущие ограничения

  • Публичный путь импорта является общим, но некоторые псевдонимы типов попыток/результатов все еще содержат устаревшие имена для совместимости.
  • Установка сторонних обвязок является экспериментальной. Предпочитайте provider plugins, пока вам не потребуется runtime нативного сеанса.
  • Переключение обвязок поддерживается между ходами. Не переключайте обвязки в середине хода после запуска нативных инструментов, подтверждений, текста ассистента или отправки сообщений.

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