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-talksin 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:installa continuación no está disponible en versiones anteriores. -
Bot instalado con las funciones
webhookyresponse, 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_tokenes 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:401entrante, 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
401y 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 conocc talk:bot:instally, a continuación, establece ese secreto comowebhook_secretantes de actualizar, o los mensajes entrantes dejarán de procesarse.
Configuración
app_token 🔑
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*
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
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 🔑
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
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
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
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
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 🔑
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-RandomcabeceraX-Nextcloud-Talk-Signaturecabecera
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
tokenen la carga útil del webhook.
Validación rápida
- Establece
external_peers = ["*"]en el grupo de pares para las pruebas iniciales - Enviar un mensaje de prueba en la sala de Talk configurada
- Confirmar que ZeroClaw recibe y responde en la misma sala
- 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]oenabled = false401 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_urlpara anular la configuración global de[proxy]solo para Nextcloud Talk (http://,https://,socks5://,socks5h://)
Ver también
- Matrix: E2EE más completo pero mayor complejidad operativa
- Mattermost: postura autoalojada similar, protocolo diferente
- Canal → Descripción general