Gateway
ข้อมูลอ้างอิงการกำหนดค่า
ข้อมูลอ้างอิงคอนฟิกหลักสำหรับ ~/.openclaw/openclaw.json หากต้องการภาพรวมตามงานที่ต้องทำ โปรดดู การกำหนดค่า
ครอบคลุมพื้นผิวคอนฟิกหลักของ OpenClaw และลิงก์ออกไปเมื่อระบบย่อยมีข้อมูลอ้างอิงเชิงลึกของตัวเอง แคตตาล็อกคำสั่งที่ช่องทางและ Plugin เป็นเจ้าของ รวมถึงตัวเลือกเชิงลึกของหน่วยความจำ/QMD อยู่ในหน้าของตัวเอง ไม่ได้อยู่ในหน้านี้
แหล่งความจริงของโค้ด:
openclaw config schemaพิมพ์ JSON Schema สดที่ใช้สำหรับการตรวจสอบความถูกต้องและ Control UI พร้อมรวมเมตาดาตาของบันเดิล/Plugin/ช่องทางเมื่อมีconfig.schema.lookupส่งคืนโหนดสคีมาหนึ่งรายการที่มีขอบเขตตามพาธสำหรับเครื่องมือเจาะลึกpnpm config:docs:check/pnpm config:docs:genตรวจสอบแฮชฐานอ้างอิงของเอกสารคอนฟิกเทียบกับพื้นผิวสคีมาปัจจุบัน
พาธค้นหาของเอเจนต์: ใช้แอ็กชันเครื่องมือ gateway ชื่อ config.schema.lookup สำหรับ
เอกสารและข้อจำกัดระดับฟิลด์ที่แม่นยำก่อนแก้ไข ใช้
การกำหนดค่า สำหรับคำแนะนำตามงานที่ต้องทำ และหน้านี้
สำหรับแผนที่ฟิลด์ที่กว้างกว่า ค่าเริ่มต้น และลิงก์ไปยังข้อมูลอ้างอิงของระบบย่อย
ข้อมูลอ้างอิงเชิงลึกเฉพาะด้าน:
- ข้อมูลอ้างอิงการกำหนดค่าหน่วยความจำ สำหรับ
agents.defaults.memorySearch.*,memory.qmd.*,memory.citationsและคอนฟิก Dreaming ใต้plugins.entries.memory-core.config.dreaming - คำสั่งสแลช สำหรับแคตตาล็อกคำสั่งในตัว + บันเดิลปัจจุบัน
- หน้าของช่องทาง/Plugin เจ้าของ สำหรับพื้นผิวคำสั่งเฉพาะช่องทาง
รูปแบบคอนฟิกคือ JSON5 (อนุญาตคอมเมนต์ + จุลภาคท้ายรายการ) ฟิลด์ทั้งหมดเป็นตัวเลือก - OpenClaw ใช้ค่าเริ่มต้นที่ปลอดภัยเมื่อไม่ได้ระบุ
ช่องทาง
คีย์คอนฟิกต่อช่องทางถูกย้ายไปยังหน้าเฉพาะ - ดู
การกำหนดค่า - ช่องทาง สำหรับ channels.*
รวมถึง Slack, Discord, Telegram, WhatsApp, Matrix, iMessage และช่องทางบันเดิลอื่นๆ
(การยืนยันตัวตน, การควบคุมการเข้าถึง, หลายบัญชี, การกำกับการ mention)
ค่าเริ่มต้นของเอเจนต์, หลายเอเจนต์, เซสชัน และข้อความ
ย้ายไปยังหน้าเฉพาะแล้ว - ดู การกำหนดค่า - เอเจนต์ สำหรับ:
agents.defaults.*(พื้นที่ทำงาน, โมเดล, การคิด, Heartbeat, หน่วยความจำ, สื่อ, Skills, sandbox)multiAgent.*(การกำหนดเส้นทางและการผูกหลายเอเจนต์)session.*(วงจรชีวิตเซสชัน, Compaction, การตัดแต่ง)messages.*(การส่งข้อความ, TTS, การเรนเดอร์มาร์กดาวน์)talk.*(โหมด Talk)talk.consultThinkingLevel: การแทนที่ระดับการคิดสำหรับการรันเอเจนต์ OpenClaw เต็มรูปแบบเบื้องหลัง Control UI Talk realtime consultstalk.consultFastMode: การแทนที่โหมดเร็วแบบครั้งเดียวสำหรับ Control UI Talk realtime consultstalk.speechLocale: รหัสภาษา BCP 47 แบบเลือกได้สำหรับการรู้จำเสียงพูดของ Talk บน iOS/macOStalk.silenceTimeoutMs: เมื่อไม่ได้ตั้งค่า Talk จะคงหน้าต่างหยุดพักเริ่มต้นของแพลตฟอร์มก่อนส่งทรานสคริปต์ (700 ms on macOS and Android, 900 ms on iOS)talk.realtime.consultRouting: การสำรองการส่งต่อของ Gateway สำหรับทรานสคริปต์ realtime Talk ที่สรุปแล้วและข้ามopenclaw_agent_consult
เครื่องมือและผู้ให้บริการกำหนดเอง
นโยบายเครื่องมือ, สวิตช์ทดลอง, คอนฟิกเครื่องมือที่มีผู้ให้บริการรองรับ และการตั้งค่า ผู้ให้บริการกำหนดเอง / base-URL ถูกย้ายไปยังหน้าเฉพาะแล้ว - ดู การกำหนดค่า - เครื่องมือและผู้ให้บริการกำหนดเอง
โมเดล
คำจำกัดความของผู้ให้บริการ, allowlist ของโมเดล และการตั้งค่าผู้ให้บริการกำหนดเองอยู่ใน
การกำหนดค่า - เครื่องมือและผู้ให้บริการกำหนดเอง
รูท models ยังเป็นเจ้าของพฤติกรรมแคตตาล็อกโมเดลส่วนกลางด้วย
{ models: { // Optional. Default: true. Requires a Gateway restart when changed. pricing: { enabled: false }, },}models.mode: พฤติกรรมแคตตาล็อกผู้ให้บริการ (mergeหรือreplace)models.providers: แมปผู้ให้บริการกำหนดเองที่มีคีย์เป็นรหัสผู้ให้บริการmodels.providers.*.localService: ตัวจัดการกระบวนการตามต้องการแบบเลือกได้สำหรับ เซิร์ฟเวอร์โมเดลในเครื่อง OpenClaw ตรวจสอบ endpoint สุขภาพที่กำหนดค่าไว้ เริ่มcommandแบบพาธสัมบูรณ์เมื่อจำเป็น รอจนพร้อม แล้วจึงส่งคำขอโมเดล ดู บริการโมเดลในเครื่องmodels.pricing.enabled: ควบคุมการบูตสแตรปราคาเบื้องหลังที่ เริ่มหลังจาก sidecar และช่องทางเข้าสู่พาธพร้อมใช้งานของ Gateway เมื่อเป็นfalseGateway จะข้ามการดึงแคตตาล็อกราคาของ OpenRouter และ LiteLLM; ค่าmodels.providers.*.models[].costที่กำหนดค่าไว้ยังคงใช้ได้สำหรับการประมาณต้นทุนในเครื่อง
MCP
คำจำกัดความเซิร์ฟเวอร์ MCP ที่ OpenClaw จัดการอยู่ใต้ mcp.servers และถูก
ใช้โดย OpenClaw แบบฝังและอะแดปเตอร์รันไทม์อื่นๆ คำสั่ง openclaw mcp list,
show, set และ unset จัดการบล็อกนี้โดยไม่เชื่อมต่อกับ
เซิร์ฟเวอร์เป้าหมายระหว่างแก้ไขคอนฟิก
{ mcp: { // Optional. Default: 600000 ms (10 minutes). Set 0 to disable idle eviction. sessionIdleTtlMs: 600000, servers: { docs: { command: "npx", args: ["-y", "@modelcontextprotocol/server-fetch"], }, remote: { url: "https://example.com/mcp", transport: "streamable-http", // streamable-http | sse timeout: 20, connectTimeout: 5, 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_*"], }, // Optional Codex app-server projection controls. codex: { agents: ["main"], defaultToolsApprovalMode: "approve", // auto | prompt | approve }, }, }, },}mcp.servers: คำจำกัดความเซิร์ฟเวอร์ MCP แบบ stdio หรือรีโมตที่มีชื่อ สำหรับรันไทม์ที่ เปิดเผยเครื่องมือ MCP ที่กำหนดค่าไว้ รายการรีโมตใช้transport: "streamable-http"หรือtransport: "sse";type: "http"เป็นนามแฝงแบบ CLI-native ที่openclaw mcp setและopenclaw doctor --fixทำให้เป็นฟิลด์transportมาตรฐานmcp.servers.<name>.enabled: ตั้งเป็นfalseเพื่อเก็บคำจำกัดความเซิร์ฟเวอร์ที่บันทึกไว้ ในขณะที่ยกเว้นออกจากการค้นพบ MCP แบบฝังของ OpenClaw และการฉายเครื่องมือmcp.servers.<name>.timeout/requestTimeoutMs: timeout ของคำขอ MCP ต่อเซิร์ฟเวอร์ เป็นวินาทีหรือมิลลิวินาทีmcp.servers.<name>.connectTimeout/connectionTimeoutMs: timeout การเชื่อมต่อต่อเซิร์ฟเวอร์ เป็นวินาทีหรือมิลลิวินาทีmcp.servers.<name>.supportsParallelToolCalls: คำใบ้การทำงานพร้อมกันแบบเลือกได้สำหรับ อะแดปเตอร์ที่เลือกได้ว่าจะเรียกเครื่องมือ MCP แบบขนานหรือไม่mcp.servers.<name>.auth: ตั้งเป็น"oauth"สำหรับเซิร์ฟเวอร์ HTTP MCP ที่ต้องใช้ OAuth รันopenclaw mcp login <name>เพื่อเก็บโทเคนไว้ใต้สถานะ OpenClawmcp.servers.<name>.oauth: การแทนที่ scope ของ OAuth, URL redirect และ URL เมตาดาตาไคลเอนต์แบบเลือกได้mcp.servers.<name>.sslVerify,clientCert,clientKey: ตัวควบคุม HTTP TLS สำหรับ endpoint ส่วนตัวและ mutual TLSmcp.servers.<name>.toolFilter: การเลือกเครื่องมือต่อเซิร์ฟเวอร์แบบเลือกได้includeจำกัดเครื่องมือ MCP ที่ค้นพบให้เหลือเฉพาะชื่อที่ตรงกัน;excludeซ่อนชื่อที่ตรงกัน รายการเป็นชื่อเครื่องมือ MCP แบบตรงตัวหรือ glob*แบบง่าย เซิร์ฟเวอร์ที่มี resources หรือ prompts ยังสร้างชื่อเครื่องมืออรรถประโยชน์ (resources_list,resources_read,prompts_list,prompts_get) และชื่อเหล่านั้นใช้ ตัวกรองเดียวกันmcp.servers.<name>.codex: ตัวควบคุมการฉาย Codex app-server แบบเลือกได้ บล็อกนี้เป็นเมตาดาตา OpenClaw สำหรับเธรด Codex app-server เท่านั้น; ไม่ได้ ส่งผลต่อเซสชัน ACP, คอนฟิก Codex harness ทั่วไป หรืออะแดปเตอร์รันไทม์อื่นๆcodex.agentsที่ไม่ว่างจะจำกัดเซิร์ฟเวอร์ให้กับรหัสเอเจนต์ OpenClaw ที่ระบุไว้ รายการเอเจนต์ที่มีขอบเขตว่าง เปล่า หรือไม่ถูกต้องจะถูกปฏิเสธโดยการตรวจสอบคอนฟิก และถูกละเว้นโดยพาธการฉายของรันไทม์ แทนที่จะกลายเป็นแบบทั่วโลกcodex.defaultToolsApprovalModeส่งออกdefault_tools_approval_modeของ Codex สำหรับเซิร์ฟเวอร์นั้น OpenClaw ตัดบล็อกcodexออกก่อนส่งคอนฟิกmcp_serversแบบเนทีฟให้ Codex ละเว้นบล็อกนี้เพื่อ ให้เซิร์ฟเวอร์ถูกฉายสำหรับทุกเอเจนต์ Codex app-server ด้วยพฤติกรรมการอนุมัติ MCP เริ่มต้นของ Codexmcp.sessionIdleTtlMs: TTL เมื่อไม่ได้ใช้งานสำหรับรันไทม์ MCP แบบบันเดิลที่มีขอบเขตเซสชัน การรันแบบฝังครั้งเดียวจะขอการล้างข้อมูลเมื่อจบการรัน; TTL นี้เป็นตัวสำรองสำหรับ เซสชันที่มีอายุยาวและผู้เรียกในอนาคต- การเปลี่ยนแปลงใต้
mcp.*นำไปใช้ทันทีโดย dispose รันไทม์ MCP ของเซสชันที่แคชไว้ การค้นพบ/ใช้เครื่องมือครั้งถัดไปจะสร้างใหม่จากคอนฟิกใหม่ ดังนั้นรายการmcp.serversที่ถูกลบจะถูกเก็บกวาดทันที แทนที่จะรอ TTL เมื่อไม่ได้ใช้งาน - การค้นพบของรันไทม์ยังเคารพการแจ้งเตือนการเปลี่ยนแปลงรายการเครื่องมือ MCP โดยทิ้ง แคตตาล็อกที่แคชไว้สำหรับเซสชันนั้น เซิร์ฟเวอร์ที่ประกาศ resources หรือ prompts จะได้รับเครื่องมืออรรถประโยชน์สำหรับแสดงรายการ/อ่าน resources และแสดงรายการ/ดึง prompts ความล้มเหลวของการเรียกเครื่องมือซ้ำๆ จะพักเซิร์ฟเวอร์ที่ได้รับผลกระทบชั่วคราวก่อน พยายามเรียกอีกครั้ง
ดู 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" }, // or plaintext string env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" }, }, peekaboo: { enabled: true }, sag: { enabled: false }, }, },}allowBundled: allowlist แบบเลือกได้สำหรับ Skills แบบบันเดิลเท่านั้น (Skills ที่จัดการ/ในพื้นที่ทำงานไม่ได้รับผลกระทบ)load.extraDirs: รูท Skills ที่ใช้ร่วมกันเพิ่มเติม (ลำดับความสำคัญต่ำสุด)load.allowSymlinkTargets: รูทเป้าหมายจริงที่เชื่อถือได้ ซึ่ง symlink ของ Skills อาจ resolve เข้าไปได้เมื่อลิงก์อยู่นอกรูทแหล่งที่มาที่กำหนดค่าไว้workshop.allowSymlinkTargetWrites: อนุญาตให้ Skill Workshop apply เขียน ผ่านเป้าหมาย symlink ที่เชื่อถือแล้ว (ค่าเริ่มต้น: false)install.preferBrew: เมื่อเป็น true ให้เลือกตัวติดตั้ง Homebrew ก่อนเมื่อมีbrewแล้วจึง fallback ไปยังชนิดตัวติดตั้งอื่นinstall.nodeManager: ค่ากำหนดตัวติดตั้ง Node สำหรับสเปกmetadata.openclaw.install(npm|pnpm|yarn|bun)install.allowUploadedArchives: อนุญาตให้ไคลเอนต์ Gateway ที่เชื่อถือได้ระดับoperator.adminติดตั้ง zip archive ส่วนตัวที่ staging ผ่านskills.upload.*(ค่าเริ่มต้น: false) สิ่งนี้เปิดใช้เฉพาะพาธ uploaded-archive; การติดตั้ง ClawHub ตามปกติไม่ต้องใช้entries.<skillKey>.enabled: falseปิดใช้งาน Skill แม้ว่าจะบันเดิล/ติดตั้งแล้วก็ตามentries.<skillKey>.apiKey: ทางลัดสำหรับ Skills ที่ประกาศ env var หลัก (สตริง plaintext หรือออบเจกต์ SecretRef)
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ระดับบนสุด เพื่อไม่ให้สคริปต์ช่วยเหลือในรากเหล่านั้นขัดขวางการเริ่มต้น - การค้นพบรองรับ OpenClaw plugins แบบเนทีฟ รวมถึง Codex bundles และ Claude bundles ที่เข้ากันได้ รวมถึง Claude default-layout bundles ที่ไม่มี manifest
- การเปลี่ยนแปลง config ต้อง restart gateway
allow: allowlist แบบไม่บังคับ (โหลดเฉพาะ plugins ที่ระบุ)denyมีลำดับความสำคัญเหนือกว่าplugins.entries.<id>.apiKey: ฟิลด์อำนวยความสะดวกระดับ plugin สำหรับ API key (เมื่อ plugin รองรับ)plugins.entries.<id>.env: แมป env var ที่จำกัดขอบเขตตาม pluginplugins.entries.<id>.hooks.allowPromptInjection: เมื่อเป็นfalsecore จะบล็อกbefore_prompt_buildและละเว้นฟิลด์ที่แก้ไข prompt จากbefore_agent_startแบบ legacy ขณะยังคงรักษาmodelOverrideและproviderOverrideแบบ legacy ไว้ ใช้กับ native plugin hooks และไดเรกทอรี hook ที่มาจาก bundle ซึ่งรองรับplugins.entries.<id>.hooks.allowConversationAccess: เมื่อเป็นtrueplugins ที่เชื่อถือได้และไม่ใช่ bundled อาจอ่านข้อความสนทนาดิบจาก typed hooks เช่นllm_input,llm_output,before_model_resolve,before_agent_reply,before_agent_run,before_agent_finalizeและagent_endplugins.entries.<id>.subagent.allowModelOverride: เชื่อถือ plugin นี้อย่างชัดเจนให้ร้องขอการ overrideproviderและmodelต่อ run สำหรับ background subagent runsplugins.entries.<id>.subagent.allowedModels: allowlist แบบไม่บังคับของเป้าหมายprovider/modelแบบ canonical สำหรับ subagent overrides ที่เชื่อถือได้ ใช้"*"เฉพาะเมื่อคุณตั้งใจอนุญาตให้ใช้ model ใดก็ได้plugins.entries.<id>.llm.allowModelOverride: เชื่อถือ plugin นี้อย่างชัดเจนให้ร้องขอ model overrides สำหรับapi.runtime.llm.completeplugins.entries.<id>.llm.allowedModels: allowlist แบบไม่บังคับของเป้าหมายprovider/modelแบบ canonical สำหรับ plugin LLM completion overrides ที่เชื่อถือได้ ใช้"*"เฉพาะเมื่อคุณตั้งใจอนุญาตให้ใช้ model ใดก็ได้plugins.entries.<id>.llm.allowAgentIdOverride: เชื่อถือ plugin นี้อย่างชัดเจนให้ runapi.runtime.llm.completeกับ agent id ที่ไม่ใช่ค่าเริ่มต้นplugins.entries.<id>.config: ออบเจ็กต์ config ที่ plugin กำหนด (ตรวจสอบความถูกต้องด้วย schema ของ native OpenClaw plugin เมื่อมี)- การตั้งค่าบัญชี/runtime ของ channel plugin อยู่ภายใต้
channels.<id>และควรถูกอธิบายโดย metadatachannelConfigsใน manifest ของ plugin เจ้าของ ไม่ใช่โดย registry ตัวเลือก OpenClaw ส่วนกลาง
Config ของ Codex harness plugin
Plugin codex ที่ bundled เป็นเจ้าของการตั้งค่า native Codex app-server harness ภายใต้
plugins.entries.codex.config ดู
ข้อมูลอ้างอิง Codex harness สำหรับพื้นผิว config ทั้งหมด
และ Codex harness สำหรับ runtime model
codexPlugins ใช้เฉพาะกับ sessions ที่เลือก native Codex harness
ไม่เปิดใช้งาน Codex plugins สำหรับ OpenClaw provider runs, ACP
conversation bindings หรือ harness ใดๆ ที่ไม่ใช่ Codex
{ plugins: { entries: { codex: { enabled: true, config: { codexPlugins: { enabled: true, allow_destructive_actions: true, plugins: { "google-calendar": { enabled: true, marketplaceName: "openai-curated", pluginName: "google-calendar", allow_destructive_actions: false, }, }, }, }, }, }, },}plugins.entries.codex.config.codexPlugins.enabled: เปิดใช้งานการรองรับ plugin/app แบบ native Codex สำหรับ Codex harness ค่าเริ่มต้น:falseplugins.entries.codex.config.codexPlugins.allow_destructive_actions: นโยบาย destructive-action เริ่มต้นสำหรับ plugin app elicitations ที่ migrate แล้ว ใช้trueเพื่อยอมรับ safe Codex approval schemas โดยไม่ถาม,falseเพื่อปฏิเสธ,"auto"เพื่อส่งต่อ approvals ที่ Codex ต้องการผ่าน OpenClaw plugin approvals หรือ"always"เพื่อถามทุกการเขียน/destructive action ของ plugin โดยไม่มี durable approval โหมด"always"จะล้าง durable Codex per-tool approval overrides สำหรับ app ที่ได้รับผลกระทบก่อนเริ่ม thread ค่าเริ่มต้น:trueplugins.entries.codex.config.codexPlugins.plugins.<key>.enabled: เปิดใช้งาน รายการ plugin ที่ migrate แล้ว เมื่อ globalcodexPlugins.enabledเป็น true ด้วย ค่าเริ่มต้น:trueสำหรับรายการที่ระบุอย่างชัดเจนplugins.entries.codex.config.codexPlugins.plugins.<key>.marketplaceName: ตัวตน marketplace ที่เสถียร V1 รองรับเฉพาะ"openai-curated"plugins.entries.codex.config.codexPlugins.plugins.<key>.pluginName: ตัวตน Codex plugin ที่เสถียรจาก migration เช่น"google-calendar"plugins.entries.codex.config.codexPlugins.plugins.<key>.allow_destructive_actions: destructive-action override ต่อ plugin เมื่อเว้นไว้ จะใช้ค่า globalallow_destructive_actionsค่าแบบต่อ plugin รองรับนโยบายtrue,false,"auto"หรือ"always"เช่นเดียวกัน
codexPlugins.enabled คือคำสั่งเปิดใช้งานแบบ global รายการ plugin
ที่ migration เขียนไว้อย่างชัดเจนคือชุด durable install และสิทธิ์การ repair
ไม่รองรับ plugins["*"] ไม่มีสวิตช์ install และค่า local
marketplacePath ไม่ได้เป็นฟิลด์ config โดยตั้งใจ เพราะเป็นค่าเฉพาะ host
การตรวจ readiness ของ app/list ถูก cache ไว้หนึ่งชั่วโมงและ refresh
แบบ asynchronous เมื่อ stale config ของ Codex thread app ถูกคำนวณตอนสร้าง
session ของ Codex harness ไม่ใช่ทุก turn; ใช้ /new, /reset หรือ restart
gateway หลังเปลี่ยน native plugin config
plugins.entries.firecrawl.config.webFetch: การตั้งค่า provider web-fetch ของ FirecrawlapiKey: Firecrawl API key แบบไม่บังคับสำหรับ limit ที่สูงขึ้น (รับ SecretRef) fallback ไปที่plugins.entries.firecrawl.config.webSearch.apiKey, legacytools.web.fetch.firecrawl.apiKeyหรือ env varFIRECRAWL_API_KEYbaseUrl: URL ฐานของ Firecrawl API (ค่าเริ่มต้น:https://api.firecrawl.dev; overrides แบบ self-hosted ต้องชี้ไปยัง endpoint ส่วนตัว/ภายใน)onlyMainContent: ดึงเฉพาะเนื้อหาหลักจากหน้า (ค่าเริ่มต้น:true)maxAgeMs: อายุ cache สูงสุดเป็นมิลลิวินาที (ค่าเริ่มต้น:172800000/ 2 วัน)timeoutSeconds: timeout ของคำขอ scrape เป็นวินาที (ค่าเริ่มต้น:60)
plugins.entries.xai.config.xSearch: การตั้งค่า xAI X Search (Grok web search)enabled: เปิดใช้งาน X Search providermodel: Grok model ที่ใช้สำหรับ search (เช่น"grok-4-1-fast")
plugins.entries.memory-core.config.dreaming: การตั้งค่า memory dreaming ดู Dreaming สำหรับ phases และ thresholdsenabled: สวิตช์หลักของ dreaming (ค่าเริ่มต้นfalse)frequency: จังหวะ cron สำหรับ dreaming sweep แบบเต็มแต่ละครั้ง (ค่าเริ่มต้นคือ"0 3 * * *")model: Dream Diary subagent model override แบบไม่บังคับ ต้องใช้plugins.entries.memory-core.subagent.allowModelOverride: true; จับคู่กับallowedModelsเพื่อจำกัดเป้าหมาย ข้อผิดพลาด model-unavailable จะ retry หนึ่งครั้งด้วย model เริ่มต้นของ session; trust หรือ allowlist failures จะไม่ fallback แบบเงียบๆ- นโยบาย phase และ thresholds เป็นรายละเอียดการ implement (ไม่ใช่ config keys ที่แสดงต่อผู้ใช้)
- Config memory แบบเต็มอยู่ใน ข้อมูลอ้างอิงการตั้งค่า Memory:
agents.defaults.memorySearch.*memory.backendmemory.citationsmemory.qmd.*plugins.entries.memory-core.config.dreaming
- Claude bundle plugins ที่เปิดใช้งานแล้วยังสามารถเพิ่มค่าเริ่มต้น OpenClaw แบบ embedded จาก
settings.jsonได้ด้วย; OpenClaw ใช้ค่าเหล่านั้นเป็นการตั้งค่า agent ที่ sanitize แล้ว ไม่ใช่ raw OpenClaw config patches plugins.slots.memory: เลือก active memory plugin id หรือ"none"เพื่อปิดใช้งาน memory pluginsplugins.slots.contextEngine: เลือก active context engine plugin id; ค่าเริ่มต้นเป็น"legacy"เว้นแต่คุณติดตั้งและเลือก engine อื่น
ดู Plugins
Commitments
commitments ควบคุม follow-up memory ที่อนุมาน: OpenClaw สามารถตรวจพบ check-ins จาก conversation turns และส่งผ่าน heartbeat runs
commitments.enabled: เปิดใช้งานการดึงข้อมูลด้วย LLM แบบซ่อน การจัดเก็บ และการส่งผ่าน heartbeat สำหรับ inferred follow-up commitments ค่าเริ่มต้น:falsecommitments.maxPerDay: จำนวน inferred follow-up commitments สูงสุดที่ส่งต่อ agent session ในหนึ่งวันแบบ rolling ค่าเริ่มต้น:3
Browser
{ browser: { enabled: true, evaluateEnabled: true, defaultProfile: "user", ssrfPolicy: { // dangerouslyAllowPrivateNetwork: true, // opt in only for trusted private-network access // allowPrivateNetwork: true, // legacy alias // 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 --fn.tabCleanupเรียกคืนแท็บตัวแทนหลักที่ติดตามไว้หลังจากไม่ได้ใช้งานเป็นระยะเวลาหนึ่ง หรือเมื่อ เซสชันเกินขีดจำกัดของตน ตั้งค่าidleMinutes: 0หรือmaxTabsPerSession: 0เพื่อ ปิดใช้งานโหมดล้างข้อมูลแต่ละโหมดเหล่านั้นssrfPolicy.dangerouslyAllowPrivateNetworkจะถูกปิดใช้งานเมื่อไม่ได้ตั้งค่า ดังนั้นการนำทางของเบราว์เซอร์จึงเข้มงวดตามค่าเริ่มต้น- ตั้งค่า
ssrfPolicy.dangerouslyAllowPrivateNetwork: trueเฉพาะเมื่อคุณตั้งใจเชื่อถือการนำทางเบราว์เซอร์ผ่านเครือข่ายส่วนตัว - ในโหมดเข้มงวด endpoint โปรไฟล์ CDP ระยะไกล (
profiles.*.cdpUrl) จะอยู่ภายใต้การบล็อกเครือข่ายส่วนตัวแบบเดียวกันระหว่างการตรวจสอบการเข้าถึง/การค้นพบ ssrfPolicy.allowPrivateNetworkยังคงรองรับในฐานะ alias แบบเดิม- ในโหมดเข้มงวด ให้ใช้
ssrfPolicy.hostnameAllowlistและssrfPolicy.allowedHostnamesสำหรับข้อยกเว้นที่ระบุอย่างชัดเจน - โปรไฟล์ระยะไกลเป็นแบบแนบเท่านั้น (ปิดใช้งาน start/stop/reset)
profiles.*.cdpUrlรองรับhttp://,https://,ws://และwss://ใช้ HTTP(S) เมื่อคุณต้องการให้ OpenClaw ค้นพบ/json/version; ใช้ WS(S) เมื่อผู้ให้บริการของคุณให้ URL ของ DevTools WebSocket โดยตรงremoteCdpTimeoutMsและremoteCdpHandshakeTimeoutMsใช้กับการเข้าถึง CDP ระยะไกลและattachOnlyรวมถึงคำขอเปิดแท็บ โปรไฟล์ local loopback ที่จัดการอยู่ จะใช้ค่าเริ่มต้น CDP แบบโลคัลต่อไป- หากบริการ CDP ที่จัดการภายนอกเข้าถึงได้ผ่าน loopback ให้ตั้งค่า
attachOnly: trueของโปรไฟล์นั้น มิฉะนั้น OpenClaw จะถือว่าพอร์ต loopback เป็น โปรไฟล์เบราว์เซอร์โลคัลที่จัดการอยู่ และอาจรายงานข้อผิดพลาดความเป็นเจ้าของพอร์ตโลคัล - โปรไฟล์
existing-sessionใช้ Chrome MCP แทน CDP และสามารถแนบกับ โฮสต์ที่เลือกหรือผ่านโหนดเบราว์เซอร์ที่เชื่อมต่ออยู่ - โปรไฟล์
existing-sessionสามารถตั้งค่าuserDataDirเพื่อระบุเป้าหมายเป็น โปรไฟล์เบราว์เซอร์ที่ใช้ Chromium เฉพาะ เช่น Brave หรือ Edge - โปรไฟล์
existing-sessionสามารถตั้งค่าcdpUrlเมื่อ Chrome กำลังทำงานอยู่แล้ว อยู่เบื้องหลัง endpoint การค้นพบ DevTools HTTP(S) หรือ endpoint WS(S) โดยตรง ใน โหมดนั้น OpenClaw จะส่ง endpoint ให้ Chrome MCP แทนการใช้การเชื่อมต่ออัตโนมัติ;userDataDirจะถูกละเว้นสำหรับอาร์กิวเมนต์การเปิด Chrome MCP - โปรไฟล์
existing-sessionยังคงใช้ขีดจำกัดเส้นทาง Chrome MCP ปัจจุบัน: การกระทำที่ขับเคลื่อนด้วย snapshot/ref แทนการระบุเป้าหมายด้วย CSS-selector, ฮุกอัปโหลด ไฟล์เดียว, ไม่มีการ override timeout ของ dialog, ไม่มีwait --load networkidleและไม่มีresponsebody, การส่งออก PDF, การดักจับการดาวน์โหลด หรือการกระทำแบบชุด - โปรไฟล์
openclawโลคัลที่จัดการอยู่จะกำหนดcdpPortและcdpUrlโดยอัตโนมัติ; ตั้งค่าcdpUrlอย่างชัดเจนเฉพาะสำหรับโปรไฟล์ CDP ระยะไกลหรือการแนบ endpoint ของ existing-session - โปรไฟล์โลคัลที่จัดการอยู่สามารถตั้งค่า
executablePathเพื่อแทนที่ค่าbrowser.executablePathส่วนกลางสำหรับโปรไฟล์นั้น ใช้สิ่งนี้เพื่อเรียกใช้โปรไฟล์หนึ่งใน Chrome และอีกโปรไฟล์ใน Brave - โปรไฟล์โลคัลที่จัดการอยู่ใช้
browser.localLaunchTimeoutMsสำหรับการค้นพบ HTTP ของ Chrome CDP หลังจากเริ่มโปรเซส และใช้browser.localCdpReadyTimeoutMsสำหรับ ความพร้อมของ websocket CDP หลังการเปิด เพิ่มค่านี้บนโฮสต์ที่ช้ากว่า ซึ่ง Chrome เริ่มได้สำเร็จแต่การตรวจสอบความพร้อมแข่งกับช่วงเริ่มต้น ทั้งสองค่าต้องเป็น จำนวนเต็มบวกไม่เกิน120000ms; ค่าคอนฟิกที่ไม่ถูกต้องจะถูกปฏิเสธ - ลำดับการตรวจจับอัตโนมัติ: เบราว์เซอร์เริ่มต้นหากใช้ Chromium → Chrome → Brave → Edge → Chromium → Chrome Canary
- ทั้ง
browser.executablePathและbrowser.profiles.<name>.executablePathรองรับ~และ~/...สำหรับไดเรกทอรี home ของ OS ก่อนเปิด ChromiumuserDataDirรายโปรไฟล์บนโปรไฟล์existing-sessionจะถูกขยาย tilde ด้วยเช่นกัน - บริการควบคุม: loopback เท่านั้น (พอร์ตมาจาก
gateway.port, ค่าเริ่มต้น18791) extraArgsเพิ่มแฟล็กการเปิดเพิ่มเติมให้กับการเริ่มต้น Chromium โลคัล (เช่น--disable-gpu, การกำหนดขนาดหน้าต่าง หรือแฟล็ก debug)
UI
{ ui: { seamColor: "#FF4500", assistant: { name: "OpenClaw", avatar: "CB", // emoji, short text, image URL, or data URI }, },}seamColor: สีเน้นสำหรับโครม UI ของแอปเนทีฟ (สีอ่อนของฟอง Talk Mode เป็นต้น)assistant: การ override ตัวตนของ Control UI จะถอยกลับไปใช้ตัวตนของตัวแทนที่ใช้งานอยู่
Gateway
{ gateway: { mode: "local", // local | remote port: 18789, bind: "loopback", auth: { mode: "token", // none | token | password | trusted-proxy token: "your-token", // password: "your-password", // or OPENCLAW_GATEWAY_PASSWORD // trustedProxy: { userHeader: "x-forwarded-user" }, // for mode=trusted-proxy; see /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", // embedSandbox: "scripts", // strict | scripts | trusted // allowExternalEmbedUrls: false, // dangerous: allow absolute external http(s) embed URLs // chatMessageMaxWidth: "min(1280px, 82%)", // optional grouped chat message max-width // allowedOrigins: ["https://control.example.com"], // required for non-loopback Control UI // dangerouslyAllowHostHeaderOriginFallback: false, // dangerous Host-header origin fallback mode // allowInsecureAuth: false, // dangerouslyDisableDeviceAuth: false, }, remote: { url: "ws://127.0.0.1:18789", transport: "ssh", // ssh | direct token: "your-token", // password: "your-password", }, trustedProxies: ["10.0.0.1"], // Optional. Default false. allowRealIpFallback: false, nodes: { pairing: { // Optional. Default unset/disabled. autoApproveCidrs: ["192.168.1.0/24", "fd00:1234:5678::/64"], }, allowCommands: ["canvas.navigate"], denyCommands: ["system.run"], }, tools: { // Additional /tools/invoke HTTP denies deny: ["browser"], // Remove tools from the default HTTP deny list for owner/admin callers allow: ["gateway"], }, push: { apns: { relay: { baseUrl: "https://relay.example.com", timeoutMs: 10000, }, }, }, },}Gateway field details
mode:local(รัน gateway) หรือremote(เชื่อมต่อไปยัง remote gateway). Gateway จะปฏิเสธการเริ่มทำงานเว้นแต่จะเป็นlocal.port: พอร์ตเดียวแบบ multiplexed สำหรับ WS + HTTP. ลำดับความสำคัญ:--port>OPENCLAW_GATEWAY_PORT>gateway.port>18789.bind:auto,loopback(ค่าเริ่มต้น),lan(0.0.0.0),tailnet(Tailscale IP เท่านั้น), หรือcustom.- นามแฝง bind เดิม: ใช้ค่าโหมด bind ใน
gateway.bind(auto,loopback,lan,tailnet,custom) ไม่ใช่นามแฝง host (0.0.0.0,127.0.0.1,localhost,::,::1). - หมายเหตุ Docker: bind ค่าเริ่มต้น
loopbackจะ listen ที่127.0.0.1ภายในคอนเทนเนอร์ เมื่อใช้ Docker bridge networking (-p 18789:18789) ทราฟฟิกจะเข้ามาที่eth0ทำให้เข้าถึง gateway ไม่ได้ ใช้--network hostหรือตั้งค่าbind: "lan"(หรือbind: "custom"พร้อมcustomBindHost: "0.0.0.0") เพื่อ listen บนทุกอินเทอร์เฟซ. - Auth: จำเป็นโดยค่าเริ่มต้น bind ที่ไม่ใช่ loopback ต้องใช้ gateway auth ในทางปฏิบัติหมายถึง token/password ที่ใช้ร่วมกัน หรือ identity-aware reverse proxy พร้อม
gateway.auth.mode: "trusted-proxy"onboarding wizard จะสร้าง token เป็นค่าเริ่มต้น. - หากกำหนดค่าทั้ง
gateway.auth.tokenและgateway.auth.password(รวมถึง SecretRefs) ให้ตั้งค่าgateway.auth.modeอย่างชัดเจนเป็นtokenหรือpasswordขั้นตอน startup และการติดตั้ง/ซ่อมแซม service จะล้มเหลวเมื่อกำหนดค่าทั้งสองรายการและไม่ได้ตั้ง mode. gateway.auth.mode: "none": โหมดไม่มี auth แบบชัดเจน ใช้เฉพาะกับการตั้งค่า local loopback ที่เชื่อถือได้เท่านั้น โดยตั้งใจไม่เสนอใน onboarding prompts.gateway.auth.mode: "trusted-proxy": มอบหมาย browser/user auth ให้ identity-aware reverse proxy และเชื่อถือ identity headers จากgateway.trustedProxies(ดู Trusted Proxy Auth) โหมดนี้คาดหวัง proxy source ที่ ไม่ใช่ loopback โดยค่าเริ่มต้น; reverse proxies แบบ same-host loopback ต้องตั้งค่าgateway.auth.trustedProxy.allowLoopback = trueอย่างชัดเจน caller ภายใน same-host สามารถใช้gateway.auth.passwordเป็น local direct fallback ได้;gateway.auth.tokenยังคงใช้ร่วมกับ trusted-proxy mode ไม่ได้.gateway.auth.allowTailscale: เมื่อเป็นtrue, Tailscale Serve identity headers สามารถผ่าน Control UI/WebSocket auth ได้ (ตรวจสอบผ่านtailscale whois) HTTP API endpoints จะ ไม่ ใช้ Tailscale header auth นี้ แต่จะใช้ HTTP auth mode ปกติของ gateway แทน flow แบบไม่ใช้ token นี้ถือว่า gateway host เชื่อถือได้ ค่าเริ่มต้นเป็นtrueเมื่อtailscale.mode = "serve".gateway.auth.rateLimit: ตัวจำกัด failed-auth แบบเลือกใช้ได้ ใช้ต่อ client IP และต่อ auth scope (shared-secret และ device-token ถูกติดตามแยกกัน) ความพยายามที่ถูกบล็อกจะส่งคืน429+Retry-After.- บน path async Tailscale Serve Control UI ความพยายามที่ล้มเหลวสำหรับ
{scope, clientIp}เดียวกันจะถูก serialize ก่อนเขียน failure ดังนั้นความพยายามที่ผิดพลาดพร้อมกันจาก client เดียวกันอาจทำให้ limiter ทำงานที่คำขอที่สอง แทนที่ทั้งคู่จะแข่งกันผ่านไปเป็นเพียง mismatches. gateway.auth.rateLimit.exemptLoopbackมีค่าเริ่มต้นเป็นtrue; ตั้งเป็นfalseเมื่อคุณตั้งใจให้ทราฟฟิก localhost ถูก rate-limit ด้วย (สำหรับ test setups หรือ proxy deployments ที่เข้มงวด).- ความพยายาม WS auth จาก browser-origin จะถูก throttle เสมอโดยปิดการยกเว้น loopback (defense-in-depth ต่อการ brute force localhost จาก browser).
- บน loopback lockouts จาก browser-origin เหล่านั้นจะแยกตามค่า
Originที่ normalize แล้ว ดังนั้นการล้มเหลวซ้ำจาก localhost origin หนึ่งจะไม่ lock out origin อื่นโดยอัตโนมัติ. tailscale.mode:serve(tailnet เท่านั้น, loopback bind) หรือfunnel(สาธารณะ, ต้องใช้ auth).tailscale.serviceName: ชื่อ Tailscale Service แบบเลือกใช้ได้สำหรับ Serve mode เช่นsvc:openclawเมื่อตั้งค่าแล้ว OpenClaw จะส่งต่อไปยังtailscale serve --serviceเพื่อให้ Control UI เปิดเผยผ่าน Service ที่มีชื่อ แทน hostname ของอุปกรณ์ ค่าต้องใช้รูปแบบชื่อ Servicesvc:<dns-label>ของ Tailscale; startup จะรายงาน Service URL ที่ได้มา.tailscale.preserveFunnel: เมื่อเป็นtrueและtailscale.mode = "serve", OpenClaw จะตรวจสอบtailscale funnel statusก่อนใช้ Serve ซ้ำตอน startup และข้าม หาก Funnel route ที่กำหนดค่าจากภายนอกครอบคลุมพอร์ต gateway อยู่แล้ว ค่าเริ่มต้นfalse.controlUi.allowedOrigins: allowlist ของ browser-origin แบบชัดเจนสำหรับการเชื่อมต่อ Gateway WebSocket จำเป็นสำหรับ browser origins สาธารณะที่ไม่ใช่ loopback การโหลด UI แบบ private same-origin LAN/Tailnet จาก loopback, RFC1918/link-local,.local,.ts.net, หรือ Tailscale CGNAT hosts จะถูกยอมรับโดยไม่ต้องเปิด Host-header fallback.controlUi.chatMessageMaxWidth: max-width แบบเลือกใช้ได้สำหรับข้อความแชท Control UI ที่จัดกลุ่ม ยอมรับค่า CSS width ที่มีข้อจำกัด เช่น960px,82%,min(1280px, 82%), และcalc(100% - 2rem).controlUi.dangerouslyAllowHostHeaderOriginFallback: โหมดอันตรายที่เปิด Host-header origin fallback สำหรับ deployments ที่ตั้งใจพึ่งพา Host-header origin policy.remote.transport:ssh(ค่าเริ่มต้น) หรือdirect(ws/wss). สำหรับdirect,remote.urlต้องเป็นwss://สำหรับ hosts สาธารณะ; plaintextws://จะยอมรับเฉพาะสำหรับ loopback, LAN, link-local,.local,.ts.net, และ Tailscale CGNAT hosts.remote.remotePort: พอร์ต gateway บน remote SSH host ค่าเริ่มต้นคือ18789; ใช้ค่านี้เมื่อพอร์ต tunnel ภายในเครื่องแตกต่างจากพอร์ต remote gateway.gateway.remote.token/.passwordเป็นฟิลด์ credential ของ remote-client ไม่ได้กำหนดค่า gateway auth ด้วยตัวเอง.gateway.push.apns.relay.baseUrl: base HTTPS URL สำหรับ APNs relay ภายนอกที่ใช้หลังจาก relay-backed iOS builds เผยแพร่ registrations ไปยัง gateway Public App Store/TestFlight builds ใช้ OpenClaw relay ที่ hosted ไว้ Custom relay URLs ต้องตรงกับ iOS build/deployment path ที่แยกไว้อย่างตั้งใจ ซึ่ง relay URL ชี้ไปยัง relay นั้น.gateway.push.apns.relay.timeoutMs: timeout การส่งจาก gateway ไปยัง relay เป็นมิลลิวินาที ค่าเริ่มต้นคือ10000.- Relay-backed registrations ถูกมอบหมายให้ gateway identity เฉพาะ iOS app ที่จับคู่กันจะ fetch
gateway.identity.get, รวม identity นั้นใน relay registration, และ forward registration-scoped send grant ไปยัง gateway gateway อื่นไม่สามารถใช้ registration ที่เก็บไว้นั้นซ้ำได้. OPENCLAW_APNS_RELAY_BASE_URL/OPENCLAW_APNS_RELAY_TIMEOUT_MS: env overrides ชั่วคราวสำหรับ relay config ข้างต้น.OPENCLAW_APNS_RELAY_ALLOW_HTTP=true: escape hatch สำหรับ development เท่านั้นสำหรับ loopback HTTP relay URLs Production relay URLs ควรอยู่บน HTTPS.gateway.handshakeTimeoutMs: pre-auth Gateway WebSocket handshake timeout เป็นมิลลิวินาที ค่าเริ่มต้น:15000OPENCLAW_HANDSHAKE_TIMEOUT_MSมีลำดับความสำคัญเมื่อถูกตั้งค่า เพิ่มค่านี้บน hosts ที่โหลดสูงหรือพลังงานต่ำ ซึ่ง local clients สามารถเชื่อมต่อได้ขณะที่ startup warmup ยังนิ่งตัวไม่เสร็จ.gateway.channelHealthCheckMinutes: ช่วงเวลา health-monitor ของ channel เป็นนาที ตั้ง0เพื่อปิด health-monitor restarts ทั้งระบบ ค่าเริ่มต้น:5.gateway.channelStaleEventThresholdMinutes: threshold ของ stale-socket เป็นนาที ให้ค่านี้มากกว่าหรือเท่ากับgateway.channelHealthCheckMinutesค่าเริ่มต้น:30.gateway.channelMaxRestartsPerHour: จำนวน health-monitor restarts สูงสุดต่อ channel/account ใน rolling hour ค่าเริ่มต้น:10.channels.<provider>.healthMonitor.enabled: การ opt-out ราย channel สำหรับ health-monitor restarts โดยยังคงเปิด global monitor ไว้.channels.<provider>.accounts.<accountId>.healthMonitor.enabled: override ราย account สำหรับ channels แบบหลาย account เมื่อตั้งค่าแล้ว จะมีลำดับความสำคัญเหนือ override ระดับ channel.- path การเรียก gateway ภายในเครื่องสามารถใช้
gateway.remote.*เป็น fallback ได้เฉพาะเมื่อไม่ได้ตั้งค่าgateway.auth.*. - หาก
gateway.auth.token/gateway.auth.passwordถูกกำหนดค่าอย่างชัดเจนผ่าน SecretRef และ resolve ไม่ได้ การ resolve จะ fail closed (ไม่มี remote fallback มาบัง). trustedProxies: IP ของ reverse proxy ที่ terminate TLS หรือ inject forwarded-client headers ระบุเฉพาะ proxies ที่คุณควบคุม รายการ loopback ยังคงใช้ได้สำหรับ same-host proxy/local-detection setups (เช่น Tailscale Serve หรือ local reverse proxy) แต่รายการเหล่านี้ ไม่ ทำให้ loopback requests มีสิทธิ์ใช้gateway.auth.mode: "trusted-proxy".allowRealIpFallback: เมื่อเป็นtrue, gateway จะยอมรับX-Real-IPหากไม่มีX-Forwarded-Forค่าเริ่มต้นfalseเพื่อพฤติกรรมแบบ fail-closed.gateway.nodes.pairing.autoApproveCidrs: CIDR/IP allowlist แบบเลือกใช้ได้สำหรับ auto-approving การ pair อุปกรณ์ node ครั้งแรกโดยไม่มี scopes ที่ร้องขอ จะถูกปิดเมื่อไม่ได้ตั้งค่า สิ่งนี้ไม่ auto-approve operator/browser/Control UI/WebChat pairing และไม่ auto-approve การอัปเกรด role, scope, metadata, หรือ public-key.gateway.nodes.allowCommands/gateway.nodes.denyCommands: การ shaping แบบ global allow/deny สำหรับคำสั่ง node ที่ประกาศ หลังจาก pairing และการประเมิน platform allowlist ใช้allowCommandsเพื่อ opt into คำสั่ง node อันตราย เช่นcamera.snap,camera.clip, และscreen.record;denyCommandsจะลบคำสั่งแม้ platform default หรือ explicit allow จะรวมคำสั่งนั้นไว้ หลังจาก node เปลี่ยนรายการคำสั่งที่ประกาศ ให้ reject และ re-approve device pairing นั้นเพื่อให้ gateway เก็บ command snapshot ที่อัปเดต.gateway.tools.deny: ชื่อ tool เพิ่มเติมที่ถูกบล็อกสำหรับ HTTPPOST /tools/invoke(ขยาย default deny list).gateway.tools.allow: ลบชื่อ tool ออกจาก default HTTP deny list สำหรับ owner/admin callers สิ่งนี้ไม่ได้ยกระดับ callers ที่มี identityoperator.writeให้เป็น owner/admin access;cron,gateway, และnodesยังคง ใช้ไม่ได้สำหรับ non-owner callers แม้อยู่ใน allowlist.
Endpoints ที่เข้ากันได้กับ OpenAI
- Admin HTTP RPC: ปิดโดยค่าเริ่มต้นในฐานะ Plugin
admin-http-rpcเปิดใช้ Plugin เพื่อ registerPOST /api/v1/admin/rpcดู Admin HTTP RPC. - Chat Completions: ปิดโดยค่าเริ่มต้น เปิดใช้ด้วย
gateway.http.endpoints.chatCompletions.enabled: true. - Responses API:
gateway.http.endpoints.responses.enabled. - การ hardening URL-input ของ Responses:
gateway.http.endpoints.responses.maxUrlPartsgateway.http.endpoints.responses.files.urlAllowlistgateway.http.endpoints.responses.images.urlAllowlistallowlists ที่ว่างจะถูกถือว่าไม่ได้ตั้งค่า; ใช้gateway.http.endpoints.responses.files.allowUrl=falseและ/หรือgateway.http.endpoints.responses.images.allowUrl=falseเพื่อปิดการ fetch URL.
- header การ hardening response แบบเลือกใช้ได้:
gateway.http.securityHeaders.strictTransportSecurity(ตั้งเฉพาะสำหรับ HTTPS origins ที่คุณควบคุม; ดู Trusted Proxy Auth)
การแยกหลาย instance
รัน gateways หลายตัวบน host เดียวโดยใช้ ports และ state dirs ที่ไม่ซ้ำกัน:
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \OPENCLAW_STATE_DIR=~/.openclaw-a \openclaw gateway --port 19001flags เพื่อความสะดวก: --dev (ใช้ ~/.openclaw-dev + port 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 termination ที่ gateway listener (HTTPS/WSS) (ค่าเริ่มต้น:false).autoGenerate: สร้างคู่ cert/key แบบ self-signed ภายในเครื่องโดยอัตโนมัติเมื่อไม่ได้กำหนดไฟล์อย่างชัดเจน; สำหรับการใช้งาน local/dev เท่านั้น.certPath: path ใน filesystem ไปยังไฟล์ TLS certificate.keyPath: path ใน filesystem ไปยังไฟล์ TLS private key; จำกัด permission ไว้.caPath: path ของ CA bundle แบบเลือกใช้ได้สำหรับ client verification หรือ custom trust chains.
gateway.reload
{ gateway: { reload: { mode: "hybrid", // off | restart | hot | hybrid debounceMs: 500, deferralTimeoutMs: 300000, }, },}mode: ควบคุมวิธีนำการแก้ไข config ไปใช้ขณะ runtime"off": ไม่สนใจการแก้ไขสด การเปลี่ยนแปลงต้อง restart อย่างชัดเจน"restart": restart โปรเซส Gateway ทุกครั้งเมื่อ config เปลี่ยน"hot": นำการเปลี่ยนแปลงไปใช้ภายในโปรเซสโดยไม่ต้อง restart"hybrid"(ค่าเริ่มต้น): ลอง hot reload ก่อน หากจำเป็นจึง fallback ไป restart
debounceMs: ช่วง debounce เป็น ms ก่อนนำการเปลี่ยนแปลง config ไปใช้ (จำนวนเต็มไม่ติดลบ)deferralTimeoutMs: เวลาสูงสุดที่เลือกกำหนดได้เป็น ms เพื่อรอการทำงานที่กำลังดำเนินอยู่ก่อนบังคับ restart หรือ hot reload ช่องทาง หากละไว้จะใช้การรอแบบมีขอบเขตค่าเริ่มต้น (300000); ตั้งเป็น0เพื่อรอไม่จำกัดและบันทึกคำเตือนว่ายังค้างอยู่เป็นระยะ
Hooks
{ hooks: { enabled: true, token: "shared-secret", path: "/hooks", maxBodyBytes: 262144, 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.4-mini", }, ], },}การยืนยันตัวตน: Authorization: Bearer <token> หรือ x-openclaw-token: <token>
โทเค็น hook ใน query string จะถูกปฏิเสธ
หมายเหตุด้านการตรวจสอบความถูกต้องและความปลอดภัย:
hooks.enabled=trueต้องมีhooks.tokenที่ไม่ว่างเปล่าhooks.tokenควรแตกต่างจาก auth แบบ shared-secret ของ Gateway ที่ใช้งานอยู่ (gateway.auth.token/OPENCLAW_GATEWAY_TOKENหรือgateway.auth.password/OPENCLAW_GATEWAY_PASSWORD); startup จะบันทึกคำเตือนด้านความปลอดภัยแบบไม่ร้ายแรงเมื่อตรวจพบการใช้ซ้ำopenclaw security auditจะระบุการใช้ auth ของ hook/Gateway ซ้ำเป็นผลการตรวจพบระดับวิกฤต รวมถึง auth รหัสผ่าน Gateway ที่ระบุเฉพาะตอน audit (--auth password --password <password>) ให้รันopenclaw doctor --fixเพื่อหมุนเวียนhooks.tokenที่ persist ไว้และถูกใช้ซ้ำ จากนั้นอัปเดตตัวส่ง hook ภายนอกให้ใช้โทเค็น hook ใหม่hooks.pathเป็น/ไม่ได้ ให้ใช้ subpath เฉพาะ เช่น/hooks- หาก
hooks.allowRequestSessionKey=trueให้จำกัดhooks.allowedSessionKeyPrefixes(เช่น["hook:"]) - หาก mapping หรือ preset ใช้
sessionKeyแบบ template ให้ตั้งค่าhooks.allowedSessionKeyPrefixesและhooks.allowRequestSessionKey=trueคีย์ mapping แบบคงที่ไม่ต้อง opt-in นี้
Endpoint:
POST /hooks/wake→{ text, mode?: "now"|"next-heartbeat" }POST /hooks/agent→{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }sessionKeyจาก request payload จะถูกรับเฉพาะเมื่อhooks.allowRequestSessionKey=true(ค่าเริ่มต้น:false)
POST /hooks/<name>→ resolve ผ่านhooks.mappings- ค่า
sessionKeyของ mapping ที่ render จาก template จะถือว่าเป็นค่าที่ระบุจากภายนอก และต้องมีhooks.allowRequestSessionKey=trueด้วย
- ค่า
Mapping details
match.pathจับคู่ sub-path หลัง/hooks(เช่น/hooks/gmail→gmail)match.sourceจับคู่ field ใน payload สำหรับ path ทั่วไป- Template เช่น
{{messages[0].subject}}อ่านจาก payload transformสามารถชี้ไปยังโมดูล JS/TS ที่คืนค่า hook action ได้transform.moduleต้องเป็น path แบบ relative และอยู่ภายในhooks.transformsDir(path แบบ absolute และ traversal จะถูกปฏิเสธ)- เก็บ
hooks.transformsDirไว้ใต้~/.openclaw/hooks/transforms; ไดเรกทอรี Skills ของ workspace จะถูกปฏิเสธ หากopenclaw doctorรายงานว่า path นี้ไม่ถูกต้อง ให้ย้ายโมดูล transform เข้าไปในไดเรกทอรี hooks transforms หรือลบhooks.transformsDir agentIdroute ไปยัง agent เฉพาะ; ID ที่ไม่รู้จักจะ fallback ไปยัง agent ค่าเริ่มต้นallowedAgentIds: จำกัดการ route agent ที่มีผล รวมถึง path ของ agent ค่าเริ่มต้นเมื่อไม่ได้ระบุagentId(*หรือไม่ระบุ = อนุญาตทั้งหมด,[]= ปฏิเสธทั้งหมด)defaultSessionKey: คีย์ session คงที่แบบเลือกกำหนดได้สำหรับการรัน hook agent ที่ไม่มีsessionKeyชัดเจนallowRequestSessionKey: อนุญาตให้ผู้เรียก/hooks/agentและคีย์ session ของ mapping ที่ขับเคลื่อนด้วย template ตั้งค่าsessionKey(ค่าเริ่มต้น:false)allowedSessionKeyPrefixes: allowlist prefix แบบเลือกกำหนดได้สำหรับค่าsessionKeyที่ระบุชัดเจน (request + mapping), เช่น["hook:"]ค่านี้จะกลายเป็นข้อบังคับเมื่อ mapping หรือ preset ใด ๆ ใช้sessionKeyแบบ templatedeliver: trueส่งการตอบกลับสุดท้ายไปยังช่องทาง;channelมีค่าเริ่มต้นเป็นlastmodeloverride LLM สำหรับการรัน hook นี้ (ต้องได้รับอนุญาตหากตั้งค่า model catalog)
การผสานรวม Gmail
- preset Gmail ในตัวใช้
sessionKey: "hook:gmail:{{messages[0].id}}" - หากคุณคงการ route ต่อข้อความนั้นไว้ ให้ตั้ง
hooks.allowRequestSessionKey: trueและจำกัดhooks.allowedSessionKeyPrefixesให้ตรงกับ namespace ของ Gmail เช่น["hook:", "hook:gmail:"] - หากคุณต้องใช้
hooks.allowRequestSessionKey: falseให้ override preset ด้วยsessionKeyแบบคงที่แทนค่าเริ่มต้นแบบ template
{ 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: "openrouter/meta-llama/llama-3.3-70b-instruct:free", thinking: "off", }, },}- Gateway จะ auto-start
gog gmail watch serveตอน boot เมื่อมีการกำหนดค่า ตั้ง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, // or OPENCLAW_SKIP_CANVAS_HOST=1 }, }, }, }, },}- ให้บริการ HTML/CSS/JS ที่ agent แก้ไขได้และ A2UI ผ่าน HTTP ภายใต้พอร์ต Gateway:
http://<gateway-host>:<gateway.port>/__openclaw__/canvas/http://<gateway-host>:<gateway.port>/__openclaw__/a2ui/
- เฉพาะ local: คง
gateway.bind: "loopback"ไว้ (ค่าเริ่มต้น) - การ bind ที่ไม่ใช่ loopback: route ของ canvas ต้องใช้ auth ของ Gateway (token/password/trusted-proxy) เช่นเดียวกับพื้นผิว HTTP อื่นของ Gateway
- โดยทั่วไป Node WebViews จะไม่ส่ง header auth; หลังจากจับคู่และเชื่อมต่อ node แล้ว Gateway จะประกาศ URL ความสามารถแบบจำกัด scope ตาม node สำหรับการเข้าถึง canvas/A2UI
- URL ความสามารถจะผูกกับ session WS ของ node ที่ใช้งานอยู่และหมดอายุอย่างรวดเร็ว ไม่มีการใช้ fallback ตาม IP
- inject client live-reload เข้าไปใน HTML ที่ให้บริการ
- สร้าง
index.htmlเริ่มต้นโดยอัตโนมัติเมื่อว่างเปล่า - ให้บริการ A2UI ที่
/__openclaw__/a2ui/ด้วย - การเปลี่ยนแปลงต้อง restart Gateway
- ปิดใช้งาน live reload สำหรับไดเรกทอรีขนาดใหญ่หรือข้อผิดพลาด
EMFILE
การค้นพบ
mDNS (Bonjour)
{ discovery: { mdns: { mode: "minimal", // minimal | full | off }, },}minimal(ค่าเริ่มต้นเมื่อเปิดใช้งาน Pluginbonjourที่ bundled มา): ละcliPath+sshPortจาก TXT recordfull: รวมcliPath+sshPort; การโฆษณา multicast บน LAN ยังต้องเปิดใช้งาน Pluginbonjourที่ bundled มาoff: ระงับการโฆษณา multicast บน LAN โดยไม่เปลี่ยนการเปิดใช้งาน Plugin- Plugin
bonjourที่ bundled มาจะ auto-start บนโฮสต์ macOS และเป็นแบบ opt-in บน Linux, Windows และการ deploy Gateway ใน container - Hostname มีค่าเริ่มต้นเป็น hostname ของระบบเมื่อเป็น DNS label ที่ถูกต้อง และ fallback เป็น
openclawoverride ได้ด้วยOPENCLAW_MDNS_HOSTNAME
Wide-area (DNS-SD)
{ discovery: { wideArea: { enabled: true }, },}เขียนโซน DNS-SD แบบ unicast ไว้ใต้ ~/.openclaw/dns/ สำหรับการค้นพบข้ามเครือข่าย ให้ใช้ร่วมกับเซิร์ฟเวอร์ DNS (แนะนำ CoreDNS) + Tailscale split DNS
การตั้งค่า: openclaw dns setup --apply
สภาพแวดล้อม
env (ตัวแปรสภาพแวดล้อมแบบอินไลน์)
{ env: { OPENROUTER_API_KEY: "sk-or-...", vars: { GROQ_API_KEY: "gsk-...", }, shellEnv: { enabled: true, timeoutMs: 15000, }, },}- ตัวแปรสภาพแวดล้อมแบบอินไลน์จะถูกนำไปใช้เฉพาะเมื่อสภาพแวดล้อมของโปรเซสไม่มีคีย์นั้น
- ไฟล์
.env: CWD.env+~/.openclaw/.env(ทั้งคู่ไม่เขียนทับตัวแปรที่มีอยู่) shellEnv: นำเข้าคีย์ที่คาดไว้และยังขาดจากโปรไฟล์เชลล์ล็อกอินของคุณ- ดู สภาพแวดล้อม สำหรับลำดับความสำคัญทั้งหมด
การแทนค่าตัวแปรสภาพแวดล้อม
อ้างอิงตัวแปรสภาพแวดล้อมในสตริง config ใดก็ได้ด้วย ${VAR_NAME}:
{ gateway: { auth: { token: "${OPENCLAW_GATEWAY_TOKEN}" }, },}- จับคู่เฉพาะชื่อที่เป็นตัวพิมพ์ใหญ่:
[A-Z_][A-Z0-9_]* - ตัวแปรที่ขาดหาย/ว่างจะทำให้เกิดข้อผิดพลาดเมื่อโหลด config
- เอสเคปด้วย
$${VAR}สำหรับ literal${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 pointer แบบสัมบูรณ์ (เช่น"/providers/openai/apiKey") - รูปแบบ id ของ
source: "exec":^[A-Za-z0-9][A-Za-z0-9._:/#-]{0,255}$(รองรับตัวเลือกแบบ AWSsecret#json_key) - id ของ
source: "exec"ต้องไม่มี path segment ที่คั่นด้วยสแลชเป็น.หรือ..(เช่นa/../bจะถูกปฏิเสธ)
พื้นผิวข้อมูลรับรองที่รองรับ
- เมทริกซ์มาตรฐาน: พื้นผิวข้อมูลรับรอง SecretRef
secrets applyกำหนดเป้าหมายไปยังพาธข้อมูลรับรองของopenclaw.jsonที่รองรับ- การอ้างอิงใน
auth-profiles.jsonรวมอยู่ในการแก้ไขค่าขณะรันไทม์และขอบเขตการตรวจสอบแล้ว
config ผู้ให้บริการความลับ
{ secrets: { providers: { default: { source: "env" }, // optional explicit env provider 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 จะ fail closed เมื่อการตรวจสอบ Windows ACL ไม่พร้อมใช้งาน ตั้งค่า
allowInsecurePath: trueเฉพาะสำหรับพาธที่เชื่อถือได้แต่ไม่สามารถตรวจสอบได้ - ผู้ให้บริการ
execต้องใช้พาธcommandแบบสัมบูรณ์ และใช้ payload โปรโตคอลบน stdin/stdout - ตามค่าเริ่มต้น พาธคำสั่งที่เป็น symlink จะถูกปฏิเสธ ตั้งค่า
allowSymlinkCommand: trueเพื่ออนุญาตพาธ symlink พร้อมตรวจสอบพาธเป้าหมายที่แก้ไขแล้ว - หากกำหนดค่า
trustedDirsการตรวจสอบ trusted-dir จะใช้กับพาธเป้าหมายที่แก้ไขแล้ว - โดยค่าเริ่มต้น สภาพแวดล้อมของ child ของ
execจะเป็นแบบขั้นต่ำ ให้ส่งตัวแปรที่ต้องใช้แบบชัดเจนด้วยpassEnv - การอ้างอิงความลับจะถูกแก้ไขค่าในเวลาเปิดใช้งานเป็นสแนปช็อตในหน่วยความจำ จากนั้นพาธคำขอจะอ่านเฉพาะสแนปช็อตนั้น
- การกรอง active-surface จะมีผลระหว่างการเปิดใช้งาน: การอ้างอิงที่ยังแก้ค่าไม่ได้บนพื้นผิวที่เปิดใช้งานจะทำให้การเริ่มต้น/โหลดซ้ำล้มเหลว ส่วนพื้นผิวที่ไม่ใช้งานจะถูกข้ามพร้อม diagnostics
ที่จัดเก็บ auth
{ 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": "..." } }ไม่ใช่รูปแบบ runtime;openclaw doctor --fixจะเขียนใหม่เป็นโปรไฟล์ API-key แบบ canonicalprovider:defaultพร้อมข้อมูลสำรอง.legacy-flat.*.bak - โปรไฟล์โหมด OAuth (
auth.profiles.<id>.mode = "oauth") ไม่รองรับข้อมูลรับรอง auth-profile ที่มี SecretRef หนุนหลัง - ข้อมูลรับรอง runtime แบบคงที่มาจาก snapshot ที่ resolve แล้วในหน่วยความจำ; รายการ
auth.jsonแบบคงที่รุ่นเก่าจะถูกล้างเมื่อพบ - การนำเข้า OAuth รุ่นเก่ามาจาก
~/.openclaw/credentials/oauth.json - ดู OAuth
- พฤติกรรม runtime ของ secrets และเครื่องมือ
audit/configure/apply: การจัดการ Secrets
auth.cooldowns
{ auth: { cooldowns: { billingBackoffHours: 5, billingBackoffHoursByProvider: { anthropic: 3, openai: 8 }, billingMaxHours: 24, authPermanentBackoffMinutes: 10, authPermanentMaxMinutes: 60, failureWindowHours: 24, overloadedProfileRotations: 1, overloadedBackoffMs: 0, rateLimitedProfileRotations: 1, }, },}billingBackoffHours: backoff พื้นฐานเป็นชั่วโมงเมื่อโปรไฟล์ล้มเหลวจากข้อผิดพลาด billing/เครดิตไม่เพียงพอจริง (ค่าเริ่มต้น:5) ข้อความ billing ที่ชัดเจนยัง อาจเข้ามาที่นี่ได้แม้บนการตอบกลับ401/403แต่ตัวจับคู่ข้อความเฉพาะ provider จะยังจำกัดขอบเขตอยู่กับ provider ที่เป็นเจ้าของเท่านั้น (เช่น OpenRouterKey limit exceeded) ข้อความ HTTP402แบบลองใหม่ได้สำหรับ usage-window หรือ ขีดจำกัดค่าใช้จ่ายของ organization/workspace จะยังอยู่ในเส้นทางrate_limitแทนbillingBackoffHoursByProvider: การ override จำนวนชั่วโมง billing backoff แยกตาม provider แบบไม่บังคับbillingMaxHours: เพดานเป็นชั่วโมงสำหรับการเติบโตแบบ exponential ของ billing backoff (ค่าเริ่มต้น:24)authPermanentBackoffMinutes: backoff พื้นฐานเป็นนาทีสำหรับความล้มเหลวauth_permanentที่มีความมั่นใจสูง (ค่าเริ่มต้น:10)authPermanentMaxMinutes: เพดานเป็นนาทีสำหรับการเติบโตของauth_permanentbackoff (ค่าเริ่มต้น:60)failureWindowHours: หน้าต่างแบบ rolling เป็นชั่วโมงที่ใช้สำหรับตัวนับ backoff (ค่าเริ่มต้น:24)overloadedProfileRotations: จำนวนสูงสุดของการหมุนเวียน auth-profile ใน provider เดียวกันสำหรับข้อผิดพลาด overloaded ก่อนเปลี่ยนไปใช้ model fallback (ค่าเริ่มต้น:1) รูปแบบ provider-busy เช่นModelNotReadyExceptionจะเข้ามาที่นี่overloadedBackoffMs: ดีเลย์คงที่ก่อนลองหมุนเวียน provider/profile ที่ overloaded อีกครั้ง (ค่าเริ่มต้น:0)rateLimitedProfileRotations: จำนวนสูงสุดของการหมุนเวียน auth-profile ใน provider เดียวกันสำหรับข้อผิดพลาด rate-limit ก่อนเปลี่ยนไปใช้ model fallback (ค่าเริ่มต้น:1) กลุ่ม rate-limit นั้นรวมข้อความที่มีรูปแบบตาม provider เช่นToo many concurrent requests,ThrottlingException,concurrency limit reached,workers_ai ... quota limit exceededและresource exhausted
การบันทึก
{ 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"], },}- ไฟล์ log เริ่มต้น:
/tmp/openclaw/openclaw-YYYY-MM-DD.log - ตั้งค่า
logging.fileสำหรับ path ที่คงที่ consoleLevelจะเพิ่มเป็นdebugเมื่อใช้--verbosemaxFileBytes: ขนาดไฟล์ log ที่ใช้งานอยู่สูงสุดเป็นไบต์ก่อนหมุนเวียนไฟล์ (จำนวนเต็มบวก; ค่าเริ่มต้น:104857600= 100 MB) OpenClaw เก็บไฟล์ archive แบบมีหมายเลขไว้ข้างไฟล์ที่ใช้งานอยู่ได้สูงสุดห้าไฟล์redactSensitive/redactPatterns: การปิดบังแบบ best-effort สำหรับเอาต์พุต console, file logs, ระเบียน log ของ OTLP และข้อความ transcript ของ session ที่คงอยู่redactSensitive: "off"จะปิดเฉพาะนโยบาย log/transcript ทั่วไปนี้เท่านั้น; พื้นผิวความปลอดภัยของ UI/tool/diagnostic ยังคง redact secrets ก่อนส่งออก
การวินิจฉัย
{ diagnostics: { enabled: true, flags: ["telegram.*"], stuckSessionWarnMs: 30000, stuckSessionAbortMs: 300000, memoryPressureSnapshot: false, 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: สวิตช์หลักสำหรับเอาต์พุต instrumentation (ค่าเริ่มต้น:true)flags: อาร์เรย์ของสตริง flag ที่เปิดใช้งานเอาต์พุต log แบบเจาะจง (รองรับ wildcard เช่น"telegram.*"หรือ"*")stuckSessionWarnMs: เกณฑ์อายุแบบไม่มีความคืบหน้าเป็น ms สำหรับจัดประเภท session ประมวลผลที่รันนานเป็นsession.long_running,session.stalledหรือsession.stuckการตอบกลับ, tool, สถานะ, block และความคืบหน้า ACP จะรีเซ็ตตัวจับเวลา; diagnosticssession.stuckที่ซ้ำกันจะ back off ขณะไม่มีการเปลี่ยนแปลงstuckSessionAbortMs: เกณฑ์อายุแบบไม่มีความคืบหน้าเป็น ms ก่อนที่งาน active ที่ stalled และมีสิทธิ์อาจถูก abort-drain เพื่อกู้คืน เมื่อไม่ได้ตั้งค่า OpenClaw จะใช้หน้าต่าง embedded-run ที่ขยายและปลอดภัยกว่าอย่างน้อย 5 นาที และ 3 เท่าของstuckSessionWarnMsmemoryPressureSnapshot: จับ snapshot เสถียรภาพก่อน OOM แบบ redacted เมื่อแรงกดดันหน่วยความจำถึงcritical(ค่าเริ่มต้น:false) ตั้งเป็นtrueเพื่อเพิ่มการสแกน/เขียนไฟล์ stability bundle ขณะยังคง event แรงกดดันหน่วยความจำตามปกติotel.enabled: เปิดใช้งาน pipeline การ export ของ OpenTelemetry (ค่าเริ่มต้น:false) สำหรับการกำหนดค่าเต็ม, signal catalog และ privacy model ดู การส่งออก OpenTelemetryotel.endpoint: URL ของ collector สำหรับการ export OTelotel.tracesEndpoint/otel.metricsEndpoint/otel.logsEndpoint: endpoint OTLP เฉพาะ signal แบบไม่บังคับ เมื่อตั้งค่าแล้ว จะ overrideotel.endpointสำหรับ signal นั้นเท่านั้นotel.protocol:"http/protobuf"(ค่าเริ่มต้น) หรือ"grpc"otel.headers: header metadata HTTP/gRPC เพิ่มเติมที่ส่งพร้อมคำขอ export OTelotel.serviceName: ชื่อบริการสำหรับ resource attributesotel.traces/otel.metrics/otel.logs: เปิดใช้งานการ export trace, metrics หรือ logotel.logsExporter: ปลายทาง export log:"otlp"(ค่าเริ่มต้น),"stdout"สำหรับอ็อบเจ็กต์ JSON หนึ่งรายการต่อบรรทัด stdout หรือ"both"otel.sampleRate: อัตราการสุ่มตัวอย่าง trace0-1otel.flushIntervalMs: ช่วงเวลา flush telemetry เป็นระยะใน msotel.captureContent: เลือกรับการจับเนื้อหาดิบสำหรับ OTEL span attributes ค่าเริ่มต้นคือปิด Booleantrueจะจับเนื้อหา message/tool ที่ไม่ใช่ระบบ; รูปแบบอ็อบเจ็กต์ให้คุณเปิดใช้งานinputMessages,outputMessages,toolInputs,toolOutputs,systemPromptและtoolDefinitionsได้อย่างชัดเจนOTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental: สวิตช์ environment สำหรับรูปแบบ span การ inference ของ GenAI แบบ experimental ล่าสุด รวมถึงชื่อ span{gen_ai.operation.name} {gen_ai.request.model}, ชนิด spanCLIENTและgen_ai.provider.nameแทนgen_ai.systemรุ่นเก่า โดยค่าเริ่มต้น span จะคงopenclaw.model.callและgen_ai.systemไว้เพื่อความเข้ากันได้; metrics ของ GenAI ใช้ semantic attributes ที่มีขอบเขตจำกัดOPENCLAW_OTEL_PRELOADED=1: สวิตช์ environment สำหรับ host ที่ลงทะเบียน OpenTelemetry SDK แบบ global ไว้แล้ว จากนั้น OpenClaw จะข้ามการเริ่ม/ปิด SDK ที่ Plugin เป็นเจ้าของ ขณะยังคงให้ diagnostic listeners ทำงานอยู่OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,OTEL_EXPORTER_OTLP_METRICS_ENDPOINTและOTEL_EXPORTER_OTLP_LOGS_ENDPOINT: env vars ของ endpoint เฉพาะ signal ที่ใช้เมื่อไม่ได้ตั้งค่า config key ที่ตรงกันcacheTrace.enabled: บันทึก snapshot ของ cache trace สำหรับ embedded runs (ค่าเริ่มต้น:false)cacheTrace.filePath: path เอาต์พุตสำหรับ cache trace JSONL (ค่าเริ่มต้น:$OPENCLAW_STATE_DIR/logs/cache-trace.jsonl)cacheTrace.includeMessages/includePrompt/includeSystem: ควบคุมสิ่งที่รวมอยู่ในเอาต์พุต cache trace (ทั้งหมดมีค่าเริ่มต้น:true)
การอัปเดต
{ update: { channel: "stable", // stable | beta | dev checkOnStart: true, auto: { enabled: false, stableDelayHours: 6, stableJitterHours: 12, betaCheckIntervalHours: 1, }, },}channel: release channel สำหรับการติดตั้ง npm/git -"stable","beta"หรือ"dev"checkOnStart: ตรวจสอบการอัปเดต npm เมื่อ gateway เริ่มทำงาน (ค่าเริ่มต้น:true)auto.enabled: เปิดใช้งานการอัปเดตอัตโนมัติแบบเบื้องหลังสำหรับการติดตั้ง package (ค่าเริ่มต้น:false)auto.stableDelayHours: ดีเลย์ขั้นต่ำเป็นชั่วโมงก่อน auto-apply สำหรับ stable-channel (ค่าเริ่มต้น:6; สูงสุด:168)auto.stableJitterHours: หน้าต่างกระจายการ rollout เพิ่มเติมของ stable-channel เป็นชั่วโมง (ค่าเริ่มต้น:12; สูงสุด:168)auto.betaCheckIntervalHours: ความถี่ที่การตรวจสอบ beta-channel ทำงานเป็นชั่วโมง (ค่าเริ่มต้น:1; สูงสุด:24)
ACP
{ acp: { enabled: true, dispatch: { enabled: true }, backend: "acpx", defaultAgent: "main", allowedAgents: ["main", "ops"], maxConcurrentSessions: 10, stream: { coalesceIdleMs: 50, maxChunkChars: 1000, repeatSuppression: true, deliveryMode: "live", // live | final_only hiddenBoundarySeparator: "paragraph", // none | space | newline | paragraph maxOutputChars: 50000, maxSessionUpdateChars: 500, }, runtime: { ttlMinutes: 30, }, },}enabled: feature gate ACP แบบ global (ค่าเริ่มต้น:true; ตั้งเป็นfalseเพื่อซ่อน dispatch และ affordance การ spawn ของ ACP)dispatch.enabled: gate อิสระสำหรับการ dispatch turn ของ ACP session (ค่าเริ่มต้น:true) ตั้งเป็นfalseเพื่อให้คำสั่ง ACP ยังพร้อมใช้งานขณะบล็อกการดำเนินการbackend: id backend runtime ACP เริ่มต้น (ต้องตรงกับ Plugin runtime ACP ที่ลงทะเบียนไว้) ติดตั้ง Plugin backend ก่อน และหากตั้งค่าplugins.allowให้รวม id Plugin backend (เช่นacpx) มิฉะนั้น backend ACP จะไม่โหลดdefaultAgent: id เอเจนต์เป้าหมาย ACP fallback เมื่อ spawns ไม่ได้ระบุเป้าหมายอย่างชัดเจนallowedAgents: allowlist ของ id เอเจนต์ที่อนุญาตสำหรับ session runtime ACP; ว่างหมายถึงไม่มีข้อจำกัดเพิ่มเติมmaxConcurrentSessions: จำนวน session ACP ที่ active พร้อมกันสูงสุดstream.coalesceIdleMs: หน้าต่าง idle flush เป็น ms สำหรับข้อความที่ streamstream.maxChunkChars: ขนาด chunk สูงสุดก่อนแยก projection ของ block ที่ streamstream.repeatSuppression: ระงับบรรทัดสถานะ/tool ที่ซ้ำกันต่อ turn (ค่าเริ่มต้น:true)stream.deliveryMode:"live"stream แบบเพิ่มทีละส่วน;"final_only"buffer จนถึง event สิ้นสุดของ turnstream.hiddenBoundarySeparator: ตัวคั่นก่อนข้อความที่มองเห็นได้หลัง event tool ที่ซ่อนอยู่ (ค่าเริ่มต้น:"paragraph")stream.maxOutputChars: จำนวนอักขระเอาต์พุต assistant สูงสุดที่ project ต่อ ACP turnstream.maxSessionUpdateChars: จำนวนอักขระสูงสุดสำหรับบรรทัดสถานะ/อัปเดต ACP ที่ projectstream.tagVisibility: ระเบียนของชื่อ tag ไปยัง override การมองเห็นแบบ boolean สำหรับ event ที่ streamruntime.ttlMinutes: TTL เมื่อ idle เป็นนาทีสำหรับ worker ของ ACP session ก่อนมีสิทธิ์ cleanupruntime.installCommand: คำสั่งติดตั้งแบบไม่บังคับที่จะรันเมื่อ bootstrap environment runtime ACP
CLI
{ cli: { banner: { taglineMode: "off", // random | default | off }, },}cli.banner.taglineModeควบคุมสไตล์แท็กไลน์ของแบนเนอร์:"random"(ค่าเริ่มต้น): แท็กไลน์ตลก/ตามฤดูกาลที่หมุนเวียนกัน."default": แท็กไลน์กลางแบบคงที่ (All your chats, one OpenClaw.)."off": ไม่มีข้อความแท็กไลน์ (ยังคงแสดงชื่อ/เวอร์ชันของแบนเนอร์).
- หากต้องการซ่อนทั้งแบนเนอร์ (ไม่ใช่แค่แท็กไลน์) ให้ตั้งค่า env
OPENCLAW_HIDE_BANNER=1.
ตัวช่วยตั้งค่า
เมทาดาทาที่เขียนโดยโฟลว์การตั้งค่าแบบมีคำแนะนำของ CLI (onboard, configure, doctor):
{ wizard: { lastRunAt: "2026-01-01T00:00:00.000Z", lastRunVersion: "2026.1.4", lastRunCommit: "abc1234", lastRunCommand: "configure", lastRunMode: "local", },}ตัวตน
ดูฟิลด์ตัวตน agents.list ใต้ ค่าเริ่มต้นของเอเจนต์.
บริดจ์ (เลกาซี, นำออกแล้ว)
บิลด์ปัจจุบันไม่มี TCP bridge อีกต่อไป Node เชื่อมต่อผ่าน Gateway WebSocket คีย์ bridge.* ไม่ได้เป็นส่วนหนึ่งของสคีมาการตั้งค่าอีกต่อไป (การตรวจสอบจะล้มเหลวจนกว่าจะนำออก; openclaw doctor --fix สามารถลบคีย์ที่ไม่รู้จักได้).
Legacy bridge config (historical reference)
{"bridge": { "enabled": true, "port": 18790, "bind": "tailnet", "tls": { "enabled": true, "autoGenerate": true }}}Cron
{ cron: { enabled: true, maxConcurrentRuns: 8, // default; cron dispatch + isolated cron agent-turn execution webhook: "https://example.invalid/legacy", // deprecated fallback for stored notify:true jobs webhookToken: "replace-with-dedicated-token", // optional bearer token for outbound webhook auth sessionRetention: "24h", // duration string or false runLog: { maxBytes: "2mb", // default 2_000_000 bytes keepLines: 2000, // default 2000 }, },}sessionRetention: ระยะเวลาที่จะเก็บเซสชันการรัน cron แบบแยกที่เสร็จสิ้นแล้วก่อนตัดออกจากsessions.json. ยังควบคุมการล้างทรานสคริปต์ cron ที่ถูกลบและเก็บถาวรด้วย ค่าเริ่มต้น:24h; ตั้งค่าเป็นfalseเพื่อปิดใช้.runLog.maxBytes: ยอมรับเพื่อความเข้ากันได้กับบันทึกการรัน cron แบบใช้ไฟล์รุ่นเก่า ค่าเริ่มต้น:2_000_000ไบต์.runLog.keepLines: แถวประวัติการรัน SQLite ล่าสุดที่เก็บไว้ต่อหนึ่งงาน ค่าเริ่มต้น:2000.webhookToken: โทเค็น bearer ที่ใช้สำหรับการส่ง POST ของ cron webhook (delivery.mode = "webhook"); หากไม่ระบุ จะไม่ส่งส่วนหัว auth.webhook: URL webhook เลกาซีสำรองที่เลิกใช้แล้ว (http/https) ซึ่งopenclaw doctor --fixใช้เพื่อย้ายงานที่เก็บไว้ซึ่งยังมีnotify: true; การส่งขณะรันไทม์ใช้delivery.mode="webhook"ต่อแต่ละงานร่วมกับdelivery.to, หรือdelivery.completionDestinationเมื่อรักษาการส่งแบบประกาศไว้.
cron.retry
{ cron: { retry: { maxAttempts: 3, backoffMs: [30000, 60000, 300000], retryOn: ["rate_limit", "overloaded", "network", "timeout", "server_error"], }, },}maxAttempts: จำนวนครั้งสูงสุดที่จะลองใหม่สำหรับงาน cron เมื่อเกิดข้อผิดพลาดชั่วคราว (ค่าเริ่มต้น:3; ช่วง:0-10).backoffMs: อาร์เรย์ของดีเลย์ backoff เป็น ms สำหรับความพยายามลองใหม่แต่ละครั้ง (ค่าเริ่มต้น:[30000, 60000, 300000]; 1-10 รายการ).retryOn: ประเภทข้อผิดพลาดที่ทริกเกอร์การลองใหม่ -"rate_limit","overloaded","network","timeout","server_error". ไม่ต้องระบุหากต้องการลองใหม่กับประเภทชั่วคราวทั้งหมด.
งานแบบครั้งเดียวจะยังคงเปิดใช้จนกว่าความพยายามลองใหม่จะหมด จากนั้นจะปิดใช้โดยยังเก็บสถานะข้อผิดพลาดสุดท้ายไว้ งานแบบเกิดซ้ำใช้นโยบายการลองใหม่เมื่อเกิดข้อผิดพลาดชั่วคราวเดียวกันเพื่อรันอีกครั้งหลัง backoff ก่อนช่วงเวลาที่กำหนดครั้งถัดไป; ข้อผิดพลาดถาวรหรือการลองใหม่ชั่วคราวที่หมดแล้วจะกลับไปใช้กำหนดการเกิดซ้ำปกติพร้อม backoff ข้อผิดพลาด.
cron.failureAlert
{ cron: { failureAlert: { enabled: false, after: 3, cooldownMs: 3600000, includeSkipped: false, mode: "announce", accountId: "main", }, },}enabled: เปิดใช้การแจ้งเตือนความล้มเหลวสำหรับงาน cron (ค่าเริ่มต้น:false).after: จำนวนความล้มเหลวติดต่อกันก่อนส่งการแจ้งเตือน (จำนวนเต็มบวก, ต่ำสุด:1).cooldownMs: จำนวนมิลลิวินาทีขั้นต่ำระหว่างการแจ้งเตือนซ้ำสำหรับงานเดียวกัน (จำนวนเต็มไม่ติดลบ).includeSkipped: นับการรันที่ถูกข้ามติดต่อกันรวมในเกณฑ์การแจ้งเตือน (ค่าเริ่มต้น:false). การรันที่ถูกข้ามจะถูกติดตามแยกต่างหากและไม่ส่งผลต่อ backoff ของข้อผิดพลาดการดำเนินการ.mode: โหมดการส่ง -"announce"ส่งผ่านข้อความช่องทาง;"webhook"โพสต์ไปยัง webhook ที่กำหนดค่าไว้.accountId: บัญชีหรือ id ช่องทางที่เป็นทางเลือกเพื่อจำกัดขอบเขตการส่งการแจ้งเตือน.
cron.failureDestination
{ cron: { failureDestination: { mode: "announce", channel: "last", to: "channel:C1234567890", accountId: "main", }, },}- ปลายทางเริ่มต้นสำหรับการแจ้งเตือนความล้มเหลวของ cron ในทุกงาน.
mode:"announce"หรือ"webhook"; ค่าเริ่มต้นเป็น"announce"เมื่อมีข้อมูลเป้าหมายเพียงพอ.channel: การแทนที่ช่องทางสำหรับการส่งแบบประกาศ"last"ใช้ช่องทางการส่งล่าสุดที่ทราบซ้ำ.to: เป้าหมายประกาศหรือ URL webhook แบบชัดเจน จำเป็นสำหรับโหมด webhook.accountId: การแทนที่บัญชีสำหรับการส่งที่เป็นทางเลือก.delivery.failureDestinationต่อแต่ละงานจะแทนที่ค่าเริ่มต้นทั่วโลกนี้.- เมื่อไม่ได้ตั้งค่าปลายทางความล้มเหลวทั้งแบบทั่วโลกและต่อแต่ละงาน งานที่ส่งผ่าน
announceอยู่แล้วจะย้อนกลับไปใช้เป้าหมายประกาศหลักนั้นเมื่อเกิดความล้มเหลว. - รองรับ
delivery.failureDestinationเฉพาะกับงานsessionTarget="isolated"เว้นแต่delivery.modeหลักของงานจะเป็น"webhook".
ดู งาน Cron. การดำเนินการ cron แบบแยกถูกติดตามเป็น งานเบื้องหลัง.
ตัวแปรเทมเพลตโมเดลสื่อ
ตัวยึดตำแหน่งเทมเพลตที่ขยายใน tools.media.models[].args:
| ตัวแปร | คำอธิบาย |
|---|---|
{{Body}} |
เนื้อหาข้อความขาเข้าทั้งหมด |
{{RawBody}} |
เนื้อหาดิบ (ไม่มีตัวครอบประวัติ/ผู้ส่ง) |
{{BodyStripped}} |
เนื้อหาที่ลบการกล่าวถึงกลุ่มออกแล้ว |
{{From}} |
ตัวระบุผู้ส่ง |
{{To}} |
ตัวระบุปลายทาง |
{{MessageSid}} |
id ข้อความของช่องทาง |
{{SessionId}} |
UUID เซสชันปัจจุบัน |
{{IsNewSession}} |
"true" เมื่อสร้างเซสชันใหม่ |
{{MediaUrl}} |
pseudo-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"], },}พฤติกรรมการผสาน:
- ไฟล์เดียว: แทนที่อ็อบเจกต์ที่ครอบอยู่.
- อาร์เรย์ของไฟล์: ผสานแบบลึกตามลำดับ (รายการหลังแทนที่รายการก่อน).
- คีย์พี่น้อง: ผสานหลังจาก includes (แทนที่ค่าที่รวมเข้ามา).
- Includes ซ้อนกัน: ลึกได้สูงสุด 10 ระดับ.
- พาธ: แก้ค่าแบบสัมพันธ์กับไฟล์ที่รวม แต่ต้องอยู่ภายในไดเรกทอรีการตั้งค่าระดับบนสุด (
dirnameของopenclaw.json). รูปแบบ absolute/../อนุญาตเฉพาะเมื่อยังแก้ค่าอยู่ภายในขอบเขตนั้น พาธต้องไม่มีไบต์ null และต้องสั้นกว่า 4096 อักขระอย่างเคร่งครัดทั้งก่อนและหลังการแก้ค่า. - การเขียนที่ OpenClaw เป็นเจ้าของซึ่งเปลี่ยนเฉพาะส่วนระดับบนสุดหนึ่งส่วนที่รองรับโดย include แบบไฟล์เดียว จะเขียนทะลุไปยังไฟล์ที่ถูกรวมนั้น ตัวอย่างเช่น
plugins installอัปเดตplugins: { $include: "./plugins.json5" }ในplugins.json5และคงopenclaw.jsonไว้ตามเดิม. - Root includes, อาร์เรย์ include, และ includes ที่มีการแทนที่ด้วยคีย์พี่น้องเป็นแบบอ่านอย่างเดียวสำหรับการเขียนที่ OpenClaw เป็นเจ้าของ; การเขียนเหล่านั้นจะล้มเหลวแบบปิดแทนที่จะ flatten การตั้งค่า.
- ข้อผิดพลาด: ข้อความที่ชัดเจนสำหรับไฟล์ที่หายไป, ข้อผิดพลาดการ parse, includes แบบวนซ้ำ, รูปแบบพาธที่ไม่ถูกต้อง, และความยาวเกินกำหนด.
ที่เกี่ยวข้อง: การตั้งค่า · ตัวอย่างการตั้งค่า · Doctor