Gateway
แบ็กเอนด์ CLI
OpenClaw สามารถเรียกใช้ AI CLI ภายในเครื่องเป็นทางเลือกสำรองแบบข้อความเท่านั้น เมื่อผู้ให้บริการ API หยุดทำงาน ถูกจำกัดอัตรา หรือทำงานผิดปกติ โดยออกแบบให้ระมัดระวังโดยเจตนา:
- เครื่องมือ OpenClaw จะไม่ถูกแทรกโดยตรง แต่แบ็กเอนด์ที่มี
bundleMcp: trueสามารถรับเครื่องมือ Gateway ผ่านบริดจ์ MCP แบบลูปแบ็กได้ - การสตรีม JSONL สำหรับ CLI ที่รองรับ
- รองรับเซสชัน จึงทำให้การโต้ตอบต่อเนื่องยังคงสอดคล้องกัน
- รูปภาพจะถูกส่งผ่านหาก CLI ยอมรับพาธรูปภาพ
ใช้เป็นกลไกสำรองสำหรับการตอบกลับข้อความที่ "ใช้งานได้เสมอ" ไม่ใช่เส้นทางหลัก สำหรับรันไทม์ฮาร์เนสเต็มรูปแบบที่มีการควบคุมเซสชัน ACP, งานเบื้องหลัง, การผูกเธรด/การสนทนา และเซสชันการเขียนโค้ดภายนอกแบบถาวร ให้ใช้ เอเจนต์ ACP แทน โดยแบ็กเอนด์ CLI ไม่ใช่ ACP
เริ่มต้นอย่างรวดเร็ว
Plugin Anthropic ที่รวมมาให้จะลงทะเบียนแบ็กเอนด์ claude-cli เริ่มต้น จึงใช้งานได้โดยไม่ต้องกำหนดค่าเพิ่มเติม นอกจากติดตั้ง Claude Code และเข้าสู่ระบบแล้ว:
openclaw agent --agent main --message "hi" --model claude-cli/claude-sonnet-4-6main คือ ID เอเจนต์เริ่มต้นเมื่อไม่ได้กำหนดรายการเอเจนต์อย่างชัดเจน มิฉะนั้นให้แทนที่ด้วย ID เอเจนต์ของคุณเอง
หาก Gateway ทำงานภายใต้ launchd/systemd ที่มี PATH ขั้นต่ำ ให้ระบุไบนารีอย่างชัดเจน:
{ agents: { defaults: { cliBackends: { "claude-cli": { command: "/opt/homebrew/bin/claude", }, }, }, },}หากใช้แบ็กเอนด์ CLI ที่รวมมาให้เป็นผู้ให้บริการข้อความหลักบนโฮสต์ Gateway OpenClaw จะโหลด Plugin ที่รวมมาให้และเป็นเจ้าของแบ็กเอนด์นั้นโดยอัตโนมัติ เมื่อการกำหนดค่าของคุณอ้างอิงแบ็กเอนด์นั้นในข้อมูลอ้างอิงโมเดลหรือภายใต้ 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.modelPolicy.allow ก็ตาม เพิ่มโมเดลแบ็กเอนด์ CLI ลงในนโยบายนั้นเฉพาะเมื่อผู้ใช้ควรเลือกโมเดลนั้นโดยตรงผ่าน /model, การแทนที่ระดับเซสชัน หรือ --model ได้ด้วยเท่านั้น agents.defaults.models มีหน้าที่เฉพาะกับชื่อแทน พารามิเตอร์ และข้อมูลเมตาของแต่ละโมเดล
การกำหนดค่า
แบ็กเอนด์ CLI ทั้งหมดอยู่ภายใต้ agents.defaults.cliBackends โดยใช้ ID ผู้ให้บริการเป็นคีย์ (เช่น claude-cli, my-cli) ID ผู้ให้บริการจะกลายเป็นด้านซ้ายของข้อมูลอ้างอิงโมเดล: <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 พร้อม ID เซสชัน (หากรองรับ) เพื่อให้ประวัติสอดคล้องกัน แบ็กเอนด์
claude-cliที่รวมมาให้จะคงกระบวนการ stdio ของ Claude ไว้ต่อเซสชัน OpenClaw และส่งการโต้ตอบต่อเนื่องผ่าน stdin แบบ stream-json - แยกวิเคราะห์เอาต์พุต (JSON หรือข้อความธรรมดา) และส่งคืนข้อความสุดท้าย
- จัดเก็บ ID เซสชันแบบถาวรแยกตามแบ็กเอนด์ เพื่อให้การโต้ตอบต่อเนื่องใช้เซสชัน CLI เดิมซ้ำ
การหมดเวลาและงานที่ทำงานเป็นเวลานาน
แบ็กเอนด์ CLI มีขีดจำกัดอิสระสองรายการ:
agents.defaults.timeoutSecondsจำกัดการโต้ตอบทั้งหมดของเอเจนต์ การโต้ตอบ Gateway ปกติจะสืบทอดค่าเริ่มต้น 48 ชั่วโมง ส่วน0ทำให้งบเวลาของการโต้ตอบไม่จำกัด การแทนที่ที่จัดเก็บไว้ เช่น600จะแทนที่ค่าเริ่มต้นดังกล่าว- ตัวเฝ้าระวังเมื่อ CLI ไม่มีเอาต์พุตจะหยุดกระบวนการย่อยที่ไม่มีการตอบสนอง โดยใช้โปรไฟล์แยกสำหรับการเริ่มใหม่/ดำเนินการต่อภายใต้
agents.defaults.cliBackends.<id>.reliability.watchdogและยังคงทำงานแม้งบเวลาโดยรวมของการโต้ตอบจะไม่จำกัด
นำการแทนที่การหมดเวลาโดยรวมที่สั้นออกเพื่อกลับไปใช้ค่าเริ่มต้น 48 ชั่วโมง หรือตั้งงบเวลาอย่างชัดเจน เช่น 12 ชั่วโมง:
# กลับไปใช้ค่าเริ่มต้น 48 ชั่วโมง:openclaw config unset agents.defaults.timeoutSeconds # หรือเลือกขีดจำกัด 12 ชั่วโมงอย่างชัดเจน:openclaw config set agents.defaults.timeoutSeconds 43200งานเบื้องหลังที่เริ่มภายใน CLI ยังคงเป็นส่วนหนึ่งของกระบวนการย่อย CLI นั้น หากการโต้ตอบหลักถึงขีดจำกัดโดยรวม OpenClaw จะหยุดกระบวนการย่อยพร้อมกับงานเบื้องหลังภายใน CLI สำหรับงานระยะยาวที่ต้องคงอยู่ ให้ใช้ เอเจนต์ย่อย หรือ เอเจนต์ ACP แบบแยกออกจาก OpenClaw โดยเอเจนต์ย่อยแบบแยกออกไม่มีการหมดเวลาการทำงานเป็นค่าเริ่มต้น
คำสั่ง openclaw agent ยังมีกำหนดเวลาคำขอของตนเอง ค่าเริ่มต้นสำรอง 600 วินาทีใช้กับการเรียกคำสั่งนั้น ไม่ใช่การโต้ตอบ Gateway ทั่วไป โปรดดู openclaw agent
รายละเอียดเฉพาะของ Claude CLI
แบ็กเอนด์ claude-cli ที่รวมมาให้จะเลือกใช้ตัวแก้ไข Skills แบบเนทีฟของ Claude Code เมื่อสแนปชอต Skills ปัจจุบันมี Skills ที่เลือกอย่างน้อยหนึ่งรายการพร้อมพาธที่สร้างขึ้นจริง OpenClaw จะส่ง Plugin Claude Code ชั่วคราวผ่าน --plugin-dir และละเว้นแค็ตตาล็อก Skills ของ OpenClaw ที่ซ้ำกันออกจากพรอมต์ระบบที่ต่อท้าย หากไม่มี Skills ของ Plugin ที่สร้างขึ้นจริง OpenClaw จะคงแค็ตตาล็อกพรอมต์ไว้เป็นทางเลือกสำรอง การแทนที่สภาพแวดล้อม/คีย์ API ของ Skills ยังคงมีผลกับสภาพแวดล้อมของกระบวนการลูกสำหรับการทำงานนั้น
Claude CLI มีโหมดสิทธิ์แบบไม่โต้ตอบของตนเอง OpenClaw จะแมปโหมดดังกล่าวเข้ากับนโยบายการดำเนินการที่มีอยู่ แทนการเพิ่มการกำหนดค่าเฉพาะ Claude สำหรับเซสชัน Claude แบบสดที่ OpenClaw จัดการ นโยบายการดำเนินการที่มีผลถือเป็นข้อกำหนดหลัก: โดยปกติ YOLO (tools.exec.security: "full" และ tools.exec.ask: "off") จะเปิด Claude ด้วย --permission-mode bypassPermissions ส่วนนโยบายที่เข้มงวดจะเปิดด้วย --permission-mode default Gateway ที่ทำงานด้วย root จะใช้ default ด้วย เนื่องจาก Claude Code ปฏิเสธโหมดข้ามข้อจำกัดสำหรับ root โดย OpenClaw ยังคงตอบคำขอควบคุมเครื่องมือผ่าน stdio ของ Claude ตามนโยบายการดำเนินการที่กำหนดค่าไว้ การตั้งค่า 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 กำหนดความพยายามที่มีผลจากสภาพแวดล้อม การตั้งค่า และค่าเริ่มต้นของโมเดลเอง แบ็กเอนด์ CLI อื่นต้องให้ Plugin เจ้าของประกาศตัวแมป argv ที่เทียบเท่าก่อนที่ /think จะส่งผลต่อ CLI ที่เปิดขึ้น
ก่อนที่ 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}) เมื่อจำเป็นต้องใส่ ID ในหลายแฟล็ก - หาก CLI ใช้คำสั่งย่อยสำหรับดำเนินการต่อพร้อมแฟล็กที่ต่างกัน ให้ตั้งค่า
resumeArgs(แทนที่argsเมื่อดำเนินการต่อ) และอาจตั้งค่าresumeOutputสำหรับการดำเนินการต่อที่ไม่ใช่ JSON sessionMode:always: ส่ง ID เซสชันเสมอ (UUID ใหม่หากยังไม่มีที่จัดเก็บไว้)existing: ส่ง ID เซสชันเฉพาะเมื่อเคยจัดเก็บไว้ก่อนแล้วnone: ไม่ส่ง ID เซสชัน
claude-cliมีค่าเริ่มต้นเป็นliveSession: "claude-stdio",output: "jsonl"และinput: "stdin"ดังนั้นการโต้ตอบต่อเนื่องจะใช้กระบวนการ Claude แบบสดซ้ำขณะที่ยังทำงานอยู่ รวมถึงการกำหนดค่าแบบกำหนดเองที่ละเว้นฟิลด์การรับส่ง หาก Gateway รีสตาร์ตหรือกระบวนการที่ไม่ได้ใช้งานปิดตัวลง OpenClaw จะดำเนินการต่อจาก ID เซสชัน Claude ที่จัดเก็บไว้ ระบบจะตรวจสอบ ID เซสชันที่จัดเก็บไว้กับทรานสคริปต์โปรเจกต์ที่อ่านได้ก่อนดำเนินการต่อ หากไม่มีทรานสคริปต์ ระบบจะล้างการผูก (บันทึกเป็นreason=transcript-missing) แทนการเริ่มเซสชันใหม่ภายใต้--resumeโดยไม่แจ้ง- เซสชัน Claude แบบสดมีขีดจำกัดการป้องกันเอาต์พุต JSONL: 8 MiB และ 20,000 บรรทัด JSONL ดิบต่อการโต้ตอบ
- เซสชัน CLI ที่จัดเก็บไว้เป็นความต่อเนื่องที่ผู้ให้บริการเป็นเจ้าของ การรีเซ็ตอัตโนมัติถูกปิดเป็นค่าเริ่มต้น โดย
/resetและนโยบายsession.resetแบบรายวันหรือเมื่อไม่ได้ใช้งานที่กำหนดไว้อย่างชัดเจนยังคงตัดเซสชันเหล่านี้ - โดยปกติเซสชัน CLI ใหม่จะเติมข้อมูลเริ่มต้นอีกครั้งเฉพาะจากสรุป Compaction ของ OpenClaw และส่วนท้ายหลัง Compaction เพื่อกู้คืนเซสชันระยะสั้นที่ใช้ไม่ได้ก่อน Compaction แบ็กเอนด์สามารถเลือกใช้
reseedFromRawTranscriptWhenUncompacted: trueได้ การเติมข้อมูลเริ่มต้นจากทรานสคริปต์ดิบอีกครั้งยังคงมีขอบเขตจำกัดและจำกัดไว้เฉพาะกรณีที่ใช้ไม่ได้อย่างปลอดภัย เช่น ทรานสคริปต์ CLI หายไป ส่วนท้ายการใช้เครื่องมือที่ไม่มีเจ้าของ การเปลี่ยนแปลงนโยบายข้อความ/พรอมต์ระบบ/cwd/MCP หรือการลองใหม่หลังเซสชันหมดอายุ ส่วนการเปลี่ยนแปลงโปรไฟล์การยืนยันตัวตนหรือยุคของข้อมูลประจำตัวจะไม่เติมข้อมูลเริ่มต้นจากประวัติทรานสคริปต์ดิบอีกครั้ง
การทำงานแบบลำดับ: serialize: true จะรักษาลำดับการทำงานในเลนเดียวกัน (CLI ส่วนใหญ่ทำงานเป็นลำดับบนเลนผู้ให้บริการเดียว) OpenClaw ยังยกเลิกการใช้เซสชัน CLI ที่จัดเก็บไว้ซ้ำเมื่อข้อมูลประจำตัวสำหรับการยืนยันตัวตนที่เลือกเปลี่ยนแปลง รวมถึง ID โปรไฟล์การยืนยันตัวตน คีย์ API แบบคงที่ โทเค็นแบบคงที่ หรือข้อมูลประจำตัวบัญชี OAuth ที่เปลี่ยนแปลงเมื่อ CLI เปิดเผยข้อมูลดังกล่าว การหมุนเวียนโทเค็นการเข้าถึง/รีเฟรช OAuth เพียงอย่างเดียวจะไม่ตัดเซสชัน หาก CLI ไม่มี ID บัญชี 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ภายในผู้ให้บริการเดียวกันจะใช้--resumeของ Claude เองและข้ามบทนำ - ข้อมูลตั้งต้นจะใช้การตรวจสอบพาธไฟล์เซสชัน Claude ที่มีอยู่แล้วซ้ำ จึงไม่สามารถอ่านพาธตามอำเภอใจได้
รูปภาพ
หาก CLI รองรับพาธรูปภาพ ให้ตั้งค่า imageArg:
imageArg: "--image",imageMode: "repeat"OpenClaw เขียนรูปภาพ base64 ลงในไฟล์ชั่วคราว หากตั้งค่า imageArg พาธเหล่านั้นจะถูกส่งเป็นอาร์กิวเมนต์ CLI หากไม่ได้ตั้งค่า OpenClaw จะต่อท้ายพาธไฟล์เข้ากับพรอมต์ (การแทรกพาธ) ซึ่งใช้ได้กับ CLI ที่โหลดไฟล์ในเครื่องโดยอัตโนมัติจากพาธแบบข้อความธรรมดา
อินพุตและเอาต์พุต
output: "text"(ค่าเริ่มต้น) ถือว่า stdout เป็นคำตอบสุดท้ายoutput: "json"พยายามแยกวิเคราะห์ JSON และดึงข้อความพร้อมรหัสเซสชันoutput: "jsonl"แยกวิเคราะห์สตรีม JSONL และดึงข้อความสุดท้ายของเอเจนต์พร้อมตัวระบุเซสชันเมื่อมี- สำหรับเอาต์พุต JSON ของ Gemini CLI นั้น OpenClaw จะอ่านข้อความตอบกลับจาก
responseและข้อมูลการใช้งานจากstatsเมื่อusageไม่มีอยู่หรือว่างเปล่า ค่าเริ่มต้นของ Gemini CLI ที่รวมมาให้ใช้stream-jsonส่วนการแทนที่--output-format jsonแบบเก่ายังคงใช้ตัวแยกวิเคราะห์ JSON
โหมดอินพุต:
input: "arg"(ค่าเริ่มต้น) ส่งพรอมต์เป็นอาร์กิวเมนต์ CLI ตัวสุดท้ายinput: "stdin"ส่งพรอมต์ผ่าน stdin- หากพรอมต์ยาวมากและตั้งค่า
maxPromptArgCharsระบบจะใช้ stdin แทน
ค่าเริ่มต้นที่ Plugin เป็นเจ้าของ
ค่าเริ่มต้นของแบ็กเอนด์ CLI เป็นส่วนหนึ่งของพื้นผิว Plugin:
- Plugin ลงทะเบียนค่าเหล่านี้ด้วย
api.registerCliBackend(...) idของแบ็กเอนด์จะกลายเป็นคำนำหน้าผู้ให้บริการในการอ้างอิงโมเดล- การกำหนดค่าของผู้ใช้ใน
agents.defaults.cliBackends.<id>ยังคงแทนที่ค่าเริ่มต้นของ Plugin - การล้างการกำหนดค่าเฉพาะแบ็กเอนด์ยังคงเป็นความรับผิดชอบของ Plugin ผ่านฮุก
normalizeConfigที่เป็นทางเลือก
Anthropic เป็นเจ้าของ claude-cli และ Google เป็นเจ้าของ google-gemini-cli การทำงานของเอเจนต์ OpenAI Codex ใช้ชุดทดสอบ app-server ของ Codex ผ่าน openai/* โดย OpenClaw จะไม่ลงทะเบียนแบ็กเอนด์ codex-cli ที่รวมมาให้อีกต่อไป
Plugin 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 |
Plugin 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 jsonOpenClaw จะปรับแบ็กเอนด์นั้นกลับเป็นoutput: "json"และอ่านข้อความตอบกลับจากฟิลด์responseใน JSON - ข้อมูลการใช้งานจะสำรองไปใช้
statsเมื่อusageไม่มีอยู่หรือว่างเปล่า โดยstats.cachedจะถูกปรับให้อยู่ในรูปcacheReadของ OpenClaw และหากไม่มีstats.inputจำนวนโทเค็นอินพุตจะคำนวณจากstats.input_tokens - stats.cached
แทนที่ค่าเริ่มต้นเฉพาะเมื่อจำเป็นเท่านั้น (กรณีที่พบบ่อยที่สุดคือพาธ command แบบสัมบูรณ์)
โอเวอร์เลย์การแปลงข้อความ
Plugin ที่ต้องใช้ชิมความเข้ากันได้ขนาดเล็กสำหรับพรอมต์/ข้อความ สามารถประกาศการแปลงข้อความแบบสองทิศทางได้โดยไม่ต้องแทนที่ผู้ให้บริการหรือแบ็กเอนด์ 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 สำหรับเหตุการณ์ stream-json ของ Gemini CLI
การเป็นเจ้าของ Compaction แบบเนทีฟ
แบ็กเอนด์ CLI บางรายการเรียกใช้เอเจนต์ที่ทำ Compaction ทรานสคริปต์ของตนเอง ดังนั้น OpenClaw ต้องไม่เรียกใช้ตัวสรุปเพื่อป้องกันกับแบ็กเอนด์เหล่านั้น เพราะจะขัดแย้งกับ Compaction ของแบ็กเอนด์เองและอาจทำให้ผลัดการทำงานล้มเหลวโดยสิ้นเชิง
claude-cli ไม่มีปลายทางชุดทดสอบ (Claude Code ทำ Compaction ภายใน) จึงประกาศ ownsNativeCompaction: true และเส้นทาง Compaction ของ OpenClaw จะคืนรายการเซสชันโดยไม่เปลี่ยนแปลง OpenClaw ส่งงบประมาณบริบทที่มีผลของการทำงานผ่าน CLAUDE_CODE_AUTO_COMPACT_WINDOW ที่ Claude Code จัดทำเอกสารไว้ เพื่อให้การทำ Compaction อัตโนมัติแบบเนทีฟสอดคล้องกับขีดจำกัด contextTokens ของ Anthropic ที่กำหนดค่าไว้ ส่วนเซสชันชุดทดสอบแบบเนทีฟ เช่น Codex ยังคงส่งต่อไปยังปลายทาง Compaction ของชุดทดสอบนั้นแทน
api.registerCliBackend({ id: "my-cli", ownsNativeCompaction: true /* ... */ });ประกาศ ownsNativeCompaction เฉพาะสำหรับแบ็กเอนด์ที่เป็นเจ้าของ Compaction อย่างแท้จริงเท่านั้น โดยต้องจำกัดขนาดทรานสคริปต์ของตนเองให้อยู่ใกล้กับหน้าต่างบริบทได้อย่างน่าเชื่อถือ และบันทึกเซสชันที่กลับมาทำต่อได้ (เช่น --resume / --session-id) มิฉะนั้นเซสชันที่เลื่อนออกไปอาจยังคงเกินงบประมาณได้
โอเวอร์เลย์ MCP แบบรวมชุด
แบ็กเอนด์ CLI ไม่ได้รับการเรียกเครื่องมือของ OpenClaw โดยตรง แต่แบ็กเอนด์สามารถเลือกใช้โอเวอร์เลย์การกำหนดค่า MCP ที่สร้างขึ้นด้วย bundleMcp: true ได้ พฤติกรรมปัจจุบันที่รวมมาให้มีดังนี้:
claude-cli: ไฟล์การกำหนดค่า MCP แบบเข้มงวดที่สร้างขึ้นgoogle-gemini-cli: ไฟล์การตั้งค่าระบบ Gemini ที่สร้างขึ้น
เมื่อเปิดใช้งาน MCP แบบรวมชุด OpenClaw จะ:
- สร้างเซิร์ฟเวอร์ HTTP MCP แบบลูปแบ็กที่เปิดเผยเครื่องมือ Gateway ให้แก่กระบวนการ CLI โดยยืนยันตัวตนด้วยสิทธิ์บริบทเฉพาะการทำงาน (
OPENCLAW_MCP_TOKEN) ซึ่งมีผลเฉพาะความพยายามดำเนินการปัจจุบัน - ผูกการเข้าถึงเครื่องมือกับบริบทเซสชัน บัญชี และช่องทางที่ Gateway เลือก แทนการเชื่อถือส่วนหัวจากกระบวนการลูก
- โหลดเซิร์ฟเวอร์ bundle-MCP ที่เปิดใช้งานสำหรับเวิร์กสเปซปัจจุบัน และผสานเข้ากับรูปแบบการกำหนดค่า/การตั้งค่า MCP ของแบ็กเอนด์ที่มีอยู่
- เขียนการกำหนดค่าการเปิดใช้ใหม่โดยใช้โหมดการผสานรวมที่แบ็กเอนด์เป็นเจ้าของจาก Plugin เจ้าของ
หากไม่มีเซิร์ฟเวอร์ MCP ที่เปิดใช้งาน OpenClaw ยังคงแทรกการกำหนดค่าแบบเข้มงวดเมื่อแบ็กเอนด์เลือกใช้ MCP แบบรวมชุด เพื่อให้การทำงานเบื้องหลังยังคงแยกออกจากกัน
รันไทม์ MCP ที่รวมมาให้และจำกัดขอบเขตตามเซสชันจะถูกแคชเพื่อนำกลับมาใช้ซ้ำภายในเซสชัน จากนั้นจะถูกเก็บกวาดหลังไม่มีการใช้งานเป็นเวลา 10 นาที การทำงานแบบฝังครั้งเดียว เช่น การตรวจสอบการยืนยันตัวตน การสร้าง slug และการเรียกคืน Active Memory จะร้องขอให้ล้างข้อมูลเมื่อสิ้นสุดการทำงาน เพื่อไม่ให้กระบวนการลูก stdio และสตรีม HTTP/SSE แบบ Streamable มีอายุยาวเกินกว่าการทำงาน
ขีดจำกัดประวัติการตั้งข้อมูลเริ่มต้นใหม่
เมื่อเซสชัน CLI ใหม่ถูกตั้งต้นจากทรานสคริปต์ OpenClaw ก่อนหน้า (เช่น หลังจากลอง session_expired อีกครั้ง) บล็อก <conversation_history> ที่เรนเดอร์จะถูกจำกัดขนาดเพื่อป้องกันไม่ให้พรอมต์สำหรับการตั้งต้นใหม่ขยายใหญ่เกินไป ค่าเริ่มต้นคือ 12,288 อักขระ (ประมาณ 3,000 โทเค็น)
แบ็กเอนด์ Claude CLI จะปรับขนาดขีดจำกัดนี้ตามหน้าต่างบริบทของ Claude ที่ได้รับการกำหนดแทน โดยหน้าต่างบริบทที่ใหญ่กว่าจะได้รับส่วนของประวัติก่อนหน้าที่ใหญ่ขึ้นจนถึงเพดานคงที่ ส่วนแบ็กเอนด์ CLI อื่นจะยังคงใช้ค่าเริ่มต้นแบบระมัดระวัง ขีดจำกัดนี้ควบคุมเฉพาะบล็อกประวัติก่อนหน้าในพรอมต์สำหรับการตั้งต้นใหม่เท่านั้น
ข้อจำกัด
- ไม่มีการเรียกใช้เครื่องมือ OpenClaw โดยตรง: OpenClaw ไม่แทรกการเรียกใช้เครื่องมือลงในโปรโตคอลของแบ็กเอนด์ CLI แบ็กเอนด์จะเห็นเครื่องมือ Gateway เฉพาะเมื่อเลือกใช้
bundleMcp: true - การสตรีมขึ้นอยู่กับแบ็กเอนด์: แบ็กเอนด์บางรายการสตรีม JSONL ส่วนรายการอื่นจะบัฟเฟอร์จนกว่ากระบวนการจะสิ้นสุด
- เอาต์พุตแบบมีโครงสร้างขึ้นอยู่กับรูปแบบ JSON ของ CLI เอง
การแก้ไขปัญหา
| อาการ | วิธีแก้ไข |
|---|---|
| ไม่พบ CLI | ตั้งค่า command เป็นพาธแบบเต็ม |
| ชื่อโมเดลไม่ถูกต้อง | ใช้ modelAliases เพื่อแมป provider/model กับรหัสโมเดลของ CLI |
| เซสชันไม่ต่อเนื่อง | ตรวจสอบว่าได้ตั้งค่า sessionArg และ sessionMode ไม่ใช่ none |
| รูปภาพถูกละเว้น | ตั้งค่า imageArg และตรวจสอบว่า CLI รองรับพาธไฟล์ |