Outils : Vue d’ensemble
Les Outils sont les mains de l’agent. Un outil est une capacité que le modèle peut invoquer en cours de conversation, exécuter une commande shell, récupérer une URL HTTP, ouvrir un navigateur, écrire un fichier ou lire un capteur. Chaque appel d’outil est soumis à la politique de sécurité. Les exécutions réussies peuvent inclure un reçu d’outil lorsque les reçus sont activés.
Les outils ne doivent pas être confondus avec les sous-commandes CLI de zeroclaw. Les commandes CLI sont destinées aux opérateurs ; les outils sont destinés à l’agent.
Un agent obtient ses outils via les bundles de compétences, de connaissances et de MCP qu’il référence ; consultez Agents pour savoir comment les bundles sont attachés à un agent. Pour le chemin au niveau de chaque tour, de l’appel d’outil du fournisseur à l’approbation, au dispatch, à la réception, à l’événement observateur et à l’entrée d’historique, consultez Cycle d’exécution des outils.
Avant d’ajouter un outil intégré ou de remplacer l’un d’eux par une intégration externe, consultez l’Inventaire des outils intégrés pour choisir le cadre le plus sobre et pérenne.
Outils intégrés
Une build minimale comprend :
| Outil | Ce que cela fait |
|---|---|
shell | Exécuter une commande shell dans le répertoire de l’espace de travail. Soumis aux listes d’autorisation/de refus des commandes |
file_read | Lire un fichier avec numéros de ligne ; prend en charge les lectures partielles et l’encodage base64 pour les fichiers binaires (le chemin doit être à l’intérieur de l’espace de travail sauf si l’autonomie le permet autrement) |
file_write | Écrire un fichier (contrainte de chemin identique) |
file_edit | Remplacer une correspondance exacte de chaîne dans un fichier par un nouveau contenu |
glob_search | Lister les fichiers correspondant à un motif glob dans l’espace de travail |
content_search | Recherche dans le contenu des fichiers par expression régulière au sein de l’espace de travail (ripgrep avec repli sur grep) |
http_request | HTTP GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS vers les domaines autorisés |
web_search_tool | Recherche web. Le fournisseur est configurable : DuckDuckGo (par défaut, pas de clé), Brave, Tavily, SearXNG, Jina ou Bocha |
web_fetch | Récupérer une page et renvoyer du texte brut nettoyé |
browser | Automatisation de navigateur sans interface graphique. Voir Automatisation de navigateur |
memory_recall | Rechercher dans la mémoire à long terme des faits, préférences ou éléments de contexte pertinents |
memory_store | Stocker un fait, une préférence ou une note dans la mémoire à long terme |
ask_user | Envoie une question au canal actif et attend une réponse. Prend en charge les choices optionnels pour des réponses structurées (clavier intégré sur Telegram, liste numérotée sur la CLI). Sur ACP, les choices sont obligatoires : la question libre attend la RFD d’élicitation ACP. Paramètres : question (obligatoire), choices (liste optionnelle), timeout_secs (600 par défaut). |
escalate_to_human | Envoyer un message d’escalade structuré avec routage par urgence. Une urgence high / critical notifie en plus tous les canaux listés dans [escalation] alert_channels. Paramètres : summary (requis), context (facultatif), urgency (low/medium/high/critical, par défaut medium), wait_for_response (booléen, par défaut false), timeout_secs (par défaut 600). Sur ACP, wait_for_response: true échoue immédiatement si le canal ne peut pas recevoir de réponses en format libre (en attente de la RFD sur l’élicitation ACP). |
Toujours enregistrés aux côtés des éléments intégrés :
| Outil | Notes |
|---|---|
cron_* | Gérer les tâches planifiées : cron_add, cron_list, cron_remove, cron_update, cron_run, cron_runs |
schedule | Planification ponctuelle/récurrente uniquement via le shell |
memory_forget, memory_export, memory_purge | Gestion de la mémoire à long terme |
spawn_subagent, delegate | Exécuter une sous-tâche dans un agent enfant |
Enregistré de manière conditionnelle :
| Outil | Activé par |
|---|---|
knowledge | [knowledge].enabled = true. Stocke une mémoire de relations structurée ; voir Mémoire de relations |
| Sondes matérielles | --features hardware : lecture/écriture des GPIO, découverte des appareils, flashage du firmware |
outils sop_* | Enregistré lorsque l’environnement d’exécution SOP est activé (sop.sops_dir défini sur une valeur non vide ; non défini par défaut, ce qui le désactive ; la valeur documentée est shared/sops) : exécuter et inspecter les SOPs |
discord_search | Enregistré lorsqu’un alias Discord a l’option archive activée |
Protocoles d’extension
Au-delà des outils intégrés, ZeroClaw prend en charge la surface d’extension MCP (Model Context Protocol). Connectez n’importe quel serveur MCP (le système de fichiers de Claude Code, Playwright, le vôtre) et l’agent récupère ses outils au démarrage.
Pour une intégration côté IDE où un éditeur pilote ZeroClaw en tant que sous-processus, consultez ACP : Agent Client Protocol se trouve sous channels car il s’agit d’une surface entrante de gestion de sessions, et non d’un outil que l’agent invoque.
Création d’un outil
Implémentez le trait Tool dans zeroclaw-api :
#![allow(unused)]
fn main() {
#[async_trait]
pub trait Tool: Send + Sync + Attributable {
fn name(&self) -> &str;
fn description(&self) -> &str;
fn parameters_schema(&self) -> serde_json::Value; // Schéma JSON pour les arguments
async fn execute(&self, args: serde_json::Value) -> anyhow::Result<ToolResult>;
}
}
Chaque Tool est également Attributable, de sorte que les émissions de journaux et les traces d’audit d’un appel d’outil portent la même attribution <kind>.<alias> que celle utilisée par le reste du runtime.
Enregistrez-vous via l’usine d’outils du runtime. Consultez Développement → Protocole des plugins pour le modèle complet.
Décrire des outils au modèle
Les descriptions d’outils sont des chaînes Mozilla Fluent : une par outil, localisée par locale. Cela permet de garder les descriptions d’outils concises dans la fenêtre de contexte du modèle tout en autorisant la localisation de l’interface utilisateur.
Source of truth : crates/zeroclaw-runtime/locales/en/tools.ftl. Les traductions sont générées et maintenues via cargo fluent fill --locale <code> (voir Maintainers → Docs & Translations).
Risques et approbation
Chaque invocation d’outil est classée par niveau de risque :
- Faible (lecture seule, sans effets de bord) :
file_read,memory_recall,http_request GETvers les domaines autorisés - Moyen (modifie l’état local) :
file_write,shellavec des commandes connues comme sûres - Élevé (effets de bord destructeurs ou distants) :
shellavec des commandes inconnues,http_request POSTvers des URL non restreintes
Le niveau d’autonomie détermine ce que chaque niveau de risque peut faire sans l’approbation de l’opérateur. Par défaut (Supervised) : les exécutions de faible intensité sont autorisées, celles de moyenne intensité demandent une vérification, et celles de haute intensité sont bloquées.
Lorsque les reçus sont activés, les exécutions réussies reçoivent un reçu d’outil. Les appels refusés, bloqués, remplacés, échoués ou interrompus ne reçoivent pas de reçus.
Désactivation des outils sur les canaux non-CLI
Le schéma ne possède pas de champ tools_allow / tools_deny par canal. Le contrôle d’accès aux outils se trouve dans le profil de risque de l’agent ([risk_profiles.<alias>]) :
excluded_toolssupprime les outils répertoriés de chaque canal non-CLI (Discord, Telegram, Bluesky, Matrix, Slack, etc.) tout en laissant l’interface CLI locale intacte. La granularité est binaire (CLI vs non-CLI), et non par canal. Cela soustrait également les éléments de la liste d’autorisation des délégués agentiques résolue au moment de l’exécution, ce qui constitue le seul moyen de bloquer les noms MCP<server>__<tool>individuels qui seraient autrement automatiquement admis par la règle ci-dessous.allowed_toolsest l’inverse : une liste d’autorisation des outils que l’agent peut appeler en mode agentique (vide ou omis signifie aucune contrainte d’autorisation ; la configuration TOML ne distingue pas les deux cas).- Exception MCP : lorsque
allowed_toolsn’est pas vide, les outils MCP découverts au moment de l’exécution (tout nom contenant__, selon la convention<server>__<tool>) sont automatiquement admis dans la liste d’autorisation effective sans avoir à y être répertoriés individuellement. Cela permet de conserver l’utilisation du comportement MCP par défaut postérieur au #7464 pour les agents qui définissent déjà une liste d’autorisation explicite. Pour bloquer des outils MCP individuels, répertoriez-les dansexcluded_tools. - L’exception MCP s’applique uniquement au champ
allowed_toolsdu profil de risque. Les listes d’autorisation par exécution fournies par l’appelant (leallowed_toolsd’une tâche cron, les invocations de délégué restreintes, etc.) sont toujours traitées comme des intersections strictes de listes explicites. Une tâche qui se restreint elle-même àallowed_tools = ["cron_add"]n’exposera pas les wrappers MCP découverts au moment de l’exécution qu’elle n’a pas nommés, même lorsque le profil de risque de l’agent les admettrait automatiquement.
Si vous avez besoin d’un contrôle plus fin, abaissez le level du profil à read_only ou supervised et appuyez-vous sur les listes auto_approve / always_ask propres à chaque profil pour soumettre les outils sensibles à l’approbation d’un opérateur.
Consultez Niveaux d’autonomie pour l’ensemble complet des champs par profil.