Gateway
ข้อมูลอ้างอิงการกำหนดค่า
ข้อมูลอ้างอิงระดับฟิลด์สำหรับ ~/.openclaw/openclaw.json: คีย์ ค่าเริ่มต้น และลิงก์ไปยังหน้าระบบย่อยเชิงลึก สำหรับคำแนะนำการตั้งค่าที่เน้นงาน โปรดดู การกำหนดค่า แค็ตตาล็อกคำสั่งที่ช่องทางและ Plugin เป็นเจ้าของ รวมถึงตัวเลือกเชิงลึกของหน่วยความจำ/QMD อยู่ในหน้าของแต่ละส่วน ไม่ได้อยู่ที่นี่
รูปแบบการกำหนดค่าคือ JSON5 (อนุญาตให้มีความคิดเห็นและเครื่องหมายจุลภาคท้ายรายการ) ฟิลด์ทั้งหมดเป็นตัวเลือก เมื่อไม่ได้ระบุ OpenClaw จะใช้ค่าเริ่มต้นที่ปลอดภัย
ความจริงจากโค้ดมีความสำคัญเหนือหน้านี้:
openclaw config schemaแสดง JSON Schema ที่ใช้งานจริงสำหรับการตรวจสอบความถูกต้องและ Control UI โดยผสานข้อมูลเมตาของบันเดิล/Plugin/ช่องทางแล้ว- เอเจนต์ควรเรียกการดำเนินการของเครื่องมือ
gatewayชื่อconfig.schema.lookupเพื่อรับโหนดสคีมาที่จำกัดขอบเขตตามพาธเพียงพาธเดียวอย่างแม่นยำก่อนแก้ไขการกำหนดค่า pnpm config:docs:check/pnpm config:docs:genตรวจสอบแฮชพื้นฐานของเอกสารนี้เทียบกับพื้นผิวสคีมาปัจจุบัน
ข้อมูลอ้างอิงเชิงลึกเฉพาะด้าน:
- ข้อมูลอ้างอิงการกำหนดค่าหน่วยความจำ สำหรับ
agents.defaults.memorySearch.*,memory.qmd.*,memory.citationsและการกำหนดค่า Dreaming ภายใต้plugins.entries.memory-core.config.dreaming - คำสั่งเครื่องหมายทับ สำหรับแค็ตตาล็อกคำสั่งในตัวและคำสั่งที่รวมในบันเดิลปัจจุบัน
- หน้าของช่องทาง/Plugin ที่เป็นเจ้าของ สำหรับพื้นผิวคำสั่งเฉพาะช่องทาง
ช่องทาง
คีย์การกำหนดค่าแยกตามช่องทางอยู่ใน การกำหนดค่า - ช่องทาง: channels.* สำหรับ Slack, Discord, Telegram, WhatsApp, Matrix, iMessage และช่องทางอื่นที่รวมในบันเดิล (การยืนยันตัวตน การควบคุมการเข้าถึง หลายบัญชี และการจำกัดด้วยการกล่าวถึง)
ค่าเริ่มต้นของเอเจนต์ หลายเอเจนต์ เซสชัน และข้อความ
โปรดดู การกำหนดค่า - เอเจนต์ สำหรับ:
agents.defaults.*(พื้นที่ทำงาน โมเดล การคิด Heartbeat หน่วยความจำ สื่อ Skills แซนด์บ็อกซ์)multiAgent.*(การกำหนดเส้นทางและการเชื่อมโยงแบบหลายเอเจนต์)session.*(วงจรชีวิตเซสชัน Compaction การตัดทอน)messages.*(การส่งข้อความ TTS การเรนเดอร์ Markdown)talk.*(โหมด Talk)talk.consultThinkingLevel: การแทนที่ระดับการคิดสำหรับการรันเอเจนต์ OpenClaw ทั้งหมดที่รองรับการปรึกษาแบบเรียลไทม์ของ Control UI Talktalk.consultFastMode: การแทนที่โหมดเร็วแบบครั้งเดียวสำหรับการปรึกษาแบบเรียลไทม์ของ Control UI Talktalk.speechLocale: รหัสโลแคล BCP 47 ที่เป็นตัวเลือกสำหรับการรู้จำเสียงพูดของ Talk บน Android, iOS และ macOStalk.silenceTimeoutMs: เมื่อไม่ได้ตั้งค่า Talk จะคงช่วงเวลาหยุดชั่วคราวเริ่มต้นของแพลตฟอร์มก่อนส่งข้อความถอดเสียง (700 ms on macOS and Android, 900 ms on iOS)talk.realtime.consultRouting: ทางเลือกสำรองของรีเลย์ Gateway สำหรับข้อความถอดเสียง Talk แบบเรียลไทม์ที่เสร็จสมบูรณ์ซึ่งข้ามopenclaw_agent_consult
เครื่องมือและผู้ให้บริการแบบกำหนดเอง
นโยบายเครื่องมือ ตัวเลือกทดลอง การกำหนดค่าเครื่องมือที่อาศัยผู้ให้บริการ และการตั้งค่า ผู้ให้บริการ / URL ฐานแบบกำหนดเองอยู่ใน การกำหนดค่า - เครื่องมือและผู้ให้บริการแบบกำหนดเอง
โมเดล
คำจำกัดความผู้ให้บริการ รายการโมเดลที่อนุญาต และการตั้งค่าผู้ให้บริการแบบกำหนดเองอยู่ใน
การกำหนดค่า - เครื่องมือและผู้ให้บริการแบบกำหนดเอง
รูท models ยังเป็นเจ้าของพฤติกรรมแค็ตตาล็อกโมเดลส่วนกลางด้วย
{ models: { // ตัวเลือก ค่าเริ่มต้น: true ต้องรีสตาร์ต Gateway เมื่อมีการเปลี่ยนแปลง pricing: { enabled: false }, },}models.mode: พฤติกรรมแค็ตตาล็อกผู้ให้บริการ (mergeหรือreplace)models.providers: แมปผู้ให้บริการแบบกำหนดเองที่ใช้รหัสผู้ให้บริการเป็นคีย์models.providers.*.localService: ตัวจัดการกระบวนการตามต้องการที่เป็นตัวเลือกสำหรับ เซิร์ฟเวอร์โมเดลภายในเครื่อง OpenClaw ตรวจสอบปลายทางสถานภาพที่กำหนดค่าไว้ เริ่มcommandแบบพาธสัมบูรณ์เมื่อจำเป็น รอจนพร้อม แล้วจึงส่งคำขอ โมเดล โปรดดู บริการโมเดลภายในเครื่องmodels.pricing.enabled: ควบคุมการเริ่มต้นข้อมูลราคาเบื้องหลังซึ่ง เริ่มหลังจากไซด์คาร์และช่องทางเข้าสู่พาธพร้อมใช้งานของ Gateway เมื่อfalseGateway จะข้ามการดึงแค็ตตาล็อกราคาของ OpenRouter และ LiteLLM แต่ค่าmodels.providers.*.models[].costที่กำหนดค่าไว้ยังคงใช้ได้สำหรับการประมาณค่าใช้จ่ายภายในเครื่อง
MCP
คำจำกัดความเซิร์ฟเวอร์ MCP ที่ OpenClaw จัดการอยู่ภายใต้ mcp.servers และ
ถูกใช้โดย OpenClaw แบบฝังตัวและอะแดปเตอร์รันไทม์อื่น คำสั่ง openclaw mcp list,
show, set และ unset จัดการบล็อกนี้โดยไม่เชื่อมต่อกับ
เซิร์ฟเวอร์เป้าหมายระหว่างแก้ไขการกำหนดค่า
{ mcp: { servers: { docs: { command: "npx", args: ["-y", "@modelcontextprotocol/server-fetch"], }, remote: { url: "https://example.com/mcp", transport: "streamable-http", // streamable-http | sse requestTimeoutMs: 20000, connectionTimeoutMs: 5000, supportsParallelToolCalls: true, headers: { Authorization: "Bearer ${MCP_REMOTE_TOKEN}", }, auth: "oauth", oauth: { scope: "docs.read", }, sslVerify: true, clientCert: "/path/to/client.crt", clientKey: "/path/to/client.key", toolFilter: { include: ["search_*"], exclude: ["admin_*"], }, // ตัวควบคุมการฉายภาพไปยังเซิร์ฟเวอร์แอป Codex ที่เป็นตัวเลือก codex: { agents: ["main"], defaultToolsApprovalMode: "approve", // auto | prompt | approve }, }, }, },}mcp.servers: คำจำกัดความเซิร์ฟเวอร์ MCP แบบ stdio หรือระยะไกลที่มีชื่อ สำหรับรันไทม์ที่ เปิดเผยเครื่องมือ MCP ที่กำหนดค่าไว้ รายการระยะไกลใช้transport: "streamable-http"หรือtransport: "sse";type: "http"เป็นนามแฝงแบบเนทีฟของ CLI ซึ่งopenclaw mcp setและopenclaw doctor --fixจะปรับให้อยู่ในฟิลด์มาตรฐานtransportmcp.servers.<name>.enabled: ตั้งค่าfalseเพื่อเก็บคำจำกัดความเซิร์ฟเวอร์ที่บันทึกไว้ แต่ไม่นำไปรวมในการค้นพบ MCP และการฉายเครื่องมือของ OpenClaw แบบฝังตัวmcp.servers.<name>.requestTimeoutMs: ระยะหมดเวลาคำขอ MCP แยกตามเซิร์ฟเวอร์ หน่วยเป็นมิลลิวินาทีmcp.servers.<name>.connectionTimeoutMs: ระยะหมดเวลาการเชื่อมต่อแยกตามเซิร์ฟเวอร์ หน่วยเป็นมิลลิวินาทีmcp.servers.<name>.supportsParallelToolCalls: คำแนะนำด้านภาวะพร้อมกันที่เป็นตัวเลือกสำหรับ อะแดปเตอร์ที่สามารถเลือกได้ว่าจะเรียกเครื่องมือ MCP แบบขนานหรือไม่mcp.servers.<name>.auth: ตั้งค่า"oauth"สำหรับเซิร์ฟเวอร์ HTTP MCP ที่ต้องใช้ OAuth เรียกใช้openclaw mcp login <name>เพื่อจัดเก็บโทเค็นภายใต้สถานะ OpenClawmcp.servers.<name>.oauth: การแทนที่ขอบเขต OAuth, URL เปลี่ยนเส้นทาง และ URL ข้อมูลเมตาไคลเอนต์ที่เป็นตัวเลือกmcp.servers.<name>.sslVerify,clientCert,clientKey: ตัวควบคุม HTTP TLS สำหรับปลายทางส่วนตัวและ TLS แบบสองทางmcp.servers.<name>.toolFilter: การเลือกเครื่องมือแยกตามเซิร์ฟเวอร์ที่เป็นตัวเลือกincludeจำกัดเครื่องมือ MCP ที่ค้นพบให้เหลือเฉพาะชื่อที่ตรงกัน ส่วนexcludeซ่อนชื่อที่ตรงกัน รายการเป็นชื่อเครื่องมือ MCP แบบตรงตัวหรือรูปแบบ glob อย่างง่าย*เซิร์ฟเวอร์ที่มี ทรัพยากรหรือพรอมต์จะสร้างชื่อเครื่องมืออรรถประโยชน์ด้วย (resources_list,resources_read,prompts_list,prompts_get) และชื่อเหล่านั้นใช้ ตัวกรองเดียวกันmcp.servers.<name>.codex: ตัวควบคุมการฉายภาพไปยังเซิร์ฟเวอร์แอป Codex ที่เป็นตัวเลือก บล็อกนี้เป็นข้อมูลเมตาของ OpenClaw สำหรับเธรดเซิร์ฟเวอร์แอป Codex เท่านั้น โดยไม่มี ผลต่อเซสชัน ACP การกำหนดค่าฮาร์เนส Codex ทั่วไป หรืออะแดปเตอร์รันไทม์อื่นcodex.agentsที่ไม่ว่างจะจำกัดเซิร์ฟเวอร์ไว้เฉพาะรหัสเอเจนต์ OpenClaw ที่ระบุ รายการเอเจนต์ที่กำหนดขอบเขตซึ่งว่าง มีเฉพาะช่องว่าง หรือไม่ถูกต้อง จะถูกปฏิเสธโดยการตรวจสอบ การกำหนดค่า และถูกละเว้นจากพาธการฉายของรันไทม์แทนที่จะกลายเป็นค่าทั่วทั้งระบบcodex.defaultToolsApprovalModeส่งออกdefault_tools_approval_modeแบบเนทีฟของ Codex สำหรับเซิร์ฟเวอร์นั้น OpenClaw จะตัดบล็อกcodexออกก่อนส่งการกำหนดค่าmcp_serversแบบเนทีฟไปยัง Codex ละเว้นบล็อกนี้เพื่อ ให้เซิร์ฟเวอร์ถูกฉายไปยังเอเจนต์เซิร์ฟเวอร์แอป Codex ทุกตัว โดยใช้พฤติกรรม การอนุมัติ MCP เริ่มต้นของ Codex- รันไทม์ MCP ที่รวมในบันเดิลและจำกัดขอบเขตตามเซสชันใช้ TTL เมื่อไม่มีการใช้งาน 10 นาทีในตัว การรันแบบฝังตัวครั้งเดียวจะขอให้ล้างข้อมูลเมื่อการรันสิ้นสุด ส่วน TTL เป็นกลไกสำรองสำหรับเซสชันที่ทำงานยาวนานและผู้เรียกในอนาคต
- การเปลี่ยนแปลงภายใต้
mcp.*จะมีผลทันทีโดยยกเลิกรันไทม์ MCP ของเซสชันที่แคชไว้ การค้นพบ/ใช้เครื่องมือครั้งถัดไปจะสร้างรันไทม์ใหม่จากการกำหนดค่าใหม่ ดังนั้นรายการmcp.serversที่ถูกนำออกจะถูกเก็บกวาดทันทีแทนที่จะรอ TTL เมื่อไม่มีการใช้งาน - การค้นพบของรันไทม์ยังรองรับการแจ้งเตือนการเปลี่ยนแปลงรายการเครื่องมือ MCP โดยล้าง แค็ตตาล็อกที่แคชไว้สำหรับเซสชันนั้น เซิร์ฟเวอร์ที่ประกาศทรัพยากรหรือ พรอมต์จะได้รับเครื่องมืออรรถประโยชน์สำหรับแสดงรายการ/อ่านทรัพยากร และแสดงรายการ/ดึง พรอมต์ ความล้มเหลวของการเรียกเครื่องมือซ้ำ ๆ จะหยุดเซิร์ฟเวอร์ที่ได้รับผลกระทบไว้ชั่วครู่ก่อน พยายามเรียกอีกครั้ง
โปรดดู MCP และ แบ็กเอนด์ CLI สำหรับพฤติกรรมรันไทม์
Skills
{ skills: { allowBundled: ["gemini", "peekaboo"], load: { extraDirs: ["~/Projects/agent-scripts/skills"], allowSymlinkTargets: ["~/Projects/manager/skills"], }, install: { preferBrew: true, nodeManager: "npm", // npm | pnpm | yarn | bun allowUploadedArchives: false, }, workshop: { allowSymlinkTargetWrites: false, }, entries: { "image-lab": { apiKey: { source: "env", provider: "default", id: "GEMINI_API_KEY" }, // หรือสตริงข้อความธรรมดา env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" }, }, peekaboo: { enabled: true }, sag: { enabled: false }, }, },}allowBundled: รายการอนุญาตที่เป็นตัวเลือกสำหรับ Skills ที่รวมในบันเดิลเท่านั้น (ไม่มีผลต่อ Skills ที่มีการจัดการ/ในพื้นที่ทำงาน)load.extraDirs: รูท Skills ที่ใช้ร่วมกันเพิ่มเติม (ลำดับความสำคัญต่ำสุด)load.allowSymlinkTargets: รูทเป้าหมายจริงที่เชื่อถือได้ซึ่งลิงก์สัญลักษณ์ของ Skills สามารถ ชี้ไปได้ เมื่อลิงก์อยู่นอกรูทต้นทางที่กำหนดค่าไว้workshop.allowSymlinkTargetWrites: อนุญาตให้การนำการเปลี่ยนแปลงจาก Skill Workshop ไปใช้ เขียน ผ่านไปยังเป้าหมายลิงก์สัญลักษณ์ที่เชื่อถืออยู่แล้ว (ค่าเริ่มต้น: false)install.preferBrew: เมื่อเป็น true ให้เลือกใช้ตัวติดตั้ง Homebrew ก่อนเมื่อมีbrewแล้วจึงถอยไปใช้ตัวติดตั้งชนิดอื่นinstall.nodeManager: ตัวเลือกตัวติดตั้ง Node สำหรับข้อกำหนดmetadata.openclaw.install(npm|pnpm|yarn|bun)install.allowUploadedArchives: อนุญาตให้ไคลเอนต์ Gatewayoperator.adminที่เชื่อถือได้ ติดตั้งไฟล์เก็บถาวร zip ส่วนตัวที่จัดเตรียมผ่านskills.upload.*(ค่าเริ่มต้น: false) การตั้งค่านี้เปิดใช้เฉพาะพาธไฟล์เก็บถาวรที่อัปโหลดเท่านั้น การติดตั้ง ClawHub ตามปกติไม่จำเป็นต้องใช้entries.<skillKey>.enabled: falseปิดใช้งาน Skills แม้ว่าจะรวมในบันเดิล/ติดตั้งไว้แล้วentries.<skillKey>.apiKey: ตัวช่วยอำนวยความสะดวกสำหรับ Skills ที่ประกาศตัวแปรสภาพแวดล้อมหลัก (สตริงข้อความธรรมดาหรือออบเจ็กต์ SecretRef)limits.maxCandidatesPerRoot,limits.maxSkillsLoadedPerSource,limits.maxSkillsInPrompt,limits.maxSkillsPromptChars,limits.maxSkillFileBytes: จำกัดการค้นพบ Skills และพรอมต์ Skills ที่แสดงต่อโมเดล- การตั้งค่าความเป็นอิสระ/การอนุมัติของ Skill Workshop (
workshop.autonomous.enabled,workshop.approvalPolicy,workshop.maxPending,workshop.maxSkillBytes) มีเอกสารอยู่ใน การกำหนดค่า Skills
Plugin
{ plugins: { enabled: true, allow: ["voice-call"], deny: [], load: { paths: ["~/Projects/oss/voice-call-plugin"], }, entries: { "voice-call": { enabled: true, hooks: { allowPromptInjection: false, }, config: { provider: "twilio" }, }, }, },}- โหลดจากไดเรกทอรีแพ็กเกจหรือบันเดิลภายใต้
~/.openclaw/extensionsและ<workspace>/.openclaw/extensionsรวมถึงไฟล์หรือไดเรกทอรีที่ระบุในplugins.load.paths - วางไฟล์ Plugin แบบสแตนด์อโลนไว้ใน
plugins.load.paths; รากส่วนขยายที่ค้นพบโดยอัตโนมัติจะละเว้นไฟล์ระดับบนสุด.js,.mjsและ.tsเพื่อไม่ให้สคริปต์ตัวช่วยในรากเหล่านั้นขัดขวางการเริ่มทำงาน - การค้นหารองรับทั้ง Plugin แบบเนทีฟของ OpenClaw บันเดิล Codex ที่เข้ากันได้ และบันเดิล Claude รวมถึงบันเดิล Claude ที่ไม่มีแมนิเฟสต์และใช้เค้าโครงเริ่มต้น
- การเปลี่ยนแปลงการกำหนดค่าต้องรีสตาร์ต Gateway
allow: รายการอนุญาตที่ไม่บังคับ (โหลดเฉพาะ Plugin ที่ระบุไว้) โดยdenyมีลำดับความสำคัญสูงกว่าplugins.entries.<id>.apiKey: ฟิลด์อำนวยความสะดวกสำหรับคีย์ API ระดับ Plugin (เมื่อ Plugin รองรับ)plugins.entries.<id>.env: แมปตัวแปรสภาพแวดล้อมที่จำกัดขอบเขตเฉพาะ Pluginplugins.entries.<id>.hooks.allowPromptInjection: เมื่อเป็นfalseแกนหลักจะบล็อกฮุกที่แก้ไขพรอมต์ เช่นbefore_prompt_buildโดยมีผลกับฮุกของ Plugin แบบเนทีฟและไดเรกทอรีฮุกที่มาจากบันเดิลซึ่งรองรับplugins.entries.<id>.hooks.allowConversationAccess: เมื่อเป็นtruePlugin ที่เชื่อถือได้และไม่ได้รวมมาในบันเดิลสามารถอ่านเนื้อหาการสนทนาดิบจากฮุกแบบมีชนิด เช่นllm_input,llm_output,before_model_resolve,before_agent_reply,before_agent_run,before_agent_finalizeและagent_endplugins.entries.<id>.subagent.allowModelOverride: เชื่อถือ Plugin นี้อย่างชัดเจนเพื่อให้ร้องขอการแทนที่providerและmodelต่อการรันสำหรับการรันเอเจนต์ย่อยเบื้องหลังplugins.entries.<id>.subagent.allowedModels: รายการอนุญาตที่ไม่บังคับของเป้าหมายprovider/modelแบบมาตรฐานสำหรับการแทนที่ของเอเจนต์ย่อยที่เชื่อถือได้ ใช้"*"เฉพาะเมื่อตั้งใจอนุญาตโมเดลใดก็ได้plugins.entries.<id>.llm.allowModelOverride: เชื่อถือ Plugin นี้อย่างชัดเจนเพื่อให้ร้องขอการแทนที่โมเดลสำหรับapi.runtime.llm.completeplugins.entries.<id>.llm.allowedModels: รายการอนุญาตที่ไม่บังคับของเป้าหมายprovider/modelแบบมาตรฐานสำหรับการแทนที่การเติมข้อความ LLM ของ Plugin ที่เชื่อถือได้ ใช้"*"เฉพาะเมื่อตั้งใจอนุญาตโมเดลใดก็ได้plugins.entries.<id>.llm.allowAgentIdOverride: เชื่อถือ Plugin นี้อย่างชัดเจนเพื่อให้รันapi.runtime.llm.completeกับรหัสเอเจนต์ที่ไม่ใช่ค่าเริ่มต้นplugins.entries.<id>.config: ออบเจ็กต์การกำหนดค่าที่ Plugin กำหนด (ตรวจสอบความถูกต้องด้วยสคีมา Plugin แบบเนทีฟของ OpenClaw เมื่อมี)- การตั้งค่าบัญชี/รันไทม์ของ Plugin ช่องทางอยู่ภายใต้
channels.<id>และควรอธิบายด้วยข้อมูลเมตาchannelConfigsในแมนิเฟสต์ของ Plugin เจ้าของ ไม่ใช่ด้วยรีจิสทรีตัวเลือกส่วนกลางของ OpenClaw
การกำหนดค่า Plugin ของชุดควบคุม Codex
Plugin codex ที่รวมมาในบันเดิลเป็นเจ้าของการตั้งค่าชุดควบคุมเซิร์ฟเวอร์แอป Codex แบบเนทีฟภายใต้
plugins.entries.codex.config ดูพื้นผิวการกำหนดค่าทั้งหมดได้ที่
ข้อมูลอ้างอิงชุดควบคุม Codex และดูโมเดลรันไทม์ได้ที่
ชุดควบคุม Codex
codexPlugins มีผลเฉพาะกับเซสชันที่เลือกชุดควบคุม Codex แบบเนทีฟ
ค่านี้ไม่เปิดใช้งาน Plugin Codex สำหรับการรันผู้ให้บริการของ OpenClaw การผูกการสนทนา
ACP หรือชุดควบคุมอื่นที่ไม่ใช่ Codex
{ plugins: { entries: { codex: { enabled: true, config: { codexPlugins: { enabled: true, allow_all_plugins: true, allow_destructive_actions: "auto", plugins: { "google-calendar": { enabled: true, marketplaceName: "openai-curated", pluginName: "google-calendar", allow_destructive_actions: false, }, }, }, }, }, }, },}plugins.entries.codex.config.codexPlugins.enabled: เปิดใช้งานการรองรับ Plugin/แอป Codex แบบเนทีฟสำหรับชุดควบคุม Codex ค่าเริ่มต้น:falseplugins.entries.codex.config.codexPlugins.allow_all_plugins: เปิดเผยทุกแอป ที่เข้าถึงได้ในขณะนั้นและเชื่อมต่อกับบัญชี Codex ที่ผ่านการตรวจสอบสิทธิ์แล้วใน เธรด Codex แบบเนทีฟใหม่แต่ละเธรด ค่าเริ่มต้น:falseplugins.entries.codex.config.codexPlugins.allow_destructive_actions: นโยบายเริ่มต้นสำหรับการดำเนินการที่ทำลายข้อมูลในการร้องขอข้อมูลจากแอป Plugin ที่กำหนดค่าไว้ ใช้trueเพื่อยอมรับสคีมาการอนุมัติ Codex ที่ปลอดภัยโดยไม่แสดงพรอมต์ ใช้falseเพื่อปฏิเสธ ใช้"auto"เพื่อส่งต่อการอนุมัติที่ Codex กำหนดให้ต้องมีผ่านการอนุมัติ Plugin ของ OpenClaw หรือใช้"ask"เพื่อแสดงพรอมต์สำหรับทุกการเขียน/การดำเนินการที่ทำลายข้อมูล ของ Plugin โดยไม่มีการอนุมัติแบบถาวร โหมด"ask"จะล้างการแทนที่การอนุมัติ ต่อเครื่องมือแบบถาวรของ Codex สำหรับแอปที่ได้รับผลกระทบ และเลือกผู้ตรวจสอบการอนุมัติที่เป็นมนุษย์ สำหรับแอปนั้นก่อนเริ่มเธรด Codex ค่าเริ่มต้น:trueplugins.entries.codex.config.codexPlugins.plugins.<key>.enabled: เปิดใช้งาน รายการ Plugin ที่กำหนดค่าไว้เมื่อcodexPlugins.enabledส่วนกลางเป็น true ด้วย ค่าเริ่มต้น:trueสำหรับรายการที่ระบุอย่างชัดเจนplugins.entries.codex.config.codexPlugins.plugins.<key>.marketplaceName: อัตลักษณ์มาร์เก็ตเพลสที่คงที่ ซึ่งต้องใช้ร่วมกับpluginNameสำหรับทุกรายการที่แก้ไขได้ รองรับ"openai-curated"และ"workspace-directory"รายการที่ ขาดฟิลด์อัตลักษณ์อย่างใดอย่างหนึ่งจะถูกละเว้นplugins.entries.codex.config.codexPlugins.plugins.<key>.pluginName: อัตลักษณ์ Plugin Codex ที่คงที่ ซึ่งต้องใช้ร่วมกับmarketplaceNameรายการworkspace-directoryต้องใช้summary.idที่มีการระบุมาร์เก็ตเพลสกำกับอย่างถูกต้อง ซึ่งส่งคืนโดยplugin/listเช่น"example-plugin@workspace-directory"plugins.entries.codex.config.codexPlugins.plugins.<key>.allow_destructive_actions: การแทนที่การดำเนินการที่ทำลายข้อมูลต่อ Plugin เมื่อละไว้ ระบบจะใช้ค่าallow_destructive_actionsส่วนกลาง ค่าต่อ Plugin รองรับนโยบายtrue,false,"auto"หรือ"ask"เช่นเดียวกัน
ทุกแอป Plugin ที่ได้รับอนุญาตและใช้ "ask" จะส่งต่อคำขออนุมัติของแอปนั้น
ไปยังผู้ตรวจสอบที่เป็นมนุษย์ แอปอื่นและการอนุมัติเธรดที่ไม่ใช่แอปจะยังคงใช้
ผู้ตรวจสอบที่กำหนดค่าไว้ ดังนั้นนโยบาย Plugin แบบผสมจะไม่สืบทอดพฤติกรรม
"ask"
codexPlugins.enabled เป็นคำสั่งเปิดใช้งานส่วนกลาง รายการ Plugin ที่ระบุอย่างชัดเจน
ซึ่งเขียนโดยการย้ายข้อมูลคือชุดสิทธิ์แบบถาวรสำหรับการติดตั้งที่คัดสรรและการซ่อมแซม
รายการ workspace-directory ที่กำหนดค่าด้วยตนเองต้องติดตั้งและเปิดใช้งานอยู่แล้ว
และแอปที่รายการเหล่านั้นเป็นเจ้าของต้องเข้าถึงได้ โดย OpenClaw
จะไม่ติดตั้งหรือตรวจสอบสิทธิ์ให้ หาก Codex ปฏิเสธคำขอแค็ตตาล็อกพื้นที่ทำงาน
ที่ระบุอย่างชัดเจน รายการพื้นที่ทำงานที่เปิดใช้งานจะปฏิเสธการทำงานอย่างปลอดภัยด้วย
marketplace_missing ขณะที่รายการที่คัดสรรจากแค็ตตาล็อกเริ่มต้นยังคง
พร้อมใช้งาน ไม่รองรับ plugins["*"] ไม่มีสวิตช์ install และ
ค่า marketplacePath ภายในเครื่องไม่ได้เป็นฟิลด์การกำหนดค่าโดยเจตนา เนื่องจาก
ขึ้นอยู่กับโฮสต์ ดูข้อกำหนดเวอร์ชันและความพร้อมของเซิร์ฟเวอร์แอปได้ที่
Plugin Codex แบบเนทีฟ
การตรวจสอบความพร้อมของ app/list จะถูกแคชไว้หนึ่งชั่วโมงและรีเฟรช
แบบอะซิงโครนัสเมื่อข้อมูลเก่า การกำหนดค่าแอปของเธรด Codex จะคำนวณเมื่อสร้าง
เซสชันชุดควบคุม Codex ไม่ใช่ในทุกเทิร์น หลังเปลี่ยนการกำหนดค่า Plugin แบบเนทีฟ ให้ใช้ /new, /reset หรือรีสตาร์ต Gateway
codexPlugins.allow_all_plugins จะบันทึกสแนปช็อตของทุกแอปในบัญชีที่เข้าถึงได้ในขณะนั้น
ลงในเธรด Codex แบบเนทีฟใหม่แต่ละเธรด ค่านี้ไม่ติดตั้ง Plugin หรือแอป และ
แอปที่เข้าถึงไม่ได้จะยังคงถูกยกเว้น แอปในบัญชีใช้นโยบายส่วนกลาง
codexPlugins.allow_destructive_actions รายการ Plugin ที่ระบุอย่างชัดเจนมี
ลำดับความสำคัญสูงกว่าเมื่อมีแอปเดียวกันอยู่ในทั้งสองเส้นทาง หากไม่สามารถอ่าน
app/list ได้ การเปิดเผยทั่วทั้งบัญชีจะปฏิเสธการทำงานอย่างปลอดภัย
plugins.entries.firecrawl.config.webFetch: การตั้งค่าผู้ให้บริการดึงข้อมูลเว็บ FirecrawlapiKey: คีย์ API ของ Firecrawl ที่ไม่บังคับสำหรับขีดจำกัดที่สูงขึ้น (รองรับ SecretRef) หากไม่มีจะใช้ตัวแปรสภาพแวดล้อมplugins.entries.firecrawl.config.webSearch.apiKeyหรือFIRECRAWL_API_KEYbaseUrl: URL ฐาน API ของ Firecrawl (ค่าเริ่มต้น:https://api.firecrawl.dev; การแทนที่แบบโฮสต์เองต้องชี้ไปยังปลายทางส่วนตัว/ภายใน)onlyMainContent: แยกเฉพาะเนื้อหาหลักจากหน้าเว็บ (ค่าเริ่มต้น:true)maxAgeMs: อายุสูงสุดของแคชในหน่วยมิลลิวินาที (ค่าเริ่มต้น:172800000/ 2 วัน)timeoutSeconds: ระยะหมดเวลาของคำขอสแครปในหน่วยวินาที (ค่าเริ่มต้น:60)
plugins.entries.xai.config.xSearch: การตั้งค่า xAI X Search (การค้นหาเว็บด้วย Grok)enabled: เปิดใช้งานผู้ให้บริการ X Searchmodel: โมเดล Grok ที่ใช้สำหรับการค้นหา (เช่น"grok-4.3")
plugins.entries.memory-core.config.dreaming: การตั้งค่า Dreaming ของหน่วยความจำ ดูระยะและเกณฑ์ได้ที่ Dreamingenabled: สวิตช์หลักของ Dreaming (ค่าเริ่มต้นfalse)frequency: รอบเวลา Cron สำหรับการกวาด Dreaming แบบเต็มแต่ละครั้ง (ค่าเริ่มต้นคือ"0 3 * * *")model: การแทนที่โมเดลเอเจนต์ย่อย Dream Diary ที่ไม่บังคับ ต้องใช้plugins.entries.memory-core.subagent.allowModelOverride: true; ใช้คู่กับallowedModelsเพื่อจำกัดเป้าหมาย ข้อผิดพลาดที่โมเดลไม่พร้อมใช้งานจะลองอีกครั้งหนึ่งครั้งด้วยโมเดลเริ่มต้นของเซสชัน ส่วนความล้มเหลวด้านความเชื่อถือหรือรายการอนุญาตจะไม่ย้อนกลับไปใช้ค่าอื่นโดยไม่แจ้ง- นโยบายและเกณฑ์ของแต่ละระยะเป็นรายละเอียดการนำไปใช้ (ไม่ใช่คีย์การกำหนดค่าที่ผู้ใช้มองเห็น)
- การกำหนดค่าหน่วยความจำทั้งหมดอยู่ใน ข้อมูลอ้างอิงการกำหนดค่าหน่วยความจำ:
agents.defaults.memorySearch.*memory.backendmemory.citationsmemory.qmd.*plugins.entries.memory-core.config.dreaming
- Plugin บันเดิล Claude ที่เปิดใช้งานยังสามารถเพิ่มค่าเริ่มต้น OpenClaw แบบฝังจาก
settings.jsonได้ โดย OpenClaw จะนำค่าเหล่านั้นไปใช้เป็นการตั้งค่าเอเจนต์ที่ผ่านการกรอง ไม่ใช่แพตช์การกำหนดค่า OpenClaw แบบดิบ plugins.slots.memory: เลือกรหัส Plugin หน่วยความจำที่ใช้งานอยู่ หรือใช้"none"เพื่อปิดใช้งาน Plugin หน่วยความจำplugins.slots.contextEngine: เลือกรหัส Plugin กลไกบริบทที่ใช้งานอยู่ ค่าเริ่มต้นคือ"legacy"เว้นแต่จะติดตั้งและเลือกกลไกอื่น
ดู Plugin
ข้อผูกพัน
commitments ควบคุมหน่วยความจำการติดตามผลที่อนุมาน: OpenClaw สามารถตรวจจับการกลับมาติดตามผลจากเทิร์นการสนทนาและส่งผ่านการรัน Heartbeat
commitments.enabled: เปิดใช้งานการสกัดข้อมูลด้วย LLM แบบซ่อน การจัดเก็บ และการส่งผ่าน Heartbeat สำหรับข้อผูกพันการติดตามผลที่อนุมาน ค่าเริ่มต้น:falsecommitments.maxPerDay: จำนวนสูงสุดของข้อผูกพันการติดตามผลที่อนุมานซึ่งส่งต่อได้ต่อเซสชันเอเจนต์ภายในช่วงเวลาหนึ่งวันแบบต่อเนื่อง ค่าเริ่มต้น:3
เบราว์เซอร์
{ browser: { enabled: true, evaluateEnabled: true, defaultProfile: "user", ssrfPolicy: { // dangerouslyAllowPrivateNetwork: true, // เลือกใช้เฉพาะสำหรับการเข้าถึงเครือข่ายส่วนตัวที่เชื่อถือได้ // allowPrivateNetwork: true, // ชื่อแทนเดิม // hostnameAllowlist: ["*.example.com", "example.com"], // allowedHostnames: ["localhost"], }, tabCleanup: { enabled: true, idleMinutes: 120, maxTabsPerSession: 8, sweepMinutes: 5, }, profiles: { openclaw: { cdpPort: 18800, color: "#FF4500" }, work: { cdpPort: 18801, color: "#0066CC", executablePath: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", }, user: { driver: "existing-session", attachOnly: true, color: "#00AA00" }, brave: { driver: "existing-session", attachOnly: true, userDataDir: "~/Library/Application Support/BraveSoftware/Brave-Browser", color: "#FB542B", }, remote: { cdpUrl: "http://10.0.0.42:9222", color: "#00AA00" }, }, color: "#FF4500", // headless: false, // noSandbox: false, // extraArgs: [], // executablePath: "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser", // attachOnly: false, },}evaluateEnabled: falseปิดใช้งานact:evaluateและwait --fntabCleanupควบคุมการล้างข้อมูลเป็นระยะอย่างสุดความสามารถสำหรับแท็บของเอเจนต์หลัก ที่ติดตาม หลังไม่มีการใช้งานหรือเมื่อเซสชันเกินขีดจำกัด การติดตามมีผลเฉพาะ กับแท็บที่สร้างโดยเครื่องมือเบราว์เซอร์action: "open"เท่านั้น ส่วนแท็บที่ผู้ใช้เปิดหรือ ไม่ทราบเจ้าของจะไม่ถูกรับมาอยู่ภายใต้การจัดการ การปิดใช้งานtabCleanupไม่ได้ปิดใช้งานการล้างข้อมูลวงจรชีวิตเซสชันที่สั่งอย่างชัดเจน- การเปิดภายในโฮสต์ด้วยเป้าหมาย CDP แบบเนทีฟและข้อมูลประจำตัวเบราว์เซอร์ที่คงที่
จะถูกจัดเก็บในสถานะ SQLite ที่ใช้ร่วมกัน และยังคงมีสิทธิ์ข้ามการรีสตาร์ต Gateway สำหรับ
/newและการล้างข้อมูลวงจรชีวิตเซสชัน เป้าหมาย CDP แบบเนทีฟที่เปิดให้เครื่องมือใช้งานยัง คงมีสิทธิ์รับการล้างเมื่อไม่มีการใช้งานและเมื่อเกินขีดจำกัดหลังรีสตาร์ต Chrome MCP ใช้ แฮนเดิลเป้าหมายภายในโปรเซส ดังนั้นระเบียนเซสชันที่มีอยู่แบบเริ่มต้นใหม่จะรอ การล้างข้อมูลตามวงจรชีวิต แทนที่จะเสี่ยงกวาดล้างเมื่อไม่มีการใช้งานโดยอิงกับกิจกรรมหลังรีสตาร์ต ที่ไม่สามารถระบุที่มาได้ OpenClaw จะตรวจสอบโปรไฟล์และอินสแตนซ์เบราว์เซอร์ ก่อนปิด การเชื่อมต่ออัตโนมัติของ Chrome MCP, ข้อมูลประจำตัวเบราว์เซอร์/json/versionที่หายไป และเป้าหมายแบบเนทีฟที่ยังแก้ไขไม่ได้จะยังคงอยู่ภายในโปรเซสทั้งหมด ดังนั้น จึงไม่ถูกปิดโดยอัตโนมัติหลังรีสตาร์ต แท็บเก่าที่ไม่ได้ติดตาม ต้องปิดด้วยตนเอง ความล้มเหลวชั่วคราวจะคงสถานะรอดำเนินการไว้เพื่อลองอีกครั้งภายหลัง ดู ความเป็นเจ้าของการล้างแท็บ ssrfPolicy.dangerouslyAllowPrivateNetworkจะถูกปิดใช้งานเมื่อไม่ได้กำหนดค่า ดังนั้นการนำทางของเบราว์เซอร์จึงยังคงเข้มงวดโดยค่าเริ่มต้น- กำหนด
ssrfPolicy.dangerouslyAllowPrivateNetwork: trueเฉพาะเมื่อคุณตั้งใจเชื่อถือการนำทางของเบราว์เซอร์ในเครือข่ายส่วนตัว - ในโหมดเข้มงวด ปลายทางโปรไฟล์ CDP ระยะไกล (
profiles.*.cdpUrl) จะอยู่ภายใต้การบล็อกเครือข่ายส่วนตัวแบบเดียวกันระหว่างการตรวจสอบการเข้าถึง/การค้นหา ssrfPolicy.allowPrivateNetworkยังคงรองรับในฐานะนามแฝงแบบเดิม- ในโหมดเข้มงวด ให้ใช้
ssrfPolicy.hostnameAllowlistและssrfPolicy.allowedHostnamesสำหรับข้อยกเว้นที่ระบุอย่างชัดเจน - โปรไฟล์ระยะไกลรองรับเฉพาะการเชื่อมต่อแนบ (ปิดใช้งานการเริ่ม/หยุด/รีเซ็ต)
profiles.*.cdpUrlยอมรับhttp://,https://,ws://และwss://ใช้ HTTP(S) เมื่อต้องการให้ OpenClaw ค้นหา/json/version; ใช้ WS(S) เมื่อผู้ให้บริการมอบ URL ของ DevTools WebSocket โดยตรง- หากเข้าถึงบริการ CDP ที่จัดการจากภายนอกผ่านลูปแบ็กได้ ให้กำหนด
attachOnly: trueของโปรไฟล์นั้น มิฉะนั้น OpenClaw จะถือว่าพอร์ตลูปแบ็กเป็น โปรไฟล์เบราว์เซอร์ภายในที่มีการจัดการ และอาจรายงานข้อผิดพลาดเกี่ยวกับความเป็นเจ้าของพอร์ตภายใน - โปรไฟล์
existing-sessionใช้ Chrome MCP แทน CDP และสามารถเชื่อมต่อแนบ บนโฮสต์ที่เลือกหรือผ่าน Node เบราว์เซอร์ที่เชื่อมต่ออยู่ - โปรไฟล์
existing-sessionสามารถกำหนดuserDataDirเพื่อเลือกโปรไฟล์ เบราว์เซอร์ที่ใช้ Chromium โดยเฉพาะ เช่น Brave หรือ Edge - โปรไฟล์
existing-sessionสามารถกำหนดcdpUrlเมื่อ Chrome ทำงานอยู่แล้ว หลังปลายทางค้นหา DevTools แบบ HTTP(S) หรือปลายทาง WS(S) โดยตรง ใน โหมดดังกล่าว OpenClaw จะส่งปลายทางให้ Chrome MCP แทนการใช้การเชื่อมต่ออัตโนมัติ และจะไม่ใช้userDataDirเป็นอาร์กิวเมนต์เปิด Chrome MCP - โปรไฟล์
existing-sessionยังคงใช้ข้อจำกัดเส้นทาง Chrome MCP ปัจจุบัน: การดำเนินการที่ขับเคลื่อนด้วยสแนปช็อต/การอ้างอิงแทนการกำหนดเป้าหมายด้วยตัวเลือก CSS, ฮุกอัปโหลด ไฟล์เดียว, ไม่มีการแทนที่ระยะหมดเวลาของกล่องโต้ตอบ, ไม่มีwait --load networkidleและไม่มีresponsebody, การส่งออก PDF, การดักจับการดาวน์โหลด หรือการดำเนินการแบบกลุ่ม - โปรไฟล์
openclawภายในที่มีการจัดการจะกำหนดcdpPortและcdpUrlโดยอัตโนมัติ ให้กำหนดcdpUrlอย่างชัดเจนเฉพาะสำหรับโปรไฟล์ CDP ระยะไกลหรือการเชื่อมต่อแนบกับปลายทาง ของเซสชันที่มีอยู่ - โปรไฟล์ภายในที่มีการจัดการสามารถกำหนด
executablePathเพื่อแทนที่ค่าbrowser.executablePathส่วนกลางสำหรับโปรไฟล์นั้น ใช้ตัวเลือกนี้เพื่อเรียกใช้โปรไฟล์หนึ่งใน Chrome และอีกโปรไฟล์หนึ่งใน Brave - ลำดับการตรวจหาอัตโนมัติ: เบราว์เซอร์เริ่มต้นหากใช้ Chromium → Chrome → Brave → Edge → Chromium → Chrome Canary
- ทั้ง
browser.executablePathและbrowser.profiles.<name>.executablePathยอมรับ~และ~/...สำหรับไดเรกทอรีหลักของระบบปฏิบัติการก่อนเปิด Chromium นอกจากนี้userDataDirรายโปรไฟล์บนโปรไฟล์existing-sessionจะถูกขยายเครื่องหมายทิลดาด้วย - บริการควบคุม: ลูปแบ็กเท่านั้น (พอร์ตได้มาจาก
gateway.port, ค่าเริ่มต้น18791) extraArgsเพิ่มแฟล็กการเปิดเพิ่มเติมในการเริ่มต้น Chromium ภายใน (ตัวอย่างเช่น--disable-gpu, การกำหนดขนาดหน้าต่าง หรือแฟล็กดีบัก)
UI
{ ui: { seamColor: "#FF4500", assistant: { name: "OpenClaw", avatar: "CB", // อีโมจิ ข้อความสั้น URL รูปภาพ หรือ data URI }, prefs: { theme: "claw", // claw | knot | dash | custom themeMode: "system", // light | dark | system textScale: 100, // 90 | 100 | 110 | 125 | 140 locale: "en", chatShowThinking: true, chatShowToolCalls: true, chatPersistCommentary: true, // เก็บคำบรรยายหลังการทำงานใน Control UI แต่ไม่ส่งไปยังช่องทาง chatSendShortcut: "enter", // enter | modifier-enter chatFollowUpMode: "steer", // steer | queue; ละไว้เพื่อใช้โหมดคิวของเซิร์ฟเวอร์ }, },}seamColor: สีเน้นสำหรับองค์ประกอบ UI ของแอปแบบเนทีฟ (สีฟอง Talk Mode เป็นต้น)assistant: การแทนที่ข้อมูลประจำตัวใน Control UI หากไม่มีจะใช้ข้อมูลประจำตัวของเอเจนต์ที่ทำงานอยู่prefs: การกำหนดค่าการแสดงผลของผู้ดำเนินการ นี่คือตำแหน่งหลักที่เป็นมาตรฐาน เพื่อให้เอเจนต์สามารถ เปลี่ยนค่าเหล่านี้ผ่านด่านการอนุมัติ และทำให้ไคลเอนต์ Control UI ทุกตัว ซิงค์ตรงกัน เบราว์เซอร์จะจำลองค่าไปยังที่จัดเก็บภายในเพื่อให้เริ่มทำงานได้ทันที และเก็บ สำเนาเฉพาะอุปกรณ์ไว้เมื่อไม่สามารถเขียนการกำหนดค่าได้ (ขอบเขตผู้ดู, ออฟไลน์)chatPersistCommentaryมีค่าเริ่มต้นเป็นtrueการกำหนดเป็นfalseจะทำให้ คำบรรยายสดยังคงมองเห็นได้ระหว่างการทำงาน แต่จะลบออกเมื่อเสร็จสิ้น และป้องกันไม่ให้ คำบรรยายใหม่ของ Codex เข้าสู่สำเนาทรานสคริปต์ถาวร การส่งไปยังช่องทางรับส่งข้อความ ยังคงแยกจากกันและไม่เปลี่ยนแปลง ไคลเอนต์ที่เชื่อมต่อจะนำการเปลี่ยนแปลงฝั่งเซิร์ฟเวอร์ไปใช้แบบสด: Gateway จะเผยแพร่ เหตุการณ์config.changedที่มีเฉพาะแฮชหลังการเขียนการกำหนดค่าถาวรทุกครั้ง และ ไคลเอนต์จะรีเฟรชสแนปช็อตของตน (ข้ามขั้นตอนนี้เมื่อฉบับร่างการตั้งค่าภายในมี การแก้ไขที่ยังไม่ได้บันทึก) ไคลเอนต์ที่เชื่อมต่อใหม่จะปรับสถานะให้ตรงกันเมื่อเชื่อมต่อ
Gateway
{ gateway: { mode: "local", // local | remote port: 18789, bind: "loopback", auth: { mode: "token", // none | token | password | trusted-proxy token: "your-token", // password: "your-password", // หรือ OPENCLAW_GATEWAY_PASSWORD // trustedProxy: { userHeader: "x-forwarded-user" }, // สำหรับ mode=trusted-proxy; ดู /gateway/trusted-proxy-auth allowTailscale: true, rateLimit: { maxAttempts: 10, windowMs: 60000, lockoutMs: 300000, exemptLoopback: true, }, }, tailscale: { mode: "off", // off | serve | funnel resetOnExit: false, }, controlUi: { enabled: true, basePath: "/openclaw", // root: "dist/control-ui", // toolTitles: false, // เลือกใช้ชื่อวัตถุประสงค์ที่ AI สร้างสำหรับการเรียกเครื่องมือ (ใช้โทเค็นของโมเดลอรรถประโยชน์) // embedSandbox: "scripts", // strict | scripts | trusted // allowExternalEmbedUrls: false, // อันตราย: อนุญาต URL ฝังภายนอกแบบ http(s) ที่เป็น URL สัมบูรณ์ // chatMessageMaxWidth: "min(1280px, 82%)", // ความกว้างสูงสุดของทรานสคริปต์แชตที่จัดกึ่งกลางซึ่งกำหนดหรือไม่ก็ได้ // allowedOrigins: ["https://control.example.com"], // จำเป็นสำหรับ Control UI ที่ไม่ใช่ลูปแบ็ก // dangerouslyAllowHostHeaderOriginFallback: false, // โหมดสำรองต้นทางจากส่วนหัว Host ที่เป็นอันตราย // allowInsecureAuth: false, // dangerouslyDisableDeviceAuth: false, }, terminal: { enabled: false, // shell: "/bin/zsh", }, remote: { url: "ws://127.0.0.1:18789", transport: "ssh", // ssh | direct token: "your-token", // password: "your-password", }, trustedProxies: ["10.0.0.1"], // ไม่บังคับ ค่าเริ่มต้นคือ false allowRealIpFallback: false, nodes: { pairing: { // ไม่บังคับ ค่าเริ่มต้นคือไม่ได้กำหนด/ปิดใช้งาน autoApproveCidrs: ["192.168.1.0/24", "fd00:1234:5678::/64"], // การอนุมัติอัตโนมัติที่ตรวจสอบด้วย SSH ค่าเริ่มต้น: เปิดใช้งาน (true) // กำหนดเป็น false เพื่อปิดใช้งานเฉพาะการตรวจสอบ SSH ซึ่งไม่ส่งผลต่อ // autoApproveCidrs ด้านบน สำหรับการจับคู่ Node ด้วยตนเองเท่านั้น ให้กำหนดเป็น false และ // ไม่กำหนด autoApproveCidrs ส่งออบเจ็กต์เพื่อปรับแต่ง: { user, identity, // timeoutMs, cidrs } sshVerify: true, }, allowCommands: ["canvas.navigate"], denyCommands: ["system.run"], }, tools: { // การปฏิเสธ HTTP เพิ่มเติมสำหรับ /tools/invoke deny: ["browser"], // นำเครื่องมือออกจากรายการปฏิเสธ HTTP เริ่มต้นสำหรับผู้เรียกที่เป็นเจ้าของ/ผู้ดูแลระบบ allow: ["gateway"], }, push: { apns: { relay: { baseUrl: "https://relay.example.com", timeoutMs: 10000, }, }, }, },}รายละเอียดฟิลด์ของ Gateway
mode:local(เรียกใช้ Gateway) หรือremote(เชื่อมต่อกับ Gateway ระยะไกล) Gateway จะปฏิเสธการเริ่มทำงาน เว้นแต่localport: พอร์ตมัลติเพล็กซ์เดียวสำหรับ WS + HTTP ลำดับความสำคัญ:--port>OPENCLAW_GATEWAY_PORT>gateway.port>18789bind:auto,loopback(ค่าเริ่มต้น),lan(0.0.0.0),tailnet(IPv4 ของ Tailscale เมื่อพร้อมใช้งาน มิฉะนั้นใช้ลูปแบ็ก) หรือcustom(ที่อยู่ IPv4 หนึ่งรายการ) ที่อยู่tailnetที่ผ่านการแปลงค่าแล้วและที่อยู่customใดๆ ที่ไม่ใช่127.0.0.1หรือ0.0.0.0ต้องใช้127.0.0.1บนพอร์ตเดียวกันสำหรับไคลเอนต์บนโฮสต์เดียวกัน การเริ่มทำงานจะล้มเหลวหาก Listener ใด Listener หนึ่งไม่สามารถผูกได้ การเปิดรับการเชื่อมต่อที่ไม่ใช่ลูปแบ็กยังคงจำกัดอยู่ที่อินเทอร์เฟซที่เลือก- นามแฝงการผูกแบบเดิม: ใช้ค่าของโหมดการผูกใน
gateway.bind(auto,loopback,lan,tailnet,custom) ไม่ใช่นามแฝงโฮสต์ (0.0.0.0,127.0.0.1,localhost,::,::1) - หมายเหตุเกี่ยวกับ Docker: การผูก
loopbackเริ่มต้นจะรับฟังที่127.0.0.1ภายในคอนเทนเนอร์ เมื่อใช้เครือข่ายบริดจ์ของ Docker (-p 18789:18789) การรับส่งข้อมูลจะเข้ามาทางeth0ทำให้ไม่สามารถเข้าถึง Gateway ได้ ให้ใช้--network hostหรือตั้งค่าbind: "lan"(หรือbind: "custom"ร่วมกับcustomBindHost: "0.0.0.0") เพื่อรับฟังบนอินเทอร์เฟซทั้งหมด - การตรวจสอบสิทธิ์: จำเป็นโดยค่าเริ่มต้น การผูกที่ไม่ใช่ลูปแบ็กต้องใช้การตรวจสอบสิทธิ์ของ Gateway ในทางปฏิบัติหมายถึงโทเค็น/รหัสผ่านที่ใช้ร่วมกัน หรือพร็อกซีย้อนกลับที่รับรู้ข้อมูลประจำตัวร่วมกับ
gateway.auth.mode: "trusted-proxy"ตัวช่วยสร้างการเริ่มต้นใช้งานจะสร้างโทเค็นให้โดยค่าเริ่มต้น - หากกำหนดค่าทั้ง
gateway.auth.tokenและgateway.auth.password(รวมถึง SecretRefs) ให้ตั้งค่าgateway.auth.modeเป็นtokenหรือpasswordอย่างชัดเจน ขั้นตอนการเริ่มทำงานและการติดตั้ง/ซ่อมแซมบริการจะล้มเหลวเมื่อกำหนดค่าทั้งสองรายการแต่ไม่ได้ตั้งค่าโหมด gateway.auth.mode: "none": โหมดไม่ใช้การตรวจสอบสิทธิ์แบบชัดเจน ใช้เฉพาะการตั้งค่าลูปแบ็กภายในที่เชื่อถือได้เท่านั้น โดยเจตนาแล้วจะไม่มีตัวเลือกนี้ในพรอมต์การเริ่มต้นใช้งานgateway.auth.mode: "trusted-proxy": มอบหมายการตรวจสอบสิทธิ์ของเบราว์เซอร์/ผู้ใช้ให้พร็อกซีย้อนกลับที่รับรู้ข้อมูลประจำตัว และเชื่อถือส่วนหัวข้อมูลประจำตัวจากgateway.trustedProxies(ดู การตรวจสอบสิทธิ์ผ่านพร็อกซีที่เชื่อถือได้) โดยค่าเริ่มต้น โหมดนี้คาดหวังแหล่งที่มาของพร็อกซีที่ ไม่ใช่ลูปแบ็ก พร็อกซีย้อนกลับแบบลูปแบ็กบนโฮสต์เดียวกันต้องใช้gateway.auth.trustedProxy.allowLoopback = trueอย่างชัดเจน ผู้เรียกภายในบนโฮสต์เดียวกันสามารถใช้gateway.auth.passwordเป็นทางเลือกสำรองสำหรับการเชื่อมต่อภายในโดยตรงได้ ส่วนgateway.auth.tokenยังคงไม่สามารถใช้ร่วมกับโหมดพร็อกซีที่เชื่อถือได้gateway.auth.allowTailscale: เมื่อtrueส่วนหัวข้อมูลประจำตัวของ Tailscale Serve สามารถใช้ผ่านการตรวจสอบสิทธิ์ของ Control UI/WebSocket ได้ (ตรวจสอบผ่านtailscale whois) จุดเชื่อมต่อ HTTP API ไม่ ใช้การตรวจสอบสิทธิ์ด้วยส่วนหัว Tailscale นี้ แต่จะใช้โหมดการตรวจสอบสิทธิ์ HTTP ตามปกติของ Gateway แทน ขั้นตอนที่ไม่ใช้โทเค็นนี้ถือว่าโฮสต์ Gateway เชื่อถือได้ ค่าเริ่มต้นคือtrueเมื่อtailscale.mode = "serve"gateway.auth.rateLimit: ตัวจำกัดความพยายามตรวจสอบสิทธิ์ที่ล้มเหลวซึ่งเลือกใช้ได้ มีผลแยกตาม IP ของไคลเอนต์และขอบเขตการตรวจสอบสิทธิ์ (ติดตามความลับที่ใช้ร่วมกันและโทเค็นอุปกรณ์แยกจากกัน) ความพยายามที่ถูกบล็อกจะส่งคืน429+Retry-After- บนเส้นทาง Control UI แบบอะซิงโครนัสของ Tailscale Serve ความพยายามที่ล้มเหลวสำหรับ
{scope, clientIp}เดียวกันจะถูกจัดลำดับก่อนเขียนข้อมูลความล้มเหลว ดังนั้นความพยายามที่ไม่ถูกต้องพร้อมกันจากไคลเอนต์เดียวกันอาจทำให้คำขอที่สองเรียกใช้ตัวจำกัด แทนที่ทั้งสองคำขอจะแข่งขันผ่านไปโดยเป็นเพียงการไม่ตรงกัน gateway.auth.rateLimit.exemptLoopbackมีค่าเริ่มต้นเป็นtrue; ตั้งค่าfalseเมื่อต้องการจำกัดอัตราการรับส่งข้อมูลของ localhost ด้วยโดยเจตนา (สำหรับการตั้งค่าการทดสอบหรือการใช้งานพร็อกซีที่เข้มงวด)- ความพยายามตรวจสอบสิทธิ์ WS ที่มีต้นทางจากเบราว์เซอร์จะถูกจำกัดอัตราเสมอโดยปิดการยกเว้นลูปแบ็ก (เป็นการป้องกันหลายชั้นจากการโจมตีแบบลองรหัสผ่าน localhost ผ่านเบราว์เซอร์)
- บนลูปแบ็ก การล็อกดังกล่าวที่มีต้นทางจากเบราว์เซอร์จะแยกตามค่า
Originที่ปรับให้อยู่ในรูปแบบมาตรฐานแล้ว ดังนั้นความล้มเหลวซ้ำจากต้นทาง localhost หนึ่งจะไม่ ล็อกต้นทางอื่นโดยอัตโนมัติ tailscale.mode:serve(เฉพาะ tailnet, ผูกแบบลูปแบ็ก) หรือfunnel(สาธารณะ, ต้องใช้การตรวจสอบสิทธิ์)tailscale.serviceName: ชื่อบริการ Tailscale ที่เลือกกำหนดได้สำหรับโหมด Serve เช่นsvc:openclawเมื่อตั้งค่าแล้ว OpenClaw จะส่งค่านี้ให้tailscale serve --serviceเพื่อให้เปิด Control UI ผ่าน Service ที่มีชื่อได้ แทนชื่อโฮสต์ของอุปกรณ์ ค่าต้องใช้รูปแบบชื่อ Servicesvc:<dns-label>ของ Tailscale และเมื่อเริ่มทำงาน ระบบจะรายงาน URL ของ Service ที่ได้tailscale.preserveFunnel: เมื่อtrueและtailscale.mode = "serve"OpenClaw จะตรวจสอบtailscale funnel statusก่อนใช้ Serve ซ้ำเมื่อเริ่มทำงาน และจะข้าม หากเส้นทาง Funnel ที่กำหนดค่าจากภายนอกครอบคลุมพอร์ตของ Gateway อยู่แล้ว ค่าเริ่มต้นคือfalsecontrolUi.allowedOrigins: รายการอนุญาตต้นทางเบราว์เซอร์แบบชัดเจนสำหรับการเชื่อมต่อ WebSocket ของ Gateway จำเป็นสำหรับต้นทางเบราว์เซอร์สาธารณะที่ไม่ใช่ลูปแบ็ก การโหลด UI ส่วนตัวจากต้นทางเดียวกันบน LAN/Tailnet ผ่านลูปแบ็ก, RFC1918/link-local,.local,.ts.netหรือโฮสต์ CGNAT ของ Tailscale จะได้รับการยอมรับโดยไม่ต้องเปิดใช้ทางเลือกสำรองด้วยส่วนหัว HostcontrolUi.toolTitles: เลือกใช้ชื่อวัตถุประสงค์ที่ AI สร้างขึ้นสำหรับการเรียกใช้เครื่องมือในแชต Control UI ค่าเริ่มต้น:false(การแสดงผลเครื่องมือยังคงกำหนดผลได้อย่างสมบูรณ์โดยไม่มีการเรียกโมเดลเบื้องหลัง) เมื่อเปิดใช้ เมธอดchat.toolTitlesจะติดป้ายกำกับการเรียกที่ซับซ้อนผ่านการกำหนดเส้นทางโมเดลอรรถประโยชน์มาตรฐาน ได้แก่utilityModelของเอเจนต์ (การตัดสินใจของผู้ดำเนินการซึ่งอาจส่งอาร์กิวเมนต์เครื่องมือในขอบเขตจำกัดไปยังผู้ให้บริการที่เลือก เช่นเดียวกับงานอรรถประโยชน์ทุกงาน) หรือค่าเริ่มต้นของโมเดลขนาดเล็กที่ผู้ให้บริการของเซสชันประกาศไว้ (OpenAI →gpt-5.6-luna, Anthropic →claude-haiku-4-5) และแคชผลลัพธ์ไว้ในฐานข้อมูลสถานะต่อเอเจนต์ เพื่อไม่ให้การดูซ้ำถูกเรียกเก็บเงินอีกutilityModel: \"\"จะปิดใช้ชื่อเช่นเดียวกับงานอรรถประโยชน์อื่นๆ ทั้งหมด และชื่อจะไม่เปลี่ยนไปใช้โมเดลหลักเป็นทางเลือกสำรองcontrolUi.chatMessageMaxWidth: ความกว้างสูงสุดที่เลือกกำหนดได้สำหรับทรานสคริปต์แชต Control UI ที่จัดกึ่งกลาง รองรับค่าความกว้าง CSS ที่มีข้อจำกัด เช่น960px,82%,min(1280px, 82%)และcalc(100% - 2rem)controlUi.dangerouslyAllowHostHeaderOriginFallback: โหมดอันตรายที่เปิดใช้ทางเลือกสำรองด้านต้นทางด้วยส่วนหัว Host สำหรับการใช้งานที่ตั้งใจพึ่งพานโยบายต้นทางจากส่วนหัว Hostterminal.enabled: เลือกใช้เทอร์มินัลของผู้ดำเนินการที่มีขอบเขตผู้ดูแลระบบ ค่าเริ่มต้น:falseเทอร์มินัลจะเริ่ม PTY ของโฮสต์ในพื้นที่ทำงานของเอเจนต์ที่เลือก รับค่าสภาพแวดล้อมของกระบวนการ Gateway และจะถูกปฏิเสธสำหรับเอเจนต์ที่มีsandbox.mode: "all"เปิดใช้เฉพาะในการใช้งานโดยผู้ดำเนินการที่เชื่อถือได้เท่านั้น การเปลี่ยนค่านี้จะเริ่ม Gateway ใหม่และอัปเดตนโยบายความปลอดภัยของเนื้อหาใน Control UIterminal.shell: โปรแกรมเชลล์ที่เลือกกำหนดได้ เมื่อไม่ได้ตั้งค่า OpenClaw จะใช้$SHELLบน Unix และ%ComSpec%บน Windowsterminal.detachedSessionTimeoutSeconds: ระยะเวลาที่เซสชันเทอร์มินัลจะยังคงทำงานหลังจากการเชื่อมต่อขาดหาย (โหลดหน้าใหม่, แล็ปท็อปเข้าสู่โหมดสลีป) โดยยังสามารถเชื่อมต่อกลับผ่านterminal.attachและเล่นเอาต์พุตล่าสุดซ้ำได้ ค่าเริ่มต้น:300ตั้งค่า0เพื่อยุติเซสชันทันทีที่การเชื่อมต่อขาดหาย เซสชันที่ยกเลิกการเชื่อมต่อจะยังคงเรียกใช้คำสั่งต่อไป ดังนั้นควรลดระยะเวลานี้บนโฮสต์ที่ใช้ร่วมกันหรือเปิดรับจากภายนอกremote.transport:ssh(ค่าเริ่มต้น) หรือdirect(ws/wss) สำหรับdirectนั้นremote.urlต้องเป็นwss://สำหรับโฮสต์สาธารณะ ส่วนws://แบบข้อความธรรมดาจะได้รับการยอมรับเฉพาะสำหรับลูปแบ็ก, LAN, link-local,.local,.ts.netและโฮสต์ CGNAT ของ Tailscaleremote.remotePort: พอร์ต Gateway บนโฮสต์ SSH ระยะไกล ค่าเริ่มต้นคือ18789; ใช้ค่านี้เมื่อพอร์ตทันเนลภายในแตกต่างจากพอร์ต Gateway ระยะไกลremote.sshHostKeyPolicy: นโยบายคีย์โฮสต์ของทันเนล SSH บน macOSstrictเป็นค่าเริ่มต้นและต้องใช้คีย์ที่เชื่อถืออยู่แล้วopensshเป็นการเลือกใช้การกำหนดค่า OpenSSH ที่มีผลจริงสำหรับนามแฝงที่มีการจัดการอย่างชัดเจน โปรดตรวจสอบการตั้งค่า SSH ของผู้ใช้และระบบที่ตรงกันก่อนใช้งาน แอป macOS และconfigure-remoteจะรีเซ็ตนโยบายนี้เป็นstrictเมื่อเปลี่ยนเป้าหมาย เว้นแต่จะเลือกใช้อีกครั้งอย่างชัดเจนgateway.remote.token/.passwordเป็นฟิลด์ข้อมูลประจำตัวของไคลเอนต์ระยะไกล ฟิลด์เหล่านี้ไม่ได้กำหนดค่าการตรวจสอบสิทธิ์ของ Gateway ด้วยตัวเองgateway.push.apns.relay.baseUrl: URL ฐานแบบ HTTPS สำหรับรีเลย์ APNs ภายนอกที่ใช้หลังจากบิลด์ iOS ที่รองรับรีเลย์เผยแพร่การลงทะเบียนไปยัง Gateway บิลด์ App Store สาธารณะใช้รีเลย์ที่ OpenClaw ให้บริการ URL รีเลย์แบบกำหนดเองต้องตรงกับเส้นทางบิลด์/การใช้งาน iOS ที่แยกต่างหากโดยเจตนา ซึ่ง URL รีเลย์ชี้ไปยังรีเลย์นั้นgateway.push.apns.relay.timeoutMs: ระยะหมดเวลาการส่งจาก Gateway ไปยังรีเลย์ หน่วยเป็นมิลลิวินาที ค่าเริ่มต้นคือ10000- การลงทะเบียนที่รองรับรีเลย์จะถูกมอบหมายให้ข้อมูลประจำตัวของ Gateway รายการหนึ่งโดยเฉพาะ แอป iOS ที่จับคู่จะดึง
gateway.identity.getรวมข้อมูลประจำตัวนั้นไว้ในการลงทะเบียนรีเลย์ และส่งต่อสิทธิ์การส่งที่มีขอบเขตเฉพาะการลงทะเบียนให้ Gateway Gateway อื่นไม่สามารถนำการลงทะเบียนที่จัดเก็บไว้นั้นมาใช้ซ้ำได้ OPENCLAW_APNS_RELAY_BASE_URL/OPENCLAW_APNS_RELAY_TIMEOUT_MS: ค่าทดแทนผ่านตัวแปรสภาพแวดล้อมชั่วคราวสำหรับการกำหนดค่ารีเลย์ข้างต้นOPENCLAW_APNS_RELAY_ALLOW_HTTP=true: ช่องทางหลีกเลี่ยงสำหรับ URL รีเลย์ HTTP แบบลูปแบ็กที่ใช้ในการพัฒนาเท่านั้น URL รีเลย์สำหรับการใช้งานจริงควรใช้ HTTPS ต่อไปOPENCLAW_HANDSHAKE_TIMEOUT_MS: ค่าทดแทนผ่านตัวแปรสภาพแวดล้อมที่เลือกกำหนดได้สำหรับระยะหมดเวลาการแฮนด์เชก WebSocket ของ Gateway ก่อนการตรวจสอบสิทธิ์ในตัวchannels.<provider>.healthMonitor.enabled: การยกเลิกใช้การเริ่มทำงานใหม่โดยตัวตรวจสอบสถานภาพแยกตามช่องทาง โดยยังคงเปิดใช้ตัวตรวจสอบส่วนกลางchannels.<provider>.accounts.<accountId>.healthMonitor.enabled: ค่าทดแทนแยกตามบัญชีสำหรับช่องทางหลายบัญชี เมื่อตั้งค่าแล้ว ค่านี้จะมีลำดับความสำคัญเหนือค่าทดแทนระดับช่องทาง- เส้นทางการเรียก Gateway ภายในสามารถใช้
gateway.remote.*เป็นทางเลือกสำรองได้เฉพาะเมื่อไม่ได้ตั้งค่าgateway.auth.* - หากกำหนดค่า
gateway.auth.token/gateway.auth.passwordอย่างชัดเจนผ่าน SecretRef และไม่สามารถแปลงค่าได้ การแปลงค่าจะล้มเหลวแบบปิดกั้น (ไม่มีทางเลือกสำรองระยะไกลมาปกปิด) trustedProxies: IP ของพร็อกซีย้อนกลับที่ยุติ TLS หรือแทรกส่วนหัวไคลเอนต์ที่ส่งต่อ ระบุเฉพาะพร็อกซีที่ควบคุมเท่านั้น รายการลูปแบ็กยังคงใช้ได้สำหรับการตั้งค่าพร็อกซี/การตรวจจับภายในบนโฮสต์เดียวกัน (เช่น Tailscale Serve หรือพร็อกซีย้อนกลับภายใน) แต่รายการเหล่านี้ ไม่ ทำให้คำขอลูปแบ็กมีสิทธิ์ใช้gateway.auth.mode: "trusted-proxy"allowRealIpFallback: เมื่อtrueGateway จะยอมรับX-Real-IPหากไม่มีX-Forwarded-Forค่าเริ่มต้นคือfalseเพื่อให้ทำงานแบบปิดกั้นเมื่อเกิดความล้มเหลวgateway.nodes.pairing.autoApproveCidrs: รายการอนุญาต CIDR/IP ที่เลือกกำหนดได้สำหรับการอนุมัติการจับคู่อุปกรณ์ Node ครั้งแรกโดยอัตโนมัติเมื่อไม่มีการร้องขอขอบเขต จะปิดใช้งานเมื่อไม่ได้ตั้งค่า การตั้งค่านี้จะไม่อนุมัติการจับคู่ของผู้ดำเนินการ/เบราว์เซอร์/Control UI/WebChat โดยอัตโนมัติ และจะไม่อนุมัติการอัปเกรดบทบาท ขอบเขต ข้อมูลเมตา หรือคีย์สาธารณะโดยอัตโนมัติgateway.nodes.pairing.sshVerify: การอนุมัติอัตโนมัติที่ตรวจสอบผ่าน SSH สำหรับการจับคู่อุปกรณ์ Node ครั้งแรก (ค่าเริ่มต้น: เปิดใช้) Gateway จะเชื่อมต่อ SSH กลับไปยังโฮสต์ที่จับคู่ (BatchMode, คีย์โฮสต์แบบเข้มงวด) และอนุมัติเฉพาะเมื่อคีย์อุปกรณ์openclaw node identityตรงกันทุกประการ เกณฑ์สิทธิ์ขั้นต่ำเหมือนกับautoApproveCidrs; การตรวจสอบจำกัดเฉพาะที่อยู่ต้นทางส่วนตัว/CGNAT เว้นแต่cidrsจะเขียนทับ ตั้งค่าfalseเพื่อปิดใช้ หรือ{ user, identity, timeoutMs, cidrs }เพื่อปรับแต่ง ดู การจับคู่ Nodegateway.nodes.allowCommands/gateway.nodes.denyCommands: การกำหนด allow/deny ส่วนกลางสำหรับคำสั่ง Node ที่ประกาศไว้ หลังจากประเมินการจับคู่และรายการอนุญาตของแพลตฟอร์มแล้ว ใช้allowCommandsเพื่อเลือกเปิดใช้คำสั่ง Node ที่เป็นอันตราย เช่นcamera.snap,camera.clip,screen.record,health.summary,sms.searchและsms.send;denyCommandsจะนำคำสั่งออก แม้ว่าค่าเริ่มต้นของแพลตฟอร์มหรือการอนุญาตอย่างชัดแจ้งจะรวมคำสั่งนั้นไว้ก็ตาม สิทธิ์ Health ของ iOS, สิทธิ์ SMS ของ Android และการให้สิทธิ์คำสั่งของ Gateway เป็นอิสระจากกัน หลังจาก Node เปลี่ยนรายการคำสั่งที่ประกาศไว้ ให้ปฏิเสธและอนุมัติการจับคู่ของอุปกรณ์นั้นใหม่ เพื่อให้ Gateway จัดเก็บสแนปช็อตคำสั่งที่อัปเดตแล้วgateway.tools.deny: ชื่อเครื่องมือเพิ่มเติมที่ถูกบล็อกสำหรับ HTTPPOST /tools/invoke(ขยายรายการปฏิเสธเริ่มต้น)gateway.tools.allow: นำชื่อเครื่องมือออกจากรายการปฏิเสธ HTTP เริ่มต้นสำหรับ ผู้เรียกที่เป็นเจ้าของ/ผู้ดูแลระบบ การดำเนินการนี้ไม่ได้ยกระดับผู้เรียกoperator.writeที่มีข้อมูลระบุตัวตนให้เข้าถึงในฐานะเจ้าของ/ผู้ดูแลระบบได้;cron,gatewayและnodesยังคง ไม่พร้อมใช้งานสำหรับผู้เรียกที่ไม่ใช่เจ้าของ แม้จะอยู่ในรายการอนุญาตก็ตาม
ปลายทางที่เข้ากันได้กับ OpenAI
- Admin HTTP RPC: ปิดไว้โดยค่าเริ่มต้นในฐานะ Plugin
admin-http-rpcเปิดใช้งาน Plugin เพื่อลงทะเบียนPOST /api/v1/admin/rpcดู Admin HTTP RPC - Chat Completions: ปิดใช้งานไว้โดยค่าเริ่มต้น เปิดใช้งานด้วย
gateway.http.endpoints.chatCompletions.enabled: true - Responses API:
gateway.http.endpoints.responses.enabled - การเพิ่มความแข็งแกร่งให้ข้อมูลป้อนเข้าแบบ URL ของ Responses:
gateway.http.endpoints.responses.maxUrlPartsgateway.http.endpoints.responses.files.urlAllowlistgateway.http.endpoints.responses.images.urlAllowlistรายการอนุญาตที่ว่างจะถือว่าไม่ได้ตั้งค่าไว้ ให้ใช้gateway.http.endpoints.responses.files.allowUrl=falseและ/หรือgateway.http.endpoints.responses.images.allowUrl=falseเพื่อปิดใช้งานการดึงข้อมูลจาก URL
- เฮดเดอร์เสริมสำหรับเพิ่มความแข็งแกร่งให้การตอบกลับ:
gateway.http.securityHeaders.strictTransportSecurity(ตั้งค่าเฉพาะสำหรับต้นทาง HTTPS ที่คุณควบคุม โปรดดู การยืนยันตัวตนผ่านพร็อกซีที่เชื่อถือได้)
การแยกหลายอินสแตนซ์
เรียกใช้ Gateway หลายตัวบนโฮสต์เดียวโดยใช้พอร์ตและไดเรกทอรีสถานะที่ไม่ซ้ำกัน:
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \OPENCLAW_STATE_DIR=~/.openclaw-a \openclaw gateway --port 19001แฟล็กอำนวยความสะดวก: --dev (ใช้ ~/.openclaw-dev + พอร์ต 19001), --profile <name> (ใช้ ~/.openclaw-<name>)
gateway.tls
{ gateway: { tls: { enabled: false, autoGenerate: false, certPath: "/etc/openclaw/tls/server.crt", keyPath: "/etc/openclaw/tls/server.key", caPath: "/etc/openclaw/tls/ca-bundle.crt", }, },}enabled: เปิดใช้งานการยุติ TLS ที่ตัวรับฟังของ Gateway (HTTPS/WSS) (ค่าเริ่มต้น:false)autoGenerate: สร้างคู่ใบรับรอง/คีย์แบบลงนามด้วยตนเองภายในเครื่องโดยอัตโนมัติเมื่อไม่ได้กำหนดไฟล์ไว้อย่างชัดเจน ใช้สำหรับภายในเครื่อง/การพัฒนาเท่านั้นcertPath: พาธระบบไฟล์ไปยังไฟล์ใบรับรอง TLSkeyPath: พาธระบบไฟล์ไปยังไฟล์คีย์ส่วนตัว TLS ให้จำกัดสิทธิ์การเข้าถึงcaPath: พาธชุดรวม CA ที่เป็นทางเลือกสำหรับการตรวจสอบไคลเอนต์หรือสายโซ่ความเชื่อถือแบบกำหนดเอง
gateway.reload
{ gateway: { reload: { mode: "hybrid", // off | restart | hot | hybrid debounceMs: 500, deferralTimeoutMs: 300000, }, },}mode: ควบคุมวิธีนำการแก้ไขการกำหนดค่าไปใช้ขณะรันไทม์"off": ละเว้นการแก้ไขแบบสด การเปลี่ยนแปลงต้องมีการรีสตาร์ตอย่างชัดเจน"restart": รีสตาร์ตกระบวนการ Gateway ทุกครั้งเมื่อการกำหนดค่าเปลี่ยนแปลง"hot": นำการเปลี่ยนแปลงไปใช้ภายในกระบวนการโดยไม่รีสตาร์ต"hybrid"(ค่าเริ่มต้น): ลองโหลดใหม่แบบร้อนก่อน แล้วถอยกลับไปรีสตาร์ตหากจำเป็น
debounceMs: ช่วงเวลาดีบาวซ์เป็น ms ก่อนนำการเปลี่ยนแปลงการกำหนดค่าไปใช้ (จำนวนเต็มไม่ติดลบ ค่าเริ่มต้น:300)deferralTimeoutMs: เวลาสูงสุดที่เป็นทางเลือกในหน่วย ms สำหรับรอการดำเนินการที่กำลังทำงานอยู่ก่อนบังคับรีสตาร์ตหรือโหลดช่องทางใหม่แบบร้อน ละเว้นค่านี้เพื่อใช้ระยะเวลารอแบบมีขอบเขตตามค่าเริ่มต้น (300000) ตั้งค่า0เพื่อรอโดยไม่มีกำหนดและบันทึกคำเตือนว่ายังคงรอดำเนินการอยู่เป็นระยะ
สภาพแวดล้อมเวิร์กเกอร์บนคลาวด์
เวิร์กเกอร์บนคลาวด์เป็นคุณสมบัติแบบเลือกใช้ หากไม่มี cloudWorkers หรือ profiles ว่างเปล่า OpenClaw จะไม่ยอมรับการสร้างเวิร์กเกอร์ใหม่ ระเบียนถาวรที่สร้างไว้ก่อนหน้านี้ยังคงปรับให้สอดคล้องและมองเห็นได้ ส่วนการฉายภาพ gateway/node ที่มีอยู่จะไม่เปลี่ยนแปลง
ผู้ให้บริการเวิร์กเกอร์ทุกรายต้องส่งคืน hostKey ของ SSH จากผลลัพธ์การจัดเตรียมที่เชื่อถือได้ในรูปแบบ algorithm base64 อย่างแม่นยำ โดยไม่มีชื่อโฮสต์หรือความคิดเห็น Bootstrap จะเขียนคีย์นั้นลงในไฟล์ known_hosts ที่แยกต่างหาก ใช้ StrictHostKeyChecking=yes และล้มเหลวก่อนเปิดการเชื่อมต่อเมื่อผู้ให้บริการไม่ได้ส่งคีย์มา ไม่มีการถอยกลับไปใช้การเชื่อถือในการใช้งานครั้งแรก
การตั้งค่าทันเนลเกิดขึ้นตามความต้องการแทนที่จะเป็นส่วนหนึ่งของการจัดเตรียม เมื่อเริ่มต้น Gateway จะทำ reverse-forward ซ็อกเก็ต Unix ภายในเวิร์กเกอร์ไปยังปลายทาง WebSocket แบบลูปแบ็ก ซ็อกเก็ตจะอยู่ในไดเรกทอรีระยะไกลที่จัดสรรแบบสุ่มและเข้าถึงได้เฉพาะเจ้าของ ต่างจากพอร์ต TCP แบบลูปแบ็ก ซ็อกเก็ตนี้ไม่สามารถเข้าถึงได้โดยบัญชีอื่นบนเวิร์กเกอร์ที่มีผู้ใช้หลายราย และไม่สามารถชนกับพอร์ตของสภาพแวดล้อมอื่นได้ การส่ง keepalive ของ SSH และการหน่วงเวลาถอยกลับเพื่อเชื่อมต่อใหม่แบบมีเพดานจะทำงานเฉพาะขณะที่เจ้าของทันเนลยังคงเป็นเจ้าของปัจจุบัน การหยุดทันเนลจะกั้นการเชื่อมต่อใหม่ก่อนปิดกระบวนการ SSH
ทราฟฟิกควบคุมและการถ่ายโอนเวิร์กสเปซใช้การเชื่อมต่อ SSH แยกกัน ทั้งสองใช้ข้อมูลประจำตัวที่แก้ไขแล้วชุดเดียวกันและไฟล์ known_hosts ที่ปักหมุดและแยกต่างหาก แต่การถ่ายโอนเวิร์กสเปซจะไม่ใช้การมัลติเพล็กซ์การเชื่อมต่อ SSH ร่วมกับทันเนลที่ทำงานระยะยาว ดังนั้น rsync จึงไม่สามารถบล็อกทราฟฟิกควบคุมได้
โปรไฟล์ Crabbox
ผู้ให้บริการ crabbox ที่รวมมาให้จะจัดเตรียมสัญญาเช่าที่รองรับ SSH ผ่าน CLI ของ Crabbox ภายในเครื่อง settings.provider ภายในจะเลือกแบ็กเอนด์ Crabbox ซึ่งแยกจากรหัสผู้ให้บริการ OpenClaw ภายนอก
{ cloudWorkers: { profiles: { production: { provider: "crabbox", install: "bundle", // ค่าเริ่มต้น ใช้ "npm" สำหรับ Gateway เวอร์ชันที่เผยแพร่แล้วเท่านั้น settings: { provider: "aws", class: "standard", ttl: "24h", idleTimeout: "60m", // พาธสัมบูรณ์ที่เป็นทางเลือก ค่าเริ่มต้น: sibling ../crabbox/bin/crabbox จากนั้น PATH binary: "/usr/local/bin/crabbox", }, lifetime: { idleTimeoutMinutes: 60, maxLifetimeMinutes: 1440, }, }, }, },}settings.provider(จำเป็น): แบ็กเอนด์ Crabbox ที่ส่งผ่าน--providerให้ใช้แบ็กเอนด์ที่ผลลัพธ์การตรวจสอบมีปลายทาง SSH โดยawsจะเลือกแบ็กเอนด์ AWS โดยตรงsettings.class(จำเป็น): คลาสเครื่อง Crabbox ที่ส่งไปยัง--classsettings.ttlและsettings.idleTimeout(จำเป็น): สตริงระยะเวลา Go ที่เป็นค่าบวกซึ่งส่งไปยัง--ttlและ--idle-timeoutกลไกป้องกันความเสียหายฝั่งผู้ให้บริการเหล่านี้แยกจากนโยบายlifetimeที่ OpenClaw จัดเก็บไว้ด้านล่างsettings.binary: พาธสัมบูรณ์ไปยังไฟล์ปฏิบัติการ Crabbox ที่เป็นทางเลือก หากไม่มีค่านี้ OpenClaw จะตรวจสอบเช็กเอาต์ Crabbox ที่อยู่ข้างกัน จากนั้นตรวจสอบรายการไฟล์ปฏิบัติการในPATHและสุดท้ายเรียกใช้crabboxเพื่อให้ CLI ที่ขาดหายยังคงเป็นข้อผิดพลาดของผู้ให้บริการที่มองเห็นได้
การตั้งค่าที่ไม่รู้จักจะถูกปฏิเสธ ข้อมูลรับรอง Crabbox และการกำหนดค่าบัญชีเฉพาะแบ็กเอนด์ยังคงอยู่ภายใต้การดูแลของ Crabbox อย่าใส่ไว้ใน settings OpenClaw เรียกใช้เฉพาะ CLI ภายในเครื่องและไม่เรียกเครือข่ายของผู้ให้บริการจาก Plugin นี้ การจัดเตรียมจะส่ง --keep=true เสมอ OpenClaw เป็นเจ้าของวงจรชีวิตภายนอกและทำลายสัญญาเช่าด้วย crabbox stop
โปรไฟล์การพัฒนา SSH แบบคงที่
{ cloudWorkers: { profiles: { development: { provider: "static-ssh", settings: { host: "worker.example.test", port: 22, user: "openclaw", hostKey: "ssh-ed25519 <base64-public-host-key>", keyRef: { source: "env", provider: "default", id: "OPENCLAW_WORKER_SSH_KEY", }, }, lifetime: { idleTimeoutMinutes: 60, maxLifetimeMinutes: 1440, }, }, }, },}profiles: โปรไฟล์เวิร์กเกอร์ที่มีชื่อพร้อมรหัสที่ไม่ว่างและตัดช่องว่างแล้ว แต่ละโปรไฟล์เลือกผู้ให้บริการที่ลงทะเบียนโดย Pluginprovider: รหัสผู้ให้บริการเวิร์กเกอร์ที่ไม่ว่าง ตัวอย่างใช้ผู้ให้บริการcrabboxที่รวมมาให้และผู้ให้บริการstatic-sshของ QA Labinstall: วิธีติดตั้งเวิร์กเกอร์"bundle"(ค่าเริ่มต้น) จะถ่ายโอนบันเดิลที่แฮชตามเนื้อหาของบิลด์ที่ติดตั้งใน Gateway และรองรับเวอร์ชันที่เผยแพร่แล้ว เวอร์ชันพัฒนา และเวอร์ชันที่ยังไม่เผยแพร่"npm"เป็นการเพิ่มประสิทธิภาพแบบเลือกใช้สำหรับรุ่นแพ็กเกจที่ไม่มีการแก้ไข โดยจะติดตั้งopenclaw@<exact gateway version>จากรีจิสทรี npm สาธารณะและไม่ติดตั้งlatest- Plugin ผู้ให้บริการที่รวมมาให้จะถูกเลือกโดยอัตโนมัติเมื่อกำหนดค่า แต่การปิดใช้งานอย่างชัดเจนและ
plugins.allowยังคงมีผล เมื่อกำหนดค่ารายการอนุญาต ให้รวมรหัสผู้ให้บริการ (เช่นcrabbox) Plugin ผู้ให้บริการภายนอกต้องได้รับการติดตั้งและเปิดใช้งานอย่างชัดเจนด้วย settings: JSON แบบมีขอบเขตที่ผู้ให้บริการเป็นเจ้าของ Plugin ที่เลือกจะกำหนดและตรวจสอบคีย์ของตน ให้ใช้ ออบเจ็กต์ SecretRef สำหรับค่าที่มีข้อมูลลับ ผู้ให้บริการ SSH แบบคงที่ต้องใช้host,user,hostKeyและkeyRefโดยportมีค่าเริ่มต้นเป็น22hostKeyต้องเป็นบรรทัดคีย์โฮสต์สาธารณะ OpenSSH หนึ่งบรรทัด (algorithm base64) ที่ได้รับจากโฮสต์ที่รู้จักหรือช่องทางที่เชื่อถือได้อื่น โดยไม่มีคำนำหน้าตัวเลือกlifetime.idleTimeoutMinutes: จำนวนนาทีที่เป็นจำนวนเต็มบวกซึ่งจัดเก็บไว้สำหรับนโยบายเรียกคืนเมื่อไม่ได้ใช้งานในภายหลังlifetime.maxLifetimeMinutes: จำนวนนาทีที่เป็นจำนวนเต็มบวกซึ่งจัดเก็บไว้สำหรับนโยบายวงจรชีวิตในภายหลัง
ต้องติดตั้งรันไทม์ Node ที่รองรับ (22.22.3+, 24.15+ หรือ 25.9+) พร้อม SQLite ที่รีเซ็ต WAL ได้อย่างปลอดภัยบนเวิร์กเกอร์ไว้แล้ว วิธี "npm" แบบเลือกใช้ยังต้องใช้ npm และการเข้าถึง HTTPS ขาออกไปยังรีจิสทรี npm สาธารณะ การตั้งค่าชุดเครื่องมือผ่านเครือข่ายเป็นนโยบายของผู้ให้บริการ Bootstrap จะรายงานข้อผิดพลาดที่นำไปแก้ไขได้แทนการติดตั้งชุดเครื่องมือด้วยตัวเอง
รากฐานนี้ติดตั้งและตรวจสอบบิลด์ของ Gateway พร้อมจัดเตรียมวงจรชีวิตการเริ่ม/หยุดทันเนล แต่จะไม่เปิดใช้ CLI ทั่วไปของ OpenClaw จุดเข้าใช้งานเวิร์กเกอร์แบบครบในตัวและลูปจะมาในหมุดหมายเวิร์กเกอร์บนคลาวด์ถัดไป
ระเบียนสภาพแวดล้อมถาวรแต่ละรายการจะเก็บการตั้งค่าผู้ให้บริการที่ผ่านการตรวจสอบ วิธีติดตั้งที่แก้ไขแล้ว และนโยบายอายุการใช้งานไว้ในสแนปช็อตโปรไฟล์ ณ เวลาสร้าง การเปลี่ยนหรือลบโปรไฟล์ที่มีชื่อจะมีผลต่อการสร้างใหม่ ส่วนระเบียนที่มีอยู่จะดำเนินการปรับวงจรชีวิตให้สอดคล้องต่อไปโดยใช้สแนปช็อตนั้น ตราบใดที่ Plugin เจ้าของยังพร้อมใช้งาน
ค่าอายุการใช้งานเป็นเพียงข้อมูลในรุ่นเวิร์กเกอร์บนคลาวด์รุ่นแรก การบังคับใช้อัตโนมัติจะมาในงานวงจรชีวิตภายหลัง การเปลี่ยนแปลงโปรไฟล์ต้องรีสตาร์ต Gateway
ฮุก
{ hooks: { enabled: true, token: "shared-secret", path: "/hooks", defaultSessionKey: "hook:ingress", allowRequestSessionKey: true, allowedSessionKeyPrefixes: ["hook:", "hook:gmail:"], allowedAgentIds: ["hooks", "main"], presets: ["gmail"], transformsDir: "~/.openclaw/hooks/transforms", mappings: [ { match: { path: "gmail" }, action: "agent", agentId: "hooks", wakeMode: "now", name: "Gmail", sessionKey: "hook:gmail:{{messages[0].id}}", messageTemplate: "From: {{messages[0].from}}\nSubject: {{messages[0].subject}}\n{{messages[0].snippet}}", deliver: true, channel: "last", model: "openai/gpt-5.6-sol", }, ], },}การยืนยันตัวตน: Authorization: Bearer <token> หรือ x-openclaw-token: <token>
โทเค็นฮุกในสตริงคำค้นจะถูกปฏิเสธ
หมายเหตุด้านการตรวจสอบความถูกต้องและความปลอดภัย:
hooks.enabled=trueต้องมีhooks.tokenที่ไม่ว่างเปล่าhooks.tokenควรแตกต่างจากการยืนยันตัวตนด้วยข้อมูลลับร่วมของ Gateway ที่ใช้งานอยู่ (gateway.auth.token/OPENCLAW_GATEWAY_TOKENหรือgateway.auth.password/OPENCLAW_GATEWAY_PASSWORD) เมื่อเริ่มทำงาน ระบบจะบันทึกคำเตือนด้านความปลอดภัยที่ไม่ร้ายแรงหากตรวจพบการใช้ซ้ำopenclaw security auditระบุการใช้ข้อมูลยืนยันตัวตนร่วมกันระหว่าง hook/Gateway เป็นข้อค้นพบระดับวิกฤต รวมถึงการยืนยันตัวตนด้วยรหัสผ่านของ Gateway ที่ระบุเฉพาะตอนตรวจสอบ (--auth password --password <password>) เรียกใช้openclaw doctor --fixเพื่อหมุนเวียนhooks.tokenที่จัดเก็บไว้และถูกใช้ซ้ำ จากนั้นอัปเดตตัวส่ง hook ภายนอกให้ใช้โทเค็น hook ใหม่hooks.pathต้องไม่เป็น/ให้ใช้พาธย่อยเฉพาะ เช่น/hooks- หาก
hooks.allowRequestSessionKey=trueให้จำกัดhooks.allowedSessionKeyPrefixes(ตัวอย่างเช่น["hook:"]) - หากการแมปหรือค่าที่ตั้งไว้ล่วงหน้าใช้
sessionKeyแบบเทมเพลต ให้ตั้งค่าhooks.allowedSessionKeyPrefixesและhooks.allowRequestSessionKey=trueคีย์การแมปแบบคงที่ไม่ต้องเลือกรับการทำงานนี้
เอ็นด์พอยต์:
POST /hooks/wake→{ text, mode?: "now"|"next-heartbeat" }POST /hooks/agent→{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }- ระบบยอมรับ
sessionKeyจากเพย์โหลดคำขอเฉพาะเมื่อhooks.allowRequestSessionKey=true(ค่าเริ่มต้น:false)
- ระบบยอมรับ
POST /hooks/<name>→ แก้ค่าโดยใช้hooks.mappings- ค่า
sessionKeyของการแมปที่เรนเดอร์จากเทมเพลตจะถือว่ามาจากภายนอก และต้องมีhooks.allowRequestSessionKey=trueเช่นกัน
- ค่า
รายละเอียดการแมป
match.pathจับคู่พาธย่อยหลัง/hooks(เช่น/hooks/gmail→gmail)match.sourceจับคู่ฟิลด์เพย์โหลดสำหรับพาธทั่วไป- เทมเพลต เช่น
{{messages[0].subject}}อ่านค่าจากเพย์โหลด transformสามารถชี้ไปยังโมดูล JS/TS ที่ส่งคืนการดำเนินการของ hooktransform.moduleต้องเป็นพาธสัมพัทธ์และอยู่ภายในhooks.transformsDir(ระบบจะปฏิเสธพาธสัมบูรณ์และการข้ามไดเรกทอรี)- เก็บ
hooks.transformsDirไว้ภายใต้~/.openclaw/hooks/transformsระบบจะปฏิเสธไดเรกทอรี Skills ของพื้นที่ทำงาน หากopenclaw doctorรายงานว่าพาธนี้ไม่ถูกต้อง ให้ย้ายโมดูลแปลงไปยังไดเรกทอรีการแปลงของ hooks หรือลบhooks.transformsDir agentIdกำหนดเส้นทางไปยังเอเจนต์ที่ระบุ โดย ID ที่ไม่รู้จักจะใช้เอเจนต์เริ่มต้นแทนallowedAgentIds: จำกัดการกำหนดเส้นทางเอเจนต์ที่มีผล รวมถึงพาธของเอเจนต์เริ่มต้นเมื่อไม่ได้ระบุagentId(*หรือไม่ระบุ = อนุญาตทั้งหมด,[]= ปฏิเสธทั้งหมด)defaultSessionKey: คีย์เซสชันคงที่ซึ่งระบุหรือไม่ก็ได้สำหรับการเรียกใช้เอเจนต์ของ hook ที่ไม่มีsessionKeyชัดเจนallowRequestSessionKey: อนุญาตให้ผู้เรียก/hooks/agentและคีย์เซสชันการแมปที่ขับเคลื่อนด้วยเทมเพลตตั้งค่าsessionKey(ค่าเริ่มต้น:false)allowedSessionKeyPrefixes: รายการอนุญาตของคำนำหน้าซึ่งระบุหรือไม่ก็ได้สำหรับค่าsessionKeyที่กำหนดอย่างชัดเจน (คำขอ + การแมป) เช่น["hook:"]ค่านี้จะกลายเป็นข้อบังคับเมื่อการแมปหรือค่าที่ตั้งไว้ล่วงหน้ารายการใดใช้sessionKeyแบบเทมเพลตdeliver: trueส่งคำตอบสุดท้ายไปยังช่องทาง โดยchannelมีค่าเริ่มต้นเป็นlastmodelแทนที่ LLM สำหรับการเรียกใช้ hook ครั้งนี้ (ต้องได้รับอนุญาตหากมีการตั้งค่าแค็ตตาล็อกโมเดล)
การผสานการทำงานกับ Gmail
- ค่าที่ตั้งไว้ล่วงหน้าของ Gmail ในตัวใช้
sessionKey: "hook:gmail:{{messages[0].id}}" - คีย์ต่อข้อความนี้แยกบริบทการสนทนา ไม่ได้แยกเครื่องมือหรือการเข้าถึงพื้นที่ทำงาน หากไม่มีการแมปแบบกำหนดเองที่ตั้งค่า
agentIdค่าที่ตั้งไว้ล่วงหน้าจะใช้เอเจนต์เริ่มต้น - สำหรับกล่องจดหมายที่ไม่น่าเชื่อถือ ให้กำหนดเส้นทาง Gmail ไปยังเอเจนต์ตัวอ่านเฉพาะ และจำกัดเอเจนต์นั้นด้วย แซนด์บ็อกซ์และนโยบายเครื่องมือต่อเอเจนต์ หากตัวอ่านต้องแจ้งเอเจนต์หลัก ให้จำกัดการส่งต่องานด้วย
tools.agentToAgentดูโมเดลภัยคุกคามและระดับโมเดลที่แนะนำได้ที่ การแทรกพรอมต์ - หากคงการกำหนดเส้นทางต่อข้อความดังกล่าวไว้ ให้ตั้งค่า
hooks.allowRequestSessionKey: trueและจำกัดhooks.allowedSessionKeyPrefixesให้ตรงกับเนมสเปซของ Gmail เช่น["hook:", "hook:gmail:"] - หากต้องการ
hooks.allowRequestSessionKey: falseให้แทนที่ค่าที่ตั้งไว้ล่วงหน้าด้วยsessionKeyแบบคงที่ แทนค่าเริ่มต้นแบบเทมเพลต
{ hooks: { gmail: { account: "openclaw@gmail.com", topic: "projects/<project-id>/topics/gog-gmail-watch", subscription: "gog-gmail-watch-push", pushToken: "shared-push-token", hookUrl: "http://127.0.0.1:18789/hooks/gmail", includeBody: true, maxBytes: 20000, renewEveryMinutes: 720, serve: { bind: "127.0.0.1", port: 8788, path: "/" }, tailscale: { mode: "funnel", path: "/gmail-pubsub" }, model: "openai/gpt-5.6-sol", thinking: "high", }, },}- Gateway เริ่ม
gog gmail watch serveโดยอัตโนมัติขณะบูตเมื่อมีการกำหนดค่า ตั้งค่าOPENCLAW_SKIP_GMAIL_WATCHER=1เพื่อปิดใช้งาน - อย่าเรียกใช้
gog gmail watch serveแยกต่างหากควบคู่กับ Gateway
โฮสต์ Plugin ของ Canvas
{ plugins: { entries: { canvas: { config: { host: { root: "~/.openclaw/workspace/canvas", liveReload: true, // enabled: false, // หรือ OPENCLAW_SKIP_CANVAS_HOST=1 }, }, }, }, },}- ให้บริการ HTML/CSS/JS ที่เอเจนต์แก้ไขได้และ A2UI ผ่าน HTTP ภายใต้พอร์ตของ Gateway:
http://<gateway-host>:<gateway.port>/__openclaw__/canvas/http://<gateway-host>:<gateway.port>/__openclaw__/a2ui/
- เฉพาะภายในเครื่อง: คง
gateway.bind: "loopback"ไว้ (ค่าเริ่มต้น) - การผูกกับอินเทอร์เฟซที่ไม่ใช่ลูปแบ็ก: เส้นทาง canvas ต้องใช้การยืนยันตัวตนของ Gateway (โทเค็น/รหัสผ่าน/พร็อกซีที่เชื่อถือได้) เช่นเดียวกับพื้นผิว HTTP อื่นของ Gateway
- โดยทั่วไป WebView ของ Node จะไม่ส่งส่วนหัวการยืนยันตัวตน หลังจากจับคู่และเชื่อมต่อโหนดแล้ว Gateway จะประกาศ URL ความสามารถที่มีขอบเขตเฉพาะโหนดสำหรับการเข้าถึง canvas/A2UI
- URL ความสามารถจะผูกกับเซสชัน WS ที่ใช้งานอยู่ของโหนดและหมดอายุอย่างรวดเร็ว ไม่มีการใช้ทางเลือกสำรองตาม IP
- แทรกไคลเอ็นต์โหลดซ้ำแบบสดลงใน HTML ที่ให้บริการ
- สร้าง
index.htmlเริ่มต้นโดยอัตโนมัติเมื่อว่างเปล่า - ให้บริการ A2UI ที่
/__openclaw__/a2ui/ด้วย - การเปลี่ยนแปลงต้องเริ่ม Gateway ใหม่
- ปิดใช้การโหลดซ้ำแบบสดสำหรับไดเรกทอรีขนาดใหญ่หรือเมื่อเกิดข้อผิดพลาด
EMFILE
การค้นหา
mDNS (Bonjour)
{ discovery: { mdns: { mode: "minimal", // minimal | full | off }, },}minimal(ค่าเริ่มต้น): ละเว้นcliPath+sshPortจากระเบียน TXTfull: รวมcliPath+sshPortการประกาศแบบมัลติแคสต์บน LAN ยังคงต้องเปิดใช้งาน Pluginbonjourที่รวมมาให้off: ระงับการประกาศแบบมัลติแคสต์บน LAN โดยไม่เปลี่ยนการเปิดใช้งาน Plugin- Plugin
bonjourที่รวมมาให้จะเริ่มโดยอัตโนมัติบนโฮสต์ macOS และต้องเลือกรับการทำงานบน Linux, Windows และการปรับใช้ Gateway แบบคอนเทนเนอร์ - ชื่อโฮสต์มีค่าเริ่มต้นเป็นชื่อโฮสต์ของระบบเมื่อเป็นป้ายกำกับ DNS ที่ถูกต้อง หากไม่ถูกต้องจะใช้
openclawแทน กำหนดทับด้วยOPENCLAW_MDNS_HOSTNAME OPENCLAW_DISABLE_BONJOUR=1ปิดการประกาศ mDNS โดยสิ้นเชิง และแทนที่discovery.mdns.mode
บริเวณกว้าง (DNS-SD)
{ discovery: { wideArea: { enabled: true }, },}เขียนโซน DNS-SD แบบยูนิแคสต์ภายใต้ ~/.openclaw/dns/ สำหรับการค้นหาข้ามเครือข่าย ให้ใช้ร่วมกับเซิร์ฟเวอร์ DNS (แนะนำ CoreDNS) + DNS แบบแยกของ Tailscale
การตั้งค่า: openclaw dns setup --apply
สภาพแวดล้อม
env (ตัวแปรสภาพแวดล้อมแบบอินไลน์)
{ env: { OPENROUTER_API_KEY: "sk-or-...", vars: { GROQ_API_KEY: "gsk-...", }, shellEnv: { enabled: true, timeoutMs: 15000, }, },}- ตัวแปรสภาพแวดล้อมแบบอินไลน์จะมีผลเฉพาะเมื่อสภาพแวดล้อมของกระบวนการไม่มีคีย์ดังกล่าว
- ไฟล์
.env:.envของ CWD +~/.openclaw/.env(ทั้งสองไม่แทนที่ตัวแปรที่มีอยู่) shellEnv: นำเข้าคีย์ที่คาดไว้แต่ยังไม่มีจากโปรไฟล์ล็อกอินเชลล์- ดูลำดับความสำคัญทั้งหมดได้ที่ สภาพแวดล้อม
การแทนค่าตัวแปรสภาพแวดล้อม
อ้างอิงตัวแปรสภาพแวดล้อมในสตริงการกำหนดค่าใดก็ได้ด้วย ${VAR_NAME}:
{ gateway: { auth: { token: "${OPENCLAW_GATEWAY_TOKEN}" }, },}- จับคู่เฉพาะชื่อที่เป็นตัวพิมพ์ใหญ่:
[A-Z_][A-Z0-9_]* - ตัวแปรที่ไม่มีหรือว่างเปล่าจะทำให้เกิดข้อผิดพลาดเมื่อโหลดการกำหนดค่า
- หลีกอักขระด้วย
$${VAR}สำหรับ${VAR}แบบข้อความตรงตัว - ทำงานร่วมกับ
$include
ข้อมูลลับ
การอ้างอิงข้อมูลลับเป็นแบบเพิ่มเติม โดยค่าข้อความธรรมดายังคงใช้งานได้
SecretRef
ใช้รูปแบบออบเจ็กต์แบบเดียว:
{ source: "env" | "file" | "exec", provider: "default", id: "..." }การตรวจสอบความถูกต้อง:
- รูปแบบ
provider:^[a-z][a-z0-9_-]{0,63}$ - รูปแบบ ID ของ
source: "env":^[A-Z][A-Z0-9_]{0,127}$ - ID ของ
source: "file": ตัวชี้ JSON แบบสัมบูรณ์ (ตัวอย่างเช่น"/providers/openai/apiKey") - รูปแบบ ID ของ
source: "exec":^[A-Za-z0-9][A-Za-z0-9._:/#-]{0,255}$(รองรับตัวเลือกsecret#json_keyแบบ AWS) - ID ของ
source: "exec"ต้องไม่มีเซกเมนต์พาธที่คั่นด้วยเครื่องหมายทับ.หรือ..(ตัวอย่างเช่น ระบบจะปฏิเสธa/../b)
พื้นผิวข้อมูลประจำตัวที่รองรับ
- เมทริกซ์มาตรฐาน: พื้นผิวข้อมูลประจำตัว SecretRef
- เป้าหมาย
secrets applyรองรับพาธข้อมูลประจำตัวopenclaw.json - การอ้างอิง
auth-profiles.jsonรวมอยู่ในการแก้ค่าขณะรันไทม์และขอบเขตการตรวจสอบ
การกำหนดค่าผู้ให้บริการข้อมูลลับ
{ secrets: { providers: { default: { source: "env" }, // ผู้ให้บริการ env แบบระบุชัดเจนซึ่งไม่บังคับ filemain: { source: "file", path: "~/.openclaw/secrets.json", mode: "json", timeoutMs: 5000, }, vault: { source: "exec", command: "/usr/local/bin/openclaw-vault-resolver", passEnv: ["PATH", "VAULT_ADDR"], }, }, defaults: { env: "default", file: "filemain", exec: "vault", }, },}หมายเหตุ:
- ผู้ให้บริการ
fileรองรับmode: "json"และmode: "singleValue"(idต้องเป็น"value"ในโหมด singleValue) - พาธของผู้ให้บริการ file และ exec จะปฏิเสธการทำงานเมื่อไม่สามารถตรวจสอบ ACL ของ Windows ได้ ตั้งค่า
allowInsecurePath: trueเฉพาะสำหรับพาธที่เชื่อถือได้แต่ไม่สามารถตรวจสอบได้ - ผู้ให้บริการ
execต้องใช้พาธcommandแบบสัมบูรณ์ และใช้เพย์โหลดโปรโตคอลบน stdin/stdout - โดยค่าเริ่มต้น ระบบจะปฏิเสธพาธคำสั่งที่เป็นลิงก์สัญลักษณ์ ตั้งค่า
allowSymlinkCommand: trueเพื่ออนุญาตพาธลิงก์สัญลักษณ์ พร้อมตรวจสอบความถูกต้องของพาธเป้าหมายที่แก้ค่าแล้ว - หากมีการกำหนดค่า
trustedDirsการตรวจสอบไดเรกทอรีที่เชื่อถือได้จะใช้กับพาธเป้าหมายที่แก้ค่าแล้ว - โดยค่าเริ่มต้น สภาพแวดล้อมลูกของ
execจะมีเฉพาะค่าขั้นต่ำ ให้ส่งตัวแปรที่จำเป็นอย่างชัดเจนด้วยpassEnv - การอ้างอิงข้อมูลลับจะได้รับการแก้ค่าเป็นสแนปช็อตในหน่วยความจำเมื่อเปิดใช้งาน จากนั้นพาธคำขอจะอ่านเฉพาะสแนปช็อตดังกล่าว
- การกรองพื้นผิวที่ใช้งานอยู่จะเกิดขึ้นระหว่างการเปิดใช้งาน: การอ้างอิงที่ยังแก้ค่าไม่ได้บนพื้นผิวที่เปิดใช้งานจะทำให้การเริ่มทำงาน/โหลดซ้ำล้มเหลว ส่วนพื้นผิวที่ไม่ได้ใช้งานจะถูกข้ามพร้อมข้อมูลวินิจฉัย
ที่จัดเก็บการยืนยันตัวตน
{ auth: { profiles: { "anthropic:default": { provider: "anthropic", mode: "api_key" }, "anthropic:work": { provider: "anthropic", mode: "api_key" }, "openai:personal": { provider: "openai", mode: "oauth" }, }, order: { anthropic: ["anthropic:default", "anthropic:work"], openai: ["openai:personal"], }, },}- โปรไฟล์ต่อเอเจนต์จัดเก็บไว้ที่
<agentDir>/auth-profiles.json auth-profiles.jsonรองรับการอ้างอิงระดับค่า (keyRefสำหรับapi_key,tokenRefสำหรับtoken) สำหรับโหมดข้อมูลประจำตัวแบบคงที่- แมป
auth-profiles.jsonแบบแบนดั้งเดิม เช่น{ "provider": { "apiKey": "..." } }ไม่ใช่รูปแบบรันไทม์;openclaw doctor --fixจะเขียนใหม่เป็นโปรไฟล์คีย์ APIprovider:defaultมาตรฐานพร้อมข้อมูลสำรอง.legacy-flat.*.bak - โปรไฟล์โหมด OAuth (
auth.profiles.<id>.mode = "oauth") ไม่รองรับข้อมูลประจำตัวของโปรไฟล์การยืนยันตัวตนที่อ้างอิงผ่าน SecretRef - ข้อมูลประจำตัวรันไทม์แบบคงที่มาจากสแนปช็อตที่แก้ไขค่าแล้วในหน่วยความจำ; รายการ
auth.jsonแบบคงที่ดั้งเดิมจะถูกล้างเมื่อตรวจพบ - การนำเข้า OAuth แบบดั้งเดิมจาก
~/.openclaw/credentials/oauth.json - ดู OAuth
- พฤติกรรมรันไทม์ของข้อมูลลับและเครื่องมือ
audit/configure/apply: การจัดการข้อมูลลับ
การตรวจสอบ
{ audit: { enabled: true, messages: "off", // off | direct | all },}Gateway บันทึกเหตุการณ์ตรวจสอบที่มี เฉพาะเมทาดาทา สำหรับการเรียกใช้เอเจนต์และการทำงานของเครื่องมือลงในฐานข้อมูลสถานะที่ใช้ร่วมกัน เมทาดาทาวงจรชีวิตของข้อความเป็นตัวเลือกแยกต่างหากที่ต้องเปิดใช้ บัญชีบันทึกจัดเก็บข้อมูลประจำตัว เวลา ชื่อเครื่องมือ และผลลัพธ์ที่ทำให้เป็นมาตรฐานแล้ว แต่จะไม่จัดเก็บพรอมต์ เนื้อหาข้อความ อาร์กิวเมนต์ของเครื่องมือ ผลลัพธ์ หรือข้อความข้อผิดพลาดดิบ แถวข้อความจะไม่จัดเก็บ ID ดิบของบัญชีแพลตฟอร์ม การสนทนา ข้อความ และเป้าหมาย คีย์เซสชันของการเรียกใช้/เครื่องมือยังคงพร้อมใช้สำหรับการเชื่อมโยง และอาจมี ID บัญชีแพลตฟอร์มหรือ ID ของเพียร์อยู่ด้วย ระเบียนจะหมดอายุหลังจาก 30 วัน และบัญชีบันทึกจำกัดไว้ที่ 100,000 แถว สอบถามข้อมูลด้วย openclaw audit หรือ Gateway RPC audit.activity.list ดูโมเดลข้อมูลทั้งหมด ความหมายด้านความเป็นส่วนตัว และขีดจำกัดความครอบคลุมได้ที่ ประวัติการตรวจสอบ
enabled: บันทึกเหตุการณ์ตรวจสอบใหม่ (ค่าเริ่มต้น:true) บัญชีบันทึกเปิดใช้โดยค่าเริ่มต้น เพราะเส้นทางการตรวจสอบที่เปิดใช้หลังเกิดเหตุเท่านั้นไม่สามารถอธิบายเหตุการณ์นั้นได้ การตั้งค่าfalseจะหยุดการแทรกเหตุการณ์ใหม่หลังจาก Gateway เริ่มต้นใหม่; ระเบียนที่มีอยู่ยังคงอ่านได้จนกว่าจะหมดอายุ การเปิดใช้อีกครั้งจะเริ่มบันทึกต่อจากจุดนั้น โดยจะไม่มีการเติมข้อมูลย้อนหลังในช่วงที่ขาดหายmessages: ขอบเขตเมทาดาทาของข้อความ (ค่าเริ่มต้น:"off")"direct"บันทึกเฉพาะการสนทนาโดยตรงที่รู้จัก"all"บันทึกการสนทนาแบบกลุ่ม ช่อง และชนิดที่ไม่รู้จักด้วย ทั้งสองโหมดยังคงไม่มีเนื้อหาและแทนที่ตัวระบุดิบด้วยนามแฝงที่สร้างด้วยคีย์เฉพาะการติดตั้งเมื่อสามารถเชื่อมโยงได้ สิ่งเหล่านี้เป็นตัวช่วยเชื่อมโยง ไม่ใช่การทำให้เป็นนิรนาม; ฐานข้อมูลสถานะจัดเก็บคีย์ที่ใช้สร้าง แต่การส่งออกผ่าน RPC และ CLI จะไม่รวมคีย์นี้
Gateway ที่กำลังทำงานจะบันทึกค่า audit.enabled และ audit.messages ขณะเริ่มต้น; ให้เริ่มต้นใหม่หลังเปลี่ยนการตั้งค่าใดค่าหนึ่ง ปัจจุบันความครอบคลุมของข้อความรวมถึงข้อความขาเข้าที่ได้รับการยอมรับและไปถึงการส่งต่อหลัก และแถวสถานะสิ้นสุดหนึ่งแถวต่อเพย์โหลดการตอบกลับขาออกเชิงตรรกะต้นฉบับแต่ละรายการที่ไปถึงการส่งมอบแบบคงทนที่ใช้ร่วมกัน เส้นทางภายใน Plugin และเส้นทางส่งโดยตรงที่ข้ามขอบเขตที่ใช้ร่วมกันเหล่านั้นยังไม่ครอบคลุม ตัวเขียนเบื้องหลังแบบมีขอบเขตจำกัดทำงานโดยพยายามอย่างดีที่สุด ไม่ใช่คลังข้อมูลการปฏิบัติตามข้อกำหนดที่รับประกันว่าไม่มีข้อมูลสูญหาย
การบันทึกล็อก
{ logging: { level: "info", file: "/tmp/openclaw/openclaw.log", consoleLevel: "info", consoleStyle: "pretty", // pretty | compact | json redactSensitive: "tools", // off | tools redactPatterns: ["\\bTOKEN\\b\\s*[=:]\\s*([\"']?)([^\\s\"']+)\\1"], },}- ไฟล์ล็อกเริ่มต้น:
/tmp/openclaw/openclaw-YYYY-MM-DD.log - ตั้งค่า
logging.fileเพื่อใช้พาธที่คงที่ consoleLevelจะเพิ่มเป็นdebugเมื่อ--verbosemaxFileBytes: ขนาดสูงสุดของไฟล์ล็อกที่ใช้งานอยู่ในหน่วยไบต์ก่อนหมุนเวียน (จำนวนเต็มบวก; ค่าเริ่มต้น:104857600= 100 MB) OpenClaw เก็บไฟล์เก็บถาวรแบบมีหมายเลขไว้ข้างไฟล์ที่ใช้งานอยู่สูงสุดห้าไฟล์redactSensitive/redactPatterns: การปกปิดแบบพยายามอย่างดีที่สุดสำหรับเอาต์พุตคอนโซล ล็อกไฟล์ ระเบียนล็อก OTLP และข้อความบันทึกการสนทนาของเซสชันที่จัดเก็บถาวรredactSensitive: "off"ปิดใช้งานเฉพาะนโยบายล็อก/บันทึกการสนทนาทั่วไปนี้เท่านั้น; พื้นผิวความปลอดภัยของ UI/เครื่องมือ/การวินิจฉัยยังคงปกปิดข้อมูลลับก่อนส่งออก
การวินิจฉัย
{ diagnostics: { enabled: true, flags: ["telegram.*"], otel: { enabled: false, endpoint: "https://otel-collector.example.com:4318", tracesEndpoint: "https://traces.example.com/v1/traces", metricsEndpoint: "https://metrics.example.com/v1/metrics", logsEndpoint: "https://logs.example.com/v1/logs", protocol: "http/protobuf", // http/protobuf | grpc headers: { "x-tenant-id": "my-org" }, serviceName: "openclaw-gateway", traces: true, metrics: true, logs: false, logsExporter: "otlp", sampleRate: 1.0, flushIntervalMs: 5000, captureContent: { enabled: false, inputMessages: false, outputMessages: false, toolInputs: false, toolOutputs: false, systemPrompt: false, toolDefinitions: false, }, }, cacheTrace: { enabled: false, filePath: "~/.openclaw/logs/cache-trace.jsonl", includeMessages: true, includePrompt: true, includeSystem: true, }, },}enabled: สวิตช์หลักสำหรับเอาต์พุตการตรวจวัด (ค่าเริ่มต้น:true)flags: อาร์เรย์ของสตริงแฟล็กที่เปิดใช้เอาต์พุตล็อกแบบเจาะจง (รองรับไวลด์การ์ด เช่น"telegram.*"หรือ"*")otel.enabled: เปิดใช้ไปป์ไลน์ส่งออก OpenTelemetry (ค่าเริ่มต้น:false) สำหรับการกำหนดค่าทั้งหมด แค็ตตาล็อกสัญญาณ และโมเดลความเป็นส่วนตัว ดู การส่งออก OpenTelemetryotel.endpoint: URL ของตัวรวบรวมสำหรับการส่งออก OTelotel.tracesEndpoint/otel.metricsEndpoint/otel.logsEndpoint: ปลายทาง OTLP เฉพาะสัญญาณที่กำหนดหรือไม่ก็ได้ เมื่อตั้งค่าแล้ว จะใช้แทนotel.endpointเฉพาะสำหรับสัญญาณนั้นotel.protocol:"http/protobuf"(ค่าเริ่มต้น) หรือ"grpc"otel.headers: ส่วนหัวเมทาดาทา HTTP/gRPC เพิ่มเติมที่ส่งพร้อมคำขอส่งออก OTelotel.serviceName: ชื่อบริการสำหรับแอตทริบิวต์ทรัพยากรotel.traces/otel.metrics/otel.logs: เปิดใช้การส่งออกเทรซ เมตริก หรือล็อกotel.logsExporter: ปลายทางรับการส่งออกล็อก:"otlp"(ค่าเริ่มต้น),"stdout"สำหรับออบเจ็กต์ JSON หนึ่งรายการต่อหนึ่งบรรทัด stdout หรือ"both"otel.sampleRate: อัตราการสุ่มตัวอย่างเทรซ0-1otel.flushIntervalMs: ช่วงเวลาล้างข้อมูลโทรมาตรเป็นระยะในหน่วย msotel.captureContent: การบันทึกเนื้อหาดิบแบบเลือกเปิดใช้สำหรับแอตทริบิวต์สแปน OTEL ค่าเริ่มต้นคือปิด ค่าบูลีนtrueจะบันทึกเนื้อหาข้อความ/เครื่องมือที่ไม่ใช่ระบบ; รูปแบบออบเจ็กต์ช่วยให้เปิดใช้inputMessages,outputMessages,toolInputs,toolOutputs,systemPromptและtoolDefinitionsได้อย่างชัดเจนOTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental: สวิตช์สภาพแวดล้อมสำหรับรูปแบบสแปนการอนุมาน GenAI เชิงทดลองล่าสุด รวมถึงชื่อสแปน{gen_ai.operation.name} {gen_ai.request.model}, ชนิดสแปนCLIENTและgen_ai.provider.nameแทนgen_ai.systemแบบดั้งเดิม โดยค่าเริ่มต้น สแปนจะคงopenclaw.model.callและgen_ai.systemไว้เพื่อความเข้ากันได้; เมตริก GenAI ใช้แอตทริบิวต์เชิงความหมายแบบมีขอบเขตOPENCLAW_OTEL_PRELOADED=1: สวิตช์สภาพแวดล้อมสำหรับโฮสต์ที่ลงทะเบียน OpenTelemetry SDK ส่วนกลางไว้แล้ว จากนั้น OpenClaw จะข้ามการเริ่มต้น/ปิดระบบ SDK ที่ Plugin เป็นเจ้าของ โดยยังคงให้ตัวรับฟังการวินิจฉัยทำงานอยู่OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,OTEL_EXPORTER_OTLP_METRICS_ENDPOINTและOTEL_EXPORTER_OTLP_LOGS_ENDPOINT: ตัวแปรสภาพแวดล้อมปลายทางเฉพาะสัญญาณที่ใช้เมื่อไม่ได้ตั้งค่าคีย์การกำหนดค่าที่ตรงกันcacheTrace.enabled: บันทึกสแนปช็อตเทรซแคชสำหรับการเรียกใช้แบบฝัง (ค่าเริ่มต้น:false)cacheTrace.filePath: พาธเอาต์พุตสำหรับ JSONL ของเทรซแคช (ค่าเริ่มต้น:$OPENCLAW_STATE_DIR/logs/cache-trace.jsonl)cacheTrace.includeMessages/includePrompt/includeSystem: ควบคุมสิ่งที่รวมอยู่ในเอาต์พุตเทรซแคช (ค่าเริ่มต้นทั้งหมด:true)
การอัปเดต
{ update: { channel: "stable", // stable | extended-stable | beta | dev checkOnStart: true, auto: { enabled: false, }, },}channel: ช่องทางการเผยแพร่ -"stable","extended-stable","beta"หรือ"dev"Extended-stable ใช้สำหรับแพ็กเกจเท่านั้น: คำสั่งเบื้องหน้ารับผิดชอบการติดตั้ง ขณะที่ Gateway อาจแสดงคำแนะนำการอัปเดตแบบอ่านอย่างเดียวcheckOnStart: ตรวจสอบการอัปเดต npm เมื่อ Gateway เริ่มต้น (ค่าเริ่มต้น:true) ตัวเลือก extended-stable ที่จัดเก็บไว้ใช้คำแนะนำแบบอ่านอย่างเดียวและกำหนดการแนะนำทุก 24 ชั่วโมงเช่นเดียวกันauto.enabled: เปิดใช้การอัปเดตอัตโนมัติเบื้องหลังสำหรับการติดตั้งแพ็กเกจ stable และ beta (ค่าเริ่มต้น:false) Extended-stable จะไม่ถูกนำไปใช้โดยอัตโนมัติ
ACP
{ acp: { enabled: true, dispatch: { enabled: true }, backend: "acpx", fallbacks: ["acpx-secondary"], defaultAgent: "main", allowedAgents: ["main", "ops"], stream: { repeatSuppression: true, deliveryMode: "live", // live | final_only }, },}enabled: เกตฟีเจอร์ ACP ส่วนกลาง (ค่าเริ่มต้น:true; ตั้งค่าfalseเพื่อซ่อนความสามารถในการส่งต่อและสร้าง ACP)dispatch.enabled: เกตอิสระสำหรับการส่งต่อเทิร์นของเซสชัน ACP (ค่าเริ่มต้น:true) ตั้งค่าfalseเพื่อให้คำสั่ง ACP ยังใช้งานได้แต่บล็อกการดำเนินการbackend: ID แบ็กเอนด์รันไทม์ ACP เริ่มต้น (ต้องตรงกับ Plugin รันไทม์ ACP ที่ลงทะเบียนไว้) ติดตั้ง Plugin แบ็กเอนด์ก่อน และหากตั้งค่าplugins.allowให้รวม ID ของ Plugin แบ็กเอนด์ (เช่นacpx) มิฉะนั้นแบ็กเอนด์ ACP จะไม่โหลดfallbacks: รายการ ID แบ็กเอนด์ ACP สำรองตามลำดับที่จะลองเมื่อแบ็กเอนด์หลักล้มเหลวตั้งแต่เนิ่น ๆ ด้วยข้อผิดพลาดที่ดูเป็นเหตุชั่วคราว (ไม่พร้อมใช้งาน ถูกจำกัดอัตรา โควตาหมด หรือโหลดเกิน) ก่อนที่จะสร้างเอาต์พุตใด ๆ แต่ละรายการต้องตรงกับแบ็กเอนด์ Plugin รันไทม์ ACP ที่ลงทะเบียนไว้defaultAgent: ID เอเจนต์เป้าหมาย ACP สำรองเมื่อการสร้างไม่ได้ระบุเป้าหมายอย่างชัดเจนallowedAgents: รายการอนุญาตของ ID เอเจนต์ที่ใช้ได้สำหรับเซสชันรันไทม์ ACP; หากว่างหมายถึงไม่มีข้อจำกัดเพิ่มเติมstream.repeatSuppression: ระงับบรรทัดสถานะ/เครื่องมือที่ซ้ำกันต่อเทิร์น (ค่าเริ่มต้น:true)stream.deliveryMode:"live"สตรีมแบบเพิ่มทีละส่วน;"final_only"พักข้อมูลไว้จนกว่าจะเกิดเหตุการณ์สิ้นสุดเทิร์นstream.tagVisibility: ระเบียนชื่อแท็กที่แมปกับค่าบูลีนซึ่งเขียนทับการมองเห็นสำหรับเหตุการณ์ที่สตรีมruntime.installCommand: คำสั่งติดตั้งที่กำหนดหรือไม่ก็ได้สำหรับเรียกใช้เมื่อบูตสแตรปสภาพแวดล้อมรันไทม์ ACP
CLI
{ cli: { banner: { taglineMode: "off", // random | default | off }, },}cli.banner.taglineModeควบคุมรูปแบบคำโปรยของแบนเนอร์:"random"(ค่าเริ่มต้น): หมุนเวียนคำโปรยขำขัน/ตามฤดูกาล"default": คำโปรยเป็นกลางแบบคงที่ (All your chats, one OpenClaw.)"off": ไม่มีข้อความคำโปรย (ยังคงแสดงชื่อ/เวอร์ชันในแบนเนอร์)
- หากต้องการซ่อนแบนเนอร์ทั้งหมด (ไม่ใช่เฉพาะคำโปรย) ให้ตั้งค่าตัวแปรสภาพแวดล้อม
OPENCLAW_HIDE_BANNER=1
วิซาร์ด
ลักษณะการทำงานและเมทาดาทาสำหรับขั้นตอนการตั้งค่าแบบมีคำแนะนำของ CLI (onboard, configure, doctor):
{ wizard: { accessMode: "full", appRecommendations: true, lastRunAt: "2026-01-01T00:00:00.000Z", lastRunVersion: "2026.1.4", lastRunCommit: "abc1234", lastRunCommand: "configure", lastRunMode: "local", securityAcknowledgedAt: "2026-01-01T00:00:00.000Z", },}-
wizard.accessMode: ความยินยอมให้สำรวจที่เลือกเมื่อเริ่มต้นการเริ่มใช้งานแบบมีคำแนะนำ"full"(แนะนำ) อนุญาตให้การตั้งค่าค้นหาแอป AI คีย์ และรันไทม์ภายในเครื่องโดยอัตโนมัติ ส่วน"guarded"ทำให้การตั้งค่าถามหนึ่งครั้งก่อนสำรวจและเสนอการกำหนดค่าด้วยตนเองแทน -
wizard.appRecommendationsมีค่าเริ่มต้นเป็นtrueตั้งค่าเป็นfalseเพื่อปิดคำแนะนำแอปพลิเคชันที่ติดตั้งระหว่างการเริ่มใช้งานแบบมีคำแนะนำหรือแบบคลาสสิก และบล็อกการเข้าถึงdevice.appsของ Gateway โฮสต์ Node ยังคงต้องเปิดแฟล็กแยกสำหรับการแชร์แอปที่ติดตั้ง ซึ่งปิดอยู่โดยค่าเริ่มต้น ก่อนที่จะประกาศคำสั่งดังกล่าว
ข้อมูลประจำตัว
ดูฟิลด์ข้อมูลประจำตัว agents.list ภายใต้ ค่าเริ่มต้นของเอเจนต์
บริดจ์ (แบบเดิม ถูกนำออกแล้ว)
บิลด์ปัจจุบันไม่มีบริดจ์ TCP อีกต่อไป Node เชื่อมต่อผ่าน WebSocket ของ Gateway คีย์ bridge.* ไม่ได้เป็นส่วนหนึ่งของสคีมาการกำหนดค่าอีกต่อไป (การตรวจสอบความถูกต้องจะล้มเหลวจนกว่าจะนำคีย์ออก โดย openclaw doctor --fix สามารถลบคีย์ที่ไม่รู้จักได้)
การกำหนดค่าบริดจ์แบบเดิม (ข้อมูลอ้างอิงย้อนหลัง)
{"bridge": { "enabled": true, "port": 18790, "bind": "tailnet", "tls": { "enabled": true, "autoGenerate": true }}}Cron
{ cron: { enabled: true, webhook: "https://example.invalid/legacy", // ตัวสำรองที่เลิกใช้แล้วสำหรับงานที่จัดเก็บไว้ซึ่งมี notify:true webhookToken: "replace-with-dedicated-token", // โทเค็น bearer ที่เลือกใช้ได้สำหรับการยืนยันตัวตนของ webhook ขาออก sessionRetention: "24h", // สตริงระยะเวลาหรือ false },}sessionRetention: ระยะเวลาที่เก็บเซสชันการทำงาน cron แบบแยกที่เสร็จสิ้นแล้ว ก่อนตัดแถวเซสชันใน SQLite ออก นอกจากนี้ยังควบคุมการล้างทรานสคริปต์ cron ที่ถูกลบและเก็บถาวร ค่าเริ่มต้น:24h; ตั้งค่าเป็นfalseเพื่อปิดใช้งาน- ประวัติการทำงานจะเก็บแถวสถานะสิ้นสุดล่าสุด 2000 แถวต่องานโดยอัตโนมัติ แถวที่สูญหายยังคงมีช่วงเวลาล้างข้อมูล 24 ชั่วโมง
webhookToken: โทเค็น bearer ที่ใช้สำหรับการส่ง POST ของ cron webhook (delivery.mode = "webhook") หากละไว้จะไม่มีการส่งส่วนหัวการยืนยันตัวตนwebhook: URL webhook สำรองแบบเดิมที่เลิกใช้แล้ว (http/https) ซึ่งopenclaw doctor --fixใช้ย้ายงานที่จัดเก็บไว้และยังมีnotify: true; การส่งขณะรันไทม์ใช้delivery.mode="webhook"รายงานร่วมกับdelivery.toหรือใช้delivery.completionDestinationเมื่อคงการส่งแบบประกาศไว้
cron.failureAlert
{ cron: { failureAlert: { enabled: false, after: 3, cooldownMs: 3600000, includeSkipped: false, mode: "announce", accountId: "main", }, },}enabled: เปิดการแจ้งเตือนความล้มเหลวสำหรับงาน cron (ค่าเริ่มต้น:false)after: จำนวนความล้มเหลวต่อเนื่องก่อนเรียกใช้การแจ้งเตือน (จำนวนเต็มบวก ค่าต่ำสุด:1)cooldownMs: จำนวนมิลลิวินาทีขั้นต่ำระหว่างการแจ้งเตือนซ้ำสำหรับงานเดียวกัน (จำนวนเต็มที่ไม่ติดลบ)includeSkipped: นับการทำงานที่ข้ามติดต่อกันรวมในเกณฑ์การแจ้งเตือน (ค่าเริ่มต้น:false) การทำงานที่ข้ามจะถูกติดตามแยกต่างหากและไม่ส่งผลต่อการหน่วงถอยหลังเมื่อเกิดข้อผิดพลาดในการดำเนินการmode: โหมดการส่ง -"announce"ส่งผ่านข้อความในช่องทาง ส่วน"webhook"โพสต์ไปยัง webhook ที่กำหนดค่าไว้accountId: รหัสบัญชีหรือช่องทางที่เลือกใช้ได้เพื่อจำกัดขอบเขตการส่งการแจ้งเตือน
cron.failureDestination
{ cron: { failureDestination: { mode: "announce", channel: "last", to: "channel:C1234567890", accountId: "main", }, },}- ปลายทางเริ่มต้นสำหรับการแจ้งเตือนความล้มเหลวของ cron ในทุกงาน
mode:"announce"หรือ"webhook"; มีค่าเริ่มต้นเป็น"announce"เมื่อมีข้อมูลเป้าหมายเพียงพอchannel: การแทนที่ช่องทางสำหรับการส่งแบบประกาศ"last"ใช้ช่องทางการส่งล่าสุดที่ทราบซ้ำto: เป้าหมายการประกาศหรือ URL webhook ที่ระบุอย่างชัดเจน จำเป็นสำหรับโหมด webhookaccountId: การแทนที่บัญชีสำหรับการส่งที่เลือกใช้ได้delivery.failureDestinationรายงานจะแทนที่ค่าเริ่มต้นส่วนกลางนี้- เมื่อไม่ได้ตั้งค่าปลายทางความล้มเหลวทั้งส่วนกลางและรายงาน งานที่ส่งผ่าน
announceอยู่แล้วจะใช้เป้าหมายการประกาศหลักนั้นเป็นตัวสำรองเมื่อเกิดความล้มเหลว delivery.failureDestinationรองรับเฉพาะงานsessionTarget="isolated"เว้นแต่delivery.modeหลักของงานจะเป็น"webhook"
ดู งาน Cron การดำเนินการ cron แบบแยกจะถูกติดตามเป็น งานเบื้องหลัง
ตัวแปรเทมเพลตโมเดลสื่อ
ตัวยึดตำแหน่งของเทมเพลตที่ถูกขยายใน tools.media.models[].args:
| ตัวแปร | คำอธิบาย |
|---|---|
{{Body}} |
เนื้อหาข้อความขาเข้าทั้งหมด |
{{RawBody}} |
เนื้อหาดิบ (ไม่มีตัวครอบประวัติ/ผู้ส่ง) |
{{BodyStripped}} |
เนื้อหาที่นำการกล่าวถึงกลุ่มออกแล้ว |
{{From}} |
ตัวระบุผู้ส่ง |
{{To}} |
ตัวระบุปลายทาง |
{{MessageSid}} |
รหัสข้อความในช่องทาง |
{{SessionId}} |
UUID ของเซสชันปัจจุบัน |
{{IsNewSession}} |
"true" เมื่อสร้างเซสชันใหม่ |
{{MediaUrl}} |
URL จำลองของสื่อขาเข้า |
{{MediaPath}} |
พาธสื่อภายในเครื่อง |
{{MediaType}} |
ประเภทสื่อ (รูปภาพ/เสียง/เอกสาร/…) |
{{Transcript}} |
ทรานสคริปต์เสียง |
{{Prompt}} |
พรอมต์สื่อที่แปลงค่าแล้วสำหรับรายการ CLI |
{{MaxChars}} |
จำนวนอักขระเอาต์พุตสูงสุดที่แปลงค่าแล้วสำหรับรายการ CLI |
{{ChatType}} |
"direct" หรือ "group" |
{{GroupSubject}} |
หัวข้อกลุ่ม (เท่าที่ทำได้) |
{{GroupMembers}} |
ตัวอย่างสมาชิกกลุ่ม (เท่าที่ทำได้) |
{{SenderName}} |
ชื่อที่แสดงของผู้ส่ง (เท่าที่ทำได้) |
{{SenderE164}} |
หมายเลขโทรศัพท์ของผู้ส่ง (เท่าที่ทำได้) |
{{Provider}} |
คำใบ้ผู้ให้บริการ (whatsapp, telegram, discord เป็นต้น) |
การรวมไฟล์การกำหนดค่า ($include)
แยกการกำหนดค่าออกเป็นหลายไฟล์:
// ~/.openclaw/openclaw.json{ gateway: { port: 18789 }, agents: { $include: "./agents.json5" }, broadcast: { $include: ["./clients/mueller.json5", "./clients/schmidt.json5"], },}ลักษณะการผสาน:
- ไฟล์เดียว: แทนที่ออบเจ็กต์ที่ครอบอยู่
- อาร์เรย์ของไฟล์: ผสานแบบลึกตามลำดับ (รายการหลังแทนที่รายการก่อน)
- คีย์ระดับเดียวกัน: ผสานหลังการรวมไฟล์ (แทนที่ค่าที่รวมเข้ามา)
- การรวมไฟล์แบบซ้อน: ลึกได้สูงสุด 10 ระดับ
- พาธ: แปลงค่าโดยอิงกับไฟล์ที่ทำการรวม แต่ต้องอยู่ภายในไดเรกทอรีการกำหนดค่าระดับบนสุด (
dirnameของopenclaw.json) รูปแบบพาธแบบสัมบูรณ์/../อนุญาตเฉพาะเมื่อยังแปลงค่าไปอยู่ภายในขอบเขตดังกล่าว ตั้งค่าOPENCLAW_INCLUDE_ROOTS(พาธสัมบูรณ์) เพื่ออนุญาตรูทเพิ่มเติมภายนอกไดเรกทอรีการกำหนดค่า - ขีดจำกัด: พาธต้องไม่มีไบต์ null และต้องสั้นกว่า 4096 อักขระอย่างเคร่งครัดทั้งก่อนและหลังการแปลงค่า แต่ละไฟล์ที่รวมมีขนาดสูงสุด 2 MB
- การเขียนที่ OpenClaw เป็นเจ้าของ ซึ่งเปลี่ยนเฉพาะส่วนระดับบนสุดหนึ่งส่วนที่ใช้การรวมไฟล์เดียว จะเขียนผ่านไปยังไฟล์ที่รวมเข้ามานั้น ตัวอย่างเช่น
plugins installอัปเดตplugins: { $include: "./plugins.json5" }ในplugins.json5และคงopenclaw.jsonไว้เหมือนเดิม - การรวมที่รูท อาร์เรย์การรวม และการรวมที่มีการแทนที่ด้วยคีย์ระดับเดียวกัน เป็นแบบอ่านอย่างเดียวสำหรับการเขียนที่ OpenClaw เป็นเจ้าของ การเขียนเหล่านั้นจะปฏิเสธอย่างปลอดภัยแทนการทำให้การกำหนดค่าแบนราบ
- ข้อผิดพลาด: ข้อความชัดเจนสำหรับไฟล์ที่หายไป ข้อผิดพลาดในการแยกวิเคราะห์ การรวมแบบวนซ้ำ รูปแบบพาธที่ไม่ถูกต้อง และความยาวที่มากเกินไป