Gateway
Referensi konfigurasi
Referensi konfigurasi inti untuk ~/.openclaw/openclaw.json. Untuk ikhtisar berorientasi tugas, lihat Konfigurasi.
Mencakup permukaan konfigurasi utama OpenClaw dan menautkan keluar ketika suatu subsistem memiliki referensi yang lebih mendalam. Katalog perintah milik kanal dan Plugin serta kenop memori/QMD mendalam berada di halaman masing-masing, bukan di halaman ini.
Kebenaran kode:
openclaw config schemamencetak JSON Schema live yang digunakan untuk validasi dan Control UI, dengan metadata bawaan/Plugin/kanal digabungkan saat tersediaconfig.schema.lookupmengembalikan satu node skema berbasis cakupan path untuk tooling drill-downpnpm config:docs:check/pnpm config:docs:genmemvalidasi hash baseline dokumentasi konfigurasi terhadap permukaan skema saat ini
Path pencarian agen: gunakan aksi alat gateway config.schema.lookup untuk
dokumentasi dan batasan tingkat field yang tepat sebelum mengedit. Gunakan
Konfigurasi untuk panduan berorientasi tugas dan halaman ini
untuk peta field yang lebih luas, default, serta tautan ke referensi subsistem.
Referensi mendalam khusus:
- Referensi konfigurasi memori untuk
agents.defaults.memorySearch.*,memory.qmd.*,memory.citations, dan konfigurasi dreaming di bawahplugins.entries.memory-core.config.dreaming - Perintah slash untuk katalog perintah bawaan + paket saat ini
- halaman kanal/Plugin pemilik untuk permukaan perintah khusus kanal
Format konfigurasi adalah JSON5 (komentar + koma akhir diperbolehkan). Semua field bersifat opsional - OpenClaw menggunakan default aman saat dihilangkan.
Kanal
Kunci konfigurasi per kanal dipindahkan ke halaman khusus - lihat
Konfigurasi - kanal untuk channels.*,
termasuk Slack, Discord, Telegram, WhatsApp, Matrix, iMessage, dan kanal
bawaan lainnya (auth, kontrol akses, multi-akun, gating mention).
Default agen, multi-agen, sesi, dan pesan
Dipindahkan ke halaman khusus - lihat Konfigurasi - agen untuk:
agents.defaults.*(workspace, model, thinking, heartbeat, memori, media, skills, sandbox)multiAgent.*(routing dan binding multi-agen)session.*(siklus hidup sesi, compaction, pruning)messages.*(pengiriman pesan, TTS, rendering markdown)talk.*(mode Talk)talk.speechLocale: id locale BCP 47 opsional untuk pengenalan ucapan Talk di iOS/macOStalk.silenceTimeoutMs: saat tidak diatur, Talk mempertahankan jendela jeda default platform sebelum mengirim transkrip (700 ms on macOS and Android, 900 ms on iOS)
Alat dan provider kustom
Kebijakan alat, toggle eksperimental, konfigurasi alat berbasis provider, dan setup provider / URL dasar kustom dipindahkan ke halaman khusus - lihat Konfigurasi - alat dan provider kustom.
Model
Definisi provider, allowlist model, dan setup provider kustom berada di
Konfigurasi - alat dan provider kustom.
Root models juga memiliki perilaku katalog model global.
{
models: {
// Optional. Default: true. Requires a Gateway restart when changed.
pricing: { enabled: false },
},
}
models.mode: perilaku katalog provider (mergeataureplace).models.providers: peta provider kustom yang dikunci berdasarkan id provider.models.pricing.enabled: mengontrol bootstrap harga latar belakang yang dimulai setelah sidecar dan kanal mencapai path Gateway siap. Saatfalse, Gateway melewati fetch katalog harga OpenRouter dan LiteLLM; nilaimodels.providers.*.models[].costyang dikonfigurasi tetap berfungsi untuk estimasi biaya lokal.
MCP
Definisi server MCP yang dikelola OpenClaw berada di bawah mcp.servers dan
dikonsumsi oleh Pi tertanam serta adapter runtime lainnya. Perintah openclaw mcp list,
show, set, dan unset mengelola blok ini tanpa terhubung ke
server target selama pengeditan konfigurasi.
{
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
headers: {
Authorization: "Bearer ${MCP_REMOTE_TOKEN}",
},
},
},
},
}
mcp.servers: definisi server MCP stdio atau remote bernama untuk runtime yang mengekspos alat MCP yang dikonfigurasi. Entri remote menggunakantransport: "streamable-http"atautransport: "sse";type: "http"adalah alias native CLI yang dinormalisasi olehopenclaw mcp setdanopenclaw doctor --fixke fieldtransportkanonis.mcp.sessionIdleTtlMs: TTL idle untuk runtime MCP bawaan berbasis cakupan sesi. Eksekusi tertanam sekali jalan meminta pembersihan akhir eksekusi; TTL ini adalah penyangga untuk sesi berumur panjang dan pemanggil mendatang.- Perubahan di bawah
mcp.*diterapkan panas dengan membuang runtime MCP sesi yang di-cache. Discovery/penggunaan alat berikutnya membuatnya ulang dari konfigurasi baru, sehingga entrimcp.serversyang dihapus langsung dipanen alih-alih menunggu TTL idle.
Lihat MCP dan Backend CLI untuk perilaku runtime.
Skills
{
skills: {
allowBundled: ["gemini", "peekaboo"],
load: {
extraDirs: ["~/Projects/agent-scripts/skills"],
},
install: {
preferBrew: true,
nodeManager: "npm", // npm | pnpm | yarn | bun
},
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 opsional hanya untuk Skills bawaan (Skills terkelola/workspace tidak terpengaruh).load.extraDirs: root skill bersama tambahan (presedensi terendah).install.preferBrew: saat true, lebih memilih installer Homebrew ketikabrewtersedia sebelum fallback ke jenis installer lain.install.nodeManager: preferensi installer Node untuk spesifikasimetadata.openclaw.install(npm|pnpm|yarn|bun).entries.<skillKey>.enabled: falsemenonaktifkan skill meskipun bawaan/terinstal.entries.<skillKey>.apiKey: kemudahan untuk Skills yang mendeklarasikan env var utama (string plaintext atau objek SecretRef).
Plugin
{
plugins: {
enabled: true,
allow: ["voice-call"],
bundledDiscovery: "allowlist",
deny: [],
load: {
paths: ["~/Projects/oss/voice-call-plugin"],
},
entries: {
"voice-call": {
enabled: true,
hooks: {
allowPromptInjection: false,
},
config: { provider: "twilio" },
},
},
},
}
- Dimuat dari
~/.openclaw/extensions,<workspace>/.openclaw/extensions, ditambahplugins.load.paths. - Discovery menerima Plugin native OpenClaw plus bundle Codex yang kompatibel dan bundle Claude, termasuk bundle layout default Claude tanpa manifest.
- Perubahan konfigurasi memerlukan restart gateway.
allow: allowlist opsional (hanya Plugin yang tercantum yang dimuat).denymenang.bundledDiscovery: default ke"allowlist"untuk konfigurasi baru, sehinggaplugins.allowyang tidak kosong juga membatasi Plugin provider bawaan, termasuk provider runtime web-search. Doctor menulis"compat"untuk konfigurasi allowlist legacy yang dimigrasikan untuk mempertahankan perilaku provider bawaan yang ada sampai Anda ikut serta.plugins.entries.<id>.apiKey: field kemudahan kunci API tingkat Plugin (saat didukung oleh Plugin).plugins.entries.<id>.env: peta env var berbasis cakupan Plugin.plugins.entries.<id>.hooks.allowPromptInjection: saatfalse, core memblokirbefore_prompt_builddan mengabaikan field yang memutasi prompt daribefore_agent_startlegacy, sambil mempertahankanmodelOverridedanproviderOverridelegacy. Berlaku untuk hook Plugin native dan direktori hook yang disediakan bundle yang didukung.plugins.entries.<id>.hooks.allowConversationAccess: saattrue, Plugin non-bawaan tepercaya dapat membaca konten percakapan mentah dari hook bertipe sepertillm_input,llm_output,before_model_resolve,before_agent_reply,before_agent_run,before_agent_finalize, danagent_end.plugins.entries.<id>.subagent.allowModelOverride: secara eksplisit memercayai Plugin ini untuk meminta overrideproviderdanmodelper-eksekusi untuk eksekusi subagen latar belakang.plugins.entries.<id>.subagent.allowedModels: allowlist opsional targetprovider/modelkanonis untuk override subagen tepercaya. Gunakan"*"hanya saat Anda sengaja ingin mengizinkan model apa pun.plugins.entries.<id>.config: objek konfigurasi yang didefinisikan Plugin (divalidasi oleh skema Plugin native OpenClaw saat tersedia).- Pengaturan akun/runtime Plugin kanal berada di bawah
channels.<id>dan harus dijelaskan oleh metadatachannelConfigsmanifest Plugin pemiliknya, bukan oleh registry opsi OpenClaw pusat. plugins.entries.firecrawl.config.webFetch: pengaturan provider web-fetch Firecrawl.apiKey: kunci API Firecrawl (menerima SecretRef). Fallback keplugins.entries.firecrawl.config.webSearch.apiKey, legacytools.web.fetch.firecrawl.apiKey, atau env varFIRECRAWL_API_KEY.baseUrl: URL dasar API Firecrawl (default:https://api.firecrawl.dev; override self-hosted harus menarget endpoint private/internal).onlyMainContent: mengekstrak hanya konten utama dari halaman (default:true).maxAgeMs: usia cache maksimum dalam milidetik (default:172800000/ 2 hari).timeoutSeconds: timeout permintaan scrape dalam detik (default:60).
plugins.entries.xai.config.xSearch: pengaturan xAI X Search (pencarian web Grok).enabled: mengaktifkan provider X Search.model: model Grok yang digunakan untuk pencarian (misalnya"grok-4-1-fast").
plugins.entries.memory-core.config.dreaming: pengaturan memory dreaming. Lihat Dreaming untuk fase dan ambang.enabled: sakelar utama dreaming (defaultfalse).frequency: cadence Cron untuk setiap sweep dreaming penuh ("0 3 * * *"secara default).model: override model subagen Dream Diary opsional. Memerlukanplugins.entries.memory-core.subagent.allowModelOverride: true; padukan denganallowedModelsuntuk membatasi target. Error model tidak tersedia dicoba ulang sekali dengan model default sesi; kegagalan kepercayaan atau allowlist tidak fallback diam-diam.- kebijakan fase dan ambang adalah detail implementasi (bukan kunci konfigurasi yang berhadapan dengan pengguna).
- Konfigurasi memori lengkap berada di Referensi konfigurasi memori:
agents.defaults.memorySearch.*memory.backendmemory.citationsmemory.qmd.*plugins.entries.memory-core.config.dreaming
- Plugin bundle Claude yang diaktifkan juga dapat menyumbangkan default Pi tertanam dari
settings.json; OpenClaw menerapkannya sebagai pengaturan agen yang disanitasi, bukan sebagai patch konfigurasi OpenClaw mentah. plugins.slots.memory: pilih id Plugin memori aktif, atau"none"untuk menonaktifkan Plugin memori.plugins.slots.contextEngine: pilih id Plugin mesin konteks aktif; default ke"legacy"kecuali Anda menginstal dan memilih mesin lain.
Lihat Plugin.
Komitmen
commitments mengontrol memori tindak lanjut yang disimpulkan: OpenClaw dapat mendeteksi check-in dari giliran percakapan dan mengirimkannya melalui eksekusi heartbeat.
commitments.enabled: mengaktifkan ekstraksi LLM tersembunyi, penyimpanan, dan pengiriman heartbeat untuk komitmen tindak lanjut yang disimpulkan. Default:false.commitments.maxPerDay: jumlah maksimum komitmen tindak lanjut yang disimpulkan yang dikirim per sesi agen dalam hari bergulir. Default:3.
Lihat Komitmen yang disimpulkan.
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: falsemenonaktifkanact:evaluatedanwait --fn.tabCleanupmengambil kembali tab agen utama terlacak setelah waktu idle atau ketika sebuah sesi melebihi batasnya. AturidleMinutes: 0ataumaxTabsPerSession: 0untuk menonaktifkan masing-masing mode pembersihan tersebut.ssrfPolicy.dangerouslyAllowPrivateNetworkdinonaktifkan ketika tidak diatur, sehingga navigasi browser tetap ketat secara default.- Atur
ssrfPolicy.dangerouslyAllowPrivateNetwork: truehanya ketika Anda sengaja memercayai navigasi browser jaringan privat. - Dalam mode ketat, endpoint profil CDP jarak jauh (
profiles.*.cdpUrl) tunduk pada pemblokiran jaringan privat yang sama selama pemeriksaan keterjangkauan/penemuan. ssrfPolicy.allowPrivateNetworktetap didukung sebagai alias lama.- Dalam mode ketat, gunakan
ssrfPolicy.hostnameAllowlistdanssrfPolicy.allowedHostnamesuntuk pengecualian eksplisit. - Profil jarak jauh bersifat hanya-lampirkan (mulai/henti/reset dinonaktifkan).
profiles.*.cdpUrlmenerimahttp://,https://,ws://, danwss://. Gunakan HTTP(S) ketika Anda ingin OpenClaw menemukan/json/version; gunakan WS(S) ketika penyedia Anda memberi URL WebSocket DevTools langsung.remoteCdpTimeoutMsdanremoteCdpHandshakeTimeoutMsberlaku untuk keterjangkauan CDP jarak jauh danattachOnly, plus permintaan pembukaan tab. Profil loopback terkelola mempertahankan default CDP lokal.- Jika layanan CDP yang dikelola secara eksternal dapat dijangkau melalui loopback, atur
attachOnly: truepada profil tersebut; jika tidak, OpenClaw memperlakukan port loopback sebagai profil browser terkelola lokal dan dapat melaporkan kesalahan kepemilikan port lokal. - Profil
existing-sessionmenggunakan Chrome MCP, bukan CDP, dan dapat melampirkan pada host yang dipilih atau melalui node browser yang terhubung. - Profil
existing-sessiondapat mengaturuserDataDiruntuk menargetkan profil browser berbasis Chromium tertentu seperti Brave atau Edge. - Profil
existing-sessionmempertahankan batas rute Chrome MCP saat ini: tindakan berbasis snapshot/ref, bukan penargetan pemilih CSS, hook unggah satu file, tanpa penggantian batas waktu dialog, tanpawait --load networkidle, dan tanparesponsebody, ekspor PDF, intersepsi unduhan, atau tindakan batch. - Profil
openclawterkelola lokal menetapkan otomatiscdpPortdancdpUrl; hanya aturcdpUrlsecara eksplisit untuk CDP jarak jauh. - Profil terkelola lokal dapat mengatur
executablePathuntuk menggantibrowser.executablePathglobal pada profil tersebut. Gunakan ini untuk menjalankan satu profil di Chrome dan profil lain di Brave. - Profil terkelola lokal menggunakan
browser.localLaunchTimeoutMsuntuk penemuan HTTP CDP Chrome setelah proses dimulai danbrowser.localCdpReadyTimeoutMsuntuk kesiapan websocket CDP pascapeluncuran. Naikkan nilainya pada host yang lebih lambat ketika Chrome berhasil dimulai tetapi pemeriksaan kesiapan berkejaran dengan startup. Kedua nilai harus berupa bilangan bulat positif hingga120000ms; nilai konfigurasi yang tidak valid ditolak. - Urutan deteksi otomatis: browser default jika berbasis Chromium → Chrome → Brave → Edge → Chromium → Chrome Canary.
browser.executablePathdanbrowser.profiles.<name>.executablePathsama-sama menerima~dan~/...untuk direktori home OS Anda sebelum peluncuran Chromium.userDataDirper profil pada profilexisting-sessionjuga diperluas dari tilde.- Layanan kontrol: hanya loopback (port diturunkan dari
gateway.port, default18791). extraArgsmenambahkan flag peluncuran ekstra ke startup Chromium lokal (misalnya--disable-gpu, ukuran jendela, atau flag debug).
UI
{
ui: {
seamColor: "#FF4500",
assistant: {
name: "OpenClaw",
avatar: "CB", // emoji, short text, image URL, or data URI
},
},
}
seamColor: warna aksen untuk chrome UI aplikasi native (warna gelembung Talk Mode, dll.).assistant: pengganti identitas Control UI. Kembali ke identitas agen aktif jika tidak diatur.
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://gateway.tailnet: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
allow: ["gateway"],
},
push: {
apns: {
relay: {
baseUrl: "https://relay.example.com",
timeoutMs: 10000,
},
},
},
},
}
Gateway field details
mode:local(jalankan gateway) atauremote(hubungkan ke gateway jarak jauh). Gateway menolak untuk dimulai kecualilocal.port: port tunggal termultipleks untuk WS + HTTP. Prioritas:--port>OPENCLAW_GATEWAY_PORT>gateway.port>18789.bind:auto,loopback(default),lan(0.0.0.0),tailnet(hanya IP Tailscale), ataucustom.- Alias bind lama: gunakan nilai mode bind di
gateway.bind(auto,loopback,lan,tailnet,custom), bukan alias host (0.0.0.0,127.0.0.1,localhost,::,::1). - Catatan Docker: bind
loopbackdefault mendengarkan di127.0.0.1di dalam kontainer. Dengan jaringan bridge Docker (-p 18789:18789), lalu lintas tiba dieth0, sehingga gateway tidak dapat dijangkau. Gunakan--network host, atau aturbind: "lan"(ataubind: "custom"dengancustomBindHost: "0.0.0.0") agar mendengarkan di semua antarmuka. - Auth: diwajibkan secara default. Bind non-loopback memerlukan auth gateway. Dalam praktiknya, ini berarti token/kata sandi bersama atau reverse proxy sadar identitas dengan
gateway.auth.mode: "trusted-proxy". Wizard onboarding menghasilkan token secara default. - Jika
gateway.auth.tokendangateway.auth.passwordsama-sama dikonfigurasi (termasuk SecretRefs), aturgateway.auth.modesecara eksplisit ketokenataupassword. Alur startup dan pemasangan/perbaikan layanan gagal ketika keduanya dikonfigurasi dan mode belum diatur. gateway.auth.mode: "none": mode tanpa auth eksplisit. Gunakan hanya untuk setup local loopback tepercaya; ini sengaja tidak ditawarkan oleh prompt onboarding.gateway.auth.mode: "trusted-proxy": delegasikan auth browser/pengguna ke reverse proxy sadar identitas dan percayai header identitas darigateway.trustedProxies(lihat Auth Proxy Tepercaya). Mode ini mengharapkan sumber proxy non-loopback secara default; reverse proxy loopback pada host yang sama memerlukangateway.auth.trustedProxy.allowLoopback = truesecara eksplisit. Pemanggil internal pada host yang sama dapat menggunakangateway.auth.passwordsebagai fallback langsung lokal;gateway.auth.tokentetap saling eksklusif dengan mode trusted-proxy.gateway.auth.allowTailscale: ketikatrue, header identitas Tailscale Serve dapat memenuhi auth UI Kontrol/WebSocket (diverifikasi melaluitailscale whois). Endpoint HTTP API tidak menggunakan auth header Tailscale tersebut; endpoint mengikuti mode auth HTTP normal gateway sebagai gantinya. Alur tanpa token ini mengasumsikan host gateway tepercaya. Default ketrueketikatailscale.mode = "serve".gateway.auth.rateLimit: limiter auth-gagal opsional. Berlaku per IP klien dan per cakupan auth (shared-secret dan device-token dilacak secara independen). Percobaan yang diblokir mengembalikan429+Retry-After.- Pada jalur UI Kontrol Tailscale Serve async, percobaan gagal untuk
{scope, clientIp}yang sama diserialisasi sebelum penulisan kegagalan. Karena itu, percobaan buruk bersamaan dari klien yang sama dapat memicu limiter pada permintaan kedua, alih-alih keduanya berlomba lolos sebagai ketidakcocokan biasa. gateway.auth.rateLimit.exemptLoopbackdefault ketrue; aturfalseketika Anda sengaja ingin lalu lintas localhost juga dibatasi lajunya (untuk setup pengujian atau deployment proxy ketat).- Percobaan auth WS asal browser selalu dibatasi lajunya dengan pengecualian loopback dinonaktifkan (defense-in-depth terhadap brute force localhost berbasis browser).
- Pada loopback, penguncian asal browser tersebut diisolasi per nilai
Originyang dinormalisasi, sehingga kegagalan berulang dari satu asal localhost tidak otomatis mengunci asal lain. tailscale.mode:serve(hanya tailnet, bind loopback) ataufunnel(publik, memerlukan auth).controlUi.allowedOrigins: daftar izin asal browser eksplisit untuk koneksi WebSocket Gateway. Wajib ketika klien browser diharapkan berasal dari asal non-loopback.controlUi.chatMessageMaxWidth: max-width opsional untuk pesan chat UI Kontrol yang dikelompokkan. Menerima nilai lebar CSS terbatas seperti960px,82%,min(1280px, 82%), dancalc(100% - 2rem).controlUi.dangerouslyAllowHostHeaderOriginFallback: mode berbahaya yang mengaktifkan fallback asal header Host untuk deployment yang sengaja bergantung pada kebijakan asal header Host.remote.transport:ssh(default) ataudirect(ws/wss). Untukdirect,remote.urlharus berupaws://atauwss://.OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1: override darurat lingkungan proses sisi klien yang mengizinkan plaintextws://ke IP jaringan privat tepercaya; default tetap hanya loopback untuk plaintext. Tidak ada padananopenclaw.json, dan konfigurasi jaringan privat browser sepertibrowser.ssrfPolicy.dangerouslyAllowPrivateNetworktidak memengaruhi klien WebSocket Gateway.gateway.remote.token/.passwordadalah field kredensial klien jarak jauh. Keduanya tidak mengonfigurasi auth gateway sendiri.gateway.push.apns.relay.baseUrl: URL HTTPS dasar untuk relay APNs eksternal yang digunakan oleh build iOS resmi/TestFlight setelah build tersebut menerbitkan registrasi berbasis relay ke gateway. URL ini harus cocok dengan URL relay yang dikompilasi ke dalam build iOS.gateway.push.apns.relay.timeoutMs: timeout pengiriman gateway-ke-relay dalam milidetik. Default ke10000.- Registrasi berbasis relay didelegasikan ke identitas gateway tertentu. Aplikasi iOS yang dipasangkan mengambil
gateway.identity.get, menyertakan identitas tersebut dalam registrasi relay, dan meneruskan grant pengiriman bercakupan registrasi ke gateway. Gateway lain tidak dapat menggunakan ulang registrasi tersimpan tersebut. OPENCLAW_APNS_RELAY_BASE_URL/OPENCLAW_APNS_RELAY_TIMEOUT_MS: override env sementara untuk konfigurasi relay di atas.OPENCLAW_APNS_RELAY_ALLOW_HTTP=true: pintasan khusus pengembangan untuk URL relay HTTP loopback. URL relay produksi sebaiknya tetap menggunakan HTTPS.gateway.handshakeTimeoutMs: timeout handshake WebSocket Gateway pra-auth dalam milidetik. Default:15000.OPENCLAW_HANDSHAKE_TIMEOUT_MSdiprioritaskan ketika diatur. Tingkatkan ini pada host yang terbebani atau berdaya rendah ketika klien lokal dapat terhubung saat pemanasan startup masih selesai.gateway.channelHealthCheckMinutes: interval monitor kesehatan channel dalam menit. Atur0untuk menonaktifkan restart monitor kesehatan secara global. Default:5.gateway.channelStaleEventThresholdMinutes: ambang socket basi dalam menit. Pertahankan ini lebih besar dari atau sama dengangateway.channelHealthCheckMinutes. Default:30.gateway.channelMaxRestartsPerHour: restart monitor kesehatan maksimum per channel/akun dalam satu jam bergulir. Default:10.channels.<provider>.healthMonitor.enabled: opt-out per channel untuk restart monitor kesehatan sambil tetap mengaktifkan monitor global.channels.<provider>.accounts.<accountId>.healthMonitor.enabled: override per akun untuk channel multi-akun. Ketika diatur, ini diprioritaskan atas override tingkat channel.- Jalur panggilan gateway lokal dapat menggunakan
gateway.remote.*sebagai fallback hanya ketikagateway.auth.*belum diatur. - Jika
gateway.auth.token/gateway.auth.passworddikonfigurasi secara eksplisit melalui SecretRef dan tidak terselesaikan, resolusi gagal tertutup (tanpa masking fallback jarak jauh). trustedProxies: IP reverse proxy yang menghentikan TLS atau menyisipkan header klien yang diteruskan. Cantumkan hanya proxy yang Anda kontrol. Entri loopback tetap valid untuk setup proxy/deteksi lokal pada host yang sama (misalnya Tailscale Serve atau reverse proxy lokal), tetapi entri tersebut tidak membuat permintaan loopback memenuhi syarat untukgateway.auth.mode: "trusted-proxy".allowRealIpFallback: ketikatrue, gateway menerimaX-Real-IPjikaX-Forwarded-Forhilang. Defaultfalseuntuk perilaku gagal tertutup.gateway.nodes.pairing.autoApproveCidrs: daftar izin CIDR/IP opsional untuk menyetujui otomatis pemasangan perangkat node pertama kali tanpa cakupan yang diminta. Ini dinonaktifkan ketika belum diatur. Ini tidak menyetujui otomatis pemasangan operator/browser/UI Kontrol/WebChat, dan tidak menyetujui otomatis peningkatan peran, cakupan, metadata, atau kunci publik.gateway.nodes.allowCommands/gateway.nodes.denyCommands: pembentukan allow/deny global untuk perintah node yang dideklarasikan setelah pemasangan dan evaluasi daftar izin platform. GunakanallowCommandsuntuk ikut mengaktifkan perintah node berbahaya seperticamera.snap,camera.clip, danscreen.record;denyCommandsmenghapus perintah meskipun default platform atau izin eksplisit seharusnya menyertakannya. Setelah node mengubah daftar perintah yang dideklarasikan, tolak dan setujui ulang pemasangan perangkat tersebut agar gateway menyimpan snapshot perintah yang diperbarui.gateway.tools.deny: nama alat tambahan yang diblokir untuk HTTPPOST /tools/invoke(memperluas daftar penolakan default).gateway.tools.allow: hapus nama alat dari daftar penolakan HTTP default.
Endpoint kompatibel OpenAI
- Chat Completions: dinonaktifkan secara default. Aktifkan dengan
gateway.http.endpoints.chatCompletions.enabled: true. - Responses API:
gateway.http.endpoints.responses.enabled. - Penguatan input URL Responses:
gateway.http.endpoints.responses.maxUrlPartsgateway.http.endpoints.responses.files.urlAllowlistgateway.http.endpoints.responses.images.urlAllowlistDaftar izin kosong diperlakukan sebagai belum diatur; gunakangateway.http.endpoints.responses.files.allowUrl=falsedan/ataugateway.http.endpoints.responses.images.allowUrl=falseuntuk menonaktifkan pengambilan URL.
- Header penguatan respons opsional:
gateway.http.securityHeaders.strictTransportSecurity(atur hanya untuk asal HTTPS yang Anda kontrol; lihat Auth Proxy Tepercaya)
Isolasi multi-instans
Jalankan beberapa gateway pada satu host dengan port dan direktori state unik:
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \
OPENCLAW_STATE_DIR=~/.openclaw-a \
openclaw gateway --port 19001
Flag praktis: --dev (menggunakan ~/.openclaw-dev + port 19001), --profile <name> (menggunakan ~/.openclaw-<name>).
Lihat Beberapa Gateway.
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: mengaktifkan terminasi TLS pada listener gateway (HTTPS/WSS) (default:false).autoGenerate: menghasilkan otomatis pasangan cert/key lokal self-signed ketika file eksplisit tidak dikonfigurasi; hanya untuk penggunaan lokal/dev.certPath: path sistem berkas ke file sertifikat TLS.keyPath: path sistem berkas ke file kunci privat TLS; jaga agar izin tetap terbatas.caPath: path bundle CA opsional untuk verifikasi klien atau rantai kepercayaan kustom.
gateway.reload
{
gateway: {
reload: {
mode: "hybrid", // off | restart | hot | hybrid
debounceMs: 500,
deferralTimeoutMs: 300000,
},
},
}
mode: mengontrol bagaimana edit konfigurasi diterapkan saat runtime."off": abaikan edit langsung; perubahan memerlukan restart eksplisit."restart": selalu restart proses gateway saat konfigurasi berubah."hot": terapkan perubahan di dalam proses tanpa restart."hybrid"(default): coba hot reload terlebih dahulu; fallback ke restart jika diperlukan.
debounceMs: jendela debounce dalam ms sebelum perubahan konfigurasi diterapkan (bilangan bulat non-negatif).deferralTimeoutMs: waktu maksimum opsional dalam ms untuk menunggu operasi yang sedang berjalan sebelum memaksa restart atau hot reload channel. Hilangkan untuk menggunakan tunggu berbatas default (300000); atur0untuk menunggu tanpa batas dan mencatat peringatan masih-tertunda secara berkala.
Hook
{
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",
},
],
},
}
Autentikasi: Authorization: Bearer <token> atau x-openclaw-token: <token>.
Token hook dalam query string ditolak.
Catatan validasi dan keamanan:
hooks.enabled=truememerlukanhooks.tokenyang tidak kosong.hooks.tokenharus berbeda darigateway.auth.token; penggunaan ulang token Gateway ditolak.hooks.pathtidak boleh berupa/; gunakan subjalur khusus seperti/hooks.- Jika
hooks.allowRequestSessionKey=true, batasihooks.allowedSessionKeyPrefixes(misalnya["hook:"]). - Jika pemetaan atau preset menggunakan
sessionKeybertemplat, aturhooks.allowedSessionKeyPrefixesdanhooks.allowRequestSessionKey=true. Kunci pemetaan statis tidak memerlukan opt-in tersebut.
Titik akhir:
POST /hooks/wake→{ text, mode?: "now"|"next-heartbeat" }POST /hooks/agent→{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }sessionKeydari payload permintaan hanya diterima jikahooks.allowRequestSessionKey=true(default:false).
POST /hooks/<name>→ diselesaikan melaluihooks.mappings- Nilai
sessionKeypemetaan yang dirender dari templat diperlakukan sebagai nilai yang dipasok secara eksternal dan juga memerlukanhooks.allowRequestSessionKey=true.
- Nilai
Detail pemetaan
match.pathmencocokkan subjalur setelah/hooks(misalnya/hooks/gmail→gmail).match.sourcemencocokkan kolom payload untuk jalur generik.- Templat seperti
{{messages[0].subject}}dibaca dari payload. transformdapat menunjuk ke modul JS/TS yang mengembalikan tindakan hook.transform.moduleharus berupa jalur relatif dan tetap berada di dalamhooks.transformsDir(jalur absolut dan traversal ditolak).- Simpan
hooks.transformsDirdi bawah~/.openclaw/hooks/transforms; direktori skill workspace ditolak. Jikaopenclaw doctormelaporkan jalur ini tidak valid, pindahkan modul transform ke direktori transform hooks atau hapushooks.transformsDir. agentIdmerutekan ke agen tertentu; ID yang tidak dikenal akan fallback ke default.allowedAgentIds: membatasi perutean eksplisit (*atau dihilangkan = izinkan semua,[]= tolak semua).defaultSessionKey: kunci sesi tetap opsional untuk eksekusi agen hook tanpasessionKeyeksplisit.allowRequestSessionKey: mengizinkan pemanggil/hooks/agentdan kunci sesi pemetaan berbasis templat untuk mengatursessionKey(default:false).allowedSessionKeyPrefixes: daftar izin prefiks opsional untuk nilaisessionKeyeksplisit (permintaan + pemetaan), misalnya["hook:"]. Ini menjadi wajib ketika pemetaan atau preset apa pun menggunakansessionKeybertemplat.deliver: truemengirim balasan akhir ke channel;channeldefault kelast.modelmenimpa LLM untuk eksekusi hook ini (harus diizinkan jika katalog model diatur).
Integrasi Gmail
- Preset Gmail bawaan menggunakan
sessionKey: "hook:gmail:{{messages[0].id}}". - Jika Anda mempertahankan perutean per-pesan tersebut, atur
hooks.allowRequestSessionKey: truedan batasihooks.allowedSessionKeyPrefixesagar cocok dengan namespace Gmail, misalnya["hook:", "hook:gmail:"]. - Jika Anda memerlukan
hooks.allowRequestSessionKey: false, timpa preset dengansessionKeystatis alih-alih default bertemplat.
{
hooks: {
gmail: {
account: "[email protected]",
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 otomatis memulai
gog gmail watch servesaat boot jika dikonfigurasi. AturOPENCLAW_SKIP_GMAIL_WATCHER=1untuk menonaktifkannya. - Jangan menjalankan
gog gmail watch serveterpisah bersamaan dengan Gateway.
Host Plugin Canvas
{
plugins: {
entries: {
canvas: {
config: {
host: {
root: "~/.openclaw/workspace/canvas",
liveReload: true,
// enabled: false, // or OPENCLAW_SKIP_CANVAS_HOST=1
},
},
},
},
},
}
- Menyajikan HTML/CSS/JS yang dapat diedit agen dan A2UI melalui HTTP di bawah port Gateway:
http://<gateway-host>:<gateway.port>/__openclaw__/canvas/http://<gateway-host>:<gateway.port>/__openclaw__/a2ui/
- Hanya lokal: pertahankan
gateway.bind: "loopback"(default). - Bind non-loopback: rute canvas memerlukan autentikasi Gateway (token/kata sandi/proxy tepercaya), sama seperti permukaan HTTP Gateway lainnya.
- Node WebViews biasanya tidak mengirim header autentikasi; setelah node dipasangkan dan terhubung, Gateway mengiklankan URL capability bercakupan node untuk akses canvas/A2UI.
- URL capability terikat ke sesi WS node aktif dan cepat kedaluwarsa. Fallback berbasis IP tidak digunakan.
- Menyisipkan klien live-reload ke HTML yang disajikan.
- Otomatis membuat
index.htmlstarter saat kosong. - Juga menyajikan A2UI di
/__openclaw__/a2ui/. - Perubahan memerlukan mulai ulang gateway.
- Nonaktifkan live reload untuk direktori besar atau error
EMFILE.
Penemuan
mDNS (Bonjour)
{
discovery: {
mdns: {
mode: "minimal", // minimal | full | off
},
},
}
minimal(default ketika Pluginbonjourbawaan diaktifkan): hilangkancliPath+sshPortdari record TXT.full: sertakancliPath+sshPort; iklan multicast LAN tetap memerlukan Pluginbonjourbawaan untuk diaktifkan.off: menekan iklan multicast LAN tanpa mengubah pengaktifan Plugin.- Plugin
bonjourbawaan otomatis dimulai pada host macOS dan bersifat opt-in pada deployment Gateway Linux, Windows, dan terkontainerisasi. - Nama host default ke nama host sistem ketika merupakan label DNS yang valid, dengan fallback ke
openclaw. Timpa denganOPENCLAW_MDNS_HOSTNAME.
Area luas (DNS-SD)
{
discovery: {
wideArea: { enabled: true },
},
}
Menulis zona DNS-SD unicast di bawah ~/.openclaw/dns/. Untuk penemuan lintas jaringan, pasangkan dengan server DNS (CoreDNS direkomendasikan) + DNS terpisah Tailscale.
Penyiapan: openclaw dns setup --apply.
Lingkungan
env (variabel lingkungan inline)
{
env: {
OPENROUTER_API_KEY: "sk-or-...",
vars: {
GROQ_API_KEY: "gsk-...",
},
shellEnv: {
enabled: true,
timeoutMs: 15000,
},
},
}
- Variabel lingkungan inline hanya diterapkan jika variabel lingkungan proses tidak memiliki key tersebut.
- File
.env:.envCWD +~/.openclaw/.env(keduanya tidak menimpa variabel yang sudah ada). shellEnv: mengimpor key yang diharapkan tetapi belum ada dari profil shell login Anda.- Lihat Lingkungan untuk prioritas lengkap.
Substitusi variabel lingkungan
Rujuk variabel lingkungan dalam string konfigurasi apa pun dengan ${VAR_NAME}:
{
gateway: {
auth: { token: "${OPENCLAW_GATEWAY_TOKEN}" },
},
}
- Hanya nama huruf besar yang cocok:
[A-Z_][A-Z0-9_]*. - Variabel yang hilang/kosong akan memunculkan error saat konfigurasi dimuat.
- Escape dengan
$${VAR}untuk literal${VAR}. - Berfungsi dengan
$include.
Rahasia
Referensi rahasia bersifat aditif: nilai plaintext tetap berfungsi.
SecretRef
Gunakan satu bentuk objek:
{ source: "env" | "file" | "exec", provider: "default", id: "..." }
Validasi:
- Pola
provider:^[a-z][a-z0-9_-]{0,63}$ - Pola id
source: "env":^[A-Z][A-Z0-9_]{0,127}$ - id
source: "file": pointer JSON absolut (misalnya"/providers/openai/apiKey") - Pola id
source: "exec":^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$ - id
source: "exec"tidak boleh berisi segmen path yang dipisahkan slash berupa.atau..(misalnyaa/../bditolak)
Permukaan kredensial yang didukung
- Matriks kanonis: Permukaan Kredensial SecretRef
- Target
secrets applymendukung path kredensialopenclaw.json. - Referensi
auth-profiles.jsondisertakan dalam resolusi runtime dan cakupan audit.
Konfigurasi penyedia rahasia
{
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",
},
},
}
Catatan:
- Penyedia
filemendukungmode: "json"danmode: "singleValue"(idharus berupa"value"dalam mode singleValue). - Path penyedia file dan exec gagal tertutup saat verifikasi ACL Windows tidak tersedia. Tetapkan
allowInsecurePath: truehanya untuk path tepercaya yang tidak dapat diverifikasi. - Penyedia
execmemerlukan pathcommandabsolut dan menggunakan payload protokol pada stdin/stdout. - Secara default, path perintah symlink ditolak. Tetapkan
allowSymlinkCommand: trueuntuk mengizinkan path symlink sambil memvalidasi path target yang di-resolve. - Jika
trustedDirsdikonfigurasi, pemeriksaan direktori tepercaya diterapkan pada path target yang di-resolve. - Lingkungan child
execminimal secara default; teruskan variabel yang diperlukan secara eksplisit denganpassEnv. - Referensi rahasia di-resolve saat aktivasi menjadi snapshot dalam memori, lalu path permintaan hanya membaca snapshot tersebut.
- Pemfilteran permukaan aktif diterapkan selama aktivasi: referensi yang belum di-resolve pada permukaan yang diaktifkan menggagalkan startup/reload, sedangkan permukaan tidak aktif dilewati dengan diagnostik.
Penyimpanan autentikasi
{
auth: {
profiles: {
"anthropic:default": { provider: "anthropic", mode: "api_key" },
"anthropic:work": { provider: "anthropic", mode: "api_key" },
"openai-codex:personal": { provider: "openai-codex", mode: "oauth" },
},
order: {
anthropic: ["anthropic:default", "anthropic:work"],
"openai-codex": ["openai-codex:personal"],
},
},
}
- Profil per-agent disimpan di
<agentDir>/auth-profiles.json. auth-profiles.jsonmendukung referensi tingkat nilai (keyRefuntukapi_key,tokenRefuntuktoken) untuk mode kredensial statis.- Map datar lama
auth-profiles.jsonseperti{ "provider": { "apiKey": "..." } }bukan format runtime;openclaw doctor --fixmenulis ulang map tersebut menjadi profil API-keyprovider:defaultkanonis dengan cadangan.legacy-flat.*.bak. - Profil mode OAuth (
auth.profiles.<id>.mode = "oauth") tidak mendukung kredensial auth-profile yang didukung SecretRef. - Kredensial runtime statis berasal dari snapshot yang telah di-resolve dalam memori; entri statis lama
auth.jsondibersihkan saat ditemukan. - Impor OAuth lama berasal dari
~/.openclaw/credentials/oauth.json. - Lihat OAuth.
- Perilaku runtime rahasia dan tooling
audit/configure/apply: Manajemen Rahasia.
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 dasar dalam jam ketika profil gagal karena kesalahan billing/kredit-tidak-mencukupi yang sebenarnya (default:5). Teks billing eksplisit masih dapat masuk ke sini bahkan pada respons401/403, tetapi pencocok teks khusus penyedia tetap dibatasi pada penyedia yang memilikinya (misalnya OpenRouterKey limit exceeded). Pesan HTTP402yang dapat dicoba ulang untuk jendela penggunaan atau batas pengeluaran organisasi/workspace tetap berada di jalurrate_limit.billingBackoffHoursByProvider: override opsional per penyedia untuk jam backoff billing.billingMaxHours: batas dalam jam untuk pertumbuhan eksponensial backoff billing (default:24).authPermanentBackoffMinutes: backoff dasar dalam menit untuk kegagalanauth_permanentdengan keyakinan tinggi (default:10).authPermanentMaxMinutes: batas dalam menit untuk pertumbuhan backoffauth_permanent(default:60).failureWindowHours: jendela bergulir dalam jam yang digunakan untuk penghitung backoff (default:24).overloadedProfileRotations: jumlah maksimum rotasi auth-profile pada penyedia yang sama untuk kesalahan overloaded sebelum beralih ke fallback model (default:1). Bentuk provider-busy sepertiModelNotReadyExceptionmasuk ke sini.overloadedBackoffMs: jeda tetap sebelum mencoba ulang rotasi penyedia/profil yang overloaded (default:0).rateLimitedProfileRotations: jumlah maksimum rotasi auth-profile pada penyedia yang sama untuk kesalahan rate-limit sebelum beralih ke fallback model (default:1). Bucket rate-limit tersebut mencakup teks berbentuk penyedia sepertiToo many concurrent requests,ThrottlingException,concurrency limit reached,workers_ai ... quota limit exceeded, danresource exhausted.
Pencatatan log
{
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"],
},
}
- File log default:
/tmp/openclaw/openclaw-YYYY-MM-DD.log. - Atur
logging.fileuntuk path yang stabil. consoleLevelnaik menjadidebugketika--verbose.maxFileBytes: ukuran maksimum file log aktif dalam byte sebelum rotasi (bilangan bulat positif; default:104857600= 100 MB). OpenClaw menyimpan hingga lima arsip bernomor di samping file aktif.redactSensitive/redactPatterns: penyamaran upaya terbaik untuk output konsol, log file, catatan log OTLP, dan teks transkrip sesi yang dipersistenkan.redactSensitive: "off"hanya menonaktifkan kebijakan log/transkrip umum ini; permukaan keamanan UI/tool/diagnostik tetap menyamarkan rahasia sebelum emisi.
Diagnostik
{
diagnostics: {
enabled: true,
flags: ["telegram.*"],
stuckSessionWarnMs: 30000,
stuckSessionAbortMs: 600000,
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,
sampleRate: 1.0,
flushIntervalMs: 5000,
captureContent: {
enabled: false,
inputMessages: false,
outputMessages: false,
toolInputs: false,
toolOutputs: false,
systemPrompt: false,
},
},
cacheTrace: {
enabled: false,
filePath: "~/.openclaw/logs/cache-trace.jsonl",
includeMessages: true,
includePrompt: true,
includeSystem: true,
},
},
}
enabled: toggle utama untuk output instrumentasi (default:true).flags: array string flag yang mengaktifkan output log tertarget (mendukung wildcard seperti"telegram.*"atau"*").stuckSessionWarnMs: ambang usia tanpa progres dalam ms untuk mengklasifikasikan sesi pemrosesan berjalan lama sebagaisession.long_running,session.stalled, atausession.stuck. Balasan, tool, status, blok, dan progres ACP mereset timer; diagnostiksession.stuckberulang melakukan backoff selama tidak berubah.stuckSessionAbortMs: ambang usia tanpa progres dalam ms sebelum pekerjaan aktif yang stalled dan memenuhi syarat dapat di-abort-drain untuk pemulihan. Jika tidak disetel, OpenClaw menggunakan jendela embedded-run diperpanjang yang lebih aman setidaknya 10 menit dan 5xstuckSessionWarnMs.otel.enabled: mengaktifkan pipeline ekspor OpenTelemetry (default:false). Untuk konfigurasi lengkap, katalog sinyal, dan model privasi, lihat Ekspor OpenTelemetry.otel.endpoint: URL collector untuk ekspor OTel.otel.tracesEndpoint/otel.metricsEndpoint/otel.logsEndpoint: endpoint OTLP opsional khusus sinyal. Ketika disetel, nilai ini menggantikanotel.endpointhanya untuk sinyal tersebut.otel.protocol:"http/protobuf"(default) atau"grpc".otel.headers: header metadata HTTP/gRPC tambahan yang dikirim dengan permintaan ekspor OTel.otel.serviceName: nama layanan untuk atribut resource.otel.traces/otel.metrics/otel.logs: aktifkan ekspor trace, metrik, atau log.otel.sampleRate: tingkat sampling trace0-1.otel.flushIntervalMs: interval flush telemetri berkala dalam ms.otel.captureContent: pengambilan konten mentah opt-in untuk atribut span OTEL. Defaultnya nonaktif. Booleantruemenangkap konten pesan/tool non-sistem; bentuk objek memungkinkan Anda mengaktifkaninputMessages,outputMessages,toolInputs,toolOutputs, dansystemPromptsecara eksplisit.OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental: toggle lingkungan untuk atribut penyedia span GenAI eksperimental terbaru. Secara default, span mempertahankan atribut lamagen_ai.systemuntuk kompatibilitas; metrik GenAI menggunakan atribut semantik terbatas.OPENCLAW_OTEL_PRELOADED=1: toggle lingkungan untuk host yang sudah mendaftarkan SDK OpenTelemetry global. OpenClaw kemudian melewati startup/shutdown SDK milik Plugin sambil tetap menjaga listener diagnostik aktif.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,OTEL_EXPORTER_OTLP_METRICS_ENDPOINT, danOTEL_EXPORTER_OTLP_LOGS_ENDPOINT: env var endpoint khusus sinyal yang digunakan ketika kunci konfigurasi yang sesuai tidak disetel.cacheTrace.enabled: catat snapshot trace cache untuk embedded run (default:false).cacheTrace.filePath: path output untuk JSONL trace cache (default:$OPENCLAW_STATE_DIR/logs/cache-trace.jsonl).cacheTrace.includeMessages/includePrompt/includeSystem: mengontrol apa yang disertakan dalam output trace cache (semua default:true).
Pembaruan
{
update: {
channel: "stable", // stable | beta | dev
checkOnStart: true,
auto: {
enabled: false,
stableDelayHours: 6,
stableJitterHours: 12,
betaCheckIntervalHours: 1,
},
},
}
channel: kanal rilis untuk instalasi npm/git -"stable","beta", atau"dev".checkOnStart: periksa pembaruan npm saat gateway dimulai (default:true).auto.enabled: aktifkan auto-update latar belakang untuk instalasi paket (default:false).auto.stableDelayHours: jeda minimum dalam jam sebelum auto-apply kanal stable (default:6; maks:168).auto.stableJitterHours: jendela sebaran rollout tambahan kanal stable dalam jam (default:12; maks:168).auto.betaCheckIntervalHours: seberapa sering pemeriksaan kanal beta berjalan dalam jam (default:1; maks: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 (default:true; setelfalseuntuk menyembunyikan dispatch ACP dan affordance spawn).dispatch.enabled: gate independen untuk dispatch giliran sesi ACP (default:true). Setelfalseuntuk menjaga perintah ACP tetap tersedia sambil memblokir eksekusi.backend: id backend runtime ACP default (harus cocok dengan Plugin runtime ACP terdaftar). Instal Plugin backend terlebih dahulu, dan jikaplugins.allowdisetel, sertakan id Plugin backend (misalnyaacpx) atau backend ACP tidak akan dimuat.defaultAgent: id agen target ACP fallback ketika spawn tidak menentukan target eksplisit.allowedAgents: allowlist id agen yang diizinkan untuk sesi runtime ACP; kosong berarti tidak ada pembatasan tambahan.maxConcurrentSessions: jumlah maksimum sesi ACP aktif secara bersamaan.stream.coalesceIdleMs: jendela flush idle dalam ms untuk teks yang di-stream.stream.maxChunkChars: ukuran chunk maksimum sebelum memecah proyeksi blok yang di-stream.stream.repeatSuppression: tekan baris status/tool berulang per giliran (default:true).stream.deliveryMode:"live"melakukan stream secara bertahap;"final_only"melakukan buffer hingga event terminal giliran.stream.hiddenBoundarySeparator: pemisah sebelum teks terlihat setelah event tool tersembunyi (default:"paragraph").stream.maxOutputChars: karakter output asisten maksimum yang diproyeksikan per giliran ACP.stream.maxSessionUpdateChars: karakter maksimum untuk baris status/pembaruan ACP yang diproyeksikan.stream.tagVisibility: catatan nama tag ke override visibilitas boolean untuk event yang di-stream.runtime.ttlMinutes: TTL idle dalam menit untuk worker sesi ACP sebelum memenuhi syarat untuk pembersihan.runtime.installCommand: perintah instal opsional untuk dijalankan saat melakukan bootstrap lingkungan runtime ACP.
CLI
{
cli: {
banner: {
taglineMode: "off", // random | default | off
},
},
}
cli.banner.taglineModemengontrol gaya tagline banner:"random"(default): tagline lucu/musiman yang berotasi."default": tagline netral tetap (All your chats, one OpenClaw.)."off": tidak ada teks tagline (judul/versi banner tetap ditampilkan).
- Untuk menyembunyikan seluruh banner (bukan hanya tagline), setel env
OPENCLAW_HIDE_BANNER=1.
Panduan
Metadata yang ditulis oleh alur penyiapan terpandu CLI (onboard, configure, doctor):
{
wizard: {
lastRunAt: "2026-01-01T00:00:00.000Z",
lastRunVersion: "2026.1.4",
lastRunCommit: "abc1234",
lastRunCommand: "configure",
lastRunMode: "local",
},
}
Identitas
Lihat kolom identitas agents.list di bawah Default agen.
Jembatan (lama, dihapus)
Build saat ini tidak lagi menyertakan jembatan TCP. Node terhubung melalui WebSocket Gateway. Kunci bridge.* tidak lagi menjadi bagian dari skema konfigurasi (validasi gagal hingga dihapus; openclaw doctor --fix dapat menghapus kunci yang tidak dikenal).
Konfigurasi jembatan lama (referensi historis)
{
"bridge": {
"enabled": true,
"port": 18790,
"bind": "tailnet",
"tls": {
"enabled": true,
"autoGenerate": true
}
}
}
Cron
{
cron: {
enabled: true,
maxConcurrentRuns: 2, // 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: berapa lama menyimpan sesi eksekusi Cron terisolasi yang sudah selesai sebelum dipangkas darisessions.json. Juga mengontrol pembersihan transkrip Cron terhapus yang diarsipkan. Default:24h; aturfalseuntuk menonaktifkan.runLog.maxBytes: ukuran maksimum per berkas log eksekusi (cron/runs/<jobId>.jsonl) sebelum dipangkas. Default:2_000_000byte.runLog.keepLines: baris terbaru yang dipertahankan saat pemangkasan log eksekusi dipicu. Default:2000.webhookToken: token bearer yang digunakan untuk pengiriman POST Webhook Cron (delivery.mode = "webhook"), jika dihilangkan tidak ada header auth yang dikirim.webhook: URL Webhook fallback lama yang sudah tidak digunakan (http/https) yang hanya digunakan untuk job tersimpan yang masih memilikinotify: true.
cron.retry
{
cron: {
retry: {
maxAttempts: 3,
backoffMs: [30000, 60000, 300000],
retryOn: ["rate_limit", "overloaded", "network", "timeout", "server_error"],
},
},
}
maxAttempts: retry maksimum untuk job sekali jalan pada error sementara (default:3; rentang:0-10).backoffMs: array penundaan backoff dalam md untuk setiap percobaan retry (default:[30000, 60000, 300000]; 1-10 entri).retryOn: jenis error yang memicu retry -"rate_limit","overloaded","network","timeout","server_error". Hilangkan untuk me-retry semua jenis sementara.
Hanya berlaku untuk job Cron sekali jalan. Job berulang menggunakan penanganan kegagalan terpisah.
cron.failureAlert
{
cron: {
failureAlert: {
enabled: false,
after: 3,
cooldownMs: 3600000,
includeSkipped: false,
mode: "announce",
accountId: "main",
},
},
}
enabled: mengaktifkan peringatan kegagalan untuk job Cron (default:false).after: kegagalan berturut-turut sebelum peringatan dikirim (bilangan bulat positif, min:1).cooldownMs: milidetik minimum antara peringatan berulang untuk job yang sama (bilangan bulat non-negatif).includeSkipped: menghitung eksekusi yang dilewati secara berturut-turut ke ambang peringatan (default:false). Eksekusi yang dilewati dilacak secara terpisah dan tidak memengaruhi backoff error eksekusi.mode: mode pengiriman -"announce"mengirim melalui pesan channel;"webhook"mem-posting ke Webhook yang dikonfigurasi.accountId: akun opsional atau id channel untuk membatasi cakupan pengiriman peringatan.
cron.failureDestination
{
cron: {
failureDestination: {
mode: "announce",
channel: "last",
to: "channel:C1234567890",
accountId: "main",
},
},
}
- Tujuan default untuk notifikasi kegagalan Cron di semua job.
mode:"announce"atau"webhook"; default ke"announce"ketika data target yang cukup tersedia.channel: override channel untuk pengiriman announce."last"menggunakan kembali channel pengiriman terakhir yang diketahui.to: target announce eksplisit atau URL Webhook. Wajib untuk mode Webhook.accountId: override akun opsional untuk pengiriman.delivery.failureDestinationper job menggantikan default global ini.- Ketika tujuan kegagalan global maupun per job tidak disetel, job yang sudah mengirim melalui
announcefallback ke target announce utama tersebut saat gagal. delivery.failureDestinationhanya didukung untuk jobsessionTarget="isolated"kecualidelivery.modeutama job adalah"webhook".
Lihat Job Cron. Eksekusi Cron terisolasi dilacak sebagai tugas latar belakang.
Variabel templat model media
Placeholder templat yang diperluas di tools.media.models[].args:
| Variabel | Deskripsi |
|---|---|
{{Body}} |
Isi lengkap pesan masuk |
{{RawBody}} |
Isi mentah (tanpa pembungkus riwayat/pengirim) |
{{BodyStripped}} |
Isi dengan mention grup dihapus |
{{From}} |
Pengidentifikasi pengirim |
{{To}} |
Pengidentifikasi tujuan |
{{MessageSid}} |
id pesan channel |
{{SessionId}} |
UUID sesi saat ini |
{{IsNewSession}} |
"true" saat sesi baru dibuat |
{{MediaUrl}} |
URL semu media masuk |
{{MediaPath}} |
Path media lokal |
{{MediaType}} |
Jenis media (gambar/audio/dokumen/...) |
{{Transcript}} |
Transkrip audio |
{{Prompt}} |
Prompt media yang di-resolve untuk entri CLI |
{{MaxChars}} |
Karakter output maks yang di-resolve untuk entri CLI |
{{ChatType}} |
"direct" atau "group" |
{{GroupSubject}} |
Subjek grup (upaya terbaik) |
{{GroupMembers}} |
Pratinjau anggota grup (upaya terbaik) |
{{SenderName}} |
Nama tampilan pengirim (upaya terbaik) |
{{SenderE164}} |
Nomor telepon pengirim (upaya terbaik) |
{{Provider}} |
Petunjuk penyedia (whatsapp, telegram, discord, dll.) |
Penyertaan konfigurasi ($include)
Pisahkan konfigurasi ke beberapa berkas:
// ~/.openclaw/openclaw.json
{
gateway: { port: 18789 },
agents: { $include: "./agents.json5" },
broadcast: {
$include: ["./clients/mueller.json5", "./clients/schmidt.json5"],
},
}
Perilaku penggabungan:
- Satu berkas: mengganti objek yang memuatnya.
- Array berkas: digabungkan secara mendalam berurutan (yang lebih akhir menggantikan yang lebih awal).
- Kunci sibling: digabungkan setelah penyertaan (menggantikan nilai yang disertakan).
- Penyertaan bersarang: hingga 10 tingkat kedalaman.
- Path: di-resolve relatif terhadap berkas yang menyertakan, tetapi harus tetap berada di dalam direktori konfigurasi tingkat atas (
dirnamedariopenclaw.json). Bentuk absolut/../hanya diizinkan saat hasil resolve tetap berada di dalam batas tersebut. - Penulisan milik OpenClaw yang hanya mengubah satu bagian tingkat atas yang didukung oleh penyertaan satu berkas menulis tembus ke berkas yang disertakan tersebut. Misalnya,
plugins installmemperbaruiplugins: { $include: "./plugins.json5" }diplugins.json5dan membiarkanopenclaw.jsontetap utuh. - Penyertaan root, array penyertaan, dan penyertaan dengan override sibling bersifat baca-saja untuk penulisan milik OpenClaw; penulisan tersebut gagal tertutup alih-alih meratakan konfigurasi.
- Error: pesan yang jelas untuk berkas yang hilang, error parsing, dan penyertaan sirkular.
Terkait: Konfigurasi · Contoh konfigurasi · Doctor