Saltar al contenido principal

Configuración y operaciones

Configuración

OpenClaw lee una configuración JSON5 opcional desde ~/.openclaw/openclaw.json. Si el archivo falta, OpenClaw usa valores predeterminados seguros. Razones comunes para agregar una configuración:

  • Conectar canales y controlar quién puede enviar mensajes al bot
  • Establecer modelos, herramientas, sandboxing o automatización (cron, hooks)
  • Ajustar sesiones, medios, redes o UI

Consulta la referencia completa para cada campo disponible.

💡 ¿Nuevo en configuración? Comienza con openclaw onboard para una configuración interactiva, o revisa la guía Ejemplos de Configuración para configuraciones completas para copiar y pegar.

Configuración mínima

// ~/.openclaw/openclaw.json
{
agents: { defaults: { workspace: "~/.openclaw/workspace" } },
channels: { whatsapp: { allowFrom: ["+15555550123"] } },
}

Editar configuración

openclaw onboard # asistente de configuración completo
openclaw configure # asistente de configuración
openclaw config get agents.defaults.workspace
openclaw config set agents.defaults.heartbeat.every "2h"
openclaw config unset tools.web.search.apiKey

Abre http://127.0.0.1:18789 y usa la pestaña Config. La UI de Control renderiza un formulario desde el esquema de configuración, con un editor Raw JSON como salida de emergencia.

Edita ~/.openclaw/openclaw.json directamente. El Gateway observa el archivo y aplica los cambios automáticamente (ver recarga en caliente).

Validación estricta

⚠️ OpenClaw solo acepta configuraciones que coincidan completamente con el esquema. Claves desconocidas, tipos malformados o valores inválidos hacen que el Gateway se niegue a iniciar. La única excepción a nivel raíz es $schema (string), para que los editores puedan adjuntar metadatos de JSON Schema.

Cuando falla la validación:

  • El Gateway no arranca
  • Solo funcionan los comandos de diagnóstico (openclaw doctor, openclaw logs, openclaw health, openclaw status)
  • Ejecuta openclaw doctor para ver los problemas exactos
  • Ejecuta openclaw doctor --fix (o --yes) para aplicar reparaciones

Tareas comunes

Cada canal tiene su propia sección de configuración bajo channels.. Consulta la página dedicada del canal para los pasos de configuración:

Todos los canales comparten el mismo patrón de política de DM:

{
channels: {
telegram: {
enabled: true,
botToken: "123:abc",
dmPolicy: "pairing", // pairing | allowlist | open | disabled
allowFrom: ["tg:123"], // solo para allowlist/open
},
},
}

Establece el modelo principal y respaldos opcionales:

{
agents: {
defaults: {
model: {
primary: "anthropic/claude-sonnet-4-5",
fallbacks: ["openai/gpt-5.2"],
},
models: {
"anthropic/claude-sonnet-4-5": { alias: "Sonnet" },
"openai/gpt-5.2": { alias: "GPT" },
},
},
},
}
  • agents.defaults.models define el catálogo de modelos y actúa como la lista de permitidos para /model.
  • Las referencias de modelo usan el formato provider/model (ej. anthropic/claude-opus-4-6).
  • agents.defaults.imageMaxDimensionPx controla la reducción de escala de imágenes de transcripción/herramienta (predeterminado 1200); valores más bajos generalmente reducen el uso de tokens de visión en ejecuciones con muchas capturas de pantalla.
  • Consulta CLI de Modelos para cambiar modelos en el chat y Model Failover para la rotación de autenticación y el comportamiento de respaldo.
  • Para proveedores personalizados/autoalojados, consulta Proveedores personalizados en la referencia.

El acceso a DM se controla por canal mediante dmPolicy:

  • "pairing" (predeterminado): los remitentes desconocidos reciben un código de emparejamiento de un solo uso para aprobar
  • "allowlist": solo remitentes en allowFrom (o el almacén de permitidos emparejado)
  • "open": permitir todos los DM entrantes (requiere allowFrom: ["*"])
  • "disabled": ignorar todos los DM

Para grupos, usa groupPolicy + groupAllowFrom o listas de permitidos específicas del canal. Consulta la referencia completa para detalles por canal.

Los mensajes grupales requieren mención por defecto. Configura patrones por agente:

{
agents: {
list: [
{
id: "main",
groupChat: {
mentionPatterns: ["@openclaw", "openclaw"],
},
},
],
},
channels: {
whatsapp: {
groups: { "*": { requireMention: true } },
},
},
}
  • Menciones de metadatos: menciones nativas @ (WhatsApp tocar-para-mencionar, Telegram @bot, etc.)
  • Patrones de texto: patrones regex en mentionPatterns
  • Consulta la referencia completa para anulaciones por canal y modo de auto-chat.

Las sesiones controlan la continuidad y el aislamiento de la conversación:

{
session: {
dmScope: "per-channel-peer", // recomendado para multi-usuario
threadBindings: {
enabled: true,
idleHours: 24,
maxAgeHours: 0,
},
reset: {
mode: "daily",
atHour: 4,
idleMinutes: 120,
},
},
}
  • dmScope: main (compartido) | per-peer | per-channel-peer | per-account-channel-peer
  • threadBindings: valores predeterminados globales para el enrutamiento de sesión vinculado a hilo (Discord soporta /focus, /unfocus, /agents, /session idle, y /session max-age).
  • Consulta Gestión de Sesiones para alcance, enlaces de identidad y política de envío.
  • Consulta la referencia completa para todos los campos.

Ejecuta sesiones de agente en contenedores Docker aislados:

{
agents: {
defaults: {
sandbox: {
mode: "non-main", // off | non-main | all
scope: "agent", // session | agent | shared
},
},
},
}

Construye la imagen primero: scripts/sandbox-setup.sh Consulta Sandboxing para la guía completa y la referencia completa para todas las opciones.

{
agents: {
defaults: {
heartbeat: {
every: "30m",
target: "last",
},
},
},
}
  • every: cadena de duración (30m, 2h). Establece 0m para deshabilitar.
  • target: last | whatsapp | telegram | discord | none
  • directPolicy: allow (predeterminado) o block para objetivos de heartbeat estilo DM
  • Consulta Heartbeat para la guía completa.
{
cron: {
enabled: true,
maxConcurrentRuns: 2,
sessionRetention: "24h",
runLog: {
maxBytes: "2mb",
keepLines: 2000,
},
},
}
  • sessionRetention: poda sesiones de ejecución aisladas completadas de sessions.json (predeterminado 24h; establece false para deshabilitar).
  • runLog: poda cron/runs/.jsonl por tamaño y líneas retenidas.
  • Consulta Trabajos cron para la descripción general de la función y ejemplos de CLI.

Habilita endpoints HTTP de webhook en el Gateway:

{
hooks: {
enabled: true,
token: "shared-secret",
path: "/hooks",
defaultSessionKey: "hook:ingress",
allowRequestSessionKey: false,
allowedSessionKeyPrefixes: ["hook:"],
mappings: [
{
match: { path: "gmail" },
action: "agent",
agentId: "main",
deliver: true,
},
],
},
}

Nota de seguridad:

  • Trata todo el contenido de la carga útil del hook/webhook como entrada no confiable.
  • Mantén las banderas de omisión de contenido no seguro deshabilitadas (hooks.gmail.allowUnsafeExternalContent, hooks.mappings[].allowUnsafeExternalContent) a menos que estés haciendo depuración de alcance estricto.
  • Para agentes impulsados por hooks, prefiere niveles de modelo modernos fuertes y política de herramientas estricta (por ejemplo, solo mensajería más sandboxing donde sea posible).

Consulta la referencia completa para todas las opciones de mapeo e integración de Gmail.

Ejecuta múltiples agentes aislados con espacios de trabajo y sesiones separados:

{
agents: {
list: [
{ id: "home", default: true, workspace: "~/.openclaw/workspace-home" },
{ id: "work", workspace: "~/.openclaw/workspace-work" },
],
},
bindings: [
{ agentId: "home", match: { channel: "whatsapp", accountId: "personal" } },
{ agentId: "work", match: { channel: "whatsapp", accountId: "biz" } },
],
}

Consulta Multi-Agent y la referencia completa para reglas de vinculación y perfiles de acceso por agente.

Usa $include para organizar configuraciones grandes:

// ~/.openclaw/openclaw.json
{
gateway: { port: 18789 },
agents: { $include: "./agents.json5" },
broadcast: {
$include: ["./clients/a.json5", "./clients/b.json5"],
},
}
  • Archivo único: reemplaza el objeto contenedor
  • Array de archivos: se fusionan en profundidad en orden (el último gana)
  • Claves hermanas: se fusionan después de los includes (anulan los valores incluidos)
  • Includes anidados: soportados hasta 10 niveles de profundidad
  • Rutas relativas: resueltas relativas al archivo que incluye
  • Manejo de errores: errores claros para archivos faltantes, errores de análisis e includes circulares

Recarga en caliente de configuración

El Gateway observa ~/.openclaw/openclaw.json y aplica los cambios automáticamente — no se necesita reinicio manual para la mayoría de los ajustes.

Modos de recarga

ModoComportamiento
hybrid (predeterminado)Aplica cambios seguros al instante. Reinicia automáticamente para los críticos.
hotSolo aplica cambios seguros en caliente. Registra una advertencia cuando se necesita un reinicio — lo manejas tú.
restartReinicia el Gateway en cualquier cambio de configuración, seguro o no.
offDesactiva la observación de archivos. Los cambios surten efecto en el próximo reinicio manual.
{
gateway: {
reload: { mode: "hybrid", debounceMs: 300 },
},
}

Qué se aplica en caliente vs qué necesita un reinicio

La mayoría de los campos se aplican en caliente sin tiempo de inactividad. En modo hybrid, los cambios que requieren reinicio se manejan automáticamente.

CategoríaCampos¿Se necesita reinicio?
Canaleschannels.*, web (WhatsApp) — todos los canales integrados y de extensiónNo
Agente y modelosagent, agents, models, routingNo
Automatizaciónhooks, cron, agent.heartbeatNo
Sesiones y mensajessession, messagesNo
Herramientas y mediostools, browser, skills, audio, talkNo
UI y misceláneosui, logging, identity, bindingsNo
Servidor Gatewaygateway.* (puerto, bind, auth, tailscale, TLS, HTTP)
Infraestructuradiscovery, canvasHost, plugins

ℹ️ gateway.reload y gateway.remote son excepciones — cambiarlos no desencadena un reinicio.

RPC de configuración (actualizaciones programáticas)

ℹ️ Los RPC de escritura del plano de control (config.apply, config.patch, update.run) están limitados a 3 solicitudes por 60 segundos por deviceId+clientIp. Cuando se limita, el RPC devuelve UNAVAILABLE con retryAfterMs.

Valida + escribe la configuración completa y reinicia el Gateway en un solo paso.

config.apply reemplaza la configuración completa. Usa config.patch para actualizaciones parciales, o openclaw config set para claves individuales.

Parámetros:

  • raw (string) — carga útil JSON5 para toda la configuración
  • baseHash (opcional) — hash de configuración de config.get (requerido cuando existe la configuración)
  • sessionKey (opcional) — clave de sesión para el ping de reactivación posterior al reinicio
  • note (opcional) — nota para el centinela de reinicio
  • restartDelayMs (opcional) — retraso antes del reinicio (predeterminado 2000)

Las solicitudes de reinicio se combinan mientras una ya está pendiente/en vuelo, y se aplica un enfriamiento de 30 segundos entre ciclos de reinicio.

openclaw gateway call config.get --params '{}' # capturar payload.hash
openclaw gateway call config.apply --params '{
"raw": "{ agents: { defaults: { workspace: \"~/.openclaw/workspace\" } } }",
"baseHash": "<hash>",
"sessionKey": "agent:main:whatsapp:dm:+15555550123"
}'

Fusiona una actualización parcial en la configuración existente (semántica de parche de fusión JSON):

  • Los objetos se fusionan recursivamente
  • null elimina una clave
  • Los arrays se reemplazan

Parámetros:

  • raw (string) — JSON5 con solo las claves a cambiar
  • baseHash (requerido) — hash de configuración de config.get
  • sessionKey, note, restartDelayMs — igual que config.apply

El comportamiento de reinicio coincide con config.apply: reinicios pendientes combinados más un enfriamiento de 30 segundos entre ciclos de reinicio.

openclaw gateway call config.patch --params '{
"raw": "{ channels: { telegram: { groups: { \"*\": { requireMention: false } } } } }",
"baseHash": "<hash>"
}'

Variables de entorno

OpenClaw lee variables de entorno del proceso padre más:

  • .env desde el directorio de trabajo actual (si está presente)
  • ~/.openclaw/.env (respaldo global)

Ningún archivo anula las variables de entorno existentes. También puedes establecer variables de entorno en línea en la configuración:

{
env: {
OPENROUTER_API_KEY: "sk-or-...",
vars: { GROQ_API_KEY: "gsk-..." },
},
}

Si está habilitado y las claves esperadas no están configuradas, OpenClaw ejecuta tu shell de inicio de sesión e importa solo las claves faltantes:

{
env: {
shellEnv: { enabled: true, timeoutMs: 15000 },
},
}

Variable de entorno equivalente: OPENCLAW_LOAD_SHELL_ENV=1

Referencia variables de entorno en cualquier valor de cadena de configuración con ${VAR_NAME}:

{
gateway: { auth: { token: "${OPENCLAW_GATEWAY_TOKEN}" } },
models: { providers: { custom: { apiKey: "${CUSTOM_API_KEY}" } } },
}

Reglas:

  • Solo nombres en mayúsculas coinciden: [A-Z_][A-Z0-9_]*
  • Las variables faltantes/vacías lanzan un error al momento de carga
  • Escapa con $${VAR} para salida literal
  • Funciona dentro de archivos $include
  • Sustitución en línea: "${BASE}/v1""https://api.example.com/v1"

Para campos que admiten objetos SecretRef, puedes usar:

{
models: {
providers: {
openai: { apiKey: { source: "env", provider: "default", id: "OPENAI_API_KEY" } },
},
},
skills: {
entries: {
"nano-banana-pro": {
apiKey: {
source: "file",
provider: "filemain",
id: "/skills/entries/nano-banana-pro/apiKey",
},
},
},
},
channels: {
googlechat: {
serviceAccountRef: {
source: "exec",
provider: "vault",
id: "channels/googlechat/serviceAccount",
},
},
},
}

Los detalles de SecretRef (incluyendo secrets.providers para env/file/exec) están en Gestión de Secretos. Las rutas de credenciales admitidas se enumeran en Superficie de Credenciales SecretRef.

Consulta Entorno para la precedencia completa y fuentes.

Referencia completa

Para la referencia completa campo por campo, consulta Referencia de Configuración.


Relacionado: Ejemplos de Configuración · Referencia de Configuración · Doctor

Runbook del GatewayReferencia de Configuración