Configuración 🔧
OpenClaw lee una configuración JSON5 opcional desde~/.openclaw/openclaw.json (se permiten comentarios y comas finales).
Si el archivo falta, OpenClaw usa valores predeterminados razonablemente seguros (agente Pi integrado + sesiones por remitente + espacio de trabajo ~/.openclaw/workspace). Por lo general, solo necesita una configuración para:
- restringir quién puede activar el bot (
channels.whatsapp.allowFrom,channels.telegram.allowFrom, etc.) - controlar listas de permitidos de grupos y el comportamiento de menciones (
channels.whatsapp.groups,channels.telegram.groups,channels.discord.guilds,agents.list[].groupChat) - personalizar prefijos de mensajes (
messages) - establecer el espacio de trabajo del agente (
agents.defaults.workspaceoagents.list[].workspace) - ajustar los valores predeterminados del agente integrado (
agents.defaults) y el comportamiento de sesión (session) - establecer la identidad por agente (
agents.list[].identity)
¿Nuevo en la configuración? Consulte la guía de Ejemplos de configuración para ver ejemplos completos con explicaciones detalladas.
Validación estricta de configuración
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 por seguridad. Cuando falla la validación:- El Gateway no arranca.
- Solo se permiten comandos de diagnóstico (por ejemplo:
openclaw doctor,openclaw logs,openclaw health,openclaw status,openclaw service,openclaw help). - Ejecute
openclaw doctorpara ver los problemas exactos. - Ejecute
openclaw doctor --fix(o--yes) para aplicar migraciones/reparaciones.
--fix/--yes.
Esquema + pistas de UI
El Gateway expone una representación JSON Schema de la configuración medianteconfig.schema para editores de UI.
La UI de Control renderiza un formulario a partir de este esquema, con un editor de JSON sin procesar como vía de escape.
Los plugins de canal y las extensiones pueden registrar esquema y pistas de UI para su configuración, de modo que los ajustes del canal
se mantengan basados en esquema entre aplicaciones sin formularios codificados.
Las pistas (etiquetas, agrupación, campos sensibles) se entregan junto con el esquema para que los clientes puedan renderizar
mejores formularios sin codificar conocimiento de la configuración.
Aplicar + reiniciar (RPC)
Useconfig.apply para validar y escribir la configuración completa y reiniciar el Gateway en un solo paso.
Escribe un centinela de reinicio y hace ping a la última sesión activa después de que el Gateway vuelve.
Advertencia: config.apply reemplaza la configuración completa. Si desea cambiar solo algunas claves,
use config.patch o openclaw config set. Mantenga una copia de seguridad de ~/.openclaw/openclaw.json.
Parámetros:
raw(string) — carga útil JSON5 para la configuración completabaseHash(opcional) — hash de configuración deconfig.get(requerido cuando ya existe una configuración)sessionKey(opcional) — clave de la última sesión activa para el ping de activaciónnote(opcional) — nota para incluir en el centinela de reiniciorestartDelayMs(opcional) — retraso antes del reinicio (predeterminado 2000)
gateway call):
Actualizaciones parciales (RPC)
Useconfig.patch para fusionar una actualización parcial en la configuración existente sin sobrescribir
claves no relacionadas. Aplica semántica de JSON merge patch:
- los objetos se fusionan recursivamente
nullelimina una clave- los arreglos se reemplazan
Al igual queconfig.apply, valida, escribe la configuración, almacena un centinela de reinicio y programa el reinicio del Gateway (con una activación opcional cuando se proporcionasessionKey).
raw(string) — carga útil JSON5 que contiene solo las claves a cambiarbaseHash(requerido) — hash de configuración deconfig.getsessionKey(opcional) — clave de la última sesión activa para el ping de activaciónnote(opcional) — nota para incluir en el centinela de reiniciorestartDelayMs(opcional) — retraso antes del reinicio (predeterminado 2000)
Configuración mínima (punto de partida recomendado)
Modo de autochat (recomendado para control de grupos)
Para evitar que el bot responda a menciones @ de WhatsApp en grupos (responder solo a disparadores de texto específicos):Inclusiones de configuración ($include)
Divida su configuración en varios archivos usando la directiva $include. Esto es útil para:
- Organizar configuraciones grandes (p. ej., definiciones de agentes por cliente)
- Compartir ajustes comunes entre entornos
- Mantener configuraciones sensibles separadas
Uso básico
Comportamiento de fusión
- Archivo único: Reemplaza el objeto que contiene
$include - Arreglo de archivos: Fusiona profundamente los archivos en orden (los posteriores sobrescriben a los anteriores)
- Con claves hermanas: Las claves hermanas se fusionan después de las inclusiones (sobrescriben valores incluidos)
- Claves hermanas + arreglos/primitivos: No compatible (el contenido incluido debe ser un objeto)
Incluye anidados
Los archivos incluidos pueden contener directivas$include (hasta 10 niveles de profundidad):
Resolución de rutas
- Rutas relativas: Se resuelven relativas al archivo que incluye
- Rutas absolutas: Utilizado como es
- Directorios padre: Las referencias
../funcionan como se espera
Manejo de errores
- Archivo faltante: Error claro con la ruta resuelta
- Error de parseo: Muestra qué archivo incluido falló
- Inclusiones circulares: Detectadas y reportadas con la cadena de inclusión
Ejemplo: Configuración legal multi‑cliente
Opciones comunes
Env vars + .env
OpenClaw lee variables de entorno del proceso padre (shell, launchd/systemd, CI, etc.).
Además, carga:
.envdesde el directorio de trabajo actual (si existe)- un respaldo global
.envdesde~/.openclaw/.env(también conocido como$OPENCLAW_STATE_DIR/.env)
.env sobrescribe variables de entorno existentes.
También puede proporcionar variables de entorno en línea en la configuración. Estas solo se aplican si
el entorno del proceso no tiene la clave (misma regla de no sobrescritura):
env.shellEnv (opcional)
Comodidad opcional: si está habilitado y aún no se estableció ninguna de las claves esperadas, OpenClaw ejecuta su shell de inicio de sesión e importa solo las claves esperadas faltantes (nunca sobrescribe).
Esto equivale a cargar su perfil de shell.
OPENCLAW_LOAD_SHELL_ENV=1OPENCLAW_SHELL_ENV_TIMEOUT_MS=15000
Sustitución de var Env en configuración
Puede referenciar variables de entorno directamente en cualquier valor de cadena de la configuración usando la sintaxis${VAR_NAME}. Las variables se sustituyen al cargar la configuración, antes de la validación.
- Solo se reconocen nombres de variables en mayúsculas:
[A-Z_][A-Z0-9_]* - Variables faltantes o vacías provocan un error al cargar la configuración
- Escape con
$${VAR}para producir un${VAR}literal - Funciona con
$include(los archivos incluidos también reciben sustitución)
Almacenamiento de autenticación (OAuth + claves de API)
OpenClaw almacena perfiles de autenticación por agente (OAuth + claves de API) en:<agentDir>/auth-profiles.json(predeterminado:~/.openclaw/agents/<agentId>/agent/auth-profiles.json)
~/.openclaw/credentials/oauth.json(o$OPENCLAW_STATE_DIR/credentials/oauth.json)
<agentDir>/auth.json(administrada automáticamente; no edite manualmente)
~/.openclaw/agent/*(migrado poropenclaw doctora~/.openclaw/agents/<defaultAgentId>/agent/*)
- Directorio OAuth (solo importación heredada):
OPENCLAW_OAUTH_DIR - Directorio de agente (anulación de la raíz del agente predeterminado):
OPENCLAW_AGENT_DIR(preferido),PI_CODING_AGENT_DIR(heredado)
oauth.json en auth-profiles.json.
auth
Metadatos opcionales para perfiles de autenticación. No almacena secretos; asigna
IDs de perfil a un proveedor + modo (y correo electrónico opcional) y define el orden
de rotación de proveedores usado para conmutación por error.
agents.list[].identity
Identidad opcional por agente usada para valores predeterminados y UX. La escribe el asistente de incorporación de macOS.
Si se establece, OpenClaw deriva valores predeterminados (solo cuando no los ha establecido explícitamente):
messages.ackReactiona partir delidentity.emojidel agente activo (retrocede a 👀)agents.list[].groupChat.mentionPatternsa partir delidentity.name/identity.emojidel agente (para que “@Samantha” funcione en grupos en Telegram/Slack/Discord/Google Chat/iMessage/WhatsApp)identity.avataracepta una ruta de imagen relativa al espacio de trabajo o una URL remota/data URL. Los archivos locales deben residir dentro del espacio de trabajo del agente.
identity.avatar acepta:
- Ruta relativa al espacio de trabajo (debe permanecer dentro del espacio del agente)
- URL
http(s) - URI
data:
wizard
Metadatos escritos por asistentes de la CLI (onboard, configure, doctor).
logging
- Archivo de registro predeterminado:
/tmp/openclaw/openclaw-YYYY-MM-DD.log - Si desea una ruta estable, establezca
logging.fileen/tmp/openclaw/openclaw.log. - La salida de consola puede ajustarse por separado mediante:
logging.consoleLevel(predeterminadoinfo, aumenta adebugcuando--verbose)logging.consoleStyle(pretty|compact|json)
- Los resúmenes de herramientas pueden redactarse para evitar filtraciones de secretos:
logging.redactSensitive(off|tools, predeterminado:tools)logging.redactPatterns(arreglo de cadenas regex; sobrescribe los valores predeterminados)
channels.whatsapp.dmPolicy
Controla cómo se manejan los chats directos (DMs) de WhatsApp:
"pairing"(predeterminado): remitentes desconocidos reciben un código de emparejamiento; el propietario debe aprobar"allowlist": solo permitir remitentes enchannels.whatsapp.allowFrom(o en el almacén de permitidos emparejados)"open": permitir todos los DMs entrantes (requiere quechannels.whatsapp.allowFromincluya"*")"disabled": ignorar todos los DMs entrantes
openclaw pairing list whatsappopenclaw pairing approve whatsapp <code>
channels.whatsapp.allowFrom
Lista de permitidos de números telefónicos E.164 que pueden activar respuestas automáticas de WhatsApp (solo DMs).
Si está vacía y channels.whatsapp.dmPolicy="pairing", los remitentes desconocidos recibirán un código de emparejamiento.
Para grupos, use channels.whatsapp.groupPolicy + channels.whatsapp.groupAllowFrom.
channels.whatsapp.sendReadReceipts
Controla si los mensajes entrantes de WhatsApp se marcan como leídos (doble marca azul). Predeterminado: true.
El modo de autochat siempre omite los recibos de lectura, incluso cuando está habilitado.
Anulación por cuenta: channels.whatsapp.accounts.<id>.sendReadReceipts.
channels.whatsapp.accounts (multicuenta)
Ejecute varias cuentas de WhatsApp en un solo gateway:
- Los comandos salientes usan por defecto la cuenta
defaultsi está presente; de lo contrario, el primer ID de cuenta configurado (ordenado). - El directorio de autenticación Baileys heredado de cuenta única se migra por
openclaw doctorawhatsapp/default.
channels.telegram.accounts / channels.discord.accounts / channels.googlechat.accounts / channels.slack.accounts / channels.mattermost.accounts / channels.signal.accounts / channels.imessage.accounts
Ejecute múltiples cuentas por canal (cada cuenta tiene su propio accountId y name opcional):
- Se usa
defaultcuando se omiteaccountId(CLI + enrutamiento). - Los tokens de entorno solo aplican a la cuenta predeterminada.
- Los ajustes base del canal (política de grupos, control de menciones, etc.) aplican a todas las cuentas a menos que se anulen por cuenta.
- Use
bindings[].match.accountIdpara enrutar cada cuenta a un agents.defaults diferente.
Control de menciones en chats de grupo (agents.list[].groupChat + messages.groupChat)
Los mensajes de grupo requieren mención obligatoria de forma predeterminada (ya sea mención por metadatos o patrones regex). Aplica a grupos de WhatsApp, Telegram, Discord, Google Chat e iMessage.
Tipos de mención:
- Menciones por metadatos: menciones @ nativas de la plataforma (p. ej., tocar para mencionar en WhatsApp). Se ignoran en el modo de autochat de WhatsApp (ver
channels.whatsapp.allowFrom). - Patrones de texto: patrones regex definidos en
agents.list[].groupChat.mentionPatterns. Siempre se verifican independientemente del modo de autochat. - El control de menciones solo se aplica cuando la detección de menciones es posible (menciones nativas o al menos un
mentionPattern).
messages.groupChat.historyLimit establece el valor predeterminado global para el contexto de historial de grupo. Los canales pueden anularlo con channels.<channel>.historyLimit (o channels.<channel>.accounts.*.historyLimit para multicuenta). Establezca 0 para deshabilitar el envoltorio de historial.
Límites de historial en DM
Las conversaciones DM usan historial basado en sesiones administrado por el agente. Puede limitar el número de turnos del usuario retenidos por sesión DM:- Anulación por DM:
channels.<provider>.dms[userId].historyLimit - Predeterminado del proveedor:
channels.<provider>.dmHistoryLimit - Sin límite (se conserva todo el historial)
telegram, whatsapp, discord, slack, signal, imessage, msteams.
Anulación por agente (tiene prioridad cuando se establece, incluso []):
channels.whatsapp.groups, channels.telegram.groups, channels.imessage.groups, channels.discord.guilds). Cuando se establece *.groups, también actúa como lista de permitidos de grupos; incluya "*" para permitir todos los grupos.
Para responder solo a disparadores de texto específicos (ignorando menciones @ nativas):
Política de grupos (por canal)
Usechannels.*.groupPolicy para controlar si se aceptan mensajes de grupos/salas:
"open": los grupos omiten listas de permitidos; el control de menciones sigue aplicando."disabled": bloquear todos los mensajes de grupos/salas."allowlist": permitir solo grupos/salas que coincidan con la lista de permitidos configurada.channels.defaults.groupPolicyestablece el valor predeterminado cuando elgroupPolicyde un proveedor no está configurado.- WhatsApp/Telegram/Signal/iMessage/Microsoft Teams usan
groupAllowFrom(respaldo:allowFromexplícito). - Discord/Slack usan listas de permitidos de canal (
channels.discord.guilds.*.channels,channels.slack.channels). - Los DMs de grupo (Discord/Slack) siguen controlados por
dm.groupEnabled+dm.groupChannels. - El valor predeterminado es
groupPolicy: "allowlist"(a menos que lo anulechannels.defaults.groupPolicy); si no se configura una lista de permitidos, los mensajes de grupo se bloquean.
Enrutamiento multi‑agente (agents.list + bindings)
Ejecute múltiples agentes aislados (espacio de trabajo separado, agentDir, sesiones) dentro de un Gateway.
Los mensajes entrantes se enrutan a un agente mediante enlaces.
agents.list[]: anulaciones por agente.id: ID estable del agente (requerido).default: opcional; cuando se establecen varios, gana el primero y se registra una advertencia. Si no se establece ninguno, la primera entrada de la lista es el agente predeterminado.name: nombre visible del agente.workspace:~/.openclaw/workspace-<agentId>predeterminado (paramain, retrocede aagents.defaults.workspace).agentDir:~/.openclaw/agents/<agentId>/agentpredeterminado.model: modelo predeterminado por agente, anulaagents.defaults.modelpara ese agente.- forma de cadena:
"provider/model", anula soloagents.defaults.model.primary - forma de objeto:
{ primary, fallbacks }(los retrocesos anulanagents.defaults.model.fallbacks;[]deshabilita los retrocesos globales para ese agente)
- forma de cadena:
identity: nombre/tema/emoji por agente (usado para patrones de mención + reacciones de acuse).groupChat: control de menciones por agente (mentionPatterns).sandbox: configuración de sandbox por agente (anulaagents.defaults.sandbox).mode:"off"|"non-main"|"all"workspaceAccess:"none"|"ro"|"rw"scope:"session"|"agent"|"shared"workspaceRoot: raíz personalizada del espacio de trabajo del sandboxdocker: anulaciones de docker por agente (p. ej.,image,network,env,setupCommand, límites; se ignora cuandoscope: "shared")browser: anulaciones del navegador en sandbox por agente (se ignora cuandoscope: "shared")prune: anulaciones de depuración del sandbox por agente (se ignora cuandoscope: "shared")
subagents: valores predeterminados de sub‑agente por agente.allowAgents: lista de permitidos de IDs de agente parasessions_spawndesde este agente (["*"]= permitir cualquiera; predeterminado: solo el mismo agente)
tools: restricciones de herramientas por agente (aplicadas antes de la política de herramientas del sandbox).profile: perfil base de herramientas (aplicado antes de permitir/denegar)allow: arreglo de nombres de herramientas permitidasdeny: arreglo de nombres de herramientas denegadas (la denegación prevalece)
agents.defaults: valores predeterminados compartidos del agente (modelo, espacio de trabajo, sandbox, etc.).bindings[]: enruta mensajes entrantes a unagentId.match.channel(requerido)match.accountId(opcional;*= cualquier cuenta; omitido = cuenta predeterminada)match.peer(opcional;{ kind: direct|group|channel, id })match.guildId/match.teamId(opcional; específico del canal)
match.peermatch.guildIdmatch.teamIdmatch.accountId(exacto, sin par/gremio/equipo)match.accountId: "*"(a nivel de canal, sin par/gremio/equipo)- agente predeterminado (
agents.list[].default, o la primera entrada de la lista, o"main")
bindings.
Perfiles de acceso por agente (multi‑agente)
Cada agente puede llevar su propia política de sandbox + herramientas. Úselo para mezclar niveles de acceso en un solo gateway:- Acceso completo (agente personal)
- Solo lectura de herramientas + espacio de trabajo
- Sin acceso al sistema de archivos (solo herramientas de mensajería/sesión)
tools.agentToAgent (opcional)
La mensajería de agente a agente es opcional:
messages.queue
Controla cómo se comportan los mensajes entrantes cuando ya hay una ejecución de agente activa.
messages.inbound
Desacelera mensajes entrantes rápidos del mismo remitente para que varios mensajes consecutivos
se conviertan en un solo turno del agente. La desaceleración se limita por canal + conversación
y usa el mensaje más reciente para el encadenamiento de respuestas/IDs.
- La desaceleración agrupa mensajes solo de texto; los medios/adjuntos se envían de inmediato.
- Los comandos de control (p. ej.,
/queue,/new) omiten la desaceleración para mantenerse independientes.
commands (manejo de comandos de chat)
Controla cómo se habilitan los comandos de chat en los conectores.
- Los comandos de texto deben enviarse como un mensaje independiente y usar el prefijo inicial
/(sin alias de texto plano). commands.text: falsedeshabilita el análisis de mensajes de chat para comandos.commands.native: "auto"(predeterminado) activa comandos nativos para Discord/Telegram y deja Slack desactivado; los canales no compatibles permanecen solo texto.- Establezca
commands.native: true|falsepara forzar todos, o anule por canal conchannels.discord.commands.native,channels.telegram.commands.native,channels.slack.commands.native(bool o"auto").falseborra comandos registrados previamente en Discord/Telegram al iniciar; los comandos de Slack se gestionan en la app de Slack. channels.telegram.customCommandsagrega entradas adicionales al menú del bot de Telegram. Los nombres se normalizan; los conflictos con comandos nativos se ignoran.commands.bash: truehabilita! <cmd>para ejecutar comandos del shell del host (/bash <cmd>también funciona como alias). Requieretools.elevated.enabledy listar al remitente entools.elevated.allowFrom.<channel>.commands.bashForegroundMscontrola cuánto espera bash antes de pasar a segundo plano. Mientras un trabajo de bash se ejecuta, nuevas solicitudes! <cmd>se rechazan (una a la vez).commands.config: truehabilita/config(lee/escribeopenclaw.json).channels.<provider>.configWritescontrola las mutaciones de configuración iniciadas por ese canal (predeterminado: true). Aplica a/config set|unsetmás migraciones automáticas específicas del proveedor (cambios de ID de supergrupo de Telegram, cambios de ID de canal de Slack).commands.debug: truehabilita/debug(anulaciones solo en tiempo de ejecución).commands.restart: truehabilita/restarty la acción de reinicio de la herramienta del gateway.commands.useAccessGroups: falsepermite que los comandos omitan listas de permitidos/políticas de grupos de acceso.- Los comandos slash y directivas solo se respetan para remitentes autorizados. La autorización se deriva de
listas de permitidos/emparejamiento del canal más
commands.useAccessGroups.
web (tiempo de ejecución del canal web de WhatsApp)
WhatsApp se ejecuta a través del canal web del gateway (Baileys Web). Se inicia automáticamente cuando existe una sesión vinculada.
Establezca web.enabled: false para mantenerlo desactivado de forma predeterminada.
channels.telegram (transporte del bot)
OpenClaw inicia Telegram solo cuando existe una sección de configuración channels.telegram. El token del bot se resuelve desde channels.telegram.botToken (o channels.telegram.tokenFile), con TELEGRAM_BOT_TOKEN como respaldo para la cuenta predeterminada.
Establezca channels.telegram.enabled: false para deshabilitar el inicio automático.
La compatibilidad multicuenta vive bajo channels.telegram.accounts (ver la sección multicuenta arriba). Los tokens de entorno solo aplican a la cuenta predeterminada.
Establezca channels.telegram.configWrites: false para bloquear escrituras de configuración iniciadas por Telegram (incluidas migraciones de ID de supergrupo y /config set|unset).
- Usa
sendMessageDraftde Telegram (burbuja de borrador, no un mensaje real). - Requiere temas de chat privado (message_thread_id en DMs; el bot tiene temas habilitados).
/reasoning streamtransmite el razonamiento al borrador y luego envía la respuesta final. Los valores predeterminados y el comportamiento de la política de reintentos están documentados en Política de reintentos.
channels.discord (transporte del bot)
Configure el bot de Discord estableciendo el token del bot y el control opcional:
La compatibilidad multicuenta vive bajo channels.discord.accounts (ver la sección multicuenta arriba). Los tokens de entorno solo aplican a la cuenta predeterminada.
channels.discord. El token se resuelve desde channels.discord.token, con DISCORD_BOT_TOKEN como respaldo para la cuenta predeterminada (a menos que channels.discord.enabled sea false). Use user:<id> (DM) o channel:<id> (canal de gremio) al especificar destinos de entrega para comandos cron/CLI; los IDs numéricos sin prefijo son ambiguos y se rechazan.
Los slugs de gremio están en minúsculas con espacios reemplazados por -; las claves de canal usan el nombre del canal con slug (sin # inicial). Prefiera IDs de gremio como claves para evitar ambigüedad por renombres.
Los mensajes creados por el bot se ignoran de forma predeterminada. Habilítelos con channels.discord.allowBots (los mensajes propios aún se filtran para evitar bucles de autorrespuesta).
Modos de notificación de reacciones:
off: sin eventos de reacción.own: reacciones en los mensajes propios del bot (predeterminado).all: todas las reacciones en todos los mensajes.allowlist: reacciones deguilds.<id>.usersen todos los mensajes (lista vacía deshabilita). El texto saliente se fragmenta porchannels.discord.textChunkLimit(predeterminado 2000). Establezcachannels.discord.chunkMode="newline"para dividir por líneas en blanco (límites de párrafo) antes de fragmentar por longitud. Los clientes de Discord pueden recortar mensajes muy altos, por lo quechannels.discord.maxLinesPerMessage(predeterminado 17) divide respuestas multilínea largas incluso cuando están por debajo de 2000 caracteres. Los valores predeterminados y el comportamiento de la política de reintentos están documentados en Política de reintentos.
channels.googlechat (webhook de Chat API)
Google Chat se ejecuta sobre webhooks HTTP con autenticación a nivel de aplicación (cuenta de servicio).
La compatibilidad multicuenta vive bajo channels.googlechat.accounts (ver la sección multicuenta arriba). Las variables de entorno solo aplican a la cuenta predeterminada.
- El JSON de la cuenta de servicio puede ser en línea (
serviceAccount) o basado en archivo (serviceAccountFile). - Respaldos de entorno para la cuenta predeterminada:
GOOGLE_CHAT_SERVICE_ACCOUNToGOOGLE_CHAT_SERVICE_ACCOUNT_FILE. audienceType+audiencedeben coincidir con la configuración de autenticación del webhook de la app de Chat.- Use
spaces/<spaceId>ousers/<userId|email>al establecer destinos de entrega.
channels.slack (modo socket)
Slack se ejecuta en Modo Socket y requiere tanto un token de bot como un token de app:
channels.slack.accounts (ver la sección multicuenta arriba). Los tokens de entorno solo aplican a la cuenta predeterminada.
OpenClaw inicia Slack cuando el proveedor está habilitado y ambos tokens están configurados (vía configuración o SLACK_BOT_TOKEN + SLACK_APP_TOKEN). Use user:<id> (DM) o channel:<id> al especificar destinos de entrega para comandos cron/CLI.
Establezca channels.slack.configWrites: false para bloquear escrituras de configuración iniciadas por Slack (incluidas migraciones de ID de canal y /config set|unset).
Los mensajes creados por el bot se ignoran de forma predeterminada. Habilítelos con channels.slack.allowBots o channels.slack.channels.<id>.allowBots.
Modos de notificación de reacciones:
off: sin eventos de reacción.own: reacciones en los mensajes propios del bot (predeterminado).all: todas las reacciones en todos los mensajes.allowlist: reacciones dechannels.slack.reactionAllowlisten todos los mensajes (lista vacía deshabilita).
channels.slack.thread.historyScopecontrola si el historial del hilo es por hilo (thread, predeterminado) o compartido en el canal (channel).channels.slack.thread.inheritParentcontrola si las nuevas sesiones de hilo heredan la transcripción del canal padre (predeterminado: false).
slack):
| Grupo de acciones | Predeterminado | Notas |
|---|---|---|
| reactions | habilitado | Reaccionar + listar reacciones |
| messages | habilitado | Leer/enviar/editar/eliminar |
| pins | habilitado | Anclar/desanclar/listar |
| memberInfo | habilitado | Información de miembros |
| emojiList | habilitado | Lista de emojis personalizados |
channels.mattermost (token del bot)
Mattermost se distribuye como un plugin y no viene incluido con la instalación principal.
Instálelo primero: openclaw plugins install @openclaw/mattermost (o ./extensions/mattermost desde un checkout de git).
Mattermost requiere un token de bot más la URL base de su servidor:
channels.mattermost.botToken + channels.mattermost.baseUrl o MATTERMOST_BOT_TOKEN + MATTERMOST_URL para la cuenta predeterminada (a menos que channels.mattermost.enabled sea false).
Modos de chat:
oncall(predeterminado): responder a mensajes del canal solo cuando se menciona con @.onmessage: responder a cada mensaje del canal.onchar: responder cuando un mensaje comienza con un prefijo disparador (channels.mattermost.oncharPrefixes, predeterminado[">", "!"]).
- DMs predeterminados:
channels.mattermost.dmPolicy="pairing"(los remitentes desconocidos reciben un código de emparejamiento). - DMs públicos:
channels.mattermost.dmPolicy="open"máschannels.mattermost.allowFrom=["*"]. - Grupos:
channels.mattermost.groupPolicy="allowlist"de forma predeterminada (controlado por menciones). Usechannels.mattermost.groupAllowFrompara restringir remitentes.
channels.mattermost.accounts (ver la sección multicuenta arriba). Las variables de entorno solo aplican a la cuenta predeterminada.
Use channel:<id> o user:<id> (o @username) al especificar destinos de entrega; los IDs sin prefijo se tratan como IDs de canal.
channels.signal (signal-cli)
Las reacciones de Signal pueden emitir eventos del sistema (herramientas de reacción compartidas):
off: sin eventos de reacción.own: reacciones en los mensajes propios del bot (predeterminado).all: todas las reacciones en todos los mensajes.allowlist: reacciones dechannels.signal.reactionAllowlisten todos los mensajes (lista vacía deshabilita).
channels.imessage (CLI de imsg)
OpenClaw lanza imsg rpc (JSON-RPC sobre stdio). No se requiere demonio ni puerto.
channels.imessage.accounts (ver la sección multicuenta arriba).
Notas:
- Requiere Acceso Completo al Disco para la base de datos de Mensajes.
- El primer envío solicitará permiso de automatización de Mensajes.
- Prefiera destinos
chat_id:<id>. Useimsg chats --limit 20para listar chats. channels.imessage.cliPathpuede apuntar a un script contenedor (p. ej.,ssha otra Mac que ejecuteimsg rpc); use claves SSH para evitar solicitudes de contraseña.- Para contenedores SSH remotos, establezca
channels.imessage.remoteHostpara obtener adjuntos vía SCP cuandoincludeAttachmentsesté habilitado.
agents.defaults.workspace
Establece el directorio global único de espacio de trabajo usado por el agente para operaciones de archivos.
Predeterminado: ~/.openclaw/workspace.
agents.defaults.sandbox está habilitado, las sesiones no principales pueden anularlo con sus
propios espacios de trabajo por ámbito bajo agents.defaults.sandbox.workspaceRoot.
agents.defaults.repoRoot
Raíz opcional del repositorio para mostrar en la línea Runtime del prompt del sistema. Si no se establece, OpenClaw
intenta detectar un directorio .git subiendo desde el espacio de trabajo (y el directorio
de trabajo actual). La ruta debe existir para usarse.
agents.defaults.skipBootstrap
Deshabilita la creación automática de los archivos de arranque del espacio de trabajo (AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md y BOOTSTRAP.md).
Use esto para despliegues presembrados donde los archivos del espacio de trabajo provienen de un repositorio.
agents.defaults.bootstrapMaxChars
Máximo de caracteres de cada archivo de arranque del espacio de trabajo inyectado en el prompt del sistema
antes de truncar. Predeterminado: 20000.
Cuando un archivo excede este límite, OpenClaw registra una advertencia e inyecta un
inicio/fin truncado con un marcador.
agents.defaults.userTimezone
Establece la zona horaria del usuario para el contexto del prompt del sistema (no para marcas de tiempo en
sobres de mensajes). Si no se establece, OpenClaw usa la zona horaria del host en tiempo de ejecución.
agents.defaults.timeFormat
Controla el formato de hora mostrado en la sección Fecha y Hora Actual del prompt del sistema.
Predeterminado: auto (preferencia del SO).
messages
Controla prefijos entrantes/salientes y reacciones opcionales de acuse.
Vea Mensajes para colas, sesiones y contexto de streaming.
responsePrefix se aplica a todas las respuestas salientes (resúmenes de herramientas, streaming por bloques, respuestas finales) en todos los canales a menos que ya esté presente.
Las anulaciones pueden configurarse por canal y por cuenta:
channels.<channel>.responsePrefixchannels.<channel>.accounts.<id>.responsePrefix
channels.<channel>.accounts.<id>.responsePrefixchannels.<channel>.responsePrefixmessages.responsePrefix
undefinedcae al siguiente nivel.""deshabilita explícitamente el prefijo y detiene la cascada."auto"deriva[{identity.name}]para el agente enrutado.
messages.responsePrefix no está configurado, no se aplica ningún prefijo de forma predeterminada. Las respuestas de autochat de WhatsApp
son la excepción: usan por defecto [{identity.name}] cuando está configurado, de lo contrario
[openclaw], para que las conversaciones en el mismo teléfono sigan siendo legibles.
Establézcalo en "auto" para derivar [{identity.name}] para el agente enrutado (cuando esté configurado).
Variables de plantilla
La cadenaresponsePrefix puede incluir variables de plantilla que se resuelven dinámicamente:
| Variable | Descripción | Ejemplo |
|---|---|---|
{model} | Nombre corto del modelo | claude-opus-4-6, gpt-4o |
{modelFull} | Identificador completo del modelo | anthropic/claude-opus-4-6 |
{provider} | Nombre del proveedor | anthropic, openai |
{thinkingLevel} | Nivel de pensamiento actual | high, low, off |
{identity.name} | Nombre de identidad del agente | (igual que el modo "auto") |
{MODEL} = {model}). {think} es un alias de {thinkingLevel}.
Las variables no resueltas permanecen como texto literal.
[claude-opus-4-6 | think:high] Here's my response...
El prefijo entrante de WhatsApp se configura mediante channels.whatsapp.messagePrefix (obsoleto:
messages.messagePrefix). El valor predeterminado permanece sin cambios: "[openclaw]" cuando
channels.whatsapp.allowFrom está vacío; de lo contrario "" (sin prefijo). Al usar
"[openclaw]", OpenClaw usará en su lugar [{identity.name}] cuando el agente enrutado
tenga identity.name configurado.
ackReaction envía una reacción emoji de mejor esfuerzo para reconocer mensajes entrantes
en canales que admiten reacciones (Slack/Discord/Telegram/Google Chat). Por defecto usa el
identity.emoji del agente activo cuando está configurado; de lo contrario "👀". Establézcalo en "" para deshabilitar.
ackReactionScope controla cuándo se disparan las reacciones:
group-mentions(predeterminado): solo cuando un grupo/sala requiere menciones y el bot fue mencionadogroup-all: todos los mensajes de grupo/saladirect: solo mensajes directosall: todos los mensajes
removeAckAfterReply elimina la reacción de acuse del bot después de enviar una respuesta
(Slack/Discord/Telegram/Google Chat únicamente). Predeterminado: false.
mensajes.tts
Habilitar texto a voz para respuestas salientes. Cuando está encendido, OpenClaw genera audio
usando TACenLabs o OpenAI y lo adjunta a las respuestas. Telegram usa notas de voz Opus
; otros canales envían audio MP3.
messages.tts.autocontrola automáticamente TTS (off,siempre,inbound,tagged)./tts apagado|siempre|inbound|taggedestablece el modo automático de la sesión permanente (sobreescribe la configuración).messages.tts.enabledes legado; doctor lo migra amessages.tts.auto.prefsPathalmacena anulaciones locales (proveedor/límite/resumen).maxTextLengthes un tapón duro para la entrada TTS; los resúmenes se truncan para que encajen.TextyModelanulaagents.defaults.model.primarypara autoresumir.- Acepta
provider/modelo un alias deagents.defaults.models.
- Acepta
modelOverrideshabilita anulaciones basadas en modelos como etiquetas[[tts:...]](por defecto)./tts limity/tts Resumycontrolan la configuración de resumen por usuario.- Los valores
apiKeyregresan aELEVENLABS_API_KEY/XI_API_KEYyOPENAI_API_KEY. elevenlabs.baseUrlanula la URL base de la API.elevenlabs.voiceSettingssoportastability/similarityBoost/style(0..1),useSpeakerBoost, yspeed(0.5..2.0).
hablar
Por defecto para modo Talk (macOS/iOS/Android). Los ID de voz vuelven a ELEVENLABS_VOICE_ID o SAG_VOICE_ID cuando se desactiva.
apiKey regresa a ELEVENLABS_API_KEY (o el perfil de shell de la pasarela) cuando se desactiva.
voiceAliases deja que las directivas de Talk usen nombres amigables (por ejemplo, "voice":"Clawd").
agents.defaults
Controla el tiempo de ejecución del agente embebido (modelo/pensando/verbose/timeouts).
agents.defaults.models define el catálogo de modelos configurado (y actúa como la lista permitida para /model).
agents.defaults.model.primary establece el modelo predeterminado; agents.defaults.model.fallbacks son fallos globales.
agents.defaults.imageModel es opcional y es solo usado si el modelo principal carece de entrada de imagen.
Cada entrada agents.defaults.models puede incluir:
alias(atajo de modelo opcional, por ejemplo,/opus).params(parámetros API específicos del proveedor opcional pasaron a través de la solicitud del modelo).
params también se aplica a las ejecuciones de streaming (agente embebido + compacción). Claves soportadas hoy: temperature, maxTokens. Estas combinaciones con opciones de tiempo de llamada; los valores suministrados por la llamada ganan. temperature es un nudo avanzado: deje sin establecer a menos que sepa los valores predeterminados del modelo y necesite un cambio.
Ejemplo:
- establecer
--thinking off, o - defina
agents.defaults.models["zai/<model>"].params.thinkingusted mismo.
agents.defaults.models:
opus->antropic/claude-opus-4-6sonnet->anthropic/claude-sonnet-4-5gpt->openai/gpt-5.2gpt-mini->openai/gpt-5-minigemini->google/gemini-3-pro-previewgemini-flash->google/gemini-3-flash-preview
MINIMAX_API_KEY (env) o configure models.providers.minimax.
agents.defaults.cliBackends (CLI fallback)
Los backends opcionales de CLI para operaciones de retorno de solo texto (sin llamadas de herramientas). Estos son útiles como una ruta de respaldoformat@@0
cuando los proveedores de API fallan. El paso de la imagen es compatible cuando configuras
un imageArg que acepta rutas de archivos.
Notas:
- Los backends de CLI son text-first; las herramientas siempre están deshabilitadas.
- Las sesiones son soportadas cuando
sessionArgestá establecido; los ids de sesión persisten por backend. - Para
claude-cli, los valores por defecto están conectados. Reemplazar la ruta del comando si PATH es mínimo (launchd/systemd).
agents.defaults.contextPruning (tool-result poding)
agents.defaults.contextPruning limpia antiguos resultados de herramientas desde el contexto en memoria justo antes de que una solicitud sea enviada al LLM.
no modifica el historial de sesiones en el disco (*.jsonl permanece completo).
Esto pretende reducir el uso de tokens para los agentes de chatty que acumulan grandes salidas de herramientas con el tiempo.
Nivel alto:
- Nunca toca los mensajes del usuario/asistente.
- Protege los últimos mensajes de asistente
keepLastAssistants(no se podarán los resultados de la herramienta después de ese punto). - Protege el prefijo de la correa de arranque (nada antes de que el primer mensaje del usuario sea podado).
- Modos:
adaptive: resultados de herramientas de gran tamaño (mantener cabeza/tail) cuando la proporción de contexto estimada cruzasoftTrimRatio. Entonces limpia duramente los resultados de la herramienta elegible más antiguos cuando la proporción de contexto estimada cruzahardClearRatioy hay suficiente granel de resultado de herramientas prunable (minPrunableTools).agresivo: siempre reemplaza los resultados de herramientas elegibles antes del corte con elhardClear.placeholder(sin comprobación de la relación).
- Suave-trim: sólo para los resultados de la herramienta oversized. Mantiene el principio + final e inserta
...en el medio.- Before:
toolResult("…salida muy larga…") - Después:
toolResult("HEAD…\n...\n…TAIL\n\n[resultado de la herramienta recortado: …]")
- Before:
- Hard-clear: reemplaza todo el resultado de la herramienta con el marcador de posición.
- Before:
toolResult("…salida muy larga…") - Después:
toolResult("[Contenido de la herramienta antigua borrado]")
- Before:
- Los resultados de la herramienta que contienen bloques de imagen son omitidos (nunca borrados) ahora mismo.
- La “relación de contexto” estimada se basa en caracteres (aproximadamente), no en tokens exactos.
- Si la sesión no contiene al menos mensajes de asistente de
keepLastAssistantstodavía, se omite la poda. - En modo
agresivo,hardClear.enabledes ignorado (los resultados de herramientas elegibles siempre son reemplazados porhardClear.placeholder).
mode es "adaptive" o "agresiva"):
keepLastAssistants:3softTrimRatio:0.3(sólo adaptativo)hardClearRatio:0.5(sólo adaptativo)minPrunableToolChars:50000(sólo adaptativo)softTrim:{ maxChars: 4000, headChars: 1500, tailChars: 1500 }(solo adaptativo)hardClear:{ enabled: true, placeholder: "[Old tool result content cleared]" }
agents.defaults.compaction (reserva cabecera + memoria de flush)
agents.defaults.compaction.mode selecciona la estrategia de resumen de compactación. Por defecto es default; establece salvaguard para habilitar resumen fragmentado para historias muy largas. Consulte /concepts/compaction.
agents.defaults.compaction.reserveTokensFloor impone un valor mínimo reserveTokens
para la compacción de Pi (por defecto: 20000). Establécelo en 0 para desactivar el suelo.
agents.defaults.compaction.memoryFlush ejecuta un giro de agente silencio antes de
auto-compacción, indicando al modelo que almacene memorias durables en el disco (por ejemplo,
memory/AAY-MM-DD.md). Se activa cuando la estimación del token de sesión cruza un umbral blandoformat@@0
debajo del límite de compacción.
Predeterminados antiguos:
memoryFlush.enabled:truememoryFlush.softThresholdTokens:4000memoryFlush.prompt/memoryFlush.systemPrompt: predeterminado integrado conNO_REPLY- Nota: la descarga de memoria se omite cuando el espacio de trabajo de sesión es de solo lectura
(
agents.defaults.sandbox.workspaceAccess: "ro"o"ninguno").
-
agents.defaults.blockStreamingDefault:"on"/"off"(desactivado por defecto). -
Anulaciones del canal:
*.blockStreaming(y variantes por cuenta) para bloquear el streaming activado/apagado. Los canales que no sean de Telegram requieren un*.blockStreaming: trueexplícito para habilitar las respuestas de bloques. -
agents.defaults.blockStreamingBreak:"text_end"o"message_end"(por defecto: text_end). -
agents.defaults.blockStreamingChunk: chunking suave para bloques streamed. Por defecto es 800–1200 caracteres, prefiere saltos de párrafo (\n\n), luego nuevas líneas, luego frases. Ejemplo: -
agents.defaults.blockStreamingCoalesce: combina bloques streaming antes de enviar. Por defecto es{ idleMs: 1000 }y heredaminCharsdeblockStreamingChunkconmaxCharslimitado al límite de texto del canal. Signal/Slack/Discord/Google Chat predeterminado aminChars: 1500a menos que sea reemplazado. Anulaciones del canal:channels.whatsapp.blockStreamingCoalesce,channels.telegram.blockStreamingCoalesce,channels.discord.blockStreamingCoalesce,channels.slack.blockStreamingCoalesce,channels.msteams.blockStreamingCoalesce,channels.signal.blockStreamingCoalesce,channels.imessage.blockStreamingCoalesce,channels.msteamingCoalesce,channels.googlechat.blockStreamingCoalesce(y variantes de la cuenta). -
agents.defaults.humanDelay: pausa aleatoriamente entre respuestas de bloque después de la primera. Modos:off(por defecto),natural(800–2500ms),custom(usaminMs/maxMs). Por agente anular:agents.list[].humanDelay. Ejemplo:Vea /concepts/streaming para el comportamiento + detalles de chunking.
agents.defaults.typingMode:"nunca" | "instantáneo" | "pensando" | "mensaje". Por defectoinstantáneopara chats directos / menciones ymensajepara chats de grupo no mencionados.session.typingMode: sobreescritura por sesión para el modo.agents.defaults.typingIntervalSeconds: con qué frecuencia se actualiza la señal de escritura (por defecto: 6s).session.typingIntervalSegundos: sobreescritura por sesión para el intervalo de actualización. Vea /concepts/typing-indicators para detalles de comportamiento.
agents.defaults.model.primary debe establecerse como provider/model (por ejemplo, anthropic/claude-opis) 4-6).
Los alias vienen de agents.defaults.models.*.alias (e.g. Opus).
Si omites el proveedor, OpenClaw asume actualmente antropic como una regresión temporal de la degradación
.
Los modelos Z.AI están disponibles como zai/<model> (por ejemplo, zai/glm-4.7) y requieren
ZAI_API_KEY (o legado Z_AI_API_KEY) en el entorno.
agents.defaults.heartbeat configura ejecuciones latidos periódicos:
cada: cadena de duración (ms,s,m,h); minutos unitarios por defecto. Predeterminado:30m. Establece0mpara desactivar.model: modelo opcional de anulación para ejecuciones de heartbeat (provider/model).includeReasoning: cuandotrue, heartbeats también entregará el mensaje separadoReasoning:cuando esté disponible (misma forma que/reasoning on). Predeterminado:false.session: tecla opcional de sesión para controlar en qué sesión se ejecuta el latido del corazón. Por defecto:main.to: reemplazo opcional del destinatario (id específico del canal, p.e. E.164 para WhatsApp, id del chat para Telegram).target: canal opcional de entrega (last,whatsapp,telegram,discord,slack,msteams,signal,imessage,ninguno). Predeterminado:last.prompt: sobreescritura opcional para el cuerpo del latido del corazón (por defecto:Leer HEARTBEAT.md si existe (contexto del espacio de trabajo). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.). Los overrides se envían literalmente; incluye una líneaRead HEARTBEAT.mdsi quieres que el archivo lea.ackMaxChars: caracteres máximos permitidos después deHEARTBEAT_OKantes de la entrega (por defecto: 300).
- Establece
agents.list[].heartbeatpara activar o anular la configuración de latido cardíaco para un agente específico. - Si cualquier entrada de agente define
heartbeat, solo esos agentes ejecutan heartbeats; por defecto se convierte en la línea base compartida para esos agentes.
cada, mantén HEARTBEAT.md pequeño, y/o elige un modelo más barato.
tools.exec configura los valores de exec de fondo:
backgroundMs: tiempo antes del auto-background (ms, predeterminado 10000)timeoutSec: auto-kill después de este tiempo de ejecución (segundos, por defecto 1800)cleanupMs: cuánto tiempo mantener las sesiones terminadas en memoria (ms, por defecto 18000)notifyOnExit: encolar un evento del sistema + solicitar latido al salir en segundo plano de exec (por defecto true)applyPatch.enabled: habilita elapply_patchexperimental (sólo OpenAI/OpenAI Codex; por defecto falso)applyPatch.allowModels: lista permitida opcional de ids de modelo (por ejemplo,gpt-5.2oopenai/gpt-5.2) Nota:applyPatchsólo está bajotools.exec.
tools.web configura la búsqueda web + obtener herramientas:
tools.web.search.enabled(por defecto: verdadero cuando la clave está presente)tools.web.search.apiKey(recomendado: establece a través deopenclaw configure --section web, o usaBRAVE_API_KEYvar)tools.web.search.maxResults(1–10, por defecto 5)tools.web.search.timeoutSeconds(predeterminado 30)tools.web.search.cacheTtlMinutes(predeterminado 15)tools.web.fetch.enabled(por defecto true)tools.web.fetch.maxChars(predeterminado 50000)tools.web.fetch.maxCharsCap(por defecto 50000; clampa maxChars de las llamadas config/tools)tools.web.fetch.timeoutSeconds(predeterminado 30)tools.web.fetch.cacheTtlMinutes(predeterminado 15)tools.web.fetch.userAgent(anulación opcional)tools.web.fetch.readability(por defecto true; deshabilita para usar sólo limpieza básica de HTML)tools.web.fetch.firecrawl.enabled(por defecto es verdad cuando se establece una clave API)tools.web.fetch.firecrawl.apiKey(opcional; por defectoFIRECRAWL_API_KEY)tools.web.fetch.firecrawl.baseUrl(por defecto https://api.firecrawl.dev)tools.web.fetch.firecrawl.onlyMainContent(por defecto true)tools.web.fetch.firecrawl.maxAgeMs(opcional)tools.web.fetch.firecrawl.timeoutSeconds(opcional)
tools.media configura la comprensión de medios entrantes (image/audio/video):
tools.media.models: lista de modelos compartidos (capacidad etiquetada; usada después de listas por cap).tools.media.concurrency: ejecución máxima de capacidad concurrente (por defecto 2).tools.media.image/tools.media.audio/tools.media.video:enabled: opt-out switch (predeterminado verdadero cuando los modelos están configurados).prompt: opción de anulación del prompt (imagen/video añade una pista demaxCharsautomáticamente).maxChars: caracteres de salida máximos (por defecto 500 para imagen/vídeo; unset para audio).maxBytes: tamaño máximo de medios a enviar (por defecto: imagen 10MB, audio 20MB, vídeo 50MB).timeoutSegundos: timeout de solicitud (por defecto: imagen 60s, audio 60s, video 120s).language: pista de audio opcional.attachments: política de adjuntos (mode,maxAttachments,prefer).scope: compuerta opcional (primero coincide con ganancias) conmatch.channel,match.chatType, omatch.keyPrefix.models: lista ordenada de entradas de modelo; fallos o soportes sobredimensionados caen en la siguiente entrada.
- Cada entrada
modelos[]:- Entrada del proveedor (
type: "provider"o omitido):provider: API provider id (openai,anthropic,google/gemini,groq, etc).model: model id override (requerido para la imagen; predeterminado paragpt-4o-mini-transcribe/whisper-(0)[video] v3-turbopara proveedores de audio, ygemini-3-flash-previewpara video).profile/preferredProfile: selección de perfil de autor.
- Entrada CLI (
type: "cli"):command: ejecutable a ejecutar.args: argumentos con plantillas (soporta{{MediaPath}},{{Prompt}},{{MaxChars}}, etc).
capabilities: lista opcional (image,audio,video) para comprimir una entrada compartida. Por defecto al omitir:openai/anthropic/minimax→ imagen,google→ image+audio+video,groq→ audio.prompt,maxChars,maxBytes,timeoutSegundds,languagepuede ser anulado por entrada.
- Entrada del proveedor (
habilitados: false), se omite el entendimiento; el modelo todavía recibe los archivos adjuntos originales.
La autenticación del proveedor sigue el orden de autenticación del modelo estándar (perfiles de autor, vars env como OPENAI_API_KEY/GROQ_API_KEY/GEMINI_API_KEY, o models.providers.*.apiKey).
Ejemplo:
agents.defaults.subagents configura los valores predeterminados de sub-agente:
model: modelo predeterminado para los subagentes generados (cadena o{ primary, fallbacks }). Si se omite, los subagentes heredan el modelo de la persona que llama a menos que se sobreescriba por agente o por llamada.maxConcurrent: ejecución máxima de sub-agente simultáneo (por defecto 1)archiveAfterMinutes: sesiones de sub-agente autoarchivadas después de N minutos (por defecto 60; establece0a desactivar)- Política de herramientas por subagente:
tools.subagents.tools.allow/tools.subagents.tools.deny(negar victorias)
tools.profile establece una herramienta base allowlist antes de tools.allow/tools.deny:
minimal: solosession_statuscoding:group:fs,group:runtime,group:sessions,group:memory,imagemessaging:group:messaging,sessions_list,sessions_history,sessions_send,session_statusfull: sin restricción (igual que no configurado)
agents.list[].tools.profile.
Ejemplo (solo mensajería por defecto, permitir también herramientas de Slack + Discord):
tools.byProvider te permite restringir más herramientas para proveedores específicos (o un único provider/model).
Anulación por agente: agents.list[].tools.byProvider.
Pedido: perfil base → perfil de proveedor → permitir / denegar políticas.
Las claves del proveedor aceptan ya sea provider (por ejemplo, google-antigravity) o provider/model
(por ejemplo, openai/gpt-5.2).
Ejemplo (mantener el perfil global de programación, pero herramientas mínimas para Google Antigravity):
tools.allow / tools.deny configura una herramienta global allow/deny policy (negar ganancias).
La coincidencia es insensible a mayúsculas y minúsculas y soporta comodines * ("*" significa todas las herramientas).
Esto se aplica incluso cuando el sandbox Docker está apagado.
Ejemplo (desactivar navegador/lienzo en todas partes):
group:runtime:exec,bash,processgroup:fs:read,write,edit,apply_patchgroup:sessions:sessions_list,sessions_history,sessions_send,sessions_spawn,session_statusgroup:memory:memory_search,memory_getgroup:web:web_search,web_fetchgroup:ui:browser,canvasgroup:automation:cron,gatewaygroup:messaging:messagegroup:nodes:nodesgroup:openclaw: todas las herramientas integradas de OpenClaw (excluye plugins de proveedores)
tools.elevated elevados (host):
activado: permitir modo elevado (por defecto verdadero)allowFrom: listas permitidas por canal (vacío = deshabilitado)whatsapp: E.164 númerostelegram: identificadores de chat o nombres de usuariodiscord: identificadores de usuario o nombres de usuario (se repite achannels.discord.dm.allowFromsi se omite)signal: E.164 númerosimessage: manejadores/identificadores de chatwebchat: identificadores de sesión o nombres de usuario
tools.elevatedes la línea de base global.agents.list[].tools.elevatedsólo puede restringir aún más (ambos deben permitir)./elevated on|off|ask|fullalmacena el estado por clave de sesión; las directivas en línea se aplican a un solo mensaje.- Ejecutado
execse ejecuta en el anfitrión y evita el sandboxing. - La política de herramientas sigue aplicándose; si
execes negada, no se puede usar elevado.
agents.defaults.maxConcurrent establece el número máximo de ejecuciones de agentes integrados que pueden ejecutarse en paralelo entre sesiones. Cada sesión sigue serializada (una ejecute
por clave de sesión a la vez). Predeterminado: 1.
agents.defaults.sandbox
Opcional sandbox Docker para el agente incrustado. Dirigido a sesiones
no principales, por lo que no pueden acceder a su sistema host.
Detalles: Sandboxing
Por defecto (si está habilitado):
- scope:
"agent"(un contenedor + espacio de trabajo por agente) - Imagen basada en gusanos de libros de Debian
- agente de acceso al espacio de trabajo:
workspaceAccess: "None "(por defecto)"ninguno ": usa un espacio de trabajo sandbox por ámbito bajo~/.openclaw/sandboxes
"ro": mantén el espacio de trabajo del entorno de pruebas en/workspace, y monta el espacio de trabajo del agente sólo en/agent(desactivawrite/edit/apply_patch)"rw": montar el área de trabajo del agente leer/escribir en/workspace
- poda automática: inactivo > 24 h O antigüedad > 7 d
- política de herramientas: permitir sólo
exec,process,read,write,edit,apply_patch,sessions_list,sessions_history,sessions_send,sessions_spawn,session_status(denegar victorias)- configure a través de
tools.sandbox.tools, sobreescribe por agente a través deagents.list[].tools.sandbox.tools - grupos de herramientas soportados en la política de sandbox:
group:runtime,group:fs,group:sessions,group:memory(ver Sandbox vs Tool Policy vs Applicated)
- configure a través de
- navegador opcional de arena (Chromium + CDP, observador noVNC)
- knobs:
network,user,pidsLimit,memory,cpus,ulimits,seccompProfile,apparmorProfile
scope: "shared" significa un contenedor compartido y espacio de trabajo compartido. Sin
aislamiento multisesión. Usa scope: "session" para el aislamiento por sesión.
Legancia: perSession sigue soportado (true → scope: "session",
false → scope: "shared").
setupCommand ejecuta una vez después de que el contenedor sea creado (dentro del contenedor a través de sh -lc).
Para la instalación de paquetes, asegúrese de egresos de red, un root FS escribible y un usuario root.
network: "outer"; establece agents.defaults.sandbox.docker.network
a "puente" (o tu red personalizada) si el agente necesita acceso saliente.
Nota: los archivos adjuntos entrantes se introducen en el espacio de trabajo activo en media/inbound/*. Con workspaceAccess: "rw", esto significa que los archivos se escriben en el espacio de trabajo del agente.
Nota: docker.binds monta directorios de host adicionales; los enlaces globales y por agente son fusionados.
Construye la imagen opcional del navegador con:
agents.defaults.sandbox.browser.enabled=true, la herramienta de navegador utiliza una instancia de Chromium aislada en sandbox (CDP). Si noVNC está habilitado (por defecto cuando headless=false),
la URL de noVNC se inyecta en el prompt del sistema para que el agente pueda hacer referencia a ella.
Esto no requiere browser.enabled en la configuración principal; el control sandbox
URL es inyectado por sesión.
agents.defaults.sandbox.browser.allowHostControl (por defecto: false) permite que
sesiones enrolladas apunte explícitamente al servidor de control de navegador host
mediante la herramienta del navegador (target: "host"). Deja esto desactivado si deseas un aislamiento estricto del sandbox.
Listas de permisos para el control remoto:
allowedControlUrls: URL de control exacto permitidas paratarget: "custom".allowedControlHosts: nombres de host permitidos (sólo nombre de host, sin puerto).allowedControlPorts: puertos permitidos (por defecto: http=80, https=443). Por defecto: todas las listas permitidas no están definidas (sin restricción).allowHostControlpor defecto es falso.
models (proveedores personalizados + URL base)
OpenClaw utiliza el catálogo de modelos pi-coding-agent. Puede añadir proveedores personalizados
(LiteLLM, servidores locales compatibles con OpenAI, proxies Antrópicos, etc.) escribiendo
~/.openclaw/agents/<agentId>/agent/models.json o definiendo el mismo esquema dentro de tu configuración
OpenClaw bajo models.providers.
Vista general de proveedor por proveedor + ejemplos: /concepts/model-providers.
Cuando models.providers está presente, OpenClaw escribe/combina un models.json en
~/.openclaw/agents/<agentId>/agent/ al iniciar:
- comportamiento por defecto: fusionar (mantiene a los proveedores existentes, sobrescritos en el nombre)
- establecer
models.mode: "reemplazar"para sobreescribir el contenido del archivo
agents.defaults.model.primary (proveedor/modelo).
Código abierto Zen (proxy multimodelo)
OpenCode Zen es una pasarela multimodelo con puntos finales por modelo. OpenClaw usa el proveedor integradoopencode de pi-ai; establece OPENCODE_API_KEY (o
OPENCODE_ZEN_API_KEY) de https://opencode.ai/auth.
Notas:
- Las referencias de modelos usan
opencode/<modelId>(ejemplo:opencode/claude-op)[video] 4-6). - Si activas una lista permitida a través de
agents.defaults.models, añade cada modelo que planeas usar. - Atajo:
openclaw a bordo --auth-choice opencode-zen.
Z.AI (GLM-4.7) — Soporte para alias
Los modelos Z.AI están disponibles a través del proveedor integradozai. Establezca ZAI_API_KEY
en su entorno y haga referencia al modelo por proveedor/modelo.
Atajo: openclaw a bordo --auth-choice zai-api-key.
z.ai/*yz-ai/*son alias aceptados y normalizan azai/*.- Si
ZAI_API_KEYno se encuentra, las peticiones azai/*fallarán con un error de autenticación en tiempo de ejecución. - Error de ejemplo:
No hay clave API para el proveedor "zai". - El endpoint general de la API de Z.AI es
https://api.z.ai/api/paas/v4. Las solicitudes de codificación de GLM usan el endpoint de codificación dedicadohttps://api.z.ai/api/coding/paas/v4. El proveedor integradozaiutiliza el punto final de codificación. Si necesita el extremo general , defina un proveedor personalizado enmodels.providerscon la URL base sobrescribir (ver la sección de proveedores personalizados de arriba). - Usar un marcador de posición falso en docs/configs; nunca comprometer claves API reales.
Moonshot AI (Kimi)
Usar el punto final compatible con OpenAI de Moonshot:- Establece
MOONSHOT_API_KEYen el entorno o usaopenclaw a bordo --auth-choice moonshot-api-key. - Modelo ref:
moonshot/kimi-k2.5. - Para el punto final de China, tampoco:
- Ejecuta
openclaw a bordo --auth-choice moonshot-api-key-cn(asistente estableceráhttps://api.moonshot.cn/v1), o - Configura manualmente
baseUrl: "https://api.moonshot.cn/v1"enmodels.providers.moonshot.
- Ejecuta
Kimi Coding
Usar el punto final de codificación Kimi de Moonshot AI (proveedor integrado compatible con Antropica):- Establece
KIMI_API_KEYen el entorno o usaopenclaw a bordo --auth-choice kimi-code-api-key. - Modelo ref:
kimi-coding/k2p5.
Sintético (compatible con Antrópicos)
Usa el punto final compatible con Synthetic’s Anthropic:- Establece
SYNTHETIC_API_KEYo usaopenclaw a bordo --auth-choice synthetic-api-key. - Modelo ref:
synthetic/hf:MiniMaxAI/MiniMax-M2.1. - La URL base debe omitir
/v1porque el cliente Antrópico lo añade.
Modelos locales (LM Studio) — configuración recomendada
Vea /gateway/local-models para la guía local actual. TL;DR: ejecuta MiniMax M2.1 a través de LM Studio Responses API con hardware serio; mantén los modelos alojados fusionados por segunda vez.MiniMax M2.1
Usar MiniMax M2.1 directamente sin LM Studio:- Establece la variable de entorno
MINIMAX_API_KEYo usaopenclaw a bordo --auth-choice minimax-api. - Modelo disponible:
MiniMax-M2.1(por defecto). - Actualiza los precios en
models.jsonsi necesitas un seguimiento exacto de costes.
Cerebras (GLM 4.6 / 4.7)
Usar Cerebras a través de su punto final compatible con OpenAI:- Usa
cerebras/zai-glm-4.7para Cerebras; usazai/glm-4.7para Z.AI direct. - Establece
CEREBRAS_API_KEYen el entorno o la configuración.
- APIs soportadas:
openai-completions,openai-responses,anthropic-messages,google-generative-ai - Usa
authHeader: true+headerspara necesidades de autenticación personalizadas. - Reemplaza la raíz de configuración del agente con
OPENCLAW_AGENT_DIR(oPI_CODING_AGENT_DIR) si quieresmodels.jsonalmacenado en otro lugar (por defecto:~/.openclaw/agents/main/agent).
sesión
Controla el alcance de la sesión, restablece la política, restablece los activadores y donde se escribe el almacén de sesiones.
mainKey: tecla direct-chat (predeterminado:"main"). Útil cuando se quiere “renombrar” el hilo principal de DM sin cambiaragentId.- Nota de Sandbox:
agents.defaults.sandbox.mode: "non-main"utiliza esta clave para detectar la sesión principal. Cualquier clave de sesión que no coincida conmainKey(grupos/canales) es sandboxed.
- Nota de Sandbox:
dmScope: cómo agrupar las sesiones DM (por defecto:"main").main: todas las DMs comparten la sesión principal para continuidad.per-peer: aísla DMs por el identificador del remitente a través de los canales.por canal-par: aislar DMs por canal + emisor (recomendado para entradas multiusuario).por cuenta-canal-par: aislar DMs por cuenta + canal + emisor (recomendado para entradas multicuenta).- Modo DM seguro (recomendado): establezca
session.dmScope: "per-channel-peer"cuando varias personas pueden DM el bot (entradas compartidas, listas de permisos multipersona, o `dmPolicy: “open”).
identityLinks: mapea ids canónicos a los pares prefijados por el proveedor para que la misma persona comparta una sesión DM a través de los canales al usarper-peer,per-channel-peer, oper-account-channel-peer.- Ejemplo:
alice: ["telegram:123456789", "discord:987654321012345678"].
- Ejemplo:
reset: política de reinicio primario. Por defecto los reinicios diarios a las 4:00 AM hora local en el host de la puerta de enlace.mode:dailyoidle(por defecto:dailycuandoresetestá presente).atHour: hora local (0-23) para el límite diario de reinicio.idleMinutes: desliza la ventana inactiva en minutos. Cuando se configuran tanto el reinicio diario como la inactividad, gana el que expire primero.
resetByType: per-session overrides fordirect,group, andthread. Legacydmkey is accepted as an alias fordirect.- Si solo estableces
session.idleMinuteslegado sin ningúnreset/resetByType, OpenClaw permanece en modo de sólo idle-only para compatibilidad con versiones anteriores.
- Si solo estableces
heartbeatIdleMinutes: anulación opcional de inactividad para las comprobaciones de latido cardiaco (restablecimiento diario aún se aplica cuando está activado).agentToAgent.maxPingPongTurns: vueltas máximas de respuesta entre solicitante/objetivo (0–5, por defecto 5).sendPolicy.default:allowodenyfallback cuando no coincide ninguna regla.sendPolicy.rules[]: match bychannel,chatType(direct|group|room), orkeyPrefix(e.g.cron:). Primero negar las ganancias; de lo contrario permitirá.
habilidades (configuración de habilidades)
Controla la lista de permisos empaquetados, instala preferencias, carpetas de habilidades extra y anula
habilidades. Se aplica a las habilidades empaquetadas y ~/.openclaw/skills (las habilidades del espacio de trabajo
todavía ganan en conflictos de nombres).
Campos:
allowBundled: lista de permitidos opcional solo para skills incluidas. Si se establece, solo esas habilidades empaquetadas son elegibles (las habilidades gestionadas/del espacio de trabajo no se ven afectadas).load.extraDirs: directorios adicionales de Skills para escanear (menor precedencia).install.preferBrew: preferir instaladores de brew cuando estén disponibles (predeterminado: true).install.nodeManager: preferencia del instalador de node (npm|pnpm|yarn, por defecto: npm).entries.<skillKey>: anulaciones de configuración por habilidad.
enabled: establezcafalsepara deshabilitar una Skill incluso si está integrada/instalada.env: variables de entorno inyectadas para la ejecución del agente (solo si no están ya configuradas).apiKey: conveniencia opcional para habilidades que declaran una variable env primaria (por ejemplo,nano-banana-pro→GEMINI_API_KEY).
plugins (extensiones)
Controla el descubrimiento del plugin, permite/deny, y la configuración por plugin. Los plugins se cargan desde ~/.openclaw/extensions, <workspace>/.openclaw/extensions, además de cualquier entrada en plugins.load.paths. Los cambios en la configuración requieren un reinicio de la puerta de enlace.
Ver /plugin para un uso completo.
Campos:
enabled: interruptor maestro para la carga del plugin (por defecto: true).permitir: lista opcional permitida de ID de plugin; cuando se establece, sólo la carga de plugins listados.deny: lista de denegación opcional de ids del plugin (negar ganas).load.paths: archivos extra de plugins o directorios a cargar (absoluto o~).entradas.<pluginId>: por plugin anula.enabled: establecefalsea desactivar.config: objeto de configuración específico del plugin (validado por el plugin si se proporciona).
browser (navegador administrado por openclaw)
OpenClaw puede iniciar una instancia de Chrome/Brave/Edge/Chromium dedicada y aislada para openclaw y exponer un pequeño servicio de control de bucles.
Los perfiles pueden apuntar a un navegador basado en Chromium remoto a través de profiles.<name>.cdpUrl. Los perfiles
Remoto son de solo conexión (iniciar/detener/restablecer están desactivados).
browser.cdpUrl permanece para configuraciones legadas de un perfil único y como la base
esquema/host para perfiles que sólo establecen cdpPort.
Valores predeterminados:
- habilitado:
true - evaluateEnabled:
true(establecefalsepara desactivaract:evaluateywait --fn) - servicio de control: loopback sólo (puerto derivado de
gateway.port, predeterminado18791) - URL CDP:
http://127.0.0.1:18792(servicio de control + 1, legado de un único perfil) - color del perfil:
#FF4500(lobster-naranja) - Nota: el servidor de control es iniciado por el gateway en ejecución (menú OpenClaw.app o
openclaw gateway). - Detectar automáticamente el orden: navegador predeterminado si se basa en Chromium; de lo contrario Chrome → Brazo → Borde → Chrome Canario.
ui Textpearance)
Color de acento opcional utilizado por las aplicaciones nativas para el cromo de la interfaz (por ejemplo, color burbuja del Modo Talk).
Si no se establece, los clientes vuelven a caer a una luz silenciada.
gateway (modo servidor Gateway + bind)
Usa gateway.mode para declarar explícitamente si esta máquina debe ejecutar la puerta de enlace.
Valores predeterminados:
- modo: unset (tratado como “no auto-iniciar”)
- bind:
loopback - puerto:
18789(puerto único para WS + HTTP)
gateway.controlUi.basePathestablece el prefijo URL donde se sirve la interfaz de control.- Ejemplos:
"/ui","/openclaw","/apps/openclaw". - Por defecto: root (
/) (sin cambiar). gateway.controlUi.rootestablece la raíz del sistema de archivos para los activos de la interfaz de control (por defecto:dist/control-ui).gateway.controlUi.allowInsecureAuthpermite la autenticación de sólo token-only para la interfaz de control cuando se omite la identidad del dispositivo (normalmente sobre HTTP). Predeterminado:false. HTTPS preferidos (Servicio de escala) o127.0.0.1.gateway.controlUi.dangerouslyDisableDeviceAuthdeshabilita las verificaciones de identidad del dispositivo para la interfaz de control (sólo token/contraseña). Predeterminado:false. Solo rompe vidrio.
gateway.trustedProxies: lista de IP proxy inversa que terminan TLS delante de la puerta de enlace.- Cuando una conexión viene de una de estas IPs, OpenClaw usa
x-forwarded-for(ox-real-ip) para determinar la IP del cliente para comprobaciones de emparejamiento locales y comprobaciones HTTP auth/local. - Sólo listar los proxies que controlas completamente, y asegurarse de que sobreescriban entrante
x-forwarded-for.
openclaw gatewayse niega a iniciar a menos quegateway.modeesté establecido enlocal(o que pases la bandera de anulación).gateway.portcontrola el puerto multiplexado único usado para WebSocket + HTTP (interfaz de control, ganchos, A2UI).- Finalizaciones de OpenAI Chat: desactivado por defecto; habilitar con
gateway.http.endpoints.chatCompletions.enabled: true. - Precedencia:
--port>OPENCLAW_GATEWAY_PORT>gateway.port> por defecto18789. - La autenticación de la pasarela es requerida por defecto (identificación del token/contraseña o escala de engranaje Serve). Los enlaces no-loopback requieren un token o contraseña compartidos.
- El asistente de incorporación genera un token de puerta de enlace por defecto (incluso en bucle).
gateway.remote.tokenes sólo para llamadas remotas a CLI; no habilita la autenticación de puerta de enlace local.gateway.tokenes ignorado.
gateway.auth.modeestablece los requisitos de handshake (tokenopassword). Cuando no se establece, la autenticación de token es asumida.gateway.auth.tokenalmacena el token compartido para autenticación de token (usado por el CLI en la misma máquina).- Cuando se establece
gateway.auth.mode, sólo se acepta ese método (además de cabeceras opcionales escala de carácter). gateway.auth.passwordpuede establecerse aquí, o a través deOPENCLAW_GATEWAY_PASSWORD(recomendado).gateway.auth.allowus-scalepermite que las cabeceras de identidad de Serve (tailscale-user-login) satisfagan la autenticación cuando la solicitud llega en bucle conx-forwarded-for,x-forwarded-proto, yx-forwarded-host. OpenClaw verifica la identidad resolviendo la direcciónx-forwarded-forvíatailscale whoisantes de aceptarla. Cuando estrue, las solicitudes de Serve no necesitan un token/contraseña; establecefalsepara requerir credenciales explícitas. Por defecto atruecuandotailscale.mode = "serve"y el modo de autenticación no espassword.gateway.tailscale.mode: "serve"utiliza la escala de menú Serve (sólo tailnet, enlace de loopback).gateway.tailscale.mode: "funnel"expone el panel públicamente; requiere autenticación.gateway.tailscale.resetOnExitreinicia la configuración Serve/Funnel al apagar.
gateway.remote.urlestablece la URL predeterminada de Gateway WebSocket para llamadas CLI cuandogateway.mode = "remote".gateway.remote.transportselecciona el transporte remoto macOS (por defectossh,directpara ws/wss). Cuandodirect,gateway.remote.urldebe serws://owss://.ws://hostpor defecto al puerto18789.gateway.remote.tokensuministra el token para llamadas remotas (dejar unset para no autentica).gateway.remote.passwordproporciona la contraseña para llamadas remotas (dejar sin establecer para no autenticación).
- OpenClaw.app observa
~/.openclaw/openclaw.jsony cambia modos en vivo cuandogateway.modeogateway.remote.urlcambia. - Si
gateway.modeno está establecido perogateway.remote.urlestá definido, la aplicación macOS lo trata como modo remoto. - Cuando cambias el modo de conexión en la aplicación macOS, escribe
gateway.mode(ygateway.remote.url+gateway.remote.transporten modo remoto) de vuelta al archivo de configuración.
gateway.reload (Configurar recarga caliente)
El Gateway reproduce ~/.openclaw/openclaw.json (o OPENCLAW_CONFIG_PATH) y aplica los cambios automáticamente.
Modos:
hybrid(por defecto): caliente aplicar cambios seguros; reiniciar el Gateway para cambios críticos.hot: sólo aplicar cambios hot-safe; log cuando se requiere un reinicio.restart: reinicie el Gateway en cualquier cambio de configuración.apagado: deshabilita recarga caliente.
Matrix de recarga caliente (archivos + impacto)
Archivos vistos:~/.openclaw/openclaw.json(oOPENCLAW_CONFIG_PATH)
hooks(webhook auth/path/mappings) +hooks.gmail(Gmail watcher reiniciado)navegador(reinicio del servidor de control del navegador)cron(reinicio del servicio cron + actualización simultánea)agents.defaults.heartbeat(runner heartbeat reiniciar)web(canal web de WhatsApp reiniciar)telegram,discord,signal,imessage(canal se reinicia)agent,models,routing,messages,session,whatsapp,logging,skills,ui,talk,identity,wizard(lecturas dinámicas)
gateway(port/bind/auth/control UI/tailscale)puente(legado)descubrimientocanvasHostplugins- Cualquier ruta de configuración desconocida/no soportada (por defecto se reiniciará para el futuro)
Aislamiento múltiple
Para ejecutar múltiples pasarelas en un host (para redundancia o un bot de rescate), aislar estado por instancia + configuración y utilizar puertos únicos:OPENCLAW_CONFIG_PATH(configuración por instancia)OPENCLAW_STATE_DIR(sesiones/créditos)agents.defaults.workspace(memorias)gateway.port(único por instancia)
openclaw --dev …→ usa~/.openclaw-dev+ desplaza puertos de la base19001openclaw --profile <name> …→ usa~/.openclaw-<name>(puerto a través de config/env/flags)
hooks (webhooks de Gateway)
Habilitar un simple punto final de webhook HTTP en el servidor HTTP de Gateway.
Valores predeterminados:
- habilitado:
false - ruta:
/hooks - maxBodyBytes:
262144(256 KB)
Autorización: portador <token>ox-openclaw-token: <token>
POST /hooks/wake→{ texto, mode?: "ahora"|"next-heartbeat" }POST /hooks/agent→{ message, name?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSegundds? }POST /hooks/<name>→ resuelto a través dehooks.mappings
/hooks/agent siempre publica un resumen en la sesión principal (y opcionalmente puede activar un latido inmediato a través de `wakeMode: “ahora”).
Notas de mapeo:
match.pathcoincide con la subruta después de/hooks(por ejemplo,/hooks/gmail→gmail).match.sourcecoincide con un campo de carga (por ejemplo,{ source: "gmail" }) para que puedas usar una ruta genérica/hooks/ingest.- Plantillas como
{{messages[0].subject}}leídas desde la carga útil. transformpuede apuntar a un módulo JS/TS que devuelve una acción hook.deliver: trueenvía la respuesta final a un canal;channelpor defecto alast(se vuelve a WhatsApp).- Si no hay una ruta de entrega previa, establezca explícitamente
channel+to(requerido para Telegram/Discord/Google Chat/Slack/Signal/iMessage/MS Teams). modelanula el LLM para este gancho de ejecución (provider/modelo alias; debe permitirse siagents.defaults.modelsestá establecido).
openclaw webhooks gmail setup / run):
hooks.gmail.modelespecifica un modelo a usar para el procesamiento de Gmail hook (por defecto para la sesión principal).- Acepta referencias de
provider/modelo alias deagents.defaults.models. - Vuelve a
agents.defaults.model.fallbacks, luegoagents.defaults.model.primary, en auth/rate-limit/timeouts. - Si
agents.defaults.modelsestá definido, incluya el modelo gancho en la lista permitida. - Al iniciar, advierte si el modelo configurado no está en el catálogo de modelos o lista permitida.
hooks.gmail.thinkingestablece el nivel de pensamiento predeterminado para los ganchos de Gmail y es anulado porpensando.
- Si
hooks.enabled=trueyhooks.gmail.accountestá definido, el Gateway iniciagog gmail watch serveen el arranque y auto-renueva el reloj. - Establece
OPENCLAW_SKIP_GMAIL_WATCHER=1para desactivar el auto-start (para ejecuciones manuales). - Evita ejecutar un
gog gmail watch serveseparado junto a la Gateway; fallará conlisten tcp 127.0.0.1:8788: bind: dirección ya en uso.
tailscale.mode está encendido, OpenClaw predetermina serve.path a / para que
aescalar puede proxy /gmail-pubsub correctamente (quita el prefijo set-path).
Si necesitas el backend para recibir la ruta prefijada, establece
hooks.gmail.tailscale.target a una URL completa (y alinear serve.path).
canvasHost (Servidor de archivos LAN/tailnet Canvas + Recarga en vivo)
El Gateway sirve un directorio de HTML/CSS/JS sobre HTTP, por lo que los nodos iOS/Android pueden simplemente canvas.navigate a él.
Raíz predeterminada: ~/. penclaw/workspace/canvasPuerto por defecto:
18793 (elegido para evitar el puerto CDP del navegador openclaw 18792)El servidor escucha en el host de enlace de puerta de enlaza (LAN o vectorial) para que los nodos puedan alcanzarlo. El servidor:
- sirve archivos bajo
canvasHost.root - inyecta un pequeño cliente live-reload en HTML servido
- revisa el directorio y transmite recargas sobre un endpoint WebSocket en
/__openclaw__/ws - auto-crea un inicio
index.htmlcuando el directorio está vacío (por lo que ves algo inmediatamente) - también sirve A2UI en
/__openclaw__/a2ui/y se anuncia en los nodos comocanvasHostUrl(siempre usado por los nodos para Canvas/A2UI)
EMFILE:
- config:
canvasHost: { liveReload: false }
canvasHost.* requieren un reinicio de la puerta de enlace (la recarga de configuración se reiniciará).
Deshabilitar con:
- config:
canvasHost: { enabled: false } - env:
OPENCLAW_SKIP_CANVAS_HOST=1
puente (puente TCP antiguo, eliminado)
Las compilaciones actuales ya no incluyen el escuchador de puente TCP; las claves de configuración bridge.* son ignoradas.
Los nodos se conectan a través del WebSocket Gateway. Esta sección se mantiene para referencia histórica.
Comportamiento antiguo:
- El Gateway podría exponer un simple puente TCP para nodos (iOS/Android), típicamente en el puerto
18790.
- habilitado:
true - puerto:
18790 - enlazar:
lan(enlaza a0.0.0.0)
lan:0.0.0.0(accesible en cualquier interfaz, incluyendo LAN/Wi-Fi y Escala)tailnet: enlaza sólo con la IP de la máquina a escala de la máquina (recomendado para Viena, Londres)loopback:127.0.0.1(sólo local)auto: prefiere IP de tailnet si está presente, sinolan
bridge.tls.enabled: habilitar TLS para conexiones de puente (TLS-only cuando está activado).bridge.tls.autoGenerate: genera un certificado autofirmado cuando no hay cert/clave presente (por defecto: true).bridge.tls.certPath/bridge.tls.keyPath: rutas PEM para el certificado de puente + clave privada.bridge.tls.caPath: paquete opcional PEM CA (raíces personalizadas o mTLS futuro).
bridgeTls=1 y bridgeTlsSha256 en registros de descubrimiento TXT
para que los nodos puedan fijar el certificado. Las conexiones manuales usan confianza-on-first-use si aún no hay huella dactilar
.
Los certificados autogenerados requieren ‘openssl’ en PATH; si la generación falla, el puente no comenzará.
discovery.mdns (modo Bonjour / mDNS broadcast mode)
Controla las transmisiones de descubrimiento de mDNS LAN (_openclaw-gw._tcp).
minimal(por defecto): omitecliPath+sshPortde registros TXTfull: incluyecliPath+sshPorten registros TXTapagado: deshabilita completamente las transmisiones mDNS- Hostname: por defecto es
openclaw(anunciaopenclaw.local). Sobrescribir conOPENCLAW_MDNS_HOSTNAME.
discovery.wideArea (Ancho de área Bonjour / unicast DNS)[video] SD)
Cuando está activado, el Gateway escribe una zona unicast DNS-SD para _openclaw-gw._tcp bajo ~/.openclaw/dns/ usando el dominio de descubrimiento configurado (ejemplo: openclaw.internal.).
Para hacer que iOS/Android descubra a través de las redes (Viena, Londres), emparejar esto con:
- un servidor DNS en la pasarela que sirve el dominio elegido (se recomienda CoreDNS)
- escala de detalle DNS dividido para que los clientes resuelvan ese dominio a través del servidor DNS de puerta de enlace
Variables de plantilla de modelo multimedia
Los marcadores de posición de plantillas se expanden entools.media.*.models[].args y tools.media.models[].args (y cualquier campo de argumentos futuros de plantilla).
| Variable | Descripción |
| ------------------ | --------------------------------------------------------------- | -------- | ------- | ------- | ---------- | ------ | -------- | ------- | ------- | ------- | --- |
| {{Body}} | cuerpo de mensaje entrante |
| {{RawBody}} | Mensaje entrante sin envoltorio (no envoltorio history/sender; best for command parsing) |
| {{BodyStripped}} | Cuerpo con menciones de grupo eliminadas (mejor por defecto para los agentes) |
| {{From}} | Identificador del remitente (E. 64 para WhatsApp; can differ per channel) |
| {{To}} | Destino identificador |
| {{MessageSid}} | Channel message id (cuando está disponible) |
| {{SessionId}} | Current session UUID |
| {{IsNewSession}} | "true" cuando se creó una nueva sesión |
| {{MediaUrl}} | Inbound media pseudo-URL (si está presente) |
| {{MediaPath}} | {{MediaPath}} | Local media path (si está descargado) |
| {{MediaType}} | Media type (image/audio/document/…) |
| {{Transcript}} | Transcripción de audio (cuando está habilitada) |
| {{Prompt}} | Prompt de medios resuelto para entradas de CLI |
| {{MaxChars}} | Máximo de caracteres de salida resuelto para entradas de CLI |
| {{ChatType}} | "direct" o "group" |
| {{GroupSubject}} | Asunto del grupo (mejor esfuerzo) |
| {{GroupMembers}} | Vista previa de los miembros del grupo (mejor esfuerzo) |
| {{SenderName}} | Nombre para mostrar del remitente (mejor esfuerzo) |
| {{SenderE164}} | Número de teléfono del remitente (mejor esfuerzo) |
| {{Provider}} | Pista del proveedor (whatsapp | telegram | discord | googlechat | slack | signal | imessage | msteams | webchat | …) |
Cron (Planificador de Gateway)
Cron es un planificador propiedad de Gateway para despertar y tareas programadas. Ver Trabajos Cronales para ver el resumen de características y ejemplos de CLI.Siguiente: Runtime del Agente 🦞