Webhooks
Le canal webhook est un adaptateur HTTP générique entrant/sortant. Il exécute son propre serveur HTTP intégré sur un port de votre choix, accepte les messages au format JSON, les transmet à l’agent et (éventuellement) envoie via POST les réponses de l’agent à une URL que vous spécifiez. Utilisez-le comme adaptateur universel pour tout système capable de produire une requête HTTP POST.
À ne pas confondre avec l’endpoint
/webhookde la passerelle. Le service de passerelle possède son proprePOST /webhookpour les clients appairés qui accèdent à l’agent via HTTP ; il se trouve sous[gateway]et est décrit dans Operations → Network deployment. Cette page documente uniquement le canal[channels.webhook].
Configuration
auth_header 🔑
Valeur optionnelle de l’en-tête Authorization pour les requêtes sortantes.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/webhook et définissez le champ channels.webhook.<alias>.auth_header.
zerocode
Dans le volet Config, définissez le champ channels.webhook.<alias>.auth_header.
zeroclaw config
zeroclaw config set channels.webhook.<alias>.auth_header # entrée masquée, stockée chiffrée
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__webhook__<alias>__auth_header=
excluded_tools
Outils exclus de la spécification d’outils de ce canal. Lorsque ce paramètre est défini, ces outils ne sont pas exposés au modèle lors des réponses via ce canal.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/webhook et définissez le champ channels.webhook.<alias>.excluded_tools.
zerocode
Dans le volet Config, définissez le champ channels.webhook.<alias>.excluded_tools.
zeroclaw config
zeroclaw config set channels.webhook.<alias>.excluded_tools <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__webhook__<alias>__excluded_tools=
listen_path
Chemin d’URL sur lequel écouter (par défaut : /webhook).
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/webhook et définissez le champ channels.webhook.<alias>.listen_path.
zerocode
Dans le volet Config, définissez le champ channels.webhook.<alias>.listen_path.
zeroclaw config
zeroclaw config set channels.webhook.<alias>.listen_path <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__webhook__<alias>__listen_path=
max_retries
Nombre maximal de tentatives de réessai pour les envois sortants en cas d’échecs transitoires (erreurs réseau, 429, 5xx). Définissez la valeur sur 0 pour désactiver les réessais. Valeur par défaut : 3.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/webhook et définissez le champ channels.webhook.<alias>.max_retries.
zerocode
Dans le volet Config, définissez le champ channels.webhook.<alias>.max_retries.
zeroclaw config
zeroclaw config set channels.webhook.<alias>.max_retries <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__webhook__<alias>__max_retries=
port
Port d’écoute pour les webhooks entrants.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/webhook et définissez le champ channels.webhook.<alias>.port.
zerocode
Dans le volet Config, définissez le champ channels.webhook.<alias>.port.
zeroclaw config
zeroclaw config set channels.webhook.<alias>.port <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__webhook__<alias>__port=
reply_min_interval_secs
Plancher de cadencement sortant par (canal, destinataire) en secondes. Plage : 0..=REPLY_MIN_INTERVAL_MAX_SECS (0 désactive).
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/webhook et définissez le champ channels.webhook.<alias>.reply_min_interval_secs.
zerocode
Dans le volet Config, définissez le champ channels.webhook.<alias>.reply_min_interval_secs.
zeroclaw config
zeroclaw config set channels.webhook.<alias>.reply_min_interval_secs <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__webhook__<alias>__reply_min_interval_secs=
reply_queue_depth_max
Profondeur de la file d’attente de régulation sortante par (canal, destinataire). Plage : 0..=REPLY_QUEUE_DEPTH_CEILING. Lorsque reply_min_interval_secs > 0 et que cette valeur est 0, le wrapper de régulation substitue DEFAULT_REPLY_QUEUE_DEPTH (16). Lorsque la file d’attente est pleine, l’envoi le plus récent est abandonné et un WARN est journalisé.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/webhook et définissez le champ channels.webhook.<alias>.reply_queue_depth_max.
zerocode
Dans le panneau Config, définissez le champ channels.webhook.<alias>.reply_queue_depth_max.
zeroclaw config
zeroclaw config set channels.webhook.<alias>.reply_queue_depth_max <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__webhook__<alias>__reply_queue_depth_max=
retry_base_delay_ms
Délai de base en millisecondes pour le backoff exponentiel entre les tentatives. Par défaut : 500. Les valeurs inférieures à 1 sont ramenées à 1ms à l’exécution pour éviter les boucles de réessai intensives.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/webhook et définissez le champ channels.webhook.<alias>.retry_base_delay_ms.
zerocode
Dans le volet Config, définissez le champ channels.webhook.<alias>.retry_base_delay_ms.
zeroclaw config
zeroclaw config set channels.webhook.<alias>.retry_base_delay_ms <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__webhook__<alias>__retry_base_delay_ms=
retry_max_delay_ms
Délai maximal plafonné en millisecondes pour toute attente avant nouvelle tentative. Par défaut : 30000 (30s). Les valeurs inférieures à 1 sont ramenées à 1ms à l’exécution afin d’éviter les boucles de tentatives répétées.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/webhook et définissez le champ channels.webhook.<alias>.retry_max_delay_ms.
zerocode
Dans le volet Config, définissez le champ channels.webhook.<alias>.retry_max_delay_ms.
zeroclaw config
zeroclaw config set channels.webhook.<alias>.retry_max_delay_ms <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__webhook__<alias>__retry_max_delay_ms=
secret 🔑
Secret partagé pour la vérification des signatures de webhook (HMAC-SHA256). Le canal refusera de démarrer sans ce paramètre. Définissez [channels.webhook.<alias>].secret dans la configuration.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/webhook et définissez le champ channels.webhook.<alias>.secret.
zerocode
Dans le panneau Config, définissez le champ channels.webhook.<alias>.secret.
zeroclaw config
zeroclaw config set channels.webhook.<alias>.secret # entrée masquée, stockée chiffrée
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__webhook__<alias>__secret=
send_method
Méthode HTTP pour les messages sortants (POST ou PUT). Par défaut : POST.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/webhook et définissez le champ channels.webhook.<alias>.send_method.
zerocode
Dans le volet Config, définissez le champ channels.webhook.<alias>.send_method.
zeroclaw config
zeroclaw config set channels.webhook.<alias>.send_method <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__webhook__<alias>__send_method=
send_url
URL vers laquelle envoyer (POST/PUT) les messages sortants.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/webhook et définissez le champ channels.webhook.<alias>.send_url.
zerocode
Dans le panneau Config, définissez le champ channels.webhook.<alias>.send_url.
zeroclaw config
zeroclaw config set channels.webhook.<alias>.send_url <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__webhook__<alias>__send_url=
Référence complète des champs : référence de configuration.
Entrant
Le canal se lie à 0.0.0.0:{port} et achemine POST {listen_path}.
Corps de la requête (JSON) :
{
"sender": alice,
"contenu": « Bonjour, agent. »,
"thread_id": "optional-conversation-id"
}
sender: requis, utilisé comme identité d’expéditeur du message.content: requis, le message utilisateur transmis à l’agent. Un contenu vide renvoie400.thread_id: facultatif. S’il est défini, la réponse de l’agent cible le même fil de discussion ; sinon, les réponses ciblentsender.
En cas de succès, renvoie 200 OK. Un JSON mal formé ou un content vide renvoie 400. La contre-pression (file d’attente du canal pleine) renvoie 503.
Vérification de la signature
Lorsque secret est défini, chaque requête entrante doit comporter un en-tête X-Webhook-Signature :
X-Webhook-Signature: sha256=<hex-encoded HMAC-SHA256 of the raw body>
Le canal calcule HMAC-SHA256(secret, raw_body), l’encode en hexadécimal, puis le compare à la valeur de l’en-tête (le préfixe sha256= est retiré avant le décodage). En cas de non-correspondance ou d’en-tête manquant, 401 est renvoyé.
Lorsque secret n’est pas défini, le canal refuse de démarrer (l’écouteur s’arrête au démarrage avec une erreur invitant l’opérateur à en configurer un). Un canal webhook activé nécessite toujours un secret configuré. Il s’agit d’un échec rapide délibéré : un écouteur webhook non authentifié disposant d’un accès à l’agent constitue un point d’entrée ouvert qui ne devrait exister dans aucun déploiement.
Changement majeur. Les déploiements qui exécutaient précédemment le listener sans secret derrière un reverse proxy ou lié à un réseau privé doivent maintenant configurer un
secretdans[channels.webhook.<alias>].secret. Le chemin de repli sans secret est supprimé : un listener webhook activé est considéré comme un risque inconditionnel auquel aucune topologie de déploiement ne devrait être exposée. Les opérateurs dans cette situation doivent définir unsecretet soit conserver le listener derrière leur reverse proxy existant, soit continuer à se lier à un réseau privé ; l’un ou l’autre convient, le secret est désormais l’élément porteur.
Sortant
Lorsque send_url est défini, chaque réponse de l’agent est transmise sous forme de requête HTTP à cette URL :
{send_method} {send_url}
Authorization: {auth_header} # uniquement si auth_header est défini
Content-Type: application/json
{
"content": "agent reply text",
"thread_id": "optional thread id",
"recipient": "optional recipient id"
}
send_methodestPOST(par défaut) ouPUT. Toute autre valeur revient àPOST.auth_headerest envoyé tel quel comme valeur de l’en-têteAuthorization, incluez vous-même le schéma (p. ex.Bearer xyz,Basic dXNlcjpwYXNz).recipientest omis lorsqu’il est vide.- Les réponses non-2xx génèrent une erreur dans les journaux ; la réponse de l’agent est considérée comme ayant échoué.
Lorsque send_url n’est pas défini, les réponses de l’agent sont ignorées silencieusement (consignées au niveau debug). Il s’agit de la configuration appropriée pour les flux entrants de type « fire-and-forget » où la réponse est transmise par un autre canal.
Exposition publique
Le canal se lie directement à 0.0.0.0. Pour l’exposer sur l’Internet public :
- Reverse proxy : terminer TLS au niveau de nginx / Caddy / Traefik et faire un proxy vers le port du canal. Voir Opérations → Déploiement réseau.
- Tunnel : configurez
[tunnel](ngrok,cloudflareoutailscale) et le daemon active le tunnel en même temps que le canal. - Local uniquement : exécutez dans un réseau privé et faites en sorte que votre producteur accède directement à l’adresse LAN/loopback.
Associez toujours l’exposition publique à un secret. Un écouteur de webhook non authentifié constitue un point d’entrée ouvert vers l’agent.
Nouvelles tentatives sortantes
Lorsque send_url est défini, la livraison sortante réessaie les échecs transitoires, les erreurs réseau, les réponses HTTP 429 et HTTP 5xx, avec un backoff exponentiel (gigue de ±25 %) plafonné par retry_max_delay_ms. Les réponses 4xx autres que 429 échouent immédiatement sans nouvelle tentative. Lorsque le serveur renvoie un en-tête Retry-After sur 429 ou 503, cette valeur est respectée et également plafonnée par retry_max_delay_ms. Définir max_retries = 0 correspond à un mode « fire-and-forget » (envoyer et oublier).
Voir aussi
- Opérations → Déploiement réseau : terminaison TLS, tunnels, le
/webhookséparé de la passerelle - Chaînes → Vue d’ensemble