Sandbox Multi-Agente y Herramientas
Descripción General
Cada agente en una configuración multi-agente ahora puede tener su propia:
- Configuración de sandbox (
agents.list[].sandboxanulaagents.defaults.sandbox) - Restricciones de herramientas (
tools.allow/tools.deny, másagents.list[].tools)
Esto te permite ejecutar múltiples agentes con diferentes perfiles de seguridad:
- Asistente personal con acceso completo
- Agentes familiares/laborales con herramientas restringidas
- Agentes públicos en sandboxes
setupCommand pertenece a sandbox.docker (global o por agente) y se ejecuta una vez cuando se crea el contenedor. La autenticación es por agente: cada agente lee desde su propio almacén de autenticación agentDir en:
~/.openclaw/agents/<agentId>/agent/auth-profiles.json
Las credenciales no se comparten entre agentes. Nunca reutilices agentDir entre agentes. Si quieres compartir credenciales, copia auth-profiles.json en el agentDir del otro agente. Para ver cómo se comporta el sandbox en tiempo de ejecución, consulta Sandboxing. Para depurar "¿por qué está bloqueado esto?", consulta Sandbox vs Política de Herramientas vs Elevado y openclaw sandbox explain.
Ejemplos de Configuración
Ejemplo 1: Agente Personal + Familiar Restringido
{
"agents": {
"list": [
{
"id": "main",
"default": true,
"name": "Asistente Personal",
"workspace": "~/.openclaw/workspace",
"sandbox": { "mode": "off" }
},
{
"id": "family",
"name": "Bot Familiar",
"workspace": "~/.openclaw/workspace-family",
"sandbox": {
"mode": "all",
"scope": "agent"
},
"tools": {
"allow": ["read"],
"deny": ["exec", "write", "edit", "apply_patch", "process", "browser"]
}
}
]
},
"bindings": [
{
"agentId": "family",
"match": {
"provider": "whatsapp",
"accountId": "*",
"peer": {
"kind": "group",
"id": "120363424282127706@g.us"
}
}
}
]
}
Resultado:
- Agente
main: Se ejecuta en el host, acceso completo a herramientas - Agente
family: Se ejecuta en Docker (un contenedor por agente), solo herramientaread
Ejemplo 2: Agente Laboral con Sandbox Compartido
{
"agents": {
"list": [
{
"id": "personal",
"workspace": "~/.openclaw/workspace-personal",
"sandbox": { "mode": "off" }
},
{
"id": "work",
"workspace": "~/.openclaw/workspace-work",
"sandbox": {
"mode": "all",
"scope": "shared",
"workspaceRoot": "/tmp/work-sandboxes"
},
"tools": {
"allow": ["read", "write", "apply_patch", "exec"],
"deny": ["browser", "gateway", "discord"]
}
}
]
}
}
Ejemplo 2b: Perfil global de codificación + agente solo de mensajería
{
"tools": { "profile": "coding" },
"agents": {
"list": [
{
"id": "support",
"tools": { "profile": "messaging", "allow": ["slack"] }
}
]
}
}
Resultado:
- los agentes por defecto obtienen herramientas de codificación
- el agente
supportes solo de mensajería (+ herramienta Slack)
Ejemplo 3: Diferentes Modos de Sandbox por Agente
{
"agents": {
"defaults": {
"sandbox": {
"mode": "non-main", // Valor por defecto global
"scope": "session"
}
},
"list": [
{
"id": "main",
"workspace": "~/.openclaw/workspace",
"sandbox": {
"mode": "off" // Anulación: main nunca en sandbox
}
},
{
"id": "public",
"workspace": "~/.openclaw/workspace-public",
"sandbox": {
"mode": "all", // Anulación: público siempre en sandbox
"scope": "agent"
},
"tools": {
"allow": ["read"],
"deny": ["exec", "write", "edit", "apply_patch"]
}
}
]
}
}
Precedencia de Configuración
Cuando existen configuraciones globales (agents.defaults.*) y específicas por agente (agents.list[].*):
Configuración de Sandbox
Los ajustes específicos del agente anulan los globales:
agents.list[].sandbox.mode > agents.defaults.sandbox.mode
agents.list[].sandbox.scope > agents.defaults.sandbox.scope
agents.list[].sandbox.workspaceRoot > agents.defaults.sandbox.workspaceRoot
agents.list[].sandbox.workspaceAccess > agents.defaults.sandbox.workspaceAccess
agents.list[].sandbox.docker.* > agents.defaults.sandbox.docker.*
agents.list[].sandbox.browser.* > agents.defaults.sandbox.browser.*
agents.list[].sandbox.prune.* > agents.defaults.sandbox.prune.*
Notas:
agents.list[].sandbox.{docker,browser,prune}.*anulaagents.defaults.sandbox.{docker,browser,prune}.*para ese agente (se ignora cuando el alcance del sandbox se resuelve como"shared").
Restricciones de Herramientas
El orden de filtrado es:
- Perfil de herramienta (
tools.profileoagents.list[].tools.profile) - Perfil de herramienta del proveedor (
tools.byProvider[provider].profileoagents.list[].tools.byProvider[provider].profile) - Política global de herramientas (
tools.allow/tools.deny) - Política de herramientas del proveedor (
tools.byProvider[provider].allow/deny) - Política de herramientas específica del agente (
agents.list[].tools.allow/deny) - Política del proveedor del agente (
agents.list[].tools.byProvider[provider].allow/deny) - Política de herramientas del sandbox (
tools.sandbox.toolsoagents.list[].tools.sandbox.tools) - Política de herramientas del subagente (
tools.subagents.tools, si aplica)
Cada nivel puede restringir aún más las herramientas, pero no puede otorgar nuevamente herramientas denegadas por niveles anteriores. Si se establece agents.list[].tools.sandbox.tools, reemplaza a tools.sandbox.tools para ese agente. Si se establece agents.list[].tools.profile, anula tools.profile para ese agente. Las claves de herramientas del proveedor aceptan provider (ej. google-antigravity) o provider/model (ej. openai/gpt-5.2).
Grupos de herramientas (abreviaturas)
Las políticas de herramientas (global, agente, sandbox) admiten entradas group:* que se expanden a múltiples herramientas concretas:
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:ui:browser,canvasgroup:automation:cron,gatewaygroup:messaging:messagegroup:nodes:nodesgroup:openclaw: todas las herramientas integradas de OpenClaw (excluye plugins de proveedores)
Modo Elevado
tools.elevated es la línea base global (lista de permitidos basada en el remitente). agents.list[].tools.elevated puede restringir aún más el modo elevado para agentes específicos (ambos deben permitirlo). Patrones de mitigación:
- Denegar
execpara agentes no confiables (agents.list[].tools.deny: ["exec"]) - Evitar listar remitentes que enruten a agentes restringidos
- Deshabilitar el modo elevado globalmente (
tools.elevated.enabled: false) si solo quieres ejecución en sandbox - Deshabilitar el modo elevado por agente (
agents.list[].tools.elevated.enabled: false) para perfiles sensibles
Migración desde Agente Único
Antes (agente único):
{
"agents": {
"defaults": {
"workspace": "~/.openclaw/workspace",
"sandbox": {
"mode": "non-main"
}
}
},
"tools": {
"sandbox": {
"tools": {
"allow": ["read", "write", "apply_patch", "exec"],
"deny": []
}
}
}
}
Después (multi-agente con diferentes perfiles):
{
"agents": {
"list": [
{
"id": "main",
"default": true,
"workspace": "~/.openclaw/workspace",
"sandbox": { "mode": "off" }
}
]
}
}
Las configuraciones heredadas agent.* son migradas por openclaw doctor; prefiere agents.defaults + agents.list de ahora en adelante.
Ejemplos de Restricción de Herramientas
Agente Solo Lectura
{
"tools": {
"allow": ["read"],
"deny": ["exec", "write", "edit", "apply_patch", "process"]
}
}
Agente de Ejecución Segura (sin modificaciones de archivos)
{
"tools": {
"allow": ["read", "exec", "process"],
"deny": ["write", "edit", "apply_patch", "browser", "gateway"]
}
}
Agente Solo de Comunicación
{
"tools": {
"sessions": { "visibility": "tree" },
"allow": ["sessions_list", "sessions_send", "sessions_history", "session_status"],
"deny": ["exec", "write", "edit", "apply_patch", "read", "browser"]
}
}
Error Común: "non-main"
agents.defaults.sandbox.mode: "non-main" se basa en session.mainKey (por defecto "main"), no en el id del agente. Las sesiones de grupo/canal siempre obtienen sus propias claves, por lo que se tratan como no principales y se pondrán en sandbox. Si quieres que un agente nunca esté en sandbox, establece agents.list[].sandbox.mode: "off".
Pruebas
Después de configurar el sandbox y las herramientas multi-agente:
-
Verificar resolución de agente:
Copiar
openclaw agents list --bindings -
Verificar contenedores de sandbox:
Copiar
docker ps --filter "name=openclaw-sbx-" -
Probar restricciones de herramientas:
- Enviar un mensaje que requiera herramientas restringidas
- Verificar que el agente no pueda usar las herramientas denegadas
-
Monitorear registros:
Copiar
tail -f "${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/logs/gateway.log" | grep -E "routing|sandbox|tools"
Solución de Problemas
Agente no en sandbox a pesar de mode: "all"
- Verifica si hay un
agents.defaults.sandbox.modeglobal que lo anule - La configuración específica del agente tiene precedencia, así que establece
agents.list[].sandbox.mode: "all"
Herramientas aún disponibles a pesar de la lista de denegación
- Verifica el orden de filtrado de herramientas: global → agente → sandbox → subagente
- Cada nivel solo puede restringir más, no otorgar nuevamente
- Verifica con los registros:
[tools] filtering tools for agent:${agentId}
Contenedor no aislado por agente
- Establece
scope: "agent"en la configuración de sandbox específica del agente - El valor por defecto es
"session"que crea un contenedor por sesión