Construir un asistente personal con OpenClaw
OpenClaw es un gateway de WhatsApp + Telegram + Discord + iMessage para agentes Pi. Los plugins añaden soporte para Mattermost. Esta guía cubre la configuración como “asistente personal”: un número de WhatsApp dedicado que funciona como tu agente siempre disponible.
Seguridad ante todo
Le estás dando a un agente la capacidad de:
- ejecutar comandos en tu máquina (según tu configuración de herramientas Pi)
- leer y escribir archivos en tu workspace
- enviar mensajes por WhatsApp/Telegram/Discord/Mattermost (plugin)
Empieza con prudencia:
- Configura siempre
channels.whatsapp.allowFrom(nunca dejes acceso abierto al mundo en tu Mac personal). - Usa un número de WhatsApp dedicado para el asistente.
- Los heartbeats ahora se ejecutan por defecto cada 30 minutos. Desactívalos hasta que confíes en la configuración con
agents.defaults.heartbeat.every: "0m".
Requisitos previos
- OpenClaw instalado y con el onboarding completado: consulta Primeros pasos si aún no lo has hecho
- Un segundo número de teléfono (SIM/eSIM/prepago) para el asistente
La configuración de dos teléfonos (recomendada)
Lo que buscas es esto:
flowchart TB
A["<b>Tu teléfono (personal)<br></b><br>Tu WhatsApp<br>+1-555-YOU"] -- mensaje --> B["<b>Segundo teléfono (asistente)<br></b><br>WA del asistente<br>+1-555-ASSIST"]
B -- vinculado vía QR --> C["<b>Tu Mac (openclaw)<br></b><br>Agente Pi"]
Si vinculas tu WhatsApp personal a OpenClaw, cada mensaje que recibas se convierte en “entrada del agente”. Eso rara vez es lo que quieres.
Inicio rápido en 5 minutos
- Vincula WhatsApp Web (muestra un QR; escanéalo con el teléfono del asistente):
openclaw channels login
- Inicia el Gateway (déjalo corriendo):
openclaw gateway --port 18789
- Coloca una configuración mínima en
~/.openclaw/openclaw.json:
{
channels: { whatsapp: { allowFrom: ["+15555550123"] } },
}
Ahora envía un mensaje al número del asistente desde tu teléfono autorizado.
Cuando el onboarding termine, se abre automáticamente el dashboard y se imprime un enlace limpio (sin token). Si pide autenticación, pega el token de gateway.auth.token en los ajustes de Control UI. Para volver a abrirlo: openclaw dashboard.
Dale al agente un workspace (AGENTS)
OpenClaw lee las instrucciones operativas y la “memoria” desde su directorio de workspace.
Por defecto, OpenClaw usa ~/.openclaw/workspace como workspace del agente y lo crea automáticamente (junto con los archivos iniciales AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md) durante el setup o la primera ejecución del agente. BOOTSTRAP.md solo se crea cuando el workspace es completamente nuevo (no debería reaparecer después de eliminarlo). MEMORY.md es opcional (no se crea automáticamente); cuando está presente, se carga en las sesiones normales. Las sesiones de sub-agentes solo inyectan AGENTS.md y TOOLS.md.
Consejo: trata esta carpeta como la “memoria” de OpenClaw y conviértela en un repositorio git (idealmente privado) para que tu AGENTS.md y los archivos de memoria estén respaldados. Si git está instalado, los workspaces nuevos se inicializan automáticamente.
openclaw setup
Estructura completa del workspace y guía de respaldo: Workspace del agente Flujo de memoria: Memoria
Opcional: elige un workspace diferente con agents.defaults.workspace (acepta ~).
{
agent: {
workspace: "~/.openclaw/workspace",
},
}
Si ya gestionas tus propios archivos de workspace desde un repositorio, puedes desactivar la creación de archivos de bootstrap por completo:
{
agent: {
skipBootstrap: true,
},
}
La configuración que lo convierte en “un asistente”
OpenClaw viene con buenos valores por defecto para funcionar como asistente, pero normalmente querrás ajustar:
- La persona e instrucciones en
SOUL.md - Los valores por defecto de thinking (si lo deseas)
- Los heartbeats (una vez que confíes en la configuración)
Ejemplo:
{
logging: { level: "info" },
agent: {
model: "anthropic/claude-opus-4-6",
workspace: "~/.openclaw/workspace",
thinkingDefault: "high",
timeoutSeconds: 1800,
// Empieza en 0; actívalo después.
heartbeat: { every: "0m" },
},
channels: {
whatsapp: {
allowFrom: ["+15555550123"],
groups: {
"*": { requireMention: true },
},
},
},
routing: {
groupChat: {
mentionPatterns: ["@openclaw", "openclaw"],
},
},
session: {
scope: "per-sender",
resetTriggers: ["/new", "/reset"],
reset: {
mode: "daily",
atHour: 4,
idleMinutes: 10080,
},
},
}
Sesiones y memoria
- Archivos de sesión:
~/.openclaw/agents/<agentId>/sessions/{{SessionId}}.jsonl - Metadatos de sesión (uso de tokens, última ruta, etc.):
~/.openclaw/agents/<agentId>/sessions/sessions.json(legacy:~/.openclaw/sessions/sessions.json) /newo/resetinicia una sesión nueva para ese chat (configurable víaresetTriggers). Si se envía solo, el agente responde con un breve saludo para confirmar el reinicio./compact [instrucciones]compacta el contexto de la sesión y reporta el presupuesto de contexto restante.
Heartbeats (modo proactivo)
Por defecto, OpenClaw ejecuta un heartbeat cada 30 minutos con el prompt:
Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.
Usa agents.defaults.heartbeat.every: "0m" para desactivarlo.
- Si
HEARTBEAT.mdexiste pero está efectivamente vacío (solo líneas en blanco y encabezados markdown como# Heading), OpenClaw omite la ejecución del heartbeat para ahorrar llamadas a la API. - Si el archivo no existe, el heartbeat se ejecuta igualmente y el modelo decide qué hacer.
- Si el agente responde con
HEARTBEAT_OK(opcionalmente con texto breve adicional; veragents.defaults.heartbeat.ackMaxChars), OpenClaw suprime el envío de ese heartbeat. - Por defecto, el envío de heartbeats a destinos DM tipo
user:<id>está permitido. Configuraagents.defaults.heartbeat.directPolicy: "block"para suprimir el envío a destinos directos manteniendo activas las ejecuciones del heartbeat. - Los heartbeats ejecutan turnos completos del agente: intervalos más cortos consumen más tokens.
{
agent: {
heartbeat: { every: "30m" },
},
}
Multimedia entrante y saliente
Los archivos adjuntos entrantes (imágenes/audio/documentos) se pueden exponer a tu comando mediante plantillas:
{{MediaPath}}(ruta local del archivo temporal){{MediaUrl}}(pseudo-URL){{Transcript}}(si la transcripción de audio está habilitada)
Archivos adjuntos salientes del agente: incluye MEDIA:<ruta-o-url> en su propia línea (sin espacios). Ejemplo:
Here's the screenshot.
MEDIA:https://example.com/screenshot.png
OpenClaw extrae estos marcadores y los envía como multimedia junto con el texto.
Checklist de operaciones
openclaw status # estado local (credenciales, sesiones, eventos en cola)
openclaw status --all # diagnóstico completo (solo lectura, se puede copiar y pegar)
openclaw status --deep # añade sondas de health al gateway (Telegram + Discord)
openclaw health --json # snapshot de health del gateway (WS)
Los logs se almacenan en /tmp/openclaw/ (por defecto: openclaw-YYYY-MM-DD.log).
Siguientes pasos
- WebChat: WebChat
- Operaciones del Gateway: Guía operativa del Gateway
- Cron y despertadores: Tareas programadas (cron)
- App de macOS en la barra de menú: App de macOS de OpenClaw
- App de nodo para iOS: App de iOS
- App de nodo para Android: App de Android
- Estado en Windows: Windows (WSL2)
- Estado en Linux: App de Linux
- Seguridad: Seguridad