Gateway
การกำหนดค่า
OpenClaw อ่านการกำหนดค่า JSON5 แบบไม่บังคับจาก ~/.openclaw/openclaw.json.
พาธการกำหนดค่าที่ใช้งานอยู่ต้องเป็นไฟล์ปกติ เลย์เอาต์ openclaw.json
ที่เป็น symlink ไม่รองรับสำหรับการเขียนที่ OpenClaw เป็นเจ้าของ การเขียนแบบอะตอมิกอาจแทนที่
พาธแทนการรักษา symlink ไว้ หากคุณเก็บการกำหนดค่าไว้นอกไดเรกทอรีสถานะ
เริ่มต้น ให้ชี้ OPENCLAW_CONFIG_PATH ไปยังไฟล์จริงโดยตรง
หากไม่มีไฟล์ OpenClaw จะใช้ค่าเริ่มต้นที่ปลอดภัย เหตุผลทั่วไปในการเพิ่มการกำหนดค่า:
- เชื่อมต่อช่องทางและควบคุมว่าใครสามารถส่งข้อความถึงบอทได้
- ตั้งค่าโมเดล เครื่องมือ sandboxing หรือระบบอัตโนมัติ (cron, hooks)
- ปรับแต่งเซสชัน สื่อ เครือข่าย หรือ UI
ดูเอกสารอ้างอิงฉบับเต็มสำหรับทุกฟิลด์ที่มี
เอเจนต์และระบบอัตโนมัติควรใช้ config.schema.lookup เพื่อดูเอกสารระดับฟิลด์
ที่แม่นยำก่อนแก้ไขการกำหนดค่า ใช้หน้านี้สำหรับคำแนะนำตามงาน และ
เอกสารอ้างอิงการกำหนดค่า สำหรับแผนที่
ฟิลด์และค่าเริ่มต้นที่กว้างขึ้น
การกำหนดค่าขั้นต่ำ
// ~/.openclaw/openclaw.json{ agents: { defaults: { workspace: "~/.openclaw/workspace" } }, channels: { whatsapp: { allowFrom: ["+15555550123"] } },}การแก้ไขการกำหนดค่า
วิซาร์ดแบบโต้ตอบ
openclaw onboard # full onboarding flowopenclaw configure # config wizardCLI (คำสั่งบรรทัดเดียว)
openclaw config get agents.defaults.workspaceopenclaw config set agents.defaults.heartbeat.every "2h"openclaw config unset plugins.entries.brave.config.webSearch.apiKeyUI ควบคุม
เปิด http://127.0.0.1:18789 แล้วใช้แท็บ การกำหนดค่า
UI ควบคุมจะแสดงฟอร์มจากสคีมาการกำหนดค่าสด รวมถึงเมทาดาทาเอกสาร
title / description ของฟิลด์ รวมถึงสคีมาของ Plugin และช่องทางเมื่อ
มีให้ใช้งาน พร้อมตัวแก้ไข Raw JSON เป็นทางออกสำรอง สำหรับ UI แบบเจาะลึก
และเครื่องมืออื่น Gateway ยังเปิดให้ใช้ config.schema.lookup เพื่อ
ดึงโหนดสคีมาที่จำกัดตามพาธหนึ่งรายการ พร้อมสรุปลูกโดยตรง
แก้ไขโดยตรง
แก้ไข ~/.openclaw/openclaw.json โดยตรง Gateway จะเฝ้าดูไฟล์และนำการเปลี่ยนแปลงไปใช้โดยอัตโนมัติ (ดู hot reload)
การตรวจสอบความถูกต้องแบบเข้มงวด
openclaw config schema พิมพ์ JSON Schema แบบ canonical ที่ใช้โดย UI ควบคุม
และการตรวจสอบความถูกต้อง config.schema.lookup ดึงโหนดเดียวที่จำกัดตามพาธพร้อม
สรุปลูกสำหรับเครื่องมือแบบเจาะลึก เมทาดาทาเอกสาร title/description ของฟิลด์
จะส่งต่อผ่านอ็อบเจกต์ซ้อน wildcard (*), array-item ([]) และกิ่ง anyOf/
oneOf/allOf สคีมาของ Runtime Plugin และช่องทางจะถูกผสานเข้ามาเมื่อโหลด
registry ของ manifest แล้ว
เมื่อการตรวจสอบความถูกต้องล้มเหลว:
- Gateway จะไม่บูต
- ใช้ได้เฉพาะคำสั่งวินิจฉัย (
openclaw doctor,openclaw logs,openclaw health,openclaw status) - เรียกใช้
openclaw doctorเพื่อดูปัญหาที่แน่นอน - เรียกใช้
openclaw doctor --fix(หรือ--yes) เพื่อใช้การซ่อมแซม
Gateway เก็บสำเนาที่เชื่อถือได้ซึ่งใช้งานได้ล่าสุดหลังการเริ่มทำงานสำเร็จแต่ละครั้ง
แต่การเริ่มทำงานและ hot reload จะไม่กู้คืนสำเนานั้นโดยอัตโนมัติ หาก openclaw.json
ตรวจสอบความถูกต้องไม่ผ่าน (รวมถึงการตรวจสอบภายใน Plugin) การเริ่มทำงานของ Gateway จะล้มเหลว หรือ
การโหลดซ้ำจะถูกข้ามและ Runtime ปัจจุบันจะคงการกำหนดค่าที่รับไว้ล่าสุดไว้
เรียกใช้ openclaw doctor --fix (หรือ --yes) เพื่อซ่อมแซมการกำหนดค่าที่มีคำนำหน้าหรือถูกทับ
หรือกู้คืนสำเนาที่ใช้งานได้ล่าสุด การเลื่อนสถานะเป็นสำเนาที่ใช้งานได้ล่าสุดจะถูกข้ามเมื่อ
ตัวเลือกมี placeholder ความลับที่ถูกปกปิด เช่น ***
งานทั่วไป
ตั้งค่าช่องทาง (WhatsApp, Telegram, Discord ฯลฯ)
แต่ละช่องทางมีส่วนการกำหนดค่าของตัวเองภายใต้ channels.<provider> ดูหน้าช่องทางเฉพาะสำหรับขั้นตอนการตั้งค่า:
- WhatsApp -
channels.whatsapp - Telegram -
channels.telegram - Discord -
channels.discord - Feishu -
channels.feishu - Google Chat -
channels.googlechat - Microsoft Teams -
channels.msteams - Slack -
channels.slack - Signal -
channels.signal - iMessage -
channels.imessage - Mattermost -
channels.mattermost
ทุกช่องทางใช้รูปแบบนโยบาย DM เดียวกัน:
{ channels: { telegram: { enabled: true, botToken: "123:abc", dmPolicy: "pairing", // pairing | allowlist | open | disabled allowFrom: ["tg:123"], // only for allowlist/open }, },}เลือกและกำหนดค่าโมเดล
ตั้งค่าโมเดลหลักและ fallback แบบไม่บังคับ:
{ agents: { defaults: { model: { primary: "anthropic/claude-sonnet-4-6", fallbacks: ["openai/gpt-5.4"], }, models: { "anthropic/claude-sonnet-4-6": { alias: "Sonnet" }, "openai/gpt-5.4": { alias: "GPT" }, }, }, },}agents.defaults.modelsกำหนดแคตตาล็อกโมเดลและทำหน้าที่เป็น allowlist สำหรับ/model; รายการprovider/*จะกรอง/model,/modelsและตัวเลือกโมเดลให้เหลือ provider ที่เลือกไว้ โดยยังคงใช้การค้นพบโมเดลแบบไดนามิก- ใช้
openclaw config set agents.defaults.models '<json>' --strict-json --mergeเพื่อเพิ่มรายการ allowlist โดยไม่ลบโมเดลที่มีอยู่ การแทนที่แบบธรรมดาที่จะลบรายการจะถูกปฏิเสธ เว้นแต่คุณส่ง--replace - Model refs ใช้รูปแบบ
provider/model(เช่นanthropic/claude-opus-4-6) agents.defaults.imageMaxDimensionPxควบคุมการลดขนาดภาพใน transcript/tool (ค่าเริ่มต้น1200); ค่าที่ต่ำกว่ามักลดการใช้ vision-token ในการรันที่มีภาพหน้าจอจำนวนมาก- ดู Models CLI สำหรับการสลับโมเดลในแชต และ Model Failover สำหรับการหมุนเวียน auth และพฤติกรรม fallback
- สำหรับ provider แบบกำหนดเอง/โฮสต์เอง ดู provider แบบกำหนดเอง ในเอกสารอ้างอิง
ควบคุมว่าใครสามารถส่งข้อความถึงบอทได้
การเข้าถึง DM ถูกควบคุมต่อช่องทางผ่าน dmPolicy:
"pairing"(ค่าเริ่มต้น): ผู้ส่งที่ไม่รู้จักจะได้รับรหัส pairing แบบใช้ครั้งเดียวเพื่ออนุมัติ"allowlist": เฉพาะผู้ส่งในallowFrom(หรือ paired allow store)"open": อนุญาต DM ขาเข้าทั้งหมด (ต้องมีallowFrom: ["*"])"disabled": เพิกเฉยต่อ DM ทั้งหมด
สำหรับกลุ่ม ให้ใช้ groupPolicy + groupAllowFrom หรือ allowlist เฉพาะช่องทาง
ดูเอกสารอ้างอิงฉบับเต็มสำหรับรายละเอียดรายช่องทาง
ตั้งค่าการควบคุมการกล่าวถึงในแชตกลุ่ม
ข้อความกลุ่มมีค่าเริ่มต้นเป็น ต้องกล่าวถึง กำหนดค่ารูปแบบ trigger ต่อเอเจนต์ และให้การตอบกลับในห้องที่มองเห็นได้อยู่บนพาธเครื่องมือข้อความเริ่มต้น เว้นแต่คุณตั้งใจต้องการการตอบกลับสุดท้ายอัตโนมัติแบบเดิม:
{ messages: { visibleReplies: "automatic", // set "message_tool" to require message-tool sends everywhere groupChat: { visibleReplies: "message_tool", // default; use "automatic" for legacy room replies }, }, agents: { list: [ { id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"], }, }, ], }, channels: { whatsapp: { groups: { "*": { requireMention: true } }, }, },}- การกล่าวถึงด้วยเมทาดาทา: @-mentions แบบ native (WhatsApp tap-to-mention, Telegram @bot ฯลฯ)
- รูปแบบข้อความ: รูปแบบ regex ที่ปลอดภัยใน
mentionPatterns - การตอบกลับที่มองเห็นได้:
messages.visibleRepliesสามารถกำหนดให้ใช้การส่งด้วยเครื่องมือข้อความทั่วทั้งระบบ;messages.groupChat.visibleRepliesจะแทนที่ค่านั้นสำหรับกลุ่ม/ช่องทาง - ดูเอกสารอ้างอิงฉบับเต็มสำหรับโหมดการตอบกลับที่มองเห็นได้ การแทนที่รายช่องทาง และโหมด self-chat
จำกัด Skills ต่อเอเจนต์
ใช้ agents.defaults.skills สำหรับ baseline ที่ใช้ร่วมกัน จากนั้นแทนที่เอเจนต์
เฉพาะด้วย agents.list[].skills:
{ agents: { defaults: { skills: ["github", "weather"], }, list: [ { id: "writer" }, // inherits github, weather { id: "docs", skills: ["docs-search"] }, // replaces defaults { id: "locked-down", skills: [] }, // no skills ], },}- ละเว้น
agents.defaults.skillsเพื่อให้ Skills ไม่ถูกจำกัดตามค่าเริ่มต้น - ละเว้น
agents.list[].skillsเพื่อสืบทอดค่าเริ่มต้น - ตั้งค่า
agents.list[].skills: []เพื่อไม่ให้มี Skills - ดู Skills, การกำหนดค่า Skills และ เอกสารอ้างอิงการกำหนดค่า
ปรับแต่งการเฝ้าติดตามสุขภาพช่องทางของ Gateway
ควบคุมว่า Gateway จะรีสตาร์ตช่องทางที่ดูค้างอย่างเข้มงวดแค่ไหน:
{ gateway: { channelHealthCheckMinutes: 5, channelStaleEventThresholdMinutes: 30, channelMaxRestartsPerHour: 10, }, channels: { telegram: { healthMonitor: { enabled: false }, accounts: { alerts: { healthMonitor: { enabled: true }, }, }, }, },}- ตั้งค่า
gateway.channelHealthCheckMinutes: 0เพื่อปิดการรีสตาร์ตโดย health-monitor ทั่วทั้งระบบ channelStaleEventThresholdMinutesควรมากกว่าหรือเท่ากับช่วงเวลาการตรวจสอบ- ใช้
channels.<provider>.healthMonitor.enabledหรือchannels.<provider>.accounts.<id>.healthMonitor.enabledเพื่อปิดการรีสตาร์ตอัตโนมัติสำหรับช่องทางหรือบัญชีหนึ่งรายการโดยไม่ปิดตัวเฝ้าติดตามทั่วทั้งระบบ - ดู Health Checks สำหรับการดีบักเชิงปฏิบัติการ และเอกสารอ้างอิงฉบับเต็มสำหรับทุกฟิลด์
ปรับแต่ง timeout การ handshake ของ WebSocket สำหรับ Gateway
ให้ไคลเอนต์ local มีเวลามากขึ้นในการทำ pre-auth WebSocket handshake บน โฮสต์ที่โหลดสูงหรือมีกำลังประมวลผลต่ำ:
{ gateway: { handshakeTimeoutMs: 30000, },}- ค่าเริ่มต้นคือ
15000มิลลิวินาที OPENCLAW_HANDSHAKE_TIMEOUT_MSยังคงมีลำดับความสำคัญสูงกว่าสำหรับการแทนที่ service หรือ shell แบบครั้งเดียว- ควรแก้ปัญหา startup/event-loop stall ก่อน ปุ่มปรับนี้มีไว้สำหรับโฮสต์ที่สุขภาพดีแต่ช้าระหว่าง warmup
กำหนดค่าเซสชันและการรีเซ็ต
เซสชันควบคุมความต่อเนื่องและการแยกกันของบทสนทนา:
{ session: { dmScope: "per-channel-peer", // recommended for multi-user threadBindings: { enabled: true, idleHours: 24, maxAgeHours: 0, }, reset: { mode: "daily", atHour: 4, idleMinutes: 120, }, },}dmScope:main(ใช้ร่วมกัน) |per-peer|per-channel-peer|per-account-channel-peerthreadBindings: ค่าเริ่มต้นส่วนกลางสำหรับการกำหนดเส้นทางเซสชันที่ผูกกับเธรด (Discord รองรับ/focus,/unfocus,/agents,/session idleและ/session max-age)- ดู การจัดการเซสชัน สำหรับขอบเขต ลิงก์ตัวตน และนโยบายการส่ง
- ดู อ้างอิงฉบับเต็ม สำหรับฟิลด์ทั้งหมด
Enable sandboxing
เรียกใช้เซสชันเอเจนต์ในรันไทม์ sandbox ที่แยกออกจากกัน:
{ agents: { defaults: { sandbox: { mode: "non-main", // off | non-main | all scope: "agent", // session | agent | shared }, }, },}สร้างอิมเมจก่อน - จาก checkout ซอร์สให้เรียกใช้ scripts/sandbox-setup.sh หรือจากการติดตั้ง npm ให้ดูคำสั่ง docker build แบบ inline ใน Sandboxing § อิมเมจและการตั้งค่า
ดู Sandboxing สำหรับคู่มือฉบับเต็ม และ อ้างอิงฉบับเต็ม สำหรับตัวเลือกทั้งหมด
Enable relay-backed push for official iOS builds
push ที่มี relay รองรับถูกกำหนดค่าใน openclaw.json
ตั้งค่านี้ในการกำหนดค่า Gateway:
{ gateway: { push: { apns: { relay: { baseUrl: "https://relay.example.com", // Optional. Default: 10000 timeoutMs: 10000, }, }, }, },}คำสั่ง CLI ที่เทียบเท่า:
openclaw config set gateway.push.apns.relay.baseUrl https://relay.example.comสิ่งที่ค่านี้ทำ:
- อนุญาตให้ Gateway ส่ง
push.test, การสะกิดให้ตื่น และการปลุกเพื่อเชื่อมต่อใหม่ผ่าน relay ภายนอก - ใช้สิทธิ์อนุญาตส่งที่อยู่ในขอบเขตการลงทะเบียน ซึ่งส่งต่อโดยแอป iOS ที่จับคู่ไว้ Gateway ไม่จำเป็นต้องมีโทเค็น relay ระดับการปรับใช้ทั้งระบบ
- ผูกการลงทะเบียนแต่ละรายการที่มี relay รองรับกับตัวตน Gateway ที่แอป iOS จับคู่ด้วย เพื่อให้ Gateway อื่นไม่สามารถใช้การลงทะเบียนที่จัดเก็บไว้ซ้ำได้
- คงบิลด์ iOS แบบ local/manual ไว้บน APNs โดยตรง การส่งที่มี relay รองรับจะใช้เฉพาะกับบิลด์ที่แจกจ่ายอย่างเป็นทางการซึ่งลงทะเบียนผ่าน relay เท่านั้น
- ต้องตรงกับ URL ฐานของ relay ที่ฝังอยู่ในบิลด์ iOS อย่างเป็นทางการ/TestFlight เพื่อให้ทราฟฟิกการลงทะเบียนและการส่งไปถึงการปรับใช้ relay เดียวกัน
โฟลว์ตั้งแต่ต้นจนจบ:
- ติดตั้งบิลด์ iOS อย่างเป็นทางการ/TestFlight ที่คอมไพล์ด้วย URL ฐานของ relay เดียวกัน
- กำหนดค่า
gateway.push.apns.relay.baseUrlบน Gateway - จับคู่แอป iOS กับ Gateway และให้ทั้งเซสชัน node และ operator เชื่อมต่อ
- แอป iOS ดึงตัวตน Gateway, ลงทะเบียนกับ relay โดยใช้ App Attest พร้อมใบเสร็จของแอป แล้วเผยแพร่ payload
push.apns.registerที่มี relay รองรับไปยัง Gateway ที่จับคู่ไว้ - Gateway จัดเก็บ relay handle และสิทธิ์อนุญาตส่ง จากนั้นใช้สำหรับ
push.test, การสะกิดให้ตื่น และการปลุกเพื่อเชื่อมต่อใหม่
หมายเหตุด้านการปฏิบัติงาน:
- หากคุณสลับแอป iOS ไปยัง Gateway อื่น ให้เชื่อมต่อแอปใหม่เพื่อให้แอปเผยแพร่การลงทะเบียน relay ใหม่ที่ผูกกับ Gateway นั้นได้
- หากคุณส่งบิลด์ iOS ใหม่ที่ชี้ไปยังการปรับใช้ relay อื่น แอปจะรีเฟรชการลงทะเบียน relay ที่แคชไว้แทนการใช้ต้นทาง relay เดิมซ้ำ
หมายเหตุด้านความเข้ากันได้:
OPENCLAW_APNS_RELAY_BASE_URLและOPENCLAW_APNS_RELAY_TIMEOUT_MSยังใช้งานได้เป็นการ override ผ่าน env ชั่วคราวOPENCLAW_APNS_RELAY_ALLOW_HTTP=trueยังคงเป็นช่องทางหลบสำหรับการพัฒนาแบบ loopback เท่านั้น อย่าบันทึก URL relay แบบ HTTP ไว้ในการกำหนดค่า
ดู แอป iOS สำหรับโฟลว์ตั้งแต่ต้นจนจบ และ โฟลว์การยืนยันตัวตนและความไว้วางใจ สำหรับโมเดลความปลอดภัยของ relay
Set up heartbeat (periodic check-ins)
{ agents: { defaults: { heartbeat: { every: "30m", target: "last", }, }, },}every: สตริงระยะเวลา (30m,2h) ตั้งค่าเป็น0mเพื่อปิดใช้งานtarget:last|none|<channel-id>(ตัวอย่างเช่นdiscord,matrix,telegramหรือwhatsapp)directPolicy:allow(ค่าเริ่มต้น) หรือblockสำหรับเป้าหมาย Heartbeat แบบ DM- ดู Heartbeat สำหรับคู่มือฉบับเต็ม
Configure cron jobs
{ cron: { enabled: true, maxConcurrentRuns: 2, // cron dispatch + isolated cron agent-turn execution sessionRetention: "24h", runLog: { maxBytes: "2mb", keepLines: 2000, }, },}sessionRetention: ล้างเซสชันการรันแบบแยกที่เสร็จแล้วออกจากsessions.json(ค่าเริ่มต้น24h; ตั้งค่าเป็นfalseเพื่อปิดใช้งาน)runLog: ล้างcron/runs/<jobId>.jsonlตามขนาดและจำนวนบรรทัดที่คงไว้- ดู งาน Cron สำหรับภาพรวมฟีเจอร์และตัวอย่าง CLI
Set up webhooks (hooks)
เปิดใช้งาน endpoint HTTP Webhook บน Gateway:
{ hooks: { enabled: true, token: "shared-secret", path: "/hooks", defaultSessionKey: "hook:ingress", allowRequestSessionKey: false, allowedSessionKeyPrefixes: ["hook:"], mappings: [ { match: { path: "gmail" }, action: "agent", agentId: "main", deliver: true, }, ], },}หมายเหตุด้านความปลอดภัย:
- ถือว่าเนื้อหา payload ของ hook/webhook ทั้งหมดเป็นอินพุตที่ไม่น่าเชื่อถือ
- ใช้
hooks.tokenเฉพาะ อย่านำโทเค็น Gateway ที่ใช้ร่วมกันมาใช้ซ้ำ - การยืนยันตัวตนของ hook ใช้เฉพาะ header (
Authorization: Bearer ...หรือx-openclaw-token); โทเค็นใน query string จะถูกปฏิเสธ hooks.pathไม่สามารถเป็น/ได้ ให้เก็บทางเข้า webhook ไว้ใน subpath เฉพาะ เช่น/hooks- ปิดแฟล็กข้ามเนื้อหาที่ไม่ปลอดภัยไว้ (
hooks.gmail.allowUnsafeExternalContent,hooks.mappings[].allowUnsafeExternalContent) เว้นแต่จะดีบักในขอบเขตที่จำกัดอย่างเข้มงวด - หากคุณเปิดใช้
hooks.allowRequestSessionKeyให้ตั้งค่าhooks.allowedSessionKeyPrefixesด้วย เพื่อจำกัดคีย์เซสชันที่ผู้เรียกเลือกได้ - สำหรับเอเจนต์ที่ขับเคลื่อนด้วย hook ให้ใช้ tier โมเดลสมัยใหม่ที่แข็งแรงและนโยบายเครื่องมือที่เข้มงวดเป็นหลัก (เช่น อนุญาตเฉพาะการส่งข้อความ พร้อม sandboxing เมื่อเป็นไปได้)
ดู อ้างอิงฉบับเต็ม สำหรับตัวเลือก mapping ทั้งหมดและการเชื่อมต่อ Gmail
Configure multi-agent routing
เรียกใช้เอเจนต์ที่แยกออกจากกันหลายตัว โดยมี workspace และเซสชันแยกกัน:
{ agents: { list: [ { id: "home", default: true, workspace: "~/.openclaw/workspace-home" }, { id: "work", workspace: "~/.openclaw/workspace-work" }, ], }, bindings: [ { agentId: "home", match: { channel: "whatsapp", accountId: "personal" } }, { agentId: "work", match: { channel: "whatsapp", accountId: "biz" } }, ],}ดู หลายเอเจนต์ และ อ้างอิงฉบับเต็ม สำหรับกฎการผูกและโปรไฟล์การเข้าถึงรายเอเจนต์
Split config into multiple files ($include)
ใช้ $include เพื่อจัดระเบียบ config ขนาดใหญ่:
// ~/.openclaw/openclaw.json{ gateway: { port: 18789 }, agents: { $include: "./agents.json5" }, broadcast: { $include: ["./clients/a.json5", "./clients/b.json5"], },}- ไฟล์เดียว: แทนที่ object ที่ครอบอยู่
- อาร์เรย์ของไฟล์: deep-merge ตามลำดับ (รายการหลังชนะ)
- คีย์ข้างเคียง: merge หลัง includes (override ค่าที่ include มา)
- include ซ้อนกัน: รองรับได้ลึกสูงสุด 10 ระดับ
- พาธสัมพัทธ์: resolve โดยอิงจากไฟล์ที่ include
- การเขียนที่ OpenClaw เป็นเจ้าของ: เมื่อการเขียนเปลี่ยนเฉพาะส่วน top-level หนึ่งส่วน
ที่รองรับด้วย single-file include เช่น
plugins: { $include: "./plugins.json5" }, OpenClaw จะอัปเดตไฟล์ที่ include นั้น และปล่อยopenclaw.jsonไว้เหมือนเดิม - write-through ที่ไม่รองรับ: root includes, include arrays และ includes ที่มี sibling overrides จะ fail closed สำหรับการเขียนที่ OpenClaw เป็นเจ้าของ แทนที่จะ flatten config
- การจำกัดขอบเขต: พาธ
$includeต้อง resolve อยู่ภายใต้ไดเรกทอรีที่มีopenclaw.jsonหากต้องการแชร์ tree ระหว่างเครื่องหรือผู้ใช้ ให้ตั้งค่าOPENCLAW_INCLUDE_ROOTSเป็น path-list (:บน POSIX,;บน Windows) ของ ไดเรกทอรีเพิ่มเติมที่ includes อาจอ้างอิงได้ Symlink จะถูก resolve และตรวจสอบซ้ำ ดังนั้นพาธที่ตามตัวอักษรอยู่ใน config dir แต่ target จริง หลุดออกจาก root ที่อนุญาตทั้งหมดจะยังคงถูกปฏิเสธ - การจัดการข้อผิดพลาด: ข้อผิดพลาดที่ชัดเจนสำหรับไฟล์ที่หายไป ข้อผิดพลาดในการ parse และ circular includes
Config hot reload
Gateway เฝ้าดู ~/.openclaw/openclaw.json และนำการเปลี่ยนแปลงไปใช้โดยอัตโนมัติ - การตั้งค่าส่วนใหญ่ไม่ต้อง restart ด้วยตนเอง
การแก้ไขไฟล์โดยตรงจะถือว่าไม่น่าเชื่อถือจนกว่าจะผ่านการตรวจสอบ watcher จะรอ
ให้การเขียนไฟล์ชั่วคราว/การ rename จาก editor สงบลง อ่านไฟล์สุดท้าย และปฏิเสธ
การแก้ไขภายนอกที่ไม่ถูกต้องโดยไม่เขียน openclaw.json ใหม่ การเขียน config
ที่ OpenClaw เป็นเจ้าของใช้ schema gate เดียวกันก่อนเขียน; การ clobber แบบทำลาย เช่น
การลบ gateway.mode หรือการลดขนาดไฟล์ลงมากกว่าครึ่ง จะถูกปฏิเสธและ
บันทึกเป็น .rejected.* เพื่อให้ตรวจสอบ
หากคุณเห็น config reload skipped (invalid config) หรือ startup รายงาน Invalid config ให้ตรวจสอบ config, เรียกใช้ openclaw config validate จากนั้นเรียกใช้ openclaw doctor --fix เพื่อซ่อมแซม ดู การแก้ไขปัญหา Gateway
สำหรับ checklist
โหมดการ reload
| โหมด | พฤติกรรม |
|---|---|
hybrid (ค่าเริ่มต้น) |
hot-apply การเปลี่ยนแปลงที่ปลอดภัยทันที restart อัตโนมัติสำหรับการเปลี่ยนแปลงที่สำคัญ |
hot |
hot-apply เฉพาะการเปลี่ยนแปลงที่ปลอดภัย บันทึกคำเตือนเมื่อจำเป็นต้อง restart - คุณจัดการเอง |
restart |
restart Gateway เมื่อ config เปลี่ยนแปลงใด ๆ ไม่ว่าจะปลอดภัยหรือไม่ |
off |
ปิดการเฝ้าดูไฟล์ การเปลี่ยนแปลงจะมีผลเมื่อ restart ด้วยตนเองครั้งถัดไป |
{ gateway: { reload: { mode: "hybrid", debounceMs: 300 }, },}สิ่งที่ hot-apply ได้กับสิ่งที่ต้อง restart
ฟิลด์ส่วนใหญ่ hot-apply ได้โดยไม่มี downtime ในโหมด hybrid การเปลี่ยนแปลงที่ต้อง restart จะถูกจัดการโดยอัตโนมัติ
| หมวดหมู่ | ฟิลด์ | ต้อง restart หรือไม่ |
|---|---|---|
| ช่องทาง | channels.*, web (WhatsApp) - ช่องทาง built-in และ Plugin ทั้งหมด |
ไม่ |
| เอเจนต์และโมเดล | agent, agents, models, routing |
ไม่ |
| Automation | hooks, cron, agent.heartbeat |
ไม่ |
| เซสชันและข้อความ | session, messages |
ไม่ |
| เครื่องมือและสื่อ | tools, browser, skills, mcp, audio, talk |
ไม่ |
| UI และอื่น ๆ | ui, logging, identity, bindings |
ไม่ |
| เซิร์ฟเวอร์ Gateway | gateway.* (port, bind, auth, tailscale, TLS, HTTP) |
ใช่ |
| โครงสร้างพื้นฐาน | discovery, plugins |
ใช่ |
การวางแผนการโหลดซ้ำ
เมื่อคุณแก้ไขไฟล์ซอร์สที่ถูกอ้างอิงผ่าน $include OpenClaw จะวางแผน
การโหลดซ้ำจากเลย์เอาต์ที่เขียนไว้ในซอร์ส ไม่ใช่มุมมองในหน่วยความจำที่ถูกทำให้แบนแล้ว
วิธีนี้ทำให้การตัดสินใจโหลดซ้ำแบบทันที (นำไปใช้ทันทีเทียบกับรีสตาร์ท) คาดเดาได้
แม้เมื่อส่วนระดับบนสุดเพียงส่วนเดียวอยู่ในไฟล์ที่ include แยกต่างหาก เช่น
plugins: { $include: "./plugins.json5" } การวางแผนการโหลดซ้ำจะล้มเหลวแบบปิดหาก
เลย์เอาต์ซอร์สกำกวม
RPC การกำหนดค่า (การอัปเดตผ่านโปรแกรม)
สำหรับเครื่องมือที่เขียนการกำหนดค่าผ่าน Gateway API ให้ใช้โฟลว์นี้เป็นหลัก:
config.schema.lookupเพื่อตรวจสอบซับทรีหนึ่งรายการ (โหนดสคีมาแบบตื้น + สรุปลูก)config.getเพื่อดึงสแนปช็อตปัจจุบันพร้อมhashconfig.patchสำหรับการอัปเดตบางส่วน (แพตช์ผสาน JSON: ออบเจ็กต์ผสานกัน,nullลบค่า, อาร์เรย์แทนที่ค่าเดิม)config.applyเฉพาะเมื่อคุณตั้งใจจะแทนที่การกำหนดค่าทั้งหมดupdate.runสำหรับการอัปเดตตัวเองพร้อมรีสตาร์ทแบบชัดเจน; ใส่continuationMessageเมื่อเซสชันหลังรีสตาร์ทควรรันเทิร์นติดตามผลหนึ่งครั้งupdate.statusเพื่อตรวจสอบตัวบ่งชี้การรีสตาร์ทของการอัปเดตล่าสุดและยืนยันเวอร์ชันที่กำลังรันหลังรีสตาร์ท
Agents ควรถือว่า config.schema.lookup เป็นจุดเริ่มต้นแรกสำหรับเอกสารและข้อจำกัด
ระดับฟิลด์ที่แน่นอน ใช้ ข้อมูลอ้างอิงการกำหนดค่า
เมื่อต้องการแผนผังการกำหนดค่าที่กว้างขึ้น ค่าเริ่มต้น หรือลิงก์ไปยังข้อมูลอ้างอิง
ของระบบย่อยเฉพาะ
ตัวอย่างแพตช์บางส่วน:
openclaw gateway call config.get --params '{}' # capture payload.hashopenclaw gateway call config.patch --params '{ "raw": "{ channels: { telegram: { groups: { \"*\": { requireMention: false } } } } }", "baseHash": "<hash>"}'ทั้ง config.apply และ config.patch รับ raw, baseHash, sessionKey,
note และ restartDelayMs ต้องมี baseHash สำหรับทั้งสองเมธอดเมื่อ
มีการกำหนดค่าอยู่แล้ว
ตัวแปรสภาพแวดล้อม
OpenClaw อ่านตัวแปรสภาพแวดล้อมจากโปรเซสแม่ รวมถึง:
.envจากไดเรกทอรีทำงานปัจจุบัน (ถ้ามี)~/.openclaw/.env(ค่าทดแทนส่วนกลาง)
ทั้งสองไฟล์จะไม่เขียนทับตัวแปรสภาพแวดล้อมที่มีอยู่ คุณยังตั้งค่าตัวแปรสภาพแวดล้อมแบบอินไลน์ในการกำหนดค่าได้:
{ env: { OPENROUTER_API_KEY: "sk-or-...", vars: { GROQ_API_KEY: "gsk-..." }, },}การนำเข้าตัวแปรสภาพแวดล้อมของเชลล์ (ไม่บังคับ)
หากเปิดใช้และคีย์ที่คาดไว้ยังไม่ได้ตั้งค่า OpenClaw จะรัน login shell ของคุณและนำเข้าเฉพาะคีย์ที่ขาดอยู่:
{env: { shellEnv: { enabled: true, timeoutMs: 15000 },},}ตัวแปรสภาพแวดล้อมที่เทียบเท่า: OPENCLAW_LOAD_SHELL_ENV=1
การแทนที่ตัวแปรสภาพแวดล้อมในค่าการกำหนดค่า
อ้างอิงตัวแปรสภาพแวดล้อมในค่าสตริงของการกำหนดค่าใดก็ได้ด้วย ${VAR_NAME}:
{gateway: { auth: { token: "${OPENCLAW_GATEWAY_TOKEN}" } },models: { providers: { custom: { apiKey: "${CUSTOM_API_KEY}" } } },}กฎ:
- จับคู่เฉพาะชื่อที่เป็นตัวพิมพ์ใหญ่:
[A-Z_][A-Z0-9_]* - ตัวแปรที่ขาดหรือว่างจะทำให้เกิดข้อผิดพลาดในเวลาโหลด
- escape ด้วย
$${VAR}สำหรับเอาต์พุตตามตัวอักษร - ทำงานภายในไฟล์
$include - การแทนที่แบบอินไลน์:
"${BASE}/v1"→"https://api.example.com/v1"
การอ้างอิงความลับ (env, file, exec)
สำหรับฟิลด์ที่รองรับออบเจ็กต์ SecretRef คุณใช้ได้ดังนี้:
{models: { providers: { openai: { apiKey: { source: "env", provider: "default", id: "OPENAI_API_KEY" } }, },},skills: { entries: { "image-lab": { apiKey: { source: "file", provider: "filemain", id: "/skills/entries/image-lab/apiKey", }, }, },},channels: { googlechat: { serviceAccountRef: { source: "exec", provider: "vault", id: "channels/googlechat/serviceAccount", }, },},}รายละเอียด SecretRef (รวมถึง secrets.providers สำหรับ env/file/exec) อยู่ใน การจัดการความลับ
เส้นทางข้อมูลรับรองที่รองรับแสดงอยู่ใน พื้นผิวข้อมูลรับรอง SecretRef
ดู สภาพแวดล้อม สำหรับลำดับความสำคัญและแหล่งที่มาแบบเต็ม
ข้อมูลอ้างอิงฉบับเต็ม
สำหรับข้อมูลอ้างอิงแบบครบถ้วนแยกตามฟิลด์ โปรดดู ข้อมูลอ้างอิงการกำหนดค่า
ที่เกี่ยวข้อง: ตัวอย่างการกำหนดค่า · ข้อมูลอ้างอิงการกำหนดค่า · Doctor