Aller au contenu

Sandbox et outils multi-agents

Chaque agent dans une configuration multi-agent peut remplacer le sandbox global et la stratégie d’outils. Cette page couvre la configuration par agent, les règles de priorité et les exemples.

Sandboxing

Backends et modes — référence complète du sandbox.

Sandbox vs stratégie d'outils vs élevé

Déboguer “pourquoi ceci est bloqué ?”

Mode élevé

Exec élevé pour les expéditeurs de confiance.


Exemple 1 : Agent personnel + restreint pour la famille
{
"agents": {
"list": [
{
"id": "main",
"default": true,
"name": "Personal Assistant",
"workspace": "~/.openclaw/workspace",
"sandbox": { "mode": "off" }
},
{
"id": "family",
"name": "Family Bot",
"workspace": "~/.openclaw/workspace-family",
"sandbox": {
"mode": "all",
"scope": "agent"
},
"tools": {
"allow": ["read", "message"],
"deny": ["exec", "write", "edit", "apply_patch", "process", "browser"],
"message": {
"crossContext": {
"allowWithinProvider": false,
"allowAcrossProviders": false
}
}
}
}
]
},
"bindings": [
{
"agentId": "family",
"match": {
"provider": "whatsapp",
"accountId": "*",
"peer": {
"kind": "group",
}
}
}
]
}

Résultat :

  • main agent : s’exécute sur l’hôte, accès complet aux tools.
  • family agent : s’exécute dans Docker (un conteneur par agent), uniquement read et les envois de messages de la conversation en cours.
Exemple 2 : Agent de travail avec sandbox partagé
{
"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"]
}
}
]
}
}
Exemple 2b : Profil de codage global + agent uniquement messagerie
{
"tools": { "profile": "coding" },
"agents": {
"list": [
{
"id": "support",
"tools": { "profile": "messaging", "allow": ["slack"] }
}
]
}
}

Résultat :

  • les agents par défaut obtiennent des outils de codage.
  • l’agent support est uniquement messagerie (+ outil Slack).
Exemple 3 : Différents modes de bac à sable par agent
{
"agents": {
"defaults": {
"sandbox": {
"mode": "non-main",
"scope": "session"
}
},
"list": [
{
"id": "main",
"workspace": "~/.openclaw/workspace",
"sandbox": {
"mode": "off"
}
},
{
"id": "public",
"workspace": "~/.openclaw/workspace-public",
"sandbox": {
"mode": "all",
"scope": "agent"
},
"tools": {
"allow": ["read"],
"deny": ["exec", "write", "edit", "apply_patch"]
}
}
]
}
}

Lorsque des configurations globales (agents.defaults.*) et spécifiques à l’agent (agents.list[].*) existent simultanément :

Les paramètres spécifiques à l’agent remplacent les paramètres globaux :

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.*

L’ordre de filtrage est le suivant :

  1. Tool profile

    tools.profile ou agents.list[].tools.profile.

  2. Provider tool profile

    tools.byProvider[provider].profile ou agents.list[].tools.byProvider[provider].profile.

  3. Stratégie globale d'outils

    tools.allow / tools.deny.

  4. Stratégie d'outils du fournisseur

    tools.byProvider[provider].allow/deny.

  5. Stratégie d'outils spécifique à l'agent

    agents.list[].tools.allow/deny.

  6. Stratégie du fournisseur de l'agent

    agents.list[].tools.byProvider[provider].allow/deny.

  7. Stratégie d'outils du Sandbox

    tools.sandbox.tools ou agents.list[].tools.sandbox.tools.

  8. Stratégie d'outils du sous-agent

    tools.subagents.tools, le cas échéant.

Règles de priorité
  • Chaque niveau peut restreindre davantage les outils, mais ne peut pas rétablir les outils refusés des niveaux précédents.
  • Si agents.list[].tools.sandbox.tools est défini, il remplace tools.sandbox.tools pour cet agent.
  • Si agents.list[].tools.profile est défini, il remplace tools.profile pour cet agent.
  • Les clés d’outil du fournisseur acceptent soit provider (par ex. google-antigravity) soit provider/model (par ex. openai/gpt-5.4).
Comportement de la liste blanche vide

Si une liste blanche explicite de cette chaîne laisse l’exécution sans outils appelables, OpenClaw s’arrête avant de soumettre le prompt au modèle. C’est intentionnel : un agent configuré avec un outil manquant tel que agents.list[].tools.allow: ["query_db"] doit échouer de manière visible jusqu’à ce que le plugin qui enregistre query_db soit activé, et non continuer comme un agent texte uniquement.

Les stratégies d’outil prennent en charge les raccourcis group:* qui s’étendent à plusieurs outils. Consultez Groupes d’outils pour la liste complète.

Les remplacements élevés par agent (agents.list[].tools.elevated) peuvent restreindre davantage l’exécution élevée pour des agents spécifiques. Consultez Mode élevé pour plus de détails.


{
"agents": {
"defaults": {
"workspace": "~/.openclaw/workspace",
"sandbox": {
"mode": "non-main"
}
}
},
"tools": {
"sandbox": {
"tools": {
"allow": ["read", "write", "apply_patch", "exec"],
"deny": []
}
}
}
}


{
"tools": {
"allow": ["read"],
"deny": ["exec", "write", "edit", "apply_patch", "process"]
}
}


Après avoir configuré le bac à sable multi-agent et les outils :

  1. Check agent resolution

    Fenêtre de terminal
    openclaw agents list --bindings
  2. Verify sandbox containers

    Fenêtre de terminal
    docker ps --filter "name=openclaw-sbx-"
  3. Test tool restrictions

    • Envoyez un message nécessitant des outils restreints.
    • Vérifiez que l’agent ne peut pas utiliser les outils refusés.
  4. Monitor logs

    Fenêtre de terminal
    tail -f "${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/logs/gateway.log" | grep -E "routing|sandbox|tools"

Agent not sandboxed despite `mode: 'all'`
  • Vérifiez s’il existe un agents.defaults.sandbox.mode global qui le remplace.
  • La configuration spécifique à l’agent est prioritaire, définissez donc agents.list[].sandbox.mode: "all".
Outils toujours disponibles malgré la liste de refus
  • Vérifiez l’ordre de filtrage des outils : global → agent → sandbox → sous-agent.
  • Chaque niveau ne peut que restreindre davantage, pas rétablir.
  • Vérifiez avec les journaux : [tools] filtering tools for agent:${agentId}.
Conteneur non isolé par agent
  • Définissez scope: "agent" dans la configuration du sandbox spécifique à l’agent.
  • La valeur par défaut est "session", qui crée un conteneur par session.