Gateway

แบ็กเอนด์ CLI

OpenClaw สามารถเรียกใช้ AI CLI ภายในเครื่องเป็นทางเลือกสำรองแบบข้อความเท่านั้น เมื่อผู้ให้บริการ API หยุดให้บริการ ถูกจำกัดอัตราการใช้งาน หรือทำงานผิดปกติ โดยตั้งใจออกแบบให้ทำงานอย่างรัดกุม:

  • เครื่องมือของ OpenClaw จะไม่ถูกแทรกโดยตรง แต่แบ็กเอนด์ที่ตั้งค่า bundleMcp: true สามารถรับเครื่องมือของ Gateway ผ่านบริดจ์ MCP แบบ local loopback ได้
  • รองรับการสตรีม JSONL สำหรับ CLI ที่รองรับ
  • รองรับเซสชัน เพื่อให้การโต้ตอบในรอบถัดไปยังคงต่อเนื่องสอดคล้องกัน
  • ส่งผ่านรูปภาพได้หาก CLI ยอมรับพาธรูปภาพ

ใช้เป็นกลไกสำรองเพื่อให้ได้คำตอบแบบข้อความที่ “ใช้งานได้เสมอ” ไม่ใช่เป็นเส้นทางหลัก หากต้องการรันไทม์ฮาร์เนสเต็มรูปแบบที่มีการควบคุมเซสชัน ACP, งานเบื้องหลัง, การผูกเธรด/การสนทนา และเซสชันการเขียนโค้ดภายนอกแบบถาวร ให้ใช้ เอเจนต์ ACP แทน เพราะแบ็กเอนด์ CLI ไม่ใช่ ACP

เริ่มต้นอย่างรวดเร็ว

Plugin Anthropic ที่รวมมาให้จะลงทะเบียนแบ็กเอนด์ claude-cli เริ่มต้น จึงใช้งานได้โดยไม่ต้องกำหนดค่าเพิ่มเติม เพียงติดตั้ง Claude Code และเข้าสู่ระบบแล้ว:

bash
openclaw agent --agent main --message "hi" --model claude-cli/claude-sonnet-4-6

main คือรหัสเอเจนต์เริ่มต้นเมื่อไม่ได้กำหนดรายการเอเจนต์ไว้อย่างชัดเจน มิฉะนั้นให้แทนที่ด้วยรหัสเอเจนต์ของคุณเอง

หาก Gateway ทำงานภายใต้ launchd/systemd ที่มี PATH แบบจำกัด ให้ระบุไบนารีอย่างชัดเจน:

json5
{  agents: {    defaults: {      cliBackends: {        "claude-cli": {          command: "/opt/homebrew/bin/claude",        },      },    },  },}

หากคุณใช้แบ็กเอนด์ CLI ที่รวมมาให้เป็นผู้ให้บริการข้อความหลักบนโฮสต์ Gateway OpenClaw จะโหลด Plugin ที่รวมมาให้ซึ่งเป็นเจ้าของแบ็กเอนด์นั้นโดยอัตโนมัติ เมื่อการกำหนดค่าของคุณอ้างอิงแบ็กเอนด์ดังกล่าวในข้อมูลอ้างอิงโมเดลหรือภายใต้ agents.defaults.cliBackends

การใช้เป็นทางเลือกสำรอง

เพิ่มแบ็กเอนด์ CLI ลงในรายการทางเลือกสำรอง เพื่อให้ทำงานเฉพาะเมื่อโมเดลหลักล้มเหลว:

json5
{  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>

json5
{  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,        },      },    },  },}

วิธีการทำงาน

  1. เลือกแบ็กเอนด์ตามคำนำหน้าผู้ให้บริการ (claude-cli/...)
  2. สร้างพรอมต์ระบบโดยใช้พรอมต์และบริบทเวิร์กสเปซเดียวกันกับ OpenClaw
  3. เรียกใช้ CLI พร้อมรหัสเซสชัน (หากรองรับ) เพื่อให้ประวัติคงความสอดคล้อง แบ็กเอนด์ claude-cli ที่รวมมาให้จะคงกระบวนการ stdio ของ Claude ไว้หนึ่งกระบวนการต่อเซสชัน OpenClaw และส่งรอบการโต้ตอบถัดไปผ่าน stdin แบบ stream-json
  4. แยกวิเคราะห์เอาต์พุต (JSON หรือข้อความธรรมดา) และส่งคืนข้อความสุดท้าย
  5. บันทึกรหัสเซสชันแยกตามแบ็กเอนด์ เพื่อให้การโต้ตอบถัดไปใช้เซสชัน CLI เดิมซ้ำ

รายละเอียดเฉพาะของ 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 การตั้งค่า agents.list[].tools.exec รายเอเจนต์จะแทนที่ tools.exec ส่วนกลางสำหรับเอเจนต์นั้น อาร์กิวเมนต์ดิบของแบ็กเอนด์อาจยังมี --permission-mode ได้ แต่การเรียก Claude แบบทำงานสดจะปรับแฟล็กดังกล่าวให้ตรงกับนโยบายที่มีผล

แบ็กเอนด์ยังแมประดับ /think ของ OpenClaw ไปยังแฟล็ก --effort แบบเนทีฟของ Claude Code: minimal/low -> low, medium -> medium และส่งผ่าน high/xhigh/max โดยตรง adaptive จะลบแฟล็ก --effort ที่กำหนดค่าไว้และไม่ใส่ค่าแทน เพื่อให้ Claude Code กำหนดระดับความพยายามที่มีผลจากสภาพแวดล้อม การตั้งค่า และค่าเริ่มต้นของโมเดลเอง แบ็กเอนด์ CLI อื่นต้องให้ Plugin เจ้าของประกาศตัวแมป argv ที่เทียบเท่ากันก่อน /think จึงจะมีผลต่อ CLI ที่เรียกขึ้นมา

ก่อนที่ OpenClaw จะใช้ claude-cli ได้ Claude Code เองต้องเข้าสู่ระบบบนโฮสต์เดียวกันก่อน:

bash
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 ที่ใช้ผู้ให้บริการเดียวกันจะอาศัย --resume ของ Claude เองและข้ามบทนำ
  • ข้อมูลเริ่มต้นจะใช้การตรวจสอบพาธไฟล์เซสชัน Claude ที่มีอยู่ซ้ำ จึงไม่สามารถอ่านพาธใด ๆ ตามอำเภอใจได้

รูปภาพ

หาก CLI ของคุณยอมรับพาธรูปภาพ ให้ตั้งค่า imageArg:

json5
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 ใช้ฮาร์เนสแอปเซิร์ฟเวอร์ 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 json OpenClaw จะปรับแบ็กเอนด์นั้นกลับเป็น output: "json" และอ่านข้อความตอบกลับจากฟิลด์ response ใน JSON
  • หากไม่มี usage หรือมีค่าเป็นค่าว่าง ระบบจะใช้ stats แทน โดย stats.cached จะถูกปรับเป็น cacheRead ของ OpenClaw และหากไม่มี stats.input จำนวนโทเค็นอินพุตจะคำนวณจาก stats.input_tokens - stats.cached

แทนที่ค่าเริ่มต้นเฉพาะเมื่อจำเป็นเท่านั้น (กรณีที่พบบ่อยที่สุดคือพาธแบบสัมบูรณ์ของ command)

โอเวอร์เลย์การแปลงข้อความ

Plugin ที่ต้องใช้ชิมความเข้ากันได้เล็กน้อยสำหรับพรอมป์/ข้อความสามารถประกาศการแปลงข้อความแบบสองทิศทางได้ โดยไม่ต้องแทนที่ผู้ให้บริการหรือแบ็กเอนด์ CLI:

typescript
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 จะคืนค่ารายการเซสชันเดิมโดยไม่แก้ไข ส่วนเซสชันฮาร์เนสแบบเนทีฟ เช่น Codex จะยังคงถูกส่งไปยังเอนด์พอยต์ Compaction ของฮาร์เนส

typescript
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 จะ:

  • เปิดเซิร์ฟเวอร์ MCP ผ่าน HTTP แบบ loopback ซึ่งเปิดให้กระบวนการ CLI เข้าถึงเครื่องมือของ Gateway โดยยืนยันตัวตนด้วยสิทธิ์บริบทเฉพาะแต่ละรอบ (OPENCLAW_MCP_TOKEN) ซึ่งใช้งานได้เฉพาะความพยายามดำเนินการปัจจุบัน
  • ผูกการเข้าถึงเครื่องมือกับบริบทเซสชัน บัญชี และช่องทางที่ Gateway เลือก แทนการเชื่อถือส่วนหัวจากกระบวนการลูก
  • โหลดเซิร์ฟเวอร์ MCP แบบรวมชุดที่เปิดใช้งานสำหรับพื้นที่ทำงานปัจจุบัน และผสานเข้ากับรูปแบบการกำหนดค่า/การตั้งค่า MCP ที่มีอยู่ของแบ็กเอนด์
  • เขียนการกำหนดค่าการเริ่มทำงานใหม่โดยใช้โหมดการผสานรวมที่แบ็กเอนด์เป็นเจ้าของจาก Plugin เจ้าของ

หากไม่มีเซิร์ฟเวอร์ 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 รองรับพาธไฟล์

เนื้อหาที่เกี่ยวข้อง

Was this useful?
On this page

On this page