CLI-бэкенды (резервная среда выполнения)¶
OpenClaw может запускать локальные AI CLI как текстовый резервный вариант, когда провайдеры API недоступны, ограничены по скорости или временно работают некорректно. Это намеренно консервативный режим:
- Инструменты отключены (без вызовов инструментов).
- Текст на вход → текст на выход (надёжно).
- Сеансы поддерживаются (поэтому последующие реплики остаются связными).
- Изображения могут передаваться при условии, что CLI принимает пути к изображениям.
Это спроектировано как страховочная сетка, а не как основной путь. Используйте его, когда нужны ответы «всегда работает» без зависимости от внешних API.
Быстрый старт для начинающих¶
Вы можете использовать Claude Code CLI без какой-либо конфигурации (OpenClaw поставляется со встроенным значением по умолчанию):
openclaw agent --message "hi" --model claude-cli/opus-4.6
Codex CLI также работает «из коробки»:
openclaw agent --message "hi" --model codex-cli/gpt-5.3-codex
Если ваш шлюз запускается под launchd/systemd и PATH минимален, добавьте только путь к команде:
{
agents: {
defaults: {
cliBackends: {
"claude-cli": {
command: "/opt/homebrew/bin/claude",
},
},
},
},
}
Вот и всё. Никаких ключей, никакой дополнительной конфигурации аутентификации, кроме самой CLI.
Использование в качестве резервного варианта¶
Добавьте CLI-бэкенд в список резервных, чтобы он использовался только при сбое основных моделей:
{
agents: {
defaults: {
model: {
primary: "anthropic/claude-opus-4-6",
fallbacks: ["claude-cli/opus-4.6", "claude-cli/opus-4.5"],
},
models: {
"anthropic/claude-opus-4-6": { alias: "Opus" },
"claude-cli/opus-4.6": {},
"claude-cli/opus-4.5": {},
},
},
},
}
Примечания:
- Если вы используете
agents.defaults.models(список разрешённых), необходимо включитьclaude-cli/.... - Если основной провайдер не отвечает (аутентификация, лимиты, тайм-ауты), OpenClaw попробует CLI-бэкенд следующим.
Обзор конфигурации¶
Все CLI-бэкенды находятся в:
agents.defaults.cliBackends
Каждая запись задаётся идентификатором провайдера (например, claude-cli, my-cli).
Идентификатор провайдера становится левой частью ссылки на модель:
<provider>/<model>
Пример конфигурации¶
{
agents: {
defaults: {
cliBackends: {
"claude-cli": {
command: "/opt/homebrew/bin/claude",
},
"my-cli": {
command: "my-cli",
args: ["--json"],
output: "json",
input: "arg",
modelArg: "--model",
modelAliases: {
"claude-opus-4-6": "opus",
"claude-opus-4-5": "opus",
"claude-sonnet-4-5": "sonnet",
},
sessionArg: "--session",
sessionMode: "existing",
sessionIdFields: ["session_id", "conversation_id"],
systemPromptArg: "--system",
systemPromptWhen: "first",
imageArg: "--image",
imageMode: "repeat",
serialize: true,
},
},
},
},
}
Как это работает¶
- Выбирает бэкенд по префиксу провайдера (
claude-cli/...). - Формирует системный prompt с использованием того же prompt OpenClaw + контекста рабочего пространства.
- Выполняет CLI с идентификатором сеанса (если поддерживается), чтобы история оставалась согласованной.
- Разбирает вывод (JSON или обычный текст) и возвращает финальный текст.
- Сохраняет идентификаторы сеансов для каждого бэкенда, чтобы последующие запросы переиспользовали тот же сеанс CLI.
Сеансы¶
- Если CLI поддерживает сеансы, установите
sessionArg(например,--session-id) илиsessionArgs(заглушка{sessionId}), когда идентификатор нужно подставлять в несколько флагов. - Если CLI использует подкоманду возобновления с другими флагами, установите
resumeArgs(заменяетargsпри возобновлении) и при необходимостиresumeOutput(для возобновлений без JSON). sessionMode:always: всегда отправлять идентификатор сеанса (новый UUID, если ничего не сохранено).existing: отправлять идентификатор сеанса только если он был сохранён ранее.none: никогда не отправлять идентификатор сеанса.
Изображения (сквозная передача)¶
Если ваш CLI принимает пути к изображениям, установите imageArg:
imageArg: "--image",
imageMode: "repeat"
OpenClaw записывает изображения base64 во временные файлы. Если задан imageArg,
эти пути передаются как аргументы CLI. Если imageArg отсутствует, OpenClaw
добавляет пути к файлам в prompt (инъекция пути), чего достаточно для CLI,
которые автоматически загружают локальные файлы по обычным путям (поведение Claude Code CLI).
Ввод / вывод¶
output: "json"(по умолчанию) пытается разобрать JSON и извлечь текст + идентификатор сеанса.output: "jsonl"разбирает потоки JSONL (Codex CLI--json) и извлекает последнее сообщение агента, а такжеthread_idпри наличии.output: "text"рассматривает stdout как финальный ответ.
Режимы ввода:
input: "arg"(по умолчанию) передаёт prompt как последний аргумент CLI.input: "stdin"отправляет prompt через stdin.- Если prompt очень длинный и задан
maxPromptArgChars, используется stdin.
Значения по умолчанию (встроенные)¶
OpenClaw поставляется со значением по умолчанию для claude-cli:
command: "claude"args: ["-p", "--output-format", "json", "--dangerously-skip-permissions"]resumeArgs: ["-p", "--output-format", "json", "--dangerously-skip-permissions", "--resume", "{sessionId}"]modelArg: "--model"systemPromptArg: "--append-system-prompt"sessionArg: "--session-id"systemPromptWhen: "first"sessionMode: "always"
OpenClaw также поставляется со значением по умолчанию для codex-cli:
command: "codex"args: ["exec","--json","--color","never","--sandbox","read-only","--skip-git-repo-check"]resumeArgs: ["exec","resume","{sessionId}","--color","never","--sandbox","read-only","--skip-git-repo-check"]output: "jsonl"resumeOutput: "text"modelArg: "--model"imageArg: "--image"sessionMode: "existing"
Переопределяйте только при необходимости (часто: абсолютный путь command).
Ограничения¶
- Без инструментов OpenClaw (CLI-бэкенд никогда не получает вызовы инструментов). Некоторые CLI всё же могут запускать собственные агентные инструменты.
- Без потоковой передачи (вывод CLI собирается целиком, затем возвращается).
- Структурированные выводы зависят от JSON-формата CLI.
- Сеансы Codex CLI возобновляются через текстовый вывод (без JSONL), что менее
структурировано, чем первоначальный запуск
--json. Сеансы OpenClaw при этом продолжают работать нормально.
Устранение неполадок¶
- CLI не найден: задайте
commandкак полный путь. - Неверное имя модели: используйте
modelAliasesдля сопоставленияprovider/model→ модель CLI. - Нет непрерывности сеанса: убедитесь, что задан
sessionArgи чтоsessionModeне равенnone(Codex CLI в настоящее время не может возобновляться с JSON-выводом). - Изображения игнорируются: установите
imageArg(и убедитесь, что CLI поддерживает пути к файлам).