Backendy CLI (środowisko uruchomieniowe fallback)
OpenClaw może uruchamiać lokalne AI CLI jako fallback tylko dla tekstu, gdy dostawcy API są niedostępni, objęci limitami albo tymczasowo działają nieprawidłowo. To rozwiązanie jest celowo zachowawcze:- Narzędzia OpenClaw nie są wstrzykiwane bezpośrednio, ale backendy z
bundleMcp: true(domyślnie Claude CLI) mogą otrzymywać narzędzia gateway przez most MCP local loopback. - Strumieniowanie JSONL (Claude CLI używa
--output-format stream-jsonz--include-partial-messages; prompty są wysyłane przez stdin). - Sesje są obsługiwane (więc kolejne tury pozostają spójne).
- Obrazy mogą być przekazywane dalej, jeśli CLI akceptuje ścieżki do obrazów.
Przyjazny dla początkujących szybki start
Możesz używać Claude CLI bez żadnego config (pakietowa wtyczka Anthropic rejestruje domyślny backend):PATH jest minimalne, dodaj tylko
ścieżkę do polecenia:
agents.defaults.cliBackends.
Używanie jako fallback
Dodaj backend CLI do listy fallbacków, aby uruchamiał się tylko wtedy, gdy modele podstawowe zawiodą:- Jeśli używasz
agents.defaults.models(listy dozwolonych), musisz uwzględnićclaude-cli/.... - Jeśli podstawowy dostawca zawiedzie (uwierzytelnianie, limity, timeouty), OpenClaw spróbuje następnie backendu CLI.
- Pakietowy backend Claude CLI nadal akceptuje krótsze aliasy, takie jak
claude-cli/opus,claude-cli/opus-4.6lubclaude-cli/sonnet, ale dokumentacja i przykłady config używają kanonicznych referencjiclaude-cli/claude-*.
Przegląd konfiguracji
Wszystkie backendy CLI znajdują się w:claude-cli, my-cli).
Id dostawcy staje się lewą stroną referencji modelu:
Przykładowa konfiguracja
Jak to działa
- Wybiera backend na podstawie prefiksu dostawcy (
claude-cli/...). - Buduje prompt systemowy przy użyciu tego samego promptu OpenClaw i kontekstu workspace.
- Uruchamia CLI z identyfikatorem sesji (jeśli jest obsługiwany), aby historia pozostała spójna.
- Parsuje dane wyjściowe (JSON lub zwykły tekst) i zwraca końcowy tekst.
- Utrwala identyfikatory sesji per backend, aby kolejne tury ponownie używały tej samej sesji CLI.
Sesje
- Jeśli CLI obsługuje sesje, ustaw
sessionArg(np.--session-id) albosessionArgs(placeholder{sessionId}), gdy identyfikator trzeba wstawić do wielu flag. - Jeśli CLI używa podpolecenia resume z innymi flagami, ustaw
resumeArgs(zastępujeargsprzy wznawianiu) i opcjonalnieresumeOutput(dla wznowień innych niż JSON). sessionMode:always: zawsze wysyłaj identyfikator sesji (nowy UUID, jeśli żaden nie jest zapisany).existing: wysyłaj identyfikator sesji tylko wtedy, gdy został wcześniej zapisany.none: nigdy nie wysyłaj identyfikatora sesji.
serialize: trueutrzymuje kolejność uruchomień w tym samym torze.- Większość CLI serializuje na jednym torze dostawcy.
claude-clijest węższe: wznowione uruchomienia są serializowane per identyfikator sesji Claude, a nowe uruchomienia per ścieżka workspace. Niezależne workspace mogą działać równolegle.- OpenClaw porzuca zapisane ponowne użycie sesji CLI, gdy zmienia się stan uwierzytelniania backendu, w tym po ponownym logowaniu, rotacji tokena lub zmianie poświadczeń profilu uwierzytelniania.
Obrazy (pass-through)
Jeśli Twoje CLI akceptuje ścieżki do obrazów, ustawimageArg:
imageArg jest ustawione, te
ścieżki są przekazywane jako argumenty CLI. Jeśli imageArg nie jest ustawione, OpenClaw dodaje
ścieżki plików do promptu (wstrzykiwanie ścieżek), co wystarcza dla CLI, które automatycznie
ładują pliki lokalne z podanych zwykłych ścieżek (zachowanie Claude CLI).
Wejścia / wyjścia
output: "json"(domyślnie) próbuje sparsować JSON i wyodrębnić tekst + identyfikator sesji.- Dla wyjścia JSON Gemini CLI OpenClaw odczytuje tekst odpowiedzi z
responseoraz zużycie zstats, gdyusagenie istnieje albo jest puste. output: "jsonl"parsuje strumienie JSONL (na przykładstream-jsonClaude CLI i--jsonCodex CLI) oraz wyodrębnia końcową wiadomość agenta i identyfikatory sesji, jeśli są obecne.output: "text"traktuje stdout jako końcową odpowiedź.
input: "arg"(domyślnie) przekazuje prompt jako ostatni argument CLI.input: "stdin"wysyła prompt przez stdin.- Jeśli prompt jest bardzo długi i ustawiono
maxPromptArgChars, używane jest stdin.
Ustawienia domyślne (należące do wtyczki)
Pakietowa wtyczka Anthropic rejestruje ustawienia domyślne dlaclaude-cli:
command: "claude"args: ["-p", "--output-format", "stream-json", "--include-partial-messages", "--verbose", "--permission-mode", "bypassPermissions"]resumeArgs: ["-p", "--output-format", "stream-json", "--include-partial-messages", "--verbose", "--permission-mode", "bypassPermissions", "--resume", "{sessionId}"]output: "jsonl"input: "stdin"modelArg: "--model"systemPromptArg: "--append-system-prompt"sessionArg: "--session-id"systemPromptWhen: "first"sessionMode: "always"
codex-cli:
command: "codex"args: ["exec","--json","--color","never","--sandbox","workspace-write","--skip-git-repo-check"]resumeArgs: ["exec","resume","{sessionId}","--color","never","--sandbox","workspace-write","--skip-git-repo-check"]output: "jsonl"resumeOutput: "text"modelArg: "--model"imageArg: "--image"sessionMode: "existing"
google-gemini-cli:
command: "gemini"args: ["--prompt", "--output-format", "json"]resumeArgs: ["--resume", "{sessionId}", "--prompt", "--output-format", "json"]modelArg: "--model"sessionMode: "existing"sessionIdFields: ["session_id", "sessionId"]
gemini w PATH (brew install gemini-cli lub
npm install -g @google/gemini-cli).
Uwagi dotyczące JSON Gemini CLI:
- Tekst odpowiedzi jest odczytywany z pola JSON
response. - Zużycie wraca do
stats, gdyusagenie istnieje lub jest puste. stats.cachedjest normalizowane do OpenClawcacheRead.- Jeśli
stats.inputnie istnieje, OpenClaw wyprowadza tokeny wejściowe zstats.input_tokens - stats.cached.
command).
Ustawienia domyślne należące do wtyczki
Domyślne ustawienia backendów CLI są teraz częścią powierzchni wtyczek:- Wtyczki rejestrują je przez
api.registerCliBackend(...). idbackendu staje się prefiksem dostawcy w referencjach modeli.- Config użytkownika w
agents.defaults.cliBackends.<id>nadal nadpisuje domyślne ustawienia wtyczki. - Czyszczenie config specyficznego dla backendu pozostaje po stronie wtyczki przez opcjonalny
hook
normalizeConfig.
Nakładki MCP dla pakietów
Backendy CLI nie otrzymują bezpośrednio wywołań narzędzi OpenClaw, ale backend może włączyć generowaną nakładkę config MCP przezbundleMcp: true.
Obecne zachowanie pakietowe:
claude-cli:bundleMcp: true(domyślnie)codex-cli: bez nakładki MCP dla pakietugoogle-gemini-cli: bez nakładki MCP dla pakietu
- uruchamia serwer HTTP MCP local loopback, który udostępnia narzędzia gateway procesowi CLI
- uwierzytelnia most tokenem per sesja (
OPENCLAW_MCP_TOKEN) - ogranicza dostęp do narzędzi do bieżącej sesji, konta i kontekstu kanału
- ładuje włączone serwery MCP dla pakietu dla bieżącego workspace
- scala je z istniejącym
--mcp-configbackendu - przepisuje argumenty CLI, aby przekazać
--strict-mcp-config --mcp-config <generated-file>
--strict-mcp-config uniemożliwia Claude CLI dziedziczenie otaczających
serwerów MCP na poziomie użytkownika lub globalnym. Jeśli żadne serwery MCP nie są włączone, OpenClaw nadal
wstrzykuje restrykcyjny pusty config, aby uruchomienia w tle pozostały izolowane.
Ograniczenia
- Brak bezpośrednich wywołań narzędzi OpenClaw. OpenClaw nie wstrzykuje wywołań narzędzi do
protokołu backendu CLI. Jednak backendy z
bundleMcp: true(domyślnie Claude CLI) otrzymują narzędzia gateway przez most MCP local loopback, więc Claude CLI może wywoływać narzędzia OpenClaw przez natywne wsparcie MCP. - Strumieniowanie zależy od backendu. Claude CLI używa strumieniowania JSONL
(
stream-jsonz--include-partial-messages); inne backendy CLI mogą nadal buforować dane aż do zakończenia. - Wyjścia strukturalne zależą od formatu JSON danego CLI.
- Sesje Codex CLI są wznawiane przez wyjście tekstowe (bez JSONL), co jest mniej
ustrukturyzowane niż początkowe uruchomienie
--json. Sesje OpenClaw nadal działają normalnie.
Rozwiązywanie problemów
- Nie znaleziono CLI: ustaw
commandna pełną ścieżkę. - Nieprawidłowa nazwa modelu: użyj
modelAliases, aby mapowaćprovider/model→ model CLI. - Brak ciągłości sesji: upewnij się, że ustawiono
sessionArgi żesessionModenie ma wartościnone(Codex CLI obecnie nie może wznawiać z wyjściem JSON). - Obrazy są ignorowane: ustaw
imageArg(i sprawdź, czy CLI obsługuje ścieżki do plików).