Gateway
Бекенди CLI
OpenClaw може запускати локальний AI CLI як суто текстовий резервний варіант, коли постачальники API недоступні, обмежують частоту запитів або працюють некоректно. Цей механізм навмисно консервативний:
- Інструменти OpenClaw не впроваджуються безпосередньо, але бекенд із
bundleMcp: trueможе отримувати інструменти Gateway через локальний MCP-міст. - Потокове передавання JSONL для CLI, які його підтримують.
- Підтримуються сеанси, тому наступні репліки залишаються узгодженими.
- Зображення передаються наскрізно, якщо CLI приймає шляхи до зображень.
Використовуйте цей механізм як запобіжний варіант для текстових відповідей, що «завжди працюють», а не як основний шлях. Для повноцінного середовища виконання з керуванням сеансами ACP, фоновими завданнями, прив’язуванням потоків/розмов і постійними зовнішніми сеансами програмування натомість використовуйте агентів ACP; бекенди CLI не є ACP.
Швидкий початок
Вбудований плагін Anthropic реєструє типовий бекенд claude-cli, тому він працює без додаткової конфігурації, якщо Claude Code встановлено й у ньому виконано вхід:
openclaw agent --agent main --message "hi" --model claude-cli/claude-sonnet-4-6main — типовий ідентифікатор агента, коли явний список агентів не налаштовано; інакше замініть його власним ідентифікатором агента.
Якщо Gateway працює через launchd/systemd із мінімальним PATH, укажіть шлях до виконуваного файла явно:
{ agents: { defaults: { cliBackends: { "claude-cli": { command: "/opt/homebrew/bin/claude", }, }, }, },}Якщо вбудований бекенд CLI використовується як основний постачальник повідомлень на хості Gateway, OpenClaw автоматично завантажує відповідний вбудований плагін, коли конфігурація посилається на цей бекенд у посиланні на модель або в agents.defaults.cliBackends.
Використання як резервного варіанта
Додайте бекенд CLI до списку резервних варіантів, щоб він запускався лише в разі відмови основних моделей:
{ agents: { defaults: { model: { primary: "anthropic/claude-opus-4-6", fallbacks: ["claude-cli/claude-sonnet-4-6"], }, models: { "anthropic/claude-opus-4-6": { alias: "Opus" }, "claude-cli/claude-sonnet-4-6": {}, }, }, },}Якщо agents.defaults.models використовується як список дозволених значень, також додайте до нього моделі бекенду CLI. Коли основний постачальник зазнає відмови через автентифікацію, обмеження частоти запитів або перевищення часу очікування, OpenClaw наступним пробує бекенд CLI.
Конфігурація
Усі бекенди CLI розміщуються в agents.defaults.cliBackends із ключами за ідентифікатором постачальника (наприклад, claude-cli, my-cli). Ідентифікатор постачальника стає лівою частиною посилання на модель: <provider>/<model>.
{ agents: { defaults: { cliBackends: { "my-cli": { command: "my-cli", args: ["--json"], output: "json", input: "arg", modelArg: "--model", modelAliases: { "claude-opus-4-6": "opus", "claude-sonnet-4-6": "sonnet", }, sessionArg: "--session", sessionMode: "existing", sessionIdFields: ["session_id", "conversation_id"], systemPromptArg: "--system", // Спеціальний прапорець файла системної підказки: // systemPromptFileArg: "--system-file", // Або натомість прапорець перевизначення конфігурації в стилі Codex: // systemPromptFileConfigArg: "-c", // systemPromptFileConfigKey: "model_instructions_file", systemPromptWhen: "first", imageArg: "--image", imageMode: "repeat", // Увімкніть лише тоді, коли цьому бекенду дозволено повторно заповнювати // недійсні сеанси з обмеженої необробленої історії стенограми OpenClaw до Compaction. reseedFromRawTranscriptWhenUncompacted: true, serialize: true, }, }, }, },}Принцип роботи
- Вибирає бекенд за префіксом постачальника (
claude-cli/...). - Створює системну підказку з використанням тієї самої підказки OpenClaw і контексту робочого простору.
- Запускає CLI з ідентифікатором сеансу (якщо підтримується), щоб історія залишалася узгодженою. Вбудований бекенд
claude-cliпідтримує окремий процес stdio Claude для кожного сеансу OpenClaw і надсилає наступні репліки через stdin у форматі stream-json. - Аналізує виведення (JSON або звичайний текст) і повертає остаточний текст.
- Зберігає ідентифікатори сеансів для кожного бекенду, щоб наступні репліки повторно використовували той самий сеанс CLI.
Особливості Claude CLI
Вбудований бекенд claude-cli надає перевагу вбудованому механізму пошуку навичок Claude Code. Коли поточний знімок навичок містить принаймні одну вибрану навичку з матеріалізованим шляхом, OpenClaw передає тимчасовий плагін Claude Code через --plugin-dir і не додає дубльований каталог навичок OpenClaw до системної підказки. Якщо матеріалізованої навички плагіна немає, OpenClaw зберігає каталог у підказці як резервний варіант. Перевизначення змінних середовища й ключів API навичок і далі застосовуються до середовища дочірнього процесу під час запуску.
Claude CLI має власний неінтерактивний режим дозволів; OpenClaw зіставляє його з наявною політикою виконання замість додавання окремої конфігурації Claude. Для керованих OpenClaw активних сеансів Claude чинна політика виконання є визначальною: YOLO (tools.exec.security: "full" і tools.exec.ask: "off") зазвичай запускає Claude з --permission-mode bypassPermissions, тоді як обмежувальна політика запускає його з --permission-mode default. Gateway, запущені від імені root, також використовують default, оскільки Claude Code відхиляє режим обходу для root; OpenClaw і далі відповідає на запити Claude щодо керування інструментами через stdio відповідно до налаштованої політики виконання. Налаштування agents.list[].tools.exec для окремого агента перевизначають глобальне tools.exec для цього агента. Необроблені аргументи бекенду все ще можуть містити --permission-mode, але під час активних запусків Claude цей прапорець нормалізується відповідно до чинної політики й обмежень хоста.
Бекенд також зіставляє рівні /think OpenClaw із вбудованим прапорцем --effort Claude Code: minimal/low -> low, medium -> medium, а high/xhigh/max передаються безпосередньо. Завдяки цьому підтримувані рівні зусиль Fable 5 залишаються однаковими для Claude CLI із доступом через передплату та маршрутів із ключами API. adaptive вилучає налаштовані прапорці --effort і не надає заміни, тому Claude Code визначає чинний рівень зусиль із власного середовища, налаштувань і типових значень моделі. Щоб /think впливало на запущений CLI, для інших бекендів CLI відповідний плагін має оголосити аналогічне зіставлення argv.
Перш ніж OpenClaw зможе використовувати claude-cli, у самому Claude Code необхідно виконати вхід на тому самому хості:
claude auth loginclaude auth status --textopenclaw models auth login --provider anthropic --method cli --set-defaultДля встановлень Docker Claude Code має бути встановлено, а вхід — виконано всередині збережуваного домашнього каталогу контейнера, а не лише на хості; див. Бекенд Claude CLI у Docker.
Установлюйте agents.defaults.cliBackends.claude-cli.command лише тоді, коли виконуваного файла claude ще немає в PATH.
Сеанси
- Якщо CLI підтримує сеанси, установіть
sessionArg(наприклад,--session-id) абоsessionArgs(заповнювач{sessionId}), коли ідентифікатор потрібно передати в кількох прапорцях. - Якщо CLI використовує підкоманду відновлення з іншими прапорцями, установіть
resumeArgs(замінюєargsпід час відновлення) і, за потреби,resumeOutputдля відновлень не у форматі JSON. sessionMode:always: завжди надсилати ідентифікатор сеансу (новий UUID, якщо збереженого немає).existing: надсилати ідентифікатор сеансу лише тоді, коли його було збережено раніше.none: ніколи не надсилати ідентифікатор сеансу.
- Типовими значеннями
claude-cliєliveSession: "claude-stdio",output: "jsonl"іinput: "stdin", тому наступні репліки повторно використовують активний процес Claude, доки він працює, зокрема для користувацьких конфігурацій без полів транспорту. Якщо Gateway перезапускається або неактивний процес завершується, OpenClaw відновлює роботу зі збереженого ідентифікатора сеансу Claude. Перед відновленням збережені ідентифікатори сеансів перевіряються за доступною для читання стенограмою проєкту; якщо стенограми немає, прив’язка очищується (у журналі якreason=transcript-missing) замість непомітного запуску нового сеансу під--resume. - Активні сеанси Claude мають обмеження для виведення JSONL: типово 8 MiB і 20,000 необроблених рядків JSONL на репліку. Збільшуйте їх окремо для кожного бекенду за допомогою
agents.defaults.cliBackends.claude-cli.reliability.outputLimits.maxTurnRawCharsіmaxTurnLines; OpenClaw обмежує ці налаштування до 64 MiB і 100,000 рядків. - Збережені сеанси CLI забезпечують безперервність, якою керує постачальник. Неявне щоденне скидання сеансу їх не перериває;
/resetі явні політикиsession.reset— переривають. - Нові сеанси CLI зазвичай повторно заповнюються лише зі зведення Compaction OpenClaw і хвоста після Compaction. Для відновлення коротких сеансів, що стали недійсними до Compaction, бекенд може ввімкнути
reseedFromRawTranscriptWhenUncompacted: true. Повторне заповнення з необробленої стенограми залишається обмеженим і застосовується лише для безпечних випадків недійсності, як-от відсутня стенограма CLI, неповний хвіст використання інструмента, зміни політики повідомлень/системної підказки/cwd/MCP або повторна спроба після завершення терміну дії сеансу; зміни профілю автентифікації або епохи облікових даних ніколи не спричиняють повторного заповнення з необробленої історії стенограми.
Серіалізація: serialize: true зберігає порядок запусків в одній смузі (більшість CLI серіалізують виконання в одній смузі постачальника). OpenClaw також припиняє повторне використання збереженого сеансу CLI, коли змінюється вибрана ідентичність автентифікації, зокрема ідентифікатор профілю автентифікації, статичний ключ API, статичний токен або ідентичність облікового запису OAuth, якщо CLI її надає; сама лише ротація токенів доступу/оновлення OAuth не перериває сеанс. Якщо CLI не має стабільного ідентифікатора облікового запису OAuth, OpenClaw дозволяє цьому CLI самостійно застосовувати власні дозволи на відновлення.
Вступний контекст для резервного варіанта із сеансів claude-cli
Коли спроба claude-cli перемикається після відмови на кандидата, який не є CLI, у agents.defaults.model.fallbacks, OpenClaw додає до наступної спроби вступний контекст, отриманий із локальної стенограми JSONL Claude Code (у ~/.claude/projects/, окремо для кожного робочого простору). Без цього початкового контексту резервний постачальник починає без історії, оскільки власна стенограма сеансу OpenClaw порожня для запусків claude-cli.
- Вступний контекст надає перевагу найновішому зведенню
/compactабо маркеруcompact_boundary, а потім додає найновіші репліки після межі в межах бюджету символів. Репліки до межі відкидаються, оскільки їх уже представляє зведення. - Блоки інструментів об’єднуються в компактні підказки
(tool call: name)і(tool result: …), щоб точно дотримуватися бюджету підказки; надмірно велике зведення обрізається й позначається(truncated). - Резервні переходи в межах того самого постачальника з
claude-cliнаclaude-cliпокладаються на власний механізм--resumeClaude й пропускають вступний контекст. - Початковий контекст повторно використовує наявну перевірку шляху до файла сеансу Claude, тому читання довільних шляхів неможливе.
Зображення
Якщо CLI приймає шляхи до зображень, установіть imageArg:
imageArg: "--image",imageMode: "repeat"OpenClaw записує зображення base64 у тимчасові файли. Якщо встановлено imageArg, ці шляхи передаються як аргументи CLI; інакше OpenClaw додає шляхи до файлів у підказку (впровадження шляхів), що працює для CLI, які автоматично завантажують локальні файли за звичайними шляхами.
Вхідні й вихідні дані
output: "text"(типово) розглядає stdout як остаточну відповідь.output: "json"намагається проаналізувати JSON і видобути текст разом з ідентифікатором сеансу.output: "jsonl"аналізує потік JSONL і видобуває остаточне повідомлення агента разом з ідентифікаторами сеансу, якщо вони наявні.- Для виведення Gemini CLI у форматі JSON OpenClaw читає текст відповіді з
response, а дані про використання — зstats, колиusageвідсутнє або порожнє. Типовий вбудований бекенд Gemini CLI використовуєstream-json; старі перевизначення--output-format jsonі далі використовують аналізатор JSON.
Режими введення:
input: "arg"(за замовчуванням) передає запит як останній аргумент CLI.input: "stdin"надсилає запит через stdin.- Якщо запит дуже довгий і встановлено
maxPromptArgChars, натомість використовується stdin.
Значення за замовчуванням, визначені плагінами
Значення за замовчуванням для бекендів CLI є частиною поверхні плагіна:
- Плагіни реєструють їх за допомогою
api.registerCliBackend(...). - Значення
idбекенда стає префіксом провайдера в посиланнях на моделі. - Конфігурація користувача в
agents.defaults.cliBackends.<id>усе одно перевизначає значення плагіна за замовчуванням. - Очищення конфігурації, специфічної для бекенда, залишається у власності плагіна завдяки необов’язковому хуку
normalizeConfig.
Anthropic володіє claude-cli, а Google — google-gemini-cli. Запуски агента OpenAI Codex використовують інфраструктуру app-server Codex через openai/*; OpenClaw більше не реєструє вбудований бекенд codex-cli.
Вбудований плагін Anthropic реєструється для claude-cli:
| Ключ | Значення |
|---|---|
command |
claude |
args |
-p --output-format stream-json --include-partial-messages --verbose --setting-sources user --allowedTools mcp__openclaw__* --disallowedTools ScheduleWakeup,CronCreate,Bash(run_in_background:true),Monitor |
output |
jsonl |
input |
stdin |
modelArg |
--model |
sessionArg |
--session-id |
sessionMode |
always |
imageArg |
@ |
imagePathScope |
workspace |
systemPromptFileArg |
--append-system-prompt-file |
systemPromptMode |
append |
Вбудований плагін Google реєструється для google-gemini-cli:
| Ключ | Значення |
|---|---|
command |
gemini |
args |
--skip-trust --approval-mode auto_edit --output-format stream-json --prompt {prompt} |
resumeArgs |
те саме, з --resume {sessionId} |
output / resumeOutput |
jsonl |
jsonlDialect |
gemini-stream-json |
imageArg |
@ |
imagePathScope |
workspace |
modelArg |
--model |
sessionMode |
existing |
sessionIdFields |
["session_id", "sessionId"] |
Передумова: локальний Gemini CLI має бути встановлений і доступний у PATH як gemini (brew install gemini-cli або npm install -g @google/gemini-cli).
Примітки щодо виведення Gemini CLI:
- Стандартний парсер
stream-jsonчитає подіїmessageасистента, події інструментів, підсумкове використанняresultі події критичних помилок Gemini. - Якщо перевизначити аргументи Gemini на
--output-format json, OpenClaw нормалізує цей бекенд назад доoutput: "json"і читає текст відповіді з поля JSONresponse. - Якщо
usageвідсутнє або порожнє, для використання застосовується резервне значенняstats;stats.cachedнормалізується вcacheReadOpenClaw, а якщоstats.inputвідсутнє, кількість вхідних токенів визначається зstats.input_tokens - stats.cached.
Перевизначайте стандартні значення лише за потреби (найчастіше — абсолютний шлях command).
Накладення текстових перетворень
Плагіни, яким потрібні невеликі прокладки сумісності для запитів або повідомлень, можуть оголошувати двобічні текстові перетворення без заміни провайдера чи бекенда CLI:
api.registerTextTransforms({ input: [{ from: /red basket/g, to: "blue basket" }], output: [{ from: /blue basket/g, to: "red basket" }],});input переписує системний і користувацький запити, передані до CLI. output переписує потоковий текст асистента й розібраний підсумковий текст до того, як OpenClaw обробить власні керівні маркери та доставлення в канал; для викликів моделей через провайдера воно також відновлює рядкові значення у структурованих аргументах викликів інструментів після відновлення потоку й до виконання інструмента. Необроблені фрагменти JSON провайдера залишаються без змін; споживачам слід використовувати структуроване часткове, кінцеве або результативне корисне навантаження.
Для CLI, які виводять специфічні для провайдера події JSONL, установіть jsonlDialect у конфігурації відповідного бекенда: claude-stream-json для потоків, сумісних із Claude Code, і gemini-stream-json для подій Gemini CLI stream-json.
Власність нативного Compaction
Деякі бекенди CLI запускають агента, який сам ущільнює власний транскрипт, тому OpenClaw не повинен запускати для них свій захисний засіб підсумовування — інакше він конфліктує з власним ущільненням бекенда й може спричинити критичний збій ходу.
claude-cli не має кінцевої точки інфраструктури (Claude Code виконує ущільнення внутрішньо), тому він оголошує ownsNativeCompaction: true, а шлях ущільнення OpenClaw повертає запис сеансу без змін. OpenClaw передає ефективний бюджет контексту запуску через документовану змінну CLAUDE_CODE_AUTO_COMPACT_WINDOW Claude Code, узгоджуючи нативне автоматичне ущільнення з налаштованими обмеженнями Anthropic contextTokens. Натомість сеанси з нативною інфраструктурою, як-от Codex, і далі спрямовуються до кінцевої точки ущільнення своєї інфраструктури.
api.registerCliBackend({ id: "my-cli", ownsNativeCompaction: true /* ... */ });Оголошуйте ownsNativeCompaction лише для бекенда, який справді володіє ущільненням: він має надійно обмежувати власний транскрипт поблизу вікна контексту та зберігати сеанс, який можна поновити (наприклад, --resume / --session-id), інакше відкладений сеанс може залишитися понад бюджет.
Накладення пакетного MCP
Бекенди CLI не отримують виклики інструментів OpenClaw безпосередньо, але бекенд може ввімкнути згенероване накладення конфігурації MCP за допомогою bundleMcp: true. Поточна вбудована поведінка:
claude-cli: згенерований файл суворої конфігурації MCP.google-gemini-cli: згенерований файл системних налаштувань Gemini.
Коли пакетний MCP увімкнено, OpenClaw:
- запускає локальний HTTP-сервер MCP, який надає процесу CLI інструменти Gateway та автентифікується дозволом контексту для окремого запуску (
OPENCLAW_MCP_TOKEN), активним лише протягом поточної спроби виконання; - прив’язує доступ до інструментів до вибраного Gateway контексту сеансу, облікового запису й каналу, замість того щоб довіряти заголовкам дочірнього процесу;
- завантажує ввімкнені сервери пакетного MCP для поточного робочого простору й об’єднує їх із будь-якою наявною структурою конфігурації або налаштувань MCP бекенда;
- переписує конфігурацію запуску, використовуючи режим інтеграції бекенда з плагіна-власника.
Якщо жодного сервера MCP не ввімкнено, OpenClaw усе одно впроваджує сувору конфігурацію, коли бекенд активує пакетний MCP, щоб фонові запуски залишалися ізольованими.
Вбудовані середовища виконання MCP з областю дії сеансу кешуються для повторного використання в межах сеансу, а потім завершуються після mcp.sessionIdleTtlMs мілісекунд бездіяльності (за замовчуванням 10 хвилин; установіть 0, щоб вимкнути). Одноразові вбудовані запуски, як-от перевірки автентифікації, генерування коротких ідентифікаторів і відтворення Active Memory, запитують очищення наприкінці запуску, щоб дочірні процеси stdio та потоки Streamable HTTP/SSE не продовжували існувати після його завершення.
Обмеження історії для повторного заповнення
Коли свіжий сеанс CLI заповнюється з попереднього транскрипту OpenClaw (наприклад, після повторної спроби session_expired), розмір відтвореного блоку <conversation_history> обмежується, щоб запити повторного заповнення не розросталися надмірно. Стандартне обмеження становить 12,288 символів (приблизно 3,000 токенів).
Натомість бекенди Claude CLI масштабують це обмеження відповідно до визначеного вікна контексту Claude: більші вікна контексту отримують більший фрагмент попередньої історії, аж до фіксованої верхньої межі; інші бекенди CLI зберігають консервативне стандартне обмеження. Це обмеження регулює лише блок попередньої історії в запиті повторного заповнення — обмеження виведення активного сеансу налаштовуються окремо в reliability.outputLimits (див. Сеанси).
Обмеження
- Немає прямих викликів інструментів OpenClaw: OpenClaw не впроваджує виклики інструментів у протокол бекенда CLI. Бекенди бачать інструменти Gateway лише тоді, коли активують
bundleMcp: true. - Потокове передавання залежить від бекенда: деякі бекенди передають JSONL потоком, інші буферизують дані до завершення.
- Структуроване виведення залежить від власного формату JSON CLI.
Усунення несправностей
| Ознака | Виправлення |
|---|---|
| CLI не знайдено | Установіть для command повний шлях. |
| Неправильна назва моделі | Використовуйте modelAliases, щоб зіставити provider/model з ідентифікатором моделі CLI. |
| Немає безперервності сеансу | Переконайтеся, що sessionArg установлено, а sessionMode не дорівнює none. |
| Зображення ігноруються | Установіть imageArg і перевірте, чи підтримує CLI шляхи до файлів. |