Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Webhooks

El canal webhook es un adaptador HTTP genérico de entrada/salida. Ejecuta su propio servidor HTTP embebido en un puerto que elijas, acepta mensajes con formato JSON, los entrega al agente y (opcionalmente) envía mediante POST las respuestas del agente a una URL que especifiques. Úsalo como el adaptador universal para cualquier sistema que pueda producir un HTTP POST.

No es lo mismo que el endpoint /webhook del gateway. El servicio del gateway tiene su propio POST /webhook para clientes emparejados que acceden al agente a través de HTTP, que se encuentra bajo [gateway] y se describe en Operaciones → Despliegue de red. Esta página documenta únicamente el canal [channels.webhook].

Configuración

auth_header 🔑 secret · default null

Valor opcional del encabezado Authorization para solicitudes salientes.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/webhook y configura el campo channels.webhook.<alias>.auth_header.

zerocode

En el panel Config, establece el campo channels.webhook.<alias>.auth_header.

zeroclaw config

zeroclaw config set channels.webhook.<alias>.auth_header    # entrada enmascarada, almacenada cifrada

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__webhook__<alias>__auth_header=
excluded_tools string[] · default []

Herramientas excluidas de la especificación de herramientas de este canal. Cuando se establece, estas herramientas no se exponen al modelo al responder a través de este canal.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/webhook y configura el campo channels.webhook.<alias>.excluded_tools.

zerocode

En el panel Config, establece el campo channels.webhook.<alias>.excluded_tools.

zeroclaw config

zeroclaw config set channels.webhook.<alias>.excluded_tools <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__webhook__<alias>__excluded_tools=
listen_path string? · default null

Ruta URL en la que escuchar (predeterminado: /webhook).

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/webhook y configura el campo channels.webhook.<alias>.listen_path.

zerocode

En el panel Config, establece el campo channels.webhook.<alias>.listen_path.

zeroclaw config

zeroclaw config set channels.webhook.<alias>.listen_path <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__webhook__<alias>__listen_path=
max_retries integer? · default null

Número máximo de reintentos para envíos salientes ante fallos transitorios (errores de red, 429, 5xx). Establezca 0 para deshabilitar los reintentos. Predeterminado: 3.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/webhook y configura el campo channels.webhook.<alias>.max_retries.

zerocode

En el panel Config, establece el campo channels.webhook.<alias>.max_retries.

zeroclaw config

zeroclaw config set channels.webhook.<alias>.max_retries <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__webhook__<alias>__max_retries=
port integer · default 8090

Puerto en el que escuchar los webhooks entrantes.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/webhook y configura el campo channels.webhook.<alias>.port.

zerocode

En el panel Config, configure el campo channels.webhook.<alias>.port.

zeroclaw config

zeroclaw config set channels.webhook.<alias>.port <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__webhook__<alias>__port=
reply_min_interval_secs integer · default 0

Límite mínimo de ritmo de salida por (canal, destinatario) en segundos. Rango: 0..=REPLY_MIN_INTERVAL_MAX_SECS (0 lo desactiva).

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/webhook y establece el campo channels.webhook.<alias>.reply_min_interval_secs.

zerocode

En el panel Config, configura el campo channels.webhook.<alias>.reply_min_interval_secs.

zeroclaw config

zeroclaw config set channels.webhook.<alias>.reply_min_interval_secs <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__webhook__<alias>__reply_min_interval_secs=
reply_queue_depth_max integer · default 0

Profundidad de la cola de regulación de salida por (canal, destinatario). Rango: 0..=REPLY_QUEUE_DEPTH_CEILING. Cuando reply_min_interval_secs > 0 y este valor es 0, el envoltorio de regulación sustituye DEFAULT_REPLY_QUEUE_DEPTH (16). Cuando la cola está llena, se descarta el envío más reciente y se registra un WARN.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/webhook y configura el campo channels.webhook.<alias>.reply_queue_depth_max.

zerocode

En el panel Config, establece el campo channels.webhook.<alias>.reply_queue_depth_max.

zeroclaw config

zeroclaw config set channels.webhook.<alias>.reply_queue_depth_max <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__webhook__<alias>__reply_queue_depth_max=
retry_base_delay_ms integer? · default null

Retraso base en milisegundos para el backoff exponencial entre reintentos. Valor predeterminado: 500. Los valores inferiores a 1 se ajustan a 1ms en tiempo de ejecución para evitar bucles de reintentos continuos.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/webhook y establece el campo channels.webhook.<alias>.retry_base_delay_ms.

zerocode

En el panel Config, establece el campo channels.webhook.<alias>.retry_base_delay_ms.

zeroclaw config

zeroclaw config set channels.webhook.<alias>.retry_base_delay_ms <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__webhook__<alias>__retry_base_delay_ms=
retry_max_delay_ms integer? · default null

Límite máximo de retraso en milisegundos para cualquier espera de reintento individual. Predeterminado: 30000 (30s). Los valores inferiores a 1 se ajustan a 1ms en tiempo de ejecución para evitar bucles de reintentos continuos.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/webhook y configura el campo channels.webhook.<alias>.retry_max_delay_ms.

zerocode

En el panel Config, configura el campo channels.webhook.<alias>.retry_max_delay_ms.

zeroclaw config

zeroclaw config set channels.webhook.<alias>.retry_max_delay_ms <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__webhook__<alias>__retry_max_delay_ms=
secret 🔑 secret · default

Secreto compartido para la verificación de firma del webhook (HMAC-SHA256). El canal se negará a iniciar sin uno. Establezca [channels.webhook.<alias>].secret en la configuración.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/webhook y configura el campo channels.webhook.<alias>.secret.

zerocode

En el panel Config, establece el campo channels.webhook.<alias>.secret.

zeroclaw config

zeroclaw config set channels.webhook.<alias>.secret    # entrada enmascarada, almacenada cifrada

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__webhook__<alias>__secret=
send_method string? · default null

Método HTTP para mensajes salientes (POST o PUT). Predeterminado: POST.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/webhook y configura el campo channels.webhook.<alias>.send_method.

zerocode

En el panel Config, configure el campo channels.webhook.<alias>.send_method.

zeroclaw config

zeroclaw config set channels.webhook.<alias>.send_method <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__webhook__<alias>__send_method=
send_url string? · default null

URL a la que enviar (POST/PUT) los mensajes salientes.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/webhook y configura el campo channels.webhook.<alias>.send_url.

zerocode

En el panel Config, establezca el campo channels.webhook.<alias>.send_url.

zeroclaw config

zeroclaw config set channels.webhook.<alias>.send_url <value>

Variable de entorno

Exporte la anulación (shells POSIX; colóquelo en ~/.bashrc, ~/.zshrc, .env o un Dockerfile). Reemplace <alias> con el alias literal:

export ZEROCLAW_channels__webhook__<alias>__send_url=

Referencia completa de campos: referencia de configuración.

Entrante

El canal vincula 0.0.0.0:{port} y enruta POST {listen_path}.

Cuerpo de la solicitud (JSON):

{
  "sender": alice,
  "contenido": "Hola, agente.",
  "thread_id": optional-conversation-id
}
  • sender: requerido, se usa como la identidad del remitente del mensaje.
  • content: requerido, el mensaje del usuario que se entrega al agente. Un contenido vacío devuelve 400.
  • thread_id: opcional. Si se establece, la respuesta del agente se dirige al mismo hilo; de lo contrario, las respuestas se dirigen a sender.

El éxito devuelve 200 OK. Un JSON mal formado o un content vacío devuelve 400. La contrapresión (cola de canal llena) devuelve 503.

Verificación de firma

Cuando secret está configurado, cada solicitud entrante debe incluir un encabezado X-Webhook-Signature:

X-Webhook-Signature: sha256=<hex-encoded HMAC-SHA256 of the raw body>

El canal calcula HMAC-SHA256(secret, raw_body), lo codifica en hexadecimal y lo compara con el valor del encabezado (el prefijo sha256= se elimina antes de la decodificación). Si no coincide o falta el encabezado, se devuelve 401.

Cuando secret no está definido, el canal se niega a iniciarse (el listener se detiene al arrancar con un error que indica al operador que configure uno). Un canal de webhook habilitado siempre requiere un secret configurado. Esto es un fallo rápido deliberado: un listener de webhook sin autenticación con acceso al agente es una entrada abierta que no debería existir en ningún despliegue.

Cambio incompatible. Los despliegues que antes ejecutaban el listener sin secreto detrás de un proxy inverso o lo vinculaban a una red privada ahora deben configurar un secret en [channels.webhook.<alias>].secret. Se elimina la ruta de reserva sin secreto: un listener de webhook habilitado se trata como un riesgo incondicional al que no debería exponerse ninguna topología de despliegue. Los operadores en esta situación deben establecer un secret y mantener el listener detrás de su proxy inverso existente o seguir vinculándolo a una red privada; cualquiera de las dos opciones es válida, el secreto es lo que ahora resulta esencial.

Saliente

Cuando se establece send_url, cada respuesta del agente se entrega como una solicitud HTTP a esa URL:

{send_method} {send_url}
Authorization: {auth_header}    # solo si auth_header está configurado
Content-Type: application/json

{
  "content": "texto de respuesta del agente",
  "thread_id": "id de hilo opcional",
  "recipient": "id de destinatario opcional"
}
  • send_method es POST (predeterminado) o PUT. Cualquier otro valor recurre a POST.
  • auth_header se envía textualmente como el valor del encabezado Authorization; incluya el esquema usted mismo (p. ej., Bearer xyz, Basic dXNlcjpwYXNz).
  • recipient se omite cuando está vacío.
  • Las respuestas que no sean 2xx generan un error en los registros; la respuesta del agente se considera fallida.

Cuando send_url no está configurado, las respuestas del agente se descartan silenciosamente (registradas en nivel debug). Esta es la configuración correcta para flujos entrantes de tipo “fire-and-forget” donde la respuesta se entrega a través de otro canal.

Exposición pública

El canal se vincula directamente a 0.0.0.0. Para exponerlo en internet público:

  1. Proxy inverso: termina TLS en nginx / Caddy / Traefik y haz proxy al puerto del canal. Consulta Operaciones → Despliegue de red.
  2. Tunnel: configura [tunnel] (ngrok, cloudflare o tailscale) y el daemon levanta el túnel junto con el canal.
  3. Solo local: ejecútelo dentro de una red privada y haga que su productor acceda directamente a la dirección LAN/loopback.

Empareja siempre la exposición pública con secret. Un receptor de webhook sin autenticación es una entrada abierta al agente.

Reintentos de salida

Cuando send_url está configurado, la entrega saliente reintenta los fallos transitorios, errores de red, HTTP 429 y HTTP 5xx, con retroceso exponencial (jitter de ±25%) limitado por retry_max_delay_ms. Las respuestas 4xx que no sean 429 fallan inmediatamente sin reintentar. Cuando el servidor devuelve un encabezado Retry-After en 429 o 503, ese valor se respeta y también se limita mediante retry_max_delay_ms. Configurar max_retries = 0 significa enviar y olvidar (fire-and-forget).

Ver también