Gateway
แบ็กเอนด์ CLI
OpenClaw สามารถเรียกใช้ AI CLI ภายในเครื่อง เป็น ทางสำรองแบบข้อความเท่านั้น เมื่อผู้ให้บริการ API ล่ม ถูกจำกัดอัตรา หรือทำงานผิดปกติชั่วคราว แนวทางนี้ตั้งใจให้เป็นแบบระมัดระวัง:
- เครื่องมือ OpenClaw จะไม่ถูกฉีดเข้าไปโดยตรง แต่แบ็กเอนด์ที่มี
bundleMcp: trueสามารถรับเครื่องมือ Gateway ผ่านสะพาน MCP แบบ local loopback ได้ - การสตรีม JSONL สำหรับ CLI ที่รองรับ
- รองรับเซสชัน (ดังนั้นรอบสนทนาต่อเนื่องจึงยังสอดคล้องกัน)
- สามารถส่งรูปภาพผ่านได้ หาก CLI รับพาธรูปภาพ
สิ่งนี้ออกแบบมาเป็น ตาข่ายนิรภัย มากกว่าจะเป็นเส้นทางหลัก ใช้เมื่อคุณ ต้องการคำตอบข้อความที่ "ใช้งานได้เสมอ" โดยไม่ต้องพึ่งพา API ภายนอก
หากคุณต้องการรันไทม์ harness แบบเต็มพร้อมการควบคุมเซสชัน ACP, งานเบื้องหลัง, การผูกเธรด/การสนทนา และเซสชันการเขียนโค้ดภายนอกแบบถาวร ให้ใช้ เอเจนต์ ACP แทน แบ็กเอนด์ CLI ไม่ใช่ ACP
เริ่มต้นอย่างรวดเร็วสำหรับผู้เริ่มต้น
คุณสามารถใช้ Codex CLI ได้โดยไม่ต้องมีการกำหนดค่าใดๆ (Plugin OpenAI ที่รวมมา จะลงทะเบียนแบ็กเอนด์เริ่มต้น):
openclaw agent --message "hi" --model codex-cli/gpt-5.5หาก Gateway ของคุณรันภายใต้ launchd/systemd และ PATH มีค่าน้อยที่สุด ให้เพิ่มแค่ พาธคำสั่ง:
{ agents: { defaults: { cliBackends: { "codex-cli": { command: "/opt/homebrew/bin/codex", }, }, }, },}เท่านี้ก็พอ ไม่ต้องมีคีย์ ไม่ต้องมีการกำหนดค่า auth เพิ่มเติมนอกเหนือจาก CLI เอง
หากคุณใช้แบ็กเอนด์ CLI ที่รวมมาเป็น ผู้ให้บริการข้อความหลัก บนโฮสต์
Gateway ตอนนี้ OpenClaw จะโหลด Plugin ที่รวมมาและเป็นเจ้าของโดยอัตโนมัติเมื่อ config
ของคุณอ้างอิงแบ็กเอนด์นั้นอย่างชัดเจนใน model ref หรือภายใต้
agents.defaults.cliBackends
ใช้เป็นทางสำรอง
เพิ่มแบ็กเอนด์ CLI ลงในรายการทางสำรองเพื่อให้รันเฉพาะเมื่อโมเดลหลักล้มเหลว:
{ agents: { defaults: { model: { primary: "anthropic/claude-opus-4-6", fallbacks: ["codex-cli/gpt-5.5"], }, models: { "anthropic/claude-opus-4-6": { alias: "Opus" }, "codex-cli/gpt-5.5": {}, }, }, },}หมายเหตุ:
- หากคุณใช้
agents.defaults.models(รายการอนุญาต) คุณต้องใส่โมเดลของแบ็กเอนด์ CLI ของคุณไว้ที่นั่นด้วย - หากผู้ให้บริการหลักล้มเหลว (auth, การจำกัดอัตรา, timeout) OpenClaw จะ ลองใช้แบ็กเอนด์ CLI ถัดไป
ภาพรวมการกำหนดค่า
แบ็กเอนด์ CLI ทั้งหมดอยู่ภายใต้:
agents.defaults.cliBackendsแต่ละรายการใช้ provider id เป็นคีย์ (เช่น codex-cli, my-cli)
provider id จะกลายเป็นฝั่งซ้ายของ model ref ของคุณ:
<provider>/<model>ตัวอย่างการกำหนดค่า
{ agents: { defaults: { cliBackends: { "codex-cli": { command: "/opt/homebrew/bin/codex", }, "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", // For CLIs with a dedicated prompt-file flag: // systemPromptFileArg: "--system-file", // Codex-style CLIs can point at a prompt file instead: // systemPromptFileConfigArg: "-c", // systemPromptFileConfigKey: "model_instructions_file", systemPromptWhen: "first", imageArg: "--image", imageMode: "repeat", // Opt in only if this backend may reseed safe invalidated sessions // from bounded raw OpenClaw transcript history before compaction. reseedFromRawTranscriptWhenUncompacted: true, serialize: true, }, }, }, },}วิธีการทำงาน
- เลือกแบ็กเอนด์ ตาม prefix ของผู้ให้บริการ (
codex-cli/...) - สร้าง system prompt โดยใช้ prompt ของ OpenClaw เดียวกัน + บริบท workspace
- เรียกใช้ CLI พร้อม session id (หากรองรับ) เพื่อให้ประวัติยังสอดคล้องกัน
แบ็กเอนด์
claude-cliที่รวมมาจะคงโปรเซส Claude stdio หนึ่งโปรเซสไว้ต่อ เซสชัน OpenClaw และส่งรอบสนทนาต่อเนื่องผ่าน stream-json stdin - แยกวิเคราะห์ output (JSON หรือข้อความธรรมดา) แล้วส่งข้อความสุดท้ายกลับ
- คง session id ไว้ ต่อแบ็กเอนด์ เพื่อให้รอบติดตามผลใช้เซสชัน CLI เดิมซ้ำ
แบ็กเอนด์ OpenAI codex-cli ที่รวมมาจะส่ง system prompt ของ OpenClaw ผ่าน
การ override config model_instructions_file ของ Codex (-c model_instructions_file="...") Codex ไม่เปิดเผย flag แบบ Claude อย่าง
--append-system-prompt ดังนั้น OpenClaw จึงเขียน prompt ที่ประกอบแล้วลงใน
ไฟล์ชั่วคราวสำหรับแต่ละเซสชัน Codex CLI ใหม่
แบ็กเอนด์ Anthropic claude-cli ที่รวมมาจะรับ snapshot Skills ของ OpenClaw
สองทาง: แค็ตตาล็อก Skills ของ OpenClaw แบบกะทัดรัดใน system prompt ที่แนบเพิ่ม และ
Plugin Claude Code ชั่วคราวที่ส่งผ่าน --plugin-dir Plugin นี้มีเฉพาะ
Skills ที่มีสิทธิ์สำหรับเอเจนต์/เซสชันนั้น ดังนั้นตัว resolve skill ภายในของ Claude Code
จึงเห็นชุดที่กรองแล้วชุดเดียวกับที่ OpenClaw จะประกาศใน prompt อยู่แล้ว
OpenClaw ยังคงใช้การ override env/คีย์ API ของ Skill กับ
สภาพแวดล้อมของโปรเซสลูกสำหรับการรัน
Claude CLI ยังมีโหมดสิทธิ์แบบ noninteractive ของตัวเอง OpenClaw แมปสิ่งนั้น
เข้ากับนโยบาย exec ที่มีอยู่แทนการเพิ่ม config เฉพาะ Claude: เมื่อ
นโยบาย exec ที่ร้องขอแบบมีผลเป็น YOLO (tools.exec.security: "full" และ
tools.exec.ask: "off") OpenClaw จะเพิ่ม --permission-mode bypassPermissions
การตั้งค่า agents.list[].tools.exec รายเอเจนต์จะแทนที่ tools.exec ส่วนกลางสำหรับ
เอเจนต์นั้น หากต้องการบังคับใช้โหมด Claude อื่น ให้ตั้งค่า args แบ็กเอนด์ดิบอย่างชัดเจน
เช่น --permission-mode default หรือ --permission-mode acceptEdits ภายใต้
agents.defaults.cliBackends.claude-cli.args และ resumeArgs ที่ตรงกัน
แบ็กเอนด์ Anthropic claude-cli ที่รวมมายังแมประดับ /think ของ OpenClaw
ไปยัง flag --effort ภายในของ Claude Code สำหรับระดับที่ไม่ใช่ off ด้วย minimal และ
low แมปเป็น low, adaptive และ medium แมปเป็น medium และ high,
xhigh และ max แมปโดยตรง แบ็กเอนด์ CLI อื่นๆ ต้องให้ Plugin เจ้าของ
ประกาศ argv mapper ที่เทียบเท่าก่อน /think จึงจะมีผลกับ CLI ที่ spawn
ก่อนที่ OpenClaw จะใช้แบ็กเอนด์ claude-cli ที่รวมมาได้ Claude Code เอง
ต้องล็อกอินบนโฮสต์เดียวกันไว้แล้ว:
claude auth loginclaude auth status --textopenclaw models auth login --provider anthropic --method cli --set-defaultใช้ agents.defaults.cliBackends.claude-cli.command เฉพาะเมื่อไบนารี claude
ยังไม่ได้อยู่บน PATH
เซสชัน
- หาก CLI รองรับเซสชัน ให้ตั้งค่า
sessionArg(เช่น--session-id) หรือsessionArgs(placeholder{sessionId}) เมื่อจำเป็นต้องแทรก ID ลงใน flag หลายตัว - หาก CLI ใช้ resume subcommand พร้อม flag ที่ต่างกัน ให้ตั้งค่า
resumeArgs(แทนที่argsเมื่อ resume) และอาจตั้งค่าresumeOutput(สำหรับ resume ที่ไม่ใช่ JSON) sessionMode:always: ส่ง session id เสมอ (UUID ใหม่หากยังไม่มีที่เก็บไว้)existing: ส่ง session id เฉพาะเมื่อเคยมีที่เก็บไว้ก่อนหน้าnone: ไม่ส่ง session id เลย
claude-cliมีค่าเริ่มต้นเป็นliveSession: "claude-stdio",output: "jsonl", และinput: "stdin"เพื่อให้รอบสนทนาต่อเนื่องใช้โปรเซส Claude ที่ยังทำงานอยู่ซ้ำ ขณะที่ยัง active อยู่ ตอนนี้ warm stdio เป็นค่าเริ่มต้นแล้ว รวมถึง config แบบกำหนดเอง ที่ละเว้นฟิลด์ transport หาก Gateway รีสตาร์ตหรือโปรเซส idle ออก OpenClaw จะ resume จาก session id ของ Claude ที่เก็บไว้ session id ที่เก็บไว้จะถูกตรวจสอบกับ transcript โปรเจกต์ที่มีอยู่และอ่านได้ก่อน resume ดังนั้นการผูก phantom จะถูกล้างด้วยreason=transcript-missingแทนที่จะเริ่มเซสชัน Claude CLI ใหม่อย่างเงียบๆ ภายใต้--resume- เซสชัน live ของ Claude เก็บ guard ของ output JSONL แบบจำกัดขอบเขต ค่าเริ่มต้นอนุญาตสูงสุด
8 MiB และ 20,000 บรรทัด JSONL ดิบต่อรอบ รอบ Claude ที่ใช้เครื่องมือหนักสามารถเพิ่มค่าเหล่านี้
ต่อแบ็กเอนด์ได้ด้วย
agents.defaults.cliBackends.claude-cli.reliability.outputLimits.maxTurnRawCharsและmaxTurnLines; OpenClaw จะ clamp การตั้งค่าเหล่านั้นไว้ที่ 64 MiB และ 100,000 บรรทัด - เซสชัน CLI ที่เก็บไว้คือความต่อเนื่องที่ผู้ให้บริการเป็นเจ้าของ การรีเซ็ตเซสชันรายวันโดยนัย
จะไม่ตัดเซสชันเหล่านั้น;
/resetและนโยบายsession.resetที่ชัดเจนยังคงตัด - โดยปกติเซสชัน CLI ใหม่จะ reseed เฉพาะจากสรุป Compaction ของ OpenClaw
รวมกับ tail หลัง Compaction หากต้องการกู้เซสชันสั้นที่ถูกทำให้ invalid
ก่อน Compaction แบ็กเอนด์สามารถ opt in ด้วย
reseedFromRawTranscriptWhenUncompacted: trueOpenClaw ยังคงจำกัดขอบเขต raw transcript reseed และจำกัดไว้เฉพาะการ invalidation ที่ปลอดภัย เช่น transcript ของ CLI หาย, การเปลี่ยนแปลง system-prompt/MCP หรือการ retry จาก session-expired; การเปลี่ยนแปลง auth profile หรือ credential-epoch จะไม่ reseed ประวัติ raw transcript
หมายเหตุการทำ serialization:
serialize: trueทำให้การรันใน lane เดียวกันเรียงตามลำดับ- CLI ส่วนใหญ่ serialize บน lane ผู้ให้บริการเดียว
- OpenClaw จะเลิกใช้ซ้ำเซสชัน CLI ที่เก็บไว้เมื่อ auth identity ที่เลือกเปลี่ยนไป รวมถึง auth profile id, static API key, static token หรือ OAuth account identity ที่เปลี่ยนเมื่อ CLI เปิดเผยตัวตนดังกล่าว การหมุนเวียน OAuth access token และ refresh token จะไม่ตัดเซสชัน CLI ที่เก็บไว้ หาก CLI ไม่เปิดเผย OAuth account id ที่เสถียร OpenClaw จะให้ CLI นั้นบังคับใช้สิทธิ์ resume เอง
พรีลูดทางสำรองจากเซสชัน claude-cli
เมื่อความพยายาม claude-cli fail over ไปยัง candidate ที่ไม่ใช่ CLI ใน
agents.defaults.model.fallbacks OpenClaw จะ seed
ความพยายามถัดไปด้วย context prelude ที่เก็บมาจาก transcript JSONL ภายในเครื่องของ Claude Code
ที่ ~/.claude/projects/ หากไม่มี seed นี้ ผู้ให้บริการ fallback จะเริ่มแบบ cold
เพราะ transcript เซสชันของ OpenClaw เองว่างเปล่าสำหรับการรัน claude-cli
- prelude จะเลือกสรุป
/compactล่าสุดหรือ markercompact_boundaryก่อน จากนั้นแนบรอบสนทนาหลัง boundary ล่าสุดจนถึงงบประมาณจำนวนอักขระ รอบก่อน boundary จะถูกทิ้งเพราะสรุปเป็นตัวแทนรอบเหล่านั้นอยู่แล้ว - บล็อกเครื่องมือจะถูกรวมเป็นคำใบ้แบบกะทัดรัด
(tool call: name)และ(tool result: …)เพื่อรักษางบประมาณ prompt ให้ตรงความจริง สรุปจะถูกติดป้าย(truncated)หากล้น - fallback จาก
claude-cliไปclaude-cliผู้ให้บริการเดียวกันจะพึ่งพา--resumeของ Claude เองและข้าม prelude - seed ใช้การตรวจสอบพาธไฟล์เซสชัน Claude ที่มีอยู่ซ้ำ ดังนั้น จึงไม่สามารถอ่านพาธตามอำเภอใจได้
รูปภาพ (ส่งผ่าน)
หาก CLI ของคุณรับพาธรูปภาพ ให้ตั้งค่า imageArg:
imageArg: "--image",imageMode: "repeat"OpenClaw จะเขียนรูปภาพ base64 ลงในไฟล์ชั่วคราว หากตั้งค่า imageArg ไว้ พาธเหล่านั้น
จะถูกส่งเป็น args ของ CLI หากไม่มี imageArg OpenClaw จะแนบ
พาธไฟล์ต่อท้าย prompt (path injection) ซึ่งเพียงพอสำหรับ CLI ที่โหลดไฟล์ภายในเครื่อง
จากพาธธรรมดาโดยอัตโนมัติ
อินพุต / เอาต์พุต
output: "json"(ค่าเริ่มต้น) จะพยายามแยกวิเคราะห์ JSON และดึงข้อความ + session id- สำหรับ output JSON ของ Gemini CLI, OpenClaw จะอ่านข้อความตอบกลับจาก
responseและ usage จากstatsเมื่อusageหายไปหรือว่าง output: "jsonl"แยกวิเคราะห์สตรีม JSONL (ตัวอย่างเช่น Codex CLI--json) และดึงข้อความสุดท้ายของเอเจนต์พร้อม session identifiers เมื่อมีoutput: "text"ถือว่า stdout เป็นคำตอบสุดท้าย
โหมดอินพุต:
input: "arg"(ค่าเริ่มต้น) ส่ง prompt เป็น arg สุดท้ายของ CLIinput: "stdin"ส่ง prompt ผ่าน stdin- หาก prompt ยาวมากและตั้งค่า
maxPromptArgCharsไว้ จะใช้ stdin
ค่าเริ่มต้น (Plugin เป็นเจ้าของ)
Plugin OpenAI ที่รวมมายังลงทะเบียนค่าเริ่มต้นสำหรับ codex-cli ด้วย
command: "codex"args: ["exec","--json","--color","never","--sandbox","workspace-write","--skip-git-repo-check"]resumeArgs: ["exec","resume","{sessionId}","-c","sandbox_mode=\"workspace-write\"","--skip-git-repo-check"]output: "jsonl"resumeOutput: "text"modelArg: "--model"imageArg: "--image"sessionMode: "existing"
Plugin Google ที่บันเดิลมาด้วยยังลงทะเบียนค่าเริ่มต้นสำหรับ google-gemini-cli ด้วย:
command: "gemini"args: ["--output-format", "json", "--prompt", "{prompt}"]resumeArgs: ["--resume", "{sessionId}", "--output-format", "json", "--prompt", "{prompt}"]imageArg: "@"imagePathScope: "workspace"modelArg: "--model"sessionMode: "existing"sessionIdFields: ["session_id", "sessionId"]
ข้อกำหนดเบื้องต้น: ต้องติดตั้ง Gemini CLI ภายในเครื่องและให้เรียกใช้ได้เป็น
gemini บน PATH (brew install gemini-cli หรือ
npm install -g @google/gemini-cli)
หมายเหตุ JSON ของ Gemini CLI:
- ข้อความตอบกลับจะถูกอ่านจากฟิลด์ JSON
response - การใช้งานจะถอยไปใช้
statsเมื่อusageไม่มีอยู่หรือว่างเปล่า stats.cachedจะถูกทำให้เป็นรูปแบบ OpenClawcacheRead- หาก
stats.inputหายไป OpenClaw จะอนุมานโทเค็นอินพุตจากstats.input_tokens - stats.cached
เขียนทับเฉพาะเมื่อจำเป็นเท่านั้น (กรณีทั่วไป: พาธ command แบบสมบูรณ์)
ค่าเริ่มต้นที่ Plugin เป็นเจ้าของ
ค่าเริ่มต้นของแบ็กเอนด์ CLI ตอนนี้เป็นส่วนหนึ่งของพื้นผิว Plugin:
- Plugins ลงทะเบียนค่าเหล่านี้ด้วย
api.registerCliBackend(...) idของแบ็กเอนด์จะกลายเป็นคำนำหน้าผู้ให้บริการใน model refs- การกำหนดค่าผู้ใช้ใน
agents.defaults.cliBackends.<id>ยังเขียนทับค่าเริ่มต้นของ Plugin ได้ - การล้างการกำหนดค่าเฉพาะแบ็กเอนด์ยังคงเป็นของ Plugin ผ่าน hook
normalizeConfigที่เป็นตัวเลือก
Plugins ที่ต้องใช้ shim ความเข้ากันได้ของพรอมป์/ข้อความขนาดเล็กสามารถประกาศ การแปลงข้อความสองทางได้โดยไม่ต้องแทนที่ผู้ให้บริการหรือแบ็กเอนด์ CLI:
api.registerTextTransforms({ input: [ { from: /red basket/g, to: "blue basket" }, { from: /paper ticket/g, to: "digital ticket" }, { from: /left shelf/g, to: "right shelf" }, ], output: [ { from: /blue basket/g, to: "red basket" }, { from: /digital ticket/g, to: "paper ticket" }, { from: /right shelf/g, to: "left shelf" }, ],});input จะเขียนพรอมป์ระบบและพรอมป์ผู้ใช้ที่ส่งไปยัง CLI ใหม่ output
จะเขียนเดลตาผู้ช่วยที่สตรีมมาและข้อความสุดท้ายที่แยกวิเคราะห์แล้วใหม่ก่อนที่ OpenClaw จะจัดการ
เครื่องหมายควบคุมและการส่งมอบช่องทางของตัวเอง
สำหรับ CLI ที่ปล่อย JSONL ที่เข้ากันได้กับ Claude Code stream-json ให้ตั้งค่า
jsonlDialect: "claude-stream-json" ในการกำหนดค่าของแบ็กเอนด์นั้น
โอเวอร์เลย์ MCP ของบันเดิล
แบ็กเอนด์ CLI ไม่ได้ รับ tool calls ของ OpenClaw โดยตรง แต่แบ็กเอนด์สามารถ
เลือกใช้โอเวอร์เลย์การกำหนดค่า MCP ที่สร้างขึ้นได้ด้วย bundleMcp: true
พฤติกรรมที่บันเดิลอยู่ในปัจจุบัน:
claude-cli: ไฟล์การกำหนดค่า MCP แบบเข้มงวดที่สร้างขึ้นcodex-cli: การเขียนทับการกำหนดค่าแบบอินไลน์สำหรับmcp_servers; เซิร์ฟเวอร์ local loopback ของ OpenClaw ที่สร้างขึ้นจะถูกทำเครื่องหมายด้วยโหมดอนุมัติเครื่องมือต่อเซิร์ฟเวอร์ของ Codex เพื่อไม่ให้การเรียก MCP ค้างอยู่ที่พรอมป์อนุมัติภายในเครื่องgoogle-gemini-cli: ไฟล์การตั้งค่าระบบ Gemini ที่สร้างขึ้น
เมื่อเปิดใช้ bundle MCP แล้ว OpenClaw จะ:
- สร้างเซิร์ฟเวอร์ HTTP MCP แบบ loopback ที่เปิดเผยเครื่องมือ Gateway ให้กับโปรเซส CLI
- ตรวจสอบสิทธิ์บริดจ์ด้วยโทเค็นต่อเซสชัน (
OPENCLAW_MCP_TOKEN) - จำกัดขอบเขตการเข้าถึงเครื่องมือไว้ที่บริบทเซสชัน บัญชี และช่องทางปัจจุบัน
- โหลดเซิร์ฟเวอร์ bundle-MCP ที่เปิดใช้งานสำหรับเวิร์กสเปซปัจจุบัน
- รวมเข้ากับรูปแบบการกำหนดค่า/การตั้งค่า MCP ของแบ็กเอนด์ที่มีอยู่
- เขียนการกำหนดค่าเริ่มทำงานใหม่โดยใช้โหมดการผสานรวมที่แบ็กเอนด์เป็นเจ้าของจาก extension เจ้าของ
หากไม่มีเซิร์ฟเวอร์ MCP ที่เปิดใช้งาน OpenClaw จะยังฉีดการกำหนดค่าแบบเข้มงวดเมื่อ แบ็กเอนด์เลือกใช้ bundle MCP เพื่อให้การรันเบื้องหลังยังแยกโดดเดี่ยวอยู่
รันไทม์ MCP ที่บันเดิลและจำกัดขอบเขตตามเซสชันจะถูกแคชเพื่อนำกลับมาใช้ซ้ำภายในเซสชัน แล้ว
ถูกเก็บกวาดหลังจากไม่มีการใช้งานเป็นเวลา mcp.sessionIdleTtlMs มิลลิวินาที (ค่าเริ่มต้น 10
นาที; ตั้งค่า 0 เพื่อปิดใช้งาน) การรันแบบฝังตัวครั้งเดียว เช่น การตรวจสอบ auth,
การสร้าง slug และการเรียกคืน Active Memory จะร้องขอการล้างข้อมูลเมื่อจบการรัน เพื่อไม่ให้ stdio
children และสตรีม Streamable HTTP/SSE มีอายุยาวกว่าการรัน
ข้อจำกัด
- ไม่มี tool calls ของ OpenClaw โดยตรง OpenClaw ไม่ฉีด tool calls เข้าไปใน
โปรโตคอลแบ็กเอนด์ CLI แบ็กเอนด์จะเห็นเครื่องมือ Gateway เฉพาะเมื่อเลือกใช้
bundleMcp: trueเท่านั้น - การสตรีมขึ้นอยู่กับแบ็กเอนด์ บางแบ็กเอนด์สตรีม JSONL; ส่วนอื่นบัฟเฟอร์ จนกว่าจะออก
- เอาต์พุตแบบมีโครงสร้าง ขึ้นอยู่กับรูปแบบ JSON ของ CLI
- เซสชัน Codex CLI ดำเนินต่อผ่านเอาต์พุตข้อความ (ไม่มี JSONL) ซึ่งมีโครงสร้างน้อยกว่า
การรัน
--jsonครั้งแรก เซสชัน OpenClaw ยังคงทำงานได้ ตามปกติ
การแก้ไขปัญหา
- ไม่พบ CLI: ตั้งค่า
commandเป็นพาธเต็ม - ชื่อโมเดลผิด: ใช้
modelAliasesเพื่อแมปprovider/model→ โมเดล CLI - ไม่มีความต่อเนื่องของเซสชัน: ตรวจสอบว่าได้ตั้งค่า
sessionArgแล้ว และsessionModeไม่ใช่none(ขณะนี้ Codex CLI ยังไม่สามารถดำเนินต่อด้วยเอาต์พุต JSON ได้) - รูปภาพถูกละเว้น: ตั้งค่า
imageArg(และตรวจสอบว่า CLI รองรับพาธไฟล์)