Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Nextcloud Talk

Integración de Nextcloud Talk a través del protocolo de webhooks de Talk Bot. Autoalojado, federado y con capacidad E2E: otra opción de comunicación soberana junto a Matrix y Mattermost.

Quién puede hablar con el agente

Los remitentes entrantes se filtran contra el conjunto de pares resuelto para el agente vinculado, obtenido de la configuración peer_groups a la que pertenece el agente. La coincidencia elimina el @ inicial y no distingue mayúsculas de minúsculas frente al identificador nativo de remitente del canal. Un conjunto vacío deniega a todos; un conjunto que contiene "*" acepta a cualquiera; en caso contrario, solo se aceptan los pares externos listados (y los agentes pares). Esto es independiente del emparejamiento de la puerta de enlace (gateway.require_pairing), que autentica clientes HTTP/WebSocket, no remitentes de canales de chat.

Un grupo de pares para nextcloud establece channel en nextcloud, enumera los remitentes permitidos en external_peers (para nextcloud, el ID de actor de Nextcloud; ["*"] acepta a cualquiera), opcionalmente nombra agents pares para el despacho entre agentes, una lista de bloqueo ignore y un output_modality (mirror, voice o text). Consulta Peer Groups para la referencia de campos.

Dónde configurar esto:

Panel de control del gateway

Abra /config/peer_groups en el panel de control web.

zerocode

En el panel Config, en Peer groups.

Qué hace esta integración

  • Recibe eventos entrantes de Talk a través de POST /nextcloud-talk/<alias> en la pasarela (/nextcloud-talk sin parámetros aún funciona como alternativa obsoleta)
  • Requiere y verifica las firmas de webhook (HMAC-SHA256) con el secreto del bot instalado
  • Envía respuestas a las salas de Talk mediante la API firmada de Nextcloud Talk Bot

Requisitos previos

  • Servidor Nextcloud 27.1 o posterior con Talk 17.1 o posterior. Este es un mínimo estricto, no una recomendación: la API de Talk Bot firmada que esta integración utiliza para enviar respuestas se introdujo en Talk 17.1, y occ talk:bot:install a continuación no está disponible en versiones anteriores.

  • Bot instalado con las funciones webhook y response, que permiten que Nextcloud envíe mensajes de sala a ZeroClaw y que ZeroClaw envíe respuestas:

    sudo -u www-data php occ talk:bot:install \
      -f webhook -f response \
      zeroclaw-bot '<shared-secret>' \
      https://<your-public-url>/nextcloud-talk/<alias>
    
  • Secreto del bot de esa instalación. Nextcloud emite un secreto compartido por bot, que se utiliza tanto para verificar las firmas de los webhooks entrantes como para firmar las respuestas salientes de la API del bot. Establézcalo como webhook_secret, que es el nombre canónico. bot_token es un alias obsoleto para el mismo valor: si ambos están definidos, deben ser idénticos. No puede contener un secreto saliente diferente. Los valores no vacíos en conflicto no se resuelven silenciosamente a favor de uno de ellos; el conflicto se registra y el alias se resuelve sin ningún secreto, por lo que el canal se comporta exactamente como si no estuviera configurado: 401 entrante, sin envíos salientes.

  • Gateway accesible públicamente: consulta Configuración → Contenedor para conocer las opciones de túnel si es autoalojado

Ambas direcciones fallan de forma cerrada ante un secreto faltante, y no hay modo no autenticado:

  • Entrante: la verificación de la firma es obligatoria. Si no hay un secreto resuelto, el endpoint de webhook devuelve 401 y nunca llega al agente. No hay modo “público” que acepte webhooks no verificados.
  • Salida: no se envía ninguna solicitud en absoluto, por lo que una configuración incorrecta nunca coloca una solicitud sin firmar o firmada incorrectamente en la red.

La actualización es un cambio incompatible. Un despliegue que anteriormente se ejecutaba sin un secreto aceptaba webhooks; ahora rechaza cada uno de ellos con 401. Instala el bot con occ talk:bot:install y, a continuación, establece ese secreto como webhook_secret antes de actualizar, o los mensajes entrantes dejarán de procesarse.

Configuración

app_token 🔑 secret · default null

Obsoleto, no utilizado. Los envíos de Nextcloud Talk no se autentican mediante la autenticación de portador de OCS (consulta webhook_secret); este campo solo se acepta para que las configuraciones existentes que lo establezcan no fallen al analizarse. Puedes eliminarlo de forma segura de tu configuración.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abra /config/channels/nextcloud_talk y configure el campo channels.nextcloud_talk.<alias>.app_token.

zerocode

En el panel Config, configure el campo channels.nextcloud_talk.<alias>.app_token.

zeroclaw config

zeroclaw config set channels.nextcloud_talk.<alias>.app_token    # 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__nextcloud_talk__<alias>__app_token=
base_url* string · default

URL base de Nextcloud (p. ej. "https://cloud.example.com").

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abra /config/channels/nextcloud_talk y configure el campo channels.nextcloud_talk.<alias>.base_url.

zerocode

En el panel Config, establece el campo channels.nextcloud_talk.<alias>.base_url.

zeroclaw config

zeroclaw config set channels.nextcloud_talk.<alias>.base_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__nextcloud_talk__<alias>__base_url=
bot_name string? · default null

Nombre para mostrar del bot en Nextcloud Talk (p. ej., “zeroclaw”). Se usa para filtrar los mensajes propios del bot y evitar bucles de retroalimentación. Si no se establece, el valor predeterminado es una cadena vacía (sin filtrado de mensajes propios por nombre).

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/nextcloud_talk y configura el campo channels.nextcloud_talk.<alias>.bot_name.

zerocode

En el panel Config, configure el campo channels.nextcloud_talk.<alias>.bot_name.

zeroclaw config

zeroclaw config set channels.nextcloud_talk.<alias>.bot_name <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__nextcloud_talk__<alias>__bot_name=
bot_token 🔑 secret · default

Alias OBSOLETO de webhook_secret, conservado para la migración. Nextcloud emite UN secreto por cada bot instalado y lo usa en ambas direcciones, por lo que este no puede contener un secreto de salida distinto. Cuando ambos se establecen con valores no vacíos diferentes, el canal registra el conflicto y falla de forma cerrada como no configurado: 401 de entrada y sin envío de salida. Prefiere webhook_secret; este alias se eliminará. Actualización desde una configuración con solo bot_token: copia el secreto del bot instalado a webhook_secret, verifica que las respuestas se sigan enviando y luego elimina bot_token.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/nextcloud_talk y establece el campo channels.nextcloud_talk.<alias>.bot_token.

zerocode

En el panel Config, establece el campo channels.nextcloud_talk.<alias>.bot_token.

zeroclaw config

zeroclaw config set channels.nextcloud_talk.<alias>.bot_token    # 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__nextcloud_talk__<alias>__bot_token=
draft_update_interval_ms integer · default 1000

Se mantiene por compatibilidad de configuración. Actualmente inactivo mientras las actualizaciones de borrador están deshabilitadas para este canal. Predeterminado: 1000 ms.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abra /config/channels/nextcloud_talk y configure el campo channels.nextcloud_talk.<alias>.draft_update_interval_ms.

zerocode

En el panel Config, configure el campo channels.nextcloud_talk.<alias>.draft_update_interval_ms.

zeroclaw config

zeroclaw config set channels.nextcloud_talk.<alias>.draft_update_interval_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__nextcloud_talk__<alias>__draft_update_interval_ms=
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

Abra /config/channels/nextcloud_talk y configure el campo channels.nextcloud_talk.<alias>.excluded_tools.

zerocode

En el panel Config, configure el campo channels.nextcloud_talk.<alias>.excluded_tools.

zeroclaw config

zeroclaw config set channels.nextcloud_talk.<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__nextcloud_talk__<alias>__excluded_tools=
proxy_url string? · default null

URL de proxy por canal (http, https, socks5, socks5h). Anula la configuración global [proxy] solo para este canal.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/nextcloud_talk y configura el campo channels.nextcloud_talk.<alias>.proxy_url.

zerocode

En el panel Config, configure el campo channels.nextcloud_talk.<alias>.proxy_url.

zeroclaw config

zeroclaw config set channels.nextcloud_talk.<alias>.proxy_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__nextcloud_talk__<alias>__proxy_url=
stream_mode StreamMode · default "off"

Se conserva por compatibilidad de configuración. La API de bots de Nextcloud Talk no proporciona IDs de mensaje ni operaciones de edición/eliminación, por lo que las actualizaciones de borrador están deshabilitadas y las respuestas se envían actualmente como un mensaje final por cada valor.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/nextcloud_talk y configura el campo channels.nextcloud_talk.<alias>.stream_mode.

zerocode

En el panel Config, establece el campo channels.nextcloud_talk.<alias>.stream_mode.

zeroclaw config

zeroclaw config set channels.nextcloud_talk.<alias>.stream_mode <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__nextcloud_talk__<alias>__stream_mode=
webhook_secret 🔑 secret · default null

El secreto del bot que Nextcloud instaló para este bot. Campo canónico. Se usa en AMBAS direcciones: para verificar las firmas de los webhooks entrantes y para firmar las solicitudes salientes de la API del bot. Cuando no está definido, los webhooks entrantes se rechazan y no se envía ninguna solicitud saliente (fail closed). También se puede definir mediante ZEROCLAW_NEXTCLOUD_TALK_WEBHOOK_SECRET.

Colócalo sobre cualquier superficie:

Panel de control del gateway

Abre /config/channels/nextcloud_talk y configura el campo channels.nextcloud_talk.<alias>.webhook_secret.

zerocode

En el panel Config, configure el campo channels.nextcloud_talk.<alias>.webhook_secret.

zeroclaw config

zeroclaw config set channels.nextcloud_talk.<alias>.webhook_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__nextcloud_talk__<alias>__webhook_secret=

El canal se lee desde el alias default. Configúrelo a través de cualquier superficie de configuración:

Panel de control del gateway

Abra /config/channels/nextcloud_talk en el panel web.

zerocode

En el panel Config, en Channels.

webhook_secret también puede proporcionarse en tiempo de ejecución mediante la sustitución genérica de variables de entorno ZEROCLAW_channels__nextcloud_talk__default__webhook_secret, útil para rotarlo sin editar la configuración.

app_token está obsoleto y no se utiliza (las respuestas ya no pasan por autenticación OCS bearer); solo se sigue aceptando para que las configuraciones antiguas que lo definen no fallen al analizarse.

Punto de conexión de puerta de enlace

sh

zeroclaw daemon

Configura la URL del webhook de tu bot de Talk para que apunte al alias de la instancia [channels.nextcloud_talk.<alias>] que debe recibirlo:

https://<your-public-url>/nextcloud-talk/<alias>

Por ejemplo, [channels.nextcloud_talk.work] recibe POST /nextcloud-talk/work. Este enrutamiento por alias (#6312) te permite ejecutar varios bots de Talk en paralelo y entregar los webhooks de cada uno a la instancia correcta.

La ruta simple https://<your-public-url>/nextcloud-talk aún funciona, pero está obsoleta: se resuelve al primer alias en orden lexicográfico (determinista entre reinicios) y devuelve un encabezado de respuesta X-Zeroclaw-Deprecation. Las implementaciones de instancia única pueden seguir usándola sin cambios. Un alias desconocido devuelve 404.

¿Desarrollo local? Configura [tunnel] en tu configuración (ngrok, Cloudflare o Tailscale) y el gateway se expone automáticamente al iniciarse: consulta Operations → Network deployment.

Verificación de firma

Las solicitudes entrantes deben incluir:

  • X-Nextcloud-Talk-Random cabecera
  • X-Nextcloud-Talk-Signature cabecera

ZeroClaw verifica:

expected_sig = hex(hmac_sha256(secret, random + raw_request_body))
if X-Nextcloud-Talk-Signature != expected_sig:
    return 401

Sin un secreto resuelto, ZeroClaw devuelve 401 antes de analizar o despachar el webhook. No existe ningún modo que acepte una solicitud no verificada.

Enrutamiento de mensajes

  • Los eventos originados por bots (actorType = "bots") se ignoran: evita bucles de retroalimentación
  • Eventos del sistema (uniones, salidas, cambios de membresía) se ignoran
  • Los eventos no relacionados con mensajes se ignoran
  • Los mensajes de usuario se envían al bucle del agente
  • Las respuestas se envían de vuelta a la sala de origen a través del token en la carga útil del webhook.

Validación rápida

  1. Establece external_peers = ["*"] en el grupo de pares para las pruebas iniciales
  2. Enviar un mensaje de prueba en la sala de Talk configurada
  3. Confirmar que ZeroClaw recibe y responde en la misma sala
  4. Restringe el grupo de pares a IDs de actor explícitos (p. ej. ["alice", "bob"])

Solución de problemas

  • 404 Nextcloud Talk not configured: falta la sección [channels.nextcloud_talk.default] o enabled = false
  • 401 Invalid signature: discrepancia en el secreto, encabezado aleatorio incorrecto o error al firmar el cuerpo. Verifique que se esté firmando el cuerpo sin procesar (no el JSON analizado)
  • Sin respuesta, webhook 200: el evento fue filtrado. Revisa los registros en busca de “actorType = bots” o un remitente que no esté en el conjunto de pares
  • Las respuestas se entregan pero se ven mal: verifica el contexto del hilo; las respuestas de Talk actualmente son solo de nivel raíz

Transmisión

Nextcloud Talk no admite la edición de mensajes a través de la API de Bot, por lo que las actualizaciones de borradores en tiempo real están desactivadas para este canal. Las respuestas se envían únicamente al finalizar el flujo.

Notas de autoalojamiento

  • TLS: finaliza en tu proxy inverso; la verificación de la firma del webhook funciona a través del bucle de bucleback HTTP al contenedor
  • Las respuestas salientes se autentican mediante la firma HMAC de la Bot API (webhook_secret/bot_token), no un token de portador; no hay una credencial de portador OCS independiente que gestionar
  • Los límites de tasa dependen de Nextcloud-server; el bot predeterminado no los alcanza en cadencias de conversación normales.
  • Proxy por canal: establece proxy_url para anular la configuración global de [proxy] solo para Nextcloud Talk (http://, https://, socks5://, socks5h://)

Ver también