Skip to main content
OpenClaw legge una configurazione facoltativa da ~/.openclaw/openclaw.json. Se il file non è presente, OpenClaw utilizza impostazioni predefinite sicure. Il percorso della configurazione attiva deve essere un file regolare. Le scritture gestite da OpenClaw lo sostituiscono atomicamente (rinominando il file sul percorso), quindi, se openclaw.json è un collegamento simbolico, ne viene sostituita la destinazione anziché scrivere attraverso il collegamento: evitare configurazioni basate su collegamenti simbolici. Se la configurazione viene mantenuta al di fuori della directory di stato predefinita, impostare OPENCLAW_CONFIG_PATH direttamente sul file reale. Motivi comuni per aggiungere una configurazione:
  • Connettere i canali e controllare chi può inviare messaggi al bot
  • Impostare modelli, strumenti, sandboxing o automazione (cron, hook)
  • Regolare sessioni, contenuti multimediali, rete o interfaccia utente
Consultare il riferimento completo per tutti i campi disponibili. Gli agenti e l’automazione devono utilizzare config.schema.lookup per la documentazione esatta a livello di campo prima di modificare la configurazione. Utilizzare questa pagina per indicazioni orientate alle attività e il Riferimento della configurazione per una panoramica più ampia dei campi e delle impostazioni predefinite.
Prima esperienza con la configurazione? Iniziare con openclaw onboard per la configurazione interattiva oppure consultare la guida Esempi di configurazione per configurazioni complete da copiare e incollare.

Configurazione minima

Modifica della configurazione

Convalida rigorosa

OpenClaw accetta solo configurazioni che corrispondono completamente allo schema. Chiavi sconosciute, tipi non validi o valori non validi fanno sì che il Gateway si rifiuti di avviarsi. L’unica eccezione a livello radice è $schema (stringa), che consente agli editor di allegare metadati JSON Schema.
openclaw config schema stampa il JSON Schema canonico utilizzato dall’interfaccia di controllo e dalla convalida. config.schema.lookup recupera un singolo nodo relativo a un percorso insieme ai riepiloghi dei figli per gli strumenti di approfondimento. I metadati della documentazione dei campi title/description si propagano attraverso oggetti annidati, caratteri jolly (*), elementi di array ([]) e rami anyOf/ oneOf/allOf. Gli schemi di runtime di Plugin e canali vengono integrati quando viene caricato il registro dei manifest. Quando la convalida non riesce:
  • Il Gateway non si avvia
  • Funzionano solo i comandi diagnostici (openclaw doctor, openclaw logs, openclaw health, openclaw status)
  • Eseguire openclaw doctor per visualizzare i problemi esatti
  • Eseguire openclaw doctor --fix (--repair è lo stesso flag; --yes ignora le richieste di conferma) per applicare le correzioni
Dopo ogni avvio riuscito, il Gateway conserva una copia attendibile dell’ultima configurazione valida nota, ma l’avvio e il ricaricamento a caldo non la ripristinano automaticamente: solo openclaw doctor --fix lo fa. Se openclaw.json non supera la convalida (inclusa quella locale del Plugin), l’avvio del Gateway non riesce oppure il ricaricamento viene ignorato e il runtime corrente mantiene l’ultima configurazione accettata. Una scrittura rifiutata viene inoltre salvata come <path>.rejected.<timestamp> per poterla esaminare. Il Gateway blocca le scritture che sembrano sovrascritture accidentali, come la rimozione di gateway.mode, la perdita del blocco meta o la riduzione del file di oltre la metà, a meno che la scrittura non consenta esplicitamente modifiche distruttive. La promozione a ultima configurazione valida nota viene ignorata quando un candidato contiene un segnaposto di segreto oscurato, come *** o [redacted].

Attività comuni

Ogni canale dispone della propria sezione di configurazione in channels.<provider>. Consultare la pagina dedicata al canale per i passaggi di configurazione:Tutti i canali condividono lo stesso modello di criteri per i messaggi diretti:
Impostare il modello principale e i fallback facoltativi:
  • agents.defaults.models definisce il catalogo dei modelli e funge da elenco consentito per /model; le voci provider/* filtrano /model, /models e i selettori dei modelli limitandoli ai provider selezionati, pur continuando a utilizzare il rilevamento dinamico dei modelli.
  • Utilizzare openclaw config set agents.defaults.models '<json>' --strict-json --merge per aggiungere voci all’elenco consentito senza rimuovere i modelli esistenti. Le sostituzioni semplici che rimuoverebbero delle voci vengono rifiutate, a meno che non venga passato --replace.
  • I riferimenti ai modelli utilizzano il formato provider/model (ad esempio anthropic/claude-opus-4-6).
  • agents.defaults.imageMaxDimensionPx controlla il ridimensionamento verso il basso delle immagini di trascrizioni e strumenti (valore predefinito 1200); valori inferiori riducono generalmente l’utilizzo di token visivi nelle esecuzioni con molte schermate.
  • Consultare CLI dei modelli per cambiare modello nella chat e Failover dei modelli per la rotazione dell’autenticazione e il comportamento di fallback.
  • Per provider personalizzati o self-hosted, consultare Provider personalizzati nel riferimento.
L’accesso ai messaggi diretti è controllato per ciascun canale tramite dmPolicy (valore predefinito "pairing"):
  • "pairing": i mittenti sconosciuti ricevono un codice di associazione monouso da approvare
  • "allowlist": sono ammessi solo i mittenti presenti in allowFrom (o nell’archivio degli elementi consentiti associati)
  • "open": consente tutti i messaggi diretti in entrata (richiede allowFrom: ["*"])
  • "disabled": ignora tutti i messaggi diretti
Per i gruppi, utilizzare groupPolicy ("allowlist" | "open" | "disabled") insieme a groupAllowFrom o agli elenchi consentiti specifici del canale.Consultare il riferimento completo per i dettagli relativi a ciascun canale.
Per impostazione predefinita, i messaggi di gruppo richiedono una menzione. Configurare i modelli di attivazione per ciascun agente. Le normali risposte di gruppo o del canale vengono pubblicate automaticamente; attivare il percorso dello strumento per messaggi nelle stanze condivise in cui l’agente deve decidere quando intervenire:
  • Menzioni nei metadati: @-menzioni native (toccare per menzionare in WhatsApp, @bot in Telegram e così via)
  • Modelli di testo: modelli regex sicuri in mentionPatterns
  • Risposte visibili: messages.visibleReplies può richiedere globalmente l’invio tramite lo strumento per messaggi; messages.groupChat.visibleReplies sostituisce questa impostazione per gruppi e canali.
  • Consultare il riferimento completo per le modalità di risposta visibile, le sostituzioni specifiche per canale e la modalità di chat con sé stessi.
Utilizzare agents.defaults.skills come base condivisa, quindi sostituirla per agenti specifici con agents.list[].skills:
Controllare con quale aggressività il Gateway riavvia i canali che sembrano inattivi:
  • I valori mostrati sono quelli predefiniti. Impostare gateway.channelHealthCheckMinutes: 0 per disabilitare globalmente i riavvii del monitoraggio dello stato.
  • channelStaleEventThresholdMinutes deve essere maggiore o uguale all’intervallo di controllo.
  • Utilizzare channels.<provider>.healthMonitor.enabled o channels.<provider>.accounts.<id>.healthMonitor.enabled per disabilitare i riavvii automatici di un singolo canale o account senza disabilitare il monitoraggio globale.
  • Consultare Controlli dello stato per il debug operativo e il riferimento completo per tutti i campi.
Concedere ai client locali più tempo per completare l’handshake WebSocket precedente all’autenticazione su host sovraccarichi o a bassa potenza:
  • Il valore predefinito è 15000 millisecondi.
  • OPENCLAW_HANDSHAKE_TIMEOUT_MS continua ad avere la precedenza per le sostituzioni una tantum del servizio o della shell.
  • È preferibile correggere prima gli stalli di avvio o del ciclo degli eventi; questa impostazione è destinata agli host integri ma lenti durante il riscaldamento.
Le sessioni controllano la continuità e l’isolamento delle conversazioni:
  • dmScope: main (condiviso) | per-peer | per-channel-peer | per-account-channel-peer
  • threadBindings: valori predefiniti globali per l’instradamento delle sessioni associate ai thread. /focus, /unfocus, /agents, /session idle e /session max-age consentono di associare, dissociare, elencare e regolare questa impostazione per ogni sessione (Discord associa i thread, Telegram associa gli argomenti/le conversazioni).
  • Consultare Gestione delle sessioni per ambiti, collegamenti delle identità e criteri di invio.
  • Consultare il riferimento completo per tutti i campi.
Eseguire le sessioni degli agenti in runtime sandbox isolati:
Creare prima l’immagine: da un checkout del codice sorgente eseguire scripts/sandbox-setup.sh; per un’installazione npm, consultare il comando docker build incorporato in Sandboxing § Immagini e configurazione.Consultare Sandboxing per la guida completa e il riferimento completo per tutte le opzioni.
Le notifiche push supportate dal relay per le build pubbliche dell’App Store utilizzano il relay OpenClaw ospitato: https://ios-push-relay.openclaw.ai.Le distribuzioni di relay personalizzate richiedono un percorso di build/distribuzione iOS deliberatamente separato, il cui URL del relay corrisponda all’URL del relay del gateway. Se si utilizza una build con relay personalizzato, impostare quanto segue nella configurazione del gateway:
Equivalente CLI:
Effetti:
  • Consente al gateway di inviare push.test, solleciti di riattivazione e riattivazioni per la riconnessione tramite il relay esterno.
  • Utilizza un’autorizzazione di invio limitata alla registrazione, inoltrata dall’app iOS associata. Il gateway non necessita di un token del relay valido per l’intera distribuzione.
  • Associa ogni registrazione supportata dal relay all’identità del gateway a cui è stata associata l’app iOS, impedendo a un altro gateway di riutilizzare la registrazione memorizzata.
  • Mantiene le build iOS locali/manuali su APNs diretto. Gli invii supportati dal relay si applicano solo alle build distribuite ufficialmente che si sono registrate tramite il relay.
  • Deve corrispondere all’URL di base del relay incorporato nella build iOS, affinché il traffico di registrazione e invio raggiunga la stessa distribuzione del relay.
Flusso end-to-end:
  1. Installare l’app iOS ufficiale.
  2. Facoltativo: configurare gateway.push.apns.relay.baseUrl sul gateway solo quando si utilizza una build con relay personalizzato deliberatamente separata.
  3. Associare l’app iOS al gateway e consentire la connessione sia delle sessioni del Node sia di quelle dell’operatore.
  4. L’app iOS recupera l’identità del gateway, si registra presso il relay utilizzando App Attest insieme alla ricevuta dell’app, quindi pubblica il payload push.apns.register supportato dal relay sul gateway associato.
  5. Il gateway memorizza l’handle del relay e l’autorizzazione di invio, quindi li utilizza per push.test, i solleciti di riattivazione e le riattivazioni per la riconnessione.
Note operative:
  • Se si collega l’app iOS a un gateway diverso, riconnettere l’app affinché possa pubblicare una nuova registrazione del relay associata a tale gateway.
  • Se si distribuisce una nuova build iOS che punta a una distribuzione del relay diversa, l’app aggiorna la registrazione del relay memorizzata nella cache anziché riutilizzare la precedente origine del relay.
Nota sulla compatibilità:
  • OPENCLAW_APNS_RELAY_BASE_URL e OPENCLAW_APNS_RELAY_TIMEOUT_MS continuano a funzionare come sostituzioni temporanee tramite variabili di ambiente.
  • Gli URL del relay personalizzati del gateway devono corrispondere all’URL di base del relay incorporato nella build iOS; il canale di rilascio pubblico dell’App Store rifiuta le sostituzioni personalizzate dell’URL del relay iOS.
  • OPENCLAW_APNS_RELAY_ALLOW_HTTP=true rimane un meccanismo di emergenza di sviluppo limitato al loopback; non salvare in modo permanente URL HTTP del relay nella configurazione.
Consultare App iOS per il flusso end-to-end e Flusso di autenticazione e attendibilità per il modello di sicurezza del relay.
  • every: stringa di durata (30m, 2h). Impostare 0m per disabilitare. Valore predefinito: 30m.
  • target: last | none | <channel-id> (ad esempio discord, matrix, telegram o whatsapp)
  • directPolicy: allow (valore predefinito) o block per destinazioni Heartbeat di tipo DM
  • Consultare Heartbeat per la guida completa.
  • sessionRetention: elimina dalle righe delle sessioni SQLite le sessioni di esecuzione isolate completate (valore predefinito 24h; impostare false per disabilitare).
  • La cronologia delle esecuzioni conserva automaticamente le 2000 righe terminali più recenti per ogni processo; le righe perse mantengono la propria finestra di pulizia di 24 ore.
  • Consultare Processi Cron per una panoramica della funzionalità ed esempi CLI.
Abilitare gli endpoint Webhook HTTP sul Gateway:
Nota sulla sicurezza:
  • Considerare tutto il contenuto dei payload di hook/Webhook come input non attendibile.
  • Utilizzare un hooks.token dedicato; non riutilizzare segreti di autenticazione del Gateway attivi (gateway.auth.token / OPENCLAW_GATEWAY_TOKEN oppure gateway.auth.password / OPENCLAW_GATEWAY_PASSWORD).
  • L’autenticazione degli hook avviene esclusivamente tramite intestazione (Authorization: Bearer ... o x-openclaw-token); i token nella stringa di query vengono rifiutati.
  • hooks.path non può essere /; mantenere l’ingresso Webhook in un sottopercorso dedicato, ad esempio /hooks.
  • Mantenere disabilitati i flag che ignorano i controlli sui contenuti non sicuri (hooks.gmail.allowUnsafeExternalContent, hooks.mappings[].allowUnsafeExternalContent), salvo durante attività di debug strettamente circoscritte.
  • Se si abilita hooks.allowRequestSessionKey, impostare anche hooks.allowedSessionKeyPrefixes per limitare le chiavi di sessione selezionate dal chiamante.
  • Per gli agenti attivati dagli hook, preferire livelli di modelli moderni e robusti e criteri rigorosi per gli strumenti (ad esempio, solo messaggistica più sandboxing ove possibile).
Consultare il riferimento completo per tutte le opzioni di mappatura e l’integrazione con Gmail.
Eseguire più agenti isolati con spazi di lavoro e sessioni separati:
Consultare Multi-agente e il riferimento completo per le regole di associazione e i profili di accesso specifici per ogni agente.
Utilizzare $include per organizzare configurazioni di grandi dimensioni:
  • File singolo: sostituisce l’oggetto contenitore
  • Array di file: unione profonda in ordine (prevale l’ultimo), fino a 10 livelli di nidificazione
  • Chiavi allo stesso livello: unite dopo le inclusioni (sovrascrivono i valori inclusi)
  • Percorsi relativi: risolti rispetto al file che esegue l’inclusione
  • Formato del percorso: i percorsi di inclusione non devono contenere byte nulli e devono essere rigorosamente più corti di 4096 caratteri sia prima sia dopo la risoluzione
  • Scritture gestite da OpenClaw: quando una scrittura modifica una sola sezione di primo livello basata sull’inclusione di un singolo file, come plugins: { $include: "./plugins.json5" }, OpenClaw aggiorna tale file incluso e lascia invariato openclaw.json
  • Scrittura passante non supportata: le inclusioni radice, gli array di inclusioni e le inclusioni con sostituzioni allo stesso livello impediscono in modo sicuro le scritture gestite da OpenClaw, anziché appiattire la configurazione
  • Confinamento: i percorsi $include devono risolversi all’interno della directory contenente openclaw.json. Per condividere un albero tra macchine o utenti, impostare OPENCLAW_INCLUDE_ROOTS su un elenco di percorsi (: su POSIX, ; su Windows) delle directory aggiuntive a cui le inclusioni possono fare riferimento. I collegamenti simbolici vengono risolti e ricontrollati, pertanto un percorso che lessicalmente si trova in una directory di configurazione, ma la cui destinazione reale esce da tutte le radici consentite, viene comunque rifiutato.
  • Gestione degli errori: errori chiari per file mancanti, errori di analisi, inclusioni circolari, formato del percorso non valido e lunghezza eccessiva

Ricaricamento a caldo della configurazione

Il Gateway monitora ~/.openclaw/openclaw.json e applica automaticamente le modifiche: per la maggior parte delle impostazioni non è necessario alcun riavvio manuale. Le modifiche dirette ai file vengono considerate non attendibili finché non superano la convalida. Il monitor attende che si stabilizzino le operazioni di scrittura temporanea/ridenominazione dell’editor, legge il file finale e rifiuta le modifiche esterne non valide senza riscrivere openclaw.json. Le scritture della configurazione gestite da OpenClaw utilizzano lo stesso controllo dello schema prima della scrittura (consultare Convalida rigorosa per le regole di sovrascrittura/rollback applicabili a ogni scrittura). Se viene visualizzato config reload skipped (invalid config) o l’avvio segnala Invalid config, esaminare la configurazione, eseguire openclaw config validate, quindi eseguire openclaw doctor --fix per la riparazione. Consultare Risoluzione dei problemi del Gateway per l’elenco di controllo.

Modalità di ricaricamento

Modifiche applicate senza riavvio e modifiche che richiedono un riavvio

La maggior parte dei campi viene applicata senza riavvio e senza tempi di inattività; alcune sezioni applicate senza riavvio riavviano soltanto il relativo sottosistema (canale, cron, heartbeat, monitoraggio dello stato) anziché l’intero Gateway. In modalità hybrid, le modifiche che richiedono il riavvio del Gateway vengono gestite automaticamente.
gateway.reload e gateway.remote costituiscono eccezioni in gateway.*: la loro modifica non attiva un riavvio. Anche i singoli plugin possono sostituire quanto indicato in questa tabella: un plugin caricato può dichiarare i propri prefissi di configurazione che attivano il riavvio (ad esempio, il plugin Canvas incluso riavvia il Gateway per plugins.enabled, plugins.allow e plugins.deny, non soltanto per il proprio plugins.entries.canvas), quindi il comportamento effettivo dipende dai plugin attivi.

Pianificazione del ricaricamento

Quando si modifica un file sorgente a cui si fa riferimento tramite $include, OpenClaw pianifica il ricaricamento in base alla struttura definita nel sorgente, non alla vista appiattita in memoria. Ciò mantiene prevedibili le decisioni di ricaricamento senza riavvio (applicazione senza riavvio o riavvio), anche quando una singola sezione di primo livello si trova in un file incluso separato, come plugins: { $include: "./plugins.json5" }. La pianificazione del ricaricamento si interrompe in modo sicuro se la struttura del sorgente è ambigua.

RPC di configurazione (aggiornamenti programmatici)

Per gli strumenti che scrivono la configurazione tramite l’API del Gateway, è preferibile questo flusso:
  • config.schema.lookup per esaminare un sottoalbero (nodo dello schema superficiale e riepiloghi dei figli)
  • config.get per recuperare lo snapshot corrente insieme a hash
  • config.patch per gli aggiornamenti parziali (patch di unione JSON: gli oggetti vengono uniti, null elimina e gli array vengono sostituiti quando la sostituzione viene confermata esplicitamente con replacePaths, se comporterebbe la rimozione di elementi)
  • config.apply solo quando si intende sostituire l’intera configurazione
  • update.run per l’aggiornamento automatico esplicito seguito dal riavvio; includere continuationMessage quando la sessione successiva al riavvio deve eseguire un turno di completamento
  • update.status per esaminare l’indicatore di riavvio dell’aggiornamento più recente e verificare la versione in esecuzione dopo un riavvio
Gli agenti devono considerare config.schema.lookup come primo riferimento per la documentazione e i vincoli esatti a livello di campo. Utilizzare il riferimento alla configurazione quando è necessaria una panoramica più ampia della configurazione, dei valori predefiniti o dei collegamenti ai riferimenti dei sottosistemi dedicati.
Le scritture del piano di controllo (config.apply, config.patch, update.run) sono limitate a 3 richieste ogni 60 secondi per deviceId+clientIp. Le richieste di riavvio vengono aggregate e applicano quindi un intervallo di attesa di 30 secondi tra i cicli di riavvio. update.status è di sola lettura, ma limitato agli amministratori, poiché l’indicatore di riavvio può includere riepiloghi dei passaggi di aggiornamento e le parti finali dell’output dei comandi.
Esempio di patch parziale:
Sia config.apply sia config.patch accettano raw, baseHash, sessionKey, note e restartDelayMs. baseHash è obbligatorio per entrambi i metodi quando esiste già un file di configurazione (la prima scrittura, in assenza di una configurazione esistente, ignora il controllo). config.patch accetta anche replacePaths, un array di percorsi di configurazione la cui sostituzione dell’array è intenzionale. Se una patch sostituisse o eliminasse un array esistente con un numero inferiore di elementi, il Gateway rifiuta la scrittura, a meno che il percorso esatto non sia presente in replacePaths; gli array annidati nelle voci degli array utilizzano [], ad esempio agents.list[].skills. Ciò impedisce agli snapshot config.get troncati di sovrascrivere silenziosamente gli array di instradamento o delle liste di elementi consentiti. Utilizzare config.apply quando si intende sostituire l’intera configurazione.

Variabili di ambiente

OpenClaw legge le variabili di ambiente dal processo padre e inoltre da:
  • .env nella directory di lavoro corrente (se presente)
  • ~/.openclaw/.env (ripiego globale)
Nessuno dei due file sostituisce le variabili di ambiente esistenti. È inoltre possibile impostare variabili di ambiente inline nella configurazione:
Se l’opzione è abilitata e le chiavi previste non sono impostate, OpenClaw esegue la shell di accesso e importa soltanto le chiavi mancanti:
Variabile di ambiente equivalente: OPENCLAW_LOAD_SHELL_ENV=1. Valore predefinito di timeoutMs: 15000.
È possibile fare riferimento alle variabili di ambiente in qualsiasi valore stringa della configurazione con ${VAR_NAME}:
Regole:
  • Vengono riconosciuti soltanto i nomi in maiuscolo: [A-Z_][A-Z0-9_]*
  • Le variabili mancanti o vuote generano un errore durante il caricamento
  • Eseguire l’escape con $${VAR} per ottenere un output letterale
  • Funziona nei file $include
  • Sostituzione inline: "${BASE}/v1""https://api.example.com/v1"
Per i campi che supportano gli oggetti SecretRef, è possibile utilizzare:
I dettagli di SecretRef (incluso secrets.providers per env/file/exec) sono disponibili in Gestione dei segreti. I percorsi delle credenziali supportati sono elencati in Superficie delle credenziali SecretRef.
Consultare Ambiente per la precedenza e le origini complete.

Riferimento completo

Per il riferimento completo campo per campo, consultare Riferimento alla configurazione.
Correlati: Esempi di configurazione · Riferimento alla configurazione · Doctor

Contenuti correlati